summaryrefslogtreecommitdiffstats
path: root/sys/dev/wpi/if_wpi.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/wpi/if_wpi.c')
-rw-r--r--sys/dev/wpi/if_wpi.c41
1 files changed, 26 insertions, 15 deletions
diff --git a/sys/dev/wpi/if_wpi.c b/sys/dev/wpi/if_wpi.c
index 72d5910..64be427 100644
--- a/sys/dev/wpi/if_wpi.c
+++ b/sys/dev/wpi/if_wpi.c
@@ -174,7 +174,6 @@ static int wpi_alloc_tx_ring(struct wpi_softc *, struct wpi_tx_ring *,
int, int);
static void wpi_reset_tx_ring(struct wpi_softc *, struct wpi_tx_ring *);
static void wpi_free_tx_ring(struct wpi_softc *, struct wpi_tx_ring *);
-static void wpi_newassoc(struct ieee80211_node *, int);
static int wpi_newstate(struct ieee80211vap *, enum ieee80211_state, int);
static void wpi_mem_lock(struct wpi_softc *);
static void wpi_mem_unlock(struct wpi_softc *);
@@ -668,7 +667,6 @@ wpi_attach(device_t dev)
ieee80211_ifattach(ic, macaddr);
/* override default methods */
ic->ic_raw_xmit = wpi_raw_xmit;
- ic->ic_newassoc = wpi_newassoc;
ic->ic_wme.wme_update = wpi_wme_update;
ic->ic_scan_start = wpi_scan_start;
ic->ic_scan_end = wpi_scan_end;
@@ -1052,9 +1050,18 @@ wpi_free_rx_ring(struct wpi_softc *sc, struct wpi_rx_ring *ring)
wpi_dma_contig_free(&ring->desc_dma);
- for (i = 0; i < WPI_RX_RING_COUNT; i++)
- if (ring->data[i].m != NULL)
- m_freem(ring->data[i].m);
+ for (i = 0; i < WPI_RX_RING_COUNT; i++) {
+ struct wpi_rx_data *data = &ring->data[i];
+
+ if (data->m != NULL) {
+ bus_dmamap_sync(ring->data_dmat, data->map,
+ BUS_DMASYNC_POSTREAD);
+ bus_dmamap_unload(ring->data_dmat, data->map);
+ m_freem(data->m);
+ }
+ if (data->map != NULL)
+ bus_dmamap_destroy(ring->data_dmat, data->map);
+ }
}
static int
@@ -1461,6 +1468,7 @@ wpi_rx_intr(struct wpi_softc *sc, struct wpi_rx_desc *desc,
return;
}
+ bus_dmamap_sync(ring->data_dmat, data->map, BUS_DMASYNC_POSTREAD);
head = (struct wpi_rx_head *)((caddr_t)(stat + 1) + stat->len);
tail = (struct wpi_rx_tail *)((caddr_t)(head + 1) + le16toh(head->len));
@@ -1491,6 +1499,8 @@ wpi_rx_intr(struct wpi_softc *sc, struct wpi_rx_desc *desc,
ifp->if_ierrors++;
return;
}
+ bus_dmamap_unload(ring->data_dmat, data->map);
+
error = bus_dmamap_load(ring->data_dmat, data->map,
mtod(mnew, caddr_t), MJUMPAGESIZE,
wpi_dma_map_addr, &paddr, BUS_DMA_NOWAIT);
@@ -1645,9 +1655,15 @@ wpi_notif_intr(struct wpi_softc *sc)
struct wpi_rx_data *data;
uint32_t hw;
+ bus_dmamap_sync(sc->shared_dma.tag, sc->shared_dma.map,
+ BUS_DMASYNC_POSTREAD);
+
hw = le32toh(sc->shared->next);
while (sc->rxq.cur != hw) {
data = &sc->rxq.data[sc->rxq.cur];
+
+ bus_dmamap_sync(sc->rxq.data_dmat, data->map,
+ BUS_DMASYNC_POSTREAD);
desc = (void *)data->m->m_ext.ext_buf;
DPRINTFN(WPI_DEBUG_NOTIFY,
@@ -2429,6 +2445,9 @@ wpi_auth(struct wpi_softc *sc, struct ieee80211vap *vap)
if (IEEE80211_IS_CHAN_2GHZ(ni->ni_chan)) {
sc->config.flags |= htole32(WPI_CONFIG_AUTO |
WPI_CONFIG_24GHZ);
+ } else {
+ sc->config.flags &= ~htole32(WPI_CONFIG_AUTO |
+ WPI_CONFIG_24GHZ);
}
if (IEEE80211_IS_CHAN_A(ni->ni_chan)) {
sc->config.cck_mask = 0;
@@ -3004,14 +3023,12 @@ wpi_rfkill_resume(struct wpi_softc *sc)
if (ntries == 1000) {
device_printf(sc->sc_dev,
"timeout waiting for thermal calibration\n");
- WPI_UNLOCK(sc);
return;
}
DPRINTFN(WPI_DEBUG_TEMP,("temperature %d\n", sc->temp));
if (wpi_config(sc) != 0) {
device_printf(sc->sc_dev, "device config failed\n");
- WPI_UNLOCK(sc);
return;
}
@@ -3214,14 +3231,6 @@ wpi_stop(struct wpi_softc *sc)
}
static void
-wpi_newassoc(struct ieee80211_node *ni, int isnew)
-{
-
- /* XXX move */
- ieee80211_ratectl_node_init(ni);
-}
-
-static void
wpi_calib_timeout(void *arg)
{
struct wpi_softc *sc = arg;
@@ -3554,7 +3563,9 @@ wpi_set_channel(struct ieee80211com *ic)
* are already taken care of by their respective firmware commands.
*/
if (ic->ic_opmode == IEEE80211_M_MONITOR) {
+ WPI_LOCK(sc);
error = wpi_config(sc);
+ WPI_UNLOCK(sc);
if (error != 0)
device_printf(sc->sc_dev,
"error %d settting channel\n", error);
OpenPOWER on IntegriCloud