diff --git a/src/add-ons/kernel/drivers/network/wlan/iprowifi3945/dev/wpi/if_wpi.c b/src/add-ons/kernel/drivers/network/wlan/iprowifi3945/dev/wpi/if_wpi.c index af51f60269..b74b2da2a7 100644 --- a/src/add-ons/kernel/drivers/network/wlan/iprowifi3945/dev/wpi/if_wpi.c +++ b/src/add-ons/kernel/drivers/network/wlan/iprowifi3945/dev/wpi/if_wpi.c @@ -966,7 +966,7 @@ wpi_alloc_rx_ring(struct wpi_softc *sc, struct wpi_rx_ring *ring) goto fail; } - error = bus_dma_tag_create(bus_get_dma_tag(sc->sc_dev), 1, 0, + error = bus_dma_tag_create(bus_get_dma_tag(sc->sc_dev), 1, 0, BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL, MJUMPAGESIZE, 1, MJUMPAGESIZE, BUS_DMA_NOWAIT, NULL, NULL, &ring->data_dmat); @@ -1011,7 +1011,7 @@ wpi_alloc_rx_ring(struct wpi_softc *sc, struct wpi_rx_ring *ring) error = ENOMEM; /* XXX unique code */ goto fail; } - bus_dmamap_sync(ring->data_dmat, data->map, + bus_dmamap_sync(ring->data_dmat, data->map, BUS_DMASYNC_PREWRITE); data->m = m; @@ -1764,6 +1764,7 @@ wpi_intr(void *arg) WPI_LOCK(sc); +#if !defined(__HAIKU__) r = WPI_READ(sc, WPI_INTR); if (r == 0 || r == 0xffffffff) { WPI_UNLOCK(sc); @@ -1772,6 +1773,10 @@ wpi_intr(void *arg) /* disable interrupts */ WPI_WRITE(sc, WPI_MASK, 0); +#else + r = atomic_and((int32 *)&sc->sc_intr_status, 0); +#endif + /* ack interrupts */ WPI_WRITE(sc, WPI_INTR, r); diff --git a/src/add-ons/kernel/drivers/network/wlan/iprowifi3945/dev/wpi/if_wpivar.h b/src/add-ons/kernel/drivers/network/wlan/iprowifi3945/dev/wpi/if_wpivar.h index 811624b37c..a4371d3ac1 100644 --- a/src/add-ons/kernel/drivers/network/wlan/iprowifi3945/dev/wpi/if_wpivar.h +++ b/src/add-ons/kernel/drivers/network/wlan/iprowifi3945/dev/wpi/if_wpivar.h @@ -201,6 +201,10 @@ struct wpi_softc { struct wpi_power_group groups[WPI_POWER_GROUPS_COUNT]; int8_t maxpwr[IEEE80211_CHAN_MAX]; char domain[4]; /*reglatory domain XXX */ + +#if defined(__HAIKU__) + uint32_t sc_intr_status; +#endif }; #define WPI_LOCK_INIT(_sc) \ mtx_init(&(_sc)->sc_mtx, device_get_nameunit((_sc)->sc_dev), \ diff --git a/src/add-ons/kernel/drivers/network/wlan/iprowifi3945/glue.c b/src/add-ons/kernel/drivers/network/wlan/iprowifi3945/glue.c index ac6c81dcc6..3a1c2ff6ec 100644 --- a/src/add-ons/kernel/drivers/network/wlan/iprowifi3945/glue.c +++ b/src/add-ons/kernel/drivers/network/wlan/iprowifi3945/glue.c @@ -20,6 +20,7 @@ HAIKU_FBSD_WLAN_DRIVER_GLUE(iprowifi3945, wpi, pci) NO_HAIKU_FBSD_MII_DRIVER(); +NO_HAIKU_REENABLE_INTERRUPTS(); HAIKU_DRIVER_REQUIREMENTS(FBSD_TASKQUEUES | FBSD_WLAN); HAIKU_FIRMWARE_VERSION(2144); @@ -29,28 +30,14 @@ HAIKU_CHECK_DISABLE_INTERRUPTS(device_t dev) { struct wpi_softc* sc = (struct wpi_softc*)device_get_softc(dev); uint32 r; - HAIKU_INTR_REGISTER_STATE; - HAIKU_INTR_REGISTER_ENTER(); - if ((r = WPI_READ(sc, WPI_INTR)) == 0 || r == 0xffffffff) { - HAIKU_INTR_REGISTER_LEAVE(); + if ((r = WPI_READ(sc, WPI_INTR)) == 0 || r == 0xffffffff) return 0; - } + + atomic_or((int32*)&sc->sc_intr_status, r); /* disable interrupts */ WPI_WRITE(sc, WPI_MASK, 0); - HAIKU_INTR_REGISTER_LEAVE(); - return 1; } - - -void -HAIKU_REENABLE_INTERRUPTS(device_t dev) -{ - struct wpi_softc* sc = (struct wpi_softc*)device_get_softc(dev); - - /* enable interrupts */ - WPI_WRITE(sc, WPI_MASK, WPI_INTR_MASK); -}