Clear done_head in the HCCA *before* acknoledging the interrupt.
Driver lost some completed transfers under heavy loads.
This commit is contained in:
parent
66f94c684f
commit
78d97e78f0
|
@ -1,4 +1,4 @@
|
||||||
/* $NetBSD: ohci.c,v 1.123 2002/05/19 06:24:31 augustss Exp $ */
|
/* $NetBSD: ohci.c,v 1.124 2002/05/26 03:10:02 minoura Exp $ */
|
||||||
/* $FreeBSD: src/sys/dev/usb/ohci.c,v 1.22 1999/11/17 22:33:40 n_hibma Exp $ */
|
/* $FreeBSD: src/sys/dev/usb/ohci.c,v 1.22 1999/11/17 22:33:40 n_hibma Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -46,7 +46,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <sys/cdefs.h>
|
#include <sys/cdefs.h>
|
||||||
__KERNEL_RCSID(0, "$NetBSD: ohci.c,v 1.123 2002/05/19 06:24:31 augustss Exp $");
|
__KERNEL_RCSID(0, "$NetBSD: ohci.c,v 1.124 2002/05/26 03:10:02 minoura Exp $");
|
||||||
|
|
||||||
#include <sys/param.h>
|
#include <sys/param.h>
|
||||||
#include <sys/systm.h>
|
#include <sys/systm.h>
|
||||||
|
@ -1115,6 +1115,7 @@ ohci_intr1(ohci_softc_t *sc)
|
||||||
intrs = OHCI_WDH;
|
intrs = OHCI_WDH;
|
||||||
if (done & OHCI_DONE_INTRS)
|
if (done & OHCI_DONE_INTRS)
|
||||||
intrs |= OREAD4(sc, OHCI_INTERRUPT_STATUS);
|
intrs |= OREAD4(sc, OHCI_INTERRUPT_STATUS);
|
||||||
|
sc->sc_hcca->hcca_done_head = 0;
|
||||||
} else
|
} else
|
||||||
intrs = OREAD4(sc, OHCI_INTERRUPT_STATUS);
|
intrs = OREAD4(sc, OHCI_INTERRUPT_STATUS);
|
||||||
|
|
||||||
|
@ -1145,7 +1146,6 @@ ohci_intr1(ohci_softc_t *sc)
|
||||||
}
|
}
|
||||||
if (eintrs & OHCI_WDH) {
|
if (eintrs & OHCI_WDH) {
|
||||||
ohci_add_done(sc, done &~ OHCI_DONE_INTRS);
|
ohci_add_done(sc, done &~ OHCI_DONE_INTRS);
|
||||||
sc->sc_hcca->hcca_done_head = 0;
|
|
||||||
usb_schedsoftintr(&sc->sc_bus);
|
usb_schedsoftintr(&sc->sc_bus);
|
||||||
eintrs &= ~OHCI_WDH;
|
eintrs &= ~OHCI_WDH;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue