]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/blame - releases/2.6.36.2/usbnet-fix-usb_autopm_get_interface-failure-v1.patch
Fixes for 4.19
[thirdparty/kernel/stable-queue.git] / releases / 2.6.36.2 / usbnet-fix-usb_autopm_get_interface-failure-v1.patch
CommitLineData
53c49429
GKH
1From b0786b430c982dffbb44d8030e6b6088671ce745 Mon Sep 17 00:00:00 2001
2From: Ming Lei <tom.leiming@gmail.com>
3Date: Mon, 1 Nov 2010 07:11:54 -0700
4Subject: usbnet: fix usb_autopm_get_interface failure(v1)
5
6From: Ming Lei <tom.leiming@gmail.com>
7
8commit b0786b430c982dffbb44d8030e6b6088671ce745 upstream.
9
10Since usbnet already took usb runtime pm, we have to
11enable runtime pm for usb interface of usbnet, otherwise
12usb_autopm_get_interface may return failure and cause
13'ifconfig usb0 up' failed if USB_SUSPEND(RUNTIME_PM) is
14enabled.
15
16Cc: David Brownell <dbrownell@users.sourceforge.net>
17Cc: "David S. Miller" <davem@davemloft.net>
18Cc: Ben Hutchings <ben@decadent.org.uk>
19Cc: Joe Perches <joe@perches.com>
20Cc: Oliver Neukum <oliver@neukum.org>
21Cc: Andy Shevchenko <andy.shevchenko@gmail.com>
22Signed-off-by: Ming Lei <tom.leiming@gmail.com>
23Signed-off-by: David S. Miller <davem@davemloft.net>
24Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
25
26---
27 drivers/net/usb/usbnet.c | 11 +++++++++++
28 1 file changed, 11 insertions(+)
29
30--- a/drivers/net/usb/usbnet.c
31+++ b/drivers/net/usb/usbnet.c
32@@ -45,6 +45,7 @@
33 #include <linux/usb/usbnet.h>
34 #include <linux/slab.h>
35 #include <linux/kernel.h>
36+#include <linux/pm_runtime.h>
37
38 #define DRIVER_VERSION "22-Aug-2005"
39
40@@ -1273,6 +1274,16 @@ usbnet_probe (struct usb_interface *udev
41 struct usb_device *xdev;
42 int status;
43 const char *name;
44+ struct usb_driver *driver = to_usb_driver(udev->dev.driver);
45+
46+ /* usbnet already took usb runtime pm, so have to enable the feature
47+ * for usb interface, otherwise usb_autopm_get_interface may return
48+ * failure if USB_SUSPEND(RUNTIME_PM) is enabled.
49+ */
50+ if (!driver->supports_autosuspend) {
51+ driver->supports_autosuspend = 1;
52+ pm_runtime_enable(&udev->dev);
53+ }
54
55 name = udev->dev.driver->name;
56 info = (struct driver_info *) prod->driver_info;