Commit ef4638f9 authored by Alan Stern's avatar Alan Stern Committed by Greg Kroah-Hartman

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: default avatarAlan Stern <stern@rowland.harvard.edu>
Tested-by: default avatarMatthijs Kooijman <matthijs@stdin.nl>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent 7a0f0d95
...@@ -375,12 +375,11 @@ qh_completions (struct ehci_hcd *ehci, struct ehci_qh *qh) ...@@ -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: ...@@ -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) ...@@ -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) ...@@ -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 */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment