diff options
Diffstat (limited to 'drivers/usb/serial/sierra.c')
-rw-r--r-- | drivers/usb/serial/sierra.c | 60 |
1 files changed, 36 insertions, 24 deletions
diff --git a/drivers/usb/serial/sierra.c b/drivers/usb/serial/sierra.c index 3eb6143bb646..9202f94505e6 100644 --- a/drivers/usb/serial/sierra.c +++ b/drivers/usb/serial/sierra.c | |||
@@ -26,6 +26,7 @@ | |||
26 | #include <linux/jiffies.h> | 26 | #include <linux/jiffies.h> |
27 | #include <linux/errno.h> | 27 | #include <linux/errno.h> |
28 | #include <linux/tty.h> | 28 | #include <linux/tty.h> |
29 | #include <linux/slab.h> | ||
29 | #include <linux/tty_flip.h> | 30 | #include <linux/tty_flip.h> |
30 | #include <linux/module.h> | 31 | #include <linux/module.h> |
31 | #include <linux/usb.h> | 32 | #include <linux/usb.h> |
@@ -226,7 +227,7 @@ static const struct sierra_iface_info direct_ip_interface_blacklist = { | |||
226 | .ifaceinfo = direct_ip_non_serial_ifaces, | 227 | .ifaceinfo = direct_ip_non_serial_ifaces, |
227 | }; | 228 | }; |
228 | 229 | ||
229 | static struct usb_device_id id_table [] = { | 230 | static const struct usb_device_id id_table[] = { |
230 | { USB_DEVICE(0x0F3D, 0x0112) }, /* Airprime/Sierra PC 5220 */ | 231 | { USB_DEVICE(0x0F3D, 0x0112) }, /* Airprime/Sierra PC 5220 */ |
231 | { USB_DEVICE(0x03F0, 0x1B1D) }, /* HP ev2200 a.k.a MC5720 */ | 232 | { USB_DEVICE(0x03F0, 0x1B1D) }, /* HP ev2200 a.k.a MC5720 */ |
232 | { USB_DEVICE(0x03F0, 0x1E1D) }, /* HP hs2300 a.k.a MC8775 */ | 233 | { USB_DEVICE(0x03F0, 0x1E1D) }, /* HP hs2300 a.k.a MC8775 */ |
@@ -304,16 +305,6 @@ static struct usb_device_id id_table [] = { | |||
304 | }; | 305 | }; |
305 | MODULE_DEVICE_TABLE(usb, id_table); | 306 | MODULE_DEVICE_TABLE(usb, id_table); |
306 | 307 | ||
307 | static struct usb_driver sierra_driver = { | ||
308 | .name = "sierra", | ||
309 | .probe = usb_serial_probe, | ||
310 | .disconnect = usb_serial_disconnect, | ||
311 | .suspend = usb_serial_suspend, | ||
312 | .resume = usb_serial_resume, | ||
313 | .id_table = id_table, | ||
314 | .no_dynamic_id = 1, | ||
315 | .supports_autosuspend = 1, | ||
316 | }; | ||
317 | 308 | ||
318 | struct sierra_port_private { | 309 | struct sierra_port_private { |
319 | spinlock_t lock; /* lock the structure */ | 310 | spinlock_t lock; /* lock the structure */ |
@@ -477,7 +468,7 @@ static void sierra_outdat_callback(struct urb *urb) | |||
477 | static int sierra_write(struct tty_struct *tty, struct usb_serial_port *port, | 468 | static int sierra_write(struct tty_struct *tty, struct usb_serial_port *port, |
478 | const unsigned char *buf, int count) | 469 | const unsigned char *buf, int count) |
479 | { | 470 | { |
480 | struct sierra_port_private *portdata = usb_get_serial_port_data(port); | 471 | struct sierra_port_private *portdata; |
481 | struct sierra_intf_private *intfdata; | 472 | struct sierra_intf_private *intfdata; |
482 | struct usb_serial *serial = port->serial; | 473 | struct usb_serial *serial = port->serial; |
483 | unsigned long flags; | 474 | unsigned long flags; |
@@ -604,14 +595,15 @@ static void sierra_indat_callback(struct urb *urb) | |||
604 | } else { | 595 | } else { |
605 | if (urb->actual_length) { | 596 | if (urb->actual_length) { |
606 | tty = tty_port_tty_get(&port->port); | 597 | tty = tty_port_tty_get(&port->port); |
607 | 598 | if (tty) { | |
608 | tty_buffer_request_room(tty, urb->actual_length); | 599 | tty_insert_flip_string(tty, data, |
609 | tty_insert_flip_string(tty, data, urb->actual_length); | 600 | urb->actual_length); |
610 | tty_flip_buffer_push(tty); | 601 | tty_flip_buffer_push(tty); |
611 | 602 | ||
612 | tty_kref_put(tty); | 603 | tty_kref_put(tty); |
613 | usb_serial_debug_data(debug, &port->dev, __func__, | 604 | usb_serial_debug_data(debug, &port->dev, |
614 | urb->actual_length, data); | 605 | __func__, urb->actual_length, data); |
606 | } | ||
615 | } else { | 607 | } else { |
616 | dev_dbg(&port->dev, "%s: empty read urb" | 608 | dev_dbg(&port->dev, "%s: empty read urb" |
617 | " received\n", __func__); | 609 | " received\n", __func__); |
@@ -619,10 +611,10 @@ static void sierra_indat_callback(struct urb *urb) | |||
619 | } | 611 | } |
620 | 612 | ||
621 | /* Resubmit urb so we continue receiving */ | 613 | /* Resubmit urb so we continue receiving */ |
622 | if (port->port.count && status != -ESHUTDOWN && status != -EPERM) { | 614 | if (status != -ESHUTDOWN && status != -EPERM) { |
623 | usb_mark_last_busy(port->serial->dev); | 615 | usb_mark_last_busy(port->serial->dev); |
624 | err = usb_submit_urb(urb, GFP_ATOMIC); | 616 | err = usb_submit_urb(urb, GFP_ATOMIC); |
625 | if (err) | 617 | if (err && err != -EPERM) |
626 | dev_err(&port->dev, "resubmit read urb failed." | 618 | dev_err(&port->dev, "resubmit read urb failed." |
627 | "(%d)\n", err); | 619 | "(%d)\n", err); |
628 | } | 620 | } |
@@ -681,11 +673,11 @@ static void sierra_instat_callback(struct urb *urb) | |||
681 | dev_dbg(&port->dev, "%s: error %d\n", __func__, status); | 673 | dev_dbg(&port->dev, "%s: error %d\n", __func__, status); |
682 | 674 | ||
683 | /* Resubmit urb so we continue receiving IRQ data */ | 675 | /* Resubmit urb so we continue receiving IRQ data */ |
684 | if (port->port.count && status != -ESHUTDOWN && status != -ENOENT) { | 676 | if (status != -ESHUTDOWN && status != -ENOENT) { |
685 | usb_mark_last_busy(serial->dev); | 677 | usb_mark_last_busy(serial->dev); |
686 | urb->dev = serial->dev; | 678 | urb->dev = serial->dev; |
687 | err = usb_submit_urb(urb, GFP_ATOMIC); | 679 | err = usb_submit_urb(urb, GFP_ATOMIC); |
688 | if (err) | 680 | if (err && err != -EPERM) |
689 | dev_err(&port->dev, "%s: resubmit intr urb " | 681 | dev_err(&port->dev, "%s: resubmit intr urb " |
690 | "failed. (%d)\n", __func__, err); | 682 | "failed. (%d)\n", __func__, err); |
691 | } | 683 | } |
@@ -1061,11 +1053,31 @@ static int sierra_resume(struct usb_serial *serial) | |||
1061 | 1053 | ||
1062 | return ec ? -EIO : 0; | 1054 | return ec ? -EIO : 0; |
1063 | } | 1055 | } |
1056 | |||
1057 | static int sierra_reset_resume(struct usb_interface *intf) | ||
1058 | { | ||
1059 | struct usb_serial *serial = usb_get_intfdata(intf); | ||
1060 | dev_err(&serial->dev->dev, "%s\n", __func__); | ||
1061 | return usb_serial_resume(intf); | ||
1062 | } | ||
1064 | #else | 1063 | #else |
1065 | #define sierra_suspend NULL | 1064 | #define sierra_suspend NULL |
1066 | #define sierra_resume NULL | 1065 | #define sierra_resume NULL |
1066 | #define sierra_reset_resume NULL | ||
1067 | #endif | 1067 | #endif |
1068 | 1068 | ||
1069 | static struct usb_driver sierra_driver = { | ||
1070 | .name = "sierra", | ||
1071 | .probe = usb_serial_probe, | ||
1072 | .disconnect = usb_serial_disconnect, | ||
1073 | .suspend = usb_serial_suspend, | ||
1074 | .resume = usb_serial_resume, | ||
1075 | .reset_resume = sierra_reset_resume, | ||
1076 | .id_table = id_table, | ||
1077 | .no_dynamic_id = 1, | ||
1078 | .supports_autosuspend = 1, | ||
1079 | }; | ||
1080 | |||
1069 | static struct usb_serial_driver sierra_device = { | 1081 | static struct usb_serial_driver sierra_device = { |
1070 | .driver = { | 1082 | .driver = { |
1071 | .owner = THIS_MODULE, | 1083 | .owner = THIS_MODULE, |