diff options
Diffstat (limited to 'drivers/usb/serial')
-rw-r--r-- | drivers/usb/serial/console.c | 16 | ||||
-rw-r--r-- | drivers/usb/serial/cp210x.c | 4 | ||||
-rw-r--r-- | drivers/usb/serial/generic.c | 4 | ||||
-rw-r--r-- | drivers/usb/serial/keyspan.c | 20 | ||||
-rw-r--r-- | drivers/usb/serial/option.c | 11 | ||||
-rw-r--r-- | drivers/usb/serial/qcserial.c | 1 |
6 files changed, 41 insertions, 15 deletions
diff --git a/drivers/usb/serial/console.c b/drivers/usb/serial/console.c index 8d7fc48b1f30..29fa1c3d0089 100644 --- a/drivers/usb/serial/console.c +++ b/drivers/usb/serial/console.c | |||
@@ -46,6 +46,8 @@ static struct console usbcons; | |||
46 | * ------------------------------------------------------------ | 46 | * ------------------------------------------------------------ |
47 | */ | 47 | */ |
48 | 48 | ||
49 | static const struct tty_operations usb_console_fake_tty_ops = { | ||
50 | }; | ||
49 | 51 | ||
50 | /* | 52 | /* |
51 | * The parsing of the command line works exactly like the | 53 | * The parsing of the command line works exactly like the |
@@ -137,13 +139,17 @@ static int usb_console_setup(struct console *co, char *options) | |||
137 | goto reset_open_count; | 139 | goto reset_open_count; |
138 | } | 140 | } |
139 | kref_init(&tty->kref); | 141 | kref_init(&tty->kref); |
140 | tty_port_tty_set(&port->port, tty); | ||
141 | tty->driver = usb_serial_tty_driver; | 142 | tty->driver = usb_serial_tty_driver; |
142 | tty->index = co->index; | 143 | tty->index = co->index; |
144 | init_ldsem(&tty->ldisc_sem); | ||
145 | INIT_LIST_HEAD(&tty->tty_files); | ||
146 | kref_get(&tty->driver->kref); | ||
147 | tty->ops = &usb_console_fake_tty_ops; | ||
143 | if (tty_init_termios(tty)) { | 148 | if (tty_init_termios(tty)) { |
144 | retval = -ENOMEM; | 149 | retval = -ENOMEM; |
145 | goto free_tty; | 150 | goto put_tty; |
146 | } | 151 | } |
152 | tty_port_tty_set(&port->port, tty); | ||
147 | } | 153 | } |
148 | 154 | ||
149 | /* only call the device specific open if this | 155 | /* only call the device specific open if this |
@@ -161,7 +167,7 @@ static int usb_console_setup(struct console *co, char *options) | |||
161 | serial->type->set_termios(tty, port, &dummy); | 167 | serial->type->set_termios(tty, port, &dummy); |
162 | 168 | ||
163 | tty_port_tty_set(&port->port, NULL); | 169 | tty_port_tty_set(&port->port, NULL); |
164 | kfree(tty); | 170 | tty_kref_put(tty); |
165 | } | 171 | } |
166 | set_bit(ASYNCB_INITIALIZED, &port->port.flags); | 172 | set_bit(ASYNCB_INITIALIZED, &port->port.flags); |
167 | } | 173 | } |
@@ -177,8 +183,8 @@ static int usb_console_setup(struct console *co, char *options) | |||
177 | 183 | ||
178 | fail: | 184 | fail: |
179 | tty_port_tty_set(&port->port, NULL); | 185 | tty_port_tty_set(&port->port, NULL); |
180 | free_tty: | 186 | put_tty: |
181 | kfree(tty); | 187 | tty_kref_put(tty); |
182 | reset_open_count: | 188 | reset_open_count: |
183 | port->port.count = 0; | 189 | port->port.count = 0; |
184 | usb_autopm_put_interface(serial->interface); | 190 | usb_autopm_put_interface(serial->interface); |
diff --git a/drivers/usb/serial/cp210x.c b/drivers/usb/serial/cp210x.c index 6c4eb3cf5efd..f4c56fc1a9f6 100644 --- a/drivers/usb/serial/cp210x.c +++ b/drivers/usb/serial/cp210x.c | |||
@@ -120,10 +120,12 @@ static const struct usb_device_id id_table[] = { | |||
120 | { USB_DEVICE(0x10C4, 0x85F8) }, /* Virtenio Preon32 */ | 120 | { USB_DEVICE(0x10C4, 0x85F8) }, /* Virtenio Preon32 */ |
121 | { USB_DEVICE(0x10C4, 0x8664) }, /* AC-Services CAN-IF */ | 121 | { USB_DEVICE(0x10C4, 0x8664) }, /* AC-Services CAN-IF */ |
122 | { USB_DEVICE(0x10C4, 0x8665) }, /* AC-Services OBD-IF */ | 122 | { USB_DEVICE(0x10C4, 0x8665) }, /* AC-Services OBD-IF */ |
123 | { USB_DEVICE(0x10C4, 0x8875) }, /* CEL MeshConnect USB Stick */ | 123 | { USB_DEVICE(0x10C4, 0x8856) }, /* CEL EM357 ZigBee USB Stick - LR */ |
124 | { USB_DEVICE(0x10C4, 0x8857) }, /* CEL EM357 ZigBee USB Stick */ | ||
124 | { USB_DEVICE(0x10C4, 0x88A4) }, /* MMB Networks ZigBee USB Device */ | 125 | { USB_DEVICE(0x10C4, 0x88A4) }, /* MMB Networks ZigBee USB Device */ |
125 | { USB_DEVICE(0x10C4, 0x88A5) }, /* Planet Innovation Ingeni ZigBee USB Device */ | 126 | { USB_DEVICE(0x10C4, 0x88A5) }, /* Planet Innovation Ingeni ZigBee USB Device */ |
126 | { USB_DEVICE(0x10C4, 0x8946) }, /* Ketra N1 Wireless Interface */ | 127 | { USB_DEVICE(0x10C4, 0x8946) }, /* Ketra N1 Wireless Interface */ |
128 | { USB_DEVICE(0x10C4, 0x8977) }, /* CEL MeshWorks DevKit Device */ | ||
127 | { USB_DEVICE(0x10C4, 0xEA60) }, /* Silicon Labs factory default */ | 129 | { USB_DEVICE(0x10C4, 0xEA60) }, /* Silicon Labs factory default */ |
128 | { USB_DEVICE(0x10C4, 0xEA61) }, /* Silicon Labs factory default */ | 130 | { USB_DEVICE(0x10C4, 0xEA61) }, /* Silicon Labs factory default */ |
129 | { USB_DEVICE(0x10C4, 0xEA70) }, /* Silicon Labs factory default */ | 131 | { USB_DEVICE(0x10C4, 0xEA70) }, /* Silicon Labs factory default */ |
diff --git a/drivers/usb/serial/generic.c b/drivers/usb/serial/generic.c index 1bd192290b08..ccf1df7c4b80 100644 --- a/drivers/usb/serial/generic.c +++ b/drivers/usb/serial/generic.c | |||
@@ -286,7 +286,7 @@ static int usb_serial_generic_submit_read_urb(struct usb_serial_port *port, | |||
286 | 286 | ||
287 | res = usb_submit_urb(port->read_urbs[index], mem_flags); | 287 | res = usb_submit_urb(port->read_urbs[index], mem_flags); |
288 | if (res) { | 288 | if (res) { |
289 | if (res != -EPERM) { | 289 | if (res != -EPERM && res != -ENODEV) { |
290 | dev_err(&port->dev, | 290 | dev_err(&port->dev, |
291 | "%s - usb_submit_urb failed: %d\n", | 291 | "%s - usb_submit_urb failed: %d\n", |
292 | __func__, res); | 292 | __func__, res); |
@@ -373,7 +373,7 @@ void usb_serial_generic_read_bulk_callback(struct urb *urb) | |||
373 | __func__, urb->status); | 373 | __func__, urb->status); |
374 | return; | 374 | return; |
375 | default: | 375 | default: |
376 | dev_err(&port->dev, "%s - nonzero urb status: %d\n", | 376 | dev_dbg(&port->dev, "%s - nonzero urb status: %d\n", |
377 | __func__, urb->status); | 377 | __func__, urb->status); |
378 | goto resubmit; | 378 | goto resubmit; |
379 | } | 379 | } |
diff --git a/drivers/usb/serial/keyspan.c b/drivers/usb/serial/keyspan.c index 077c714f1285..e07b15ed5814 100644 --- a/drivers/usb/serial/keyspan.c +++ b/drivers/usb/serial/keyspan.c | |||
@@ -410,6 +410,8 @@ static void usa26_instat_callback(struct urb *urb) | |||
410 | } | 410 | } |
411 | port = serial->port[msg->port]; | 411 | port = serial->port[msg->port]; |
412 | p_priv = usb_get_serial_port_data(port); | 412 | p_priv = usb_get_serial_port_data(port); |
413 | if (!p_priv) | ||
414 | goto resubmit; | ||
413 | 415 | ||
414 | /* Update handshaking pin state information */ | 416 | /* Update handshaking pin state information */ |
415 | old_dcd_state = p_priv->dcd_state; | 417 | old_dcd_state = p_priv->dcd_state; |
@@ -420,7 +422,7 @@ static void usa26_instat_callback(struct urb *urb) | |||
420 | 422 | ||
421 | if (old_dcd_state != p_priv->dcd_state) | 423 | if (old_dcd_state != p_priv->dcd_state) |
422 | tty_port_tty_hangup(&port->port, true); | 424 | tty_port_tty_hangup(&port->port, true); |
423 | 425 | resubmit: | |
424 | /* Resubmit urb so we continue receiving */ | 426 | /* Resubmit urb so we continue receiving */ |
425 | err = usb_submit_urb(urb, GFP_ATOMIC); | 427 | err = usb_submit_urb(urb, GFP_ATOMIC); |
426 | if (err != 0) | 428 | if (err != 0) |
@@ -527,6 +529,8 @@ static void usa28_instat_callback(struct urb *urb) | |||
527 | } | 529 | } |
528 | port = serial->port[msg->port]; | 530 | port = serial->port[msg->port]; |
529 | p_priv = usb_get_serial_port_data(port); | 531 | p_priv = usb_get_serial_port_data(port); |
532 | if (!p_priv) | ||
533 | goto resubmit; | ||
530 | 534 | ||
531 | /* Update handshaking pin state information */ | 535 | /* Update handshaking pin state information */ |
532 | old_dcd_state = p_priv->dcd_state; | 536 | old_dcd_state = p_priv->dcd_state; |
@@ -537,7 +541,7 @@ static void usa28_instat_callback(struct urb *urb) | |||
537 | 541 | ||
538 | if (old_dcd_state != p_priv->dcd_state && old_dcd_state) | 542 | if (old_dcd_state != p_priv->dcd_state && old_dcd_state) |
539 | tty_port_tty_hangup(&port->port, true); | 543 | tty_port_tty_hangup(&port->port, true); |
540 | 544 | resubmit: | |
541 | /* Resubmit urb so we continue receiving */ | 545 | /* Resubmit urb so we continue receiving */ |
542 | err = usb_submit_urb(urb, GFP_ATOMIC); | 546 | err = usb_submit_urb(urb, GFP_ATOMIC); |
543 | if (err != 0) | 547 | if (err != 0) |
@@ -607,6 +611,8 @@ static void usa49_instat_callback(struct urb *urb) | |||
607 | } | 611 | } |
608 | port = serial->port[msg->portNumber]; | 612 | port = serial->port[msg->portNumber]; |
609 | p_priv = usb_get_serial_port_data(port); | 613 | p_priv = usb_get_serial_port_data(port); |
614 | if (!p_priv) | ||
615 | goto resubmit; | ||
610 | 616 | ||
611 | /* Update handshaking pin state information */ | 617 | /* Update handshaking pin state information */ |
612 | old_dcd_state = p_priv->dcd_state; | 618 | old_dcd_state = p_priv->dcd_state; |
@@ -617,7 +623,7 @@ static void usa49_instat_callback(struct urb *urb) | |||
617 | 623 | ||
618 | if (old_dcd_state != p_priv->dcd_state && old_dcd_state) | 624 | if (old_dcd_state != p_priv->dcd_state && old_dcd_state) |
619 | tty_port_tty_hangup(&port->port, true); | 625 | tty_port_tty_hangup(&port->port, true); |
620 | 626 | resubmit: | |
621 | /* Resubmit urb so we continue receiving */ | 627 | /* Resubmit urb so we continue receiving */ |
622 | err = usb_submit_urb(urb, GFP_ATOMIC); | 628 | err = usb_submit_urb(urb, GFP_ATOMIC); |
623 | if (err != 0) | 629 | if (err != 0) |
@@ -855,6 +861,8 @@ static void usa90_instat_callback(struct urb *urb) | |||
855 | 861 | ||
856 | port = serial->port[0]; | 862 | port = serial->port[0]; |
857 | p_priv = usb_get_serial_port_data(port); | 863 | p_priv = usb_get_serial_port_data(port); |
864 | if (!p_priv) | ||
865 | goto resubmit; | ||
858 | 866 | ||
859 | /* Update handshaking pin state information */ | 867 | /* Update handshaking pin state information */ |
860 | old_dcd_state = p_priv->dcd_state; | 868 | old_dcd_state = p_priv->dcd_state; |
@@ -865,7 +873,7 @@ static void usa90_instat_callback(struct urb *urb) | |||
865 | 873 | ||
866 | if (old_dcd_state != p_priv->dcd_state && old_dcd_state) | 874 | if (old_dcd_state != p_priv->dcd_state && old_dcd_state) |
867 | tty_port_tty_hangup(&port->port, true); | 875 | tty_port_tty_hangup(&port->port, true); |
868 | 876 | resubmit: | |
869 | /* Resubmit urb so we continue receiving */ | 877 | /* Resubmit urb so we continue receiving */ |
870 | err = usb_submit_urb(urb, GFP_ATOMIC); | 878 | err = usb_submit_urb(urb, GFP_ATOMIC); |
871 | if (err != 0) | 879 | if (err != 0) |
@@ -926,6 +934,8 @@ static void usa67_instat_callback(struct urb *urb) | |||
926 | 934 | ||
927 | port = serial->port[msg->port]; | 935 | port = serial->port[msg->port]; |
928 | p_priv = usb_get_serial_port_data(port); | 936 | p_priv = usb_get_serial_port_data(port); |
937 | if (!p_priv) | ||
938 | goto resubmit; | ||
929 | 939 | ||
930 | /* Update handshaking pin state information */ | 940 | /* Update handshaking pin state information */ |
931 | old_dcd_state = p_priv->dcd_state; | 941 | old_dcd_state = p_priv->dcd_state; |
@@ -934,7 +944,7 @@ static void usa67_instat_callback(struct urb *urb) | |||
934 | 944 | ||
935 | if (old_dcd_state != p_priv->dcd_state && old_dcd_state) | 945 | if (old_dcd_state != p_priv->dcd_state && old_dcd_state) |
936 | tty_port_tty_hangup(&port->port, true); | 946 | tty_port_tty_hangup(&port->port, true); |
937 | 947 | resubmit: | |
938 | /* Resubmit urb so we continue receiving */ | 948 | /* Resubmit urb so we continue receiving */ |
939 | err = usb_submit_urb(urb, GFP_ATOMIC); | 949 | err = usb_submit_urb(urb, GFP_ATOMIC); |
940 | if (err != 0) | 950 | if (err != 0) |
diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c index 7a4c21b4f676..efdcee15b520 100644 --- a/drivers/usb/serial/option.c +++ b/drivers/usb/serial/option.c | |||
@@ -234,6 +234,8 @@ static void option_instat_callback(struct urb *urb); | |||
234 | 234 | ||
235 | #define QUALCOMM_VENDOR_ID 0x05C6 | 235 | #define QUALCOMM_VENDOR_ID 0x05C6 |
236 | 236 | ||
237 | #define SIERRA_VENDOR_ID 0x1199 | ||
238 | |||
237 | #define CMOTECH_VENDOR_ID 0x16d8 | 239 | #define CMOTECH_VENDOR_ID 0x16d8 |
238 | #define CMOTECH_PRODUCT_6001 0x6001 | 240 | #define CMOTECH_PRODUCT_6001 0x6001 |
239 | #define CMOTECH_PRODUCT_CMU_300 0x6002 | 241 | #define CMOTECH_PRODUCT_CMU_300 0x6002 |
@@ -512,7 +514,7 @@ enum option_blacklist_reason { | |||
512 | OPTION_BLACKLIST_RESERVED_IF = 2 | 514 | OPTION_BLACKLIST_RESERVED_IF = 2 |
513 | }; | 515 | }; |
514 | 516 | ||
515 | #define MAX_BL_NUM 8 | 517 | #define MAX_BL_NUM 11 |
516 | struct option_blacklist_info { | 518 | struct option_blacklist_info { |
517 | /* bitfield of interface numbers for OPTION_BLACKLIST_SENDSETUP */ | 519 | /* bitfield of interface numbers for OPTION_BLACKLIST_SENDSETUP */ |
518 | const unsigned long sendsetup; | 520 | const unsigned long sendsetup; |
@@ -601,6 +603,11 @@ static const struct option_blacklist_info telit_le920_blacklist = { | |||
601 | .reserved = BIT(1) | BIT(5), | 603 | .reserved = BIT(1) | BIT(5), |
602 | }; | 604 | }; |
603 | 605 | ||
606 | static const struct option_blacklist_info sierra_mc73xx_blacklist = { | ||
607 | .sendsetup = BIT(0) | BIT(2), | ||
608 | .reserved = BIT(8) | BIT(10) | BIT(11), | ||
609 | }; | ||
610 | |||
604 | static const struct usb_device_id option_ids[] = { | 611 | static const struct usb_device_id option_ids[] = { |
605 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COLT) }, | 612 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COLT) }, |
606 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA) }, | 613 | { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA) }, |
@@ -1098,6 +1105,8 @@ static const struct usb_device_id option_ids[] = { | |||
1098 | { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x6613)}, /* Onda H600/ZTE MF330 */ | 1105 | { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x6613)}, /* Onda H600/ZTE MF330 */ |
1099 | { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x0023)}, /* ONYX 3G device */ | 1106 | { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x0023)}, /* ONYX 3G device */ |
1100 | { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x9000)}, /* SIMCom SIM5218 */ | 1107 | { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x9000)}, /* SIMCom SIM5218 */ |
1108 | { USB_DEVICE_INTERFACE_CLASS(SIERRA_VENDOR_ID, 0x68c0, 0xff), | ||
1109 | .driver_info = (kernel_ulong_t)&sierra_mc73xx_blacklist }, /* MC73xx */ | ||
1101 | { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6001) }, | 1110 | { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6001) }, |
1102 | { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_CMU_300) }, | 1111 | { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_CMU_300) }, |
1103 | { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6003), | 1112 | { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6003), |
diff --git a/drivers/usb/serial/qcserial.c b/drivers/usb/serial/qcserial.c index cb3e14780a7e..9c63897b3a56 100644 --- a/drivers/usb/serial/qcserial.c +++ b/drivers/usb/serial/qcserial.c | |||
@@ -142,7 +142,6 @@ static const struct usb_device_id id_table[] = { | |||
142 | {DEVICE_SWI(0x0f3d, 0x68a2)}, /* Sierra Wireless MC7700 */ | 142 | {DEVICE_SWI(0x0f3d, 0x68a2)}, /* Sierra Wireless MC7700 */ |
143 | {DEVICE_SWI(0x114f, 0x68a2)}, /* Sierra Wireless MC7750 */ | 143 | {DEVICE_SWI(0x114f, 0x68a2)}, /* Sierra Wireless MC7750 */ |
144 | {DEVICE_SWI(0x1199, 0x68a2)}, /* Sierra Wireless MC7710 */ | 144 | {DEVICE_SWI(0x1199, 0x68a2)}, /* Sierra Wireless MC7710 */ |
145 | {DEVICE_SWI(0x1199, 0x68c0)}, /* Sierra Wireless MC73xx */ | ||
146 | {DEVICE_SWI(0x1199, 0x901c)}, /* Sierra Wireless EM7700 */ | 145 | {DEVICE_SWI(0x1199, 0x901c)}, /* Sierra Wireless EM7700 */ |
147 | {DEVICE_SWI(0x1199, 0x901f)}, /* Sierra Wireless EM7355 */ | 146 | {DEVICE_SWI(0x1199, 0x901f)}, /* Sierra Wireless EM7355 */ |
148 | {DEVICE_SWI(0x1199, 0x9040)}, /* Sierra Wireless Modem */ | 147 | {DEVICE_SWI(0x1199, 0x9040)}, /* Sierra Wireless Modem */ |