diff options
author | Christoph Fritz <chf.fritz@googlemail.com> | 2010-05-16 17:45:59 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2010-05-17 19:33:28 -0400 |
commit | 59497bba59035a2b09ac21f96bb904d1101bd95f (patch) | |
tree | 2739fabf1e3d1c4cfe89056df2284e67d74ffcf9 | |
parent | 9153f7b997aef3fcfd0bf1eededfd76595c7dc0b (diff) |
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 501d27f74c7d..f5cff751db2f 100644 --- a/drivers/staging/wlan-ng/prism2usb.c +++ b/drivers/staging/wlan-ng/prism2usb.c | |||
@@ -285,11 +285,76 @@ exit: | |||
285 | usb_set_intfdata(interface, NULL); | 285 | usb_set_intfdata(interface, NULL); |
286 | } | 286 | } |
287 | 287 | ||
288 | #ifdef CONFIG_PM | ||
289 | static int prism2sta_suspend(struct usb_interface *interface, | ||
290 | pm_message_t message) | ||
291 | { | ||
292 | hfa384x_t *hw = NULL; | ||
293 | wlandevice_t *wlandev; | ||
294 | wlandev = (wlandevice_t *) usb_get_intfdata(interface); | ||
295 | if (!wlandev) | ||
296 | return -ENODEV; | ||
297 | |||
298 | hw = wlandev->priv; | ||
299 | if (!hw) | ||
300 | return -ENODEV; | ||
301 | |||
302 | prism2sta_ifstate(wlandev, P80211ENUM_ifstate_disable); | ||
303 | |||
304 | usb_kill_urb(&hw->rx_urb); | ||
305 | usb_kill_urb(&hw->tx_urb); | ||
306 | usb_kill_urb(&hw->ctlx_urb); | ||
307 | |||
308 | return 0; | ||
309 | } | ||
310 | |||
311 | static int prism2sta_resume(struct usb_interface *interface) | ||
312 | { | ||
313 | int result = 0; | ||
314 | hfa384x_t *hw = NULL; | ||
315 | wlandevice_t *wlandev; | ||
316 | wlandev = (wlandevice_t *) usb_get_intfdata(interface); | ||
317 | if (!wlandev) | ||
318 | return -ENODEV; | ||
319 | |||
320 | hw = wlandev->priv; | ||
321 | if (!hw) | ||
322 | return -ENODEV; | ||
323 | |||
324 | /* Do a chip-level reset on the MAC */ | ||
325 | if (prism2_doreset) { | ||
326 | result = hfa384x_corereset(hw, | ||
327 | prism2_reset_holdtime, | ||
328 | prism2_reset_settletime, 0); | ||
329 | if (result != 0) { | ||
330 | unregister_wlandev(wlandev); | ||
331 | hfa384x_destroy(hw); | ||
332 | printk(KERN_ERR | ||
333 | "%s: hfa384x_corereset() failed.\n", dev_info); | ||
334 | kfree(wlandev); | ||
335 | kfree(hw); | ||
336 | wlandev = NULL; | ||
337 | return -ENODEV; | ||
338 | } | ||
339 | } | ||
340 | |||
341 | prism2sta_ifstate(wlandev, P80211ENUM_ifstate_enable); | ||
342 | |||
343 | return 0; | ||
344 | } | ||
345 | #else | ||
346 | #define prism2sta_suspend NULL | ||
347 | #define prism2sta_resume NULL | ||
348 | #endif /* CONFIG_PM */ | ||
349 | |||
288 | static struct usb_driver prism2_usb_driver = { | 350 | static struct usb_driver prism2_usb_driver = { |
289 | .name = "prism2_usb", | 351 | .name = "prism2_usb", |
290 | .probe = prism2sta_probe_usb, | 352 | .probe = prism2sta_probe_usb, |
291 | .disconnect = prism2sta_disconnect_usb, | 353 | .disconnect = prism2sta_disconnect_usb, |
292 | .id_table = usb_prism_tbl, | 354 | .id_table = usb_prism_tbl, |
355 | .suspend = prism2sta_suspend, | ||
356 | .resume = prism2sta_resume, | ||
357 | .reset_resume = prism2sta_resume, | ||
293 | /* fops, minor? */ | 358 | /* fops, minor? */ |
294 | }; | 359 | }; |
295 | 360 | ||