mirror of
https://github.com/torvalds/linux.git
synced 2024-11-24 13:11:40 +00:00
USB: EHCI: warn on unexpectedly active QH
This patch adds a new warning message to ehci-hcd. The warning is triggered whenever the driver finds that the hardware has set the Active bit in a QH at a time when the driver expects the QH to be completely idle. Such bugs have been observed by users in the past, and since they can lead to serious problems (such as inability to unlink an URB that never completes), it would be good to know about them when they occur. This won't fix these bugs; that's a bigger job for a later patch. But success isn't guaranteed, since this depends on aspects of the hardware which are not documented in the EHCI spec or for which the spec's recommendations are clearly unworkable. It therefore seems worthwhile to check for these bugs proactively. Signed-off-by: Alan Stern <stern@rowland.harvard.edu> Reported-by: Michael Reutman <mreutman@epiqsolutions.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
8ee10d6292
commit
fc0855f274
@ -132,10 +132,14 @@ qh_refresh (struct ehci_hcd *ehci, struct ehci_qh *qh)
|
||||
* qtd is updated in qh_completions(). Update the QH
|
||||
* overlay here.
|
||||
*/
|
||||
if (qh->hw->hw_token & ACTIVE_BIT(ehci))
|
||||
if (qh->hw->hw_token & ACTIVE_BIT(ehci)) {
|
||||
qh->hw->hw_qtd_next = qtd->hw_next;
|
||||
else
|
||||
if (qh->should_be_inactive)
|
||||
ehci_warn(ehci, "qh %p should be inactive!\n", qh);
|
||||
} else {
|
||||
qh_update(ehci, qh, qtd);
|
||||
}
|
||||
qh->should_be_inactive = 0;
|
||||
}
|
||||
|
||||
/*-------------------------------------------------------------------------*/
|
||||
@ -438,6 +442,7 @@ qh_completions (struct ehci_hcd *ehci, struct ehci_qh *qh)
|
||||
(hw->hw_token & ACTIVE_BIT(ehci))) {
|
||||
token = hc32_to_cpu(ehci, hw->hw_token);
|
||||
hw->hw_token &= ~ACTIVE_BIT(ehci);
|
||||
qh->should_be_inactive = 1;
|
||||
|
||||
/* An unlink may leave an incomplete
|
||||
* async transaction in the TT buffer.
|
||||
|
@ -439,6 +439,7 @@ struct ehci_qh {
|
||||
unsigned dequeue_during_giveback:1;
|
||||
unsigned exception:1; /* got a fault, or an unlink
|
||||
was requested */
|
||||
unsigned should_be_inactive:1;
|
||||
};
|
||||
|
||||
/*-------------------------------------------------------------------------*/
|
||||
|
Loading…
Reference in New Issue
Block a user