iwlwifi: mvm: Add support for new rate_n_flags in tx_cmd.
authorMiri Korenblit <miriam.rachel.korenblit@intel.com>
Sun, 17 Oct 2021 13:25:55 +0000 (16:25 +0300)
committerLuca Coelho <luciano.coelho@intel.com>
Fri, 22 Oct 2021 07:49:01 +0000 (10:49 +0300)
As part of the new rate_n_flags, tx_cmd API has changed.
Add support for these changes.

Signed-off-by: Miri Korenblit <miriam.rachel.korenblit@intel.com>
Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
Link: https://lore.kernel.org/r/iwlwifi.20211017162352.26efa51624b1.Ic96ae4d81b3ff07fb514df2b5f6a8e470e4d3778@changeid
Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
drivers/net/wireless/intel/iwlwifi/fw/api/tx.h
drivers/net/wireless/intel/iwlwifi/mvm/debugfs.c
drivers/net/wireless/intel/iwlwifi/mvm/mac-ctxt.c
drivers/net/wireless/intel/iwlwifi/mvm/mvm.h
drivers/net/wireless/intel/iwlwifi/mvm/tx.c
drivers/net/wireless/intel/iwlwifi/mvm/utils.c

index c0caf9dca545f008eca5955038ad2c34bff739ad..25af74d13d4b060fbc3c8f210975c5da97c43156 100644 (file)
@@ -267,7 +267,8 @@ struct iwl_tx_cmd_gen2 {
        struct iwl_dram_sec_info dram_info;
        __le32 rate_n_flags;
        struct ieee80211_hdr hdr[];
-} __packed; /* TX_CMD_API_S_VER_7 */
+} __packed; /* TX_CMD_API_S_VER_7,
+              TX_CMD_API_S_VER_9 */
 
 /**
  * struct iwl_tx_cmd_gen3 - TX command struct to FW for AX210+ devices
@@ -290,7 +291,8 @@ struct iwl_tx_cmd_gen3 {
        __le32 rate_n_flags;
        __le64 ttl;
        struct ieee80211_hdr hdr[];
-} __packed; /* TX_CMD_API_S_VER_8 */
+} __packed; /* TX_CMD_API_S_VER_8,
+              TX_CMD_API_S_VER_10 */
 
 /*
  * TX response related data
index 1fba6b421d31106b49fe0d453d85fe6bc4dce3b9..307d57ec7f7c9c1197fda81c35bd5e57b9141074 100644 (file)
@@ -1240,7 +1240,7 @@ static int _iwl_dbgfs_inject_beacon_ie(struct iwl_mvm *mvm, char *bin, int len)
        mvmvif = iwl_mvm_vif_from_mac80211(vif);
        info = IEEE80211_SKB_CB(beacon);
        rate = iwl_mvm_mac_ctxt_get_lowest_rate(info, vif);
-       flags = iwl_mvm_mac80211_idx_to_hwrate(rate);
+       flags = iwl_mvm_mac80211_idx_to_hwrate(mvm->fw, rate);
 
        if (rate == IWL_FIRST_CCK_RATE)
                flags |= IWL_MAC_BEACON_CCK;
index 0065cc76a2a04625c75c2dc6a6af422d85aa6c89..89c260e1c3f4a011a5969b17b5d4e9f5ab48d16f 100644 (file)
@@ -844,7 +844,8 @@ static void iwl_mvm_mac_ctxt_set_tx(struct iwl_mvm *mvm,
 
        rate = iwl_mvm_mac_ctxt_get_lowest_rate(info, vif);
 
-       tx->rate_n_flags |= cpu_to_le32(iwl_mvm_mac80211_idx_to_hwrate(rate));
+       tx->rate_n_flags |=
+               cpu_to_le32(iwl_mvm_mac80211_idx_to_hwrate(mvm->fw, rate));
        if (rate == IWL_FIRST_CCK_RATE)
                tx->rate_n_flags |= cpu_to_le32(RATE_MCS_CCK_MSK_V1);
 
@@ -930,7 +931,7 @@ static int iwl_mvm_mac_ctxt_send_beacon_v9(struct iwl_mvm *mvm,
        struct ieee80211_chanctx_conf *ctx;
        int channel;
 
-       flags = iwl_mvm_mac80211_idx_to_hwrate(rate);
+       flags = iwl_mvm_mac80211_idx_to_hwrate(mvm->fw, rate);
 
        if (rate == IWL_FIRST_CCK_RATE)
                flags |= IWL_MAC_BEACON_CCK;
index 50a11a595db1e1c5326a8c6a0aa730291a015919..12b22545e9d04c6ec502f1c2741945d13180c9a3 100644 (file)
@@ -1448,7 +1448,7 @@ int iwl_mvm_legacy_rate_to_mac80211_idx(u32 rate_n_flags,
 void iwl_mvm_hwrate_to_tx_rate(u32 rate_n_flags,
                               enum nl80211_band band,
                               struct ieee80211_tx_rate *r);
-u8 iwl_mvm_mac80211_idx_to_hwrate(int rate_idx);
+u8 iwl_mvm_mac80211_idx_to_hwrate(const struct iwl_fw *fw, int rate_idx);
 u8 iwl_mvm_mac80211_ac_to_ucode_ac(enum ieee80211_ac_numbers ac);
 
 static inline void iwl_mvm_dump_nic_error_log(struct iwl_mvm *mvm)
index ff29c4b140dc1e4ab7afb2a0befd9e6746591b6e..aa1797139f7c81db073d7b64e3a4016d0964a059 100644 (file)
@@ -268,6 +268,7 @@ static u32 iwl_mvm_get_tx_rate(struct iwl_mvm *mvm,
        int rate_idx = -1;
        u8 rate_plcp;
        u32 rate_flags = 0;
+       bool is_cck;
        struct iwl_mvm_sta *mvmsta = iwl_mvm_sta_from_mac80211(sta);
 
        /* info->control is only relevant for non HW rate control */
@@ -299,11 +300,18 @@ static u32 iwl_mvm_get_tx_rate(struct iwl_mvm *mvm,
        BUILD_BUG_ON(IWL_FIRST_CCK_RATE != 0);
 
        /* Get PLCP rate for tx_cmd->rate_n_flags */
-       rate_plcp = iwl_mvm_mac80211_idx_to_hwrate(rate_idx);
+       rate_plcp = iwl_mvm_mac80211_idx_to_hwrate(mvm->fw, rate_idx);
+       is_cck = (rate_idx >= IWL_FIRST_CCK_RATE) && (rate_idx <= IWL_LAST_CCK_RATE);
 
-       /* Set CCK flag as needed */
-       if ((rate_idx >= IWL_FIRST_CCK_RATE) && (rate_idx <= IWL_LAST_CCK_RATE))
+       /* Set CCK or OFDM flag */
+       if (iwl_fw_lookup_cmd_ver(mvm->fw, LONG_GROUP, TX_CMD, 0) > 8) {
+               if (!is_cck)
+                       rate_flags |= RATE_MCS_LEGACY_OFDM_MSK;
+               else
+                       rate_flags |= RATE_MCS_CCK_MSK;
+       } else if (is_cck) {
                rate_flags |= RATE_MCS_CCK_MSK_V1;
+       }
 
        return (u32)rate_plcp | rate_flags;
 }
index dc1727280248bd3dd52a84a2da11c7d9fa8b1412..11f51a421a3d3badb20b5b8fcd66929a865414b1 100644 (file)
@@ -152,9 +152,17 @@ int iwl_mvm_legacy_rate_to_mac80211_idx(u32 rate_n_flags,
        return -1;
 }
 
-u8 iwl_mvm_mac80211_idx_to_hwrate(int rate_idx)
+u8 iwl_mvm_mac80211_idx_to_hwrate(const struct iwl_fw *fw, int rate_idx)
 {
-       /* Get PLCP rate for tx_cmd->rate_n_flags */
+       if (iwl_fw_lookup_cmd_ver(fw, LONG_GROUP,
+                                 TX_CMD, 0) > 8)
+               /* In the new rate legacy rates are indexed:
+                * 0 - 3 for CCK and 0 - 7 for OFDM.
+                */
+               return (rate_idx >= IWL_FIRST_OFDM_RATE ?
+                       rate_idx - IWL_FIRST_OFDM_RATE :
+                       rate_idx);
+
        return iwl_fw_rate_idx_to_plcp(rate_idx);
 }