aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb
diff options
context:
space:
mode:
authorSarah Sharp <sarah.a.sharp@linux.intel.com>2011-12-01 17:50:30 -0500
committerGreg Kroah-Hartman <gregkh@suse.de>2012-01-02 20:05:30 -0500
commit9258c0b26b7d2e819b157ec394edaf7a5853cebb (patch)
tree74f102d6342f5327746adf3084e62adeb2f8e1ea /drivers/usb
parent79688acfb5e124fcf586add00af32a2a1a532c64 (diff)
xhci: Better debugging for critical host errors.
When a host controller gives a bad event TRB, we should print out the contents of the TRB as a warning so that users don't have to recompile their kernel to get information about what went wrong. Also, print out the event ring if they have xHCI debugging turned on, since previous events can often explain what happened before the bad TRB occurred. Signed-off-by: Sarah Sharp <sarah.a.sharp@linux.intel.com>
Diffstat (limited to 'drivers/usb')
-rw-r--r--drivers/usb/host/xhci-ring.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c
index f34a268c6ccd..b0a85459652e 100644
--- a/drivers/usb/host/xhci-ring.c
+++ b/drivers/usb/host/xhci-ring.c
@@ -1933,6 +1933,15 @@ static int handle_tx_event(struct xhci_hcd *xhci,
1933 xdev = xhci->devs[slot_id]; 1933 xdev = xhci->devs[slot_id];
1934 if (!xdev) { 1934 if (!xdev) {
1935 xhci_err(xhci, "ERROR Transfer event pointed to bad slot\n"); 1935 xhci_err(xhci, "ERROR Transfer event pointed to bad slot\n");
1936 xhci_err(xhci, "@%016llx %08x %08x %08x %08x\n",
1937 xhci_trb_virt_to_dma(xhci->event_ring->deq_seg,
1938 xhci->event_ring->dequeue),
1939 lower_32_bits(le64_to_cpu(event->buffer)),
1940 upper_32_bits(le64_to_cpu(event->buffer)),
1941 le32_to_cpu(event->transfer_len),
1942 le32_to_cpu(event->flags));
1943 xhci_dbg(xhci, "Event ring:\n");
1944 xhci_debug_segment(xhci, xhci->event_ring->deq_seg);
1936 return -ENODEV; 1945 return -ENODEV;
1937 } 1946 }
1938 1947
@@ -1946,6 +1955,15 @@ static int handle_tx_event(struct xhci_hcd *xhci,
1946 EP_STATE_DISABLED) { 1955 EP_STATE_DISABLED) {
1947 xhci_err(xhci, "ERROR Transfer event for disabled endpoint " 1956 xhci_err(xhci, "ERROR Transfer event for disabled endpoint "
1948 "or incorrect stream ring\n"); 1957 "or incorrect stream ring\n");
1958 xhci_err(xhci, "@%016llx %08x %08x %08x %08x\n",
1959 xhci_trb_virt_to_dma(xhci->event_ring->deq_seg,
1960 xhci->event_ring->dequeue),
1961 lower_32_bits(le64_to_cpu(event->buffer)),
1962 upper_32_bits(le64_to_cpu(event->buffer)),
1963 le32_to_cpu(event->transfer_len),
1964 le32_to_cpu(event->flags));
1965 xhci_dbg(xhci, "Event ring:\n");
1966 xhci_debug_segment(xhci, xhci->event_ring->deq_seg);
1949 return -ENODEV; 1967 return -ENODEV;
1950 } 1968 }
1951 1969