summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorhselasky <hselasky@FreeBSD.org>2015-08-14 14:20:10 +0000
committerhselasky <hselasky@FreeBSD.org>2015-08-14 14:20:10 +0000
commitac0e71792d5546093bbc7cdecb665893f1a0eadf (patch)
treeb5de3fb832a90fd4b313d14f159945d3c5304c13
parent7107a1f8522ae296199c39a8ae8a185d10e9c5fb (diff)
downloadFreeBSD-src-ac0e71792d5546093bbc7cdecb665893f1a0eadf.zip
FreeBSD-src-ac0e71792d5546093bbc7cdecb665893f1a0eadf.tar.gz
Handle NYET high speed tokens and predict NAK'ing is up next.
MFC after: 2 weeks
-rw-r--r--sys/dev/usb/controller/dwc_otg.c20
1 files changed, 13 insertions, 7 deletions
diff --git a/sys/dev/usb/controller/dwc_otg.c b/sys/dev/usb/controller/dwc_otg.c
index 3f77d9a..998eb51 100644
--- a/sys/dev/usb/controller/dwc_otg.c
+++ b/sys/dev/usb/controller/dwc_otg.c
@@ -1060,34 +1060,36 @@ dwc_otg_host_rate_check_interrupt(struct dwc_otg_softc *sc, struct dwc_otg_td *t
static uint8_t
dwc_otg_host_rate_check(struct dwc_otg_softc *sc, struct dwc_otg_td *td)
{
+ uint8_t frame_num = (uint8_t)sc->sc_last_frame_num;
+
if (td->ep_type == UE_ISOCHRONOUS) {
/* non TT isochronous traffic */
if ((td->tmr_val != 0) ||
- (sc->sc_last_frame_num & (td->tmr_res - 1))) {
+ (frame_num & (td->tmr_res - 1))) {
goto busy;
}
td->tmr_val = 1; /* executed */
td->toggle = 0;
-
+ return (0);
} else if (td->ep_type == UE_INTERRUPT) {
if (!td->tt_scheduled)
goto busy;
td->tt_scheduled = 0;
+ return (0);
} else if (td->did_nak != 0) {
- uint8_t frame_num = (uint8_t)sc->sc_last_frame_num;
/* check if we should pause sending queries for 125us */
if (td->tmr_res == frame_num) {
/* wait a bit */
dwc_otg_enable_sof_irq(sc);
goto busy;
}
- /* query for data one more time */
- td->tmr_res = frame_num;
- td->did_nak = 0;
} else if (td->set_toggle) {
td->set_toggle = 0;
td->toggle = 1;
}
+ /* query for data one more time */
+ td->tmr_res = frame_num;
+ td->did_nak = 0;
return (0);
busy:
return (1);
@@ -1658,7 +1660,11 @@ dwc_otg_host_data_tx(struct dwc_otg_softc *sc, struct dwc_otg_td *td)
td->offset += td->tx_bytes;
td->remainder -= td->tx_bytes;
td->toggle ^= 1;
- td->did_nak = 0;
+ /* check if next response will be a NAK */
+ if (hcint & HCINT_NYET)
+ td->did_nak = 1;
+ else
+ td->did_nak = 0;
td->tt_scheduled = 0;
/* check remainder */
OpenPOWER on IntegriCloud