aboutsummaryrefslogtreecommitdiffstats
path: root/usb.current
diff options
authorGreg Kroah-Hartman <gregkh@suse.de>2009-10-09 12:14:45 -0700
committerGreg Kroah-Hartman <gregkh@suse.de>2009-10-09 12:14:45 -0700
commit510643efadd98b858a3e20543c3b7386caddc0c7 (patch)
tree2361ba0b0ed9a505e2ee7fe83b075a7b42eacbb5 /usb.current
parentdea9eda94b232e743051c47c18398910c8235592 (diff)
downloadpatches-510643efadd98b858a3e20543c3b7386caddc0c7.tar.gz
more usb fixes
Diffstat (limited to 'usb.current')
-rw-r--r--usb.current/usb-cp210x-add-support-for-the-dw700-uart.patch31
-rw-r--r--usb.current/usb-ehci-fix-isoc-scheduling-boundary-checking.patch36
-rw-r--r--usb.current/usb-fix-throttling-in-generic-usbserial-driver.patch35
-rw-r--r--usb.current/usb-ipaq-fix-oops-when-device-is-plugged-in.patch42
-rw-r--r--usb.current/usb-serial-fix-assumption-that-throttle-unthrottle-cannot-sleep.patch353
-rw-r--r--usb.current/usb-serial-fix-race-between-unthrottle-and-completion-handler-in-opticon.patch53
-rw-r--r--usb.current/usb-serial-fix-race-between-unthrottle-and-completion-handler-in-symbolserial.patch53
-rw-r--r--usb.current/usb-serial-fix-race-between-unthrottle-and-completion-handler-in-visor.patch54
-rw-r--r--usb.current/usb-serial-no-unnecessary-gfp_atomic-in-oti6858.patch47
-rw-r--r--usb.current/usb-small-fix-in-error-case-of-suspend-in-generic-usbserial-code.patch34
-rw-r--r--usb.current/usb-storage-when-a-device-returns-no-sense-data-call-it-a-hardware-error.patch76
-rw-r--r--usb.current/usb-visor-fix-trivial-accounting-bug-in-visor-driver.patch32
12 files changed, 846 insertions, 0 deletions
diff --git a/usb.current/usb-cp210x-add-support-for-the-dw700-uart.patch b/usb.current/usb-cp210x-add-support-for-the-dw700-uart.patch
new file mode 100644
index 00000000000000..92d7acde717815
--- /dev/null
+++ b/usb.current/usb-cp210x-add-support-for-the-dw700-uart.patch
@@ -0,0 +1,31 @@
+From eric.piel@tremplin-utc.net Fri Oct 9 11:38:47 2009
+From: "�ric Piel" <eric.piel@tremplin-utc.net>
+Date: Sun, 04 Oct 2009 13:45:07 +0200
+Subject: USB: cp210x: Add support for the DW700 UART
+To: Craig Shelley <craig@microtron.org.uk>
+Cc: Greg Kroah-Hartman <gregkh@suse.de>, linux-usb@vger.kernel.org
+Message-ID: <4AC88AC3.2030401@tremplin-utc.net>
+
+
+In the Dell inspiron mini 10, the GPS is connected via a cp2102. This patch
+adds detection of this USB device. (I haven't managed to use the GPS under
+Linux yet, though)
+
+Signed-off-by: �ric Piel <eric.piel@tremplin-utc.net>
+Cc: stable <stable@kernel.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/usb/serial/cp210x.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+--- a/drivers/usb/serial/cp210x.c
++++ b/drivers/usb/serial/cp210x.c
+@@ -113,6 +113,7 @@ static struct usb_device_id id_table []
+ { USB_DEVICE(0x166A, 0x0303) }, /* Clipsal 5500PCU C-Bus USB interface */
+ { USB_DEVICE(0x16D6, 0x0001) }, /* Jablotron serial interface */
+ { USB_DEVICE(0x18EF, 0xE00F) }, /* ELV USB-I2C-Interface */
++ { USB_DEVICE(0x413C, 0x9500) }, /* DW700 GPS USB interface */
+ { } /* Terminating Entry */
+ };
+
diff --git a/usb.current/usb-ehci-fix-isoc-scheduling-boundary-checking.patch b/usb.current/usb-ehci-fix-isoc-scheduling-boundary-checking.patch
new file mode 100644
index 00000000000000..20c1d42718d36d
--- /dev/null
+++ b/usb.current/usb-ehci-fix-isoc-scheduling-boundary-checking.patch
@@ -0,0 +1,36 @@
+From sarah.a.sharp@linux.intel.com Fri Oct 9 11:45:23 2009
+From: Sarah Sharp <sarah.a.sharp@linux.intel.com>
+Date: Tue, 6 Oct 2009 13:45:59 -0700
+Subject: USB: ehci: Fix isoc scheduling boundary checking.
+To: Greg KH <gregkh@suse.de>
+Cc: linux-usb@vger.kernel.org, Alan Stern <stern@rowland.harvard.edu>
+Message-ID: <20091006204559.GA11068@xanatos>
+Content-Disposition: inline
+
+
+The EHCI driver does some bounds checking when it's scheduling an iTD for
+an active endpoint. It sets the local variable start to
+stream->next_uframe and moves that variable further in the schedule if
+necessary. However, the driver fails to do anything with start before
+jumping to the ready label and setting the URB's starting frame to
+stream->next_uframe. Alan Stern confirms the EHCI driver should set
+stream->next_uframe to start before jumping.
+
+Signed-off-by: Sarah Sharp <sarah.a.sharp@linux.intel.com>
+Acked-by: Alan Stern <stern@rowland.harvard.edu>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/usb/host/ehci-sched.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+--- a/drivers/usb/host/ehci-sched.c
++++ b/drivers/usb/host/ehci-sched.c
+@@ -1425,6 +1425,7 @@ iso_stream_schedule (
+ status = -EFBIG;
+ goto fail;
+ }
++ stream->next_uframe = start;
+ goto ready;
+ }
+
diff --git a/usb.current/usb-fix-throttling-in-generic-usbserial-driver.patch b/usb.current/usb-fix-throttling-in-generic-usbserial-driver.patch
new file mode 100644
index 00000000000000..8e8a7c6c454773
--- /dev/null
+++ b/usb.current/usb-fix-throttling-in-generic-usbserial-driver.patch
@@ -0,0 +1,35 @@
+From jorispubl@xs4all.nl Fri Oct 9 11:41:38 2009
+From: Joris van Rantwijk <jorispubl@xs4all.nl>
+Date: Thu, 24 Sep 2009 20:20:20 +0200
+Subject: USB: Fix throttling in generic usbserial driver
+To: linux-usb@vger.kernel.org
+Message-ID: <20090924182020.GA73434@xs4all.nl>
+
+
+
+The generic usbserial driver in Linux 2.6.31 halts its receiving
+channel in response to throttle requests from the line discipline.
+Unfortunately it drops the contents of the first URB received after
+throttling takes effect. This patch corrects that problem.
+
+Signed-off-by: Joris van Rantwijk <jorispubl@xs4all.nl>
+Acked-by: Johan Hovold <jhovold@gmail.com>
+Cc: stable <stable@kernel.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+
+---
+ drivers/usb/serial/generic.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/drivers/usb/serial/generic.c
++++ b/drivers/usb/serial/generic.c
+@@ -546,7 +546,7 @@ void usb_serial_generic_unthrottle(struc
+
+ if (was_throttled) {
+ /* Resume reading from device */
+- usb_serial_generic_resubmit_read_urb(port, GFP_KERNEL);
++ flush_and_resubmit_read_urb(port);
+ }
+ }
+
diff --git a/usb.current/usb-ipaq-fix-oops-when-device-is-plugged-in.patch b/usb.current/usb-ipaq-fix-oops-when-device-is-plugged-in.patch
new file mode 100644
index 00000000000000..96f0b7d6b7c3b6
--- /dev/null
+++ b/usb.current/usb-ipaq-fix-oops-when-device-is-plugged-in.patch
@@ -0,0 +1,42 @@
+From stern@rowland.harvard.edu Fri Oct 9 11:37:58 2009
+From: Alan Stern <stern@rowland.harvard.edu>
+Date: Mon, 5 Oct 2009 15:53:58 -0400 (EDT)
+Subject: USB: ipaq: fix oops when device is plugged in
+To: Greg KH <greg@kroah.com>
+Cc: Matthias Geissert <geissert@mathematik.tu-darmstadt.de>, Tilman Schmidt <tilman@imap.cc>
+Message-ID: <Pine.LNX.4.44L0.0910051550250.2703-100000@iolanthe.rowland.org>
+
+
+This patch (as1293) fixes a problem with the ipaq serial driver. It
+tries to bind to all the interfaces, even those that don't have enough
+endpoints. The symptom is an invalid memory reference and oops when
+the device is plugged in.
+
+Signed-off-by: Alan Stern <stern@rowland.harvard.edu>
+CC: stable <stable@kernel.org>
+Tested-by: Matthias Geissert <geissert@mathematik.tu-darmstadt.de>
+Tested-by: Tilman Schmidt <tilman@imap.cc>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/usb/serial/ipaq.c | 9 +++++++++
+ 1 file changed, 9 insertions(+)
+
+--- a/drivers/usb/serial/ipaq.c
++++ b/drivers/usb/serial/ipaq.c
+@@ -966,6 +966,15 @@ static int ipaq_calc_num_ports(struct us
+ static int ipaq_startup(struct usb_serial *serial)
+ {
+ dbg("%s", __func__);
++
++ /* Some of the devices in ipaq_id_table[] are composite, and we
++ * shouldn't bind to all the interfaces. This test will rule out
++ * some obviously invalid possibilities.
++ */
++ if (serial->num_bulk_in < serial->num_ports ||
++ serial->num_bulk_out < serial->num_ports)
++ return -ENODEV;
++
+ if (serial->dev->actconfig->desc.bConfigurationValue != 1) {
+ /*
+ * FIXME: HP iPaq rx3715, possibly others, have 1 config that
diff --git a/usb.current/usb-serial-fix-assumption-that-throttle-unthrottle-cannot-sleep.patch b/usb.current/usb-serial-fix-assumption-that-throttle-unthrottle-cannot-sleep.patch
new file mode 100644
index 00000000000000..492c12bd0847fe
--- /dev/null
+++ b/usb.current/usb-serial-fix-assumption-that-throttle-unthrottle-cannot-sleep.patch
@@ -0,0 +1,353 @@
+From oliver@neukum.org Fri Oct 9 11:48:03 2009
+From: Oliver Neukum <oliver@neukum.org>
+Date: Wed, 7 Oct 2009 10:50:23 +0200
+Subject: USB: serial: fix assumption that throttle/unthrottle cannot sleep
+To: "Greg Kroah-Hartman" <gregkh@suse.de>, linux-usb@vger.kernel.org
+Message-ID: <200910071050.23502.oliver@neukum.org>
+Content-Disposition: inline
+
+
+many serial subdrivers are clearly written as if throttle/unthrottle
+cannot sleep. This leads to unneeded atomic submissions. This
+patch converts affected drivers in a way to makes very clear that
+throttle/unthrottle can sleep. Thus future misdesigns can be avoided
+and efficiency and reliability improved.
+
+This removes any such assumption using GFP_KERNEL and spin_lock_irq()
+
+Signed-off-by: Oliver Neukum <oliver@neukum.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/usb/serial/aircable.c | 10 ++++------
+ drivers/usb/serial/cypress_m8.c | 12 +++++-------
+ drivers/usb/serial/empeg.c | 2 +-
+ drivers/usb/serial/garmin_gps.c | 12 +++++-------
+ drivers/usb/serial/keyspan_pda.c | 2 +-
+ drivers/usb/serial/kl5kusb105.c | 2 +-
+ drivers/usb/serial/mct_u232.c | 14 ++++++--------
+ drivers/usb/serial/symbolserial.c | 12 +++++-------
+ drivers/usb/serial/visor.c | 12 +++++-------
+ drivers/usb/serial/whiteheat.c | 10 ++++------
+ 10 files changed, 37 insertions(+), 51 deletions(-)
+
+--- a/drivers/usb/serial/aircable.c
++++ b/drivers/usb/serial/aircable.c
+@@ -554,13 +554,12 @@ static void aircable_throttle(struct tty
+ {
+ struct usb_serial_port *port = tty->driver_data;
+ struct aircable_private *priv = usb_get_serial_port_data(port);
+- unsigned long flags;
+
+ dbg("%s - port %d", __func__, port->number);
+
+- spin_lock_irqsave(&priv->rx_lock, flags);
++ spin_lock_irq(&priv->rx_lock);
+ priv->rx_flags |= THROTTLED;
+- spin_unlock_irqrestore(&priv->rx_lock, flags);
++ spin_unlock_irq(&priv->rx_lock);
+ }
+
+ /* Based on ftdi_sio.c unthrottle */
+@@ -569,14 +568,13 @@ static void aircable_unthrottle(struct t
+ struct usb_serial_port *port = tty->driver_data;
+ struct aircable_private *priv = usb_get_serial_port_data(port);
+ int actually_throttled;
+- unsigned long flags;
+
+ dbg("%s - port %d", __func__, port->number);
+
+- spin_lock_irqsave(&priv->rx_lock, flags);
++ spin_lock_irq(&priv->rx_lock);
+ actually_throttled = priv->rx_flags & ACTUALLY_THROTTLED;
+ priv->rx_flags &= ~(THROTTLED | ACTUALLY_THROTTLED);
+- spin_unlock_irqrestore(&priv->rx_lock, flags);
++ spin_unlock_irq(&priv->rx_lock);
+
+ if (actually_throttled)
+ schedule_work(&priv->rx_work);
+--- a/drivers/usb/serial/cypress_m8.c
++++ b/drivers/usb/serial/cypress_m8.c
+@@ -1155,13 +1155,12 @@ static void cypress_throttle(struct tty_
+ {
+ struct usb_serial_port *port = tty->driver_data;
+ struct cypress_private *priv = usb_get_serial_port_data(port);
+- unsigned long flags;
+
+ dbg("%s - port %d", __func__, port->number);
+
+- spin_lock_irqsave(&priv->lock, flags);
++ spin_lock_irq(&priv->lock);
+ priv->rx_flags = THROTTLED;
+- spin_unlock_irqrestore(&priv->lock, flags);
++ spin_unlock_irq(&priv->lock);
+ }
+
+
+@@ -1170,14 +1169,13 @@ static void cypress_unthrottle(struct tt
+ struct usb_serial_port *port = tty->driver_data;
+ struct cypress_private *priv = usb_get_serial_port_data(port);
+ int actually_throttled, result;
+- unsigned long flags;
+
+ dbg("%s - port %d", __func__, port->number);
+
+- spin_lock_irqsave(&priv->lock, flags);
++ spin_lock_irq(&priv->lock);
+ actually_throttled = priv->rx_flags & ACTUALLY_THROTTLED;
+ priv->rx_flags = 0;
+- spin_unlock_irqrestore(&priv->lock, flags);
++ spin_unlock_irq(&priv->lock);
+
+ if (!priv->comm_is_ok)
+ return;
+@@ -1185,7 +1183,7 @@ static void cypress_unthrottle(struct tt
+ if (actually_throttled) {
+ port->interrupt_in_urb->dev = port->serial->dev;
+
+- result = usb_submit_urb(port->interrupt_in_urb, GFP_ATOMIC);
++ result = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);
+ if (result) {
+ dev_err(&port->dev, "%s - failed submitting read urb, "
+ "error %d\n", __func__, result);
+--- a/drivers/usb/serial/empeg.c
++++ b/drivers/usb/serial/empeg.c
+@@ -391,7 +391,7 @@ static void empeg_unthrottle(struct tty_
+ dbg("%s - port %d", __func__, port->number);
+
+ port->read_urb->dev = port->serial->dev;
+- result = usb_submit_urb(port->read_urb, GFP_ATOMIC);
++ result = usb_submit_urb(port->read_urb, GFP_KERNEL);
+ if (result)
+ dev_err(&port->dev,
+ "%s - failed submitting read urb, error %d\n",
+--- a/drivers/usb/serial/garmin_gps.c
++++ b/drivers/usb/serial/garmin_gps.c
+@@ -1390,14 +1390,13 @@ static void garmin_throttle(struct tty_s
+ {
+ struct usb_serial_port *port = tty->driver_data;
+ struct garmin_data *garmin_data_p = usb_get_serial_port_data(port);
+- unsigned long flags;
+
+ dbg("%s - port %d", __func__, port->number);
+ /* set flag, data received will be put into a queue
+ for later processing */
+- spin_lock_irqsave(&garmin_data_p->lock, flags);
++ spin_lock_irq(&garmin_data_p->lock);
+ garmin_data_p->flags |= FLAGS_QUEUING|FLAGS_THROTTLED;
+- spin_unlock_irqrestore(&garmin_data_p->lock, flags);
++ spin_unlock_irq(&garmin_data_p->lock);
+ }
+
+
+@@ -1405,13 +1404,12 @@ static void garmin_unthrottle(struct tty
+ {
+ struct usb_serial_port *port = tty->driver_data;
+ struct garmin_data *garmin_data_p = usb_get_serial_port_data(port);
+- unsigned long flags;
+ int status;
+
+ dbg("%s - port %d", __func__, port->number);
+- spin_lock_irqsave(&garmin_data_p->lock, flags);
++ spin_lock_irq(&garmin_data_p->lock);
+ garmin_data_p->flags &= ~FLAGS_THROTTLED;
+- spin_unlock_irqrestore(&garmin_data_p->lock, flags);
++ spin_unlock_irq(&garmin_data_p->lock);
+
+ /* in native mode send queued data to tty, in
+ serial mode nothing needs to be done here */
+@@ -1419,7 +1417,7 @@ static void garmin_unthrottle(struct tty
+ garmin_flush_queue(garmin_data_p);
+
+ if (0 != (garmin_data_p->flags & FLAGS_BULK_IN_ACTIVE)) {
+- status = usb_submit_urb(port->read_urb, GFP_ATOMIC);
++ status = usb_submit_urb(port->read_urb, GFP_KERNEL);
+ if (status)
+ dev_err(&port->dev,
+ "%s - failed resubmitting read urb, error %d\n",
+--- a/drivers/usb/serial/keyspan_pda.c
++++ b/drivers/usb/serial/keyspan_pda.c
+@@ -290,7 +290,7 @@ static void keyspan_pda_rx_unthrottle(st
+ /* just restart the receive interrupt URB */
+ dbg("keyspan_pda_rx_unthrottle port %d", port->number);
+ port->interrupt_in_urb->dev = port->serial->dev;
+- if (usb_submit_urb(port->interrupt_in_urb, GFP_ATOMIC))
++ if (usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL))
+ dbg(" usb_submit_urb(read urb) failed");
+ return;
+ }
+--- a/drivers/usb/serial/kl5kusb105.c
++++ b/drivers/usb/serial/kl5kusb105.c
+@@ -951,7 +951,7 @@ static void klsi_105_unthrottle(struct t
+ dbg("%s - port %d", __func__, port->number);
+
+ port->read_urb->dev = port->serial->dev;
+- result = usb_submit_urb(port->read_urb, GFP_ATOMIC);
++ result = usb_submit_urb(port->read_urb, GFP_KERNEL);
+ if (result)
+ dev_err(&port->dev,
+ "%s - failed submitting read urb, error %d\n",
+--- a/drivers/usb/serial/mct_u232.c
++++ b/drivers/usb/serial/mct_u232.c
+@@ -777,20 +777,19 @@ static void mct_u232_throttle(struct tty
+ {
+ struct usb_serial_port *port = tty->driver_data;
+ struct mct_u232_private *priv = usb_get_serial_port_data(port);
+- unsigned long flags;
+ unsigned int control_state;
+
+ dbg("%s - port %d", __func__, port->number);
+
+- spin_lock_irqsave(&priv->lock, flags);
++ spin_lock_irq(&priv->lock);
+ priv->rx_flags |= THROTTLED;
+ if (C_CRTSCTS(tty)) {
+ priv->control_state &= ~TIOCM_RTS;
+ control_state = priv->control_state;
+- spin_unlock_irqrestore(&priv->lock, flags);
++ spin_unlock_irq(&priv->lock);
+ (void) mct_u232_set_modem_ctrl(port->serial, control_state);
+ } else {
+- spin_unlock_irqrestore(&priv->lock, flags);
++ spin_unlock_irq(&priv->lock);
+ }
+ }
+
+@@ -799,20 +798,19 @@ static void mct_u232_unthrottle(struct t
+ {
+ struct usb_serial_port *port = tty->driver_data;
+ struct mct_u232_private *priv = usb_get_serial_port_data(port);
+- unsigned long flags;
+ unsigned int control_state;
+
+ dbg("%s - port %d", __func__, port->number);
+
+- spin_lock_irqsave(&priv->lock, flags);
++ spin_lock_irq(&priv->lock);
+ if ((priv->rx_flags & THROTTLED) && C_CRTSCTS(tty)) {
+ priv->rx_flags &= ~THROTTLED;
+ priv->control_state |= TIOCM_RTS;
+ control_state = priv->control_state;
+- spin_unlock_irqrestore(&priv->lock, flags);
++ spin_unlock_irq(&priv->lock);
+ (void) mct_u232_set_modem_ctrl(port->serial, control_state);
+ } else {
+- spin_unlock_irqrestore(&priv->lock, flags);
++ spin_unlock_irq(&priv->lock);
+ }
+ }
+
+--- a/drivers/usb/serial/symbolserial.c
++++ b/drivers/usb/serial/symbolserial.c
+@@ -165,33 +165,31 @@ static void symbol_throttle(struct tty_s
+ {
+ struct usb_serial_port *port = tty->driver_data;
+ struct symbol_private *priv = usb_get_serial_data(port->serial);
+- unsigned long flags;
+
+ dbg("%s - port %d", __func__, port->number);
+- spin_lock_irqsave(&priv->lock, flags);
++ spin_lock_irq(&priv->lock);
+ priv->throttled = true;
+- spin_unlock_irqrestore(&priv->lock, flags);
++ spin_unlock_irq(&priv->lock);
+ }
+
+ static void symbol_unthrottle(struct tty_struct *tty)
+ {
+ struct usb_serial_port *port = tty->driver_data;
+ struct symbol_private *priv = usb_get_serial_data(port->serial);
+- unsigned long flags;
+ int result;
+ bool was_throttled;
+
+ dbg("%s - port %d", __func__, port->number);
+
+- spin_lock_irqsave(&priv->lock, flags);
++ spin_lock_irq(&priv->lock);
+ priv->throttled = false;
+ was_throttled = priv->actually_throttled;
+ priv->actually_throttled = false;
+- spin_unlock_irqrestore(&priv->lock, flags);
++ spin_unlock_irq(&priv->lock);
+
+ priv->int_urb->dev = port->serial->dev;
+ if (was_throttled) {
+- result = usb_submit_urb(priv->int_urb, GFP_ATOMIC);
++ result = usb_submit_urb(priv->int_urb, GFP_KERNEL);
+ if (result)
+ dev_err(&port->dev,
+ "%s - failed submitting read urb, error %d\n",
+--- a/drivers/usb/serial/visor.c
++++ b/drivers/usb/serial/visor.c
+@@ -583,12 +583,11 @@ static void visor_throttle(struct tty_st
+ {
+ struct usb_serial_port *port = tty->driver_data;
+ struct visor_private *priv = usb_get_serial_port_data(port);
+- unsigned long flags;
+
+ dbg("%s - port %d", __func__, port->number);
+- spin_lock_irqsave(&priv->lock, flags);
++ spin_lock_irq(&priv->lock);
+ priv->throttled = 1;
+- spin_unlock_irqrestore(&priv->lock, flags);
++ spin_unlock_irq(&priv->lock);
+ }
+
+
+@@ -596,17 +595,16 @@ static void visor_unthrottle(struct tty_
+ {
+ struct usb_serial_port *port = tty->driver_data;
+ struct visor_private *priv = usb_get_serial_port_data(port);
+- unsigned long flags;
+ int result;
+
+ dbg("%s - port %d", __func__, port->number);
+- spin_lock_irqsave(&priv->lock, flags);
++ spin_lock_irq(&priv->lock);
+ priv->throttled = 0;
+ priv->actually_throttled = 0;
+- spin_unlock_irqrestore(&priv->lock, flags);
++ spin_unlock_irq(&priv->lock);
+
+ port->read_urb->dev = port->serial->dev;
+- result = usb_submit_urb(port->read_urb, GFP_ATOMIC);
++ result = usb_submit_urb(port->read_urb, GFP_KERNEL);
+ if (result)
+ dev_err(&port->dev,
+ "%s - failed submitting read urb, error %d\n",
+--- a/drivers/usb/serial/whiteheat.c
++++ b/drivers/usb/serial/whiteheat.c
+@@ -949,13 +949,12 @@ static void whiteheat_throttle(struct tt
+ {
+ struct usb_serial_port *port = tty->driver_data;
+ struct whiteheat_private *info = usb_get_serial_port_data(port);
+- unsigned long flags;
+
+ dbg("%s - port %d", __func__, port->number);
+
+- spin_lock_irqsave(&info->lock, flags);
++ spin_lock_irq(&info->lock);
+ info->flags |= THROTTLED;
+- spin_unlock_irqrestore(&info->lock, flags);
++ spin_unlock_irq(&info->lock);
+
+ return;
+ }
+@@ -966,14 +965,13 @@ static void whiteheat_unthrottle(struct
+ struct usb_serial_port *port = tty->driver_data;
+ struct whiteheat_private *info = usb_get_serial_port_data(port);
+ int actually_throttled;
+- unsigned long flags;
+
+ dbg("%s - port %d", __func__, port->number);
+
+- spin_lock_irqsave(&info->lock, flags);
++ spin_lock_irq(&info->lock);
+ actually_throttled = info->flags & ACTUALLY_THROTTLED;
+ info->flags &= ~(THROTTLED | ACTUALLY_THROTTLED);
+- spin_unlock_irqrestore(&info->lock, flags);
++ spin_unlock_irq(&info->lock);
+
+ if (actually_throttled)
+ rx_data_softint(&info->rx_work);
diff --git a/usb.current/usb-serial-fix-race-between-unthrottle-and-completion-handler-in-opticon.patch b/usb.current/usb-serial-fix-race-between-unthrottle-and-completion-handler-in-opticon.patch
new file mode 100644
index 00000000000000..1f428cf3d30372
--- /dev/null
+++ b/usb.current/usb-serial-fix-race-between-unthrottle-and-completion-handler-in-opticon.patch
@@ -0,0 +1,53 @@
+From oliver@neukum.org Fri Oct 9 11:45:55 2009
+From: Oliver Neukum <oliver@neukum.org>
+Date: Wed, 7 Oct 2009 09:25:10 +0200
+Subject: USB: serial: fix race between unthrottle and completion handler in opticon
+To: "Greg Kroah-Hartman" <gregkh@suse.de>, linux-usb@vger.kernel.org
+Message-ID: <200910070925.10632.oliver@neukum.org>
+Content-Disposition: inline
+
+
+usb:usbserial:opticon: fix race between unthrottle and completion handler
+
+opticon_unthrottle() mustn't resubmit the URB unconditionally
+as the URB may still be running.
+
+Signed-off-by: Oliver Neukum <oliver@neukum.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/usb/serial/opticon.c | 13 ++++++++-----
+ 1 file changed, 8 insertions(+), 5 deletions(-)
+
+--- a/drivers/usb/serial/opticon.c
++++ b/drivers/usb/serial/opticon.c
+@@ -314,21 +314,24 @@ static void opticon_unthrottle(struct tt
+ struct usb_serial_port *port = tty->driver_data;
+ struct opticon_private *priv = usb_get_serial_data(port->serial);
+ unsigned long flags;
+- int result;
++ int result, was_throttled;
+
+ dbg("%s - port %d", __func__, port->number);
+
+ spin_lock_irqsave(&priv->lock, flags);
+ priv->throttled = false;
++ was_throttled = priv->actually_throttled;
+ priv->actually_throttled = false;
+ spin_unlock_irqrestore(&priv->lock, flags);
+
+ priv->bulk_read_urb->dev = port->serial->dev;
+- result = usb_submit_urb(priv->bulk_read_urb, GFP_ATOMIC);
+- if (result)
+- dev_err(&port->dev,
+- "%s - failed submitting read urb, error %d\n",
++ if (was_throttled) {
++ result = usb_submit_urb(priv->bulk_read_urb, GFP_ATOMIC);
++ if (result)
++ dev_err(&port->dev,
++ "%s - failed submitting read urb, error %d\n",
+ __func__, result);
++ }
+ }
+
+ static int opticon_tiocmget(struct tty_struct *tty, struct file *file)
diff --git a/usb.current/usb-serial-fix-race-between-unthrottle-and-completion-handler-in-symbolserial.patch b/usb.current/usb-serial-fix-race-between-unthrottle-and-completion-handler-in-symbolserial.patch
new file mode 100644
index 00000000000000..f6e04430132add
--- /dev/null
+++ b/usb.current/usb-serial-fix-race-between-unthrottle-and-completion-handler-in-symbolserial.patch
@@ -0,0 +1,53 @@
+From oliver@neukum.org Fri Oct 9 11:46:28 2009
+From: Oliver Neukum <oliver@neukum.org>
+Date: Wed, 7 Oct 2009 09:30:49 +0200
+Subject: USB: serial: fix race between unthrottle and completion handler in symbolserial
+To: "Greg Kroah-Hartman" <gregkh@suse.de>, linux-usb@vger.kernel.org
+Message-ID: <200910070930.49478.oliver@neukum.org>
+Content-Disposition: inline
+
+usb:usbserial:symbolserial: fix race between unthrottle and completion handler
+
+symbol_unthrottle() mustn't resubmit the URB unconditionally
+as the URB may still be running.
+
+the same bug as opticon.
+
+Signed-off-by: Oliver Neukum <oliver@neukum.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/usb/serial/symbolserial.c | 12 ++++++++----
+ 1 file changed, 8 insertions(+), 4 deletions(-)
+
+--- a/drivers/usb/serial/symbolserial.c
++++ b/drivers/usb/serial/symbolserial.c
+@@ -179,20 +179,24 @@ static void symbol_unthrottle(struct tty
+ struct symbol_private *priv = usb_get_serial_data(port->serial);
+ unsigned long flags;
+ int result;
++ bool was_throttled;
+
+ dbg("%s - port %d", __func__, port->number);
+
+ spin_lock_irqsave(&priv->lock, flags);
+ priv->throttled = false;
++ was_throttled = priv->actually_throttled;
+ priv->actually_throttled = false;
+ spin_unlock_irqrestore(&priv->lock, flags);
+
+ priv->int_urb->dev = port->serial->dev;
+- result = usb_submit_urb(priv->int_urb, GFP_ATOMIC);
+- if (result)
+- dev_err(&port->dev,
+- "%s - failed submitting read urb, error %d\n",
++ if (was_throttled) {
++ result = usb_submit_urb(priv->int_urb, GFP_ATOMIC);
++ if (result)
++ dev_err(&port->dev,
++ "%s - failed submitting read urb, error %d\n",
+ __func__, result);
++ }
+ }
+
+ static int symbol_startup(struct usb_serial *serial)
diff --git a/usb.current/usb-serial-fix-race-between-unthrottle-and-completion-handler-in-visor.patch b/usb.current/usb-serial-fix-race-between-unthrottle-and-completion-handler-in-visor.patch
new file mode 100644
index 00000000000000..e98bef91da8a0c
--- /dev/null
+++ b/usb.current/usb-serial-fix-race-between-unthrottle-and-completion-handler-in-visor.patch
@@ -0,0 +1,54 @@
+From oliver@neukum.org Fri Oct 9 11:47:27 2009
+From: Oliver Neukum <oliver@neukum.org>
+Date: Wed, 7 Oct 2009 11:01:38 +0200
+Subject: USB: serial: fix race between unthrottle and completion handler in visor
+To: "Greg Kroah-Hartman" <gregkh@suse.de>, linux-usb@vger.kernel.org
+Message-ID: <200910071101.39041.oliver@neukum.org>
+Content-Disposition: inline
+
+usb:usbserial:visor: fix race between unthrottle and completion handler
+
+visor_unthrottle() mustn't resubmit the URB unconditionally
+as the URB may still be running.
+
+the same bug as opticon.
+
+Signed-off-by: Oliver Neukum <oliver@neukum.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/usb/serial/visor.c | 15 +++++++++------
+ 1 file changed, 9 insertions(+), 6 deletions(-)
+
+--- a/drivers/usb/serial/visor.c
++++ b/drivers/usb/serial/visor.c
+@@ -595,20 +595,23 @@ static void visor_unthrottle(struct tty_
+ {
+ struct usb_serial_port *port = tty->driver_data;
+ struct visor_private *priv = usb_get_serial_port_data(port);
+- int result;
++ int result, was_throttled;
+
+ dbg("%s - port %d", __func__, port->number);
+ spin_lock_irq(&priv->lock);
+ priv->throttled = 0;
++ was_throttled = priv->actually_throttled;
+ priv->actually_throttled = 0;
+ spin_unlock_irq(&priv->lock);
+
+- port->read_urb->dev = port->serial->dev;
+- result = usb_submit_urb(port->read_urb, GFP_KERNEL);
+- if (result)
+- dev_err(&port->dev,
+- "%s - failed submitting read urb, error %d\n",
++ if (was_throttled) {
++ port->read_urb->dev = port->serial->dev;
++ result = usb_submit_urb(port->read_urb, GFP_KERNEL);
++ if (result)
++ dev_err(&port->dev,
++ "%s - failed submitting read urb, error %d\n",
+ __func__, result);
++ }
+ }
+
+ static int palm_os_3_probe(struct usb_serial *serial,
diff --git a/usb.current/usb-serial-no-unnecessary-gfp_atomic-in-oti6858.patch b/usb.current/usb-serial-no-unnecessary-gfp_atomic-in-oti6858.patch
new file mode 100644
index 00000000000000..696cd3635f1eee
--- /dev/null
+++ b/usb.current/usb-serial-no-unnecessary-gfp_atomic-in-oti6858.patch
@@ -0,0 +1,47 @@
+From oliver@neukum.org Fri Oct 9 12:06:22 2009
+From: Oliver Neukum <oliver@neukum.org>
+Date: Wed, 7 Oct 2009 18:07:10 +0200
+Subject: USB: serial: no unnecessary GFP_ATOMIC in oti6858
+To: "Greg Kroah-Hartman" <gregkh@suse.de>, linux-usb@vger.kernel.org
+Message-ID: <200910071807.10808.oliver@neukum.org>
+Content-Disposition: inline
+
+
+GFP_ATOMIC without good cause is evil.
+
+Signed-off-by: Oliver Neukum <oliver@neukum.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/usb/serial/oti6858.c | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+--- a/drivers/usb/serial/oti6858.c
++++ b/drivers/usb/serial/oti6858.c
+@@ -288,7 +288,7 @@ static void setup_line(struct work_struc
+
+ dbg("%s(): submitting interrupt urb", __func__);
+ port->interrupt_in_urb->dev = port->serial->dev;
+- result = usb_submit_urb(port->interrupt_in_urb, GFP_ATOMIC);
++ result = usb_submit_urb(port->interrupt_in_urb, GFP_KERNEL);
+ if (result != 0) {
+ dev_err(&port->dev, "%s(): usb_submit_urb() failed"
+ " with error %d\n", __func__, result);
+@@ -335,7 +335,7 @@ void send_data(struct work_struct *work)
+
+ dbg("%s(): submitting interrupt urb", __func__);
+ port->interrupt_in_urb->dev = port->serial->dev;
+- result = usb_submit_urb(port->interrupt_in_urb, GFP_ATOMIC);
++ result = usb_submit_urb(port->interrupt_in_urb, GFP_NOIO);
+ if (result != 0) {
+ dev_err(&port->dev, "%s(): usb_submit_urb() failed"
+ " with error %d\n", __func__, result);
+@@ -349,7 +349,7 @@ void send_data(struct work_struct *work)
+
+ port->write_urb->transfer_buffer_length = count;
+ port->write_urb->dev = port->serial->dev;
+- result = usb_submit_urb(port->write_urb, GFP_ATOMIC);
++ result = usb_submit_urb(port->write_urb, GFP_NOIO);
+ if (result != 0) {
+ dev_err(&port->dev, "%s(): usb_submit_urb() failed"
+ " with error %d\n", __func__, result);
diff --git a/usb.current/usb-small-fix-in-error-case-of-suspend-in-generic-usbserial-code.patch b/usb.current/usb-small-fix-in-error-case-of-suspend-in-generic-usbserial-code.patch
new file mode 100644
index 00000000000000..a3339d8fad5449
--- /dev/null
+++ b/usb.current/usb-small-fix-in-error-case-of-suspend-in-generic-usbserial-code.patch
@@ -0,0 +1,34 @@
+From oliver@neukum.org Fri Oct 9 11:43:28 2009
+From: Oliver Neukum <oliver@neukum.org>
+Date: Thu, 1 Oct 2009 15:01:17 +0200
+Subject: USB: small fix in error case of suspend in generic usbserial code
+To: "Greg Kroah-Hartman" <gregkh@suse.de>
+Message-ID: <200910011501.17797.oliver@neukum.org>
+Content-Disposition: inline
+
+usb:usbserial: fix flags in error case of suspension
+
+suspended flag must be reset in error case
+
+Signed-off-by: Oliver Neukum <oliver@neukum.org>
+Cc: stable <stable@kernel.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/usb/serial/usb-serial.c | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+--- a/drivers/usb/serial/usb-serial.c
++++ b/drivers/usb/serial/usb-serial.c
+@@ -1168,8 +1168,10 @@ int usb_serial_suspend(struct usb_interf
+
+ if (serial->type->suspend) {
+ r = serial->type->suspend(serial, message);
+- if (r < 0)
++ if (r < 0) {
++ serial->suspending = 0;
+ goto err_out;
++ }
+ }
+
+ for (i = 0; i < serial->num_ports; ++i) {
diff --git a/usb.current/usb-storage-when-a-device-returns-no-sense-data-call-it-a-hardware-error.patch b/usb.current/usb-storage-when-a-device-returns-no-sense-data-call-it-a-hardware-error.patch
new file mode 100644
index 00000000000000..01b9d12de04293
--- /dev/null
+++ b/usb.current/usb-storage-when-a-device-returns-no-sense-data-call-it-a-hardware-error.patch
@@ -0,0 +1,76 @@
+From stern@rowland.harvard.edu Fri Oct 9 11:44:56 2009
+From: Alan Stern <stern@rowland.harvard.edu>
+Date: Tue, 6 Oct 2009 14:07:57 -0400 (EDT)
+Subject: USB: storage: When a device returns no sense data, call it a Hardware Error
+To: Greg KH <greg@kroah.com>, Matthew Dharm <mdharm-usb@one-eyed-alien.net>
+Cc: USB Storage list <usb-storage@lists.one-eyed-alien.net>
+Message-ID: <Pine.LNX.4.44L0.0910061404310.3002-100000@iolanthe.rowland.org>
+
+
+This patch (as1294) fixes a problem that has plagued users for several
+kernel releases. Some USB mass-storage devices don't return any sense
+data when they encounter certain kinds of errors. The SCSI layer
+interprets this to mean that the operation should be retried, and the
+same thing happens -- over and over again with no limit. In some
+circumstances (such as when a bus reset occurs) that is the right
+thing to do, but not here.
+
+The patch checks for this condition (a transport failure with no sense
+data) and changes the result code to DID_ERROR and the sense code to
+Hardware Error. This does get only a limited number of retries, and
+so the command will fail relatively quickly instead of getting stuck
+in an infinite loop.
+
+This fixes a large part of Bugzilla #14118.
+
+Signed-off-by: Alan Stern <stern@rowland.harvard.edu>
+Tested-by: Mantas Mikulenas <grawity@gmail.com>
+CC: stable <stable@kernel.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/usb/storage/transport.c | 29 ++++++++++++++++++++++-------
+ 1 file changed, 22 insertions(+), 7 deletions(-)
+
+--- a/drivers/usb/storage/transport.c
++++ b/drivers/usb/storage/transport.c
+@@ -768,17 +768,32 @@ void usb_stor_invoke_transport(struct sc
+ /* set the result so the higher layers expect this data */
+ srb->result = SAM_STAT_CHECK_CONDITION;
+
+- /* If things are really okay, then let's show that. Zero
+- * out the sense buffer so the higher layers won't realize
+- * we did an unsolicited auto-sense. */
+- if (result == USB_STOR_TRANSPORT_GOOD &&
+- /* Filemark 0, ignore EOM, ILI 0, no sense */
++ /* We often get empty sense data. This could indicate that
++ * everything worked or that there was an unspecified
++ * problem. We have to decide which.
++ */
++ if ( /* Filemark 0, ignore EOM, ILI 0, no sense */
+ (srb->sense_buffer[2] & 0xaf) == 0 &&
+ /* No ASC or ASCQ */
+ srb->sense_buffer[12] == 0 &&
+ srb->sense_buffer[13] == 0) {
+- srb->result = SAM_STAT_GOOD;
+- srb->sense_buffer[0] = 0x0;
++
++ /* If things are really okay, then let's show that.
++ * Zero out the sense buffer so the higher layers
++ * won't realize we did an unsolicited auto-sense.
++ */
++ if (result == USB_STOR_TRANSPORT_GOOD) {
++ srb->result = SAM_STAT_GOOD;
++ srb->sense_buffer[0] = 0x0;
++
++ /* If there was a problem, report an unspecified
++ * hardware error to prevent the higher layers from
++ * entering an infinite retry loop.
++ */
++ } else {
++ srb->result = DID_ERROR << 16;
++ srb->sense_buffer[2] = HARDWARE_ERROR;
++ }
+ }
+ }
+
diff --git a/usb.current/usb-visor-fix-trivial-accounting-bug-in-visor-driver.patch b/usb.current/usb-visor-fix-trivial-accounting-bug-in-visor-driver.patch
new file mode 100644
index 00000000000000..4de9995c2dae6c
--- /dev/null
+++ b/usb.current/usb-visor-fix-trivial-accounting-bug-in-visor-driver.patch
@@ -0,0 +1,32 @@
+From oliver@neukum.org Fri Oct 9 11:42:55 2009
+From: Oliver Neukum <oliver@neukum.org>
+Date: Thu, 1 Oct 2009 14:54:46 +0200
+Subject: USB: visor: fix trivial accounting bug in visor driver
+To: "Greg Kroah-Hartman" <gregkh@suse.de>
+Message-ID: <200910011454.47038.oliver@neukum.org>
+Content-Disposition: inline
+
+
+usb:usbserial:visor: fix accounting in error case
+
+data not pushed to the tty layer due to an error mustn't be counted
+
+Signed-off-by: Oliver Neukum <oliver@neukum.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/usb/serial/visor.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+--- a/drivers/usb/serial/visor.c
++++ b/drivers/usb/serial/visor.c
+@@ -513,7 +513,8 @@ static void visor_read_bulk_callback(str
+ tty_kref_put(tty);
+ }
+ spin_lock(&priv->lock);
+- priv->bytes_in += available_room;
++ if (tty)
++ priv->bytes_in += available_room;
+
+ } else {
+ spin_lock(&priv->lock);