aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb
diff options
context:
space:
mode:
authorElina Pasheva <epasheva@sierrawireless.com>2009-04-21 20:54:42 -0400
committerGreg Kroah-Hartman <gregkh@suse.de>2009-04-23 17:15:29 -0400
commit212b8f0c3f5a2280bfa1d6ab13a6fe98552becaa (patch)
tree08875427c9515dc0b22d515a94f1010c724eab71 /drivers/usb
parent864e28b4f24106b799e991fa136fa6fa2b638a68 (diff)
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: Elina Pasheva <epasheva@sierrawireless.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/usb')
-rw-r--r--drivers/usb/serial/sierra.c21
1 files changed, 17 insertions, 4 deletions
diff --git a/drivers/usb/serial/sierra.c b/drivers/usb/serial/sierra.c
index d9bf9a5c20ec..7da3775a097e 100644
--- a/drivers/usb/serial/sierra.c
+++ b/drivers/usb/serial/sierra.c
@@ -14,7 +14,7 @@
14 Whom based his on the Keyspan driver by Hugh Blemings <hugh@blemings.org> 14 Whom based his on the Keyspan driver by Hugh Blemings <hugh@blemings.org>
15*/ 15*/
16 16
17#define DRIVER_VERSION "v.1.3.2" 17#define DRIVER_VERSION "v.1.3.3"
18#define DRIVER_AUTHOR "Kevin Lloyd <klloyd@sierrawireless.com>" 18#define DRIVER_AUTHOR "Kevin Lloyd <klloyd@sierrawireless.com>"
19#define DRIVER_DESC "USB Driver for Sierra Wireless USB modems" 19#define DRIVER_DESC "USB Driver for Sierra Wireless USB modems"
20 20
@@ -259,9 +259,21 @@ static int sierra_send_setup(struct tty_struct *tty,
259 val |= 0x02; 259 val |= 0x02;
260 260
261 /* If composite device then properly report interface */ 261 /* If composite device then properly report interface */
262 if (serial->num_ports == 1) 262 if (serial->num_ports == 1) {
263 interface = sierra_calc_interface(serial); 263 interface = sierra_calc_interface(serial);
264 264
265 /* Control message is sent only to interfaces with
266 * interrupt_in endpoints
267 */
268 if (port->interrupt_in_urb) {
269 /* send control message */
270 return usb_control_msg(serial->dev,
271 usb_rcvctrlpipe(serial->dev, 0),
272 0x22, 0x21, val, interface,
273 NULL, 0, USB_CTRL_SET_TIMEOUT);
274 }
275 }
276
265 /* Otherwise the need to do non-composite mapping */ 277 /* Otherwise the need to do non-composite mapping */
266 else { 278 else {
267 if (port->bulk_out_endpointAddress == 2) 279 if (port->bulk_out_endpointAddress == 2)
@@ -270,12 +282,13 @@ static int sierra_send_setup(struct tty_struct *tty,
270 interface = 1; 282 interface = 1;
271 else if (port->bulk_out_endpointAddress == 5) 283 else if (port->bulk_out_endpointAddress == 5)
272 interface = 2; 284 interface = 2;
273 }
274 285
275 return usb_control_msg(serial->dev, 286 return usb_control_msg(serial->dev,
276 usb_rcvctrlpipe(serial->dev, 0), 287 usb_rcvctrlpipe(serial->dev, 0),
277 0x22, 0x21, val, interface, 288 0x22, 0x21, val, interface,
278 NULL, 0, USB_CTRL_SET_TIMEOUT); 289 NULL, 0, USB_CTRL_SET_TIMEOUT);
290
291 }
279 } 292 }
280 293
281 return 0; 294 return 0;