]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
wifi: iwlwifi: Use FW rate for non-data frames
authorMiri Korenblit <miriam.rachel.korenblit@intel.com>
Wed, 13 Sep 2023 11:56:45 +0000 (14:56 +0300)
committerJohannes Berg <johannes.berg@intel.com>
Wed, 13 Sep 2023 14:11:40 +0000 (16:11 +0200)
Currently we are setting the rate in the tx cmd for
mgmt frames (e.g. during connection establishment).
This was problematic when sending mgmt frames in eSR mode,
as we don't know what link this frame will be sent on
(This is decided by the FW), so we don't know what is the
lowest rate.
Fix this by not setting the rate in tx cmd and rely
on FW to choose the right one.
Set rate only for injected frames with fixed rate,
or when no sta is given.
Also set for important frames (EAPOL etc.) the High Priority flag.

Fixes: 055b22e770dd ("iwlwifi: mvm: Set Tx rate and flags when there is not station")
Signed-off-by: Miri Korenblit <miriam.rachel.korenblit@intel.com>
Signed-off-by: Gregory Greenman <gregory.greenman@intel.com>
Link: https://lore.kernel.org/r/20230913145231.6c7e59620ee0.I6eaed3ccdd6dd62b9e664facc484081fc5275843@changeid
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
drivers/net/wireless/intel/iwlwifi/mvm/tx.c

index 36d70d589aedda6511f3274cacc411cf5b483b38..6e2e529367618893aef00ea2463b9bb2d0764300 100644 (file)
@@ -536,16 +536,20 @@ iwl_mvm_set_tx_params(struct iwl_mvm *mvm, struct sk_buff *skb,
                        flags |= IWL_TX_FLAGS_ENCRYPT_DIS;
 
                /*
-                * For data packets rate info comes from the fw. Only
-                * set rate/antenna during connection establishment or in case
-                * no station is given.
+                * For data and mgmt packets rate info comes from the fw. Only
+                * set rate/antenna for injected frames with fixed rate, or
+                * when no sta is given.
                 */
-               if (!sta || !ieee80211_is_data(hdr->frame_control) ||
-                   mvmsta->sta_state < IEEE80211_STA_AUTHORIZED) {
+               if (unlikely(!sta ||
+                            info->control.flags & IEEE80211_TX_CTRL_RATE_INJECT)) {
                        flags |= IWL_TX_FLAGS_CMD_RATE;
                        rate_n_flags =
                                iwl_mvm_get_tx_rate_n_flags(mvm, info, sta,
                                                            hdr->frame_control);
+               } else if (!ieee80211_is_data(hdr->frame_control) ||
+                          mvmsta->sta_state < IEEE80211_STA_AUTHORIZED) {
+                       /* These are important frames */
+                       flags |= IWL_TX_FLAGS_HIGH_PRI;
                }
 
                if (mvm->trans->trans_cfg->device_family >=