Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=f0fbd5b9ba893b965b2892c1971e3433092b98c7
Commit:     f0fbd5b9ba893b965b2892c1971e3433092b98c7
Parent:     00274921a052d3232d9f00856387fb269ac0af11
Author:     Sarah Sharp <[EMAIL PROTECTED]>
AuthorDate: Tue Nov 13 17:10:09 2007 -0800
Committer:  Greg Kroah-Hartman <[EMAIL PROTECTED]>
CommitDate: Fri Feb 1 14:34:51 2008 -0800

    USB: Prepare serial core for autosuspend.
    
    Claim the interface for a USB to serial converter when the tty is open,
    and release the interface when the tty is closed.
    
    If a driver doesn't provide a resume function, use the generic resume
    instead.
    
    Make sure the generic resume function does not submit the URBs if we're
    coming back from autosuspend.  On autoresume, we know that the open
    function will be called next, which will attempt to submit the URBs.  If
    we submit them in the resume function, the open will fail.
    
    This works for:
     - autosuspend
     - suspending with the tty open or closed
     - hibernate with the tty closed
    
    A hibernate (or a suspend that causes the USB subsystem to lose power)
    has issues.  If you have the tty open when you hibernate, a new tty will
    be created when the device re-enumerates during resume.
    
    Signed-off-by: Sarah Sharp <[EMAIL PROTECTED]>
    Signed-off-by: Greg Kroah-Hartman <[EMAIL PROTECTED]>
---
 drivers/usb/serial/generic.c    |    8 ++++++++
 drivers/usb/serial/usb-serial.c |   12 ++++++++++--
 2 files changed, 18 insertions(+), 2 deletions(-)

diff --git a/drivers/usb/serial/generic.c b/drivers/usb/serial/generic.c
index d415311..97fa3c4 100644
--- a/drivers/usb/serial/generic.c
+++ b/drivers/usb/serial/generic.c
@@ -175,6 +175,14 @@ int usb_serial_generic_resume(struct usb_serial *serial)
        struct usb_serial_port *port;
        int i, c = 0, r;
 
+#ifdef CONFIG_PM
+       /*
+        * If this is an autoresume, don't submit URBs.
+        * They will be submitted in the open function instead.
+        */
+       if (serial->dev->auto_pm)
+               return 0;
+#endif
        for (i = 0; i < serial->num_ports; i++) {
                port = serial->port[i];
                if (port->open_count && port->read_urb) {
diff --git a/drivers/usb/serial/usb-serial.c b/drivers/usb/serial/usb-serial.c
index 5c33e24..28315b0 100644
--- a/drivers/usb/serial/usb-serial.c
+++ b/drivers/usb/serial/usb-serial.c
@@ -225,16 +225,21 @@ static int serial_open (struct tty_struct *tty, struct 
file * filp)
                        goto bailout_mutex_unlock;
                }
 
+               retval = usb_autopm_get_interface(serial->interface);
+               if (retval)
+                       goto bailout_module_put;
                /* only call the device specific open if this 
                 * is the first time the port is opened */
                retval = serial->type->open(port, filp);
                if (retval)
-                       goto bailout_module_put;
+                       goto bailout_interface_put;
        }
 
        mutex_unlock(&port->mutex);
        return 0;
 
+bailout_interface_put:
+       usb_autopm_put_interface(serial->interface);
 bailout_module_put:
        module_put(serial->type->driver.owner);
 bailout_mutex_unlock:
@@ -277,8 +282,10 @@ static void serial_close(struct tty_struct *tty, struct 
file * filp)
                }
        }
 
-       if (port->open_count == 0)
+       if (port->open_count == 0) {
+               usb_autopm_put_interface(port->serial->interface);
                module_put(port->serial->type->driver.owner);
+       }
 
        mutex_unlock(&port->mutex);
        usb_serial_put(port->serial);
@@ -1255,6 +1262,7 @@ static void fixup_generic(struct usb_serial_driver 
*device)
        set_to_generic_if_null(device, read_bulk_callback);
        set_to_generic_if_null(device, write_bulk_callback);
        set_to_generic_if_null(device, shutdown);
+       set_to_generic_if_null(device, resume);
 }
 
 int usb_serial_register(struct usb_serial_driver *driver) /* must be called 
with BKL held */
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to