svn commit: r280086 - head/sys/dev/wpi
Adrian Chadd
adrian at FreeBSD.org
Sun Mar 15 20:53:47 UTC 2015
Author: adrian
Date: Sun Mar 15 20:53:46 2015
New Revision: 280086
URL: https://svnweb.freebsd.org/changeset/base/280086
Log:
Use separate mutex for wv_bcbuf and wv_boff structures.
PR: kern/197143
Submitted by: Andriy Voskoboinyk <s3erios at gmail.com>
Modified:
head/sys/dev/wpi/if_wpi.c
head/sys/dev/wpi/if_wpivar.h
Modified: head/sys/dev/wpi/if_wpi.c
==============================================================================
--- head/sys/dev/wpi/if_wpi.c Sun Mar 15 20:52:47 2015 (r280085)
+++ head/sys/dev/wpi/if_wpi.c Sun Mar 15 20:53:46 2015 (r280086)
@@ -617,8 +617,10 @@ wpi_vap_create(struct ieee80211com *ic,
vap = &wvp->wv_vap;
ieee80211_vap_setup(ic, vap, name, unit, opmode, flags, bssid, mac);
- if (opmode == IEEE80211_M_IBSS)
+ if (opmode == IEEE80211_M_IBSS) {
+ WPI_VAP_LOCK_INIT(wvp);
wpi_init_beacon(wvp);
+ }
/* Override with driver methods. */
vap->iv_key_alloc = wpi_key_alloc;
@@ -649,6 +651,8 @@ wpi_vap_delete(struct ieee80211vap *vap)
if (opmode == IEEE80211_M_IBSS) {
if (bcn->m != NULL)
m_freem(bcn->m);
+
+ WPI_VAP_LOCK_DESTROY(wvp);
}
free(wvp, M_80211_VAP);
@@ -2340,8 +2344,6 @@ wpi_cmd2(struct wpi_softc *sc, struct wp
bus_dma_segment_t *seg, segs[WPI_MAX_SCATTER];
int error, i, hdrlen, nsegs, totlen, pad;
- WPI_LOCK_ASSERT(sc);
-
WPI_TXQ_LOCK(sc);
KASSERT(buf->size <= sizeof(buf->data), ("buffer overflow"));
@@ -3967,7 +3969,7 @@ wpi_config_beacon(struct wpi_vap *wvp)
DPRINTF(sc, WPI_DEBUG_TRACE, TRACE_STR_DOING, __func__);
- WPI_LOCK_ASSERT(sc);
+ WPI_VAP_LOCK_ASSERT(wvp);
cmd->len = htole16(bcn->m->m_pkthdr.len);
cmd->plcp = (ic->ic_curmode == IEEE80211_MODE_11A) ?
@@ -4025,12 +4027,14 @@ wpi_setup_beacon(struct wpi_softc *sc, s
return ENOMEM;
}
+ WPI_VAP_LOCK(wvp);
if (bcn->m != NULL)
m_freem(bcn->m);
bcn->m = m;
error = wpi_config_beacon(wvp);
+ WPI_VAP_UNLOCK(wvp);
return error;
}
@@ -4047,21 +4051,21 @@ wpi_update_beacon(struct ieee80211vap *v
DPRINTF(sc, WPI_DEBUG_TRACE, TRACE_STR_BEGIN, __func__);
- WPI_LOCK(sc);
+ WPI_VAP_LOCK(wvp);
if (bcn->m == NULL) {
bcn->m = ieee80211_beacon_alloc(ni, bo);
if (bcn->m == NULL) {
device_printf(sc->sc_dev,
"%s: could not allocate beacon frame\n", __func__);
- WPI_UNLOCK(sc);
DPRINTF(sc, WPI_DEBUG_TRACE, TRACE_STR_END_ERR,
__func__);
+ WPI_VAP_UNLOCK(wvp);
return;
}
}
- WPI_UNLOCK(sc);
+ WPI_VAP_UNLOCK(wvp);
if (item == IEEE80211_BEACON_TIM)
mcast = 1; /* TODO */
@@ -4069,9 +4073,9 @@ wpi_update_beacon(struct ieee80211vap *v
setbit(bo->bo_flags, item);
ieee80211_beacon_update(ni, bo, bcn->m, mcast);
- WPI_LOCK(sc);
+ WPI_VAP_LOCK(wvp);
wpi_config_beacon(wvp);
- WPI_UNLOCK(sc);
+ WPI_VAP_UNLOCK(wvp);
DPRINTF(sc, WPI_DEBUG_TRACE, TRACE_STR_END, __func__);
}
Modified: head/sys/dev/wpi/if_wpivar.h
==============================================================================
--- head/sys/dev/wpi/if_wpivar.h Sun Mar 15 20:52:47 2015 (r280085)
+++ head/sys/dev/wpi/if_wpivar.h Sun Mar 15 20:53:46 2015 (r280086)
@@ -125,12 +125,21 @@ struct wpi_vap {
struct wpi_buf wv_bcbuf;
struct ieee80211_beacon_offsets wv_boff;
+ struct mtx wv_mtx;
int (*wv_newstate)(struct ieee80211vap *,
enum ieee80211_state, int);
};
#define WPI_VAP(vap) ((struct wpi_vap *)(vap))
+#define WPI_VAP_LOCK_INIT(_wvp) \
+ mtx_init(&(_wvp)->wv_mtx, "lock for wv_bcbuf/wv_boff structures", \
+ NULL, MTX_DEF)
+#define WPI_VAP_LOCK(_wvp) mtx_lock(&(_wvp)->wv_mtx)
+#define WPI_VAP_UNLOCK(_wvp) mtx_unlock(&(_wvp)->wv_mtx)
+#define WPI_VAP_LOCK_ASSERT(_wvp) mtx_assert(&(_wvp)->wv_mtx, MA_OWNED)
+#define WPI_VAP_LOCK_DESTROY(_wvp) mtx_destroy(&(_wvp)->wv_mtx)
+
struct wpi_fw_part {
const uint8_t *text;
uint32_t textsz;
@@ -224,7 +233,7 @@ struct wpi_softc {
char domain[4]; /* Regulatory domain. */
};
-/* WPI_LOCK > WPI_NT_LOCK > WPI_TXQ_LOCK */
+/* WPI_LOCK > WPI_NT_LOCK / WPI_VAP_LOCK > WPI_TXQ_LOCK */
#define WPI_LOCK_INIT(_sc) \
mtx_init(&(_sc)->sc_mtx, device_get_nameunit((_sc)->sc_dev), \
More information about the svn-src-all
mailing list