From: Greg Kroah-Hartman Date: Mon, 30 Jan 2012 23:08:36 +0000 (-0800) Subject: 3.2-stable patches X-Git-Tag: v3.0.19~13 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=21f4bee1ab5c294ba708c57cf83b707c10062778;p=thirdparty%2Fkernel%2Fstable-queue.git 3.2-stable patches added patches: usb-cdc-wdm-updating-desc-length-must-be-protected-by-spin_lock.patch usb-cdc-wdm-use-two-mutexes-to-allow-simultaneous-read-and-write.patch usb-ftdi_sio-add-more-identifiers.patch usb-ftdi_sio-add-pid-for-ti-xds100v2-beaglebone-a3.patch usb-ftdi_sio-fix-initial-baud-rate.patch usb-ftdi_sio-fix-tiocsserial-baud_base-handling.patch usb-option-add-lg-docomo-l-02c.patch usb-serial-ftdi-additional-ids.patch --- diff --git a/queue-3.2/series b/queue-3.2/series index 68857b0a846..deb0bd2b127 100644 --- a/queue-3.2/series +++ b/queue-3.2/series @@ -36,3 +36,11 @@ arm-7296-1-proc-v7.s-remove-harvard_cache-preprocessor-guards.patch sysfs-complain-bitterly-about-attempts-to-remove-files-from-nonexistent-directories.patch x86-xen-size-struct-xen_spinlock-to-always-fit-in-arch_spinlock_t.patch mpt2sas-removed-redundant-calling-of-_scsih_probe_devices-from-_scsih_probe.patch +usb-option-add-lg-docomo-l-02c.patch +usb-ftdi_sio-fix-tiocsserial-baud_base-handling.patch +usb-ftdi_sio-fix-initial-baud-rate.patch +usb-ftdi_sio-add-pid-for-ti-xds100v2-beaglebone-a3.patch +usb-serial-ftdi-additional-ids.patch +usb-ftdi_sio-add-more-identifiers.patch +usb-cdc-wdm-updating-desc-length-must-be-protected-by-spin_lock.patch +usb-cdc-wdm-use-two-mutexes-to-allow-simultaneous-read-and-write.patch diff --git a/queue-3.2/usb-cdc-wdm-updating-desc-length-must-be-protected-by-spin_lock.patch b/queue-3.2/usb-cdc-wdm-updating-desc-length-must-be-protected-by-spin_lock.patch new file mode 100644 index 00000000000..0799a3dc2a5 --- /dev/null +++ b/queue-3.2/usb-cdc-wdm-updating-desc-length-must-be-protected-by-spin_lock.patch @@ -0,0 +1,34 @@ +From c428b70c1e115c5649707a602742e34130d19428 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Bj=C3=B8rn=20Mork?= +Date: Mon, 16 Jan 2012 12:41:47 +0100 +Subject: USB: cdc-wdm: updating desc->length must be protected by spin_lock +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Bjørn Mork + +commit c428b70c1e115c5649707a602742e34130d19428 upstream. + +wdm_in_callback() will also touch this field, so we cannot change it without locking + +Signed-off-by: Bjørn Mork +Acked-by: Oliver Neukum +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/usb/class/cdc-wdm.c | 2 ++ + 1 file changed, 2 insertions(+) + +--- a/drivers/usb/class/cdc-wdm.c ++++ b/drivers/usb/class/cdc-wdm.c +@@ -467,7 +467,9 @@ retry: + for (i = 0; i < desc->length - cntr; i++) + desc->ubuf[i] = desc->ubuf[i + cntr]; + ++ spin_lock_irq(&desc->iuspin); + desc->length -= cntr; ++ spin_unlock_irq(&desc->iuspin); + /* in case we had outstanding data */ + if (!desc->length) + clear_bit(WDM_READ, &desc->flags); diff --git a/queue-3.2/usb-cdc-wdm-use-two-mutexes-to-allow-simultaneous-read-and-write.patch b/queue-3.2/usb-cdc-wdm-use-two-mutexes-to-allow-simultaneous-read-and-write.patch new file mode 100644 index 00000000000..50ee4e4b09d --- /dev/null +++ b/queue-3.2/usb-cdc-wdm-use-two-mutexes-to-allow-simultaneous-read-and-write.patch @@ -0,0 +1,175 @@ +From e8537bd2c4f325a4796da33564ddcef9489b7feb Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Bj=C3=B8rn=20Mork?= +Date: Mon, 16 Jan 2012 12:41:48 +0100 +Subject: USB: cdc-wdm: use two mutexes to allow simultaneous read and write +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Bjørn Mork + +commit e8537bd2c4f325a4796da33564ddcef9489b7feb upstream. + +using a separate read and write mutex for locking is sufficient to make the +driver accept simultaneous read and write. This improves useability a lot. + +Signed-off-by: Bjørn Mork +Cc: Oliver Neukum +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/usb/class/cdc-wdm.c | 49 +++++++++++++++++++++++++++----------------- + 1 file changed, 31 insertions(+), 18 deletions(-) + +--- a/drivers/usb/class/cdc-wdm.c ++++ b/drivers/usb/class/cdc-wdm.c +@@ -88,7 +88,8 @@ struct wdm_device { + int count; + dma_addr_t shandle; + dma_addr_t ihandle; +- struct mutex lock; ++ struct mutex wlock; ++ struct mutex rlock; + wait_queue_head_t wait; + struct work_struct rxwork; + int werr; +@@ -323,7 +324,7 @@ static ssize_t wdm_write + } + + /* concurrent writes and disconnect */ +- r = mutex_lock_interruptible(&desc->lock); ++ r = mutex_lock_interruptible(&desc->wlock); + rv = -ERESTARTSYS; + if (r) { + kfree(buf); +@@ -386,7 +387,7 @@ static ssize_t wdm_write + out: + usb_autopm_put_interface(desc->intf); + outnp: +- mutex_unlock(&desc->lock); ++ mutex_unlock(&desc->wlock); + outnl: + return rv < 0 ? rv : count; + } +@@ -399,7 +400,7 @@ static ssize_t wdm_read + struct wdm_device *desc = file->private_data; + + +- rv = mutex_lock_interruptible(&desc->lock); /*concurrent reads */ ++ rv = mutex_lock_interruptible(&desc->rlock); /*concurrent reads */ + if (rv < 0) + return -ERESTARTSYS; + +@@ -476,7 +477,7 @@ retry: + rv = cntr; + + err: +- mutex_unlock(&desc->lock); ++ mutex_unlock(&desc->rlock); + return rv; + } + +@@ -542,7 +543,8 @@ static int wdm_open(struct inode *inode, + } + intf->needs_remote_wakeup = 1; + +- mutex_lock(&desc->lock); ++ /* using write lock to protect desc->count */ ++ mutex_lock(&desc->wlock); + if (!desc->count++) { + desc->werr = 0; + desc->rerr = 0; +@@ -555,7 +557,7 @@ static int wdm_open(struct inode *inode, + } else { + rv = 0; + } +- mutex_unlock(&desc->lock); ++ mutex_unlock(&desc->wlock); + usb_autopm_put_interface(desc->intf); + out: + mutex_unlock(&wdm_mutex); +@@ -567,9 +569,11 @@ static int wdm_release(struct inode *ino + struct wdm_device *desc = file->private_data; + + mutex_lock(&wdm_mutex); +- mutex_lock(&desc->lock); ++ ++ /* using write lock to protect desc->count */ ++ mutex_lock(&desc->wlock); + desc->count--; +- mutex_unlock(&desc->lock); ++ mutex_unlock(&desc->wlock); + + if (!desc->count) { + dev_dbg(&desc->intf->dev, "wdm_release: cleanup"); +@@ -667,7 +671,8 @@ next_desc: + desc = kzalloc(sizeof(struct wdm_device), GFP_KERNEL); + if (!desc) + goto out; +- mutex_init(&desc->lock); ++ mutex_init(&desc->rlock); ++ mutex_init(&desc->wlock); + spin_lock_init(&desc->iuspin); + init_waitqueue_head(&desc->wait); + desc->wMaxCommand = maxcom; +@@ -781,10 +786,12 @@ static void wdm_disconnect(struct usb_in + /* to terminate pending flushes */ + clear_bit(WDM_IN_USE, &desc->flags); + spin_unlock_irqrestore(&desc->iuspin, flags); +- mutex_lock(&desc->lock); ++ mutex_lock(&desc->rlock); ++ mutex_lock(&desc->wlock); + kill_urbs(desc); + cancel_work_sync(&desc->rxwork); +- mutex_unlock(&desc->lock); ++ mutex_unlock(&desc->wlock); ++ mutex_unlock(&desc->rlock); + wake_up_all(&desc->wait); + if (!desc->count) + cleanup(desc); +@@ -800,8 +807,10 @@ static int wdm_suspend(struct usb_interf + dev_dbg(&desc->intf->dev, "wdm%d_suspend\n", intf->minor); + + /* if this is an autosuspend the caller does the locking */ +- if (!PMSG_IS_AUTO(message)) +- mutex_lock(&desc->lock); ++ if (!PMSG_IS_AUTO(message)) { ++ mutex_lock(&desc->rlock); ++ mutex_lock(&desc->wlock); ++ } + spin_lock_irq(&desc->iuspin); + + if (PMSG_IS_AUTO(message) && +@@ -817,8 +826,10 @@ static int wdm_suspend(struct usb_interf + kill_urbs(desc); + cancel_work_sync(&desc->rxwork); + } +- if (!PMSG_IS_AUTO(message)) +- mutex_unlock(&desc->lock); ++ if (!PMSG_IS_AUTO(message)) { ++ mutex_unlock(&desc->wlock); ++ mutex_unlock(&desc->rlock); ++ } + + return rv; + } +@@ -856,7 +867,8 @@ static int wdm_pre_reset(struct usb_inte + { + struct wdm_device *desc = usb_get_intfdata(intf); + +- mutex_lock(&desc->lock); ++ mutex_lock(&desc->rlock); ++ mutex_lock(&desc->wlock); + kill_urbs(desc); + + /* +@@ -878,7 +890,8 @@ static int wdm_post_reset(struct usb_int + int rv; + + rv = recover_from_urb_loss(desc); +- mutex_unlock(&desc->lock); ++ mutex_unlock(&desc->wlock); ++ mutex_unlock(&desc->rlock); + return 0; + } + diff --git a/queue-3.2/usb-ftdi_sio-add-more-identifiers.patch b/queue-3.2/usb-ftdi_sio-add-more-identifiers.patch new file mode 100644 index 00000000000..6accda3989b --- /dev/null +++ b/queue-3.2/usb-ftdi_sio-add-more-identifiers.patch @@ -0,0 +1,44 @@ +From 2353f806c97020d4c7709f15eebb49b591f7306d Mon Sep 17 00:00:00 2001 +From: Alan Cox +Date: Thu, 26 Jan 2012 17:41:34 +0000 +Subject: USB: ftdi_sio: Add more identifiers + +From: Alan Cox + +commit 2353f806c97020d4c7709f15eebb49b591f7306d upstream. + +0x04d8, 0x000a: Hornby Elite + +Signed-off-by: Alan Cox +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/usb/serial/ftdi_sio.c | 1 + + drivers/usb/serial/ftdi_sio_ids.h | 6 ++++++ + 2 files changed, 7 insertions(+) + +--- a/drivers/usb/serial/ftdi_sio.c ++++ b/drivers/usb/serial/ftdi_sio.c +@@ -797,6 +797,7 @@ static struct usb_device_id id_table_com + .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, + { USB_DEVICE(ADI_VID, ADI_GNICEPLUS_PID), + .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, ++ { USB_DEVICE(HORNBY_VID, HORNBY_ELITE_PID) }, + { USB_DEVICE(JETI_VID, JETI_SPC1201_PID) }, + { USB_DEVICE(MARVELL_VID, MARVELL_SHEEVAPLUG_PID), + .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, +--- a/drivers/usb/serial/ftdi_sio_ids.h ++++ b/drivers/usb/serial/ftdi_sio_ids.h +@@ -532,6 +532,12 @@ + #define ADI_GNICEPLUS_PID 0xF001 + + /* ++ * Hornby Elite ++ */ ++#define HORNBY_VID 0x04D8 ++#define HORNBY_ELITE_PID 0x000A ++ ++/* + * RATOC REX-USB60F + */ + #define RATOC_VENDOR_ID 0x0584 diff --git a/queue-3.2/usb-ftdi_sio-add-pid-for-ti-xds100v2-beaglebone-a3.patch b/queue-3.2/usb-ftdi_sio-add-pid-for-ti-xds100v2-beaglebone-a3.patch new file mode 100644 index 00000000000..3e5cc14fbd6 --- /dev/null +++ b/queue-3.2/usb-ftdi_sio-add-pid-for-ti-xds100v2-beaglebone-a3.patch @@ -0,0 +1,46 @@ +From 55f13aeae0346f0c89bfface91ad9a97653dc433 Mon Sep 17 00:00:00 2001 +From: Peter Korsgaard +Date: Wed, 18 Jan 2012 23:43:45 +0100 +Subject: USB: ftdi_sio: add PID for TI XDS100v2 / BeagleBone A3 + +From: Peter Korsgaard + +commit 55f13aeae0346f0c89bfface91ad9a97653dc433 upstream. + +Port A for JTAG, port B for serial. + +Signed-off-by: Peter Korsgaard +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/usb/serial/ftdi_sio.c | 2 ++ + drivers/usb/serial/ftdi_sio_ids.h | 7 +++++++ + 2 files changed, 9 insertions(+) + +--- a/drivers/usb/serial/ftdi_sio.c ++++ b/drivers/usb/serial/ftdi_sio.c +@@ -805,6 +805,8 @@ static struct usb_device_id id_table_com + { USB_DEVICE(BAYER_VID, BAYER_CONTOUR_CABLE_PID) }, + { USB_DEVICE(FTDI_VID, MARVELL_OPENRD_PID), + .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, ++ { USB_DEVICE(FTDI_VID, TI_XDS100V2_PID), ++ .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, + { USB_DEVICE(FTDI_VID, HAMEG_HO820_PID) }, + { USB_DEVICE(FTDI_VID, HAMEG_HO720_PID) }, + { USB_DEVICE(FTDI_VID, HAMEG_HO730_PID) }, +--- a/drivers/usb/serial/ftdi_sio_ids.h ++++ b/drivers/usb/serial/ftdi_sio_ids.h +@@ -39,6 +39,13 @@ + /* www.candapter.com Ewert Energy Systems CANdapter device */ + #define FTDI_CANDAPTER_PID 0x9F80 /* Product Id */ + ++/* ++ * Texas Instruments XDS100v2 JTAG / BeagleBone A3 ++ * http://processors.wiki.ti.com/index.php/XDS100 ++ * http://beagleboard.org/bone ++ */ ++#define TI_XDS100V2_PID 0xa6d0 ++ + #define FTDI_NXTCAM_PID 0xABB8 /* NXTCam for Mindstorms NXT */ + + /* US Interface Navigator (http://www.usinterface.com/) */ diff --git a/queue-3.2/usb-ftdi_sio-fix-initial-baud-rate.patch b/queue-3.2/usb-ftdi_sio-fix-initial-baud-rate.patch new file mode 100644 index 00000000000..11e518fc635 --- /dev/null +++ b/queue-3.2/usb-ftdi_sio-fix-initial-baud-rate.patch @@ -0,0 +1,47 @@ +From 108e02b12921078a59dcacd048079ece48a4a983 Mon Sep 17 00:00:00 2001 +From: Johan Hovold +Date: Wed, 18 Jan 2012 01:46:00 +0100 +Subject: USB: ftdi_sio: fix initial baud rate + +From: Johan Hovold + +commit 108e02b12921078a59dcacd048079ece48a4a983 upstream. + +Fix regression introduced by commit b1ffb4c851f1 ("USB: Fix Corruption +issue in USB ftdi driver ftdi_sio.c") which caused the termios settings +to no longer be initialised at open. Consequently it was no longer +possible to set the port to the default speed of 9600 baud without first +changing to another baud rate and back again. + +Reported-by: Roland Ramthun +Signed-off-by: Johan Hovold +Tested-by: Roland Ramthun +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/usb/serial/ftdi_sio.c | 7 +++++-- + 1 file changed, 5 insertions(+), 2 deletions(-) + +--- a/drivers/usb/serial/ftdi_sio.c ++++ b/drivers/usb/serial/ftdi_sio.c +@@ -1823,6 +1823,7 @@ static int ftdi_sio_port_remove(struct u + + static int ftdi_open(struct tty_struct *tty, struct usb_serial_port *port) + { ++ struct ktermios dummy; + struct usb_device *dev = port->serial->dev; + struct ftdi_private *priv = usb_get_serial_port_data(port); + int result; +@@ -1841,8 +1842,10 @@ static int ftdi_open(struct tty_struct * + This is same behaviour as serial.c/rs_open() - Kuba */ + + /* ftdi_set_termios will send usb control messages */ +- if (tty) +- ftdi_set_termios(tty, port, tty->termios); ++ if (tty) { ++ memset(&dummy, 0, sizeof(dummy)); ++ ftdi_set_termios(tty, port, &dummy); ++ } + + /* Start reading from the device */ + result = usb_serial_generic_open(tty, port); diff --git a/queue-3.2/usb-ftdi_sio-fix-tiocsserial-baud_base-handling.patch b/queue-3.2/usb-ftdi_sio-fix-tiocsserial-baud_base-handling.patch new file mode 100644 index 00000000000..77eb3e2f0ce --- /dev/null +++ b/queue-3.2/usb-ftdi_sio-fix-tiocsserial-baud_base-handling.patch @@ -0,0 +1,39 @@ +From eb833a9e0972f60beb4ab8104ad7ef6bf30f02fc Mon Sep 17 00:00:00 2001 +From: Johan Hovold +Date: Tue, 10 Jan 2012 23:33:37 +0100 +Subject: USB: ftdi_sio: fix TIOCSSERIAL baud_base handling +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Johan Hovold + +commit eb833a9e0972f60beb4ab8104ad7ef6bf30f02fc upstream. + +Return EINVAL if new baud_base does not match the current one. + +The baud_base is device specific and can not be changed. This restores +the old (pre-2005) behaviour which was changed due to a +misunderstanding regarding this fact (see +https://lkml.org/lkml/2005/1/20/84). + +Reported-by: Torbjörn Lofterud +Signed-off-by: Johan Hovold +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/usb/serial/ftdi_sio.c | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +--- a/drivers/usb/serial/ftdi_sio.c ++++ b/drivers/usb/serial/ftdi_sio.c +@@ -1333,8 +1333,7 @@ static int set_serial_info(struct tty_st + goto check_and_exit; + } + +- if ((new_serial.baud_base != priv->baud_base) && +- (new_serial.baud_base < 9600)) { ++ if (new_serial.baud_base != priv->baud_base) { + mutex_unlock(&priv->cfg_lock); + return -EINVAL; + } diff --git a/queue-3.2/usb-option-add-lg-docomo-l-02c.patch b/queue-3.2/usb-option-add-lg-docomo-l-02c.patch new file mode 100644 index 00000000000..5b00892f2e6 --- /dev/null +++ b/queue-3.2/usb-option-add-lg-docomo-l-02c.patch @@ -0,0 +1,39 @@ +From e423d7401fd0717cb56a6cf51dd8341cc3e800d2 Mon Sep 17 00:00:00 2001 +From: Kentaro Matsuyama +Date: Thu, 12 Jan 2012 23:07:51 +0900 +Subject: USB: option: Add LG docomo L-02C + +From: Kentaro Matsuyama + +commit e423d7401fd0717cb56a6cf51dd8341cc3e800d2 upstream. + +Add vendor and product ID for USB 3G/LTE modem of docomo L-02C + +Signed-off-by: Kentaro Matsuyama +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/usb/serial/option.c | 5 +++++ + 1 file changed, 5 insertions(+) + +--- a/drivers/usb/serial/option.c ++++ b/drivers/usb/serial/option.c +@@ -480,6 +480,10 @@ static void option_instat_callback(struc + #define ZD_VENDOR_ID 0x0685 + #define ZD_PRODUCT_7000 0x7000 + ++/* LG products */ ++#define LG_VENDOR_ID 0x1004 ++#define LG_PRODUCT_L02C 0x618f ++ + /* some devices interfaces need special handling due to a number of reasons */ + enum option_blacklist_reason { + OPTION_BLACKLIST_NONE = 0, +@@ -1183,6 +1187,7 @@ static const struct usb_device_id option + { USB_DEVICE(YUGA_VENDOR_ID, YUGA_PRODUCT_CLU526) }, + { USB_DEVICE_AND_INTERFACE_INFO(VIETTEL_VENDOR_ID, VIETTEL_PRODUCT_VT1000, 0xff, 0xff, 0xff) }, + { USB_DEVICE_AND_INTERFACE_INFO(ZD_VENDOR_ID, ZD_PRODUCT_7000, 0xff, 0xff, 0xff) }, ++ { USB_DEVICE(LG_VENDOR_ID, LG_PRODUCT_L02C) }, /* docomo L-02C modem */ + { } /* Terminating entry */ + }; + MODULE_DEVICE_TABLE(usb, option_ids); diff --git a/queue-3.2/usb-serial-ftdi-additional-ids.patch b/queue-3.2/usb-serial-ftdi-additional-ids.patch new file mode 100644 index 00000000000..9efc770b481 --- /dev/null +++ b/queue-3.2/usb-serial-ftdi-additional-ids.patch @@ -0,0 +1,45 @@ +From fc216ec363f4d174932df90bbf35c77d0540e561 Mon Sep 17 00:00:00 2001 +From: Peter Naulls +Date: Tue, 17 Jan 2012 18:27:09 -0800 +Subject: USB: serial: ftdi additional IDs + +From: Peter Naulls + +commit fc216ec363f4d174932df90bbf35c77d0540e561 upstream. + +I tested this against 2.6.39 in the Ubuntu kernel, however I see the IDs +are not in latest 3.2 git. + +This adds IDs for the FTDI controller in the Rainforest Automation +Zigbee dongle. + +Signed-off-by: Peter Naulls +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/usb/serial/ftdi_sio.c | 1 + + drivers/usb/serial/ftdi_sio_ids.h | 6 ++++++ + 2 files changed, 7 insertions(+) + +--- a/drivers/usb/serial/ftdi_sio.c ++++ b/drivers/usb/serial/ftdi_sio.c +@@ -843,6 +843,7 @@ static struct usb_device_id id_table_com + .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, + { USB_DEVICE(ST_VID, ST_STMCLT1030_PID), + .driver_info = (kernel_ulong_t)&ftdi_stmclite_quirk }, ++ { USB_DEVICE(FTDI_VID, FTDI_RF_R106) }, + { }, /* Optional parameter entry */ + { } /* Terminating entry */ + }; +--- a/drivers/usb/serial/ftdi_sio_ids.h ++++ b/drivers/usb/serial/ftdi_sio_ids.h +@@ -1175,3 +1175,9 @@ + */ + /* TagTracer MIFARE*/ + #define FTDI_ZEITCONTROL_TAGTRACE_MIFARE_PID 0xF7C0 ++ ++/* ++ * Rainforest Automation ++ */ ++/* ZigBee controller */ ++#define FTDI_RF_R106 0x8A28