Skip to content

Commit

Permalink
Staging: wlan-ng prism2usb: add suspend/resume
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Christoph Fritz authored and Greg Kroah-Hartman committed May 17, 2010
1 parent 9153f7b commit 59497bb
Showing 1 changed file with 65 additions and 0 deletions.
65 changes: 65 additions & 0 deletions drivers/staging/wlan-ng/prism2usb.c
Original file line number Diff line number Diff line change
Expand Up @@ -285,11 +285,76 @@ static void prism2sta_disconnect_usb(struct usb_interface *interface)
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? */
};

Expand Down

0 comments on commit 59497bb

Please sign in to comment.