diff options
author | Jussi Kivilinna <jussi.kivilinna@mbnet.fi> | 2009-07-30 12:41:37 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2009-08-04 16:44:16 -0400 |
commit | 7eaab7086c3a313d76c217f98bc610c523d9bc2c (patch) | |
tree | d984e1056aac37ecb215581d790f6c96fd6b11e5 /drivers/net | |
parent | 005ba2f17e68b4da6a2c2c01c826294beac50415 (diff) |
rndis_wlan: reset device and restore multicast list on rndis_wlan_reset()
Reset device properly with RNDIS_MSG_RESET in rndis_wlan_reset() and restore
multicast list afterwards.
Signed-off-by: Jussi Kivilinna <jussi.kivilinna@mbnet.fi>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net')
-rw-r--r-- | drivers/net/wireless/rndis_wlan.c | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/drivers/net/wireless/rndis_wlan.c b/drivers/net/wireless/rndis_wlan.c index dee05511d591..bfb9861a0366 100644 --- a/drivers/net/wireless/rndis_wlan.c +++ b/drivers/net/wireless/rndis_wlan.c | |||
@@ -594,6 +594,28 @@ static int rndis_set_oid(struct usbnet *dev, __le32 oid, void *data, int len) | |||
594 | } | 594 | } |
595 | 595 | ||
596 | 596 | ||
597 | static int rndis_reset(struct usbnet *usbdev) | ||
598 | { | ||
599 | struct rndis_wlan_private *priv = get_rndis_wlan_priv(usbdev); | ||
600 | struct rndis_reset *reset; | ||
601 | int ret; | ||
602 | |||
603 | mutex_lock(&priv->command_lock); | ||
604 | |||
605 | reset = (void *)priv->command_buffer; | ||
606 | memset(reset, 0, sizeof(*reset)); | ||
607 | reset->msg_type = RNDIS_MSG_RESET; | ||
608 | reset->msg_len = cpu_to_le32(sizeof(*reset)); | ||
609 | ret = rndis_command(usbdev, (void *)reset, CONTROL_BUFFER_SIZE); | ||
610 | |||
611 | mutex_unlock(&priv->command_lock); | ||
612 | |||
613 | if (ret < 0) | ||
614 | return ret; | ||
615 | return 0; | ||
616 | } | ||
617 | |||
618 | |||
597 | /* | 619 | /* |
598 | * Specs say that we can only set config parameters only soon after device | 620 | * Specs say that we can only set config parameters only soon after device |
599 | * initialization. | 621 | * initialization. |
@@ -2500,9 +2522,17 @@ static void rndis_wlan_unbind(struct usbnet *usbdev, struct usb_interface *intf) | |||
2500 | static int rndis_wlan_reset(struct usbnet *usbdev) | 2522 | static int rndis_wlan_reset(struct usbnet *usbdev) |
2501 | { | 2523 | { |
2502 | struct rndis_wlan_private *priv = get_rndis_wlan_priv(usbdev); | 2524 | struct rndis_wlan_private *priv = get_rndis_wlan_priv(usbdev); |
2525 | int retval; | ||
2503 | 2526 | ||
2504 | devdbg(usbdev, "rndis_wlan_reset"); | 2527 | devdbg(usbdev, "rndis_wlan_reset"); |
2505 | 2528 | ||
2529 | retval = rndis_reset(usbdev); | ||
2530 | if (retval) | ||
2531 | devwarn(usbdev, "rndis_reset() failed: %d", retval); | ||
2532 | |||
2533 | /* rndis_reset cleared multicast list, so restore here. */ | ||
2534 | set_multicast_list(usbdev); | ||
2535 | |||
2506 | queue_delayed_work(priv->workqueue, &priv->stats_work, | 2536 | queue_delayed_work(priv->workqueue, &priv->stats_work, |
2507 | round_jiffies_relative(STATS_UPDATE_JIFFIES)); | 2537 | round_jiffies_relative(STATS_UPDATE_JIFFIES)); |
2508 | 2538 | ||