ipro100: Check interrupt status in HAIKU_CHECK_DISABLE_INTERRUPTS.

This should make ipro100 behave better on shared IRQ lines.

Should fix #17349.
This commit is contained in:
Augustin Cavalier
2021-10-23 13:51:06 -04:00
parent 91337da63b
commit 7da3d33132
3 changed files with 21 additions and 7 deletions
@@ -1734,7 +1734,12 @@ fxp_intr(void *xsc)
return; return;
} }
#endif #endif
#ifndef __HAIKU__
while ((statack = CSR_READ_1(sc, FXP_CSR_SCB_STATACK)) != 0) { while ((statack = CSR_READ_1(sc, FXP_CSR_SCB_STATACK)) != 0) {
#else
statack = (uint8_t)atomic_get((int32 *)&sc->sc_statack);
do {
#endif
/* /*
* It should not be possible to have all bits set; the * It should not be possible to have all bits set; the
* FXP_SCB_INTR_SWI bit always returns 0 on a read. If * FXP_SCB_INTR_SWI bit always returns 0 on a read. If
@@ -1752,7 +1757,11 @@ fxp_intr(void *xsc)
CSR_WRITE_1(sc, FXP_CSR_SCB_STATACK, statack); CSR_WRITE_1(sc, FXP_CSR_SCB_STATACK, statack);
if ((if_getdrvflags(ifp) & IFF_DRV_RUNNING) != 0) if ((if_getdrvflags(ifp) & IFF_DRV_RUNNING) != 0)
fxp_intr_body(sc, ifp, statack, -1); fxp_intr_body(sc, ifp, statack, -1);
#ifndef __HAIKU__
} }
#else
} while ((statack = CSR_READ_1(sc, FXP_CSR_SCB_STATACK)) != 0);
#endif
FXP_UNLOCK(sc); FXP_UNLOCK(sc);
} }
@@ -222,6 +222,9 @@ struct fxp_softc {
int if_flags; int if_flags;
uint8_t rfa_size; uint8_t rfa_size;
uint32_t tx_cmd; uint32_t tx_cmd;
#ifdef __HAIKU__
int32_t sc_statack;
#endif
uint16_t eeprom[256]; uint16_t eeprom[256];
}; };
@@ -19,27 +19,29 @@
HAIKU_FBSD_DRIVER_GLUE(ipro100, fxp, pci) HAIKU_FBSD_DRIVER_GLUE(ipro100, fxp, pci)
HAIKU_DRIVER_REQUIREMENTS(FBSD_TASKQUEUES | FBSD_SWI_TASKQUEUE);
HAIKU_FBSD_MII_DRIVER(inphy);
int int
__haiku_disable_interrupts(device_t dev) HAIKU_CHECK_DISABLE_INTERRUPTS(device_t dev)
{ {
struct fxp_softc *sc = device_get_softc(dev); struct fxp_softc *sc = device_get_softc(dev);
// TODO: check interrupt status! uint8_t statack = CSR_READ_1(sc, FXP_CSR_SCB_STATACK);
if (statack == 0)
return 0;
CSR_WRITE_1(sc, FXP_CSR_SCB_INTRCNTL, FXP_SCB_INTR_DISABLE); CSR_WRITE_1(sc, FXP_CSR_SCB_INTRCNTL, FXP_SCB_INTR_DISABLE);
atomic_set((int32*)&sc->sc_statack, statack);
return 1; return 1;
} }
void void
__haiku_reenable_interrupts(device_t dev) HAIKU_REENABLE_INTERRUPTS(device_t dev)
{ {
struct fxp_softc *sc = device_get_softc(dev); struct fxp_softc *sc = device_get_softc(dev);
CSR_WRITE_1(sc, FXP_CSR_SCB_INTRCNTL, 0); CSR_WRITE_1(sc, FXP_CSR_SCB_INTRCNTL, 0);
} }
HAIKU_DRIVER_REQUIREMENTS(FBSD_TASKQUEUES | FBSD_SWI_TASKQUEUE);
HAIKU_FBSD_MII_DRIVER(inphy);