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 */
  */
 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 */
 
 /**
  * @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
 
 
 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;
 
 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.
        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)