Commit 212b8f0c authored by Elina Pasheva's avatar Elina Pasheva Committed by Greg Kroah-Hartman

USB: serial: sierra driver bug fix for composite interface

This patch fixes a problem in sierra_send_setup() function when
composite devices are used. One should not be sending ACM commands to
interfaces that are OBEX. Doing this causes an apparent failure as the
ACM command has to time out before the interface can start being used.
Signed-off-by: default avatarElina Pasheva <epasheva@sierrawireless.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 864e28b4
...@@ -14,7 +14,7 @@ ...@@ -14,7 +14,7 @@
Whom based his on the Keyspan driver by Hugh Blemings <hugh@blemings.org> Whom based his on the Keyspan driver by Hugh Blemings <hugh@blemings.org>
*/ */
#define DRIVER_VERSION "v.1.3.2" #define DRIVER_VERSION "v.1.3.3"
#define DRIVER_AUTHOR "Kevin Lloyd <klloyd@sierrawireless.com>" #define DRIVER_AUTHOR "Kevin Lloyd <klloyd@sierrawireless.com>"
#define DRIVER_DESC "USB Driver for Sierra Wireless USB modems" #define DRIVER_DESC "USB Driver for Sierra Wireless USB modems"
...@@ -259,9 +259,21 @@ static int sierra_send_setup(struct tty_struct *tty, ...@@ -259,9 +259,21 @@ static int sierra_send_setup(struct tty_struct *tty,
val |= 0x02; val |= 0x02;
/* If composite device then properly report interface */ /* If composite device then properly report interface */
if (serial->num_ports == 1) if (serial->num_ports == 1) {
interface = sierra_calc_interface(serial); interface = sierra_calc_interface(serial);
/* Control message is sent only to interfaces with
* interrupt_in endpoints
*/
if (port->interrupt_in_urb) {
/* send control message */
return usb_control_msg(serial->dev,
usb_rcvctrlpipe(serial->dev, 0),
0x22, 0x21, val, interface,
NULL, 0, USB_CTRL_SET_TIMEOUT);
}
}
/* Otherwise the need to do non-composite mapping */ /* Otherwise the need to do non-composite mapping */
else { else {
if (port->bulk_out_endpointAddress == 2) if (port->bulk_out_endpointAddress == 2)
...@@ -270,12 +282,13 @@ static int sierra_send_setup(struct tty_struct *tty, ...@@ -270,12 +282,13 @@ static int sierra_send_setup(struct tty_struct *tty,
interface = 1; interface = 1;
else if (port->bulk_out_endpointAddress == 5) else if (port->bulk_out_endpointAddress == 5)
interface = 2; interface = 2;
}
return usb_control_msg(serial->dev, return usb_control_msg(serial->dev,
usb_rcvctrlpipe(serial->dev, 0), usb_rcvctrlpipe(serial->dev, 0),
0x22, 0x21, val, interface, 0x22, 0x21, val, interface,
NULL, 0, USB_CTRL_SET_TIMEOUT); NULL, 0, USB_CTRL_SET_TIMEOUT);
}
} }
return 0; return 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment