iwlwifi: support REDUCE_TX_POWER_CMD version 6
authorLuca Coelho <luciano.coelho@intel.com>
Mon, 28 Sep 2020 09:23:12 +0000 (12:23 +0300)
committerLuca Coelho <luciano.coelho@intel.com>
Thu, 1 Oct 2020 18:59:34 +0000 (21:59 +0300)
The new version of the command can support more subbands and CDB, so
it can contain more data than earlier versions.  Implement support for
the new version of the command, even though we don't have more data to
write to it yet.

Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
Link: https://lore.kernel.org/r/iwlwifi.20200928121852.d709a8f17d1d.I9fa54883667c72dabf6d813c70be77538d9af38d@changeid
Signed-off-by: Luca Coelho <luciano.coelho@intel.com>
drivers/net/wireless/intel/iwlwifi/fw/api/power.h
drivers/net/wireless/intel/iwlwifi/mvm/fw.c
drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c

index 28bb361..062e34b 100644 (file)
@@ -330,6 +330,7 @@ enum iwl_dev_tx_power_cmd_mode {
 }; /* TX_POWER_REDUCED_FLAGS_TYPE_API_E_VER_5 */;
 
 #define IWL_NUM_CHAIN_TABLES   1
+#define IWL_NUM_CHAIN_TABLES_V2        2
 #define IWL_NUM_CHAIN_LIMITS   2
 #define IWL_NUM_SUB_BANDS      5
 #define IWL_NUM_SUB_BANDS_V2   11
@@ -397,11 +398,33 @@ struct iwl_dev_tx_power_cmd_v5 {
 } __packed; /* TX_REDUCED_POWER_API_S_VER_5 */
 
 /**
+ * struct iwl_dev_tx_power_cmd_v5 - TX power reduction command version 5
+ * @per_chain: per chain restrictions
+ * @enable_ack_reduction: enable or disable close range ack TX power
+ *     reduction.
+ * @per_chain_restriction_changed: is per_chain_restriction has changed
+ *     from last command. used if set_mode is
+ *     IWL_TX_POWER_MODE_SET_SAR_TIMER.
+ *     note: if not changed, the command is used for keep alive only.
+ * @reserved: reserved (padding)
+ * @timer_period: timer in milliseconds. if expires FW will change to default
+ *     BIOS values. relevant if setMode is IWL_TX_POWER_MODE_SET_SAR_TIMER
+ */
+struct iwl_dev_tx_power_cmd_v6 {
+       __le16 per_chain[IWL_NUM_CHAIN_TABLES_V2][IWL_NUM_CHAIN_LIMITS][IWL_NUM_SUB_BANDS_V2];
+       u8 enable_ack_reduction;
+       u8 per_chain_restriction_changed;
+       u8 reserved[2];
+       __le32 timer_period;
+} __packed; /* TX_REDUCED_POWER_API_S_VER_6 */
+
+/**
  * struct iwl_dev_tx_power_cmd - TX power reduction command (multiversion)
  * @common: common part of the command
  * @v3: version 3 part of the command
  * @v4: version 4 part of the command
  * @v5: version 5 part of the command
+ * @v6: version 6 part of the command
  */
 struct iwl_dev_tx_power_cmd {
        struct iwl_dev_tx_power_common common;
@@ -409,6 +432,7 @@ struct iwl_dev_tx_power_cmd {
                struct iwl_dev_tx_power_cmd_v3 v3;
                struct iwl_dev_tx_power_cmd_v4 v4;
                struct iwl_dev_tx_power_cmd_v5 v5;
+               struct iwl_dev_tx_power_cmd_v6 v6;
        };
 };
 
index d55a876..f3e149e 100644 (file)
@@ -742,17 +742,27 @@ int iwl_mvm_sar_select_profile(struct iwl_mvm *mvm, int prof_a, int prof_b)
        __le16 *per_chain;
        int ret;
        u16 len = 0;
-
-       if (fw_has_api(&mvm->fw->ucode_capa,
-                      IWL_UCODE_TLV_API_REDUCE_TX_POWER)) {
+       u32 n_subbands;
+       u8 cmd_ver = iwl_fw_lookup_cmd_ver(mvm->fw, LONG_GROUP,
+                                          REDUCE_TX_POWER_CMD);
+
+       if (cmd_ver == 6) {
+               len = sizeof(cmd.v6);
+               n_subbands = IWL_NUM_SUB_BANDS_V2;
+               per_chain = cmd.v6.per_chain[0][0];
+       } else if (fw_has_api(&mvm->fw->ucode_capa,
+                             IWL_UCODE_TLV_API_REDUCE_TX_POWER)) {
                len = sizeof(cmd.v5);
+               n_subbands = IWL_NUM_SUB_BANDS;
                per_chain = cmd.v5.per_chain[0][0];
        } else if (fw_has_capa(&mvm->fw->ucode_capa,
-                            IWL_UCODE_TLV_CAPA_TX_POWER_ACK)) {
+                              IWL_UCODE_TLV_CAPA_TX_POWER_ACK)) {
                len = sizeof(cmd.v4);
+               n_subbands = IWL_NUM_SUB_BANDS;
                per_chain = cmd.v4.per_chain[0][0];
        } else {
                len = sizeof(cmd.v3);
+               n_subbands = IWL_NUM_SUB_BANDS;
                per_chain = cmd.v3.per_chain[0][0];
        }
 
@@ -760,7 +770,7 @@ int iwl_mvm_sar_select_profile(struct iwl_mvm *mvm, int prof_a, int prof_b)
        len += sizeof(cmd.common);
 
        ret = iwl_sar_select_profile(&mvm->fwrt, per_chain, ACPI_SAR_NUM_TABLES,
-                                    ACPI_SAR_NUM_SUB_BANDS, prof_a, prof_b);
+                                    n_subbands, prof_a, prof_b);
 
        /* return on error or if the profile is disabled (positive number) */
        if (ret)
index 2beb54f..38666a1 100644 (file)
@@ -1314,12 +1314,16 @@ static int iwl_mvm_set_tx_power(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
                        cpu_to_le32(iwl_mvm_vif_from_mac80211(vif)->id),
                .common.pwr_restriction = cpu_to_le16(8 * tx_power),
        };
+       u8 cmd_ver = iwl_fw_lookup_cmd_ver(mvm->fw, LONG_GROUP,
+                                          REDUCE_TX_POWER_CMD);
 
        if (tx_power == IWL_DEFAULT_MAX_TX_POWER)
                cmd.common.pwr_restriction = cpu_to_le16(IWL_DEV_MAX_TX_POWER);
 
-       if (fw_has_api(&mvm->fw->ucode_capa,
-                      IWL_UCODE_TLV_API_REDUCE_TX_POWER))
+       if (cmd_ver == 6)
+               len = sizeof(cmd.v6);
+       else if (fw_has_api(&mvm->fw->ucode_capa,
+                           IWL_UCODE_TLV_API_REDUCE_TX_POWER))
                len = sizeof(cmd.v5);
        else if (fw_has_capa(&mvm->fw->ucode_capa,
                             IWL_UCODE_TLV_CAPA_TX_POWER_ACK))