aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/serial/sierra.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/usb/serial/sierra.c')
-rw-r--r--drivers/usb/serial/sierra.c60
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
229static struct usb_device_id id_table [] = { 230static 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};
305MODULE_DEVICE_TABLE(usb, id_table); 306MODULE_DEVICE_TABLE(usb, id_table);
306 307
307static 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
318struct sierra_port_private { 309struct 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)
477static int sierra_write(struct tty_struct *tty, struct usb_serial_port *port, 468static 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
1057static 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
1069static 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
1069static struct usb_serial_driver sierra_device = { 1081static struct usb_serial_driver sierra_device = {
1070 .driver = { 1082 .driver = {
1071 .owner = THIS_MODULE, 1083 .owner = THIS_MODULE,