OSDN Git Service

net: usb: asix: add error handling for asix_mdio_* functions
authorOleksij Rempel <o.rempel@pengutronix.de>
Mon, 7 Jun 2021 08:27:25 +0000 (10:27 +0200)
committerDavid S. Miller <davem@davemloft.net>
Mon, 7 Jun 2021 20:23:02 +0000 (13:23 -0700)
This usb devices can be removed at any time, so we need to forward
correct error value if device was detached.

Signed-off-by: Oleksij Rempel <o.rempel@pengutronix.de>
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/usb/asix_common.c

index 085bc82..ac92bc5 100644 (file)
@@ -485,18 +485,23 @@ int asix_mdio_read(struct net_device *netdev, int phy_id, int loc)
                return ret;
        }
 
-       asix_read_cmd(dev, AX_CMD_READ_MII_REG, phy_id,
-                               (__u16)loc, 2, &res, 0);
-       asix_set_hw_mii(dev, 0);
+       ret = asix_read_cmd(dev, AX_CMD_READ_MII_REG, phy_id, (__u16)loc, 2,
+                           &res, 0);
+       if (ret < 0)
+               goto out;
+
+       ret = asix_set_hw_mii(dev, 0);
+out:
        mutex_unlock(&dev->phy_mutex);
 
        netdev_dbg(dev->net, "asix_mdio_read() phy_id=0x%02x, loc=0x%02x, returns=0x%04x\n",
                        phy_id, loc, le16_to_cpu(res));
 
-       return le16_to_cpu(res);
+       return ret < 0 ? ret : le16_to_cpu(res);
 }
 
-void asix_mdio_write(struct net_device *netdev, int phy_id, int loc, int val)
+static int __asix_mdio_write(struct net_device *netdev, int phy_id, int loc,
+                            int val)
 {
        struct usbnet *dev = netdev_priv(netdev);
        __le16 res = cpu_to_le16(val);
@@ -516,15 +521,25 @@ void asix_mdio_write(struct net_device *netdev, int phy_id, int loc, int val)
                ret = asix_read_cmd(dev, AX_CMD_STATMNGSTS_REG,
                                    0, 0, 1, &smsr, 0);
        } while (!(smsr & AX_HOST_EN) && (i++ < 30) && (ret != -ENODEV));
-       if (ret == -ENODEV) {
-               mutex_unlock(&dev->phy_mutex);
-               return;
-       }
 
-       asix_write_cmd(dev, AX_CMD_WRITE_MII_REG, phy_id,
-                      (__u16)loc, 2, &res, 0);
-       asix_set_hw_mii(dev, 0);
+       if (ret == -ENODEV)
+               goto out;
+
+       ret = asix_write_cmd(dev, AX_CMD_WRITE_MII_REG, phy_id, (__u16)loc, 2,
+                            &res, 0);
+       if (ret < 0)
+               goto out;
+
+       ret = asix_set_hw_mii(dev, 0);
+out:
        mutex_unlock(&dev->phy_mutex);
+
+       return ret < 0 ? ret : 0;
+}
+
+void asix_mdio_write(struct net_device *netdev, int phy_id, int loc, int val)
+{
+       __asix_mdio_write(netdev, phy_id, loc, val);
 }
 
 /* MDIO read and write wrappers for phylib */
@@ -539,8 +554,7 @@ int asix_mdio_bus_write(struct mii_bus *bus, int phy_id, int regnum, u16 val)
 {
        struct usbnet *priv = bus->priv;
 
-       asix_mdio_write(priv->net, phy_id, regnum, val);
-       return 0;
+       return __asix_mdio_write(priv->net, phy_id, regnum, val);
 }
 
 int asix_mdio_read_nopm(struct net_device *netdev, int phy_id, int loc)