From: Greg Kroah-Hartman Date: Sun, 25 Jan 2015 14:41:00 +0000 (+0800) Subject: 3.10-stable patches X-Git-Tag: v3.10.66~22 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=8f7013ab2d043411948426cfd84fdfce95baefd5;p=thirdparty%2Fkernel%2Fstable-queue.git 3.10-stable patches added patches: ohci-add-a-quirk-for-uli-m5237-blocking-on-reset.patch usb-cp210x-add-ids-for-cel-usb-sticks-and-meshworks-devices.patch usb-cp210x-fix-id-for-production-cel-meshconnect-usb-stick.patch usb-dwc3-gadget-fix-trb-preparation-during-sg.patch usb-dwc3-gadget-stop-trb-preparation-after-limit-is-reached.patch usb-keyspan-fix-null-deref-at-probe.patch --- diff --git a/queue-3.10/ohci-add-a-quirk-for-uli-m5237-blocking-on-reset.patch b/queue-3.10/ohci-add-a-quirk-for-uli-m5237-blocking-on-reset.patch new file mode 100644 index 00000000000..f788225f32a --- /dev/null +++ b/queue-3.10/ohci-add-a-quirk-for-uli-m5237-blocking-on-reset.patch @@ -0,0 +1,81 @@ +From 56abcab833fafcfaeb2f5b25e0364c1dec45f53e Mon Sep 17 00:00:00 2001 +From: Arseny Solokha +Date: Sat, 6 Dec 2014 09:54:06 +0700 +Subject: OHCI: add a quirk for ULi M5237 blocking on reset + +From: Arseny Solokha + +commit 56abcab833fafcfaeb2f5b25e0364c1dec45f53e upstream. + +Commit 8dccddbc2368 ("OHCI: final fix for NVIDIA problems (I hope)") +introduced into 3.1.9 broke boot on e.g. Freescale P2020DS development +board. The code path that was previously specific to NVIDIA controllers +had then become taken for all chips. + +However, the M5237 installed on the board wedges solid when accessing +its base+OHCI_FMINTERVAL register, making it impossible to boot any +kernel newer than 3.1.8 on this particular and apparently other similar +machines. + +Don't readl() and writel() base+OHCI_FMINTERVAL on PCI ID 10b9:5237. + +The patch is suitable for the -next tree as well as all maintained +kernels up to 3.2 inclusive. + +Signed-off-by: Arseny Solokha +Acked-by: Alan Stern +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/usb/host/pci-quirks.c | 18 +++++++++++++++--- + 1 file changed, 15 insertions(+), 3 deletions(-) + +--- a/drivers/usb/host/pci-quirks.c ++++ b/drivers/usb/host/pci-quirks.c +@@ -470,7 +470,8 @@ static void quirk_usb_handoff_ohci(struc + { + void __iomem *base; + u32 control; +- u32 fminterval; ++ u32 fminterval = 0; ++ bool no_fminterval = false; + int cnt; + + if (!mmio_resource_enabled(pdev, 0)) +@@ -480,6 +481,13 @@ static void quirk_usb_handoff_ohci(struc + if (base == NULL) + return; + ++ /* ++ * ULi M5237 OHCI controller locks the whole system when accessing ++ * the OHCI_FMINTERVAL offset. ++ */ ++ if (pdev->vendor == PCI_VENDOR_ID_AL && pdev->device == 0x5237) ++ no_fminterval = true; ++ + control = readl(base + OHCI_CONTROL); + + /* On PA-RISC, PDC can leave IR set incorrectly; ignore it there. */ +@@ -518,7 +526,9 @@ static void quirk_usb_handoff_ohci(struc + } + + /* software reset of the controller, preserving HcFmInterval */ +- fminterval = readl(base + OHCI_FMINTERVAL); ++ if (!no_fminterval) ++ fminterval = readl(base + OHCI_FMINTERVAL); ++ + writel(OHCI_HCR, base + OHCI_CMDSTATUS); + + /* reset requires max 10 us delay */ +@@ -527,7 +537,9 @@ static void quirk_usb_handoff_ohci(struc + break; + udelay(1); + } +- writel(fminterval, base + OHCI_FMINTERVAL); ++ ++ if (!no_fminterval) ++ writel(fminterval, base + OHCI_FMINTERVAL); + + /* Now the controller is safely in SUSPEND and nothing can wake it up */ + iounmap(base); diff --git a/queue-3.10/series b/queue-3.10/series index 854bfc125d4..28ed81b5092 100644 --- a/queue-3.10/series +++ b/queue-3.10/series @@ -23,3 +23,9 @@ vfio-pci-fix-the-check-on-pci-device-type-in.patch ftrace-jprobes-x86-fix-conflict-between-jprobes-and-function-graph-tracing.patch nfsv4.1-fix-client-id-trunking-on-linux.patch gpiolib-of-correct-error-handling-in-of_get_named_gpiod_flags.patch +ohci-add-a-quirk-for-uli-m5237-blocking-on-reset.patch +usb-dwc3-gadget-fix-trb-preparation-during-sg.patch +usb-dwc3-gadget-stop-trb-preparation-after-limit-is-reached.patch +usb-cp210x-fix-id-for-production-cel-meshconnect-usb-stick.patch +usb-cp210x-add-ids-for-cel-usb-sticks-and-meshworks-devices.patch +usb-keyspan-fix-null-deref-at-probe.patch diff --git a/queue-3.10/usb-cp210x-add-ids-for-cel-usb-sticks-and-meshworks-devices.patch b/queue-3.10/usb-cp210x-add-ids-for-cel-usb-sticks-and-meshworks-devices.patch new file mode 100644 index 00000000000..eabfbc8516b --- /dev/null +++ b/queue-3.10/usb-cp210x-add-ids-for-cel-usb-sticks-and-meshworks-devices.patch @@ -0,0 +1,36 @@ +From 1ae78a4870989a354028cb17dabf819b595e70e3 Mon Sep 17 00:00:00 2001 +From: David Peterson +Date: Tue, 6 Jan 2015 15:00:52 +0000 +Subject: USB: cp210x: add IDs for CEL USB sticks and MeshWorks devices + +From: David Peterson + +commit 1ae78a4870989a354028cb17dabf819b595e70e3 upstream. + +Added virtual com port VID/PID entries for CEL USB sticks and MeshWorks +devices. + +Signed-off-by: David Peterson +Signed-off-by: Johan Hovold +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/usb/serial/cp210x.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +--- a/drivers/usb/serial/cp210x.c ++++ b/drivers/usb/serial/cp210x.c +@@ -120,10 +120,12 @@ static const struct usb_device_id id_tab + { USB_DEVICE(0x10C4, 0x85F8) }, /* Virtenio Preon32 */ + { USB_DEVICE(0x10C4, 0x8664) }, /* AC-Services CAN-IF */ + { USB_DEVICE(0x10C4, 0x8665) }, /* AC-Services OBD-IF */ +- { USB_DEVICE(0x10C4, 0x8857) }, /* CEL MeshConnect USB Stick */ ++ { USB_DEVICE(0x10C4, 0x8856) }, /* CEL EM357 ZigBee USB Stick - LR */ ++ { USB_DEVICE(0x10C4, 0x8857) }, /* CEL EM357 ZigBee USB Stick */ + { USB_DEVICE(0x10C4, 0x88A4) }, /* MMB Networks ZigBee USB Device */ + { USB_DEVICE(0x10C4, 0x88A5) }, /* Planet Innovation Ingeni ZigBee USB Device */ + { USB_DEVICE(0x10C4, 0x8946) }, /* Ketra N1 Wireless Interface */ ++ { USB_DEVICE(0x10C4, 0x8977) }, /* CEL MeshWorks DevKit Device */ + { USB_DEVICE(0x10C4, 0xEA60) }, /* Silicon Labs factory default */ + { USB_DEVICE(0x10C4, 0xEA61) }, /* Silicon Labs factory default */ + { USB_DEVICE(0x10C4, 0xEA70) }, /* Silicon Labs factory default */ diff --git a/queue-3.10/usb-cp210x-fix-id-for-production-cel-meshconnect-usb-stick.patch b/queue-3.10/usb-cp210x-fix-id-for-production-cel-meshconnect-usb-stick.patch new file mode 100644 index 00000000000..743bcd3f6e4 --- /dev/null +++ b/queue-3.10/usb-cp210x-fix-id-for-production-cel-meshconnect-usb-stick.patch @@ -0,0 +1,32 @@ +From 90441b4dbe90ba0c38111ea89fa093a8c9627801 Mon Sep 17 00:00:00 2001 +From: Preston Fick +Date: Sat, 27 Dec 2014 01:32:41 -0600 +Subject: USB: cp210x: fix ID for production CEL MeshConnect USB Stick + +From: Preston Fick + +commit 90441b4dbe90ba0c38111ea89fa093a8c9627801 upstream. + +Fixing typo for MeshConnect IDs. The original PID (0x8875) is not in +production and is not needed. Instead it has been changed to the +official production PID (0x8857). + +Signed-off-by: Preston Fick +Signed-off-by: Johan Hovold +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/usb/serial/cp210x.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/usb/serial/cp210x.c ++++ b/drivers/usb/serial/cp210x.c +@@ -120,7 +120,7 @@ static const struct usb_device_id id_tab + { USB_DEVICE(0x10C4, 0x85F8) }, /* Virtenio Preon32 */ + { USB_DEVICE(0x10C4, 0x8664) }, /* AC-Services CAN-IF */ + { USB_DEVICE(0x10C4, 0x8665) }, /* AC-Services OBD-IF */ +- { USB_DEVICE(0x10C4, 0x8875) }, /* CEL MeshConnect USB Stick */ ++ { USB_DEVICE(0x10C4, 0x8857) }, /* CEL MeshConnect USB Stick */ + { USB_DEVICE(0x10C4, 0x88A4) }, /* MMB Networks ZigBee USB Device */ + { USB_DEVICE(0x10C4, 0x88A5) }, /* Planet Innovation Ingeni ZigBee USB Device */ + { USB_DEVICE(0x10C4, 0x8946) }, /* Ketra N1 Wireless Interface */ diff --git a/queue-3.10/usb-dwc3-gadget-fix-trb-preparation-during-sg.patch b/queue-3.10/usb-dwc3-gadget-fix-trb-preparation-during-sg.patch new file mode 100644 index 00000000000..51f7aa0a09d --- /dev/null +++ b/queue-3.10/usb-dwc3-gadget-fix-trb-preparation-during-sg.patch @@ -0,0 +1,44 @@ +From ec512fb8e5611fed1df2895f90317ce6797d6b32 Mon Sep 17 00:00:00 2001 +From: Amit Virdi +Date: Tue, 13 Jan 2015 14:27:20 +0530 +Subject: usb: dwc3: gadget: Fix TRB preparation during SG + +From: Amit Virdi + +commit ec512fb8e5611fed1df2895f90317ce6797d6b32 upstream. + +When scatter gather (SG) is used, multiple TRBs are prepared from one DWC3 +request (dwc3_request). So while preparing TRBs, the 'last' flag should be set +only when it is the last TRB being prepared from the last dwc3_request entry. + +The current implementation uses list_is_last to check if the dwc3_request is the +last entry from the request_list. However, list_is_last returns false for the +last entry too. This is because, while preparing the first TRB from a request, +the function dwc3_prepare_one_trb modifies the request's next and prev pointers +while moving the URB to req_queued. Hence, list_is_last always returns false no +matter what. + +The correct way is not to access the modified pointers of dwc3_request but to +use list_empty macro instead. + +Fixes: e5ba5ec833aa (usb: dwc3: gadget: fix scatter gather implementation) +Signed-off-by: Amit Virdi +Signed-off-by: Felipe Balbi +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/usb/dwc3/gadget.c | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +--- a/drivers/usb/dwc3/gadget.c ++++ b/drivers/usb/dwc3/gadget.c +@@ -907,8 +907,7 @@ static void dwc3_prepare_trbs(struct dwc + + if (i == (request->num_mapped_sgs - 1) || + sg_is_last(s)) { +- if (list_is_last(&req->list, +- &dep->request_list)) ++ if (list_empty(&dep->request_list)) + last_one = true; + chain = false; + } diff --git a/queue-3.10/usb-dwc3-gadget-stop-trb-preparation-after-limit-is-reached.patch b/queue-3.10/usb-dwc3-gadget-stop-trb-preparation-after-limit-is-reached.patch new file mode 100644 index 00000000000..8e41c7825a7 --- /dev/null +++ b/queue-3.10/usb-dwc3-gadget-stop-trb-preparation-after-limit-is-reached.patch @@ -0,0 +1,44 @@ +From 39e60635a01520e8c8ed3946a28c2b98e6a46f79 Mon Sep 17 00:00:00 2001 +From: Amit Virdi +Date: Tue, 13 Jan 2015 14:27:21 +0530 +Subject: usb: dwc3: gadget: Stop TRB preparation after limit is reached + +From: Amit Virdi + +commit 39e60635a01520e8c8ed3946a28c2b98e6a46f79 upstream. + +DWC3 gadget sets up a pool of 32 TRBs for each EP during initialization. This +means, the max TRBs that can be submitted for an EP is fixed to 32. Since the +request queue for an EP is a linked list, any number of requests can be queued +to it by the gadget layer. However, the dwc3 driver must not submit TRBs more +than the pool it has created for. This limit wasn't respected when SG was used +resulting in submitting more than the max TRBs, eventually leading to +non-transfer of the TRBs submitted over the max limit. + +Root cause: +When SG is used, there are two loops iterating to prepare TRBs: + - Outer loop over the request_list + - Inner loop over the SG list +The code was missing break to get out of the outer loop. + +Fixes: eeb720fb21d6 (usb: dwc3: gadget: add support for SG lists) +Signed-off-by: Amit Virdi +Signed-off-by: Felipe Balbi +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/usb/dwc3/gadget.c | 3 +++ + 1 file changed, 3 insertions(+) + +--- a/drivers/usb/dwc3/gadget.c ++++ b/drivers/usb/dwc3/gadget.c +@@ -925,6 +925,9 @@ static void dwc3_prepare_trbs(struct dwc + if (last_one) + break; + } ++ ++ if (last_one) ++ break; + } else { + dma = req->request.dma; + length = req->request.length; diff --git a/queue-3.10/usb-keyspan-fix-null-deref-at-probe.patch b/queue-3.10/usb-keyspan-fix-null-deref-at-probe.patch new file mode 100644 index 00000000000..771016d7e5d --- /dev/null +++ b/queue-3.10/usb-keyspan-fix-null-deref-at-probe.patch @@ -0,0 +1,116 @@ +From b5122236bba8d7ef62153da5b55cc65d0944c61e Mon Sep 17 00:00:00 2001 +From: Johan Hovold +Date: Mon, 22 Dec 2014 18:39:39 +0100 +Subject: USB: keyspan: fix null-deref at probe + +From: Johan Hovold + +commit b5122236bba8d7ef62153da5b55cc65d0944c61e upstream. + +Fix null-pointer dereference during probe if the interface-status +completion handler is called before the individual ports have been set +up. + +Fixes: f79b2d0fe81e ("USB: keyspan: fix NULL-pointer dereferences and +memory leaks") +Reported-by: Richard +Tested-by: Richard +Signed-off-by: Johan Hovold +Signed-off-by: Greg Kroah-Hartman + +--- + drivers/usb/serial/keyspan.c | 20 +++++++++++++++----- + 1 file changed, 15 insertions(+), 5 deletions(-) + +--- a/drivers/usb/serial/keyspan.c ++++ b/drivers/usb/serial/keyspan.c +@@ -418,6 +418,8 @@ static void usa26_instat_callback(struct + } + port = serial->port[msg->port]; + p_priv = usb_get_serial_port_data(port); ++ if (!p_priv) ++ goto resubmit; + + /* Update handshaking pin state information */ + old_dcd_state = p_priv->dcd_state; +@@ -428,7 +430,7 @@ static void usa26_instat_callback(struct + + if (old_dcd_state != p_priv->dcd_state) + tty_port_tty_hangup(&port->port, true); +- ++resubmit: + /* Resubmit urb so we continue receiving */ + err = usb_submit_urb(urb, GFP_ATOMIC); + if (err != 0) +@@ -543,6 +545,8 @@ static void usa28_instat_callback(struct + } + port = serial->port[msg->port]; + p_priv = usb_get_serial_port_data(port); ++ if (!p_priv) ++ goto resubmit; + + /* Update handshaking pin state information */ + old_dcd_state = p_priv->dcd_state; +@@ -553,7 +557,7 @@ static void usa28_instat_callback(struct + + if (old_dcd_state != p_priv->dcd_state && old_dcd_state) + tty_port_tty_hangup(&port->port, true); +- ++resubmit: + /* Resubmit urb so we continue receiving */ + err = usb_submit_urb(urb, GFP_ATOMIC); + if (err != 0) +@@ -630,6 +634,8 @@ static void usa49_instat_callback(struct + } + port = serial->port[msg->portNumber]; + p_priv = usb_get_serial_port_data(port); ++ if (!p_priv) ++ goto resubmit; + + /* Update handshaking pin state information */ + old_dcd_state = p_priv->dcd_state; +@@ -640,7 +646,7 @@ static void usa49_instat_callback(struct + + if (old_dcd_state != p_priv->dcd_state && old_dcd_state) + tty_port_tty_hangup(&port->port, true); +- ++resubmit: + /* Resubmit urb so we continue receiving */ + err = usb_submit_urb(urb, GFP_ATOMIC); + if (err != 0) +@@ -878,6 +884,8 @@ static void usa90_instat_callback(struct + + port = serial->port[0]; + p_priv = usb_get_serial_port_data(port); ++ if (!p_priv) ++ goto resubmit; + + /* Update handshaking pin state information */ + old_dcd_state = p_priv->dcd_state; +@@ -888,7 +896,7 @@ static void usa90_instat_callback(struct + + if (old_dcd_state != p_priv->dcd_state && old_dcd_state) + tty_port_tty_hangup(&port->port, true); +- ++resubmit: + /* Resubmit urb so we continue receiving */ + err = usb_submit_urb(urb, GFP_ATOMIC); + if (err != 0) +@@ -949,6 +957,8 @@ static void usa67_instat_callback(struct + + port = serial->port[msg->port]; + p_priv = usb_get_serial_port_data(port); ++ if (!p_priv) ++ goto resubmit; + + /* Update handshaking pin state information */ + old_dcd_state = p_priv->dcd_state; +@@ -957,7 +967,7 @@ static void usa67_instat_callback(struct + + if (old_dcd_state != p_priv->dcd_state && old_dcd_state) + tty_port_tty_hangup(&port->port, true); +- ++resubmit: + /* Resubmit urb so we continue receiving */ + err = usb_submit_urb(urb, GFP_ATOMIC); + if (err != 0)