diff options
author | Stephen Rothwell <sfr@canb.auug.org.au> | 2010-05-20 15:30:34 +1000 |
---|---|---|
committer | Stephen Rothwell <sfr@canb.auug.org.au> | 2010-05-20 15:30:34 +1000 |
commit | 0dcca35668152ba93577dfccf9a52e5c207e873e (patch) | |
tree | b4f83242fffe394ceb9c634cf6ffa610a6abf013 /drivers/staging/wlan-ng/prism2usb.c | |
parent | 7912880c4c64e4999615e87061cd0ed22962a20e (diff) | |
parent | 107c161b7ddeeb7da43509cc6b29211885ccd9af (diff) |
Merge remote branch 'staging-next/staging-next'
Conflicts:
drivers/staging/arlan/arlan-main.c
drivers/staging/comedi/drivers/cb_das16_cs.c
drivers/staging/cx25821/cx25821-alsa.c
drivers/staging/dt3155/dt3155_drv.c
drivers/staging/hv/hv.c
drivers/staging/netwave/netwave_cs.c
drivers/staging/rtl8187se/r8180_core.c
drivers/staging/wavelan/wavelan.c
drivers/staging/wavelan/wavelan_cs.c
drivers/staging/wlags49_h2/wl_cs.c
Diffstat (limited to 'drivers/staging/wlan-ng/prism2usb.c')
-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 501d27f74c7d..f5cff751db2f 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? */ }; |