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;
 
        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);
 
        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);
 
        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);
 
 
 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 */
 {
        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)