USB: option.c: correct DTR behaviour
authorChris Collins <chris@ursys.com.au>
Thu, 10 Apr 2008 08:15:53 +0000 (10:15 +0200)
committerGreg Kroah-Hartman <gregkh@suse.de>
Fri, 25 Apr 2008 04:16:51 +0000 (21:16 -0700)
Setting DTR et al. should work for all interfaces
if you actually pass the interface number. :-P

This should help with devices that have important pseudo-serial ports
that aren't on the first interface in the device.

Signed-off-by: Chris Collins <chris@ursys.com.au>
Signed-off-by: Matthias Urlichs <matthias@urlichs.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/usb/serial/option.c

index 0e7eeb2820e2ceec558759102ad72b10ff4c0f95..130aa96746f0f6ebc0e3d4b04b1bc287c50f4d7c 100644 (file)
@@ -28,7 +28,7 @@
   device features.
 */
 
-#define DRIVER_VERSION "v0.7.1"
+#define DRIVER_VERSION "v0.7.2"
 #define DRIVER_AUTHOR "Matthias Urlichs <smurf@smurf.noris.de>"
 #define DRIVER_DESC "USB Driver for GSM modems"
 
@@ -824,16 +824,19 @@ static void option_setup_urbs(struct usb_serial *serial)
        }
 }
 
+
+/** send RTS/DTR state to the port.
+ *
+ * This is exactly the same as SET_CONTROL_LINE_STATE from the PSTN
+ * CDC.
+*/
 static int option_send_setup(struct usb_serial_port *port)
 {
        struct usb_serial *serial = port->serial;
        struct option_port_private *portdata;
-
+       int ifNum = serial->interface->cur_altsetting->desc.bInterfaceNumber;
        dbg("%s", __FUNCTION__);
 
-       if (port->number != 0)
-               return 0;
-
        portdata = usb_get_serial_port_data(port);
 
        if (port->tty) {
@@ -845,7 +848,7 @@ static int option_send_setup(struct usb_serial_port *port)
 
                return usb_control_msg(serial->dev,
                                usb_rcvctrlpipe(serial->dev, 0),
-                               0x22,0x21,val,0,NULL,0,USB_CTRL_SET_TIMEOUT);
+                               0x22,0x21,val,ifNum,NULL,0,USB_CTRL_SET_TIMEOUT);
        }
 
        return 0;