diff options
| author | Greg Kroah-Hartman <gregkh@suse.de> | 2009-10-09 12:14:45 -0700 |
|---|---|---|
| committer | Greg Kroah-Hartman <gregkh@suse.de> | 2009-10-09 12:14:45 -0700 |
| commit | 510643efadd98b858a3e20543c3b7386caddc0c7 (patch) | |
| tree | 2361ba0b0ed9a505e2ee7fe83b075a7b42eacbb5 /usb.current | |
| parent | dea9eda94b232e743051c47c18398910c8235592 (diff) | |
| download | patches-510643efadd98b858a3e20543c3b7386caddc0c7.tar.gz | |
more usb fixes
Diffstat (limited to 'usb.current')
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); |
