diff options
author | Christoph Fritz <chf.fritz@googlemail.com> | 2010-05-16 23:45:59 +0200 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2010-05-17 16:33:28 -0700 |
commit | 59497bba59035a2b09ac21f96bb904d1101bd95f (patch) | |
tree | 2739fabf1e3d1c4cfe89056df2284e67d74ffcf9 | |
parent | 9153f7b997aef3fcfd0bf1eededfd76595c7dc0b (diff) | |
download | op-kernel-dev-59497bba59035a2b09ac21f96bb904d1101bd95f.zip op-kernel-dev-59497bba59035a2b09ac21f96bb904d1101bd95f.tar.gz |
Staging: wlan-ng prism2usb: add suspend/resume
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>
-rw-r--r-- | drivers/staging/wlan-ng/prism2usb.c | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/drivers/staging/wlan-ng/prism2usb.c b/drivers/staging/wlan-ng/prism2usb.c index 501d27f..f5cff75 100644 --- a/drivers/staging/wlan-ng/prism2usb.c +++ b/drivers/staging/wlan-ng/prism2usb.c @@ -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? */ }; |