USB: qcserial: Use generic USB wwan code
authorMatthew Garrett <mjg@redhat.com>
Thu, 1 Apr 2010 16:31:09 +0000 (12:31 -0400)
committerGreg Kroah-Hartman <gregkh@suse.de>
Thu, 20 May 2010 20:21:37 +0000 (13:21 -0700)
Make qcserial use the generic USB wwan code. This should result in a
performance improvement.

Signed-off-by: Matthew Garrett <mjg@redhat.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/usb/serial/Kconfig
drivers/usb/serial/qcserial.c

index fdc889d..efb6dc7 100644 (file)
@@ -485,6 +485,7 @@ config USB_SERIAL_QCAUX
 
 config USB_SERIAL_QUALCOMM
        tristate "USB Qualcomm Serial modem"
+       select USB_SERIAL_WWAN
        help
          Say Y here if you have a Qualcomm USB modem device.  These are
          usually wireless cellular modems.
index 53a2d5a..9215f6c 100644 (file)
@@ -15,6 +15,8 @@
 #include <linux/tty_flip.h>
 #include <linux/usb.h>
 #include <linux/usb/serial.h>
+#include <linux/slab.h>
+#include "usb-wwan.h"
 
 #define DRIVER_AUTHOR "Qualcomm Inc"
 #define DRIVER_DESC "Qualcomm USB Serial driver"
@@ -92,6 +94,7 @@ static struct usb_driver qcdriver = {
 
 static int qcprobe(struct usb_serial *serial, const struct usb_device_id *id)
 {
+       struct usb_wwan_intf_private *data;
        int retval = -ENODEV;
        __u8 nintf;
        __u8 ifnum;
@@ -103,6 +106,13 @@ static int qcprobe(struct usb_serial *serial, const struct usb_device_id *id)
        ifnum = serial->interface->cur_altsetting->desc.bInterfaceNumber;
        dbg("This Interface = %d", ifnum);
 
+       data = serial->private = kzalloc(sizeof(struct usb_wwan_intf_private),
+                                        GFP_KERNEL);
+       if (!data)
+               return -ENOMEM;
+
+       spin_lock_init(&data->susp_lock);
+
        switch (nintf) {
        case 1:
                /* QDL mode */
@@ -161,6 +171,18 @@ static struct usb_serial_driver qcdevice = {
        .usb_driver          = &qcdriver,
        .num_ports           = 1,
        .probe               = qcprobe,
+       .open                = usb_wwan_open,
+       .close               = usb_wwan_close,
+       .write               = usb_wwan_write,
+       .write_room          = usb_wwan_write_room,
+       .chars_in_buffer     = usb_wwan_chars_in_buffer,
+       .attach              = usb_wwan_startup,
+       .disconnect          = usb_wwan_disconnect,
+       .release             = usb_wwan_release,
+#ifdef CONFIG_PM
+       .suspend             = usb_wwan_suspend,
+       .resume              = usb_wwan_resume,
+#endif
 };
 
 static int __init qcinit(void)