net: usb: asix: refactor asix_read_phy_addr() and handle errors on return
authorOleksij Rempel <o.rempel@pengutronix.de>
Mon, 7 Jun 2021 08:27:21 +0000 (10:27 +0200)
committerDavid S. Miller <davem@davemloft.net>
Mon, 7 Jun 2021 20:23:02 +0000 (13:23 -0700)
Refactor asix_read_phy_addr() to return usable error value directly and
make sure all callers handle this error.

Signed-off-by: Oleksij Rempel <o.rempel@pengutronix.de>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/usb/asix.h
drivers/net/usb/asix_common.c
drivers/net/usb/asix_devices.c
drivers/net/usb/ax88172a.c

index 3b53685301dec699f354578ccaf27698b318b20d..edb94efd265e118d4babbc8f64859538574996a8 100644 (file)
@@ -205,8 +205,7 @@ struct sk_buff *asix_tx_fixup(struct usbnet *dev, struct sk_buff *skb,
 int asix_set_sw_mii(struct usbnet *dev, int in_pm);
 int asix_set_hw_mii(struct usbnet *dev, int in_pm);
 
-int asix_read_phy_addr(struct usbnet *dev, int internal);
-int asix_get_phy_addr(struct usbnet *dev);
+int asix_read_phy_addr(struct usbnet *dev, bool internal);
 
 int asix_sw_reset(struct usbnet *dev, u8 flags, int in_pm);
 
index 7bc6e8f856fe0bd0188d3cb3af772d6e44870d43..e1109f1a8dd5f6adb497758f49d895a4d656db96 100644 (file)
@@ -288,32 +288,33 @@ int asix_set_hw_mii(struct usbnet *dev, int in_pm)
        return ret;
 }
 
-int asix_read_phy_addr(struct usbnet *dev, int internal)
+int asix_read_phy_addr(struct usbnet *dev, bool internal)
 {
-       int offset = (internal ? 1 : 0);
+       int ret, offset;
        u8 buf[2];
-       int ret = asix_read_cmd(dev, AX_CMD_READ_PHY_ID, 0, 0, 2, buf, 0);
 
-       netdev_dbg(dev->net, "asix_get_phy_addr()\n");
+       ret = asix_read_cmd(dev, AX_CMD_READ_PHY_ID, 0, 0, 2, buf, 0);
+       if (ret < 0)
+               goto error;
 
        if (ret < 2) {
-               netdev_err(dev->net, "Error reading PHYID register: %02x\n", ret);
-               goto out;
+               ret = -EIO;
+               goto error;
        }
-       netdev_dbg(dev->net, "asix_get_phy_addr() returning 0x%04x\n",
-                  *((__le16 *)buf));
+
+       offset = (internal ? 1 : 0);
        ret = buf[offset];
 
-out:
+       netdev_dbg(dev->net, "%s PHY address 0x%x\n",
+                  internal ? "internal" : "external", ret);
+
        return ret;
-}
 
-int asix_get_phy_addr(struct usbnet *dev)
-{
-       /* return the address of the internal phy */
-       return asix_read_phy_addr(dev, 1);
-}
+error:
+       netdev_err(dev->net, "Error reading PHY_ID register: %02x\n", ret);
 
+       return ret;
+}
 
 int asix_sw_reset(struct usbnet *dev, u8 flags, int in_pm)
 {
index 5f767a33264e1e611fd6e938f08784495cf5f706..00b6ac0570ebbbbc9ff6aee7a014246a4fa0dc94 100644 (file)
@@ -262,7 +262,10 @@ static int ax88172_bind(struct usbnet *dev, struct usb_interface *intf)
        dev->mii.mdio_write = asix_mdio_write;
        dev->mii.phy_id_mask = 0x3f;
        dev->mii.reg_num_mask = 0x1f;
-       dev->mii.phy_id = asix_get_phy_addr(dev);
+
+       dev->mii.phy_id = asix_read_phy_addr(dev, true);
+       if (dev->mii.phy_id < 0)
+               return dev->mii.phy_id;
 
        dev->net->netdev_ops = &ax88172_netdev_ops;
        dev->net->ethtool_ops = &ax88172_ethtool_ops;
@@ -717,7 +720,10 @@ static int ax88772_bind(struct usbnet *dev, struct usb_interface *intf)
        dev->mii.mdio_write = asix_mdio_write;
        dev->mii.phy_id_mask = 0x1f;
        dev->mii.reg_num_mask = 0x1f;
-       dev->mii.phy_id = asix_get_phy_addr(dev);
+
+       dev->mii.phy_id = asix_read_phy_addr(dev, true);
+       if (dev->mii.phy_id < 0)
+               return dev->mii.phy_id;
 
        dev->net->netdev_ops = &ax88772_netdev_ops;
        dev->net->ethtool_ops = &ax88772_ethtool_ops;
@@ -1080,7 +1086,10 @@ static int ax88178_bind(struct usbnet *dev, struct usb_interface *intf)
        dev->mii.phy_id_mask = 0x1f;
        dev->mii.reg_num_mask = 0xff;
        dev->mii.supports_gmii = 1;
-       dev->mii.phy_id = asix_get_phy_addr(dev);
+
+       dev->mii.phy_id = asix_read_phy_addr(dev, true);
+       if (dev->mii.phy_id < 0)
+               return dev->mii.phy_id;
 
        dev->net->netdev_ops = &ax88178_netdev_ops;
        dev->net->ethtool_ops = &ax88178_ethtool_ops;
index b404c9462dcecb8c429d834260388b8a8fe3fc62..c8ca5187eece5ca4a84b566a3865afe450f13b9b 100644 (file)
@@ -220,6 +220,11 @@ static int ax88172a_bind(struct usbnet *dev, struct usb_interface *intf)
        }
 
        priv->phy_addr = asix_read_phy_addr(dev, priv->use_embdphy);
+       if (priv->phy_addr < 0) {
+               ret = priv->phy_addr;
+               goto free;
+       }
+
        ax88172a_reset_phy(dev, priv->use_embdphy);
 
        /* Asix framing packs multiple eth frames into a 2K usb bulk transfer */