summary refs log tree commit diff
path: root/drivers/net/usb/cdc_subset.c
diff options
context:
space:
mode:
authorOliver Neukum <oneukum@suse.de>2014-07-28 10:12:34 +0200
committerDavid S. Miller <davem@davemloft.net>2014-07-29 12:22:15 -0700
commit20fbe3ae990fd54fc7d1f889d61958bc8b38f254 (patch)
tree06f6b9af9f77b65c1bbd92cf1da3e3b64266c6e3 /drivers/net/usb/cdc_subset.c
parent40eea803c6b2cfaab092f053248cbeab3f368412 (diff)
downloadlinux-20fbe3ae990fd54fc7d1f889d61958bc8b38f254.tar.gz
cdc_subset: deal with a device that needs reset for timeout
This device needs to be reset to recover from a timeout.
Unfortunately this can be handled only at the level of
the subdrivers.

Signed-off-by: Oliver Neukum <oneukum@suse.de>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/usb/cdc_subset.c')
-rw-r--r--drivers/net/usb/cdc_subset.c27
1 files changed, 27 insertions, 0 deletions
diff --git a/drivers/net/usb/cdc_subset.c b/drivers/net/usb/cdc_subset.c
index 91f0919fe278..3ef411efd86e 100644
--- a/drivers/net/usb/cdc_subset.c
+++ b/drivers/net/usb/cdc_subset.c
@@ -85,9 +85,34 @@ static int always_connected (struct usbnet *dev)
  *
  *-------------------------------------------------------------------------*/
 
+static void m5632_recover(struct usbnet *dev)
+{
+	struct usb_device	*udev = dev->udev;
+	struct usb_interface	*intf = dev->intf;
+	int r;
+
+	r = usb_lock_device_for_reset(udev, intf);
+	if (r < 0)
+		return;
+
+	usb_reset_device(udev);
+	usb_unlock_device(udev);
+}
+
+static int dummy_prereset(struct usb_interface *intf)
+{
+	return 0;
+}
+
+static int dummy_postreset(struct usb_interface *intf)
+{
+	return 0;
+}
+
 static const struct driver_info	ali_m5632_info = {
 	.description =	"ALi M5632",
 	.flags       = FLAG_POINTTOPOINT,
+	.recover     = m5632_recover,
 };
 
 #endif
@@ -332,6 +357,8 @@ static struct usb_driver cdc_subset_driver = {
 	.probe =	usbnet_probe,
 	.suspend =	usbnet_suspend,
 	.resume =	usbnet_resume,
+	.pre_reset =	dummy_prereset,
+	.post_reset =	dummy_postreset,
 	.disconnect =	usbnet_disconnect,
 	.id_table =	products,
 	.disable_hub_initiated_lpm = 1,