OSDN Git Service

net: asix: remove code duplicates in asix_mdio_read/write and asix_mdio_read/write_nopm
authorOleksij Rempel <o.rempel@pengutronix.de>
Wed, 23 Feb 2022 11:06:33 +0000 (12:06 +0100)
committerJakub Kicinski <kuba@kernel.org>
Fri, 25 Feb 2022 05:21:30 +0000 (21:21 -0800)
This functions are mostly same except of one hard coded "in_pm" variable.
So, rework them to reduce maintenance overhead.

Signed-off-by: Oleksij Rempel <o.rempel@pengutronix.de>
Link: https://lore.kernel.org/r/20220223110633.3006551-1-o.rempel@pengutronix.de
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/usb/asix_common.c

index 5248052..632fa6c 100644 (file)
@@ -491,7 +491,8 @@ void asix_set_multicast(struct net_device *net)
        asix_write_cmd_async(dev, AX_CMD_WRITE_RX_CTL, rx_ctl, 0, 0, NULL);
 }
 
-int asix_mdio_read(struct net_device *netdev, int phy_id, int loc)
+static int __asix_mdio_read(struct net_device *netdev, int phy_id, int loc,
+                           bool in_pm)
 {
        struct usbnet *dev = netdev_priv(netdev);
        __le16 res;
@@ -499,18 +500,18 @@ int asix_mdio_read(struct net_device *netdev, int phy_id, int loc)
 
        mutex_lock(&dev->phy_mutex);
 
-       ret = asix_check_host_enable(dev, 0);
+       ret = asix_check_host_enable(dev, in_pm);
        if (ret == -ENODEV || ret == -ETIMEDOUT) {
                mutex_unlock(&dev->phy_mutex);
                return ret;
        }
 
        ret = asix_read_cmd(dev, AX_CMD_READ_MII_REG, phy_id, (__u16)loc, 2,
-                           &res, 0);
+                           &res, in_pm);
        if (ret < 0)
                goto out;
 
-       ret = asix_set_hw_mii(dev, 0);
+       ret = asix_set_hw_mii(dev, in_pm);
 out:
        mutex_unlock(&dev->phy_mutex);
 
@@ -520,8 +521,13 @@ out:
        return ret < 0 ? ret : le16_to_cpu(res);
 }
 
+int asix_mdio_read(struct net_device *netdev, int phy_id, int loc)
+{
+       return __asix_mdio_read(netdev, phy_id, loc, false);
+}
+
 static int __asix_mdio_write(struct net_device *netdev, int phy_id, int loc,
-                            int val)
+                            int val, bool in_pm)
 {
        struct usbnet *dev = netdev_priv(netdev);
        __le16 res = cpu_to_le16(val);
@@ -532,16 +538,16 @@ static int __asix_mdio_write(struct net_device *netdev, int phy_id, int loc,
 
        mutex_lock(&dev->phy_mutex);
 
-       ret = asix_check_host_enable(dev, 0);
+       ret = asix_check_host_enable(dev, in_pm);
        if (ret == -ENODEV)
                goto out;
 
        ret = asix_write_cmd(dev, AX_CMD_WRITE_MII_REG, phy_id, (__u16)loc, 2,
-                            &res, 0);
+                            &res, in_pm);
        if (ret < 0)
                goto out;
 
-       ret = asix_set_hw_mii(dev, 0);
+       ret = asix_set_hw_mii(dev, in_pm);
 out:
        mutex_unlock(&dev->phy_mutex);
 
@@ -550,7 +556,7 @@ out:
 
 void asix_mdio_write(struct net_device *netdev, int phy_id, int loc, int val)
 {
-       __asix_mdio_write(netdev, phy_id, loc, val);
+       __asix_mdio_write(netdev, phy_id, loc, val, false);
 }
 
 /* MDIO read and write wrappers for phylib */
@@ -558,67 +564,25 @@ int asix_mdio_bus_read(struct mii_bus *bus, int phy_id, int regnum)
 {
        struct usbnet *priv = bus->priv;
 
-       return asix_mdio_read(priv->net, phy_id, regnum);
+       return __asix_mdio_read(priv->net, phy_id, regnum, false);
 }
 
 int asix_mdio_bus_write(struct mii_bus *bus, int phy_id, int regnum, u16 val)
 {
        struct usbnet *priv = bus->priv;
 
-       return __asix_mdio_write(priv->net, phy_id, regnum, val);
+       return __asix_mdio_write(priv->net, phy_id, regnum, val, false);
 }
 
 int asix_mdio_read_nopm(struct net_device *netdev, int phy_id, int loc)
 {
-       struct usbnet *dev = netdev_priv(netdev);
-       __le16 res;
-       int ret;
-
-       mutex_lock(&dev->phy_mutex);
-
-       ret = asix_check_host_enable(dev, 1);
-       if (ret == -ENODEV || ret == -ETIMEDOUT) {
-               mutex_unlock(&dev->phy_mutex);
-               return ret;
-       }
-
-       ret = asix_read_cmd(dev, AX_CMD_READ_MII_REG, phy_id,
-                           (__u16)loc, 2, &res, 1);
-       if (ret < 0) {
-               mutex_unlock(&dev->phy_mutex);
-               return ret;
-       }
-       asix_set_hw_mii(dev, 1);
-       mutex_unlock(&dev->phy_mutex);
-
-       netdev_dbg(dev->net, "asix_mdio_read_nopm() phy_id=0x%02x, loc=0x%02x, returns=0x%04x\n",
-                       phy_id, loc, le16_to_cpu(res));
-
-       return le16_to_cpu(res);
+       return __asix_mdio_read(netdev, phy_id, loc, true);
 }
 
 void
 asix_mdio_write_nopm(struct net_device *netdev, int phy_id, int loc, int val)
 {
-       struct usbnet *dev = netdev_priv(netdev);
-       __le16 res = cpu_to_le16(val);
-       int ret;
-
-       netdev_dbg(dev->net, "asix_mdio_write() phy_id=0x%02x, loc=0x%02x, val=0x%04x\n",
-                       phy_id, loc, val);
-
-       mutex_lock(&dev->phy_mutex);
-
-       ret = asix_check_host_enable(dev, 1);
-       if (ret == -ENODEV) {
-               mutex_unlock(&dev->phy_mutex);
-               return;
-       }
-
-       asix_write_cmd(dev, AX_CMD_WRITE_MII_REG, phy_id,
-                      (__u16)loc, 2, &res, 1);
-       asix_set_hw_mii(dev, 1);
-       mutex_unlock(&dev->phy_mutex);
+       __asix_mdio_write(netdev, phy_id, loc, val, true);
 }
 
 void asix_get_wol(struct net_device *net, struct ethtool_wolinfo *wolinfo)