]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
Staging: wlan-ng prism2usb: add suspend/resume
authorChristoph Fritz <chf.fritz@googlemail.com>
Sun, 16 May 2010 21:45:59 +0000 (23:45 +0200)
committerGreg Kroah-Hartman <gregkh@suse.de>
Mon, 17 May 2010 23:33:28 +0000 (16:33 -0700)
There is no need trying to load the (even in most cases) not availible
firmware after suspend. This saves about 30 secounds on reset waiting
for timeout.

Signed-off-by: Christoph Fritz <chf.fritz@googlemail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/staging/wlan-ng/prism2usb.c

index 501d27f74c7da4b785185c5ee69724f488636d2b..f5cff751db2fc872f422bc35ddfdbdd02bd3a99b 100644 (file)
@@ -285,11 +285,76 @@ exit:
        usb_set_intfdata(interface, NULL);
 }
 
+#ifdef CONFIG_PM
+static int prism2sta_suspend(struct usb_interface *interface,
+                               pm_message_t message)
+{
+       hfa384x_t *hw = NULL;
+       wlandevice_t *wlandev;
+       wlandev = (wlandevice_t *) usb_get_intfdata(interface);
+       if (!wlandev)
+               return -ENODEV;
+
+       hw = wlandev->priv;
+       if (!hw)
+               return -ENODEV;
+
+       prism2sta_ifstate(wlandev, P80211ENUM_ifstate_disable);
+
+       usb_kill_urb(&hw->rx_urb);
+       usb_kill_urb(&hw->tx_urb);
+       usb_kill_urb(&hw->ctlx_urb);
+
+       return 0;
+}
+
+static int prism2sta_resume(struct usb_interface *interface)
+{
+       int result = 0;
+       hfa384x_t *hw = NULL;
+       wlandevice_t *wlandev;
+       wlandev = (wlandevice_t *) usb_get_intfdata(interface);
+       if (!wlandev)
+               return -ENODEV;
+
+       hw = wlandev->priv;
+       if (!hw)
+               return -ENODEV;
+
+       /* Do a chip-level reset on the MAC */
+       if (prism2_doreset) {
+               result = hfa384x_corereset(hw,
+                                          prism2_reset_holdtime,
+                                          prism2_reset_settletime, 0);
+               if (result != 0) {
+                       unregister_wlandev(wlandev);
+                       hfa384x_destroy(hw);
+                       printk(KERN_ERR
+                              "%s: hfa384x_corereset() failed.\n", dev_info);
+                       kfree(wlandev);
+                       kfree(hw);
+                       wlandev = NULL;
+                       return -ENODEV;
+               }
+       }
+
+       prism2sta_ifstate(wlandev, P80211ENUM_ifstate_enable);
+
+       return 0;
+}
+#else
+#define prism2sta_suspend NULL
+#define prism2sta_resume NULL
+#endif /* CONFIG_PM */
+
 static struct usb_driver prism2_usb_driver = {
        .name = "prism2_usb",
        .probe = prism2sta_probe_usb,
        .disconnect = prism2sta_disconnect_usb,
        .id_table = usb_prism_tbl,
+       .suspend = prism2sta_suspend,
+       .resume = prism2sta_resume,
+       .reset_resume = prism2sta_resume,
        /* fops, minor? */
 };