commit: 5cbe61c5aff0a8ada691eb8b07dbfb55c303f640
From: Alan Stern <[email protected]>
Date: Mon, 7 May 2012 11:20:06 -0400
Subject: usb-serial: ftdi_sio: fix oops during autosuspend
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

This patch (as1550) fixes a bug in the usb-serial core that affects
the ftdi_sio driver and most likely others as well.  The core
implements suspend and resume routines, but it doesn't store pointers
to those routines in the usb_driver structures that it registers,
even though it does set those drivers' supports_autosuspend flag.  The
end result is that when one of these devices is autosuspended, we try
to call through a NULL pointer.

The patch fixes the problem by setting the suspend and resume method
pointers to the appropriate routines in the USB serial core, along
with the supports_autosuspend field, in each driver as it is
registered.

This should be back-ported to all the stable kernels that have the new
usb_serial_register_drivers() interface.

Signed-off-by: Alan Stern <[email protected]>
Reported-and-tested-by: Frank Schäfer <[email protected]>
Cc: stable <[email protected]>
Signed-off-by: Greg Kroah-Hartman <[email protected]>
---
 drivers/usb/serial/usb-serial.c |    9 +++++++--
 1 files changed, 7 insertions(+), 2 deletions(-)

diff --git a/drivers/usb/serial/usb-serial.c b/drivers/usb/serial/usb-serial.c
index 906f06e..f7b263e 100644
--- a/drivers/usb/serial/usb-serial.c
+++ b/drivers/usb/serial/usb-serial.c
@@ -1336,7 +1336,6 @@ static int usb_serial_register(struct usb_serial_driver 
*driver)
                                driver->description);
                return -EINVAL;
        }
-       driver->usb_driver->supports_autosuspend = 1;
 
        /* Add this device to our list of devices */
        mutex_lock(&table_lock);
@@ -1371,7 +1370,7 @@ static void usb_serial_deregister(struct 
usb_serial_driver *device)
  * @serial_drivers: NULL-terminated array of pointers to drivers to be 
registered
  *
  * Registers @udriver and all the drivers in the @serial_drivers array.
- * Automatically fills in the .no_dynamic_id field in @udriver and
+ * Automatically fills in the .no_dynamic_id and PM fields in @udriver and
  * the .usb_driver field in each serial driver.
  */
 int usb_serial_register_drivers(struct usb_driver *udriver,
@@ -1390,11 +1389,17 @@ int usb_serial_register_drivers(struct usb_driver 
*udriver,
         * the serial drivers are registered, because the probe would
         * simply fail for lack of a matching serial driver.
         * Therefore save off udriver's id_table until we are all set.
+        *
+        * Suspend/resume support is implemented in the usb-serial core,
+        * so fill in the PM-related fields in udriver.
         */
        saved_id_table = udriver->id_table;
        udriver->id_table = NULL;
 
        udriver->no_dynamic_id = 1;
+       udriver->supports_autosuspend = 1;
+       udriver->suspend = usb_serial_suspend;
+       udriver->resume = usb_serial_resume;
        rc = usb_register(udriver);
        if (rc)
                return rc;
-- 
1.7.3.4
--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to