}
 }
 
+static int smsc95xx_suspend(struct usb_interface *intf, pm_message_t message)
+{
+       struct usbnet *dev = usb_get_intfdata(intf);
+       int ret;
+       u32 val;
+
+       if (WARN_ON_ONCE(!dev))
+               return -EINVAL;
+
+       ret = usbnet_suspend(intf, message);
+       check_warn_return(ret, "usbnet_suspend error");
+
+       netdev_info(dev->net, "entering SUSPEND2 mode");
+
+       ret = smsc95xx_read_reg(dev, PM_CTRL, &val);
+       check_warn_return(ret, "Error reading PM_CTRL");
+
+       val &= ~(PM_CTL_SUS_MODE_ | PM_CTL_WUPS_ | PM_CTL_PHY_RST_);
+       val |= PM_CTL_SUS_MODE_2;
+
+       ret = smsc95xx_write_reg(dev, PM_CTRL, val);
+       check_warn_return(ret, "Error writing PM_CTRL");
+
+       return 0;
+}
+
 static void smsc95xx_rx_csum_offload(struct sk_buff *skb)
 {
        skb->csum = *(u16 *)(skb_tail_pointer(skb) - 2);
        .name           = "smsc95xx",
        .id_table       = products,
        .probe          = usbnet_probe,
-       .suspend        = usbnet_suspend,
+       .suspend        = smsc95xx_suspend,
        .resume         = usbnet_resume,
        .reset_resume   = usbnet_resume,
        .disconnect     = usbnet_disconnect,
 
 #define HW_CFG_BCE_                    (0x00000002)
 #define HW_CFG_SRST_                   (0x00000001)
 
+#define RX_FIFO_INF                    (0x18)
+
 #define PM_CTRL                                (0x20)
+#define PM_CTL_RES_CLR_WKP_STS         (0x00000200)
 #define PM_CTL_DEV_RDY_                        (0x00000080)
 #define PM_CTL_SUS_MODE_               (0x00000060)
 #define PM_CTL_SUS_MODE_0              (0x00000000)
 #define PM_CTL_SUS_MODE_1              (0x00000020)
-#define PM_CTL_SUS_MODE_2              (0x00000060)
+#define PM_CTL_SUS_MODE_2              (0x00000040)
+#define PM_CTL_SUS_MODE_3              (0x00000060)
 #define PM_CTL_PHY_RST_                        (0x00000010)
 #define PM_CTL_WOL_EN_                 (0x00000008)
 #define PM_CTL_ED_EN_                  (0x00000004)