diff options
| -rw-r--r-- | drivers/net/usb/usbnet.c | 14 | ||||
| -rw-r--r-- | include/linux/usb/usbnet.h | 3 | 
2 files changed, 17 insertions, 0 deletions
diff --git a/drivers/net/usb/usbnet.c b/drivers/net/usb/usbnet.c index edfd9e10ceb..25e435c4904 100644 --- a/drivers/net/usb/usbnet.c +++ b/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/include/linux/usb/usbnet.h b/include/linux/usb/usbnet.h index 310e18a880f..7c17b2efba8 100644 --- a/include/linux/usb/usbnet.h +++ b/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 *);  |