aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristoph Fritz <chf.fritz@googlemail.com>2010-05-16 17:45:59 -0400
committerGreg Kroah-Hartman <gregkh@suse.de>2010-05-17 19:33:28 -0400
commit59497bba59035a2b09ac21f96bb904d1101bd95f (patch)
tree2739fabf1e3d1c4cfe89056df2284e67d74ffcf9
parent9153f7b997aef3fcfd0bf1eededfd76595c7dc0b (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.c65
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
289static 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
311static 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
288static struct usb_driver prism2_usb_driver = { 350static 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