* 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
This commit is contained in:
Colin Günther 2009-12-29 22:20:54 +00:00
parent 0e39b0b7ce
commit 2d939304db
3 changed files with 15 additions and 20 deletions

View File

@ -1070,7 +1070,7 @@ ipw_rx_newstate_intr(struct ipw_softc *sc, struct ipw_soft_buf *sbuf)
case IPW_STATE_DISABLED: case IPW_STATE_DISABLED:
/* XXX? is this right? */ /* 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); IPW_FLAG_ASSOCIATING | IPW_FLAG_ASSOCIATED);
DPRINTFN(2, ("Firmware disabled (%s flags 0x%x)\n", DPRINTFN(2, ("Firmware disabled (%s flags 0x%x)\n",
IEEESTATE(vap), sc->flags)); IEEESTATE(vap), sc->flags));
@ -1392,12 +1392,16 @@ ipw_intr(void *arg)
IPW_LOCK(sc); IPW_LOCK(sc);
#if !defined(__HAIKU__)
r = CSR_READ_4(sc, IPW_CSR_INTR); r = CSR_READ_4(sc, IPW_CSR_INTR);
if (r == 0 || r == 0xffffffff) if (r == 0 || r == 0xffffffff)
goto done; goto done;
/* disable interrupts */ /* disable interrupts */
CSR_WRITE_4(sc, IPW_CSR_INTR_MASK, 0); CSR_WRITE_4(sc, IPW_CSR_INTR_MASK, 0);
#else
r = atomic_get((int32 *)&sc->sc_intr_status);
#endif
/* acknowledge all interrupts */ /* acknowledge all interrupts */
CSR_WRITE_4(sc, IPW_CSR_INTR, r); CSR_WRITE_4(sc, IPW_CSR_INTR, r);

View File

@ -158,6 +158,10 @@ struct ipw_softc {
struct ipw_rx_radiotap_header sc_rxtap; struct ipw_rx_radiotap_header sc_rxtap;
struct ipw_tx_radiotap_header sc_txtap; struct ipw_tx_radiotap_header sc_txtap;
#if defined(__HAIKU__)
uint32_t sc_intr_status;
#endif
}; };
/* /*

View File

@ -20,6 +20,7 @@
HAIKU_FBSD_WLAN_DRIVER_GLUE(iprowifi2100, ipw, pci) HAIKU_FBSD_WLAN_DRIVER_GLUE(iprowifi2100, ipw, pci)
NO_HAIKU_FBSD_MII_DRIVER(); NO_HAIKU_FBSD_MII_DRIVER();
NO_HAIKU_REENABLE_INTERRUPTS();
HAIKU_DRIVER_REQUIREMENTS(FBSD_TASKQUEUES | FBSD_SWI_TASKQUEUE | FBSD_WLAN); HAIKU_DRIVER_REQUIREMENTS(FBSD_TASKQUEUES | FBSD_SWI_TASKQUEUE | FBSD_WLAN);
HAIKU_FIRMWARE_VERSION(130); 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); struct ipw_softc* sc = (struct ipw_softc*)device_get_softc(dev);
uint32 r; uint32 r;
HAIKU_INTR_REGISTER_STATE;
HAIKU_INTR_REGISTER_ENTER(); r = CSR_READ_4(sc, IPW_CSR_INTR);
if ((r = CSR_READ_4(sc, IPW_CSR_INTR)) == 0 || r == 0xffffffff) { if (r == 0 || r == 0xffffffff)
HAIKU_INTR_REGISTER_LEAVE();
return 0; return 0;
}
/* disable interrupts */ atomic_set((int32*)&sc->sc_intr_status, r);
CSR_WRITE_4(sc, IPW_CSR_INTR_MASK, 0); CSR_WRITE_4(sc, IPW_CSR_INTR_MASK, 0);
// disable interrupts
HAIKU_INTR_REGISTER_LEAVE();
return 1; 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);
}