static void update_promisc(void *, int);
static void update_channel(void *, int);
static void update_chw(void *, int);
+static void update_wme(void *, int);
static void ieee80211_newstate_cb(void *, int);
static int
TASK_INIT(&ic->ic_chan_task, 0, update_channel, ic);
TASK_INIT(&ic->ic_bmiss_task, 0, beacon_miss, ic);
TASK_INIT(&ic->ic_chw_task, 0, update_chw, ic);
+ TASK_INIT(&ic->ic_wme_task, 0, update_wme, ic);
ic->ic_wme.wme_hipri_switch_hysteresis =
AGGRESSIVE_MODE_SWITCH_HYSTERESIS;
ieee80211_beacon_notify(vap, IEEE80211_BEACON_WME);
}
- wme->wme_update(ic);
+ /* schedule the deferred WME update */
+ ieee80211_runtask(ic, &ic->ic_wme_task);
IEEE80211_DPRINTF(vap, IEEE80211_MSG_WME,
"%s: WME params updated, cap_info 0x%x\n", __func__,
ic->ic_update_chw(ic);
}
+static void
+update_wme(void *arg, int npending)
+{
+ struct ieee80211com *ic = arg;
+
+ /*
+ * XXX should we defer the WME configuration update until now?
+ */
+ ic->ic_wme.wme_update(ic);
+}
+
/*
* Block until the parent is in a known state. This is
* used after any operations that dispatch a task (e.g.
ieee80211_draintask(ic, &ic->ic_chan_task);
ieee80211_draintask(ic, &ic->ic_bmiss_task);
ieee80211_draintask(ic, &ic->ic_chw_task);
+ ieee80211_draintask(ic, &ic->ic_wme_task);
taskqueue_unblock(ic->ic_tq);
}