mac80211: clean up beacon interval settings
We currently have two beacon interval configuration knobs: hw.conf.beacon_int and vif.bss_info.beacon_int. This is rather confusing, even though the former is used when we beacon ourselves and the latter when we are associated to an AP. This just deprecates the hw.conf.beacon_int setting in favour of always using vif.bss_info.beacon_int. Since it touches all the beaconing IBSS code anyway, we can also add support for the cfg80211 IBSS beacon interval configuration easily. NOTE: The hw.conf.beacon_int setting is retained for now due to drivers still using it -- I couldn't untangle all drivers, some are updated in this patch. Signed-off-by: Johannes Berg <johannes@sipsolutions.net> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:

committed by
John W. Linville

parent
f3b85252f0
commit
57c4d7b4c4
@@ -316,9 +316,9 @@ int ar9170_set_beacon_timers(struct ar9170 *ar)
|
||||
u32 v = 0;
|
||||
u32 pretbtt = 0;
|
||||
|
||||
v |= ar->hw->conf.beacon_int;
|
||||
|
||||
if (ar->vif) {
|
||||
v |= ar->vif->bss_conf.beacon_int;
|
||||
|
||||
switch (ar->vif->type) {
|
||||
case NL80211_IFTYPE_MESH_POINT:
|
||||
case NL80211_IFTYPE_ADHOC:
|
||||
@@ -326,7 +326,7 @@ int ar9170_set_beacon_timers(struct ar9170 *ar)
|
||||
break;
|
||||
case NL80211_IFTYPE_AP:
|
||||
v |= BIT(24);
|
||||
pretbtt = (ar->hw->conf.beacon_int - 6) << 16;
|
||||
pretbtt = (ar->vif->bss_conf.beacon_int - 6) << 16;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
@@ -1337,7 +1337,7 @@ static int ar9170_op_config(struct ieee80211_hw *hw, u32 changed)
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (changed & IEEE80211_CONF_CHANGE_BEACON_INTERVAL) {
|
||||
if (changed & BSS_CHANGED_BEACON_INT) {
|
||||
err = ar9170_set_beacon_timers(ar);
|
||||
if (err)
|
||||
goto out;
|
||||
@@ -1499,6 +1499,9 @@ static void ar9170_op_bss_info_changed(struct ieee80211_hw *hw,
|
||||
#endif /* CONFIG_AR9170_LEDS */
|
||||
}
|
||||
|
||||
if (changed & BSS_CHANGED_BEACON_INT)
|
||||
err = ar9170_set_beacon_timers(ar);
|
||||
|
||||
if (changed & BSS_CHANGED_HT) {
|
||||
/* TODO */
|
||||
err = 0;
|
||||
|
@@ -2756,7 +2756,6 @@ ath5k_config(struct ieee80211_hw *hw, u32 changed)
|
||||
|
||||
mutex_lock(&sc->lock);
|
||||
|
||||
sc->bintval = conf->beacon_int;
|
||||
sc->power_level = conf->power_level;
|
||||
|
||||
ret = ath5k_chan_set(sc, conf->channel);
|
||||
@@ -3083,6 +3082,10 @@ static void ath5k_bss_info_changed(struct ieee80211_hw *hw,
|
||||
u32 changes)
|
||||
{
|
||||
struct ath5k_softc *sc = hw->priv;
|
||||
|
||||
if (changes & BSS_CHANGED_BEACON_INT)
|
||||
sc->bintval = bss_conf->beacon_int;
|
||||
|
||||
if (changes & BSS_CHANGED_ASSOC) {
|
||||
mutex_lock(&sc->lock);
|
||||
sc->assoc = bss_conf->assoc;
|
||||
|
@@ -590,6 +590,8 @@ struct ath_softc {
|
||||
int led_on_cnt;
|
||||
int led_off_cnt;
|
||||
|
||||
int beacon_interval;
|
||||
|
||||
struct ath_rfkill rf_kill;
|
||||
struct ath_ani ani;
|
||||
struct ath9k_node_stats nodestats;
|
||||
|
@@ -320,8 +320,7 @@ int ath_beacon_alloc(struct ath_wiphy *aphy, struct ieee80211_vif *vif)
|
||||
u64 tsfadjust;
|
||||
int intval;
|
||||
|
||||
intval = sc->hw->conf.beacon_int ?
|
||||
sc->hw->conf.beacon_int : ATH_DEFAULT_BINTVAL;
|
||||
intval = sc->beacon_interval ? : ATH_DEFAULT_BINTVAL;
|
||||
|
||||
/*
|
||||
* Calculate the TSF offset for this beacon slot, i.e., the
|
||||
@@ -431,8 +430,7 @@ void ath_beacon_tasklet(unsigned long data)
|
||||
* on the tsf to safeguard against missing an swba.
|
||||
*/
|
||||
|
||||
intval = sc->hw->conf.beacon_int ?
|
||||
sc->hw->conf.beacon_int : ATH_DEFAULT_BINTVAL;
|
||||
intval = sc->beacon_interval ? : ATH_DEFAULT_BINTVAL;
|
||||
|
||||
tsf = ath9k_hw_gettsf64(ah);
|
||||
tsftu = TSF_TO_TU(tsf>>32, tsf);
|
||||
@@ -711,8 +709,7 @@ void ath_beacon_config(struct ath_softc *sc, struct ieee80211_vif *vif)
|
||||
/* Setup the beacon configuration parameters */
|
||||
|
||||
memset(&conf, 0, sizeof(struct ath_beacon_config));
|
||||
conf.beacon_interval = sc->hw->conf.beacon_int ?
|
||||
sc->hw->conf.beacon_int : ATH_DEFAULT_BINTVAL;
|
||||
conf.beacon_interval = sc->beacon_interval ? : ATH_DEFAULT_BINTVAL;
|
||||
conf.listen_interval = 1;
|
||||
conf.dtim_period = conf.beacon_interval;
|
||||
conf.dtim_count = 1;
|
||||
|
@@ -2358,16 +2358,6 @@ skip_chan_change:
|
||||
if (changed & IEEE80211_CONF_CHANGE_POWER)
|
||||
sc->config.txpowlimit = 2 * conf->power_level;
|
||||
|
||||
/*
|
||||
* The HW TSF has to be reset when the beacon interval changes.
|
||||
* We set the flag here, and ath_beacon_config_ap() would take this
|
||||
* into account when it gets called through the subsequent
|
||||
* config_interface() call - with IFCC_BEACON in the changed field.
|
||||
*/
|
||||
|
||||
if (changed & IEEE80211_CONF_CHANGE_BEACON_INTERVAL)
|
||||
sc->sc_flags |= SC_OP_TSF_RESET;
|
||||
|
||||
mutex_unlock(&sc->mutex);
|
||||
|
||||
return 0;
|
||||
@@ -2635,6 +2625,18 @@ static void ath9k_bss_info_changed(struct ieee80211_hw *hw,
|
||||
ath9k_bss_assoc_info(sc, vif, bss_conf);
|
||||
}
|
||||
|
||||
/*
|
||||
* The HW TSF has to be reset when the beacon interval changes.
|
||||
* We set the flag here, and ath_beacon_config_ap() would take this
|
||||
* into account when it gets called through the subsequent
|
||||
* config_interface() call - with IFCC_BEACON in the changed field.
|
||||
*/
|
||||
|
||||
if (changed & BSS_CHANGED_BEACON_INT) {
|
||||
sc->sc_flags |= SC_OP_TSF_RESET;
|
||||
sc->beacon_interval = bss_conf->beacon_int;
|
||||
}
|
||||
|
||||
mutex_unlock(&sc->mutex);
|
||||
}
|
||||
|
||||
|
@@ -971,7 +971,7 @@ int ath_cabq_update(struct ath_softc *sc)
|
||||
else if (sc->config.cabqReadytime > ATH9K_READY_TIME_HI_BOUND)
|
||||
sc->config.cabqReadytime = ATH9K_READY_TIME_HI_BOUND;
|
||||
|
||||
qi.tqi_readyTime = (sc->hw->conf.beacon_int *
|
||||
qi.tqi_readyTime = (sc->beacon_interval *
|
||||
sc->config.cabqReadytime) / 100;
|
||||
ath_txq_update(sc, qnum, &qi);
|
||||
|
||||
|
Reference in New Issue
Block a user