net: dsa: microchip: ksz8795: add error handling to ksz8_r/w_phy
authorOleksij Rempel <o.rempel@pengutronix.de>
Fri, 26 Aug 2022 10:56:24 +0000 (12:56 +0200)
committerDavid S. Miller <davem@davemloft.net>
Wed, 31 Aug 2022 08:41:23 +0000 (09:41 +0100)
Now ksz_pread/ksz_pwrite can return error value. So, make use of it.

Signed-off-by: Oleksij Rempel <o.rempel@pengutronix.de>
Reviewed-by: Vladimir Oltean <olteanv@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/dsa/microchip/ksz8795.c

index f2dd75e..f020d9f 100644 (file)
@@ -560,14 +560,24 @@ int ksz8_r_phy(struct ksz_device *dev, u16 phy, u16 reg, u16 *val)
        u8 val1, val2;
        u16 data = 0;
        u8 p = phy;
+       int ret;
 
        regs = dev->info->regs;
 
        switch (reg) {
        case MII_BMCR:
-               ksz_pread8(dev, p, regs[P_NEG_RESTART_CTRL], &restart);
-               ksz_pread8(dev, p, regs[P_SPEED_STATUS], &speed);
-               ksz_pread8(dev, p, regs[P_FORCE_CTRL], &ctrl);
+               ret = ksz_pread8(dev, p, regs[P_NEG_RESTART_CTRL], &restart);
+               if (ret)
+                       return ret;
+
+               ret = ksz_pread8(dev, p, regs[P_SPEED_STATUS], &speed);
+               if (ret)
+                       return ret;
+
+               ret = ksz_pread8(dev, p, regs[P_FORCE_CTRL], &ctrl);
+               if (ret)
+                       return ret;
+
                if (restart & PORT_PHY_LOOPBACK)
                        data |= BMCR_LOOPBACK;
                if (ctrl & PORT_FORCE_100_MBIT)
@@ -597,7 +607,10 @@ int ksz8_r_phy(struct ksz_device *dev, u16 phy, u16 reg, u16 *val)
                        data |= KSZ886X_BMCR_DISABLE_LED;
                break;
        case MII_BMSR:
-               ksz_pread8(dev, p, regs[P_LINK_STATUS], &link);
+               ret = ksz_pread8(dev, p, regs[P_LINK_STATUS], &link);
+               if (ret)
+                       return ret;
+
                data = BMSR_100FULL |
                       BMSR_100HALF |
                       BMSR_10FULL |
@@ -618,7 +631,10 @@ int ksz8_r_phy(struct ksz_device *dev, u16 phy, u16 reg, u16 *val)
                        data = KSZ8795_ID_LO;
                break;
        case MII_ADVERTISE:
-               ksz_pread8(dev, p, regs[P_LOCAL_CTRL], &ctrl);
+               ret = ksz_pread8(dev, p, regs[P_LOCAL_CTRL], &ctrl);
+               if (ret)
+                       return ret;
+
                data = ADVERTISE_CSMA;
                if (ctrl & PORT_AUTO_NEG_SYM_PAUSE)
                        data |= ADVERTISE_PAUSE_CAP;
@@ -632,7 +648,10 @@ int ksz8_r_phy(struct ksz_device *dev, u16 phy, u16 reg, u16 *val)
                        data |= ADVERTISE_10HALF;
                break;
        case MII_LPA:
-               ksz_pread8(dev, p, regs[P_REMOTE_STATUS], &link);
+               ret = ksz_pread8(dev, p, regs[P_REMOTE_STATUS], &link);
+               if (ret)
+                       return ret;
+
                data = LPA_SLCT;
                if (link & PORT_REMOTE_SYM_PAUSE)
                        data |= LPA_PAUSE_CAP;
@@ -648,8 +667,14 @@ int ksz8_r_phy(struct ksz_device *dev, u16 phy, u16 reg, u16 *val)
                        data |= LPA_LPACK;
                break;
        case PHY_REG_LINK_MD:
-               ksz_pread8(dev, p, REG_PORT_LINK_MD_CTRL, &val1);
-               ksz_pread8(dev, p, REG_PORT_LINK_MD_RESULT, &val2);
+               ret = ksz_pread8(dev, p, REG_PORT_LINK_MD_CTRL, &val1);
+               if (ret)
+                       return ret;
+
+               ret = ksz_pread8(dev, p, REG_PORT_LINK_MD_RESULT, &val2);
+               if (ret)
+                       return ret;
+
                if (val1 & PORT_START_CABLE_DIAG)
                        data |= PHY_START_CABLE_DIAG;
 
@@ -664,7 +689,10 @@ int ksz8_r_phy(struct ksz_device *dev, u16 phy, u16 reg, u16 *val)
                                FIELD_GET(PORT_CABLE_FAULT_COUNTER_L, val2));
                break;
        case PHY_REG_PHY_CTRL:
-               ksz_pread8(dev, p, regs[P_LINK_STATUS], &link);
+               ret = ksz_pread8(dev, p, regs[P_LINK_STATUS], &link);
+               if (ret)
+                       return ret;
+
                if (link & PORT_MDIX_STATUS)
                        data |= KSZ886X_CTRL_MDIX_STAT;
                break;
@@ -683,6 +711,7 @@ int ksz8_w_phy(struct ksz_device *dev, u16 phy, u16 reg, u16 val)
        u8 restart, speed, ctrl, data;
        const u16 *regs;
        u8 p = phy;
+       int ret;
 
        regs = dev->info->regs;
 
@@ -692,15 +721,26 @@ int ksz8_w_phy(struct ksz_device *dev, u16 phy, u16 reg, u16 val)
                /* Do not support PHY reset function. */
                if (val & BMCR_RESET)
                        break;
-               ksz_pread8(dev, p, regs[P_SPEED_STATUS], &speed);
+               ret = ksz_pread8(dev, p, regs[P_SPEED_STATUS], &speed);
+               if (ret)
+                       return ret;
+
                data = speed;
                if (val & KSZ886X_BMCR_HP_MDIX)
                        data |= PORT_HP_MDIX;
                else
                        data &= ~PORT_HP_MDIX;
-               if (data != speed)
-                       ksz_pwrite8(dev, p, regs[P_SPEED_STATUS], data);
-               ksz_pread8(dev, p, regs[P_FORCE_CTRL], &ctrl);
+
+               if (data != speed) {
+                       ret = ksz_pwrite8(dev, p, regs[P_SPEED_STATUS], data);
+                       if (ret)
+                               return ret;
+               }
+
+               ret = ksz_pread8(dev, p, regs[P_FORCE_CTRL], &ctrl);
+               if (ret)
+                       return ret;
+
                data = ctrl;
                if (ksz_is_ksz88x3(dev)) {
                        if ((val & BMCR_ANENABLE))
@@ -726,9 +766,17 @@ int ksz8_w_phy(struct ksz_device *dev, u16 phy, u16 reg, u16 val)
                        data |= PORT_FORCE_FULL_DUPLEX;
                else
                        data &= ~PORT_FORCE_FULL_DUPLEX;
-               if (data != ctrl)
-                       ksz_pwrite8(dev, p, regs[P_FORCE_CTRL], data);
-               ksz_pread8(dev, p, regs[P_NEG_RESTART_CTRL], &restart);
+
+               if (data != ctrl) {
+                       ret = ksz_pwrite8(dev, p, regs[P_FORCE_CTRL], data);
+                       if (ret)
+                               return ret;
+               }
+
+               ret = ksz_pread8(dev, p, regs[P_NEG_RESTART_CTRL], &restart);
+               if (ret)
+                       return ret;
+
                data = restart;
                if (val & KSZ886X_BMCR_DISABLE_LED)
                        data |= PORT_LED_OFF;
@@ -758,11 +806,19 @@ int ksz8_w_phy(struct ksz_device *dev, u16 phy, u16 reg, u16 val)
                        data |= PORT_PHY_LOOPBACK;
                else
                        data &= ~PORT_PHY_LOOPBACK;
-               if (data != restart)
-                       ksz_pwrite8(dev, p, regs[P_NEG_RESTART_CTRL], data);
+
+               if (data != restart) {
+                       ret = ksz_pwrite8(dev, p, regs[P_NEG_RESTART_CTRL],
+                                         data);
+                       if (ret)
+                               return ret;
+               }
                break;
        case MII_ADVERTISE:
-               ksz_pread8(dev, p, regs[P_LOCAL_CTRL], &ctrl);
+               ret = ksz_pread8(dev, p, regs[P_LOCAL_CTRL], &ctrl);
+               if (ret)
+                       return ret;
+
                data = ctrl;
                data &= ~(PORT_AUTO_NEG_SYM_PAUSE |
                          PORT_AUTO_NEG_100BTX_FD |
@@ -779,8 +835,12 @@ int ksz8_w_phy(struct ksz_device *dev, u16 phy, u16 reg, u16 val)
                        data |= PORT_AUTO_NEG_10BT_FD;
                if (val & ADVERTISE_10HALF)
                        data |= PORT_AUTO_NEG_10BT;
-               if (data != ctrl)
-                       ksz_pwrite8(dev, p, regs[P_LOCAL_CTRL], data);
+
+               if (data != ctrl) {
+                       ret = ksz_pwrite8(dev, p, regs[P_LOCAL_CTRL], data);
+                       if (ret)
+                               return ret;
+               }
                break;
        case PHY_REG_LINK_MD:
                if (val & PHY_START_CABLE_DIAG)