Author: hselasky
Date: Fri Aug 14 14:20:10 2015
New Revision: 286780
URL: https://svnweb.freebsd.org/changeset/base/286780

Log:
  Handle NYET high speed tokens and predict NAK'ing is up next.
  
  MFC after:    2 weeks

Modified:
  head/sys/dev/usb/controller/dwc_otg.c

Modified: head/sys/dev/usb/controller/dwc_otg.c
==============================================================================
--- head/sys/dev/usb/controller/dwc_otg.c       Fri Aug 14 14:17:04 2015        
(r286779)
+++ head/sys/dev/usb/controller/dwc_otg.c       Fri Aug 14 14:20:10 2015        
(r286780)
@@ -1060,34 +1060,36 @@ dwc_otg_host_rate_check_interrupt(struct
 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_soft
                        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 */
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to