From: Greg Kroah-Hartman Date: Wed, 18 Dec 2013 18:35:37 +0000 (-0800) Subject: 3.10-stable patches X-Git-Tag: v3.4.75~36 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=203c9140392dd4d31d1e6fb31ceca34958725c00;p=thirdparty%2Fkernel%2Fstable-queue.git 3.10-stable patches added patches: futex-fix-handling-of-read-only-mapped-hugepages.patch input-usbtouchscreen-separate-report-and-transmit-buffer-size-handling.patch media-af9035-fix-broken-i2c-and-usb-i-o.patch nfsd-when-reusing-an-existing-repcache-entry-unhash-it-first.patch pci-disable-bus-master-only-on-kexec-reboot.patch usb-dwc3-fix-implementation-of-endpoint-wedge.patch usb-gadget-composite-reset-delayed_status-on-reset_config.patch usb-hub-use-correct-reset-for-wedged-usb3-devices-that-are-notattached.patch usb-option-support-new-huawei-devices.patch usb-serial-option-blacklist-interface-1-for-huawei-e173s-6.patch --- diff --git a/queue-3.10/futex-fix-handling-of-read-only-mapped-hugepages.patch b/queue-3.10/futex-fix-handling-of-read-only-mapped-hugepages.patch new file mode 100644 index 00000000000..3b6a2dc5296 --- /dev/null +++ b/queue-3.10/futex-fix-handling-of-read-only-mapped-hugepages.patch @@ -0,0 +1,44 @@ +From f12d5bfceb7e1f9051563381ec047f7f13956c3c Mon Sep 17 00:00:00 2001 +From: Linus Torvalds +Date: Thu, 12 Dec 2013 09:38:42 -0800 +Subject: futex: fix handling of read-only-mapped hugepages + +From: Linus Torvalds + +commit f12d5bfceb7e1f9051563381ec047f7f13956c3c upstream. + +The hugepage code had the exact same bug that regular pages had in +commit 7485d0d3758e ("futexes: Remove rw parameter from +get_futex_key()"). + +The regular page case was fixed by commit 9ea71503a8ed ("futex: Fix +regression with read only mappings"), but the transparent hugepage case +(added in a5b338f2b0b1: "thp: update futex compound knowledge") case +remained broken. + +Found by Dave Jones and his trinity tool. + +Reported-and-tested-by: Dave Jones +Acked-by: Thomas Gleixner +Cc: Mel Gorman +Cc: Darren Hart +Cc: Andrea Arcangeli +Cc: Oleg Nesterov +Signed-off-by: Linus Torvalds +Signed-off-by: Greg Kroah-Hartman + +--- + kernel/futex.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/kernel/futex.c ++++ b/kernel/futex.c +@@ -287,7 +287,7 @@ again: + put_page(page); + /* serialize against __split_huge_page_splitting() */ + local_irq_disable(); +- if (likely(__get_user_pages_fast(address, 1, 1, &page) == 1)) { ++ if (likely(__get_user_pages_fast(address, 1, !ro, &page) == 1)) { + page_head = compound_head(page); + /* + * page_head is valid pointer but we must pin diff --git a/queue-3.10/input-usbtouchscreen-separate-report-and-transmit-buffer-size-handling.patch b/queue-3.10/input-usbtouchscreen-separate-report-and-transmit-buffer-size-handling.patch new file mode 100644 index 00000000000..1b3fb8b4b85 --- /dev/null +++ b/queue-3.10/input-usbtouchscreen-separate-report-and-transmit-buffer-size-handling.patch @@ -0,0 +1,94 @@ +From 4ef38351d770cc421f4a0c7a849fd13207fc5741 Mon Sep 17 00:00:00 2001 +From: Christian Engelmayer +Date: Tue, 26 Nov 2013 18:16:17 -0800 +Subject: Input: usbtouchscreen - separate report and transmit buffer size handling + +From: Christian Engelmayer + +commit 4ef38351d770cc421f4a0c7a849fd13207fc5741 upstream. + +This patch supports the separate handling of the USB transfer buffer length +and the length of the buffer used for multi packet support. For devices +supporting multiple report or diagnostic packets, the USB transfer size is now +limited to the USB endpoints wMaxPacketSize - otherwise it defaults to the +configured report packet size as before. + +This fixes an issue where event reporting can be delayed for an arbitrary +time for multi packet devices. For instance the report size for eGalax devices +is defined to the 16 byte maximum diagnostic packet size as opposed to the 5 +byte report packet size. In case the driver requests 16 byte from the USB +interrupt endpoint, the USB host controller driver needs to split up the +request into 2 accesses according to the endpoints wMaxPacketSize of 8 byte. +When the first transfer is answered by the eGalax device with not less than +the full 8 byte requested, the host controller has got no way of knowing +whether the touch controller has got additional data queued and will issue +the second transfer. If per example a liftoff event finishes at such a +wMaxPacketSize boundary, the data will not be available to the usbtouch driver +until a further event is triggered and transfered to the host. From user +perspective the BTN_TOUCH release event in this case is stuck until the next +touch down event. + +Signed-off-by: Christian Engelmayer +Signed-off-by: Dmitry Torokhov +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/input/touchscreen/usbtouchscreen.c | 22 ++++++++++++++++++---- + 1 file changed, 18 insertions(+), 4 deletions(-) + +--- a/drivers/input/touchscreen/usbtouchscreen.c ++++ b/drivers/input/touchscreen/usbtouchscreen.c +@@ -106,6 +106,7 @@ struct usbtouch_device_info { + struct usbtouch_usb { + unsigned char *data; + dma_addr_t data_dma; ++ int data_size; + unsigned char *buffer; + int buf_len; + struct urb *irq; +@@ -1521,7 +1522,7 @@ static int usbtouch_reset_resume(struct + static void usbtouch_free_buffers(struct usb_device *udev, + struct usbtouch_usb *usbtouch) + { +- usb_free_coherent(udev, usbtouch->type->rept_size, ++ usb_free_coherent(udev, usbtouch->data_size, + usbtouch->data, usbtouch->data_dma); + kfree(usbtouch->buffer); + } +@@ -1566,7 +1567,20 @@ static int usbtouch_probe(struct usb_int + if (!type->process_pkt) + type->process_pkt = usbtouch_process_pkt; + +- usbtouch->data = usb_alloc_coherent(udev, type->rept_size, ++ usbtouch->data_size = type->rept_size; ++ if (type->get_pkt_len) { ++ /* ++ * When dealing with variable-length packets we should ++ * not request more than wMaxPacketSize bytes at once ++ * as we do not know if there is more data coming or ++ * we filled exactly wMaxPacketSize bytes and there is ++ * nothing else. ++ */ ++ usbtouch->data_size = min(usbtouch->data_size, ++ usb_endpoint_maxp(endpoint)); ++ } ++ ++ usbtouch->data = usb_alloc_coherent(udev, usbtouch->data_size, + GFP_KERNEL, &usbtouch->data_dma); + if (!usbtouch->data) + goto out_free; +@@ -1626,12 +1640,12 @@ static int usbtouch_probe(struct usb_int + if (usb_endpoint_type(endpoint) == USB_ENDPOINT_XFER_INT) + usb_fill_int_urb(usbtouch->irq, udev, + usb_rcvintpipe(udev, endpoint->bEndpointAddress), +- usbtouch->data, type->rept_size, ++ usbtouch->data, usbtouch->data_size, + usbtouch_irq, usbtouch, endpoint->bInterval); + else + usb_fill_bulk_urb(usbtouch->irq, udev, + usb_rcvbulkpipe(udev, endpoint->bEndpointAddress), +- usbtouch->data, type->rept_size, ++ usbtouch->data, usbtouch->data_size, + usbtouch_irq, usbtouch); + + usbtouch->irq->dev = udev; diff --git a/queue-3.10/media-af9035-fix-broken-i2c-and-usb-i-o.patch b/queue-3.10/media-af9035-fix-broken-i2c-and-usb-i-o.patch new file mode 100644 index 00000000000..85ab8b0e3e5 --- /dev/null +++ b/queue-3.10/media-af9035-fix-broken-i2c-and-usb-i-o.patch @@ -0,0 +1,53 @@ +From 9323297dc0ea9141f8099e474657391bb3ad98f8 Mon Sep 17 00:00:00 2001 +From: Antti Palosaari +Date: Wed, 27 Nov 2013 17:23:00 -0300 +Subject: media: af9035: fix broken I2C and USB I/O + +From: Antti Palosaari + +commit 9323297dc0ea9141f8099e474657391bb3ad98f8 upstream. + +There was three small buffer len calculation bugs which caused +driver non-working. These are coming from recent commit: +commit 7760e148350bf6df95662bc0db3734e9d991cb03 +[media] af9035: Don't use dynamic static allocation + +Signed-off-by: Antti Palosaari +Signed-off-by: Mauro Carvalho Chehab +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/media/usb/dvb-usb-v2/af9035.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +--- a/drivers/media/usb/dvb-usb-v2/af9035.c ++++ b/drivers/media/usb/dvb-usb-v2/af9035.c +@@ -130,7 +130,7 @@ static int af9035_wr_regs(struct dvb_usb + { + u8 wbuf[MAX_XFER_SIZE]; + u8 mbox = (reg >> 16) & 0xff; +- struct usb_req req = { CMD_MEM_WR, mbox, sizeof(wbuf), wbuf, 0, NULL }; ++ struct usb_req req = { CMD_MEM_WR, mbox, 6 + len, wbuf, 0, NULL }; + + if (6 + len > sizeof(wbuf)) { + dev_warn(&d->udev->dev, "%s: i2c wr: len=%d is too big!\n", +@@ -237,7 +237,7 @@ static int af9035_i2c_master_xfer(struct + } else { + /* I2C */ + u8 buf[MAX_XFER_SIZE]; +- struct usb_req req = { CMD_I2C_RD, 0, sizeof(buf), ++ struct usb_req req = { CMD_I2C_RD, 0, 5 + msg[0].len, + buf, msg[1].len, msg[1].buf }; + + if (5 + msg[0].len > sizeof(buf)) { +@@ -273,8 +273,8 @@ static int af9035_i2c_master_xfer(struct + } else { + /* I2C */ + u8 buf[MAX_XFER_SIZE]; +- struct usb_req req = { CMD_I2C_WR, 0, sizeof(buf), buf, +- 0, NULL }; ++ struct usb_req req = { CMD_I2C_WR, 0, 5 + msg[0].len, ++ buf, 0, NULL }; + + if (5 + msg[0].len > sizeof(buf)) { + dev_warn(&d->udev->dev, diff --git a/queue-3.10/nfsd-when-reusing-an-existing-repcache-entry-unhash-it-first.patch b/queue-3.10/nfsd-when-reusing-an-existing-repcache-entry-unhash-it-first.patch new file mode 100644 index 00000000000..234c2dd0ff7 --- /dev/null +++ b/queue-3.10/nfsd-when-reusing-an-existing-repcache-entry-unhash-it-first.patch @@ -0,0 +1,59 @@ +From 781c2a5a5f75eacc04663aced0f0f1a648d4f308 Mon Sep 17 00:00:00 2001 +From: Jeff Layton +Date: Mon, 2 Dec 2013 15:26:19 -0500 +Subject: nfsd: when reusing an existing repcache entry, unhash it first + +From: Jeff Layton + +commit 781c2a5a5f75eacc04663aced0f0f1a648d4f308 upstream. + +The DRC code will attempt to reuse an existing, expired cache entry in +preference to allocating a new one. It'll then search the cache, and if +it gets a hit it'll then free the cache entry that it was going to +reuse. + +The cache code doesn't unhash the entry that it's going to reuse +however, so it's possible for it end up designating an entry for reuse +and then subsequently freeing the same entry after it finds it. This +leads it to a later use-after-free situation and usually some list +corruption warnings or an oops. + +Fix this by simply unhashing the entry that we intend to reuse. That +will mean that it's not findable via a search and should prevent this +situation from occurring. + +Reported-by: Christoph Hellwig +Reported-by: g. artim +Signed-off-by: Jeff Layton +Signed-off-by: J. Bruce Fields +Signed-off-by: Greg Kroah-Hartman + +--- + fs/nfsd/nfscache.c | 9 ++++++++- + 1 file changed, 8 insertions(+), 1 deletion(-) + +--- a/fs/nfsd/nfscache.c ++++ b/fs/nfsd/nfscache.c +@@ -129,6 +129,13 @@ nfsd_reply_cache_alloc(void) + } + + static void ++nfsd_reply_cache_unhash(struct svc_cacherep *rp) ++{ ++ hlist_del_init(&rp->c_hash); ++ list_del_init(&rp->c_lru); ++} ++ ++static void + nfsd_reply_cache_free_locked(struct svc_cacherep *rp) + { + if (rp->c_type == RC_REPLBUFF && rp->c_replvec.iov_base) { +@@ -403,7 +410,7 @@ nfsd_cache_lookup(struct svc_rqst *rqstp + rp = list_first_entry(&lru_head, struct svc_cacherep, c_lru); + if (nfsd_cache_entry_expired(rp) || + num_drc_entries >= max_drc_entries) { +- lru_put_end(rp); ++ nfsd_reply_cache_unhash(rp); + prune_cache_entries(); + goto search_cache; + } diff --git a/queue-3.10/pci-disable-bus-master-only-on-kexec-reboot.patch b/queue-3.10/pci-disable-bus-master-only-on-kexec-reboot.patch new file mode 100644 index 00000000000..34f7efd91e1 --- /dev/null +++ b/queue-3.10/pci-disable-bus-master-only-on-kexec-reboot.patch @@ -0,0 +1,97 @@ +From 4fc9bbf98fd66f879e628d8537ba7c240be2b58e Mon Sep 17 00:00:00 2001 +From: Khalid Aziz +Date: Wed, 27 Nov 2013 15:19:25 -0700 +Subject: PCI: Disable Bus Master only on kexec reboot + +From: Khalid Aziz + +commit 4fc9bbf98fd66f879e628d8537ba7c240be2b58e upstream. + +Add a flag to tell the PCI subsystem that kernel is shutting down in +preparation to kexec a kernel. Add code in PCI subsystem to use this flag +to clear Bus Master bit on PCI devices only in case of kexec reboot. + +This fixes a power-off problem on Acer Aspire V5-573G and likely other +machines and avoids any other issues caused by clearing Bus Master bit on +PCI devices in normal shutdown path. The problem was introduced by +b566a22c2332 ("PCI: disable Bus Master on PCI device shutdown"). + +This patch is based on discussion at +http://marc.info/?l=linux-pci&m=138425645204355&w=2 + +Link: https://bugzilla.kernel.org/show_bug.cgi?id=63861 +Reported-by: Chang Liu +Signed-off-by: Khalid Aziz +Signed-off-by: Bjorn Helgaas +Acked-by: Konstantin Khlebnikov +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/pci/pci-driver.c | 12 +++++++++--- + include/linux/kexec.h | 3 +++ + kernel/kexec.c | 4 ++++ + 3 files changed, 16 insertions(+), 3 deletions(-) + +--- a/drivers/pci/pci-driver.c ++++ b/drivers/pci/pci-driver.c +@@ -19,6 +19,7 @@ + #include + #include + #include ++#include + #include "pci.h" + + struct pci_dynid { +@@ -388,12 +389,17 @@ static void pci_device_shutdown(struct d + pci_msi_shutdown(pci_dev); + pci_msix_shutdown(pci_dev); + ++#ifdef CONFIG_KEXEC + /* +- * Turn off Bus Master bit on the device to tell it to not +- * continue to do DMA. Don't touch devices in D3cold or unknown states. ++ * If this is a kexec reboot, turn off Bus Master bit on the ++ * device to tell it to not continue to do DMA. Don't touch ++ * devices in D3cold or unknown states. ++ * If it is not a kexec reboot, firmware will hit the PCI ++ * devices with big hammer and stop their DMA any way. + */ +- if (pci_dev->current_state <= PCI_D3hot) ++ if (kexec_in_progress && (pci_dev->current_state <= PCI_D3hot)) + pci_clear_master(pci_dev); ++#endif + } + + #ifdef CONFIG_PM +--- a/include/linux/kexec.h ++++ b/include/linux/kexec.h +@@ -198,6 +198,9 @@ extern u32 vmcoreinfo_note[VMCOREINFO_NO + extern size_t vmcoreinfo_size; + extern size_t vmcoreinfo_max_size; + ++/* flag to track if kexec reboot is in progress */ ++extern bool kexec_in_progress; ++ + int __init parse_crashkernel(char *cmdline, unsigned long long system_ram, + unsigned long long *crash_size, unsigned long long *crash_base); + int parse_crashkernel_high(char *cmdline, unsigned long long system_ram, +--- a/kernel/kexec.c ++++ b/kernel/kexec.c +@@ -47,6 +47,9 @@ u32 vmcoreinfo_note[VMCOREINFO_NOTE_SIZE + size_t vmcoreinfo_size; + size_t vmcoreinfo_max_size = sizeof(vmcoreinfo_data); + ++/* Flag to indicate we are going to kexec a new kernel */ ++bool kexec_in_progress = false; ++ + /* Location of the reserved area for the crash kernel */ + struct resource crashk_res = { + .name = "Crash kernel", +@@ -1678,6 +1681,7 @@ int kernel_kexec(void) + } else + #endif + { ++ kexec_in_progress = true; + kernel_restart_prepare(NULL); + printk(KERN_EMERG "Starting new kernel\n"); + machine_shutdown(); diff --git a/queue-3.10/series b/queue-3.10/series index a3444a917d8..33c48ed991a 100644 --- a/queue-3.10/series +++ b/queue-3.10/series @@ -20,3 +20,13 @@ hwmon-w83l786ng-fix-fan-speed-control-mode-setting-and-reporting.patch hwmon-w83l768ng-fix-fan-speed-control-range.patch xfs-growfs-overruns-agfl-buffer-on-v4-filesystems.patch xfs-underflow-bug-in-xfs_attrlist_by_handle.patch +pci-disable-bus-master-only-on-kexec-reboot.patch +futex-fix-handling-of-read-only-mapped-hugepages.patch +nfsd-when-reusing-an-existing-repcache-entry-unhash-it-first.patch +usb-hub-use-correct-reset-for-wedged-usb3-devices-that-are-notattached.patch +usb-dwc3-fix-implementation-of-endpoint-wedge.patch +usb-gadget-composite-reset-delayed_status-on-reset_config.patch +usb-serial-option-blacklist-interface-1-for-huawei-e173s-6.patch +usb-option-support-new-huawei-devices.patch +input-usbtouchscreen-separate-report-and-transmit-buffer-size-handling.patch +media-af9035-fix-broken-i2c-and-usb-i-o.patch diff --git a/queue-3.10/usb-dwc3-fix-implementation-of-endpoint-wedge.patch b/queue-3.10/usb-dwc3-fix-implementation-of-endpoint-wedge.patch new file mode 100644 index 00000000000..a2df4b7e1b8 --- /dev/null +++ b/queue-3.10/usb-dwc3-fix-implementation-of-endpoint-wedge.patch @@ -0,0 +1,58 @@ +From a535d81c92615b8ffb99b7e1fd1fb01effaed1af Mon Sep 17 00:00:00 2001 +From: Alan Stern +Date: Fri, 1 Nov 2013 12:05:12 -0400 +Subject: usb: dwc3: fix implementation of endpoint wedge + +From: Alan Stern + +commit a535d81c92615b8ffb99b7e1fd1fb01effaed1af upstream. + +The dwc3 UDC driver doesn't implement endpoint wedging correctly. +When an endpoint is wedged, the gadget driver should be allowed to +clear the wedge by calling usb_ep_clear_halt(). Only the host is +prevented from resetting the endpoint. + +This patch fixes the implementation. + +Signed-off-by: Alan Stern +Tested-by: Pratyush Anand +Signed-off-by: Felipe Balbi +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/usb/dwc3/ep0.c | 2 ++ + drivers/usb/dwc3/gadget.c | 5 +---- + 2 files changed, 3 insertions(+), 4 deletions(-) + +--- a/drivers/usb/dwc3/ep0.c ++++ b/drivers/usb/dwc3/ep0.c +@@ -478,6 +478,8 @@ static int dwc3_ep0_handle_feature(struc + dep = dwc3_wIndex_to_dep(dwc, wIndex); + if (!dep) + return -EINVAL; ++ if (set == 0 && (dep->flags & DWC3_EP_WEDGE)) ++ break; + ret = __dwc3_gadget_ep_set_halt(dep, set); + if (ret) + return -EINVAL; +--- a/drivers/usb/dwc3/gadget.c ++++ b/drivers/usb/dwc3/gadget.c +@@ -1220,9 +1220,6 @@ int __dwc3_gadget_ep_set_halt(struct dwc + else + dep->flags |= DWC3_EP_STALL; + } else { +- if (dep->flags & DWC3_EP_WEDGE) +- return 0; +- + ret = dwc3_send_gadget_ep_cmd(dwc, dep->number, + DWC3_DEPCMD_CLEARSTALL, ¶ms); + if (ret) +@@ -1230,7 +1227,7 @@ int __dwc3_gadget_ep_set_halt(struct dwc + value ? "set" : "clear", + dep->name); + else +- dep->flags &= ~DWC3_EP_STALL; ++ dep->flags &= ~(DWC3_EP_STALL | DWC3_EP_WEDGE); + } + + return ret; diff --git a/queue-3.10/usb-gadget-composite-reset-delayed_status-on-reset_config.patch b/queue-3.10/usb-gadget-composite-reset-delayed_status-on-reset_config.patch new file mode 100644 index 00000000000..3c83ad766a8 --- /dev/null +++ b/queue-3.10/usb-gadget-composite-reset-delayed_status-on-reset_config.patch @@ -0,0 +1,32 @@ +From 2bac51a1827a18821150ed8c9f9752c02f9c2b02 Mon Sep 17 00:00:00 2001 +From: Michael Grzeschik +Date: Mon, 11 Nov 2013 23:43:32 +0100 +Subject: usb: gadget: composite: reset delayed_status on reset_config + +From: Michael Grzeschik + +commit 2bac51a1827a18821150ed8c9f9752c02f9c2b02 upstream. + +The delayed_status value is used to keep track of status response +packets on ep0. It needs to be reset or the set_config function would +still delay the answer, if the usb device got unplugged while waiting +for setup_continue to be called. + +Signed-off-by: Michael Grzeschik +Signed-off-by: Felipe Balbi +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/usb/gadget/composite.c | 1 + + 1 file changed, 1 insertion(+) + +--- a/drivers/usb/gadget/composite.c ++++ b/drivers/usb/gadget/composite.c +@@ -593,6 +593,7 @@ static void reset_config(struct usb_comp + bitmap_zero(f->endpoints, 32); + } + cdev->config = NULL; ++ cdev->delayed_status = 0; + } + + static int set_config(struct usb_composite_dev *cdev, diff --git a/queue-3.10/usb-hub-use-correct-reset-for-wedged-usb3-devices-that-are-notattached.patch b/queue-3.10/usb-hub-use-correct-reset-for-wedged-usb3-devices-that-are-notattached.patch new file mode 100644 index 00000000000..3f4ef37fe57 --- /dev/null +++ b/queue-3.10/usb-hub-use-correct-reset-for-wedged-usb3-devices-that-are-notattached.patch @@ -0,0 +1,37 @@ +From 2d51f3cd11f414c56a87dc018196b85fd50b04a4 Mon Sep 17 00:00:00 2001 +From: Julius Werner +Date: Thu, 7 Nov 2013 10:59:14 -0800 +Subject: usb: hub: Use correct reset for wedged USB3 devices that are NOTATTACHED + +From: Julius Werner + +commit 2d51f3cd11f414c56a87dc018196b85fd50b04a4 upstream. + +This patch adds a check for USB_STATE_NOTATTACHED to the +hub_port_warm_reset_required() workaround for ports that end up in +Compliance Mode in hub_events() when trying to decide which reset +function to use. Trying to call usb_reset_device() with a NOTATTACHED +device will just fail and leave the port broken. + +Signed-off-by: Julius Werner +Acked-by: Alan Stern +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/usb/core/hub.c | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +--- a/drivers/usb/core/hub.c ++++ b/drivers/usb/core/hub.c +@@ -4808,8 +4808,9 @@ static void hub_events(void) + hub->ports[i - 1]->child; + + dev_dbg(hub_dev, "warm reset port %d\n", i); +- if (!udev || !(portstatus & +- USB_PORT_STAT_CONNECTION)) { ++ if (!udev || ++ !(portstatus & USB_PORT_STAT_CONNECTION) || ++ udev->state == USB_STATE_NOTATTACHED) { + status = hub_port_reset(hub, i, + NULL, HUB_BH_RESET_TIME, + true); diff --git a/queue-3.10/usb-option-support-new-huawei-devices.patch b/queue-3.10/usb-option-support-new-huawei-devices.patch new file mode 100644 index 00000000000..f0f76c24202 --- /dev/null +++ b/queue-3.10/usb-option-support-new-huawei-devices.patch @@ -0,0 +1,87 @@ +From 2bf308d7bc5e8cdd69672199f59532f35339133c Mon Sep 17 00:00:00 2001 +From: "Fangxiaozhi (Franko)" +Date: Mon, 2 Dec 2013 09:00:11 +0000 +Subject: USB: option: support new huawei devices + +From: "Fangxiaozhi (Franko)" + +commit 2bf308d7bc5e8cdd69672199f59532f35339133c upstream. + +Add new supporting declarations to option.c, to support Huawei new +devices with new bInterfaceProtocol value. + +Signed-off-by: fangxiaozhi +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/usb/serial/option.c | 24 ++++++++++++++++++++++++ + 1 file changed, 24 insertions(+) + +--- a/drivers/usb/serial/option.c ++++ b/drivers/usb/serial/option.c +@@ -637,6 +637,10 @@ static const struct usb_device_id option + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x01, 0x6D) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x01, 0x6E) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x01, 0x6F) }, ++ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x01, 0x72) }, ++ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x01, 0x73) }, ++ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x01, 0x74) }, ++ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x01, 0x75) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x01, 0x78) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x01, 0x79) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x01, 0x7A) }, +@@ -691,6 +695,10 @@ static const struct usb_device_id option + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x6D) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x6E) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x6F) }, ++ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x72) }, ++ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x73) }, ++ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x74) }, ++ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x75) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x78) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x79) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x02, 0x7A) }, +@@ -745,6 +753,10 @@ static const struct usb_device_id option + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x6D) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x6E) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x6F) }, ++ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x72) }, ++ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x73) }, ++ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x74) }, ++ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x75) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x78) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x79) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x03, 0x7A) }, +@@ -799,6 +811,10 @@ static const struct usb_device_id option + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x6D) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x6E) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x6F) }, ++ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x72) }, ++ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x73) }, ++ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x74) }, ++ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x75) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x78) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x79) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x04, 0x7A) }, +@@ -853,6 +869,10 @@ static const struct usb_device_id option + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x6D) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x6E) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x6F) }, ++ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x72) }, ++ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x73) }, ++ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x74) }, ++ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x75) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x78) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x79) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x05, 0x7A) }, +@@ -907,6 +927,10 @@ static const struct usb_device_id option + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x6D) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x6E) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x6F) }, ++ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x72) }, ++ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x73) }, ++ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x74) }, ++ { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x75) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x78) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x79) }, + { USB_VENDOR_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0xff, 0x06, 0x7A) }, diff --git a/queue-3.10/usb-serial-option-blacklist-interface-1-for-huawei-e173s-6.patch b/queue-3.10/usb-serial-option-blacklist-interface-1-for-huawei-e173s-6.patch new file mode 100644 index 00000000000..a4beba3055d --- /dev/null +++ b/queue-3.10/usb-serial-option-blacklist-interface-1-for-huawei-e173s-6.patch @@ -0,0 +1,43 @@ +From 8f173e22abf2258ddfa73f46eadbb6a6c29f1631 Mon Sep 17 00:00:00 2001 +From: Gustavo Zacarias +Date: Mon, 11 Nov 2013 09:59:15 -0300 +Subject: USB: serial: option: blacklist interface 1 for Huawei E173s-6 + +From: Gustavo Zacarias + +commit 8f173e22abf2258ddfa73f46eadbb6a6c29f1631 upstream. + +Interface 1 on this device isn't for option to bind to otherwise an oops +on usb_wwan with log flooding will happen when accessing the port: + +tty_release: ttyUSB1: read/write wait queue active! + +It doesn't seem to respond to QMI if it's added to qmi_wwan so don't add +it there - it's likely used by the card reader. + +Signed-off-by: Gustavo Zacarias +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/usb/serial/option.c | 3 +++ + 1 file changed, 3 insertions(+) + +--- a/drivers/usb/serial/option.c ++++ b/drivers/usb/serial/option.c +@@ -85,6 +85,7 @@ static void option_instat_callback(struc + #define HUAWEI_PRODUCT_K4505 0x1464 + #define HUAWEI_PRODUCT_K3765 0x1465 + #define HUAWEI_PRODUCT_K4605 0x14C6 ++#define HUAWEI_PRODUCT_E173S6 0x1C07 + + #define QUANTA_VENDOR_ID 0x0408 + #define QUANTA_PRODUCT_Q101 0xEA02 +@@ -572,6 +573,8 @@ static const struct usb_device_id option + { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0x1c23, USB_CLASS_COMM, 0x02, 0xff) }, + { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E173, 0xff, 0xff, 0xff), + .driver_info = (kernel_ulong_t) &net_intf1_blacklist }, ++ { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E173S6, 0xff, 0xff, 0xff), ++ .driver_info = (kernel_ulong_t) &net_intf1_blacklist }, + { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1750, 0xff, 0xff, 0xff), + .driver_info = (kernel_ulong_t) &net_intf2_blacklist }, + { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, 0x1441, USB_CLASS_COMM, 0x02, 0xff) },