if (reg < 0)
                return reg;
 
-       if (phydev->interrupts == PHY_INTERRUPT_ENABLED)
+       if (phydev->interrupts == PHY_INTERRUPT_ENABLED) {
+               err = phy_read(phydev, BCM87XX_LASI_STATUS);
+               if (err)
+                       return err;
+
                reg |= 1;
-       else
+               err = phy_write(phydev, BCM87XX_LASI_CONTROL, reg);
+       } else {
                reg &= ~1;
+               err = phy_write(phydev, BCM87XX_LASI_CONTROL, reg);
+               if (err)
+                       return err;
+
+               err = phy_read(phydev, BCM87XX_LASI_STATUS);
+       }
 
-       err = phy_write(phydev, BCM87XX_LASI_CONTROL, reg);
        return err;
 }
 
        return IRQ_HANDLED;
 }
 
-static int bcm87xx_ack_interrupt(struct phy_device *phydev)
-{
-       int reg;
-
-       /* Reading the LASI status clears it. */
-       reg = phy_read(phydev, BCM87XX_LASI_STATUS);
-
-       if (reg < 0) {
-               phydev_err(phydev,
-                          "Error: Read of BCM87XX_LASI_STATUS failed: %d\n",
-                          reg);
-               return 0;
-       }
-       return (reg & 1) != 0;
-}
-
 static int bcm8706_match_phy_device(struct phy_device *phydev)
 {
        return phydev->c45_ids.device_ids[4] == PHY_ID_BCM8706;
        .config_init    = bcm87xx_config_init,
        .config_aneg    = bcm87xx_config_aneg,
        .read_status    = bcm87xx_read_status,
-       .ack_interrupt  = bcm87xx_ack_interrupt,
        .config_intr    = bcm87xx_config_intr,
        .handle_interrupt = bcm87xx_handle_interrupt,
        .match_phy_device = bcm8706_match_phy_device,
        .config_init    = bcm87xx_config_init,
        .config_aneg    = bcm87xx_config_aneg,
        .read_status    = bcm87xx_read_status,
-       .ack_interrupt  = bcm87xx_ack_interrupt,
        .config_intr    = bcm87xx_config_intr,
        .handle_interrupt = bcm87xx_handle_interrupt,
        .match_phy_device = bcm8727_match_phy_device,
 
        if (reg < 0)
                return reg;
 
-       if (phydev->interrupts == PHY_INTERRUPT_ENABLED)
+       if (phydev->interrupts == PHY_INTERRUPT_ENABLED) {
+               err = brcm_fet_ack_interrupt(phydev);
+               if (err)
+                       return err;
+
                reg &= ~MII_BRCM_FET_IR_MASK;
-       else
+               err = phy_write(phydev, MII_BRCM_FET_INTREG, reg);
+       } else {
                reg |= MII_BRCM_FET_IR_MASK;
+               err = phy_write(phydev, MII_BRCM_FET_INTREG, reg);
+               if (err)
+                       return err;
+
+               err = brcm_fet_ack_interrupt(phydev);
+       }
 
-       err = phy_write(phydev, MII_BRCM_FET_INTREG, reg);
        return err;
 }
 
        .name           = "Broadcom BCM5411",
        /* PHY_GBIT_FEATURES */
        .config_init    = bcm54xx_config_init,
-       .ack_interrupt  = bcm_phy_ack_intr,
        .config_intr    = bcm_phy_config_intr,
        .handle_interrupt = bcm_phy_handle_interrupt,
 }, {
        .name           = "Broadcom BCM5421",
        /* PHY_GBIT_FEATURES */
        .config_init    = bcm54xx_config_init,
-       .ack_interrupt  = bcm_phy_ack_intr,
        .config_intr    = bcm_phy_config_intr,
        .handle_interrupt = bcm_phy_handle_interrupt,
 }, {
        .name           = "Broadcom BCM54210E",
        /* PHY_GBIT_FEATURES */
        .config_init    = bcm54xx_config_init,
-       .ack_interrupt  = bcm_phy_ack_intr,
        .config_intr    = bcm_phy_config_intr,
        .handle_interrupt = bcm_phy_handle_interrupt,
 }, {
        .name           = "Broadcom BCM5461",
        /* PHY_GBIT_FEATURES */
        .config_init    = bcm54xx_config_init,
-       .ack_interrupt  = bcm_phy_ack_intr,
        .config_intr    = bcm_phy_config_intr,
        .handle_interrupt = bcm_phy_handle_interrupt,
 }, {
        .name           = "Broadcom BCM54612E",
        /* PHY_GBIT_FEATURES */
        .config_init    = bcm54xx_config_init,
-       .ack_interrupt  = bcm_phy_ack_intr,
        .config_intr    = bcm_phy_config_intr,
        .handle_interrupt = bcm_phy_handle_interrupt,
 }, {
        /* PHY_GBIT_FEATURES */
        .config_init    = bcm54xx_config_init,
        .config_aneg    = bcm54616s_config_aneg,
-       .ack_interrupt  = bcm_phy_ack_intr,
        .config_intr    = bcm_phy_config_intr,
        .handle_interrupt = bcm_phy_handle_interrupt,
        .read_status    = bcm54616s_read_status,
        .name           = "Broadcom BCM5464",
        /* PHY_GBIT_FEATURES */
        .config_init    = bcm54xx_config_init,
-       .ack_interrupt  = bcm_phy_ack_intr,
        .config_intr    = bcm_phy_config_intr,
        .handle_interrupt = bcm_phy_handle_interrupt,
        .suspend        = genphy_suspend,
        /* PHY_GBIT_FEATURES */
        .config_init    = bcm54xx_config_init,
        .config_aneg    = bcm5481_config_aneg,
-       .ack_interrupt  = bcm_phy_ack_intr,
        .config_intr    = bcm_phy_config_intr,
        .handle_interrupt = bcm_phy_handle_interrupt,
 }, {
        /* PHY_GBIT_FEATURES */
        .config_init    = bcm54xx_config_init,
        .config_aneg    = bcm5481_config_aneg,
-       .ack_interrupt  = bcm_phy_ack_intr,
        .config_intr    = bcm_phy_config_intr,
        .handle_interrupt = bcm_phy_handle_interrupt,
        .suspend        = genphy_suspend,
        /* PHY_GBIT_FEATURES */
        .config_init    = bcm54811_config_init,
        .config_aneg    = bcm5481_config_aneg,
-       .ack_interrupt  = bcm_phy_ack_intr,
        .config_intr    = bcm_phy_config_intr,
        .handle_interrupt = bcm_phy_handle_interrupt,
        .suspend        = genphy_suspend,
        /* PHY_GBIT_FEATURES */
        .config_init    = bcm5482_config_init,
        .read_status    = bcm5482_read_status,
-       .ack_interrupt  = bcm_phy_ack_intr,
        .config_intr    = bcm_phy_config_intr,
        .handle_interrupt = bcm_phy_handle_interrupt,
 }, {
        .name           = "Broadcom BCM50610",
        /* PHY_GBIT_FEATURES */
        .config_init    = bcm54xx_config_init,
-       .ack_interrupt  = bcm_phy_ack_intr,
        .config_intr    = bcm_phy_config_intr,
        .handle_interrupt = bcm_phy_handle_interrupt,
 }, {
        .name           = "Broadcom BCM50610M",
        /* PHY_GBIT_FEATURES */
        .config_init    = bcm54xx_config_init,
-       .ack_interrupt  = bcm_phy_ack_intr,
        .config_intr    = bcm_phy_config_intr,
        .handle_interrupt = bcm_phy_handle_interrupt,
 }, {
        .name           = "Broadcom BCM57780",
        /* PHY_GBIT_FEATURES */
        .config_init    = bcm54xx_config_init,
-       .ack_interrupt  = bcm_phy_ack_intr,
        .config_intr    = bcm_phy_config_intr,
        .handle_interrupt = bcm_phy_handle_interrupt,
 }, {
        .name           = "Broadcom BCMAC131",
        /* PHY_BASIC_FEATURES */
        .config_init    = brcm_fet_config_init,
-       .ack_interrupt  = brcm_fet_ack_interrupt,
        .config_intr    = brcm_fet_config_intr,
        .handle_interrupt = brcm_fet_handle_interrupt,
 }, {
        .name           = "Broadcom BCM5241",
        /* PHY_BASIC_FEATURES */
        .config_init    = brcm_fet_config_init,
-       .ack_interrupt  = brcm_fet_ack_interrupt,
        .config_intr    = brcm_fet_config_intr,
        .handle_interrupt = brcm_fet_handle_interrupt,
 }, {
        .get_stats      = bcm53xx_phy_get_stats,
        .probe          = bcm53xx_phy_probe,
        .config_init    = bcm54xx_config_init,
-       .ack_interrupt  = bcm_phy_ack_intr,
        .config_intr    = bcm_phy_config_intr,
        .handle_interrupt = bcm_phy_handle_interrupt,
 }, {
        .name           = "Broadcom BCM89610",
        /* PHY_GBIT_FEATURES */
        .config_init    = bcm54xx_config_init,
-       .ack_interrupt  = bcm_phy_ack_intr,
        .config_intr    = bcm_phy_config_intr,
        .handle_interrupt = bcm_phy_handle_interrupt,
 } };