|
@@ -1660,10 +1660,12 @@ cleanup:
|
|
|
* TRB in this TD, this function returns that TRB's segment. Otherwise it
|
|
|
* returns 0.
|
|
|
*/
|
|
|
-struct xhci_segment *trb_in_td(struct xhci_segment *start_seg,
|
|
|
+struct xhci_segment *trb_in_td(struct xhci_hcd *xhci,
|
|
|
+ struct xhci_segment *start_seg,
|
|
|
union xhci_trb *start_trb,
|
|
|
union xhci_trb *end_trb,
|
|
|
- dma_addr_t suspect_dma)
|
|
|
+ dma_addr_t suspect_dma,
|
|
|
+ bool debug)
|
|
|
{
|
|
|
dma_addr_t start_dma;
|
|
|
dma_addr_t end_seg_dma;
|
|
@@ -1682,6 +1684,15 @@ struct xhci_segment *trb_in_td(struct xhci_segment *start_seg,
|
|
|
/* If the end TRB isn't in this segment, this is set to 0 */
|
|
|
end_trb_dma = xhci_trb_virt_to_dma(cur_seg, end_trb);
|
|
|
|
|
|
+ if (debug)
|
|
|
+ xhci_warn(xhci,
|
|
|
+ "Looking for event-dma %016llx trb-start %016llx trb-end %016llx seg-start %016llx seg-end %016llx\n",
|
|
|
+ (unsigned long long)suspect_dma,
|
|
|
+ (unsigned long long)start_dma,
|
|
|
+ (unsigned long long)end_trb_dma,
|
|
|
+ (unsigned long long)cur_seg->dma,
|
|
|
+ (unsigned long long)end_seg_dma);
|
|
|
+
|
|
|
if (end_trb_dma > 0) {
|
|
|
/* The end TRB is in this segment, so suspect should be here */
|
|
|
if (start_dma <= end_trb_dma) {
|
|
@@ -2414,8 +2425,8 @@ static int handle_tx_event(struct xhci_hcd *xhci,
|
|
|
td_num--;
|
|
|
|
|
|
/* Is this a TRB in the currently executing TD? */
|
|
|
- event_seg = trb_in_td(ep_ring->deq_seg, ep_ring->dequeue,
|
|
|
- td->last_trb, event_dma);
|
|
|
+ event_seg = trb_in_td(xhci, ep_ring->deq_seg, ep_ring->dequeue,
|
|
|
+ td->last_trb, event_dma, false);
|
|
|
|
|
|
/*
|
|
|
* Skip the Force Stopped Event. The event_trb(event_dma) of FSE
|
|
@@ -2447,7 +2458,12 @@ static int handle_tx_event(struct xhci_hcd *xhci,
|
|
|
/* HC is busted, give up! */
|
|
|
xhci_err(xhci,
|
|
|
"ERROR Transfer event TRB DMA ptr not "
|
|
|
- "part of current TD\n");
|
|
|
+ "part of current TD ep_index %d "
|
|
|
+ "comp_code %u\n", ep_index,
|
|
|
+ trb_comp_code);
|
|
|
+ trb_in_td(xhci, ep_ring->deq_seg,
|
|
|
+ ep_ring->dequeue, td->last_trb,
|
|
|
+ event_dma, true);
|
|
|
return -ESHUTDOWN;
|
|
|
}
|
|
|
|