aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/host/xhci.h
diff options
context:
space:
mode:
authorAndiry Xu <andiry.xu@amd.com>2011-09-23 17:19:54 -0400
committerGreg Kroah-Hartman <gregkh@suse.de>2011-09-26 18:51:11 -0400
commit7e393a834b41001174a8fb3ae3bc23a749467760 (patch)
tree621a7e49bb94045c11b8b2efe9070c4bc2339e60 /drivers/usb/host/xhci.h
parentc1045e87b2cd293d53dff19779ea46b19195d593 (diff)
xHCI: AMD isoc link TRB chain bit quirk
Setting the chain (CH) bit in the link TRB of isochronous transfer rings is required by AMD 0.96 xHCI host controller to successfully transverse multi-TRB TD that span through different memory segments. When a Missed Service Error event occurs, if the chain bit is not set in the link TRB and the host skips TDs which just across a link TRB, the host may falsely recognize the link TRB as a normal TRB. You can see this may cause big trouble - the host does not jump to the right address which is pointed by the link TRB, but continue fetching the memory which is after the link TRB address, which may not even belong to the host, and the result cannot be predicted. This causes some big problems. Without the former patch I sent: "xHCI: prevent infinite loop when processing MSE event", the system may hang. With that patch applied, system does not hang, but the host still access wrong memory address and isoc transfer will fail. With this patch, isochronous transfer works as expected. This patch should be applied to kernels as old as 2.6.36, which was when the first isochronous support was added for the xHCI host controller. Signed-off-by: Andiry Xu <andiry.xu@amd.com> Signed-off-by: Sarah Sharp <sarah.a.sharp@linux.intel.com> Cc: stable@kernel.org Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/usb/host/xhci.h')
-rw-r--r--drivers/usb/host/xhci.h1
1 files changed, 1 insertions, 0 deletions
diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h
index e738466703a5..4050656bffed 100644
--- a/drivers/usb/host/xhci.h
+++ b/drivers/usb/host/xhci.h
@@ -1462,6 +1462,7 @@ struct xhci_hcd {
1462#define XHCI_BROKEN_MSI (1 << 6) 1462#define XHCI_BROKEN_MSI (1 << 6)
1463#define XHCI_RESET_ON_RESUME (1 << 7) 1463#define XHCI_RESET_ON_RESUME (1 << 7)
1464#define XHCI_SW_BW_CHECKING (1 << 8) 1464#define XHCI_SW_BW_CHECKING (1 << 8)
1465#define XHCI_AMD_0x96_HOST (1 << 9)
1465 unsigned int num_active_eps; 1466 unsigned int num_active_eps;
1466 unsigned int limit_active_eps; 1467 unsigned int limit_active_eps;
1467 /* There are two roothubs to keep track of bus suspend info for */ 1468 /* There are two roothubs to keep track of bus suspend info for */