diff options
author | n_hibma <n_hibma@FreeBSD.org> | 2000-01-29 11:59:31 +0000 |
---|---|---|
committer | n_hibma <n_hibma@FreeBSD.org> | 2000-01-29 11:59:31 +0000 |
commit | 904db0db42529233893f0efdc618ef76c7bc1dff (patch) | |
tree | 9949819f798a9b8f98808555ea1940fe9cc0759c | |
parent | 720b7903cb0b373746a25167dde6b5b31a967d2e (diff) | |
download | FreeBSD-src-904db0db42529233893f0efdc618ef76c7bc1dff.zip FreeBSD-src-904db0db42529233893f0efdc618ef76c7bc1dff.tar.gz |
Mask off the last two bits before comparing. It might just be that some
hardware might leave those bits in the wrong state.
-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 |