summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorn_hibma <n_hibma@FreeBSD.org>2000-01-29 11:59:31 +0000
committern_hibma <n_hibma@FreeBSD.org>2000-01-29 11:59:31 +0000
commit904db0db42529233893f0efdc618ef76c7bc1dff (patch)
tree9949819f798a9b8f98808555ea1940fe9cc0759c
parent720b7903cb0b373746a25167dde6b5b31a967d2e (diff)
downloadFreeBSD-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.c12
-rw-r--r--sys/dev/usb/ohcireg.h1
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
OpenPOWER on IntegriCloud