aboutsummaryrefslogtreecommitdiffstats
diff options
-rw-r--r--series3
-rw-r--r--staging-fix-comedi-build-when-isa_dma_api-is-enabled-but-comedi_pci-is-not-enabled.patch40
-rw-r--r--usb-xhci-prevent-infinite-loop-when-processing-mse-event.patch93
-rw-r--r--usb-xhci-set-change-bit-when-warm-reset-change-is-set.patch57
4 files changed, 193 insertions, 0 deletions
diff --git a/series b/series
index 65f99eb8eb5f55..3b55ce58139575 100644
--- a/series
+++ b/series
@@ -53,3 +53,6 @@ platform-fix-error-path-in-samsung-laptop-init.patch
platform-brightness-quirk-for-samsung-laptop-driver.patch
platform-samsung-laptop-dmi-info-for-nc210-nc110.patch
platform-fix-samsung-laptop-dmi-identification-for-n220-model.patch
+staging-fix-comedi-build-when-isa_dma_api-is-enabled-but-comedi_pci-is-not-enabled.patch
+usb-xhci-set-change-bit-when-warm-reset-change-is-set.patch
+usb-xhci-prevent-infinite-loop-when-processing-mse-event.patch
diff --git a/staging-fix-comedi-build-when-isa_dma_api-is-enabled-but-comedi_pci-is-not-enabled.patch b/staging-fix-comedi-build-when-isa_dma_api-is-enabled-but-comedi_pci-is-not-enabled.patch
new file mode 100644
index 00000000000000..75d5eec23b5121
--- /dev/null
+++ b/staging-fix-comedi-build-when-isa_dma_api-is-enabled-but-comedi_pci-is-not-enabled.patch
@@ -0,0 +1,40 @@
+From rdunlap@xenotime.net Mon Sep 19 15:06:19 2011
+Date: Sun, 18 Sep 2011 08:02:04 -0700
+From: Randy Dunlap <rdunlap@xenotime.net>
+To: Greg KH <greg@kroah.com>
+Cc: Greg KH <gregkh@suse.de>, Andrew Morton <akpm@linux-foundation.org>, Ian Abbott <abbotti@mev.co.uk>, Frank Mori Hess <fmhess@users.sourceforge.net>
+Subject: staging: fix comedi build when ISA_DMA_API is enabled but COMEDI_PCI is not enabled
+
+From: Randy Dunlap <rdunlap@xenotime.net>
+
+Fix build when CONFIG_ISA_DMA_API is enabled but
+CONFIG_COMEDI_PCI[_DRIVERS] is not enabled.
+Fixes these build errors:
+
+drivers/staging/comedi/drivers/ni_labpc.c: In function 'labpc_ai_cmd':
+drivers/staging/comedi/drivers/ni_labpc.c:1351: error: implicit declaration of function 'labpc_suggest_transfer_size'
+drivers/staging/comedi/drivers/ni_labpc.c: At top level:
+drivers/staging/comedi/drivers/ni_labpc.c:1802: error: conflicting types for 'labpc_suggest_transfer_size'
+drivers/staging/comedi/drivers/ni_labpc.c:1351: note: previous implicit declaration of 'labpc_suggest_transfer_size' was here
+
+Signed-off-by: Randy Dunlap <rdunlap@xenotime.net>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/staging/comedi/drivers/ni_labpc.c | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+--- a/drivers/staging/comedi/drivers/ni_labpc.c
++++ b/drivers/staging/comedi/drivers/ni_labpc.c
+@@ -241,8 +241,10 @@ static int labpc_eeprom_write_insn(struc
+ struct comedi_insn *insn,
+ unsigned int *data);
+ static void labpc_adc_timing(struct comedi_device *dev, struct comedi_cmd *cmd);
+-#ifdef CONFIG_COMEDI_PCI
++#ifdef CONFIG_ISA_DMA_API
+ static unsigned int labpc_suggest_transfer_size(struct comedi_cmd cmd);
++#endif
++#ifdef CONFIG_COMEDI_PCI
+ static int labpc_find_device(struct comedi_device *dev, int bus, int slot);
+ #endif
+ static int labpc_dio_mem_callback(int dir, int port, int data,
diff --git a/usb-xhci-prevent-infinite-loop-when-processing-mse-event.patch b/usb-xhci-prevent-infinite-loop-when-processing-mse-event.patch
new file mode 100644
index 00000000000000..24691709cfab4b
--- /dev/null
+++ b/usb-xhci-prevent-infinite-loop-when-processing-mse-event.patch
@@ -0,0 +1,93 @@
+From linux-usb-owner@vger.kernel.org Mon Sep 19 15:07:18 2011
+Date: Tue, 13 Sep 2011 16:28:09 -0700
+From: Sarah Sharp <sarah.a.sharp@linux.intel.com>
+To: Greg Kroah-Hartman <gregkh@suse.de>
+Cc: Andiry Xu <andiry.xu@amd.com>, linux-usb@vger.kernel.org
+Subject: USB: xHCI: prevent infinite loop when processing MSE event
+Message-ID: <e85921ca35df47e8837db46b8834055510783fd2.1315956216.git.sarah.a.sharp@linux.intel.com>
+Content-Disposition: inline
+
+From: Andiry Xu <andiry.xu@amd.com>
+
+When a xHC host is unable to handle isochronous transfer in the interval,
+it reports a Missed Service Error event and skips some tds.
+
+Currently xhci driver handles MSE event in the following ways:
+
+1. When encounter a MSE event, set ep->skip flag, update event ring dequeue
+pointer and return.
+2. When encounter the next event on this ep, the driver will run the do-while
+loop, fetch td from ep's td_list to find the td corresponding to this event.
+All tds missed are marked as short transfer(-EXDEV).
+
+The do-while loop will end in two ways:
+1. If the td pointed by the event trb is found;
+2. If the ep ring's td_list is empty.
+
+However, if a buggy HW reports some unpredicted event (for example, an overrun
+event following a MSE event while the ep ring is actually not empty), the
+driver will never find the td, and it will loop until the td_list is empty.
+
+Unfortunately, the spinlock is dropped when give back a urb in the do-while
+loop. During the spinlock released period, the class driver may still
+submit urbs and add tds to the td_list. This may cause disaster, since the
+td_list will never be empty and the loop never ends, and the system hangs.
+
+To fix this, count the number of TDs on the ep ring before skipping TDs, and
+quit the loop when skipped that number of tds. This guarantees the do-while
+loop will end after certain number of cycles, and driver will not be trapped
+in an infinite loop.
+
+Signed-off-by: Andiry Xu <andiry.xu@amd.com>
+Signed-off-by: Sarah Sharp <sarah.a.sharp@linux.intel.com>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/usb/host/xhci-ring.c | 19 +++++++++++++++++++
+ 1 file changed, 19 insertions(+)
+
+--- a/drivers/usb/host/xhci-ring.c
++++ b/drivers/usb/host/xhci-ring.c
+@@ -1934,8 +1934,10 @@ static int handle_tx_event(struct xhci_h
+ int status = -EINPROGRESS;
+ struct urb_priv *urb_priv;
+ struct xhci_ep_ctx *ep_ctx;
++ struct list_head *tmp;
+ u32 trb_comp_code;
+ int ret = 0;
++ int td_num = 0;
+
+ slot_id = TRB_TO_SLOT_ID(le32_to_cpu(event->flags));
+ xdev = xhci->devs[slot_id];
+@@ -1957,6 +1959,12 @@ static int handle_tx_event(struct xhci_h
+ return -ENODEV;
+ }
+
++ /* Count current td numbers if ep->skip is set */
++ if (ep->skip) {
++ list_for_each(tmp, &ep_ring->td_list)
++ td_num++;
++ }
++
+ event_dma = le64_to_cpu(event->buffer);
+ trb_comp_code = GET_COMP_CODE(le32_to_cpu(event->transfer_len));
+ /* Look for common error cases */
+@@ -2068,7 +2076,18 @@ static int handle_tx_event(struct xhci_h
+ goto cleanup;
+ }
+
++ /* We've skipped all the TDs on the ep ring when ep->skip set */
++ if (ep->skip && td_num == 0) {
++ ep->skip = false;
++ xhci_dbg(xhci, "All tds on the ep_ring skipped. "
++ "Clear skip flag.\n");
++ ret = 0;
++ goto cleanup;
++ }
++
+ td = list_entry(ep_ring->td_list.next, struct xhci_td, td_list);
++ if (ep->skip)
++ td_num--;
+
+ /* Is this a TRB in the currently executing TD? */
+ event_seg = trb_in_td(ep_ring->deq_seg, ep_ring->dequeue,
diff --git a/usb-xhci-set-change-bit-when-warm-reset-change-is-set.patch b/usb-xhci-set-change-bit-when-warm-reset-change-is-set.patch
new file mode 100644
index 00000000000000..1eab6a180b6fd9
--- /dev/null
+++ b/usb-xhci-set-change-bit-when-warm-reset-change-is-set.patch
@@ -0,0 +1,57 @@
+From sarah.a.sharp@linux.intel.com Mon Sep 19 15:07:01 2011
+Date: Tue, 13 Sep 2011 16:28:08 -0700
+From: Sarah Sharp <sarah.a.sharp@linux.intel.com>
+To: Greg Kroah-Hartman <gregkh@suse.de>
+Cc: linux-usb@vger.kernel.org
+Subject: USB: xhci: Set change bit when warm reset change is set.
+Message-ID: <10d11804ad460a2b0e22655ab1a8dde9e21a17b3.1315956216.git.sarah.a.sharp@linux.intel.com>
+
+Sometimes, when a USB 3.0 device is disconnected, the Intel Panther Point
+xHCI host controller will report a link state change with the state set
+to "SS.Inactive". This causes the xHCI host controller to issue a warm
+port reset, which doesn't finish before the USB core times out while
+waiting for it to complete.
+
+When the warm port reset does complete, and the xHC gives back a port
+status change event, the xHCI driver kicks khubd. However, it fails to
+set the bit indicating there is a change event for that port because the
+logic in xhci-hub.c doesn't check for the warm port reset bit.
+
+After that, the warm port status change bit is never cleared by the USB
+core, and the xHC stops reporting port status change bits. (The xHCI spec
+says it shouldn't report more port events until all change bits are
+cleared.) This means any port changes when a new device is connected will
+never be reported, and the port will seem "dead" until the xHCI driver is
+unloaded and reloaded, or the computer is rebooted. Fix this by making
+the xHCI driver set the port change bit when a warm port reset change bit
+is set.
+
+A better solution would be to make the USB core handle warm port reset in
+differently, merging the current code with the standard port reset code
+that does an incremental backoff on the timeout, and tries to complete the
+port reset two more times before giving up. That more complicated fix
+will be merged next window, and this fix will be backported to stable.
+
+This should be backported to kernels as old as 3.0, since that was the
+first kernel with commit a11496ebf37534177d67222285e8debed7a39788
+"xHCI: warm reset support".
+
+Signed-off-by: Sarah Sharp <sarah.a.sharp@linux.intel.com>
+Cc: stable@kernel.org
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/usb/host/xhci-hub.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/drivers/usb/host/xhci-hub.c
++++ b/drivers/usb/host/xhci-hub.c
+@@ -761,7 +761,7 @@ int xhci_hub_status_data(struct usb_hcd
+ memset(buf, 0, retval);
+ status = 0;
+
+- mask = PORT_CSC | PORT_PEC | PORT_OCC | PORT_PLC;
++ mask = PORT_CSC | PORT_PEC | PORT_OCC | PORT_PLC | PORT_WRC;
+
+ spin_lock_irqsave(&xhci->lock, flags);
+ /* For each port, did anything change? If so, set that bit in buf. */