From f9ee2947dfe5e9ddab76b16e0a7bdefc24792d44 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Colin=20G=C3=BCnther?= Date: Tue, 29 Dec 2009 22:48:07 +0000 Subject: [PATCH] * Using atomic_{get|set} instead of HAIKU_INTR* macros. * Using conditional compiliation instead of just deleting original code to easen future driver updates. * Coding style cleanup. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@34816 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- .../wlan/marvell88w8363/dev/mwl/if_mwl.c | 22 +++++++++-- .../wlan/marvell88w8363/dev/mwl/if_mwlvar.h | 4 +- .../network/wlan/marvell88w8363/glue.c | 39 ++++++------------- 3 files changed, 32 insertions(+), 33 deletions(-) diff --git a/src/add-ons/kernel/drivers/network/wlan/marvell88w8363/dev/mwl/if_mwl.c b/src/add-ons/kernel/drivers/network/wlan/marvell88w8363/dev/mwl/if_mwl.c index 7a249ee6d1..de467e90f4 100644 --- a/src/add-ons/kernel/drivers/network/wlan/marvell88w8363/dev/mwl/if_mwl.c +++ b/src/add-ons/kernel/drivers/network/wlan/marvell88w8363/dev/mwl/if_mwl.c @@ -821,11 +821,25 @@ mwl_intr(void *arg) struct mwl_softc *sc = arg; struct mwl_hal *mh = sc->sc_mh; uint32_t status; - HAIKU_INTR_REGISTER_STATE; - HAIKU_INTR_REGISTER_ENTER(); - status = sc->sc_lastisr; - HAIKU_INTR_REGISTER_LEAVE(); +#if !defined(__HAIKU__) + if (sc->sc_invalid) { + /* + * The hardware is not ready/present, don't touch anything. + * Note this can happen early on if the IRQ is shared. + */ + DPRINTF(sc, MWL_DEBUG_ANY, "%s: invalid; ignored\n", __func__); + return; + } + /* + * Figure out the reason(s) for the interrupt. + */ + mwl_hal_getisr(mh, &status); /* NB: clears ISR too */ + if (status == 0) /* must be a shared irq */ + return; +#else + status = atomic_get((int32 *)&sc->sc_intr_status); +#endif DPRINTF(sc, MWL_DEBUG_INTR, "%s: status 0x%x imask 0x%x\n", __func__, status, sc->sc_imask); diff --git a/src/add-ons/kernel/drivers/network/wlan/marvell88w8363/dev/mwl/if_mwlvar.h b/src/add-ons/kernel/drivers/network/wlan/marvell88w8363/dev/mwl/if_mwlvar.h index 3062ab75e8..ada1e8a402 100644 --- a/src/add-ons/kernel/drivers/network/wlan/marvell88w8363/dev/mwl/if_mwlvar.h +++ b/src/add-ons/kernel/drivers/network/wlan/marvell88w8363/dev/mwl/if_mwlvar.h @@ -332,7 +332,9 @@ struct mwl_softc { struct mwl_tx_radiotap_header sc_tx_th; struct mwl_rx_radiotap_header sc_rx_th; - uint32_t sc_lastisr; +#if defined(__HAIKU__) + uint32_t sc_intr_status; +#endif }; #define MWL_LOCK_INIT(_sc) \ diff --git a/src/add-ons/kernel/drivers/network/wlan/marvell88w8363/glue.c b/src/add-ons/kernel/drivers/network/wlan/marvell88w8363/glue.c index 1a9166bcc9..6d12cca2e1 100644 --- a/src/add-ons/kernel/drivers/network/wlan/marvell88w8363/glue.c +++ b/src/add-ons/kernel/drivers/network/wlan/marvell88w8363/glue.c @@ -28,41 +28,24 @@ HAIKU_CHECK_DISABLE_INTERRUPTS(device_t dev) { struct mwl_softc* sc = (struct mwl_softc*)device_get_softc(dev); struct mwl_hal* mh = sc->sc_mh; - HAIKU_INTR_REGISTER_STATE; + uint32_t intr_status; - if (sc->sc_invalid) { - /* - * The hardware is not ready/present, don't touch anything. - * Note this can happen early on if the IRQ is shared. - */ + if (sc->sc_invalid) + // The hardware is not ready/present, don't touch anything. + // Note this can happen early on if the IRQ is shared. return 0; - } - HAIKU_INTR_REGISTER_ENTER(); + mwl_hal_getisr(mh, &intr_status); + // NB: clears ISR too - /* - * We have to save the isr status right now. - * Some devices don't like having the interrupt disabled - * before accessing the isr status. - * - * Those devices return status 0, when status access - * occurs after disabling the interrupts with mwl_hal_intrset. - * - * Note: This glue.c is based on the one for the atheros wlan driver. - * So the comment above isn't based on tests on real marvell hardware. - * But due to the similarities in both drivers I just go the safe - * route here. It doesn't do any harm, but may prevent hard to spot - * bugs. - */ - mwl_hal_getisr(mh, &sc->sc_lastisr); /* NB: clears ISR too */ - if (sc->sc_lastisr == 0) { /* must be a shared irq */ - HAIKU_INTR_REGISTER_LEAVE(); + if (intr_status == 0) + // must be a shared irq return 0; - } - mwl_hal_intrset(mh, 0); // disable further intr's + atomic_set((int32*)&sc->sc_intr_status, intr_status); - HAIKU_INTR_REGISTER_LEAVE(); + mwl_hal_intrset(mh, 0); + // disable further intr's return 1; }