Read the interrupt status only once, to prevent wrong status reads in the
wpi_intr function. This should fix firmware timeouts, which occure due to the second read just returns wrong values. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@34805 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -966,7 +966,7 @@ wpi_alloc_rx_ring(struct wpi_softc *sc, struct wpi_rx_ring *ring)
|
|||||||
goto fail;
|
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_32BIT,
|
||||||
BUS_SPACE_MAXADDR, NULL, NULL, MJUMPAGESIZE, 1,
|
BUS_SPACE_MAXADDR, NULL, NULL, MJUMPAGESIZE, 1,
|
||||||
MJUMPAGESIZE, BUS_DMA_NOWAIT, NULL, NULL, &ring->data_dmat);
|
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 */
|
error = ENOMEM; /* XXX unique code */
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
bus_dmamap_sync(ring->data_dmat, data->map,
|
bus_dmamap_sync(ring->data_dmat, data->map,
|
||||||
BUS_DMASYNC_PREWRITE);
|
BUS_DMASYNC_PREWRITE);
|
||||||
|
|
||||||
data->m = m;
|
data->m = m;
|
||||||
@@ -1764,6 +1764,7 @@ wpi_intr(void *arg)
|
|||||||
|
|
||||||
WPI_LOCK(sc);
|
WPI_LOCK(sc);
|
||||||
|
|
||||||
|
#if !defined(__HAIKU__)
|
||||||
r = WPI_READ(sc, WPI_INTR);
|
r = WPI_READ(sc, WPI_INTR);
|
||||||
if (r == 0 || r == 0xffffffff) {
|
if (r == 0 || r == 0xffffffff) {
|
||||||
WPI_UNLOCK(sc);
|
WPI_UNLOCK(sc);
|
||||||
@@ -1772,6 +1773,10 @@ wpi_intr(void *arg)
|
|||||||
|
|
||||||
/* disable interrupts */
|
/* disable interrupts */
|
||||||
WPI_WRITE(sc, WPI_MASK, 0);
|
WPI_WRITE(sc, WPI_MASK, 0);
|
||||||
|
#else
|
||||||
|
r = atomic_and((int32 *)&sc->sc_intr_status, 0);
|
||||||
|
#endif
|
||||||
|
|
||||||
/* ack interrupts */
|
/* ack interrupts */
|
||||||
WPI_WRITE(sc, WPI_INTR, r);
|
WPI_WRITE(sc, WPI_INTR, r);
|
||||||
|
|
||||||
|
|||||||
@@ -201,6 +201,10 @@ struct wpi_softc {
|
|||||||
struct wpi_power_group groups[WPI_POWER_GROUPS_COUNT];
|
struct wpi_power_group groups[WPI_POWER_GROUPS_COUNT];
|
||||||
int8_t maxpwr[IEEE80211_CHAN_MAX];
|
int8_t maxpwr[IEEE80211_CHAN_MAX];
|
||||||
char domain[4]; /*reglatory domain XXX */
|
char domain[4]; /*reglatory domain XXX */
|
||||||
|
|
||||||
|
#if defined(__HAIKU__)
|
||||||
|
uint32_t sc_intr_status;
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
#define WPI_LOCK_INIT(_sc) \
|
#define WPI_LOCK_INIT(_sc) \
|
||||||
mtx_init(&(_sc)->sc_mtx, device_get_nameunit((_sc)->sc_dev), \
|
mtx_init(&(_sc)->sc_mtx, device_get_nameunit((_sc)->sc_dev), \
|
||||||
|
|||||||
@@ -20,6 +20,7 @@
|
|||||||
|
|
||||||
HAIKU_FBSD_WLAN_DRIVER_GLUE(iprowifi3945, wpi, pci)
|
HAIKU_FBSD_WLAN_DRIVER_GLUE(iprowifi3945, wpi, pci)
|
||||||
NO_HAIKU_FBSD_MII_DRIVER();
|
NO_HAIKU_FBSD_MII_DRIVER();
|
||||||
|
NO_HAIKU_REENABLE_INTERRUPTS();
|
||||||
HAIKU_DRIVER_REQUIREMENTS(FBSD_TASKQUEUES | FBSD_WLAN);
|
HAIKU_DRIVER_REQUIREMENTS(FBSD_TASKQUEUES | FBSD_WLAN);
|
||||||
HAIKU_FIRMWARE_VERSION(2144);
|
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);
|
struct wpi_softc* sc = (struct wpi_softc*)device_get_softc(dev);
|
||||||
uint32 r;
|
uint32 r;
|
||||||
HAIKU_INTR_REGISTER_STATE;
|
|
||||||
|
|
||||||
HAIKU_INTR_REGISTER_ENTER();
|
if ((r = WPI_READ(sc, WPI_INTR)) == 0 || r == 0xffffffff)
|
||||||
if ((r = WPI_READ(sc, WPI_INTR)) == 0 || r == 0xffffffff) {
|
|
||||||
HAIKU_INTR_REGISTER_LEAVE();
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
|
||||||
|
atomic_or((int32*)&sc->sc_intr_status, r);
|
||||||
|
|
||||||
/* disable interrupts */
|
/* disable interrupts */
|
||||||
WPI_WRITE(sc, WPI_MASK, 0);
|
WPI_WRITE(sc, WPI_MASK, 0);
|
||||||
|
|
||||||
HAIKU_INTR_REGISTER_LEAVE();
|
|
||||||
|
|
||||||
return 1;
|
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);
|
|
||||||
}
|
|
||||||
|
|||||||
Reference in New Issue
Block a user