From: Greg Kroah-Hartman Date: Wed, 24 Oct 2012 18:08:29 +0000 (-0700) Subject: 3.6-stable patches X-Git-Tag: v3.0.49~38 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=010790178b79242a080bc7fa7c081c0f71c28a4e;p=thirdparty%2Fkernel%2Fstable-queue.git 3.6-stable patches added patches: efi-build-efi-stub-with-efi-appropriate-options.patch usb-don-t-enable-lpm-if-the-exit-latency-is-zero.patch usb-dwc3-gadget-fix-endpoint-always-busy-bug.patch usb-enable-lpm-after-a-failed-probe.patch usb-fix-port-probing-and-removal-in-garmin_gps.patch usb-keyspan_pda-fix-port-data-memory-leak.patch usb-option-add-more-zte-devices.patch usb-option-blacklist-net-interface-on-zte-devices.patch usb-send-set-sel-before-enabling-parent-u1-u2-timeout.patch --- diff --git a/queue-3.6/efi-build-efi-stub-with-efi-appropriate-options.patch b/queue-3.6/efi-build-efi-stub-with-efi-appropriate-options.patch new file mode 100644 index 00000000000..f8617d5ecbb --- /dev/null +++ b/queue-3.6/efi-build-efi-stub-with-efi-appropriate-options.patch @@ -0,0 +1,35 @@ +From 9dead5bbb825d7c25c0400e61de83075046322d0 Mon Sep 17 00:00:00 2001 +From: Matthew Garrett +Date: Thu, 26 Jul 2012 18:00:00 -0400 +Subject: efi: Build EFI stub with EFI-appropriate options + +From: Matthew Garrett + +commit 9dead5bbb825d7c25c0400e61de83075046322d0 upstream. + +We can't assume the presence of the red zone while we're still in a boot +services environment, so we should build with -fno-red-zone to avoid +problems. Change the size of wchar at the same time to make string handling +simpler. + +Signed-off-by: Matthew Garrett +Signed-off-by: Matt Fleming +Cc: Daniel Vacek +Signed-off-by: Greg Kroah-Hartman + +--- + arch/x86/boot/compressed/Makefile | 3 +++ + 1 file changed, 3 insertions(+) + +--- a/arch/x86/boot/compressed/Makefile ++++ b/arch/x86/boot/compressed/Makefile +@@ -31,6 +31,9 @@ VMLINUX_OBJS = $(obj)/vmlinux.lds $(obj) + $(obj)/eboot.o: KBUILD_CFLAGS += -fshort-wchar -mno-red-zone + $(obj)/efi_stub_$(BITS).o: KBUILD_CLFAGS += -fshort-wchar -mno-red-zone + ++$(obj)/eboot.o: KBUILD_CFLAGS += -fshort-wchar -mno-red-zone ++$(obj)/efi_stub_$(BITS).o: KBUILD_CLFAGS += -fshort-wchar -mno-red-zone ++ + ifeq ($(CONFIG_EFI_STUB), y) + VMLINUX_OBJS += $(obj)/eboot.o $(obj)/efi_stub_$(BITS).o + endif diff --git a/queue-3.6/series b/queue-3.6/series index edaab8a3787..7bf081d02b2 100644 --- a/queue-3.6/series +++ b/queue-3.6/series @@ -39,3 +39,12 @@ usb-spcp8x5-fix-port-data-memory-leak.patch usb-ti_usb_3410_5052-fix-port-data-memory-leak.patch usb-kl5kusb105-fix-port-data-memory-leak.patch usb-io_edgeport-fix-port-data-memory-leak.patch +usb-keyspan_pda-fix-port-data-memory-leak.patch +efi-build-efi-stub-with-efi-appropriate-options.patch +usb-option-blacklist-net-interface-on-zte-devices.patch +usb-option-add-more-zte-devices.patch +usb-dwc3-gadget-fix-endpoint-always-busy-bug.patch +usb-don-t-enable-lpm-if-the-exit-latency-is-zero.patch +usb-enable-lpm-after-a-failed-probe.patch +usb-send-set-sel-before-enabling-parent-u1-u2-timeout.patch +usb-fix-port-probing-and-removal-in-garmin_gps.patch diff --git a/queue-3.6/usb-don-t-enable-lpm-if-the-exit-latency-is-zero.patch b/queue-3.6/usb-don-t-enable-lpm-if-the-exit-latency-is-zero.patch new file mode 100644 index 00000000000..6aa5730ac57 --- /dev/null +++ b/queue-3.6/usb-don-t-enable-lpm-if-the-exit-latency-is-zero.patch @@ -0,0 +1,70 @@ +From ae8963adb4ad8c5f2a89ca1d99fb7bb721e7599f Mon Sep 17 00:00:00 2001 +From: Sarah Sharp +Date: Wed, 3 Oct 2012 11:18:05 -0700 +Subject: usb: Don't enable LPM if the exit latency is zero. + +From: Sarah Sharp + +commit ae8963adb4ad8c5f2a89ca1d99fb7bb721e7599f upstream. + +Some USB 3.0 devices signal that they don't implement Link PM by having +all zeroes in the U1/U2 exit latencies in their SuperSpeed BOS +descriptor. Don found that a Western Digital device he has experiences +transfer errors when LPM is enabled. The lsusb shows the U1/U2 exit +latencies are set to zero: + +Binary Object Store Descriptor: + bLength 5 + bDescriptorType 15 + wTotalLength 22 + bNumDeviceCaps 2 + SuperSpeed USB Device Capability: + bLength 10 + bDescriptorType 16 + bDevCapabilityType 3 + bmAttributes 0x00 + Latency Tolerance Messages (LTM) Supported + wSpeedsSupported 0x000e + Device can operate at Full Speed (12Mbps) + Device can operate at High Speed (480Mbps) + Device can operate at SuperSpeed (5Gbps) + bFunctionalitySupport 1 + Lowest fully-functional device speed is Full Speed (12Mbps) + bU1DevExitLat 0 micro seconds + bU2DevExitLat 0 micro seconds + +The fix is to not enable LPM for a particular link state if we find its +corresponding exit latency is zero. + +This patch should be backported to kernels as old as 3.5, that contain +the commit 1ea7e0e8e3d0f50901d335ea4178ab2aa8c88201 "USB: Add support to +enable/disable USB3 link states." + +Signed-off-by: Sarah Sharp +Reported-by: Don Zickus +Tested-by: Don Zickus +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/usb/core/hub.c | 10 ++++++++++ + 1 file changed, 10 insertions(+) + +--- a/drivers/usb/core/hub.c ++++ b/drivers/usb/core/hub.c +@@ -3353,6 +3353,16 @@ static void usb_enable_link_state(struct + enum usb3_link_state state) + { + int timeout; ++ __u8 u1_mel = udev->bos->ss_cap->bU1devExitLat; ++ __le16 u2_mel = udev->bos->ss_cap->bU2DevExitLat; ++ ++ /* If the device says it doesn't have *any* exit latency to come out of ++ * U1 or U2, it's probably lying. Assume it doesn't implement that link ++ * state. ++ */ ++ if ((state == USB3_LPM_U1 && u1_mel == 0) || ++ (state == USB3_LPM_U2 && u2_mel == 0)) ++ return; + + /* We allow the host controller to set the U1/U2 timeout internally + * first, so that it can change its schedule to account for the diff --git a/queue-3.6/usb-dwc3-gadget-fix-endpoint-always-busy-bug.patch b/queue-3.6/usb-dwc3-gadget-fix-endpoint-always-busy-bug.patch new file mode 100644 index 00000000000..2d75456876d --- /dev/null +++ b/queue-3.6/usb-dwc3-gadget-fix-endpoint-always-busy-bug.patch @@ -0,0 +1,40 @@ +From 041d81f493d90c940ec41f0ec98bc7c4f2fba431 Mon Sep 17 00:00:00 2001 +From: Felipe Balbi +Date: Thu, 4 Oct 2012 11:58:00 +0300 +Subject: usb: dwc3: gadget: fix 'endpoint always busy' bug + +From: Felipe Balbi + +commit 041d81f493d90c940ec41f0ec98bc7c4f2fba431 upstream. + +If a USB transfer has already been started, meaning +we have already issued StartTransfer command to that +particular endpoint, DWC3_EP_BUSY flag has also +already been set. + +When we try to cancel this transfer which is already +in controller's cache, we will not receive XferComplete +event and we must clear DWC3_EP_BUSY in order to allow +subsequent requests to be properly started. + +The best place to clear that flag is right after issuing +DWC3_DEPCMD_ENDTRANSFER. + +Reported-by: Moiz Sonasath +Signed-off-by: Felipe Balbi +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/usb/dwc3/gadget.c | 1 + + 1 file changed, 1 insertion(+) + +--- a/drivers/usb/dwc3/gadget.c ++++ b/drivers/usb/dwc3/gadget.c +@@ -1899,6 +1899,7 @@ static void dwc3_stop_active_transfer(st + ret = dwc3_send_gadget_ep_cmd(dwc, dep->number, cmd, ¶ms); + WARN_ON_ONCE(ret); + dep->resource_index = 0; ++ dep->flags &= ~DWC3_EP_BUSY; + } + + static void dwc3_stop_active_transfers(struct dwc3 *dwc) diff --git a/queue-3.6/usb-enable-lpm-after-a-failed-probe.patch b/queue-3.6/usb-enable-lpm-after-a-failed-probe.patch new file mode 100644 index 00000000000..76fd7984936 --- /dev/null +++ b/queue-3.6/usb-enable-lpm-after-a-failed-probe.patch @@ -0,0 +1,42 @@ +From d01f87c0ffa96cb44faa78710711eb6e974b891c Mon Sep 17 00:00:00 2001 +From: Sarah Sharp +Date: Thu, 4 Oct 2012 09:53:43 -0700 +Subject: USB: Enable LPM after a failed probe. + +From: Sarah Sharp + +commit d01f87c0ffa96cb44faa78710711eb6e974b891c upstream. + +Before a driver is probed, we want to disable USB 3.0 Link Power +Management (LPM), in case the driver needs hub-initiated LPM disabled. +After the probe finishes, we want to attempt to re-enable LPM, order to +balance the LPM ref count. + +When a probe fails (such as when libusual doesn't want to bind to a USB +3.0 mass storage device), make sure to balance the LPM ref counts by +re-enabling LPM. + +This patch should be backported to kernels as old as 3.5, that contain +the commit 8306095fd2c1100e8244c09bf560f97aca5a311d "USB: Disable USB +3.0 LPM in critical sections." + +Signed-off-by: Sarah Sharp +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/usb/core/driver.c | 4 ++++ + 1 file changed, 4 insertions(+) + +--- a/drivers/usb/core/driver.c ++++ b/drivers/usb/core/driver.c +@@ -372,6 +372,10 @@ static int usb_probe_interface(struct de + intf->condition = USB_INTERFACE_UNBOUND; + usb_cancel_queued_reset(intf); + ++ /* If the LPM disable succeeded, balance the ref counts. */ ++ if (!lpm_disable_error) ++ usb_unlocked_enable_lpm(udev); ++ + /* Unbound interfaces are always runtime-PM-disabled and -suspended */ + if (driver->supports_autosuspend) + pm_runtime_disable(dev); diff --git a/queue-3.6/usb-fix-port-probing-and-removal-in-garmin_gps.patch b/queue-3.6/usb-fix-port-probing-and-removal-in-garmin_gps.patch new file mode 100644 index 00000000000..bf0f172f3a1 --- /dev/null +++ b/queue-3.6/usb-fix-port-probing-and-removal-in-garmin_gps.patch @@ -0,0 +1,81 @@ +From db5c8b524444d4fc6b1f32d368a50a3729e50002 Mon Sep 17 00:00:00 2001 +From: Alan Stern +Date: Wed, 10 Oct 2012 14:10:21 -0400 +Subject: USB: fix port probing and removal in garmin_gps + +From: Alan Stern + +commit db5c8b524444d4fc6b1f32d368a50a3729e50002 upstream. + +This patch (as1615) fixes a bug in the Garmin USB serial driver. It +uses attach, disconnect, and release routines to carry out actions +that should be handled by port_probe and port_remove routines, because +they access port-specific data. + +The bug causes an oops when the device in unplugged, because the +private data for each port structure now gets erased when the port is +unbound from the driver, resulting in a null-pointer dereference. + +Signed-off-by: Alan Stern +Reported--by: Markus Schauler +Tested-by: Markus Schauler +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/usb/serial/garmin_gps.c | 24 +++++++----------------- + 1 file changed, 7 insertions(+), 17 deletions(-) + +--- a/drivers/usb/serial/garmin_gps.c ++++ b/drivers/usb/serial/garmin_gps.c +@@ -1414,11 +1414,10 @@ static void timeout_handler(unsigned lon + + + +-static int garmin_attach(struct usb_serial *serial) ++static int garmin_port_probe(struct usb_serial_port *port) + { +- int status = 0; +- struct usb_serial_port *port = serial->port[0]; +- struct garmin_data *garmin_data_p = NULL; ++ int status; ++ struct garmin_data *garmin_data_p; + + garmin_data_p = kzalloc(sizeof(struct garmin_data), GFP_KERNEL); + if (garmin_data_p == NULL) { +@@ -1443,22 +1442,14 @@ static int garmin_attach(struct usb_seri + } + + +-static void garmin_disconnect(struct usb_serial *serial) ++static int garmin_port_remove(struct usb_serial_port *port) + { +- struct usb_serial_port *port = serial->port[0]; + struct garmin_data *garmin_data_p = usb_get_serial_port_data(port); + + usb_kill_urb(port->interrupt_in_urb); + del_timer_sync(&garmin_data_p->timer); +-} +- +- +-static void garmin_release(struct usb_serial *serial) +-{ +- struct usb_serial_port *port = serial->port[0]; +- struct garmin_data *garmin_data_p = usb_get_serial_port_data(port); +- + kfree(garmin_data_p); ++ return 0; + } + + +@@ -1475,9 +1466,8 @@ static struct usb_serial_driver garmin_d + .close = garmin_close, + .throttle = garmin_throttle, + .unthrottle = garmin_unthrottle, +- .attach = garmin_attach, +- .disconnect = garmin_disconnect, +- .release = garmin_release, ++ .port_probe = garmin_port_probe, ++ .port_remove = garmin_port_remove, + .write = garmin_write, + .write_room = garmin_write_room, + .write_bulk_callback = garmin_write_bulk_callback, diff --git a/queue-3.6/usb-keyspan_pda-fix-port-data-memory-leak.patch b/queue-3.6/usb-keyspan_pda-fix-port-data-memory-leak.patch new file mode 100644 index 00000000000..c7e5f3ef8b0 --- /dev/null +++ b/queue-3.6/usb-keyspan_pda-fix-port-data-memory-leak.patch @@ -0,0 +1,85 @@ +From 94ab71ce288921490ca857e25ad174e1921b1e29 Mon Sep 17 00:00:00 2001 +From: Johan Hovold +Date: Wed, 17 Oct 2012 13:35:00 +0200 +Subject: USB: keyspan_pda: fix port-data memory leak + +From: Johan Hovold + +commit 94ab71ce288921490ca857e25ad174e1921b1e29 upstream. + +Fix port-data memory leak by replacing attach and release with +port_probe and port_remove. + +Since commit 0998d0631001288 (device-core: Ensure drvdata = NULL when no +driver is bound) the port private data is no longer freed at release as +it is no longer accessible. + +Note that the write waitqueue was initialised but never used. + +Compile-only tested. + +Signed-off-by: Johan Hovold +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/usb/serial/keyspan_pda.c | 30 +++++++++++++++++------------- + 1 file changed, 17 insertions(+), 13 deletions(-) + +--- a/drivers/usb/serial/keyspan_pda.c ++++ b/drivers/usb/serial/keyspan_pda.c +@@ -735,29 +735,33 @@ MODULE_FIRMWARE("keyspan_pda/keyspan_pda + MODULE_FIRMWARE("keyspan_pda/xircom_pgs.fw"); + #endif + +-static int keyspan_pda_startup(struct usb_serial *serial) ++static int keyspan_pda_port_probe(struct usb_serial_port *port) + { + + struct keyspan_pda_private *priv; + +- /* allocate the private data structures for all ports. Well, for all +- one ports. */ +- + priv = kmalloc(sizeof(struct keyspan_pda_private), GFP_KERNEL); + if (!priv) +- return 1; /* error */ +- usb_set_serial_port_data(serial->port[0], priv); +- init_waitqueue_head(&serial->port[0]->write_wait); ++ return -ENOMEM; ++ + INIT_WORK(&priv->wakeup_work, keyspan_pda_wakeup_write); + INIT_WORK(&priv->unthrottle_work, keyspan_pda_request_unthrottle); +- priv->serial = serial; +- priv->port = serial->port[0]; ++ priv->serial = port->serial; ++ priv->port = port; ++ ++ usb_set_serial_port_data(port, priv); ++ + return 0; + } + +-static void keyspan_pda_release(struct usb_serial *serial) ++static int keyspan_pda_port_remove(struct usb_serial_port *port) + { +- kfree(usb_get_serial_port_data(serial->port[0])); ++ struct keyspan_pda_private *priv; ++ ++ priv = usb_get_serial_port_data(port); ++ kfree(priv); ++ ++ return 0; + } + + #ifdef KEYSPAN +@@ -808,8 +812,8 @@ static struct usb_serial_driver keyspan_ + .break_ctl = keyspan_pda_break_ctl, + .tiocmget = keyspan_pda_tiocmget, + .tiocmset = keyspan_pda_tiocmset, +- .attach = keyspan_pda_startup, +- .release = keyspan_pda_release, ++ .port_probe = keyspan_pda_port_probe, ++ .port_remove = keyspan_pda_port_remove, + }; + + static struct usb_serial_driver * const serial_drivers[] = { diff --git a/queue-3.6/usb-option-add-more-zte-devices.patch b/queue-3.6/usb-option-add-more-zte-devices.patch new file mode 100644 index 00000000000..f4c82fb13c7 --- /dev/null +++ b/queue-3.6/usb-option-add-more-zte-devices.patch @@ -0,0 +1,57 @@ +From 4b35f1c52943851b310afb09047bfe991ac8f5ae Mon Sep 17 00:00:00 2001 +From: Bjørn Mork +Date: Thu, 18 Oct 2012 17:14:17 +0200 +Subject: USB: option: add more ZTE devices + +From: Bjørn Mork + +commit 4b35f1c52943851b310afb09047bfe991ac8f5ae upstream. + +Signed-off-by: Bjørn Mork +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/usb/serial/option.c | 16 ++++++++++++++++ + 1 file changed, 16 insertions(+) + +--- a/drivers/usb/serial/option.c ++++ b/drivers/usb/serial/option.c +@@ -895,6 +895,12 @@ static const struct usb_device_id option + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0165, 0xff, 0xff, 0xff) }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0167, 0xff, 0xff, 0xff), + .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, ++ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0191, 0xff, 0xff, 0xff), /* ZTE EuFi890 */ ++ .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, ++ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0199, 0xff, 0xff, 0xff), /* ZTE MF820S */ ++ .driver_info = (kernel_ulong_t)&net_intf1_blacklist }, ++ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0257, 0xff, 0xff, 0xff), /* ZTE MF821 */ ++ .driver_info = (kernel_ulong_t)&net_intf3_blacklist }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0326, 0xff, 0xff, 0xff), + .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1008, 0xff, 0xff, 0xff), +@@ -903,6 +909,8 @@ static const struct usb_device_id option + .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1012, 0xff, 0xff, 0xff), + .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, ++ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1021, 0xff, 0xff, 0xff), ++ .driver_info = (kernel_ulong_t)&net_intf2_blacklist }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1057, 0xff, 0xff, 0xff) }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1058, 0xff, 0xff, 0xff) }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1059, 0xff, 0xff, 0xff) }, +@@ -1080,8 +1088,16 @@ static const struct usb_device_id option + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1298, 0xff, 0xff, 0xff) }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1299, 0xff, 0xff, 0xff) }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1300, 0xff, 0xff, 0xff) }, ++ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1401, 0xff, 0xff, 0xff), ++ .driver_info = (kernel_ulong_t)&net_intf2_blacklist }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1402, 0xff, 0xff, 0xff), + .driver_info = (kernel_ulong_t)&net_intf2_blacklist }, ++ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1424, 0xff, 0xff, 0xff), ++ .driver_info = (kernel_ulong_t)&net_intf2_blacklist }, ++ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1425, 0xff, 0xff, 0xff), ++ .driver_info = (kernel_ulong_t)&net_intf2_blacklist }, ++ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1426, 0xff, 0xff, 0xff), /* ZTE MF91 */ ++ .driver_info = (kernel_ulong_t)&net_intf2_blacklist }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x2002, 0xff, + 0xff, 0xff), .driver_info = (kernel_ulong_t)&zte_k3765_z_blacklist }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x2003, 0xff, 0xff, 0xff) }, diff --git a/queue-3.6/usb-option-blacklist-net-interface-on-zte-devices.patch b/queue-3.6/usb-option-blacklist-net-interface-on-zte-devices.patch new file mode 100644 index 00000000000..4e1591e824d --- /dev/null +++ b/queue-3.6/usb-option-blacklist-net-interface-on-zte-devices.patch @@ -0,0 +1,145 @@ +From 1452df6f1b7e396d89c2a1fdbdc0e0e839f97671 Mon Sep 17 00:00:00 2001 +From: Bjørn Mork +Date: Thu, 18 Oct 2012 17:19:53 +0200 +Subject: USB: option: blacklist net interface on ZTE devices + +From: Bjørn Mork + +commit 1452df6f1b7e396d89c2a1fdbdc0e0e839f97671 upstream. + +Based on information from the ZTE Windows drivers. + +Signed-off-by: Bjørn Mork +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/usb/serial/option.c | 68 +++++++++++++++++++++++++++++++------------- + 1 file changed, 48 insertions(+), 20 deletions(-) + +--- a/drivers/usb/serial/option.c ++++ b/drivers/usb/serial/option.c +@@ -503,11 +503,19 @@ static const struct option_blacklist_inf + .reserved = BIT(5), + }; + ++static const struct option_blacklist_info net_intf6_blacklist = { ++ .reserved = BIT(6), ++}; ++ + static const struct option_blacklist_info zte_mf626_blacklist = { + .sendsetup = BIT(0) | BIT(1), + .reserved = BIT(4), + }; + ++static const struct option_blacklist_info zte_1255_blacklist = { ++ .reserved = BIT(3) | BIT(4), ++}; ++ + static const struct usb_device_id option_ids[] = { + { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COLT) }, + { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA) }, +@@ -853,13 +861,19 @@ static const struct usb_device_id option + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0113, 0xff, 0xff, 0xff), + .driver_info = (kernel_ulong_t)&net_intf5_blacklist }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0117, 0xff, 0xff, 0xff) }, +- { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0118, 0xff, 0xff, 0xff) }, +- { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0121, 0xff, 0xff, 0xff) }, ++ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0118, 0xff, 0xff, 0xff), ++ .driver_info = (kernel_ulong_t)&net_intf5_blacklist }, ++ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0121, 0xff, 0xff, 0xff), ++ .driver_info = (kernel_ulong_t)&net_intf5_blacklist }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0122, 0xff, 0xff, 0xff) }, +- { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0123, 0xff, 0xff, 0xff) }, +- { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0124, 0xff, 0xff, 0xff) }, +- { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0125, 0xff, 0xff, 0xff) }, +- { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0126, 0xff, 0xff, 0xff) }, ++ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0123, 0xff, 0xff, 0xff), ++ .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, ++ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0124, 0xff, 0xff, 0xff), ++ .driver_info = (kernel_ulong_t)&net_intf5_blacklist }, ++ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0125, 0xff, 0xff, 0xff), ++ .driver_info = (kernel_ulong_t)&net_intf6_blacklist }, ++ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0126, 0xff, 0xff, 0xff), ++ .driver_info = (kernel_ulong_t)&net_intf5_blacklist }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0128, 0xff, 0xff, 0xff) }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0142, 0xff, 0xff, 0xff) }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0143, 0xff, 0xff, 0xff) }, +@@ -872,7 +886,8 @@ static const struct usb_device_id option + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0156, 0xff, 0xff, 0xff) }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0157, 0xff, 0xff, 0xff), + .driver_info = (kernel_ulong_t)&net_intf5_blacklist }, +- { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0158, 0xff, 0xff, 0xff) }, ++ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0158, 0xff, 0xff, 0xff), ++ .driver_info = (kernel_ulong_t)&net_intf3_blacklist }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0159, 0xff, 0xff, 0xff) }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0161, 0xff, 0xff, 0xff) }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0162, 0xff, 0xff, 0xff) }, +@@ -886,7 +901,8 @@ static const struct usb_device_id option + .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1010, 0xff, 0xff, 0xff), + .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, +- { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1012, 0xff, 0xff, 0xff) }, ++ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1012, 0xff, 0xff, 0xff), ++ .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1057, 0xff, 0xff, 0xff) }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1058, 0xff, 0xff, 0xff) }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1059, 0xff, 0xff, 0xff) }, +@@ -1002,18 +1018,24 @@ static const struct usb_device_id option + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1169, 0xff, 0xff, 0xff) }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1170, 0xff, 0xff, 0xff) }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1244, 0xff, 0xff, 0xff) }, +- { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1245, 0xff, 0xff, 0xff) }, ++ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1245, 0xff, 0xff, 0xff), ++ .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1246, 0xff, 0xff, 0xff) }, +- { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1247, 0xff, 0xff, 0xff) }, ++ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1247, 0xff, 0xff, 0xff), ++ .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1248, 0xff, 0xff, 0xff) }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1249, 0xff, 0xff, 0xff) }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1250, 0xff, 0xff, 0xff) }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1251, 0xff, 0xff, 0xff) }, +- { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1252, 0xff, 0xff, 0xff) }, ++ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1252, 0xff, 0xff, 0xff), ++ .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1253, 0xff, 0xff, 0xff) }, +- { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1254, 0xff, 0xff, 0xff) }, +- { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1255, 0xff, 0xff, 0xff) }, +- { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1256, 0xff, 0xff, 0xff) }, ++ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1254, 0xff, 0xff, 0xff), ++ .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, ++ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1255, 0xff, 0xff, 0xff), ++ .driver_info = (kernel_ulong_t)&zte_1255_blacklist }, ++ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1256, 0xff, 0xff, 0xff), ++ .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1257, 0xff, 0xff, 0xff) }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1258, 0xff, 0xff, 0xff) }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x1259, 0xff, 0xff, 0xff) }, +@@ -1071,15 +1093,21 @@ static const struct usb_device_id option + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0070, 0xff, 0xff, 0xff) }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0073, 0xff, 0xff, 0xff) }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0094, 0xff, 0xff, 0xff) }, +- { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0130, 0xff, 0xff, 0xff) }, +- { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0133, 0xff, 0xff, 0xff) }, +- { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0141, 0xff, 0xff, 0xff) }, ++ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0130, 0xff, 0xff, 0xff), ++ .driver_info = (kernel_ulong_t)&net_intf1_blacklist }, ++ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0133, 0xff, 0xff, 0xff), ++ .driver_info = (kernel_ulong_t)&net_intf3_blacklist }, ++ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0141, 0xff, 0xff, 0xff), ++ .driver_info = (kernel_ulong_t)&net_intf5_blacklist }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0147, 0xff, 0xff, 0xff) }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0152, 0xff, 0xff, 0xff) }, +- { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0168, 0xff, 0xff, 0xff) }, ++ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0168, 0xff, 0xff, 0xff), ++ .driver_info = (kernel_ulong_t)&net_intf4_blacklist }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0170, 0xff, 0xff, 0xff) }, +- { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0176, 0xff, 0xff, 0xff) }, +- { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0178, 0xff, 0xff, 0xff) }, ++ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0176, 0xff, 0xff, 0xff), ++ .driver_info = (kernel_ulong_t)&net_intf3_blacklist }, ++ { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, 0x0178, 0xff, 0xff, 0xff), ++ .driver_info = (kernel_ulong_t)&net_intf3_blacklist }, + + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_CDMA_TECH, 0xff, 0xff, 0xff) }, + { USB_DEVICE_AND_INTERFACE_INFO(ZTE_VENDOR_ID, ZTE_PRODUCT_AC8710, 0xff, 0xff, 0xff) }, diff --git a/queue-3.6/usb-send-set-sel-before-enabling-parent-u1-u2-timeout.patch b/queue-3.6/usb-send-set-sel-before-enabling-parent-u1-u2-timeout.patch new file mode 100644 index 00000000000..0db61c51601 --- /dev/null +++ b/queue-3.6/usb-send-set-sel-before-enabling-parent-u1-u2-timeout.patch @@ -0,0 +1,72 @@ +From 65a95b75bc5afa7bbb844e222481044c1c4767eb Mon Sep 17 00:00:00 2001 +From: Sarah Sharp +Date: Fri, 5 Oct 2012 10:32:07 -0700 +Subject: usb: Send Set SEL before enabling parent U1/U2 timeout. + +From: Sarah Sharp + +commit 65a95b75bc5afa7bbb844e222481044c1c4767eb upstream. + +The Set SEL control transfer tells a device the exit latencies +associated with a device-initated U1 or U2 exit. Since a parent hub may +initiate a transition to U1 soon after a downstream port's U1 timeout is +set, we need to make sure the device receives the Set SEL transfer +before the parent hub timeout is set. + +This patch should be backported to kernels as old as 3.5, that contain +the commit 1ea7e0e8e3d0f50901d335ea4178ab2aa8c88201 "USB: Add support to +enable/disable USB3 link states." + +Signed-off-by: Sarah Sharp +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/usb/core/hub.c | 23 ++++++++++++----------- + 1 file changed, 12 insertions(+), 11 deletions(-) + +--- a/drivers/usb/core/hub.c ++++ b/drivers/usb/core/hub.c +@@ -3258,16 +3258,6 @@ static int usb_set_device_initiated_lpm( + + if (enable) { + /* +- * First, let the device know about the exit latencies +- * associated with the link state we're about to enable. +- */ +- ret = usb_req_set_sel(udev, state); +- if (ret < 0) { +- dev_warn(&udev->dev, "Set SEL for device-initiated " +- "%s failed.\n", usb3_lpm_names[state]); +- return -EBUSY; +- } +- /* + * Now send the control transfer to enable device-initiated LPM + * for either U1 or U2. + */ +@@ -3352,7 +3342,7 @@ static int usb_set_lpm_timeout(struct us + static void usb_enable_link_state(struct usb_hcd *hcd, struct usb_device *udev, + enum usb3_link_state state) + { +- int timeout; ++ int timeout, ret; + __u8 u1_mel = udev->bos->ss_cap->bU1devExitLat; + __le16 u2_mel = udev->bos->ss_cap->bU2DevExitLat; + +@@ -3364,6 +3354,17 @@ static void usb_enable_link_state(struct + (state == USB3_LPM_U2 && u2_mel == 0)) + return; + ++ /* ++ * First, let the device know about the exit latencies ++ * associated with the link state we're about to enable. ++ */ ++ ret = usb_req_set_sel(udev, state); ++ if (ret < 0) { ++ dev_warn(&udev->dev, "Set SEL for device-initiated %s failed.\n", ++ usb3_lpm_names[state]); ++ return; ++ } ++ + /* We allow the host controller to set the U1/U2 timeout internally + * first, so that it can change its schedule to account for the + * additional latency to send data to a device in a lower power