OSDN Git Service

iwlwifi: mvm: add explicit check for non-data frames in get Tx rate
authorKrishnanand Prabhu <krishnanand.prabhu@intel.com>
Sun, 17 Jan 2021 14:52:30 +0000 (16:52 +0200)
committerLuca Coelho <luciano.coelho@intel.com>
Fri, 5 Feb 2021 09:55:18 +0000 (11:55 +0200)
In roaming flows and during reassociation, its possible that data frames
such as EAPOLs for 4 way handshake/ 802.1x authentication are initially set
to higher MCS rate. Though these are pruned down to a lower legacy rate
before sending to the FW, driver also emits a kernel warning - intended for
non-data frames. Add checks to avoid such warnings for data frames, while
also enhancing the debug data printed.

Signed-off-by: Krishnanand Prabhu <krishnanand.prabhu@intel.com>
Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
Link: https://lore.kernel.org/r/iwlwifi.20210117164916.d9ded010c4ce.Ie1d5a33d7175c0bcb35c10b5729748646671da31@changeid
Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
drivers/net/wireless/intel/iwlwifi/mvm/tx.c

index c8c07b7..b102fe1 100644 (file)
@@ -263,17 +263,20 @@ static u32 iwl_mvm_get_tx_ant(struct iwl_mvm *mvm,
 
 static u32 iwl_mvm_get_tx_rate(struct iwl_mvm *mvm,
                               struct ieee80211_tx_info *info,
-                              struct ieee80211_sta *sta)
+                              struct ieee80211_sta *sta, __le16 fc)
 {
        int rate_idx;
        u8 rate_plcp;
        u32 rate_flags = 0;
+       struct iwl_mvm_sta *mvmsta = iwl_mvm_sta_from_mac80211(sta);
 
        /* HT rate doesn't make sense for a non data frame */
-       WARN_ONCE(info->control.rates[0].flags & IEEE80211_TX_RC_MCS,
-                 "Got an HT rate (flags:0x%x/mcs:%d) for a non data frame\n",
+       WARN_ONCE(info->control.rates[0].flags & IEEE80211_TX_RC_MCS &&
+                 !ieee80211_is_data(fc),
+                 "Got a HT rate (flags:0x%x/mcs:%d/fc:0x%x/state:%d) for a non data frame\n",
                  info->control.rates[0].flags,
-                 info->control.rates[0].idx);
+                 info->control.rates[0].idx,
+                 le16_to_cpu(fc), mvmsta->sta_state);
 
        rate_idx = info->control.rates[0].idx;
        /* if the rate isn't a well known legacy rate, take the lowest one */
@@ -305,7 +308,7 @@ static u32 iwl_mvm_get_tx_rate_n_flags(struct iwl_mvm *mvm,
                                       struct ieee80211_tx_info *info,
                                       struct ieee80211_sta *sta, __le16 fc)
 {
-       return iwl_mvm_get_tx_rate(mvm, info, sta) |
+       return iwl_mvm_get_tx_rate(mvm, info, sta, fc) |
                iwl_mvm_get_tx_ant(mvm, info, sta, fc);
 }