USB: EHCI: fix counting of transaction error retries
This patch (as1274) simplifies the counting of transaction-error retries. Now we will count up from 0 to QH_XACTERR_MAX instead of down from QH_XACTERR_MAX to 0. The patch also fixes a small bug: qh->xacterr was not getting initialized for interrupt endpoints. Signed-off-by: Alan Stern <stern@rowland.harvard.edu> Tested-by: Matthijs Kooijman <matthijs@stdin.nl> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
7a0f0d9512
commit
ef4638f955
@@ -375,12 +375,11 @@ qh_completions (struct ehci_hcd *ehci, struct ehci_qh *qh)
|
|||||||
*/
|
*/
|
||||||
if ((token & QTD_STS_XACT) &&
|
if ((token & QTD_STS_XACT) &&
|
||||||
QTD_CERR(token) == 0 &&
|
QTD_CERR(token) == 0 &&
|
||||||
--qh->xacterrs > 0 &&
|
++qh->xacterrs < QH_XACTERR_MAX &&
|
||||||
!urb->unlinked) {
|
!urb->unlinked) {
|
||||||
ehci_dbg(ehci,
|
ehci_dbg(ehci,
|
||||||
"detected XactErr len %zu/%zu retry %d\n",
|
"detected XactErr len %zu/%zu retry %d\n",
|
||||||
qtd->length - QTD_LENGTH(token), qtd->length,
|
qtd->length - QTD_LENGTH(token), qtd->length, qh->xacterrs);
|
||||||
QH_XACTERR_MAX - qh->xacterrs);
|
|
||||||
|
|
||||||
/* reset the token in the qtd and the
|
/* reset the token in the qtd and the
|
||||||
* qh overlay (which still contains
|
* qh overlay (which still contains
|
||||||
@@ -494,7 +493,7 @@ halt:
|
|||||||
last = qtd;
|
last = qtd;
|
||||||
|
|
||||||
/* reinit the xacterr counter for the next qtd */
|
/* reinit the xacterr counter for the next qtd */
|
||||||
qh->xacterrs = QH_XACTERR_MAX;
|
qh->xacterrs = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* last urb's completion might still need calling */
|
/* last urb's completion might still need calling */
|
||||||
@@ -941,7 +940,7 @@ static void qh_link_async (struct ehci_hcd *ehci, struct ehci_qh *qh)
|
|||||||
head->hw_next = dma;
|
head->hw_next = dma;
|
||||||
|
|
||||||
qh_get(qh);
|
qh_get(qh);
|
||||||
qh->xacterrs = QH_XACTERR_MAX;
|
qh->xacterrs = 0;
|
||||||
qh->qh_state = QH_STATE_LINKED;
|
qh->qh_state = QH_STATE_LINKED;
|
||||||
/* qtd completions reported later by interrupt */
|
/* qtd completions reported later by interrupt */
|
||||||
}
|
}
|
||||||
|
@@ -542,6 +542,7 @@ static int qh_link_periodic (struct ehci_hcd *ehci, struct ehci_qh *qh)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
qh->qh_state = QH_STATE_LINKED;
|
qh->qh_state = QH_STATE_LINKED;
|
||||||
|
qh->xacterrs = 0;
|
||||||
qh_get (qh);
|
qh_get (qh);
|
||||||
|
|
||||||
/* update per-qh bandwidth for usbfs */
|
/* update per-qh bandwidth for usbfs */
|
||||||
|
Reference in New Issue
Block a user