]> git.ipfire.org Git - people/teissler/ipfire-2.x.git/blobdiff - src/patches/suse-2.6.27.25/patches.drivers/usb-serial-add-qualcomm-wireless-modem-driver.patch
Revert "Move xen patchset to new version's subdir."
[people/teissler/ipfire-2.x.git] / src / patches / suse-2.6.27.25 / patches.drivers / usb-serial-add-qualcomm-wireless-modem-driver.patch
diff --git a/src/patches/suse-2.6.27.25/patches.drivers/usb-serial-add-qualcomm-wireless-modem-driver.patch b/src/patches/suse-2.6.27.25/patches.drivers/usb-serial-add-qualcomm-wireless-modem-driver.patch
new file mode 100644 (file)
index 0000000..9417c43
--- /dev/null
@@ -0,0 +1,202 @@
+From foo@baz Tue Feb 17 22:39:56 PST 2009
+Date: Tue, 17 Feb 2009 22:39:56 -0800
+To: Greg KH <greg@kroah.com>
+From: Greg Kroah-Hartman <gregkh@suse.de>
+Subject: USB: serial: add qualcomm wireless modem driver
+
+Driver originally written by Qualcomm, but rewritten by me due to the
+totally different coding style.  Cleaned up the probe logic to make a
+bit more sense, this is one wierd device.  They could have prevented all
+of this by just writing sane firmware for the modem.
+
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/usb/serial/Kconfig    |    9 ++
+ drivers/usb/serial/Makefile   |    1 
+ drivers/usb/serial/qcserial.c |  152 ++++++++++++++++++++++++++++++++++++++++++
+ 3 files changed, 162 insertions(+)
+
+--- a/drivers/usb/serial/Kconfig
++++ b/drivers/usb/serial/Kconfig
+@@ -472,6 +472,15 @@ config USB_SERIAL_OTI6858
+         To compile this driver as a module, choose M here: the
+         module will be called oti6858.
++config USB_SERIAL_QUALCOMM
++      tristate "USB Qualcomm Serial modem"
++      help
++        Say Y here if you have a Qualcomm USB modem device.  These are
++        usually wireless cellular modems.
++
++        To compile this driver as a module, choose M here: the
++        module will be called qcserial.
++
+ config USB_SERIAL_SPCP8X5
+       tristate "USB SPCP8x5 USB To Serial Driver"
+       help
+--- a/drivers/usb/serial/Makefile
++++ b/drivers/usb/serial/Makefile
+@@ -44,6 +44,7 @@ obj-$(CONFIG_USB_SERIAL_OMNINET)             += omn
+ obj-$(CONFIG_USB_SERIAL_OPTION)                       += option.o
+ obj-$(CONFIG_USB_SERIAL_OTI6858)              += oti6858.o
+ obj-$(CONFIG_USB_SERIAL_PL2303)                       += pl2303.o
++obj-$(CONFIG_USB_SERIAL_QUALCOMM)             += qcserial.o
+ obj-$(CONFIG_USB_SERIAL_SAFE)                 += safe_serial.o
+ obj-$(CONFIG_USB_SERIAL_SIERRAWIRELESS)               += sierra.o
+ obj-$(CONFIG_USB_SERIAL_SPCP8X5)              += spcp8x5.o
+--- /dev/null
++++ b/drivers/usb/serial/qcserial.c
+@@ -0,0 +1,152 @@
++/*
++ * Qualcomm Serial USB driver
++ *
++ *    Copyright (c) 2008 QUALCOMM Incorporated.
++ *    Copyright (c) 2009 Greg Kroah-Hartman <gregkh@suse.de>
++ *    Copyright (c) 2009 Novell Inc.
++ *
++ *    This program is free software; you can redistribute it and/or
++ *    modify it under the terms of the GNU General Public License version
++ *    2 as published by the Free Software Foundation.
++ *
++ */
++
++#include <linux/tty.h>
++#include <linux/tty_flip.h>
++#include <linux/usb.h>
++#include <linux/usb/serial.h>
++
++#define DRIVER_VERSION "v0.4"
++#define DRIVER_AUTHOR "Qualcomm Inc"
++#define DRIVER_DESC "Qualcomm USB Serial driver"
++
++#define NUM_BULK_EPS  1
++#define MAX_BULK_EPS  6
++
++static int debug;
++
++static struct usb_device_id id_table[] = {
++      {USB_DEVICE(0x05c6, 0x9211)},   /* Acer Gobi QDL device */
++      {USB_DEVICE(0x05c6, 0x9212)},   /* Acer Gobi Modem Device */
++      { }                             /* Terminating entry */
++};
++MODULE_DEVICE_TABLE(usb, id_table);
++
++static struct usb_driver qcdriver = {
++      .name                   = "qcserial",
++      .probe                  = usb_serial_probe,
++      .disconnect             = usb_serial_disconnect,
++      .id_table               = id_table,
++      .suspend                = usb_serial_suspend,
++      .resume                 = usb_serial_resume,
++      .supports_autosuspend   = true,
++};
++
++static int qcprobe(struct usb_serial *serial, const struct usb_device_id *id)
++{
++      int retval = -ENODEV;
++      __u8 nintf;
++      __u8 ifnum;
++
++      dbg("%s", __func__);
++
++      nintf = serial->dev->actconfig->desc.bNumInterfaces;
++      dbg("Num Interfaces = %d", nintf);
++      ifnum = serial->interface->cur_altsetting->desc.bInterfaceNumber;
++      dbg("This Interface = %d", ifnum);
++
++      switch (nintf) {
++      case 1:
++              /* QDL mode */
++              if (serial->interface->num_altsetting == 2) {
++                      struct usb_host_interface *intf;
++
++                      intf = &serial->interface->altsetting[1];
++                      if (intf->desc.bNumEndpoints == 2) {
++                              if (usb_endpoint_is_bulk_in(&intf->endpoint[0].desc) &&
++                                  usb_endpoint_is_bulk_out(&intf->endpoint[1].desc)) {
++                                      dbg("QDL port found");
++                                      retval = usb_set_interface(serial->dev, ifnum, 1);
++                                      if (retval < 0) {
++                                              dev_err(&serial->dev->dev,
++                                                      "Could not set interface, error %d\n",
++                                                      retval);
++                                              retval = -ENODEV;
++                                      }
++                                      return retval;
++                              }
++                      }
++              }
++              break;
++
++      case 4:
++              /* Composite mode */
++              if (ifnum == 2) {
++                      dbg("Modem port found");
++                      retval = usb_set_interface(serial->dev, ifnum, 0);
++                      if (retval < 0) {
++                              dev_err(&serial->dev->dev,
++                                      "Could not set interface, error %d\n",
++                                      retval);
++                              retval = -ENODEV;
++                      }
++                      return retval;
++              }
++              break;
++
++      default:
++              dev_err(&serial->dev->dev,
++                      "unknown number of interfaces: %d\n", nintf);
++              return -ENODEV;
++      }
++
++      return retval;
++}
++
++static struct usb_serial_driver qcdevice = {
++      .driver = {
++              .owner     = THIS_MODULE,
++              .name      = "qcserial",
++      },
++      .description         = "Qualcomm USB modem",
++      .id_table            = id_table,
++      .usb_driver          = &qcdriver,
++      .num_ports           = 1,
++      .probe               = qcprobe,
++};
++
++static int __init qcinit(void)
++{
++      int retval;
++
++      retval = usb_serial_register(&qcdevice);
++      if (retval)
++              return retval;
++
++      retval = usb_register(&qcdriver);
++      if (retval) {
++              usb_serial_deregister(&qcdevice);
++              return retval;
++      }
++
++      printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_VERSION "\n");
++
++      return 0;
++}
++
++static void __exit qcexit(void)
++{
++      usb_deregister(&qcdriver);
++      usb_serial_deregister(&qcdevice);
++}
++
++module_init(qcinit);
++module_exit(qcexit);
++
++MODULE_AUTHOR(DRIVER_AUTHOR);
++MODULE_DESCRIPTION(DRIVER_DESC);
++MODULE_LICENSE("GPL v2");
++MODULE_VERSION(DRIVER_VERSION);
++
++module_param(debug, bool, S_IRUGO | S_IWUSR);
++MODULE_PARM_DESC(debug, "Debug enabled or not");