From c72218a0940104999fd0a354f6d308954a8c6867 Mon Sep 17 00:00:00 2001 From: Michael Lotz Date: Fri, 2 Nov 2012 15:37:11 +0100 Subject: [PATCH] Disable duplicated interrupt disable code in marvell yukon. Since we now implement HAIKU_CHECK_DISABLE_INTERRUPTS there is no need to do it again in the interrupt handler. Further, store and carry over the interrupt status from the hook to the interrupt handler as that is cleaner and just in case reading the register somehow clears it. May help with #8454. --- .../kernel/drivers/network/marvell_yukon/dev/msk/glue.c | 9 ++++++++- .../drivers/network/marvell_yukon/dev/msk/if_msk.c | 6 ++++++ .../drivers/network/marvell_yukon/dev/msk/if_mskreg.h | 3 +++ 3 files changed, 17 insertions(+), 1 deletion(-) diff --git a/src/add-ons/kernel/drivers/network/marvell_yukon/dev/msk/glue.c b/src/add-ons/kernel/drivers/network/marvell_yukon/dev/msk/glue.c index 997689e0afb..6b76ab605bc 100644 --- a/src/add-ons/kernel/drivers/network/marvell_yukon/dev/msk/glue.c +++ b/src/add-ons/kernel/drivers/network/marvell_yukon/dev/msk/glue.c @@ -51,10 +51,17 @@ HAIKU_CHECK_DISABLE_INTERRUPTS(device_t dev) return 0; } + sc->haiku_interrupt_status = status; return 1; } -NO_HAIKU_REENABLE_INTERRUPTS(); +void +HAIKU_REENABLE_INTERRUPTS(device_t dev) +{ + struct msk_softc *sc = device_get_softc(dev); + CSR_WRITE_4(sc, B0_Y2_SP_ICR, 2); +} + HAIKU_DRIVER_REQUIREMENTS(FBSD_TASKQUEUES | FBSD_FAST_TASKQUEUE | FBSD_SWI_TASKQUEUE); diff --git a/src/add-ons/kernel/drivers/network/marvell_yukon/dev/msk/if_msk.c b/src/add-ons/kernel/drivers/network/marvell_yukon/dev/msk/if_msk.c index be4ac5dc8d8..377a1589b2c 100644 --- a/src/add-ons/kernel/drivers/network/marvell_yukon/dev/msk/if_msk.c +++ b/src/add-ons/kernel/drivers/network/marvell_yukon/dev/msk/if_msk.c @@ -3610,6 +3610,7 @@ msk_intr(void *xsc) sc = xsc; MSK_LOCK(sc); +#ifndef __HAIKU__ /* Reading B0_Y2_SP_ISRC2 masks further interrupts. */ status = CSR_READ_4(sc, B0_Y2_SP_ISRC2); if (status == 0 || status == 0xffffffff || @@ -3619,6 +3620,9 @@ msk_intr(void *xsc) MSK_UNLOCK(sc); return; } +#else + status = sc->haiku_interrupt_status; +#endif sc_if0 = sc->msk_if[MSK_PORT_A]; sc_if1 = sc->msk_if[MSK_PORT_B]; @@ -3655,8 +3659,10 @@ msk_intr(void *xsc) if ((status & Y2_IS_STAT_BMU) != 0 && domore == 0) CSR_WRITE_4(sc, STAT_CTRL, SC_STAT_CLR_IRQ); +#ifndef __HAIKU__ /* Reenable interrupts. */ CSR_WRITE_4(sc, B0_Y2_SP_ICR, 2); +#endif if (ifp0 != NULL && (ifp0->if_drv_flags & IFF_DRV_RUNNING) != 0 && !IFQ_DRV_IS_EMPTY(&ifp0->if_snd)) diff --git a/src/add-ons/kernel/drivers/network/marvell_yukon/dev/msk/if_mskreg.h b/src/add-ons/kernel/drivers/network/marvell_yukon/dev/msk/if_mskreg.h index 583f5e88ef8..75ef99ba9d4 100644 --- a/src/add-ons/kernel/drivers/network/marvell_yukon/dev/msk/if_mskreg.h +++ b/src/add-ons/kernel/drivers/network/marvell_yukon/dev/msk/if_mskreg.h @@ -2520,6 +2520,9 @@ struct msk_softc { int msk_process_limit; int msk_stat_cons; struct mtx msk_mtx; +#ifdef __HAIKU__ + uint32_t haiku_interrupt_status; +#endif }; #define MSK_LOCK(_sc) mtx_lock(&(_sc)->msk_mtx)