aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net
diff options
context:
space:
mode:
authorJussi Kivilinna <jussi.kivilinna@mbnet.fi>2009-07-30 12:41:37 -0400
committerJohn W. Linville <linville@tuxdriver.com>2009-08-04 16:44:16 -0400
commit7eaab7086c3a313d76c217f98bc610c523d9bc2c (patch)
treed984e1056aac37ecb215581d790f6c96fd6b11e5 /drivers/net
parent005ba2f17e68b4da6a2c2c01c826294beac50415 (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.c30
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
597static 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)
2500static int rndis_wlan_reset(struct usbnet *usbdev) 2522static 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