iwlwifi: mvm: set AID to firmware only for associated stations
authorJohannes Berg <johannes.berg@intel.com>
Thu, 1 Dec 2016 15:25:30 +0000 (16:25 +0100)
committerLuca Coelho <luciano.coelho@intel.com>
Fri, 3 Feb 2017 14:26:43 +0000 (16:26 +0200)
The firmware will soon actually look at the AID field, and
when it does that it'll try to ensure that the AID is never
changing. Due to the way the station is added, it may start
with an invalid AID before it's associated, so to ensure a
constant AID (once it becomes non-zero), track the station
state and set the AID only when the station is associated
and when it disassociates.

Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
drivers/net/wireless/intel/iwlwifi/mvm/sta.c
drivers/net/wireless/intel/iwlwifi/mvm/sta.h

index 8d519c3f45bd207a8e99fdbb929496e99ffd0bcd..72102566a02b37a363f715b72191d9031de92882 100644 (file)
@@ -2552,6 +2552,7 @@ static int iwl_mvm_mac_sta_state(struct ieee80211_hw *hw,
 {
        struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
        struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
+       struct iwl_mvm_sta *mvm_sta = iwl_mvm_sta_from_mac80211(sta);
        int ret;
 
        IWL_DEBUG_MAC80211(mvm, "station %pM state change %d->%d\n",
@@ -2580,8 +2581,6 @@ static int iwl_mvm_mac_sta_state(struct ieee80211_hw *hw,
        if (old_state == IEEE80211_STA_NONE &&
            new_state == IEEE80211_STA_NOTEXIST &&
            iwl_mvm_is_dqa_supported(mvm)) {
-               struct iwl_mvm_sta *mvm_sta = iwl_mvm_sta_from_mac80211(sta);
-
                iwl_mvm_purge_deferred_tx_frames(mvm, mvm_sta);
                flush_work(&mvm->add_stream_wk);
 
@@ -2592,6 +2591,9 @@ static int iwl_mvm_mac_sta_state(struct ieee80211_hw *hw,
        }
 
        mutex_lock(&mvm->mutex);
+       /* track whether or not the station is associated */
+       mvm_sta->associated = new_state >= IEEE80211_STA_ASSOC;
+
        if (old_state == IEEE80211_STA_NOTEXIST &&
            new_state == IEEE80211_STA_NONE) {
                /*
index 962920861ccf6cbaa8e477a8eb52d56489fd723e..4afd52f8d9c38f88e8564cdd2a8157cfef23b91c 100644 (file)
@@ -202,7 +202,8 @@ int iwl_mvm_sta_send_to_fw(struct iwl_mvm *mvm, struct ieee80211_sta *sta,
                cpu_to_le32(agg_size << STA_FLG_MAX_AGG_SIZE_SHIFT);
        add_sta_cmd.station_flags |=
                cpu_to_le32(mpdu_dens << STA_FLG_AGG_MPDU_DENS_SHIFT);
-       add_sta_cmd.assoc_id = cpu_to_le16(sta->aid);
+       if (mvm_sta->associated)
+               add_sta_cmd.assoc_id = cpu_to_le16(sta->aid);
 
        if (sta->wme) {
                add_sta_cmd.modify_mask |= STA_MODIFY_UAPSD_ACS;
index b45c7b9937c82dca15df67d0cb6e4c0f77301c1a..4be34f902278c8bb36521346dfcd7980976e8786 100644 (file)
@@ -437,6 +437,7 @@ struct iwl_mvm_sta {
        bool disable_tx;
        bool tlc_amsdu;
        bool sleeping;
+       bool associated;
        u8 agg_tids;
        u8 sleep_tx_count;
        u8 avg_energy;