diff options
-rw-r--r-- | sys/dev/usb/ohci.c | 12 | ||||
-rw-r--r-- | sys/dev/usb/ohcireg.h | 1 |
2 files changed, 9 insertions, 4 deletions
diff --git a/sys/dev/usb/ohci.c b/sys/dev/usb/ohci.c index 2bc4746..9455003 100644 --- a/sys/dev/usb/ohci.c +++ b/sys/dev/usb/ohci.c @@ -1749,7 +1749,8 @@ ohci_close_pipe(pipe, head) s = splusb(); #ifdef DIAGNOSTIC sed->ed.ed_flags |= LE(OHCI_ED_SKIP); - if (sed->ed.ed_tailp != (sed->ed.ed_headp & LE(OHCI_HEADMASK))) { + if ((sed->ed.ed_tailp & LE(OHCI_TAILMASK)) + != (sed->ed.ed_headp & LE(OHCI_HEADMASK))) { ohci_physaddr_t td = sed->ed.ed_headp; ohci_soft_td_t *std; for (std = LIST_FIRST(&sc->sc_hash_tds[HASH(td)]); @@ -1762,7 +1763,8 @@ ohci_close_pipe(pipe, head) (int)LE(sed->ed.ed_headp), (int)LE(sed->ed.ed_tailp), pipe, std); usb_delay_ms(&sc->sc_bus, 2); - if (sed->ed.ed_tailp != (sed->ed.ed_headp & LE(OHCI_HEADMASK))) + if ((sed->ed.ed_tailp & LE(OHCI_TAILMASK)) + != (sed->ed.ed_headp & LE(OHCI_HEADMASK))) printf("ohci_close_pipe: pipe still not empty\n"); } #endif @@ -2657,10 +2659,12 @@ ohci_device_intr_close(pipe) pipe, nslots, pos)); s = splusb(); sed->ed.ed_flags |= LE(OHCI_ED_SKIP); - if (sed->ed.ed_tailp != (sed->ed.ed_headp & LE(OHCI_HEADMASK))) + if ((sed->ed.ed_tailp & LE(OHCI_TAILMASK)) + != (sed->ed.ed_headp & LE(OHCI_HEADMASK))) usb_delay_ms(&sc->sc_bus, 2); #ifdef DIAGNOSTIC - if (sed->ed.ed_tailp != (sed->ed.ed_headp & LE(OHCI_HEADMASK))) + if ((sed->ed.ed_tailp & LE(OHCI_TAILMASK)) + != (sed->ed.ed_headp & LE(OHCI_HEADMASK))) panic("%s: Intr pipe %p still has TDs queued\n", USBDEVNAME(sc->sc_bus.bdev), pipe); #endif diff --git a/sys/dev/usb/ohcireg.h b/sys/dev/usb/ohcireg.h index 3f34a84..30bfb2c 100644 --- a/sys/dev/usb/ohcireg.h +++ b/sys/dev/usb/ohcireg.h @@ -163,6 +163,7 @@ typedef struct { #define OHCI_ED_SET_MAXP(s) ((s) << 16) #define OHCI_ED_MAXPMASK (0x7ff << 16) ohci_physaddr_t ed_tailp; +#define OHCI_TAILMASK 0xfffffffc ohci_physaddr_t ed_headp; #define OHCI_HALTED 0x00000001 #define OHCI_TOGGLECARRY 0x00000002 |