Merge changes from sid (3.12) branch up to 3.12.9-1

Rebase the xhci revert on top of the new (and apparently incomplete)
fixes.

svn path=/dists/sid/linux/; revision=21108
This commit is contained in:
Ben Hutchings 2014-02-23 23:51:53 +00:00
parent 8195ecfc86
commit 5635cc36b1
4 changed files with 154 additions and 0 deletions

30
debian/changelog vendored
View File

@ -97,6 +97,36 @@ linux (3.13~rc6-1~exp1) experimental; urgency=low
-- Ben Hutchings <ben@decadent.org.uk> Mon, 30 Dec 2013 02:36:11 +0100
linux (3.12.9-1) unstable; urgency=high
* New upstream stable update:
http://www.kernel.org/pub/linux/kernel/v3.x/ChangeLog-3.12.9
- Revert "ACPI: Add BayTrail SoC GPIO and LPSS ACPI IDs"
(regression in 3.12.7)
- GFS2: Increase i_writecount during gfs2_setattr_chown
- vfs: Fix a regression in mounting proc (regression in 3.12)
- fork: Allow CLONE_PARENT after setns(CLONE_NEWPID) (regression in 3.12)
- i2c: Re-instate body of i2c_parent_is_i2c_adapter() (regression in 3.12)
- writeback: Fix data corruption on NFS
- thp: fix copy_page_rep GPF by testing is_huge_zero_pmd once only
- [x86] ftrace: Load ftrace_ops in parameter not the variable holding it
- nilfs2: fix segctor bug that causes file system corruption
- md: fix problem when adding device to read-only array with bitmap.
- md/raid10: fix bug when raid10 recovery fails to recover a block.
- md/raid10: fix two bugs in handling of known-bad-blocks.
- md/raid5: Fix possible confusion when multiple write errors occur.
- mm: Make {,set}page_address() static inline if WANT_PAGE_VIRTUAL
(fixes FTBFS on sparc and m68k)
- [x86] drm/i915: Don't grab crtc mutexes in intel_modeset_gem_init()
(regression in 3.12.7)
- [arm] 7938/1: OMAP4/highbank: Flush L2 cache before disabling
[ Ben Hutchings ]
* HID: Enable HID_ELO, HID_XINMO as modules (Closes: #736369)
* xhci: Revert generalised sg support (Closes: #733826, #736274)
-- Ben Hutchings <ben@decadent.org.uk> Sat, 01 Feb 2014 18:50:01 +0100
linux (3.12.8-1) unstable; urgency=medium
* New upstream stable update:

View File

@ -503,6 +503,7 @@ CONFIG_HID_DRAGONRISE=m
CONFIG_DRAGONRISE_FF=y
CONFIG_HID_EMS_FF=m
CONFIG_HID_ELECOM=m
CONFIG_HID_ELO=m
CONFIG_HID_EZKEY=y
CONFIG_HID_HOLTEK=m
CONFIG_HOLTEK_FF=y
@ -557,6 +558,7 @@ CONFIG_HID_THRUSTMASTER=m
CONFIG_THRUSTMASTER_FF=y
CONFIG_HID_WACOM=m
CONFIG_HID_WIIMOTE=m
CONFIG_HID_XINMO=m
CONFIG_HID_ZEROPLUS=m
CONFIG_ZEROPLUS_FF=y
CONFIG_HID_ZYDACRON=m

View File

@ -0,0 +1,121 @@
From: Ben Hutchings <ben@decadent.org.uk>
Date: Sat, 1 Feb 2014 16:36:56 +0100
Subject: xhci: Revert generalised sg support
Bug-Debian: http://bugs.debian.org/733826
Bug-Debian: http://bugs.debian.org/736274
Revert part of "USB: introduce usb_device_no_sg_constraint() helper"
(commit bcc48f1a7a0d40ae2e5a26aff72c2b674fd8b596),
"usb: xhci: Link TRB must not occur within a USB payload burst"
(commit 35773dac5f862cb1c82ea151eba3e2f6de51ec3e),
"xhci: Avoid infinite loop when sg urb requires too many trbs"
(commit d6c9ea9069af684358efedcaf2f2f687f51c58ee) and
"xhci: Set scatter-gather limit to avoid failed block writes."
(commit f2d9b991c549f159dc9ae81f77d8206c790cbfee).
The first two have resulted in serious regressions for USB storage,
apparently not entirely fixed by the last two.
---
--- a/drivers/usb/host/xhci-ring.c
+++ b/drivers/usb/host/xhci-ring.c
@@ -2973,58 +2973,8 @@ static int prepare_ring(struct xhci_hcd
}
while (1) {
- if (room_on_ring(xhci, ep_ring, num_trbs)) {
- union xhci_trb *trb = ep_ring->enqueue;
- unsigned int usable = ep_ring->enq_seg->trbs +
- TRBS_PER_SEGMENT - 1 - trb;
- u32 nop_cmd;
-
- /*
- * Section 4.11.7.1 TD Fragments states that a link
- * TRB must only occur at the boundary between
- * data bursts (eg 512 bytes for 480M).
- * While it is possible to split a large fragment
- * we don't know the size yet.
- * Simplest solution is to fill the trb before the
- * LINK with nop commands.
- */
- if (num_trbs == 1 || num_trbs <= usable || usable == 0)
- break;
-
- if (ep_ring->type != TYPE_BULK)
- /*
- * While isoc transfers might have a buffer that
- * crosses a 64k boundary it is unlikely.
- * Since we can't add NOPs without generating
- * gaps in the traffic just hope it never
- * happens at the end of the ring.
- * This could be fixed by writing a LINK TRB
- * instead of the first NOP - however the
- * TRB_TYPE_LINK_LE32() calls would all need
- * changing to check the ring length.
- */
- break;
-
- if (num_trbs >= TRBS_PER_SEGMENT) {
- xhci_err(xhci, "Too many fragments %d, max %d\n",
- num_trbs, TRBS_PER_SEGMENT - 1);
- return -EINVAL;
- }
-
- nop_cmd = cpu_to_le32(TRB_TYPE(TRB_TR_NOOP) |
- ep_ring->cycle_state);
- ep_ring->num_trbs_free -= usable;
- do {
- trb->generic.field[0] = 0;
- trb->generic.field[1] = 0;
- trb->generic.field[2] = 0;
- trb->generic.field[3] = nop_cmd;
- trb++;
- } while (--usable);
- ep_ring->enqueue = trb;
- if (room_on_ring(xhci, ep_ring, num_trbs))
- break;
- }
+ if (room_on_ring(xhci, ep_ring, num_trbs))
+ break;
if (ep_ring == xhci->cmd_ring) {
xhci_err(xhci, "Do not support expand command ring\n");
--- a/drivers/usb/host/xhci.c
+++ b/drivers/usb/host/xhci.c
@@ -4716,11 +4716,12 @@ int xhci_gen_setup(struct usb_hcd *hcd,
struct device *dev = hcd->self.controller;
int retval;
- /* Limit the block layer scatter-gather lists to half a segment. */
- hcd->self.sg_tablesize = TRBS_PER_SEGMENT / 2;
+ /* Accept arbitrarily long scatter-gather lists */
+ hcd->self.sg_tablesize = ~0;
/* support to build packet from discontinuous buffers */
- hcd->self.no_sg_constraint = 1;
+ /* XXX doesn't generally work yet */
+ hcd->self.no_sg_constraint = 0;
/* XHCI controllers don't stop the ep queue on short packets :| */
hcd->self.no_stop_on_short = 1;
--- a/drivers/usb/host/xhci.h
+++ b/drivers/usb/host/xhci.h
@@ -1260,7 +1260,7 @@ union xhci_trb {
* since the command ring is 64-byte aligned.
* It must also be greater than 16.
*/
-#define TRBS_PER_SEGMENT 256
+#define TRBS_PER_SEGMENT 64
/* Allow two commands + a link TRB, along with any reserved command TRBs */
#define MAX_RSVD_CMD_TRBS (TRBS_PER_SEGMENT - 3)
#define TRB_SEGMENT_SIZE (TRBS_PER_SEGMENT*16)
--- a/include/linux/usb.h
+++ b/include/linux/usb.h
@@ -1264,8 +1264,6 @@ typedef void (*usb_complete_t)(struct ur
* @sg: scatter gather buffer list, the buffer size of each element in
* the list (except the last) must be divisible by the endpoint's
* max packet size if no_sg_constraint isn't set in 'struct usb_bus'
- * (FIXME: scatter-gather under xHCI is broken for periodic transfers.
- * Do not use urb->sg for interrupt endpoints for now, only bulk.)
* @num_mapped_sgs: (internal) number of mapped sg entries
* @num_sgs: number of entries in the sg list
* @transfer_buffer_length: How big is transfer_buffer. The transfer may

View File

@ -79,3 +79,4 @@ bugfix/all/staging-lustre-Make-LUSTRE_LLITE_LLOOP-tristate.patch
bugfix/all/i2c-designware-remove-HAVE_CLK-build-dependecy.patch
debian/snd-pcsp-disable-autoload.patch
bugfix/all/bluetooth-allocate-static-minor-for-vhci.patch
bugfix/all/xhci-revert-generalised-sg-support.patch