usb-xhci-clear-warm-reset-change-event-during-init.patch
usb-xhci-fix-lockdep-warning-on-endpoint-timeout.patch
usb-xhci-resume-root-hubs-when-the-controller-resumes.patch
+usb-option-release-new-pid-for-zte-3g-modem.patch
+usb-option-add-pid-of-huawei-e173s-3g-modem.patch
+usb-serial-pl2303-rm-duplicate-id.patch
+usb-cdc-acm-fix-disconnect-vs-close-race.patch
+usb-workaround-for-bug-in-old-version-of-gcc.patch
+usb-ark3116-initialisation-fix.patch
+usb-fix-corruption-issue-in-usb-ftdi-driver-ftdi_sio.c.patch
+usb-storage-accept-8020i-protocol-commands-longer-than-12-bytes.patch
+usb-ehci-fix-hub-tt-scheduling-issue-with-iso-transfer.patch
+usb-add-quirk-for-logitech-c600-web-cam.patch
+usb-quirks-adding-more-quirky-webcams-to-avoid-squeaky-audio.patch
--- /dev/null
+From 60c71ca972a2dd3fd9d0165b405361c8ad48349b Mon Sep 17 00:00:00 2001
+From: Josh Boyer <jwboyer@redhat.com>
+Date: Wed, 26 Oct 2011 13:53:17 -0400
+Subject: USB: add quirk for Logitech C600 web cam
+
+From: Josh Boyer <jwboyer@redhat.com>
+
+commit 60c71ca972a2dd3fd9d0165b405361c8ad48349b upstream.
+
+We've had another report of the "chipmunk" sound on a Logitech C600 webcam.
+This patch resolves the issue.
+
+Signed-off-by: Josh Boyer <jwboyer@redhat.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/usb/core/quirks.c | 3 +++
+ 1 file changed, 3 insertions(+)
+
+--- a/drivers/usb/core/quirks.c
++++ b/drivers/usb/core/quirks.c
+@@ -50,6 +50,9 @@ static const struct usb_device_id usb_qu
+ /* Logitech Webcam B/C500 */
+ { USB_DEVICE(0x046d, 0x0807), .driver_info = USB_QUIRK_RESET_RESUME },
+
++ /* Logitech Webcam C600 */
++ { USB_DEVICE(0x046d, 0x0808), .driver_info = USB_QUIRK_RESET_RESUME },
++
+ /* Logitech Webcam Pro 9000 */
+ { USB_DEVICE(0x046d, 0x0809), .driver_info = USB_QUIRK_RESET_RESUME },
+
--- /dev/null
+From 583182ba5f02c8c9be82ea550f2051eaec15b975 Mon Sep 17 00:00:00 2001
+From: Bart Hartgers <bart.hartgers@gmail.com>
+Date: Wed, 26 Oct 2011 13:29:42 +0200
+Subject: USB: ark3116 initialisation fix
+
+From: Bart Hartgers <bart.hartgers@gmail.com>
+
+commit 583182ba5f02c8c9be82ea550f2051eaec15b975 upstream.
+
+This patch for the usb serial ark3116 driver fixes an initialisation
+ordering bug that gets triggered on hotplug when using at least recent
+debian/ubuntu userspace. Without it, ark3116 serial cables don't work.
+
+Signed-off-by: Bart Hartgers <bart.hartgers@gmail.com>
+Tested-by: law_ence.dev@ntlworld.com
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/usb/serial/ark3116.c | 10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
+
+--- a/drivers/usb/serial/ark3116.c
++++ b/drivers/usb/serial/ark3116.c
+@@ -42,7 +42,7 @@ static int debug;
+ * Version information
+ */
+
+-#define DRIVER_VERSION "v0.6"
++#define DRIVER_VERSION "v0.7"
+ #define DRIVER_AUTHOR "Bart Hartgers <bart.hartgers+ark3116@gmail.com>"
+ #define DRIVER_DESC "USB ARK3116 serial/IrDA driver"
+ #define DRIVER_DEV_DESC "ARK3116 RS232/IrDA"
+@@ -380,10 +380,6 @@ static int ark3116_open(struct tty_struc
+ goto err_out;
+ }
+
+- /* setup termios */
+- if (tty)
+- ark3116_set_termios(tty, port, NULL);
+-
+ /* remove any data still left: also clears error state */
+ ark3116_read_reg(serial, UART_RX, buf);
+
+@@ -406,6 +402,10 @@ static int ark3116_open(struct tty_struc
+ /* enable DMA */
+ ark3116_write_reg(port->serial, UART_FCR, UART_FCR_DMA_SELECT);
+
++ /* setup termios */
++ if (tty)
++ ark3116_set_termios(tty, port, NULL);
++
+ err_out:
+ kfree(buf);
+ return result;
--- /dev/null
+From 5dc2470c602da8851907ec18942cd876c3b4ecc1 Mon Sep 17 00:00:00 2001
+From: Havard Skinnemoen <hskinnemoen@google.com>
+Date: Wed, 9 Nov 2011 13:47:38 -0800
+Subject: USB: cdc-acm: Fix disconnect() vs close() race
+
+From: Havard Skinnemoen <hskinnemoen@google.com>
+
+commit 5dc2470c602da8851907ec18942cd876c3b4ecc1 upstream.
+
+There's a race between the USB disconnect handler and the TTY close
+handler which may cause the acm object to be freed while it's still
+being used. This may lead to things like
+
+http://article.gmane.org/gmane.linux.usb.general/54250
+
+and
+
+https://lkml.org/lkml/2011/5/29/64
+
+This is the simplest fix I could come up with. Holding on to open_mutex
+while closing the TTY device prevents acm_disconnect() from freeing the
+acm object between acm->port.count drops to 0 and the TTY side of the
+cleanups are finalized.
+
+Signed-off-by: Havard Skinnemoen <hskinnemoen@google.com>
+Cc: Oliver Neukum <oliver@neukum.name>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/usb/class/cdc-acm.c | 8 +++++---
+ 1 file changed, 5 insertions(+), 3 deletions(-)
+
+--- a/drivers/usb/class/cdc-acm.c
++++ b/drivers/usb/class/cdc-acm.c
+@@ -539,7 +539,6 @@ static void acm_port_down(struct acm *ac
+ {
+ int i;
+
+- mutex_lock(&open_mutex);
+ if (acm->dev) {
+ usb_autopm_get_interface(acm->control);
+ acm_set_control(acm, acm->ctrlout = 0);
+@@ -551,14 +550,15 @@ static void acm_port_down(struct acm *ac
+ acm->control->needs_remote_wakeup = 0;
+ usb_autopm_put_interface(acm->control);
+ }
+- mutex_unlock(&open_mutex);
+ }
+
+ static void acm_tty_hangup(struct tty_struct *tty)
+ {
+ struct acm *acm = tty->driver_data;
+ tty_port_hangup(&acm->port);
++ mutex_lock(&open_mutex);
+ acm_port_down(acm);
++ mutex_unlock(&open_mutex);
+ }
+
+ static void acm_tty_close(struct tty_struct *tty, struct file *filp)
+@@ -569,8 +569,9 @@ static void acm_tty_close(struct tty_str
+ shutdown */
+ if (!acm)
+ return;
++
++ mutex_lock(&open_mutex);
+ if (tty_port_close_start(&acm->port, tty, filp) == 0) {
+- mutex_lock(&open_mutex);
+ if (!acm->dev) {
+ tty_port_tty_set(&acm->port, NULL);
+ acm_tty_unregister(acm);
+@@ -582,6 +583,7 @@ static void acm_tty_close(struct tty_str
+ acm_port_down(acm);
+ tty_port_close_end(&acm->port, tty);
+ tty_port_tty_set(&acm->port, NULL);
++ mutex_unlock(&open_mutex);
+ }
+
+ static int acm_tty_write(struct tty_struct *tty,
--- /dev/null
+From 811c926c538f7e8d3c08b630dd5844efd7e000f6 Mon Sep 17 00:00:00 2001
+From: Thomas Poussevin <thomas.poussevin@parrot.com>
+Date: Thu, 27 Oct 2011 18:46:48 +0200
+Subject: USB: EHCI: fix HUB TT scheduling issue with iso transfer
+
+From: Thomas Poussevin <thomas.poussevin@parrot.com>
+
+commit 811c926c538f7e8d3c08b630dd5844efd7e000f6 upstream.
+
+The current TT scheduling doesn't allow to play and then record on a
+full-speed device connected to a high speed hub.
+
+The IN iso stream can only start on the first uframe (0-2 for a 165 us)
+because of CSPLIT transactions.
+For the OUT iso stream there no such restriction. uframe 0-5 are possible.
+
+The idea of this patch is that the first uframe are precious (for IN TT iso
+stream) and we should allocate the last uframes first if possible.
+
+For that we reverse the order of uframe allocation (last uframe first).
+
+Here an example :
+
+hid interrupt stream
+----------------------------------------------------------------------
+uframe | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
+----------------------------------------------------------------------
+max_tt_usecs | 125 | 125 | 125 | 125 | 125 | 125 | 30 | 0 |
+----------------------------------------------------------------------
+used usecs on a frame | 13 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
+----------------------------------------------------------------------
+
+iso OUT stream
+----------------------------------------------------------------------
+uframe | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
+----------------------------------------------------------------------
+max_tt_usecs | 125 | 125 | 125 | 125 | 125 | 125 | 30 | 0 |
+----------------------------------------------------------------------
+used usecs on a frame | 13 | 125 | 39 | 0 | 0 | 0 | 0 | 0 |
+----------------------------------------------------------------------
+
+There no place for iso IN stream (uframe 0-2 are used) and we got "cannot
+submit datapipe for urb 0, error -28: not enough bandwidth" error.
+
+With the patch this become.
+
+iso OUT stream
+----------------------------------------------------------------------
+uframe | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
+----------------------------------------------------------------------
+max_tt_usecs | 125 | 125 | 125 | 125 | 125 | 125 | 30 | 0 |
+----------------------------------------------------------------------
+used usecs on a frame | 13 | 0 | 0 | 0 | 125 | 39 | 0 | 0 |
+----------------------------------------------------------------------
+
+iso IN stream
+----------------------------------------------------------------------
+uframe | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
+----------------------------------------------------------------------
+max_tt_usecs | 125 | 125 | 125 | 125 | 125 | 125 | 30 | 0 |
+----------------------------------------------------------------------
+used usecs on a frame | 13 | 0 | 125 | 40 | 125 | 39 | 0 | 0 |
+----------------------------------------------------------------------
+
+Signed-off-by: Matthieu Castet <matthieu.castet@parrot.com>
+Signed-off-by: Thomas Poussevin <thomas.poussevin@parrot.com>
+Signed-off-by: Alan Stern <stern@rowland.harvard.edu>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/usb/host/ehci-sched.c | 15 ++++++++++-----
+ 1 file changed, 10 insertions(+), 5 deletions(-)
+
+--- a/drivers/usb/host/ehci-sched.c
++++ b/drivers/usb/host/ehci-sched.c
+@@ -1483,10 +1483,15 @@ iso_stream_schedule (
+
+ /* NOTE: assumes URB_ISO_ASAP, to limit complexity/bugs */
+
+- /* find a uframe slot with enough bandwidth */
+- next = start + period;
+- for (; start < next; start++) {
+-
++ /* find a uframe slot with enough bandwidth.
++ * Early uframes are more precious because full-speed
++ * iso IN transfers can't use late uframes,
++ * and therefore they should be allocated last.
++ */
++ next = start;
++ start += period;
++ do {
++ start--;
+ /* check schedule: enough space? */
+ if (stream->highspeed) {
+ if (itd_slot_ok(ehci, mod, start,
+@@ -1499,7 +1504,7 @@ iso_stream_schedule (
+ start, sched, period))
+ break;
+ }
+- }
++ } while (start > next);
+
+ /* no room in the schedule */
+ if (start == next) {
--- /dev/null
+From b1ffb4c851f185e9051ba837c16d9b84ef688d26 Mon Sep 17 00:00:00 2001
+From: Andrew Worsley <amworsley@gmail.com>
+Date: Fri, 18 Nov 2011 23:13:33 +1100
+Subject: USB: Fix Corruption issue in USB ftdi driver ftdi_sio.c
+
+From: Andrew Worsley <amworsley@gmail.com>
+
+commit b1ffb4c851f185e9051ba837c16d9b84ef688d26 upstream.
+
+Fix for ftdi_set_termios() glitching output
+
+ftdi_set_termios() is constantly setting the baud rate, data bits and parity
+unnecessarily on every call, . When called while characters are being
+transmitted can cause the FTDI chip to corrupt the serial port bit stream
+output by stalling the output half a bit during the output of a character.
+Simple fix by skipping this setting if the baud rate/data bits/parity are
+unchanged.
+
+Signed-off-by: Andrew Worsley <amworsley@gmail.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/usb/serial/ftdi_sio.c | 14 +++++++++++---
+ 1 file changed, 11 insertions(+), 3 deletions(-)
+
+--- a/drivers/usb/serial/ftdi_sio.c
++++ b/drivers/usb/serial/ftdi_sio.c
+@@ -2080,13 +2080,19 @@ static void ftdi_set_termios(struct tty_
+
+ cflag = termios->c_cflag;
+
+- /* FIXME -For this cut I don't care if the line is really changing or
+- not - so just do the change regardless - should be able to
+- compare old_termios and tty->termios */
++ if (old_termios->c_cflag == termios->c_cflag
++ && old_termios->c_ispeed == termios->c_ispeed
++ && old_termios->c_ospeed == termios->c_ospeed)
++ goto no_c_cflag_changes;
++
+ /* NOTE These routines can get interrupted by
+ ftdi_sio_read_bulk_callback - need to examine what this means -
+ don't see any problems yet */
+
++ if ((old_termios->c_cflag & (CSIZE|PARODD|PARENB|CMSPAR|CSTOPB)) ==
++ (termios->c_cflag & (CSIZE|PARODD|PARENB|CMSPAR|CSTOPB)))
++ goto no_data_parity_stop_changes;
++
+ /* Set number of data bits, parity, stop bits */
+
+ urb_value = 0;
+@@ -2127,6 +2133,7 @@ static void ftdi_set_termios(struct tty_
+ }
+
+ /* Now do the baudrate */
++no_data_parity_stop_changes:
+ if ((cflag & CBAUD) == B0) {
+ /* Disable flow control */
+ if (usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
+@@ -2154,6 +2161,7 @@ static void ftdi_set_termios(struct tty_
+
+ /* Set flow control */
+ /* Note device also supports DTR/CD (ugh) and Xon/Xoff in hardware */
++no_c_cflag_changes:
+ if (cflag & CRTSCTS) {
+ dbg("%s Setting to CRTSCTS flow control", __func__);
+ if (usb_control_msg(dev,
--- /dev/null
+From 4aa3648c719265bac9c2742c9ebb043e6dbdd790 Mon Sep 17 00:00:00 2001
+From: Ferenc Wagner <wferi@niif.hu>
+Date: Thu, 17 Nov 2011 16:44:58 +0100
+Subject: USB: option: add PID of Huawei E173s 3G modem
+
+From: Ferenc Wagner <wferi@niif.hu>
+
+commit 4aa3648c719265bac9c2742c9ebb043e6dbdd790 upstream.
+
+Signed-off-by: Ferenc Wagner <wferi@niif.hu>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/usb/serial/option.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+--- a/drivers/usb/serial/option.c
++++ b/drivers/usb/serial/option.c
+@@ -156,6 +156,7 @@ static void option_instat_callback(struc
+ #define HUAWEI_PRODUCT_K4511 0x14CC
+ #define HUAWEI_PRODUCT_ETS1220 0x1803
+ #define HUAWEI_PRODUCT_E353 0x1506
++#define HUAWEI_PRODUCT_E173S 0x1C05
+
+ #define QUANTA_VENDOR_ID 0x0408
+ #define QUANTA_PRODUCT_Q101 0xEA02
+@@ -637,6 +638,7 @@ static const struct usb_device_id option
+ { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E143D, 0xff, 0xff, 0xff) },
+ { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E143E, 0xff, 0xff, 0xff) },
+ { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E143F, 0xff, 0xff, 0xff) },
++ { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E173S, 0xff, 0xff, 0xff) },
+ { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K4505, 0xff, 0xff, 0xff),
+ .driver_info = (kernel_ulong_t) &huawei_cdc12_blacklist },
+ { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K3765, 0xff, 0xff, 0xff),
--- /dev/null
+From 46b5a277ed90317a4d17e936c16037e76011b219 Mon Sep 17 00:00:00 2001
+From: "zheng.zhijian@zte.com.cn" <zheng.zhijian@zte.com.cn>
+Date: Thu, 17 Nov 2011 19:23:25 +0800
+Subject: USB: option: release new PID for ZTE 3G modem
+
+From: "zheng.zhijian@zte.com.cn" <zheng.zhijian@zte.com.cn>
+
+commit 46b5a277ed90317a4d17e936c16037e76011b219 upstream.
+
+This patch adds new PIDs for ZTE 3G modem, after we confirm it and tested.
+Thanks for Dan's work at kernel option devier.
+
+Signed-off-by: Alvin.Zheng <zheng.zhijian@zte.com.cn>
+Signed-off-by: wsalvin <wsalvin@yahoo.com.cn>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/usb/serial/option.c | 21 +++++++++++++++++++++
+ 1 file changed, 21 insertions(+)
+
+--- a/drivers/usb/serial/option.c
++++ b/drivers/usb/serial/option.c
+@@ -316,6 +316,9 @@ static void option_instat_callback(struc
+ #define ZTE_PRODUCT_AC8710 0xfff1
+ #define ZTE_PRODUCT_AC2726 0xfff5
+ #define ZTE_PRODUCT_AC8710T 0xffff
++#define ZTE_PRODUCT_MC2718 0xffe8
++#define ZTE_PRODUCT_AD3812 0xffeb
++#define ZTE_PRODUCT_MC2716 0xffed
+
+ #define BENQ_VENDOR_ID 0x04a5
+ #define BENQ_PRODUCT_H10 0x4068
+@@ -500,6 +503,18 @@ static const struct option_blacklist_inf
+ .reserved = BIT(4),
+ };
+
++static const struct option_blacklist_info zte_ad3812_z_blacklist = {
++ .sendsetup = BIT(0) | BIT(1) | BIT(2),
++};
++
++static const struct option_blacklist_info zte_mc2718_z_blacklist = {
++ .sendsetup = BIT(1) | BIT(2) | BIT(3) | BIT(4),
++};
++
++static const struct option_blacklist_info zte_mc2716_z_blacklist = {
++ .sendsetup = BIT(1) | BIT(2) | BIT(3),
++};
++
+ static const struct option_blacklist_info huawei_cdc12_blacklist = {
+ .reserved = BIT(1) | BIT(2),
+ };
+@@ -1043,6 +1058,12 @@ static const struct usb_device_id option
+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_AC8710, 0xff, 0xff, 0xff) },
+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_AC2726, 0xff, 0xff, 0xff) },
+ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_AC8710T, 0xff, 0xff, 0xff) },
++ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_MC2718, 0xff, 0xff, 0xff),
++ .driver_info = (kernel_ulong_t)&zte_mc2718_z_blacklist },
++ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_AD3812, 0xff, 0xff, 0xff),
++ .driver_info = (kernel_ulong_t)&zte_ad3812_z_blacklist },
++ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_MC2716, 0xff, 0xff, 0xff),
++ .driver_info = (kernel_ulong_t)&zte_mc2716_z_blacklist },
+ { USB_DEVICE(BENQ_VENDOR_ID, BENQ_PRODUCT_H10) },
+ { USB_DEVICE(DLINK_VENDOR_ID, DLINK_PRODUCT_DWM_652) },
+ { USB_DEVICE(ALINK_VENDOR_ID, DLINK_PRODUCT_DWM_652_U5) }, /* Yes, ALINK_VENDOR_ID */
--- /dev/null
+From 0d145d7d4a241c321c832a810bb6edad18e2217b Mon Sep 17 00:00:00 2001
+From: sordna <sordna@gmail.com>
+Date: Thu, 27 Oct 2011 21:06:26 -0700
+Subject: USB: quirks: adding more quirky webcams to avoid squeaky audio
+
+From: sordna <sordna@gmail.com>
+
+commit 0d145d7d4a241c321c832a810bb6edad18e2217b upstream.
+
+The following patch contains additional affected webcam models, on top of the
+patches commited to linux-next 2394d67e446bf616a0885167d5f0d397bdacfdfc
+and 5b253d88cc6c65a23cefc457a5a4ef139913c5fc
+
+Signed-off-by: sordna <sordna@gmail.com>
+Cc: Oliver Neukum <oliver@neukum.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/usb/core/quirks.c | 24 ++++++++++++++++++++++++
+ 1 file changed, 24 insertions(+)
+
+--- a/drivers/usb/core/quirks.c
++++ b/drivers/usb/core/quirks.c
+@@ -56,12 +56,36 @@ static const struct usb_device_id usb_qu
+ /* Logitech Webcam Pro 9000 */
+ { USB_DEVICE(0x046d, 0x0809), .driver_info = USB_QUIRK_RESET_RESUME },
+
++ /* Logitech Webcam C905 */
++ { USB_DEVICE(0x046d, 0x080a), .driver_info = USB_QUIRK_RESET_RESUME },
++
++ /* Logitech Webcam C210 */
++ { USB_DEVICE(0x046d, 0x0819), .driver_info = USB_QUIRK_RESET_RESUME },
++
++ /* Logitech Webcam C260 */
++ { USB_DEVICE(0x046d, 0x081a), .driver_info = USB_QUIRK_RESET_RESUME },
++
+ /* Logitech Webcam C310 */
+ { USB_DEVICE(0x046d, 0x081b), .driver_info = USB_QUIRK_RESET_RESUME },
+
++ /* Logitech Webcam C910 */
++ { USB_DEVICE(0x046d, 0x0821), .driver_info = USB_QUIRK_RESET_RESUME },
++
++ /* Logitech Webcam C160 */
++ { USB_DEVICE(0x046d, 0x0824), .driver_info = USB_QUIRK_RESET_RESUME },
++
+ /* Logitech Webcam C270 */
+ { USB_DEVICE(0x046d, 0x0825), .driver_info = USB_QUIRK_RESET_RESUME },
+
++ /* Logitech Quickcam Pro 9000 */
++ { USB_DEVICE(0x046d, 0x0990), .driver_info = USB_QUIRK_RESET_RESUME },
++
++ /* Logitech Quickcam E3500 */
++ { USB_DEVICE(0x046d, 0x09a4), .driver_info = USB_QUIRK_RESET_RESUME },
++
++ /* Logitech Quickcam Vision Pro */
++ { USB_DEVICE(0x046d, 0x09a6), .driver_info = USB_QUIRK_RESET_RESUME },
++
+ /* Logitech Harmony 700-series */
+ { USB_DEVICE(0x046d, 0xc122), .driver_info = USB_QUIRK_DELAY_INIT },
+
--- /dev/null
+From 0c16595539b612fe948559433dda08ff96a8bdc7 Mon Sep 17 00:00:00 2001
+From: wangyanqing <udknight@gmail.com>
+Date: Thu, 10 Nov 2011 14:04:08 +0800
+Subject: USB: serial: pl2303: rm duplicate id
+
+From: wangyanqing <udknight@gmail.com>
+
+commit 0c16595539b612fe948559433dda08ff96a8bdc7 upstream.
+
+I get report from customer that his usb-serial
+converter doesn't work well,it sometimes work,
+but sometimes it doesn't.
+
+The usb-serial converter's id:
+vendor_id product_id
+0x4348 0x5523
+
+Then I search the usb-serial codes, and there are
+two drivers announce support this device, pl2303
+and ch341, commit 026dfaf1 cause it. Through many
+times to test, ch341 works well with this device,
+and pl2303 doesn't work quite often(it just work quite little).
+
+ch341 works well with this device, so we doesn't
+need pl2303 to support.I try to revert 026dfaf1 first,
+but it failed. So I prepare this patch by hand to revert it.
+
+Signed-off-by: Wang YanQing <Udknight@gmail.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/usb/serial/pl2303.c | 1 -
+ drivers/usb/serial/pl2303.h | 4 ----
+ 2 files changed, 5 deletions(-)
+
+--- a/drivers/usb/serial/pl2303.c
++++ b/drivers/usb/serial/pl2303.c
+@@ -91,7 +91,6 @@ static const struct usb_device_id id_tab
+ { USB_DEVICE(SONY_VENDOR_ID, SONY_QN3USB_PRODUCT_ID) },
+ { USB_DEVICE(SANWA_VENDOR_ID, SANWA_PRODUCT_ID) },
+ { USB_DEVICE(ADLINK_VENDOR_ID, ADLINK_ND6530_PRODUCT_ID) },
+- { USB_DEVICE(WINCHIPHEAD_VENDOR_ID, WINCHIPHEAD_USBSER_PRODUCT_ID) },
+ { USB_DEVICE(SMART_VENDOR_ID, SMART_PRODUCT_ID) },
+ { } /* Terminating entry */
+ };
+--- a/drivers/usb/serial/pl2303.h
++++ b/drivers/usb/serial/pl2303.h
+@@ -145,10 +145,6 @@
+ #define ADLINK_VENDOR_ID 0x0b63
+ #define ADLINK_ND6530_PRODUCT_ID 0x6530
+
+-/* WinChipHead USB->RS 232 adapter */
+-#define WINCHIPHEAD_VENDOR_ID 0x4348
+-#define WINCHIPHEAD_USBSER_PRODUCT_ID 0x5523
+-
+ /* SMART USB Serial Adapter */
+ #define SMART_VENDOR_ID 0x0b8c
+ #define SMART_PRODUCT_ID 0x2303
--- /dev/null
+From 2f640bf4c94324aeaa1b6385c10aab8c5ad1e1cf Mon Sep 17 00:00:00 2001
+From: Alan Stern <stern@rowland.harvard.edu>
+Date: Tue, 25 Oct 2011 10:50:58 -0400
+Subject: usb-storage: Accept 8020i-protocol commands longer than 12 bytes
+
+From: Alan Stern <stern@rowland.harvard.edu>
+
+commit 2f640bf4c94324aeaa1b6385c10aab8c5ad1e1cf upstream.
+
+The 8020i protocol (also 8070i and QIC-157) uses 12-byte commands;
+shorter commands must be padded. Simon Detheridge reports that his
+3-TB USB disk drive claims to use the 8020i protocol (which is
+normally meant for ATAPI devices like CD drives), and because of its
+large size, the disk drive requires the use of 16-byte commands.
+However the usb_stor_pad12_command() routine in usb-storage always
+sets the command length to 12, making the drive impossible to use.
+
+Since the SFF-8020i specification allows for 16-byte commands in
+future extensions, we may as well accept them. This patch (as1490)
+changes usb_stor_pad12_command() to leave commands larger than 12
+bytes alone rather than truncating them.
+
+Signed-off-by: Alan Stern <stern@rowland.harvard.edu>
+Tested-by: Simon Detheridge <simon@widgit.com>
+CC: Matthew Dharm <mdharm-usb@one-eyed-alien.net>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/usb/storage/protocol.c | 7 +++----
+ 1 file changed, 3 insertions(+), 4 deletions(-)
+
+--- a/drivers/usb/storage/protocol.c
++++ b/drivers/usb/storage/protocol.c
+@@ -58,7 +58,9 @@
+
+ void usb_stor_pad12_command(struct scsi_cmnd *srb, struct us_data *us)
+ {
+- /* Pad the SCSI command with zeros out to 12 bytes
++ /*
++ * Pad the SCSI command with zeros out to 12 bytes. If the
++ * command already is 12 bytes or longer, leave it alone.
+ *
+ * NOTE: This only works because a scsi_cmnd struct field contains
+ * a unsigned char cmnd[16], so we know we have storage available
+@@ -66,9 +68,6 @@ void usb_stor_pad12_command(struct scsi_
+ for (; srb->cmd_len<12; srb->cmd_len++)
+ srb->cmnd[srb->cmd_len] = 0;
+
+- /* set command length to 12 bytes */
+- srb->cmd_len = 12;
+-
+ /* send the command to the transport layer */
+ usb_stor_invoke_transport(srb, us);
+ }
--- /dev/null
+From 97ff22ee3b4cb3a334f7385e269773141aed702f Mon Sep 17 00:00:00 2001
+From: Alan Stern <stern@rowland.harvard.edu>
+Date: Thu, 27 Oct 2011 11:20:21 -0400
+Subject: USB: workaround for bug in old version of GCC
+
+From: Alan Stern <stern@rowland.harvard.edu>
+
+commit 97ff22ee3b4cb3a334f7385e269773141aed702f upstream.
+
+This patch (as1491) works around a bug in GCC-3.4.6, which is still
+supposed to be supported. The number of microseconds in the udelay()
+call in quirk_usb_disable_ehci() is fixed at 100, but the compiler
+doesn't understand this and generates a link-time error. So we
+replace the otherwise unused variable "delta" with a simple constant
+100. This same pattern is already used in other delay loops in that
+source file.
+
+Signed-off-by: Alan Stern <stern@rowland.harvard.edu>
+Reported-by: Konrad Rzepecki <krzepecki@dentonet.pl>
+Tested-by: Konrad Rzepecki <krzepecki@dentonet.pl>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/usb/host/pci-quirks.c | 7 +++----
+ 1 file changed, 3 insertions(+), 4 deletions(-)
+
+--- a/drivers/usb/host/pci-quirks.c
++++ b/drivers/usb/host/pci-quirks.c
+@@ -626,7 +626,7 @@ static void __devinit quirk_usb_disable_
+ void __iomem *base, *op_reg_base;
+ u32 hcc_params, cap, val;
+ u8 offset, cap_length;
+- int wait_time, delta, count = 256/4;
++ int wait_time, count = 256/4;
+
+ if (!mmio_resource_enabled(pdev, 0))
+ return;
+@@ -672,11 +672,10 @@ static void __devinit quirk_usb_disable_
+ writel(val, op_reg_base + EHCI_USBCMD);
+
+ wait_time = 2000;
+- delta = 100;
+ do {
+ writel(0x3f, op_reg_base + EHCI_USBSTS);
+- udelay(delta);
+- wait_time -= delta;
++ udelay(100);
++ wait_time -= 100;
+ val = readl(op_reg_base + EHCI_USBSTS);
+ if ((val == ~(u32)0) || (val & EHCI_USBSTS_HALTED)) {
+ break;