]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
3.6-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 24 Oct 2012 18:08:29 +0000 (11:08 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 24 Oct 2012 18:08:29 +0000 (11:08 -0700)
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

queue-3.6/efi-build-efi-stub-with-efi-appropriate-options.patch [new file with mode: 0644]
queue-3.6/series
queue-3.6/usb-don-t-enable-lpm-if-the-exit-latency-is-zero.patch [new file with mode: 0644]
queue-3.6/usb-dwc3-gadget-fix-endpoint-always-busy-bug.patch [new file with mode: 0644]
queue-3.6/usb-enable-lpm-after-a-failed-probe.patch [new file with mode: 0644]
queue-3.6/usb-fix-port-probing-and-removal-in-garmin_gps.patch [new file with mode: 0644]
queue-3.6/usb-keyspan_pda-fix-port-data-memory-leak.patch [new file with mode: 0644]
queue-3.6/usb-option-add-more-zte-devices.patch [new file with mode: 0644]
queue-3.6/usb-option-blacklist-net-interface-on-zte-devices.patch [new file with mode: 0644]
queue-3.6/usb-send-set-sel-before-enabling-parent-u1-u2-timeout.patch [new file with mode: 0644]

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 (file)
index 0000000..f8617d5
--- /dev/null
@@ -0,0 +1,35 @@
+From 9dead5bbb825d7c25c0400e61de83075046322d0 Mon Sep 17 00:00:00 2001
+From: Matthew Garrett <mjg@redhat.com>
+Date: Thu, 26 Jul 2012 18:00:00 -0400
+Subject: efi: Build EFI stub with EFI-appropriate options
+
+From: Matthew Garrett <mjg@redhat.com>
+
+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 <mjg@redhat.com>
+Signed-off-by: Matt Fleming <matt.fleming@intel.com>
+Cc: Daniel Vacek <neelx.g@gmail.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ 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
index edaab8a37872df7a350a18937cfc847191910574..7bf081d02b2f908b3c13eb516674dfd96f6e261f 100644 (file)
@@ -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 (file)
index 0000000..6aa5730
--- /dev/null
@@ -0,0 +1,70 @@
+From ae8963adb4ad8c5f2a89ca1d99fb7bb721e7599f Mon Sep 17 00:00:00 2001
+From: Sarah Sharp <sarah.a.sharp@linux.intel.com>
+Date: Wed, 3 Oct 2012 11:18:05 -0700
+Subject: usb: Don't enable LPM if the exit latency is zero.
+
+From: Sarah Sharp <sarah.a.sharp@linux.intel.com>
+
+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 <sarah.a.sharp@linux.intel.com>
+Reported-by: Don Zickus <dzickus@redhat.com>
+Tested-by: Don Zickus <dzickus@redhat.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ 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 (file)
index 0000000..2d75456
--- /dev/null
@@ -0,0 +1,40 @@
+From 041d81f493d90c940ec41f0ec98bc7c4f2fba431 Mon Sep 17 00:00:00 2001
+From: Felipe Balbi <balbi@ti.com>
+Date: Thu, 4 Oct 2012 11:58:00 +0300
+Subject: usb: dwc3: gadget: fix 'endpoint always busy' bug
+
+From: Felipe Balbi <balbi@ti.com>
+
+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 <m-sonasath@ti.com>
+Signed-off-by: Felipe Balbi <balbi@ti.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ 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, &params);
+       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 (file)
index 0000000..76fd798
--- /dev/null
@@ -0,0 +1,42 @@
+From d01f87c0ffa96cb44faa78710711eb6e974b891c Mon Sep 17 00:00:00 2001
+From: Sarah Sharp <sarah.a.sharp@linux.intel.com>
+Date: Thu, 4 Oct 2012 09:53:43 -0700
+Subject: USB: Enable LPM after a failed probe.
+
+From: Sarah Sharp <sarah.a.sharp@linux.intel.com>
+
+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 <sarah.a.sharp@linux.intel.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ 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 (file)
index 0000000..bf0f172
--- /dev/null
@@ -0,0 +1,81 @@
+From db5c8b524444d4fc6b1f32d368a50a3729e50002 Mon Sep 17 00:00:00 2001
+From: Alan Stern <stern@rowland.harvard.edu>
+Date: Wed, 10 Oct 2012 14:10:21 -0400
+Subject: USB: fix port probing and removal in garmin_gps
+
+From: Alan Stern <stern@rowland.harvard.edu>
+
+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 <stern@rowland.harvard.edu>
+Reported--by: Markus Schauler <mschauler@gmail.com>
+Tested-by: Markus Schauler <mschauler@gmail.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ 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 (file)
index 0000000..c7e5f3e
--- /dev/null
@@ -0,0 +1,85 @@
+From 94ab71ce288921490ca857e25ad174e1921b1e29 Mon Sep 17 00:00:00 2001
+From: Johan Hovold <jhovold@gmail.com>
+Date: Wed, 17 Oct 2012 13:35:00 +0200
+Subject: USB: keyspan_pda: fix port-data memory leak
+
+From: Johan Hovold <jhovold@gmail.com>
+
+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 <jhovold@gmail.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ 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 (file)
index 0000000..f4c82fb
--- /dev/null
@@ -0,0 +1,57 @@
+From 4b35f1c52943851b310afb09047bfe991ac8f5ae Mon Sep 17 00:00:00 2001
+From: Bjørn Mork <bjorn@mork.no>
+Date: Thu, 18 Oct 2012 17:14:17 +0200
+Subject: USB: option: add more ZTE devices
+
+From: Bjørn Mork <bjorn@mork.no>
+
+commit 4b35f1c52943851b310afb09047bfe991ac8f5ae upstream.
+
+Signed-off-by: Bjørn Mork <bjorn@mork.no>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ 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 (file)
index 0000000..4e1591e
--- /dev/null
@@ -0,0 +1,145 @@
+From 1452df6f1b7e396d89c2a1fdbdc0e0e839f97671 Mon Sep 17 00:00:00 2001
+From: Bjørn Mork <bjorn@mork.no>
+Date: Thu, 18 Oct 2012 17:19:53 +0200
+Subject: USB: option: blacklist net interface on ZTE devices
+
+From: Bjørn Mork <bjorn@mork.no>
+
+commit 1452df6f1b7e396d89c2a1fdbdc0e0e839f97671 upstream.
+
+Based on information from the ZTE Windows drivers.
+
+Signed-off-by: Bjørn Mork <bjorn@mork.no>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ 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 (file)
index 0000000..0db61c5
--- /dev/null
@@ -0,0 +1,72 @@
+From 65a95b75bc5afa7bbb844e222481044c1c4767eb Mon Sep 17 00:00:00 2001
+From: Sarah Sharp <sarah.a.sharp@linux.intel.com>
+Date: Fri, 5 Oct 2012 10:32:07 -0700
+Subject: usb: Send Set SEL before enabling parent U1/U2 timeout.
+
+From: Sarah Sharp <sarah.a.sharp@linux.intel.com>
+
+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 <sarah.a.sharp@linux.intel.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+
+---
+ 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