mac80211: clean up beacon interval settings
authorJohannes Berg <johannes@sipsolutions.net>
Thu, 23 Apr 2009 14:10:04 +0000 (16:10 +0200)
committerJohn W. Linville <linville@tuxdriver.com>
Wed, 6 May 2009 19:14:33 +0000 (15:14 -0400)
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>
21 files changed:
drivers/net/wireless/ath/ar9170/mac.c
drivers/net/wireless/ath/ar9170/main.c
drivers/net/wireless/ath/ath5k/base.c
drivers/net/wireless/ath/ath9k/ath9k.h
drivers/net/wireless/ath/ath9k/beacon.c
drivers/net/wireless/ath/ath9k/main.c
drivers/net/wireless/ath/ath9k/xmit.c
drivers/net/wireless/b43/main.c
drivers/net/wireless/b43legacy/main.c
drivers/net/wireless/iwlwifi/iwl-agn.c
drivers/net/wireless/iwlwifi/iwl-core.c
drivers/net/wireless/iwlwifi/iwl3945-base.c
drivers/net/wireless/libertas_tf/main.c
drivers/net/wireless/mac80211_hwsim.c
include/net/mac80211.h
net/mac80211/cfg.c
net/mac80211/ibss.c
net/mac80211/main.c
net/mac80211/mlme.c
net/mac80211/sta_info.c
net/mac80211/tx.c

index c8fa3073169f4a6d07bce86f6f470c9ff16757cd..0e5967dd119c2e589c50e8bdbb28e94409b00222 100644 (file)
@@ -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;
index 1b60906b80c9fe2cc4c75622f6d68494623d1efc..49c729bc7147a40bbbced880eac6149a2583de9d 100644 (file)
@@ -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;
index c8c658bfcf9dbcdebc7c8873b258347bd22b37e1..e4b1d9efa42ee8662424627bd47cb8c9e7418307 100644 (file)
@@ -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;
index c92d46fa9d5133713bc130b0dc9d16f3b1d01f5e..d5084ddf44ffb164e004bd605cdbc7d5b6c777c3 100644 (file)
@@ -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;
index eb4759fc6a0dd84400f71f96dde83c5d2160c6ac..c17b8382e328455e61efde5302b5bc8bf76a8937 100644 (file)
@@ -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;
index 2398d4f45f28c87127daf31f060462ebb67c0173..28cc9cd52f32af7c5e904dbaf51c68c3915a8163 100644 (file)
@@ -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);
 }
 
index faf2cab49ea33de5018cd24f719286bef5dabc87..501493ffc3a70a78bc6132d8cb1a01db482d61a7 100644 (file)
@@ -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);
 
index a97c6ff0f12ef0b4cd40b8ecadfb0f91093a1890..3c693e6ec904c08e7f97b0fa8d170fd57af9c230 100644 (file)
@@ -3468,11 +3468,6 @@ static int b43_op_config(struct ieee80211_hw *hw, u32 changed)
        if (phy->ops->set_rx_antenna)
                phy->ops->set_rx_antenna(dev, antenna);
 
-       /* Update templates for AP/mesh mode. */
-       if (b43_is_mode(wl, NL80211_IFTYPE_AP) ||
-           b43_is_mode(wl, NL80211_IFTYPE_MESH_POINT))
-               b43_set_beacon_int(dev, conf->beacon_int);
-
        if (!!conf->radio_enabled != phy->radio_on) {
                if (conf->radio_enabled) {
                        b43_software_rfkill(dev, RFKILL_STATE_UNBLOCKED);
@@ -3556,6 +3551,13 @@ static void b43_op_bss_info_changed(struct ieee80211_hw *hw,
                goto out_unlock_mutex;
        b43_mac_suspend(dev);
 
+       /* Update templates for AP/mesh mode. */
+       if (changed & BSS_CHANGED_BEACON_INT &&
+           (b43_is_mode(wl, NL80211_IFTYPE_AP) ||
+            b43_is_mode(wl, NL80211_IFTYPE_MESH_POINT) ||
+            b43_is_mode(wl, NL80211_IFTYPE_ADHOC)))
+               b43_set_beacon_int(dev, conf->beacon_int);
+
        if (changed & BSS_CHANGED_BASIC_RATES)
                b43_update_basic_rates(dev, conf->basic_rates);
 
index ee202b4f77b5a879871464d15817f3e853647d09..276f314688f72c9eaa8f87004c486fe0e815819d 100644 (file)
@@ -2721,11 +2721,6 @@ static int b43legacy_op_dev_config(struct ieee80211_hw *hw,
        /* Antennas for RX and management frame TX. */
        b43legacy_mgmtframe_txantenna(dev, antenna_tx);
 
-       /* Update templates for AP mode. */
-       if (b43legacy_is_mode(wl, NL80211_IFTYPE_AP))
-               b43legacy_set_beacon_int(dev, conf->beacon_int);
-
-
        if (!!conf->radio_enabled != phy->radio_on) {
                if (conf->radio_enabled) {
                        b43legacy_radio_turn_on(dev);
@@ -2827,6 +2822,11 @@ static void b43legacy_op_bss_info_changed(struct ieee80211_hw *hw,
 
        b43legacy_mac_suspend(dev);
 
+       if (changed & BSS_CHANGED_BEACON_INT &&
+           (b43legacy_is_mode(wl, NL80211_IFTYPE_AP) ||
+            b43legacy_is_mode(wl, NL80211_IFTYPE_ADHOC)))
+               b43legacy_set_beacon_int(dev, conf->beacon_int);
+
        if (changed & BSS_CHANGED_BASIC_RATES)
                b43legacy_update_basic_rates(dev, conf->basic_rates);
 
index 277dfc57fde9e9a773085c2257d1d10efde568b3..4920dcf7d7b017a28affe23c36f4b6321f8e1c0d 100644 (file)
@@ -567,7 +567,8 @@ static void iwl_setup_rxon_timing(struct iwl_priv *priv)
                beacon_int = iwl_adjust_beacon_interval(priv->beacon_int);
                priv->rxon_timing.atim_window = 0;
        } else {
-               beacon_int = iwl_adjust_beacon_interval(conf->beacon_int);
+               beacon_int = iwl_adjust_beacon_interval(
+                       priv->vif->bss_conf.beacon_int);
 
                /* TODO: we need to get atim_window from upper stack
                 * for now we set to 0 */
index 3dec2d25fa3d9f351ee134c1338241934bf87e25..cd8a5ed97c4fc2894f4e38aff9223d204b1de04d 100644 (file)
@@ -1313,7 +1313,6 @@ int iwl_setup_mac(struct iwl_priv *priv)
        /* Default value; 4 EDCA QOS priorities */
        hw->queues = 4;
 
-       hw->conf.beacon_int = 100;
        hw->max_listen_interval = IWL_CONN_MAX_LISTEN_INTERVAL;
 
        if (priv->bands[IEEE80211_BAND_2GHZ].n_channels)
@@ -2751,7 +2750,7 @@ void iwl_mac_reset_tsf(struct ieee80211_hw *hw)
 
        priv->ibss_beacon = NULL;
 
-       priv->beacon_int = priv->hw->conf.beacon_int;
+       priv->beacon_int = priv->vif->bss_conf.beacon_int;
        priv->timestamp = 0;
        if ((priv->iw_mode == NL80211_IFTYPE_STATION))
                priv->beacon_int = 0;
index a782292ed43531d0a63c872d8e71252f1545f635..f9d9b65ef30063b42b5b83aab2dfc5c5c4671e90 100644 (file)
@@ -551,7 +551,8 @@ static void iwl3945_setup_rxon_timing(struct iwl_priv *priv)
                priv->rxon_timing.atim_window = 0;
        } else {
                priv->rxon_timing.beacon_interval =
-                       iwl3945_adjust_beacon_interval(conf->beacon_int);
+                       iwl3945_adjust_beacon_interval(
+                               priv->vif->bss_conf.beacon_int);
                /* TODO: we need to get atim_window from upper stack
                 * for now we set to 0 */
                priv->rxon_timing.atim_window = 0;
@@ -4211,8 +4212,6 @@ static int iwl3945_setup_mac(struct iwl_priv *priv)
        /* Default value; 4 EDCA QOS priorities */
        hw->queues = 4;
 
-       hw->conf.beacon_int = 100;
-
        if (priv->bands[IEEE80211_BAND_2GHZ].n_channels)
                priv->hw->wiphy->bands[IEEE80211_BAND_2GHZ] =
                        &priv->bands[IEEE80211_BAND_2GHZ];
index e7289e2e7f16fb87e3a96113f4efe1e43433dbe6..68e47fb47a1ec52ea0b6c48c6f81cf077867f40b 100644 (file)
@@ -380,7 +380,7 @@ static int lbtf_op_config_interface(struct ieee80211_hw *hw,
                if (beacon) {
                        lbtf_beacon_set(priv, beacon);
                        kfree_skb(beacon);
-                       lbtf_beacon_ctrl(priv, 1, hw->conf.beacon_int);
+                       lbtf_beacon_ctrl(priv, 1, vif->bss_conf.beacon_int);
                }
                break;
        default:
index d4fdc8b7d7d8c7ff3c0321c9e4d60ba3d35f7147..24c95a619e4c50b039347dfd4bc9cc42cc387d54 100644 (file)
@@ -553,18 +553,13 @@ static int mac80211_hwsim_config(struct ieee80211_hw *hw, u32 changed)
        struct mac80211_hwsim_data *data = hw->priv;
        struct ieee80211_conf *conf = &hw->conf;
 
-       printk(KERN_DEBUG "%s:%s (freq=%d radio_enabled=%d beacon_int=%d)\n",
+       printk(KERN_DEBUG "%s:%s (freq=%d radio_enabled=%d)\n",
               wiphy_name(hw->wiphy), __func__,
-              conf->channel->center_freq, conf->radio_enabled,
-              conf->beacon_int);
+              conf->channel->center_freq, conf->radio_enabled);
 
        data->channel = conf->channel;
        data->radio_enabled = conf->radio_enabled;
-       data->beacon_int = 1024 * conf->beacon_int / 1000 * HZ / 1000;
-       if (data->beacon_int < 1)
-               data->beacon_int = 1;
-
-       if (!data->started || !data->radio_enabled)
+       if (!data->started || !data->radio_enabled || !data->beacon_int)
                del_timer(&data->beacon_timer);
        else
                mod_timer(&data->beacon_timer, jiffies + data->beacon_int);
@@ -615,6 +610,7 @@ static void mac80211_hwsim_bss_info_changed(struct ieee80211_hw *hw,
                                            u32 changed)
 {
        struct hwsim_vif_priv *vp = (void *)vif->drv_priv;
+       struct mac80211_hwsim_data *data = hw->priv;
 
        hwsim_check_magic(vif);
 
@@ -628,6 +624,14 @@ static void mac80211_hwsim_bss_info_changed(struct ieee80211_hw *hw,
                vp->aid = info->aid;
        }
 
+       if (changed & BSS_CHANGED_BEACON_INT) {
+               printk(KERN_DEBUG "  %s: BCNINT: %d\n",
+                      wiphy_name(hw->wiphy), info->beacon_int);
+               data->beacon_int = 1024 * info->beacon_int / 1000 * HZ / 1000;
+               if (WARN_ON(data->beacon_int))
+                       data->beacon_int = 1;
+       }
+
        if (changed & BSS_CHANGED_ERP_CTS_PROT) {
                printk(KERN_DEBUG "  %s: ERP_CTS_PROT: %d\n",
                       wiphy_name(hw->wiphy), info->use_cts_prot);
index 81d706d8522692d597f80f25e9c4a684410bdf2f..22c65e8cbb712f1eac2018e13080a005ff65fe66 100644 (file)
@@ -149,6 +149,7 @@ struct ieee80211_low_level_stats {
  * @BSS_CHANGED_ERP_SLOT: slot timing changed
  * @BSS_CHANGED_HT: 802.11n parameters changed
  * @BSS_CHANGED_BASIC_RATES: Basic rateset changed
+ * @BSS_CHANGED_BEACON_INT: Beacon interval changed
  */
 enum ieee80211_bss_change {
        BSS_CHANGED_ASSOC               = 1<<0,
@@ -157,6 +158,7 @@ enum ieee80211_bss_change {
        BSS_CHANGED_ERP_SLOT            = 1<<3,
        BSS_CHANGED_HT                  = 1<<4,
        BSS_CHANGED_BASIC_RATES         = 1<<5,
+       BSS_CHANGED_BEACON_INT          = 1<<6,
 };
 
 /**
@@ -529,7 +531,7 @@ enum ieee80211_conf_flags {
  * enum ieee80211_conf_changed - denotes which configuration changed
  *
  * @IEEE80211_CONF_CHANGE_RADIO_ENABLED: the value of radio_enabled changed
- * @IEEE80211_CONF_CHANGE_BEACON_INTERVAL: the beacon interval changed
+ * @_IEEE80211_CONF_CHANGE_BEACON_INTERVAL: DEPRECATED
  * @IEEE80211_CONF_CHANGE_LISTEN_INTERVAL: the listen interval changed
  * @IEEE80211_CONF_CHANGE_RADIOTAP: the radiotap flag changed
  * @IEEE80211_CONF_CHANGE_PS: the PS flag or dynamic PS timeout changed
@@ -539,7 +541,7 @@ enum ieee80211_conf_flags {
  */
 enum ieee80211_conf_changed {
        IEEE80211_CONF_CHANGE_RADIO_ENABLED     = BIT(0),
-       IEEE80211_CONF_CHANGE_BEACON_INTERVAL   = BIT(1),
+       _IEEE80211_CONF_CHANGE_BEACON_INTERVAL  = BIT(1),
        IEEE80211_CONF_CHANGE_LISTEN_INTERVAL   = BIT(2),
        IEEE80211_CONF_CHANGE_RADIOTAP          = BIT(3),
        IEEE80211_CONF_CHANGE_PS                = BIT(4),
@@ -548,6 +550,14 @@ enum ieee80211_conf_changed {
        IEEE80211_CONF_CHANGE_RETRY_LIMITS      = BIT(7),
 };
 
+static inline __deprecated enum ieee80211_conf_changed
+__IEEE80211_CONF_CHANGE_BEACON_INTERVAL(void)
+{
+       return _IEEE80211_CONF_CHANGE_BEACON_INTERVAL;
+}
+#define IEEE80211_CONF_CHANGE_BEACON_INTERVAL \
+       __IEEE80211_CONF_CHANGE_BEACON_INTERVAL()
+
 /**
  * struct ieee80211_conf - configuration of the device
  *
index 5e1c230744b57763f8f1227775c92ffa91859123..a898ccd3f2c9178c6758f2877733d456bab67c70 100644 (file)
@@ -451,18 +451,11 @@ static int ieee80211_config_beacon(struct ieee80211_sub_if_data *sdata,
         * This is a kludge. beacon interval should really be part
         * of the beacon information.
         */
-       if (params->interval && (sdata->local->hw.conf.beacon_int !=
-                                params->interval)) {
-               sdata->local->hw.conf.beacon_int = params->interval;
-               err = ieee80211_hw_config(sdata->local,
-                                       IEEE80211_CONF_CHANGE_BEACON_INTERVAL);
-               if (err < 0)
-                       return err;
-               /*
-                * We updated some parameter so if below bails out
-                * it's not an error.
-                */
-               err = 0;
+       if (params->interval &&
+           (sdata->vif.bss_conf.beacon_int != params->interval)) {
+               sdata->vif.bss_conf.beacon_int = params->interval;
+               ieee80211_bss_info_change_notify(sdata,
+                                                BSS_CHANGED_BEACON_INT);
        }
 
        /* Need to have a beacon head if we don't have one yet */
index 25ff583612ef5d34a2b6e6c5c12ae3841b61f530..f4879dad3cd70408b22458a4cc136eb0f35e8072 100644 (file)
@@ -73,6 +73,7 @@ static void __ieee80211_sta_join_ibss(struct ieee80211_sub_if_data *sdata,
        struct ieee80211_mgmt *mgmt;
        u8 *pos;
        struct ieee80211_supported_band *sband;
+       u32 bss_change;
 
        if (local->ops->reset_tsf) {
                /* Reset own TSF to allow time synchronization work. */
@@ -92,8 +93,6 @@ static void __ieee80211_sta_join_ibss(struct ieee80211_sub_if_data *sdata,
 
        memcpy(ifibss->bssid, bssid, ETH_ALEN);
 
-       local->hw.conf.beacon_int = beacon_int >= 10 ? beacon_int : 10;
-
        sdata->drop_unencrypted = capability & WLAN_CAPABILITY_PRIVACY ? 1 : 0;
 
        ieee80211_if_config(sdata, IEEE80211_IFCC_BSSID);
@@ -101,6 +100,12 @@ static void __ieee80211_sta_join_ibss(struct ieee80211_sub_if_data *sdata,
        local->oper_channel = chan;
        local->oper_channel_type = NL80211_CHAN_NO_HT;
        ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_CHANNEL);
+
+       sdata->vif.bss_conf.beacon_int = beacon_int;
+       bss_change = BSS_CHANGED_BEACON_INT;
+       bss_change |= ieee80211_reset_erp_info(sdata);
+       ieee80211_bss_info_change_notify(sdata, bss_change);
+
        sband = local->hw.wiphy->bands[chan->band];
 
        /* Build IBSS probe response */
@@ -111,7 +116,7 @@ static void __ieee80211_sta_join_ibss(struct ieee80211_sub_if_data *sdata,
        memset(mgmt->da, 0xff, ETH_ALEN);
        memcpy(mgmt->sa, sdata->dev->dev_addr, ETH_ALEN);
        memcpy(mgmt->bssid, ifibss->bssid, ETH_ALEN);
-       mgmt->u.beacon.beacon_int = cpu_to_le16(local->hw.conf.beacon_int);
+       mgmt->u.beacon.beacon_int = cpu_to_le16(beacon_int);
        mgmt->u.beacon.timestamp = cpu_to_le64(tsf);
        mgmt->u.beacon.capab_info = cpu_to_le16(capability);
 
@@ -181,8 +186,13 @@ static void __ieee80211_sta_join_ibss(struct ieee80211_sub_if_data *sdata,
 static void ieee80211_sta_join_ibss(struct ieee80211_sub_if_data *sdata,
                                    struct ieee80211_bss *bss)
 {
+       u16 beacon_int = bss->cbss.beacon_interval;
+
+       if (beacon_int < 10)
+               beacon_int = 10;
+
        __ieee80211_sta_join_ibss(sdata, bss->cbss.bssid,
-                                 bss->cbss.beacon_interval,
+                                 beacon_int,
                                  bss->cbss.channel,
                                  bss->supp_rates_len, bss->supp_rates,
                                  bss->cbss.capability,
@@ -464,9 +474,6 @@ static void ieee80211_sta_create_ibss(struct ieee80211_sub_if_data *sdata)
 
        sband = local->hw.wiphy->bands[ifibss->channel->band];
 
-       if (local->hw.conf.beacon_int == 0)
-               local->hw.conf.beacon_int = 100;
-
        capability = WLAN_CAPABILITY_IBSS;
 
        if (sdata->default_key)
@@ -480,7 +487,7 @@ static void ieee80211_sta_create_ibss(struct ieee80211_sub_if_data *sdata)
                *pos++ = (u8) (rate / 5);
        }
 
-       __ieee80211_sta_join_ibss(sdata, bssid, local->hw.conf.beacon_int,
+       __ieee80211_sta_join_ibss(sdata, bssid, sdata->vif.bss_conf.beacon_int,
                                  ifibss->channel, sband->n_bitrates,
                                  supp_rates, capability, 0);
 }
@@ -823,6 +830,8 @@ int ieee80211_ibss_join(struct ieee80211_sub_if_data *sdata,
        } else
                sdata->u.ibss.fixed_bssid = false;
 
+       sdata->vif.bss_conf.beacon_int = params->beacon_interval;
+
        sdata->u.ibss.channel = params->channel;
        sdata->u.ibss.fixed_channel = params->channel_fixed;
 
index e00d124e4ef7464547032256814c26579428a64e..b254879d86319c9b73ef9221c1996b298c4c620c 100644 (file)
@@ -294,9 +294,6 @@ void ieee80211_bss_info_change_notify(struct ieee80211_sub_if_data *sdata,
 {
        struct ieee80211_local *local = sdata->local;
 
-       if (WARN_ON(sdata->vif.type == NL80211_IFTYPE_AP_VLAN))
-               return;
-
        if (!changed)
                return;
 
@@ -305,6 +302,17 @@ void ieee80211_bss_info_change_notify(struct ieee80211_sub_if_data *sdata,
                                             &sdata->vif,
                                             &sdata->vif.bss_conf,
                                             changed);
+
+       /*
+        * DEPRECATED
+        *
+        * ~changed is just there to not do this at resume time
+        */
+       if (changed & BSS_CHANGED_BEACON_INT && ~changed) {
+               local->hw.conf.beacon_int = sdata->vif.bss_conf.beacon_int;
+               ieee80211_hw_config(local,
+                                   _IEEE80211_CONF_CHANGE_BEACON_INTERVAL);
+       }
 }
 
 u32 ieee80211_reset_erp_info(struct ieee80211_sub_if_data *sdata)
@@ -971,9 +979,6 @@ int ieee80211_register_hw(struct ieee80211_hw *hw)
 
        debugfs_hw_add(local);
 
-       if (local->hw.conf.beacon_int < 10)
-               local->hw.conf.beacon_int = 100;
-
        if (local->hw.max_listen_interval == 0)
                local->hw.max_listen_interval = 1;
 
index a2f5e6223059d33676ee04c56541d8106aba4331..bfd571e6f2218e448709dd80ef315b9e77fc89d8 100644 (file)
@@ -842,6 +842,7 @@ static void ieee80211_set_associated(struct ieee80211_sub_if_data *sdata,
                sdata->vif.bss_conf.timestamp = bss->cbss.tsf;
                sdata->vif.bss_conf.dtim_period = bss->dtim_period;
 
+               bss_info_changed |= BSS_CHANGED_BEACON_INT;
                bss_info_changed |= ieee80211_handle_bss_capability(sdata,
                        bss->cbss.capability, bss->has_erp_value, bss->erp_value);
 
index 654a8e963ccb40d0f661f9583a0949cffed4c2b0..7116220d06be183d510af33f23a8c7a78983495c 100644 (file)
@@ -543,9 +543,8 @@ void sta_info_unlink(struct sta_info **sta)
        spin_unlock_irqrestore(&local->sta_lock, flags);
 }
 
-static inline int sta_info_buffer_expired(struct ieee80211_local *local,
-                                         struct sta_info *sta,
-                                         struct sk_buff *skb)
+static int sta_info_buffer_expired(struct sta_info *sta,
+                                  struct sk_buff *skb)
 {
        struct ieee80211_tx_info *info;
        int timeout;
@@ -556,8 +555,9 @@ static inline int sta_info_buffer_expired(struct ieee80211_local *local,
        info = IEEE80211_SKB_CB(skb);
 
        /* Timeout: (2 * listen_interval * beacon_int * 1024 / 1000000) sec */
-       timeout = (sta->listen_interval * local->hw.conf.beacon_int * 32 /
-                  15625) * HZ;
+       timeout = (sta->listen_interval *
+                  sta->sdata->vif.bss_conf.beacon_int *
+                  32 / 15625) * HZ;
        if (timeout < STA_TX_BUFFER_EXPIRE)
                timeout = STA_TX_BUFFER_EXPIRE;
        return time_after(jiffies, info->control.jiffies + timeout);
@@ -577,7 +577,7 @@ static void sta_info_cleanup_expire_buffered(struct ieee80211_local *local,
        for (;;) {
                spin_lock_irqsave(&sta->ps_tx_buf.lock, flags);
                skb = skb_peek(&sta->ps_tx_buf);
-               if (sta_info_buffer_expired(local, sta, skb))
+               if (sta_info_buffer_expired(sta, skb))
                        skb = __skb_dequeue(&sta->ps_tx_buf);
                else
                        skb = NULL;
index 1865622003c93aec55210be2cd0b1738eeca0802..29df65045fc927b8a45de39d559ea72f8b987c74 100644 (file)
@@ -2132,7 +2132,7 @@ struct sk_buff *ieee80211_beacon_get(struct ieee80211_hw *hw,
                memcpy(mgmt->sa, sdata->dev->dev_addr, ETH_ALEN);
                /* BSSID is left zeroed, wildcard value */
                mgmt->u.beacon.beacon_int =
-                       cpu_to_le16(local->hw.conf.beacon_int);
+                       cpu_to_le16(sdata->vif.bss_conf.beacon_int);
                mgmt->u.beacon.capab_info = 0x0; /* 0x0 for MPs */
 
                pos = skb_put(skb, 2);