iwlwifi: acpi: rename geo structs to contain versioning
authorLuca Coelho <luciano.coelho@intel.com>
Mon, 28 Sep 2020 09:23:13 +0000 (12:23 +0300)
committerLuca Coelho <luciano.coelho@intel.com>
Thu, 1 Oct 2020 18:59:34 +0000 (21:59 +0300)
Add the version number to the iwl_geo_tx_power_profile_cmd structs and
move the union into a common place.  Additionally, reuse the code that
sets elements that are at the same place in the struct across
different versions.

While at it remove an unused variable, add a comment and move the v2
specific element setting to inside the if statement.  Additionally,
invert the if for slightly more readability.

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

index 91ee767662fbb9064a60369aa5d64573d5d02188..838b2844e3d6765ff5720cc785466f7be1e9b57d 100644 (file)
@@ -645,7 +645,7 @@ bool iwl_sar_geo_support(struct iwl_fw_runtime *fwrt)
 IWL_EXPORT_SYMBOL(iwl_sar_geo_support);
 
 int iwl_sar_geo_init(struct iwl_fw_runtime *fwrt,
-                    struct iwl_per_chain_offset_group *table)
+                    struct iwl_per_chain_offset_group_v1 *table)
 {
        int ret, i, j;
 
index 9524750607be16a9fa47cc23713fefe7ef833b2a..94fabe6cd3686a50ecba5b151732336555198232 100644 (file)
@@ -196,7 +196,7 @@ int iwl_sar_get_wgds_table(struct iwl_fw_runtime *fwrt);
 bool iwl_sar_geo_support(struct iwl_fw_runtime *fwrt);
 
 int iwl_sar_geo_init(struct iwl_fw_runtime *fwrt,
-                    struct iwl_per_chain_offset_group *table);
+                    struct iwl_per_chain_offset_group_v1 *table);
 
 int iwl_acpi_get_tas(struct iwl_fw_runtime *fwrt, __le32 *black_list_array,
                     int *black_list_size);
index 062e34b5b4f8667d53a59d452ce6c98db281c3c4..c3111a1e9f5734e208ce48051f382be9976366bb 100644 (file)
@@ -460,7 +460,7 @@ struct iwl_per_chain_offset {
        u8 chain_b;
 } __packed; /* PER_CHAIN_LIMIT_OFFSET_PER_CHAIN_S_VER_1 */
 
-struct iwl_per_chain_offset_group {
+struct iwl_per_chain_offset_group_v1 {
        struct iwl_per_chain_offset lb;
        struct iwl_per_chain_offset hb;
 } __packed; /* PER_CHAIN_LIMIT_OFFSET_GROUP_S_VER_1 */
@@ -472,7 +472,7 @@ struct iwl_per_chain_offset_group {
  */
 struct iwl_geo_tx_power_profiles_cmd_v1 {
        __le32 ops;
-       struct iwl_per_chain_offset_group table[IWL_NUM_GEO_PROFILES];
+       struct iwl_per_chain_offset_group_v1 table[IWL_NUM_GEO_PROFILES];
 } __packed; /* GEO_TX_POWER_LIMIT_VER_1 */
 
 /**
@@ -481,11 +481,16 @@ struct iwl_geo_tx_power_profiles_cmd_v1 {
  * @table: offset profile per band.
  * @table_revision: BIOS table revision.
  */
-struct iwl_geo_tx_power_profiles_cmd {
+struct iwl_geo_tx_power_profiles_cmd_v2 {
        __le32 ops;
-       struct iwl_per_chain_offset_group table[IWL_NUM_GEO_PROFILES];
+       struct iwl_per_chain_offset_group_v1 table[IWL_NUM_GEO_PROFILES];
        __le32 table_revision;
-} __packed; /* GEO_TX_POWER_LIMIT */
+} __packed; /* GEO_TX_POWER_LIMIT_VER_2 */
+
+union iwl_geo_tx_power_profiles_cmd {
+       struct iwl_geo_tx_power_profiles_cmd_v1 v1;
+       struct iwl_geo_tx_power_profiles_cmd_v2 v2;
+};
 
 /**
  * struct iwl_geo_tx_power_profiles_resp -  response to GEO_TX_POWER_LIMIT cmd
index f3e149e70c67c170389e1d35fee8c03d33bd0989..644bd59cb0f07e62420db7b2431dbf66ffcd978d 100644 (file)
@@ -782,22 +782,21 @@ int iwl_mvm_sar_select_profile(struct iwl_mvm *mvm, int prof_a, int prof_b)
 
 int iwl_mvm_get_sar_geo_profile(struct iwl_mvm *mvm)
 {
-       union geo_tx_power_profiles_cmd geo_tx_cmd;
+       union iwl_geo_tx_power_profiles_cmd geo_tx_cmd;
        struct iwl_geo_tx_power_profiles_resp *resp;
        u16 len;
        int ret;
        struct iwl_host_cmd cmd;
 
+       /* the ops field is at the same spot for all versions, so set in v1 */
+       geo_tx_cmd.v1.ops =
+               cpu_to_le32(IWL_PER_CHAIN_OFFSET_GET_CURRENT_TABLE);
+
        if (fw_has_api(&mvm->fwrt.fw->ucode_capa,
-                      IWL_UCODE_TLV_API_SAR_TABLE_VER)) {
-               geo_tx_cmd.geo_cmd.ops =
-                       cpu_to_le32(IWL_PER_CHAIN_OFFSET_GET_CURRENT_TABLE);
-               len = sizeof(geo_tx_cmd.geo_cmd);
-       } else {
-               geo_tx_cmd.geo_cmd_v1.ops =
-                       cpu_to_le32(IWL_PER_CHAIN_OFFSET_GET_CURRENT_TABLE);
-               len = sizeof(geo_tx_cmd.geo_cmd_v1);
-       }
+                      IWL_UCODE_TLV_API_SAR_TABLE_VER))
+               len = sizeof(geo_tx_cmd.v2);
+       else
+               len = sizeof(geo_tx_cmd.v1);
 
        if (!iwl_sar_geo_support(&mvm->fwrt))
                return -EOPNOTSUPP;
@@ -827,14 +826,13 @@ int iwl_mvm_get_sar_geo_profile(struct iwl_mvm *mvm)
 
 static int iwl_mvm_sar_geo_init(struct iwl_mvm *mvm)
 {
-       u16 cmd_wide_id =  WIDE_ID(PHY_OPS_GROUP, GEO_TX_POWER_LIMIT);
-       union geo_tx_power_profiles_cmd cmd;
+       union iwl_geo_tx_power_profiles_cmd cmd;
        u16 len;
        int ret;
 
-       cmd.geo_cmd.ops = cpu_to_le32(IWL_PER_CHAIN_OFFSET_SET_TABLES);
+       /* the table is also at the same position both in v1 and v2 */
+       ret = iwl_sar_geo_init(&mvm->fwrt, cmd.v1.table);
 
-       ret = iwl_sar_geo_init(&mvm->fwrt, cmd.geo_cmd.table);
        /*
         * It is a valid scenario to not support SAR, or miss wgds table,
         * but in that case there is no need to send the command.
@@ -842,16 +840,20 @@ static int iwl_mvm_sar_geo_init(struct iwl_mvm *mvm)
        if (ret)
                return 0;
 
-       cmd.geo_cmd.table_revision = cpu_to_le32(mvm->fwrt.geo_rev);
+       /* the ops field is at the same spot for all versions, so set in v1 */
+       cmd.v1.ops = cpu_to_le32(IWL_PER_CHAIN_OFFSET_SET_TABLES);
 
-       if (!fw_has_api(&mvm->fwrt.fw->ucode_capa,
-                       IWL_UCODE_TLV_API_SAR_TABLE_VER)) {
-               len = sizeof(struct iwl_geo_tx_power_profiles_cmd_v1);
+       if (fw_has_api(&mvm->fwrt.fw->ucode_capa,
+                      IWL_UCODE_TLV_API_SAR_TABLE_VER)) {
+               len = sizeof(cmd.v2);
+               cmd.v2.table_revision = cpu_to_le32(mvm->fwrt.geo_rev);
        } else {
-               len =  sizeof(cmd.geo_cmd);
+               len = sizeof(cmd.v1);
        }
 
-       return iwl_mvm_send_cmd_pdu(mvm, cmd_wide_id, 0, len, &cmd);
+       return iwl_mvm_send_cmd_pdu(mvm,
+                                   WIDE_ID(PHY_OPS_GROUP, GEO_TX_POWER_LIMIT),
+                                   0, len, &cmd);
 }
 
 static int iwl_mvm_get_ppag_table(struct iwl_mvm *mvm)
index 05b707e23e39549270810a14376a622021ca3b5d..37e49014887656557328ccf12291ead4e43aa8ee 100644 (file)
@@ -184,11 +184,6 @@ enum iwl_power_scheme {
        IWL_POWER_SCHEME_LP
 };
 
-union geo_tx_power_profiles_cmd {
-       struct iwl_geo_tx_power_profiles_cmd geo_cmd;
-       struct iwl_geo_tx_power_profiles_cmd_v1 geo_cmd_v1;
-};
-
 #define IWL_CONN_MAX_LISTEN_INTERVAL   10
 #define IWL_UAPSD_MAX_SP               IEEE80211_WMM_IE_STA_QOSINFO_SP_ALL