iwlwifi: mvm: provide helper to fetch the iwl_mvm_sta from sta_id
authorEmmanuel Grumbach <emmanuel.grumbach@intel.com>
Tue, 14 Jan 2014 06:30:32 +0000 (08:30 +0200)
committerEmmanuel Grumbach <emmanuel.grumbach@intel.com>
Mon, 3 Feb 2014 20:23:33 +0000 (22:23 +0200)
We somtimes need to fetch the iwl_mvm_sta structure from a
station index - provide a helper to do that.

Reviewed-by: Johannes Berg <johannes.berg@intel.com>
Signed-off-by: Emmanuel Grumbach <emmanuel.grumbach@intel.com>
drivers/net/wireless/iwlwifi/mvm/bt-coex.c
drivers/net/wireless/iwlwifi/mvm/debugfs.c
drivers/net/wireless/iwlwifi/mvm/mvm.h

index 76cde6ce6551dc0a9996a91edc36cad5b40e5588..b1a572e52f462411f4c4c8efc76fef147dc4dc6d 100644 (file)
@@ -500,23 +500,13 @@ static int iwl_mvm_bt_coex_reduced_txp(struct iwl_mvm *mvm, u8 sta_id,
                .dataflags = { IWL_HCMD_DFL_DUP, },
                .flags = CMD_ASYNC,
        };
-
-       struct ieee80211_sta *sta;
        struct iwl_mvm_sta *mvmsta;
        int ret;
 
-       if (sta_id == IWL_MVM_STATION_COUNT)
-               return 0;
-
-       sta = rcu_dereference_protected(mvm->fw_id_to_mac_id[sta_id],
-                                       lockdep_is_held(&mvm->mutex));
-
-       /* This can happen if the station has been removed right now */
-       if (IS_ERR_OR_NULL(sta))
+       mvmsta = iwl_mvm_sta_from_staid_protected(mvm, sta_id);
+       if (!mvmsta)
                return 0;
 
-       mvmsta = iwl_mvm_sta_from_mac80211(sta);
-
        /* nothing to do */
        if (mvmsta->bt_reduced_txpower == enable)
                return 0;
index 369d4c90e669020a6fbb924122e2691247e54d7b..8d3bf25f00d6e2b054b8c8bd3ad81551085cf580 100644 (file)
@@ -90,7 +90,7 @@ static ssize_t iwl_dbgfs_tx_flush_write(struct iwl_mvm *mvm, char *buf,
 static ssize_t iwl_dbgfs_sta_drain_write(struct iwl_mvm *mvm, char *buf,
                                         size_t count, loff_t *ppos)
 {
-       struct ieee80211_sta *sta;
+       struct iwl_mvm_sta *mvmsta;
        int sta_id, drain, ret;
 
        if (!mvm->ucode_loaded || mvm->cur_ucode != IWL_UCODE_REGULAR)
@@ -105,13 +105,12 @@ static ssize_t iwl_dbgfs_sta_drain_write(struct iwl_mvm *mvm, char *buf,
 
        mutex_lock(&mvm->mutex);
 
-       sta = rcu_dereference_protected(mvm->fw_id_to_mac_id[sta_id],
-                                       lockdep_is_held(&mvm->mutex));
-       if (IS_ERR_OR_NULL(sta))
+       mvmsta = iwl_mvm_sta_from_staid_protected(mvm, sta_id);
+
+       if (!mvmsta)
                ret = -ENOENT;
        else
-               ret = iwl_mvm_drain_sta(mvm, (void *)sta->drv_priv, drain) ? :
-                       count;
+               ret = iwl_mvm_drain_sta(mvm, mvmsta, drain) ? : count;
 
        mutex_unlock(&mvm->mutex);
 
index bf13c462a1f40f74b1cb17ef5929a8f46ca0019e..02e4bdc80de2ce03c9dbba9a11dad2d0df5213dc 100644 (file)
@@ -595,6 +595,24 @@ static inline bool iwl_mvm_is_radio_killed(struct iwl_mvm *mvm)
               test_bit(IWL_MVM_STATUS_HW_CTKILL, &mvm->status);
 }
 
+static inline struct iwl_mvm_sta *
+iwl_mvm_sta_from_staid_protected(struct iwl_mvm *mvm, u8 sta_id)
+{
+       struct ieee80211_sta *sta;
+
+       if (sta_id >= ARRAY_SIZE(mvm->fw_id_to_mac_id))
+               return NULL;
+
+       sta = rcu_dereference_protected(mvm->fw_id_to_mac_id[sta_id],
+                                       lockdep_is_held(&mvm->mutex));
+
+       /* This can happen if the station has been removed right now */
+       if (IS_ERR_OR_NULL(sta))
+               return NULL;
+
+       return iwl_mvm_sta_from_mac80211(sta);
+}
+
 extern const u8 iwl_mvm_ac_to_tx_fifo[];
 
 struct iwl_rate_info {