From 2d939304db09057c62e35b33f3b39fc95d900d1e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Colin=20G=C3=BCnther?= Date: Tue, 29 Dec 2009 22:20:54 +0000 Subject: [PATCH] * Ensuring that reading interrupt status register and disabling interrupts is done only once. * Coding style cleanup. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@34814 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- .../wlan/iprowifi2100/dev/ipw/if_ipw.c | 6 ++++- .../wlan/iprowifi2100/dev/ipw/if_ipwvar.h | 4 +++ .../drivers/network/wlan/iprowifi2100/glue.c | 25 +++++-------------- 3 files changed, 15 insertions(+), 20 deletions(-) diff --git a/src/add-ons/kernel/drivers/network/wlan/iprowifi2100/dev/ipw/if_ipw.c b/src/add-ons/kernel/drivers/network/wlan/iprowifi2100/dev/ipw/if_ipw.c index 0f90a09eca..60b440ace8 100644 --- a/src/add-ons/kernel/drivers/network/wlan/iprowifi2100/dev/ipw/if_ipw.c +++ b/src/add-ons/kernel/drivers/network/wlan/iprowifi2100/dev/ipw/if_ipw.c @@ -1070,7 +1070,7 @@ ipw_rx_newstate_intr(struct ipw_softc *sc, struct ipw_soft_buf *sbuf) case IPW_STATE_DISABLED: /* XXX? is this right? */ - sc->flags &= ~(IPW_FLAG_HACK | IPW_FLAG_SCANNING | + sc->flags &= ~(IPW_FLAG_HACK | IPW_FLAG_SCANNING | IPW_FLAG_ASSOCIATING | IPW_FLAG_ASSOCIATED); DPRINTFN(2, ("Firmware disabled (%s flags 0x%x)\n", IEEESTATE(vap), sc->flags)); @@ -1392,12 +1392,16 @@ ipw_intr(void *arg) IPW_LOCK(sc); +#if !defined(__HAIKU__) r = CSR_READ_4(sc, IPW_CSR_INTR); if (r == 0 || r == 0xffffffff) goto done; /* disable interrupts */ CSR_WRITE_4(sc, IPW_CSR_INTR_MASK, 0); +#else + r = atomic_get((int32 *)&sc->sc_intr_status); +#endif /* acknowledge all interrupts */ CSR_WRITE_4(sc, IPW_CSR_INTR, r); diff --git a/src/add-ons/kernel/drivers/network/wlan/iprowifi2100/dev/ipw/if_ipwvar.h b/src/add-ons/kernel/drivers/network/wlan/iprowifi2100/dev/ipw/if_ipwvar.h index 8d9e049ccf..69c8de9346 100644 --- a/src/add-ons/kernel/drivers/network/wlan/iprowifi2100/dev/ipw/if_ipwvar.h +++ b/src/add-ons/kernel/drivers/network/wlan/iprowifi2100/dev/ipw/if_ipwvar.h @@ -158,6 +158,10 @@ struct ipw_softc { struct ipw_rx_radiotap_header sc_rxtap; struct ipw_tx_radiotap_header sc_txtap; + +#if defined(__HAIKU__) + uint32_t sc_intr_status; +#endif }; /* diff --git a/src/add-ons/kernel/drivers/network/wlan/iprowifi2100/glue.c b/src/add-ons/kernel/drivers/network/wlan/iprowifi2100/glue.c index c91ad5a3a4..e98d75cd51 100644 --- a/src/add-ons/kernel/drivers/network/wlan/iprowifi2100/glue.c +++ b/src/add-ons/kernel/drivers/network/wlan/iprowifi2100/glue.c @@ -20,6 +20,7 @@ HAIKU_FBSD_WLAN_DRIVER_GLUE(iprowifi2100, ipw, pci) NO_HAIKU_FBSD_MII_DRIVER(); +NO_HAIKU_REENABLE_INTERRUPTS(); HAIKU_DRIVER_REQUIREMENTS(FBSD_TASKQUEUES | FBSD_SWI_TASKQUEUE | FBSD_WLAN); HAIKU_FIRMWARE_VERSION(130); @@ -29,28 +30,14 @@ HAIKU_CHECK_DISABLE_INTERRUPTS(device_t dev) { struct ipw_softc* sc = (struct ipw_softc*)device_get_softc(dev); uint32 r; - HAIKU_INTR_REGISTER_STATE; - HAIKU_INTR_REGISTER_ENTER(); - if ((r = CSR_READ_4(sc, IPW_CSR_INTR)) == 0 || r == 0xffffffff) { - HAIKU_INTR_REGISTER_LEAVE(); + r = CSR_READ_4(sc, IPW_CSR_INTR); + if (r == 0 || r == 0xffffffff) return 0; - } - /* disable interrupts */ + atomic_set((int32*)&sc->sc_intr_status, r); + CSR_WRITE_4(sc, IPW_CSR_INTR_MASK, 0); - - HAIKU_INTR_REGISTER_LEAVE(); - + // disable interrupts return 1; } - - -void -HAIKU_REENABLE_INTERRUPTS(device_t dev) -{ - struct ipw_softc* sc = (struct ipw_softc*)device_get_softc(dev); - - /* enable interrupts */ - CSR_WRITE_4(sc, IPW_CSR_INTR_MASK, IPW_INTR_MASK); -}