Author: colin Date: 2009-12-29 23:20:54 +0100 (Tue, 29 Dec 2009) New Revision: 34814 Changeset: http://dev.haiku-os.org/changeset/34814/haiku Modified: haiku/trunk/src/add-ons/kernel/drivers/network/wlan/iprowifi2100/dev/ipw/if_ipw.c haiku/trunk/src/add-ons/kernel/drivers/network/wlan/iprowifi2100/dev/ipw/if_ipwvar.h haiku/trunk/src/add-ons/kernel/drivers/network/wlan/iprowifi2100/glue.c Log: * Ensuring that reading interrupt status register and disabling interrupts is done only once. * Coding style cleanup. Modified: haiku/trunk/src/add-ons/kernel/drivers/network/wlan/iprowifi2100/dev/ipw/if_ipw.c =================================================================== --- haiku/trunk/src/add-ons/kernel/drivers/network/wlan/iprowifi2100/dev/ipw/if_ipw.c 2009-12-29 22:10:04 UTC (rev 34813) +++ haiku/trunk/src/add-ons/kernel/drivers/network/wlan/iprowifi2100/dev/ipw/if_ipw.c 2009-12-29 22:20:54 UTC (rev 34814) @@ -1070,7 +1070,7 @@ 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_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); Modified: haiku/trunk/src/add-ons/kernel/drivers/network/wlan/iprowifi2100/dev/ipw/if_ipwvar.h =================================================================== --- haiku/trunk/src/add-ons/kernel/drivers/network/wlan/iprowifi2100/dev/ipw/if_ipwvar.h 2009-12-29 22:10:04 UTC (rev 34813) +++ haiku/trunk/src/add-ons/kernel/drivers/network/wlan/iprowifi2100/dev/ipw/if_ipwvar.h 2009-12-29 22:20:54 UTC (rev 34814) @@ -158,6 +158,10 @@ struct ipw_rx_radiotap_header sc_rxtap; struct ipw_tx_radiotap_header sc_txtap; + +#if defined(__HAIKU__) + uint32_t sc_intr_status; +#endif }; /* Modified: haiku/trunk/src/add-ons/kernel/drivers/network/wlan/iprowifi2100/glue.c =================================================================== --- haiku/trunk/src/add-ons/kernel/drivers/network/wlan/iprowifi2100/glue.c 2009-12-29 22:10:04 UTC (rev 34813) +++ haiku/trunk/src/add-ons/kernel/drivers/network/wlan/iprowifi2100/glue.c 2009-12-29 22:20:54 UTC (rev 34814) @@ -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 @@ { 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 */ - CSR_WRITE_4(sc, IPW_CSR_INTR_MASK, 0); - - HAIKU_INTR_REGISTER_LEAVE(); + atomic_set((int32*)&sc->sc_intr_status, r); + CSR_WRITE_4(sc, IPW_CSR_INTR_MASK, 0); + // 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); -}