u8  eee_active;
        u16 rxctl;
        u16 reserved;
+       u8 in_pm;
 };
 
 struct ax88179_int_data {
        {7, 0xcc, 0x4c, 0x18, 8},
 };
 
+static void ax88179_set_pm_mode(struct usbnet *dev, bool pm_mode)
+{
+       struct ax88179_data *ax179_data = (struct ax88179_data *)dev->data;
+
+       ax179_data->in_pm = pm_mode;
+}
+
+static int ax88179_in_pm(struct usbnet *dev)
+{
+       struct ax88179_data *ax179_data = (struct ax88179_data *)dev->data;
+
+       return ax179_data->in_pm;
+}
+
 static int __ax88179_read_cmd(struct usbnet *dev, u8 cmd, u16 value, u16 index,
-                             u16 size, void *data, int in_pm)
+                             u16 size, void *data)
 {
        int ret;
        int (*fn)(struct usbnet *, u8, u8, u16, u16, void *, u16);
 
        BUG_ON(!dev);
 
-       if (!in_pm)
+       if (!ax88179_in_pm(dev))
                fn = usbnet_read_cmd;
        else
                fn = usbnet_read_cmd_nopm;
 }
 
 static int __ax88179_write_cmd(struct usbnet *dev, u8 cmd, u16 value, u16 index,
-                              u16 size, const void *data, int in_pm)
+                              u16 size, const void *data)
 {
        int ret;
        int (*fn)(struct usbnet *, u8, u8, u16, u16, const void *, u16);
 
        BUG_ON(!dev);
 
-       if (!in_pm)
+       if (!ax88179_in_pm(dev))
                fn = usbnet_write_cmd;
        else
                fn = usbnet_write_cmd_nopm;
        }
 }
 
-static int ax88179_read_cmd_nopm(struct usbnet *dev, u8 cmd, u16 value,
-                                u16 index, u16 size, void *data)
-{
-       int ret;
-
-       if (2 == size) {
-               u16 buf;
-               ret = __ax88179_read_cmd(dev, cmd, value, index, size, &buf, 1);
-               le16_to_cpus(&buf);
-               *((u16 *)data) = buf;
-       } else if (4 == size) {
-               u32 buf;
-               ret = __ax88179_read_cmd(dev, cmd, value, index, size, &buf, 1);
-               le32_to_cpus(&buf);
-               *((u32 *)data) = buf;
-       } else {
-               ret = __ax88179_read_cmd(dev, cmd, value, index, size, data, 1);
-       }
-
-       return ret;
-}
-
-static int ax88179_write_cmd_nopm(struct usbnet *dev, u8 cmd, u16 value,
-                                 u16 index, u16 size, const void *data)
-{
-       int ret;
-
-       if (2 == size) {
-               u16 buf;
-               buf = *((u16 *)data);
-               cpu_to_le16s(&buf);
-               ret = __ax88179_write_cmd(dev, cmd, value, index,
-                                         size, &buf, 1);
-       } else {
-               ret = __ax88179_write_cmd(dev, cmd, value, index,
-                                         size, data, 1);
-       }
-
-       return ret;
-}
-
 static int ax88179_read_cmd(struct usbnet *dev, u8 cmd, u16 value, u16 index,
                            u16 size, void *data)
 {
 
        if (2 == size) {
                u16 buf = 0;
-               ret = __ax88179_read_cmd(dev, cmd, value, index, size, &buf, 0);
+               ret = __ax88179_read_cmd(dev, cmd, value, index, size, &buf);
                le16_to_cpus(&buf);
                *((u16 *)data) = buf;
        } else if (4 == size) {
                u32 buf = 0;
-               ret = __ax88179_read_cmd(dev, cmd, value, index, size, &buf, 0);
+               ret = __ax88179_read_cmd(dev, cmd, value, index, size, &buf);
                le32_to_cpus(&buf);
                *((u32 *)data) = buf;
        } else {
-               ret = __ax88179_read_cmd(dev, cmd, value, index, size, data, 0);
+               ret = __ax88179_read_cmd(dev, cmd, value, index, size, data);
        }
 
        return ret;
                buf = *((u16 *)data);
                cpu_to_le16s(&buf);
                ret = __ax88179_write_cmd(dev, cmd, value, index,
-                                         size, &buf, 0);
+                                         size, &buf);
        } else {
                ret = __ax88179_write_cmd(dev, cmd, value, index,
-                                         size, data, 0);
+                                         size, data);
        }
 
        return ret;
        u16 tmp16;
        u8 tmp8;
 
+       ax88179_set_pm_mode(dev, true);
+
        usbnet_suspend(intf, message);
 
        /* Disable RX path */
-       ax88179_read_cmd_nopm(dev, AX_ACCESS_MAC, AX_MEDIUM_STATUS_MODE,
-                             2, 2, &tmp16);
+       ax88179_read_cmd(dev, AX_ACCESS_MAC, AX_MEDIUM_STATUS_MODE,
+                        2, 2, &tmp16);
        tmp16 &= ~AX_MEDIUM_RECEIVE_EN;
-       ax88179_write_cmd_nopm(dev, AX_ACCESS_MAC, AX_MEDIUM_STATUS_MODE,
-                              2, 2, &tmp16);
+       ax88179_write_cmd(dev, AX_ACCESS_MAC, AX_MEDIUM_STATUS_MODE,
+                         2, 2, &tmp16);
 
        /* Force bulk-in zero length */
-       ax88179_read_cmd_nopm(dev, AX_ACCESS_MAC, AX_PHYPWR_RSTCTL,
-                             2, 2, &tmp16);
+       ax88179_read_cmd(dev, AX_ACCESS_MAC, AX_PHYPWR_RSTCTL,
+                        2, 2, &tmp16);
 
        tmp16 |= AX_PHYPWR_RSTCTL_BZ | AX_PHYPWR_RSTCTL_IPRL;
-       ax88179_write_cmd_nopm(dev, AX_ACCESS_MAC, AX_PHYPWR_RSTCTL,
-                              2, 2, &tmp16);
+       ax88179_write_cmd(dev, AX_ACCESS_MAC, AX_PHYPWR_RSTCTL,
+                         2, 2, &tmp16);
 
        /* change clock */
        tmp8 = 0;
-       ax88179_write_cmd_nopm(dev, AX_ACCESS_MAC, AX_CLK_SELECT, 1, 1, &tmp8);
+       ax88179_write_cmd(dev, AX_ACCESS_MAC, AX_CLK_SELECT, 1, 1, &tmp8);
 
        /* Configure RX control register => stop operation */
        tmp16 = AX_RX_CTL_STOP;
-       ax88179_write_cmd_nopm(dev, AX_ACCESS_MAC, AX_RX_CTL, 2, 2, &tmp16);
+       ax88179_write_cmd(dev, AX_ACCESS_MAC, AX_RX_CTL, 2, 2, &tmp16);
+
+       ax88179_set_pm_mode(dev, false);
 
        return 0;
 }
 
 /* This function is used to enable the autodetach function. */
 /* This function is determined by offset 0x43 of EEPROM */
-static int ax88179_auto_detach(struct usbnet *dev, int in_pm)
+static int ax88179_auto_detach(struct usbnet *dev)
 {
        u16 tmp16;
        u8 tmp8;
-       int (*fnr)(struct usbnet *, u8, u16, u16, u16, void *);
-       int (*fnw)(struct usbnet *, u8, u16, u16, u16, const void *);
-
-       if (!in_pm) {
-               fnr = ax88179_read_cmd;
-               fnw = ax88179_write_cmd;
-       } else {
-               fnr = ax88179_read_cmd_nopm;
-               fnw = ax88179_write_cmd_nopm;
-       }
 
-       if (fnr(dev, AX_ACCESS_EEPROM, 0x43, 1, 2, &tmp16) < 0)
+       if (ax88179_read_cmd(dev, AX_ACCESS_EEPROM, 0x43, 1, 2, &tmp16) < 0)
                return 0;
 
        if ((tmp16 == 0xFFFF) || (!(tmp16 & 0x0100)))
 
        /* Enable Auto Detach bit */
        tmp8 = 0;
-       fnr(dev, AX_ACCESS_MAC, AX_CLK_SELECT, 1, 1, &tmp8);
+       ax88179_read_cmd(dev, AX_ACCESS_MAC, AX_CLK_SELECT, 1, 1, &tmp8);
        tmp8 |= AX_CLK_SELECT_ULR;
-       fnw(dev, AX_ACCESS_MAC, AX_CLK_SELECT, 1, 1, &tmp8);
+       ax88179_write_cmd(dev, AX_ACCESS_MAC, AX_CLK_SELECT, 1, 1, &tmp8);
 
-       fnr(dev, AX_ACCESS_MAC, AX_PHYPWR_RSTCTL, 2, 2, &tmp16);
+       ax88179_read_cmd(dev, AX_ACCESS_MAC, AX_PHYPWR_RSTCTL, 2, 2, &tmp16);
        tmp16 |= AX_PHYPWR_RSTCTL_AT;
-       fnw(dev, AX_ACCESS_MAC, AX_PHYPWR_RSTCTL, 2, 2, &tmp16);
+       ax88179_write_cmd(dev, AX_ACCESS_MAC, AX_PHYPWR_RSTCTL, 2, 2, &tmp16);
 
        return 0;
 }
        u16 tmp16;
        u8 tmp8;
 
+       ax88179_set_pm_mode(dev, true);
+
        usbnet_link_change(dev, 0, 0);
 
        /* Power up ethernet PHY */
        tmp16 = 0;
-       ax88179_write_cmd_nopm(dev, AX_ACCESS_MAC, AX_PHYPWR_RSTCTL,
-                              2, 2, &tmp16);
+       ax88179_write_cmd(dev, AX_ACCESS_MAC, AX_PHYPWR_RSTCTL,
+                         2, 2, &tmp16);
        udelay(1000);
 
        tmp16 = AX_PHYPWR_RSTCTL_IPRL;
-       ax88179_write_cmd_nopm(dev, AX_ACCESS_MAC, AX_PHYPWR_RSTCTL,
-                              2, 2, &tmp16);
+       ax88179_write_cmd(dev, AX_ACCESS_MAC, AX_PHYPWR_RSTCTL,
+                         2, 2, &tmp16);
        msleep(200);
 
        /* Ethernet PHY Auto Detach*/
-       ax88179_auto_detach(dev, 1);
+       ax88179_auto_detach(dev);
 
        /* Enable clock */
-       ax88179_read_cmd_nopm(dev, AX_ACCESS_MAC,  AX_CLK_SELECT, 1, 1, &tmp8);
+       ax88179_read_cmd(dev, AX_ACCESS_MAC,  AX_CLK_SELECT, 1, 1, &tmp8);
        tmp8 |= AX_CLK_SELECT_ACS | AX_CLK_SELECT_BCS;
-       ax88179_write_cmd_nopm(dev, AX_ACCESS_MAC, AX_CLK_SELECT, 1, 1, &tmp8);
+       ax88179_write_cmd(dev, AX_ACCESS_MAC, AX_CLK_SELECT, 1, 1, &tmp8);
        msleep(100);
 
        /* Configure RX control register => start operation */
        tmp16 = AX_RX_CTL_DROPCRCERR | AX_RX_CTL_IPE | AX_RX_CTL_START |
                AX_RX_CTL_AP | AX_RX_CTL_AMALL | AX_RX_CTL_AB;
-       ax88179_write_cmd_nopm(dev, AX_ACCESS_MAC, AX_RX_CTL, 2, 2, &tmp16);
+       ax88179_write_cmd(dev, AX_ACCESS_MAC, AX_RX_CTL, 2, 2, &tmp16);
+
+       ax88179_set_pm_mode(dev, false);
 
        return usbnet_resume(intf);
 }
        /* ax88179/178A returns 2 bytes from eeprom on read */
        for (i = first_word; i <= last_word; i++) {
                ret = __ax88179_read_cmd(dev, AX_ACCESS_EEPROM, i, 1, 2,
-                                        &eeprom_buff[i - first_word],
-                                        0);
+                                        &eeprom_buff[i - first_word]);
                if (ret < 0) {
                        kfree(eeprom_buff);
                        return -EIO;
                } while (buf & EEP_BUSY);
 
                __ax88179_read_cmd(dev, AX_ACCESS_MAC, AX_SROM_DATA_LOW,
-                                  2, 2, &eeprom[i * 2], 0);
+                                  2, 2, &eeprom[i * 2]);
 
                if ((i == 0) && (eeprom[0] == 0xFF))
                        return -EINVAL;
        msleep(100);
 
        /* Ethernet PHY Auto Detach*/
-       ax88179_auto_detach(dev, 0);
+       ax88179_auto_detach(dev);
 
        /* Read MAC address from DTB or asix chip */
        ax88179_get_mac_addr(dev);