Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F149352644
D8804.id22941.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
4 KB
Referenced Files
None
Subscribers
None
D8804.id22941.diff
View Options
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
Details
Attached
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)
Attached To
Mode
D8804: iwn: DMA fixes, and race condition fix
Attached
Detach File
Event Timeline
Log In to Comment