Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+4 −5
Original line number Diff line number Diff line
@@ -375,12 +375,11 @@ qh_completions (struct ehci_hcd *ehci, struct ehci_qh *qh)
				 */
				if ((token & QTD_STS_XACT) &&
						QTD_CERR(token) == 0 &&
						--qh->xacterrs > 0 &&
						++qh->xacterrs < QH_XACTERR_MAX &&
						!urb->unlinked) {
					ehci_dbg(ehci,
	"detected XactErr len %zu/%zu retry %d\n",
	qtd->length - QTD_LENGTH(token), qtd->length,
	QH_XACTERR_MAX - qh->xacterrs);
	qtd->length - QTD_LENGTH(token), qtd->length, qh->xacterrs);

					/* reset the token in the qtd and the
					 * qh overlay (which still contains
@@ -494,7 +493,7 @@ qh_completions (struct ehci_hcd *ehci, struct ehci_qh *qh)
		last = 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 */
@@ -941,7 +940,7 @@ static void qh_link_async (struct ehci_hcd *ehci, struct ehci_qh *qh)
	head->hw_next = dma;

	qh_get(qh);
	qh->xacterrs = QH_XACTERR_MAX;
	qh->xacterrs = 0;
	qh->qh_state = QH_STATE_LINKED;
	/* qtd completions reported later by interrupt */
}
+1 −0
Original line number Diff line number Diff line
@@ -542,6 +542,7 @@ static int qh_link_periodic (struct ehci_hcd *ehci, struct ehci_qh *qh)
		}
	}
	qh->qh_state = QH_STATE_LINKED;
	qh->xacterrs = 0;
	qh_get (qh);

	/* update per-qh bandwidth for usbfs */