iwlwifi: mvm: Change number of associated stations when station becomes associated
authorAyala Beker <ayala.beker@intel.com>
Tue, 15 Dec 2015 22:32:07 +0000 (00:32 +0200)
committerEmmanuel Grumbach <emmanuel.grumbach@intel.com>
Sun, 20 Dec 2015 21:27:43 +0000 (23:27 +0200)
Currently, the number of associated stations gets updated when adding
a new station or removing it. This is incorrect as it's possible that
a station was inserted before it was associated
Fix this by increasing/decreasing ap_assoc_sta_count whenever
a station transitions in/out the associated state.

Signed-off-by: Ayala Beker <ayala.beker@intel.com>
Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c
drivers/net/wireless/intel/iwlwifi/mvm/sta.c

index 53415dc23ff4fb3fcf47aa0282e485dcd8009326..296b9c5cd1bee3c251dfdbc200e38a64b7e14d87 100644 (file)
@@ -2248,7 +2248,6 @@ static void iwl_mvm_sta_pre_rcu_remove(struct ieee80211_hw *hw,
                                       struct ieee80211_sta *sta)
 {
        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);
 
        /*
@@ -2264,11 +2263,6 @@ static void iwl_mvm_sta_pre_rcu_remove(struct ieee80211_hw *hw,
                rcu_assign_pointer(mvm->fw_id_to_mac_id[mvm_sta->sta_id],
                                   ERR_PTR(-ENOENT));
 
-       if (mvm_sta->vif->type == NL80211_IFTYPE_AP) {
-               mvmvif->ap_assoc_sta_count--;
-               iwl_mvm_mac_ctxt_changed(mvm, vif, false, NULL);
-       }
-
        mutex_unlock(&mvm->mutex);
 }
 
@@ -2380,6 +2374,10 @@ static int iwl_mvm_mac_sta_state(struct ieee80211_hw *hw,
                ret = 0;
        } else if (old_state == IEEE80211_STA_AUTH &&
                   new_state == IEEE80211_STA_ASSOC) {
+               if (vif->type == NL80211_IFTYPE_AP) {
+                       mvmvif->ap_assoc_sta_count++;
+                       iwl_mvm_mac_ctxt_changed(mvm, vif, false, NULL);
+               }
                ret = iwl_mvm_update_sta(mvm, vif, sta);
                if (ret == 0)
                        iwl_mvm_rs_rate_init(mvm, sta,
@@ -2406,6 +2404,10 @@ static int iwl_mvm_mac_sta_state(struct ieee80211_hw *hw,
                ret = 0;
        } else if (old_state == IEEE80211_STA_ASSOC &&
                   new_state == IEEE80211_STA_AUTH) {
+               if (vif->type == NL80211_IFTYPE_AP) {
+                       mvmvif->ap_assoc_sta_count--;
+                       iwl_mvm_mac_ctxt_changed(mvm, vif, false, NULL);
+               }
                ret = 0;
        } else if (old_state == IEEE80211_STA_AUTH &&
                   new_state == IEEE80211_STA_NONE) {
index 2c9675b45350800fb4fda68807309a61f8f51299..b556e33658d734974d8534b271cf5e57ea755be3 100644 (file)
@@ -278,11 +278,6 @@ int iwl_mvm_add_sta(struct iwl_mvm *mvm,
        if (sta_id == IWL_MVM_STATION_COUNT)
                return -ENOSPC;
 
-       if (vif->type == NL80211_IFTYPE_AP) {
-               mvmvif->ap_assoc_sta_count++;
-               iwl_mvm_mac_ctxt_changed(mvm, vif, false, NULL);
-       }
-
        spin_lock_init(&mvm_sta->lock);
 
        mvm_sta->sta_id = sta_id;