Page MenuHomeFreeBSD

D8804.id22941.diff
No OneTemporary

D8804.id22941.diff

Index: sys/dev/iwn/if_iwn.c
===================================================================
--- sys/dev/iwn/if_iwn.c
+++ sys/dev/iwn/if_iwn.c
@@ -476,6 +476,7 @@
}
IWN_LOCK_INIT(sc);
+ IWN_CMD_LOCK_INIT(sc);
/* Read hardware revision and attach. */
sc->hw_type = (IWN_READ(sc, IWN_HW_REV) >> IWN_HW_REV_TYPE_SHIFT)
@@ -1443,6 +1444,7 @@
DPRINTF(sc, IWN_DEBUG_TRACE, "->%s: end\n", __func__);
IWN_LOCK_DESTROY(sc);
+ IWN_CMD_LOCK_DESTROY(sc);
return 0;
}
@@ -2120,6 +2122,9 @@
memset(sc->ict, 0, IWN_ICT_SIZE);
sc->ict_cur = 0;
+ bus_dmamap_sync(sc->ict_dma.tag, sc->ict_dma.map,
+ BUS_DMASYNC_PREWRITE);
+
/* Set physical address of ICT table (4KB aligned). */
DPRINTF(sc, IWN_DEBUG_RESET, "%s: enabling ICT\n", __func__);
IWN_WRITE(sc, IWN_DRAM_INT_TBL, IWN_DRAM_INT_TBL_ENABLE |
@@ -4100,6 +4105,8 @@
/* Read interrupts from ICT (fast) or from registers (slow). */
if (sc->sc_flags & IWN_FLAG_USE_ICT) {
+ bus_dmamap_sync(sc->ict_dma.tag, sc->ict_dma.map,
+ BUS_DMASYNC_POSTREAD);
tmp = 0;
while (sc->ict[sc->ict_cur] != 0) {
tmp |= sc->ict[sc->ict_cur];
@@ -4635,7 +4642,7 @@
}
bus_dmamap_sync(ring->data_dmat, data->map, BUS_DMASYNC_PREWRITE);
- bus_dmamap_sync(ring->data_dmat, ring->cmd_dma.map,
+ bus_dmamap_sync(ring->cmd_dma.tag, ring->cmd_dma.map,
BUS_DMASYNC_PREWRITE);
bus_dmamap_sync(ring->desc_dma.tag, ring->desc_dma.map,
BUS_DMASYNC_PREWRITE);
@@ -4828,7 +4835,7 @@
}
bus_dmamap_sync(ring->data_dmat, data->map, BUS_DMASYNC_PREWRITE);
- bus_dmamap_sync(ring->data_dmat, ring->cmd_dma.map,
+ bus_dmamap_sync(ring->cmd_dma.tag, ring->cmd_dma.map,
BUS_DMASYNC_PREWRITE);
bus_dmamap_sync(ring->desc_dma.tag, ring->desc_dma.map,
BUS_DMASYNC_PREWRITE);
@@ -5113,6 +5120,8 @@
if (async == 0)
IWN_LOCK_ASSERT(sc);
+ IWN_CMD_LOCK(sc);
+
if (sc->sc_flags & IWN_FLAG_PAN_SUPPORT)
cmd_queue_num = IWN_PAN_CMD_QUEUE;
else
@@ -5125,17 +5134,21 @@
if (size > sizeof cmd->data) {
/* Command is too large to fit in a descriptor. */
- if (totlen > MCLBYTES)
- return EINVAL;
+ if (totlen > MCLBYTES) {
+ error = EINVAL;
+ goto out;
+ }
m = m_getjcl(M_NOWAIT, MT_DATA, M_PKTHDR, MJUMPAGESIZE);
- if (m == NULL)
- return ENOMEM;
+ if (m == NULL) {
+ error = ENOMEM;
+ goto out;
+ }
cmd = mtod(m, struct iwn_tx_cmd *);
error = bus_dmamap_load(ring->data_dmat, data->map, cmd,
totlen, iwn_dma_map_addr, &paddr, BUS_DMA_NOWAIT);
if (error != 0) {
m_freem(m);
- return error;
+ goto out;
}
data->m = m;
} else {
@@ -5161,7 +5174,7 @@
bus_dmamap_sync(ring->data_dmat, data->map,
BUS_DMASYNC_PREWRITE);
} else {
- bus_dmamap_sync(ring->data_dmat, ring->cmd_dma.map,
+ bus_dmamap_sync(ring->cmd_dma.tag, ring->cmd_dma.map,
BUS_DMASYNC_PREWRITE);
}
bus_dmamap_sync(ring->desc_dma.tag, ring->desc_dma.map,
@@ -5173,7 +5186,14 @@
DPRINTF(sc, IWN_DEBUG_TRACE, "->%s: end\n",__func__);
- return async ? 0 : msleep(desc, &sc->sc_mtx, PCATCH, "iwncmd", hz);
+
+out:
+ IWN_CMD_UNLOCK(sc);
+
+ if (!async && (error == 0))
+ error = msleep(desc, &sc->sc_mtx, PCATCH, "iwncmd", hz);
+
+ return (error);
}
static int
Index: sys/dev/iwn/if_iwnvar.h
===================================================================
--- sys/dev/iwn/if_iwnvar.h
+++ sys/dev/iwn/if_iwnvar.h
@@ -237,6 +237,7 @@
int sc_debug;
struct cdev *sc_cdev;
struct mtx sc_mtx;
+ struct mtx sc_cmd_mtx;
struct ieee80211com sc_ic;
struct ieee80211_ratectl_tx_status sc_txs;
@@ -435,3 +436,11 @@
#define IWN_LOCK_ASSERT(_sc) mtx_assert(&(_sc)->sc_mtx, MA_OWNED)
#define IWN_UNLOCK(_sc) mtx_unlock(&(_sc)->sc_mtx)
#define IWN_LOCK_DESTROY(_sc) mtx_destroy(&(_sc)->sc_mtx)
+
+#define IWN_CMD_LOCK_INIT(_sc) \
+ mtx_init(&(_sc)->sc_cmd_mtx, device_get_nameunit((_sc)->sc_dev), \
+ "iwncmd", MTX_DEF)
+#define IWN_CMD_LOCK(_sc) mtx_lock(&(_sc)->sc_cmd_mtx)
+#define IWN_CMD_LOCK_ASSERT(_sc) mtx_assert(&(_sc)->sc_cmd_mtx, MA_OWNED)
+#define IWN_CMD_UNLOCK(_sc) mtx_unlock(&(_sc)->sc_cmd_mtx)
+#define IWN_CMD_LOCK_DESTROY(_sc) mtx_destroy(&(_sc)->sc_cmd_mtx)

File Metadata

Mime Type
text/plain
Expires
Tue, Mar 24, 10:41 PM (2 h, 9 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
30277528
Default Alt Text
D8804.id22941.diff (4 KB)

Event Timeline