From a83b956b32d96b4d2ad880a3691299de7ab24766 Mon Sep 17 00:00:00 2001 From: Jussi Kivilinna Date: Tue, 16 Jun 2009 17:17:27 +0300 Subject: [PATCH] --- yaml --- r: 158831 b: refs/heads/master c: a33e9e7f35ef6dcab528e0327f29188475f60691 h: refs/heads/master i: 158829: 741a4b84147e4939ef32df0719f75d2020442364 158827: c52c163ce3a91de683d1106a7417fe96682f4d37 158823: ece4e69a70dae4284ec727f0939a2de95ae6c5ce 158815: d3dc903c13d0d4dd28c8662c875784fbf38ce7dc v: v3 --- [refs] | 2 +- trunk/drivers/net/usb/usbnet.c | 14 ++++++++++++++ trunk/include/linux/usb/usbnet.h | 3 +++ 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index 62922086d4b2..4067be355625 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: d75ec2b7ec27fd6cdba78492fbd63bee4d091a87 +refs/heads/master: a33e9e7f35ef6dcab528e0327f29188475f60691 diff --git a/trunk/drivers/net/usb/usbnet.c b/trunk/drivers/net/usb/usbnet.c index edfd9e10ceba..25e435c49040 100644 --- a/trunk/drivers/net/usb/usbnet.c +++ b/trunk/drivers/net/usb/usbnet.c @@ -575,7 +575,9 @@ EXPORT_SYMBOL_GPL(usbnet_unlink_rx_urbs); int usbnet_stop (struct net_device *net) { struct usbnet *dev = netdev_priv(net); + struct driver_info *info = dev->driver_info; int temp; + int retval; DECLARE_WAIT_QUEUE_HEAD_ONSTACK (unlink_wakeup); DECLARE_WAITQUEUE (wait, current); @@ -587,6 +589,18 @@ int usbnet_stop (struct net_device *net) net->stats.rx_errors, net->stats.tx_errors ); + /* allow minidriver to stop correctly (wireless devices to turn off + * radio etc) */ + if (info->stop) { + retval = info->stop(dev); + if (retval < 0 && netif_msg_ifdown(dev)) + devinfo(dev, + "stop fail (%d) usbnet usb-%s-%s, %s", + retval, + dev->udev->bus->bus_name, dev->udev->devpath, + info->description); + } + // ensure there are no more active urbs add_wait_queue (&unlink_wakeup, &wait); dev->wait = &unlink_wakeup; diff --git a/trunk/include/linux/usb/usbnet.h b/trunk/include/linux/usb/usbnet.h index 310e18a880ff..7c17b2efba86 100644 --- a/trunk/include/linux/usb/usbnet.h +++ b/trunk/include/linux/usb/usbnet.h @@ -97,6 +97,9 @@ struct driver_info { /* reset device ... can sleep */ int (*reset)(struct usbnet *); + /* stop device ... can sleep */ + int (*stop)(struct usbnet *); + /* see if peer is connected ... can sleep */ int (*check_connect)(struct usbnet *);