aboutsummaryrefslogtreecommitdiffstats
path: root/usb
diff options
authorGreg Kroah-Hartman <gregkh@suse.de>2009-05-12 17:21:30 -0700
committerGreg Kroah-Hartman <gregkh@suse.de>2009-05-12 17:21:30 -0700
commit9252aca69ce10cfcb18ef414215ad966556e726d (patch)
tree440c9e06124a7b3bf8a98553b55bdea12d1187ba /usb
parent0dd3f848f7ce8d5c881a2f57a7e29380bc6a82ad (diff)
downloadpatches-9252aca69ce10cfcb18ef414215ad966556e726d.tar.gz
sierra driver updates
Diffstat (limited to 'usb')
-rw-r--r--usb/usb-serial-sierra-driver-interrupt-urb-resubmit-fix.patch53
-rw-r--r--usb/usb-serial-sierra-driver-sierra_calc_num_ports-fix.patch104
-rw-r--r--usb/usb-serial-sierra-driver-zero-length-packet-fix.patch44
3 files changed, 201 insertions, 0 deletions
diff --git a/usb/usb-serial-sierra-driver-interrupt-urb-resubmit-fix.patch b/usb/usb-serial-sierra-driver-interrupt-urb-resubmit-fix.patch
new file mode 100644
index 00000000000000..2729814e5fd552
--- /dev/null
+++ b/usb/usb-serial-sierra-driver-interrupt-urb-resubmit-fix.patch
@@ -0,0 +1,53 @@
+From epasheva@sierrawireless.com Tue May 12 17:14:07 2009
+From: Elina Pasheva <epasheva@sierrawireless.com>
+Date: Tue, 12 May 2009 13:12:37 -0700
+Subject: USB: serial: sierra driver interrupt urb resubmit fix
+To: <gregkh@suse.de>
+Cc: <epasheva@sierrawireless.com>, <rfiler@sierrawireless.com>
+Message-ID: <1242159157.7032.17.camel@Linuxdev3>
+
+
+From: Elina Pasheva <epasheva@sierrawireless.com>
+
+- Fixed a problem when re-submitting urb from interrupt callback in
+ function sierra_instat_callback(). This suppresses also issuing of
+ error messages in /var/log/kern.log
+- Removed redundant debug message at the beginning of
+ sierra_instat_callback() function
+- Changed a debug message to be an error message
+
+Signed-off-by: Elina Pasheva <epasheva@sierrawireless.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+
+
+---
+ drivers/usb/serial/sierra.c | 7 +++----
+ 1 file changed, 3 insertions(+), 4 deletions(-)
+
+--- a/drivers/usb/serial/sierra.c
++++ b/drivers/usb/serial/sierra.c
+@@ -510,7 +510,6 @@ static void sierra_instat_callback(struc
+ struct sierra_port_private *portdata = usb_get_serial_port_data(port);
+ struct usb_serial *serial = port->serial;
+
+- dev_dbg(&port->dev, "%s\n", __func__);
+ dev_dbg(&port->dev, "%s: urb %p port %p has data %p\n", __func__,
+ urb, port, portdata);
+
+@@ -554,12 +553,12 @@ static void sierra_instat_callback(struc
+ dev_dbg(&port->dev, "%s: error %d\n", __func__, status);
+
+ /* Resubmit urb so we continue receiving IRQ data */
+- if (status != -ESHUTDOWN) {
++ if (port->port.count && status != -ESHUTDOWN && status != -ENOENT) {
+ urb->dev = serial->dev;
+ err = usb_submit_urb(urb, GFP_ATOMIC);
+ if (err)
+- dev_dbg(&port->dev, "%s: resubmit intr urb "
+- "failed. (%d)\n", __func__, err);
++ dev_err(&port->dev, "%s: resubmit intr urb "
++ "failed. (%d)\n", __func__, err);
+ }
+ }
+
diff --git a/usb/usb-serial-sierra-driver-sierra_calc_num_ports-fix.patch b/usb/usb-serial-sierra-driver-sierra_calc_num_ports-fix.patch
new file mode 100644
index 00000000000000..dfb6dffbae88e3
--- /dev/null
+++ b/usb/usb-serial-sierra-driver-sierra_calc_num_ports-fix.patch
@@ -0,0 +1,104 @@
+From epasheva@sierrawireless.com Tue May 12 17:14:37 2009
+From: Elina Pasheva <epasheva@sierrawireless.com>
+Date: Tue, 12 May 2009 13:12:54 -0700
+Subject: USB: serial: sierra driver sierra_calc_num_ports() fix
+To: <gregkh@suse.de>
+Cc: <rfiler@sierrawireless.com>, <epasheva@sierrawireless.com>
+Message-ID: <1242159174.7032.19.camel@Linuxdev3>
+
+
+From: Elina Pasheva <epasheva@sierrawireless.com>
+
+- Removed potential kernel oops from sierra_calc_num_ports() function.
+ Calling this function twice would likely have caused an oops because
+ the function releases allocated memory after the first call.
+- Modified sierra_probe() function to reflect the changes in
+ sierra_calc_num_ports().
+
+Signed-off-by: Elina Pasheva <epasheva@sierrawireless.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/usb/serial/sierra.c | 49 ++++++++++++--------------------------------
+ 1 file changed, 14 insertions(+), 35 deletions(-)
+
+--- a/drivers/usb/serial/sierra.c
++++ b/drivers/usb/serial/sierra.c
+@@ -79,18 +79,22 @@ static int sierra_vsc_set_nmea(struct us
+
+ static int sierra_calc_num_ports(struct usb_serial *serial)
+ {
+- int result;
+- int *num_ports = usb_get_serial_data(serial);
+- dev_dbg(&serial->dev->dev, "%s\n", __func__);
++ int num_ports = 0;
++ u8 ifnum, numendpoints;
+
+- result = *num_ports;
++ dev_dbg(&serial->dev->dev, "%s\n", __func__);
+
+- if (result) {
+- kfree(num_ports);
+- usb_set_serial_data(serial, NULL);
+- }
++ ifnum = serial->interface->cur_altsetting->desc.bInterfaceNumber;
++ numendpoints = serial->interface->cur_altsetting->desc.bNumEndpoints;
+
+- return result;
++ /* Dummy interface present on some SKUs should be ignored */
++ if (ifnum == 0x99)
++ num_ports = 0;
++ else if (numendpoints <= 3)
++ num_ports = 1;
++ else
++ num_ports = (numendpoints-1)/2;
++ return num_ports;
+ }
+
+ static int sierra_calc_interface(struct usb_serial *serial)
+@@ -119,23 +123,12 @@ static int sierra_probe(struct usb_seria
+ {
+ int result = 0;
+ struct usb_device *udev;
+- int *num_ports;
+ u8 ifnum;
+- u8 numendpoints;
+-
+- dev_dbg(&serial->dev->dev, "%s\n", __func__);
+
+- num_ports = kmalloc(sizeof(*num_ports), GFP_KERNEL);
+- if (!num_ports)
+- return -ENOMEM;
+-
+- ifnum = serial->interface->cur_altsetting->desc.bInterfaceNumber;
+- numendpoints = serial->interface->cur_altsetting->desc.bNumEndpoints;
+ udev = serial->dev;
++ dev_dbg(&udev->dev, "%s\n", __func__);
+
+- /* Figure out the interface number from the serial structure */
+ ifnum = sierra_calc_interface(serial);
+-
+ /*
+ * If this interface supports more than 1 alternate
+ * select the 2nd one
+@@ -147,20 +140,6 @@ static int sierra_probe(struct usb_seria
+ usb_set_interface(udev, ifnum, 1);
+ }
+
+- /* Dummy interface present on some SKUs should be ignored */
+- if (ifnum == 0x99)
+- *num_ports = 0;
+- else if (numendpoints <= 3)
+- *num_ports = 1;
+- else
+- *num_ports = (numendpoints-1)/2;
+-
+- /*
+- * save off our num_ports info so that we can use it in the
+- * calc_num_ports callback
+- */
+- usb_set_serial_data(serial, (void *)num_ports);
+-
+ return result;
+ }
+
diff --git a/usb/usb-serial-sierra-driver-zero-length-packet-fix.patch b/usb/usb-serial-sierra-driver-zero-length-packet-fix.patch
new file mode 100644
index 00000000000000..f8c64ca80d6c36
--- /dev/null
+++ b/usb/usb-serial-sierra-driver-zero-length-packet-fix.patch
@@ -0,0 +1,44 @@
+From epasheva@sierrawireless.com Tue May 12 17:13:35 2009
+From: Elina Pasheva <epasheva@sierrawireless.com>
+Date: Tue, 12 May 2009 13:12:24 -0700
+Subject: USB: serial: sierra driver zero length packet fix
+To: <gregkh@suse.de>
+Cc: <rfiler@sierrawireless.com>, <epasheva@sierrawireless.com>
+Message-ID: <1242159144.7032.15.camel@Linuxdev3>
+
+From: Elina Pasheva <epasheva@sierrawireless.com>
+
+- Fixed a problem with transferring packets with size a multiple of Bulk
+ Xfer size in function sierra_write(). Added transfer flag
+ URB_ZERO_PACKET before submitting the urb to trigger Zero-length data
+ transfer when packet size is a multiple of Bulk Xfer.
+
+Signed-off-by: Elina Pasheva <epasheva@sierrawireless.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+
+---
+ drivers/usb/serial/sierra.c | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+--- a/drivers/usb/serial/sierra.c
++++ b/drivers/usb/serial/sierra.c
+@@ -17,7 +17,7 @@
+ Whom based his on the Keyspan driver by Hugh Blemings <hugh@blemings.org>
+ */
+
+-#define DRIVER_VERSION "v.1.3.6"
++#define DRIVER_VERSION "v.1.3.7"
+ #define DRIVER_AUTHOR "Kevin Lloyd, Elina Pasheva, Matthew Safar, Rory Filer"
+ #define DRIVER_DESC "USB Driver for Sierra Wireless USB modems"
+
+@@ -428,6 +428,9 @@ static int sierra_write(struct tty_struc
+ port->bulk_out_endpointAddress),
+ buffer, writesize, sierra_outdat_callback, port);
+
++ /* Handle the need to send a zero length packet */
++ urb->transfer_flags |= URB_ZERO_PACKET;
++
+ /* send it down the pipe */
+ retval = usb_submit_urb(urb, GFP_ATOMIC);
+ if (retval) {