/* Activate UNII-1 (5.2GHz) for World Wide */
 #define ACTIVATE_5G2_IN_WW_MASK                        BIT(4)
 #define CHAN_STATE_ACTIVE_BITMAP_CMD_V11       0x1F
+#define CHAN_STATE_ACTIVE_BITMAP_CMD_V12       0x7F
 
 /**
  * struct iwl_pnvm_init_complete_ntfy - PNVM initialization complete
 
                           "    %d: %d\n",
                           IWL_UCODE_TLV_CAPA_CHINA_22_REG_SUPPORT,
                           has_capa);
+               has_capa = fw_has_capa(&fw->ucode_capa,
+                                      IWL_UCODE_TLV_CAPA_FW_ACCEPTS_RAW_DSM_TABLE) ? 1 : 0;
+               seq_printf(seq,
+                          "    %d: %d\n",
+                          IWL_UCODE_TLV_CAPA_FW_ACCEPTS_RAW_DSM_TABLE,
+                          has_capa);
                seq_puts(seq, "fw_api_ver:\n");
        }
 
 
  *     for CA from BIOS.
  * @IWL_UCODE_TLV_CAPA_UHB_CANADA_TAS_SUPPORT: supports %TAS_UHB_ALLOWED_CANADA
  * @IWL_UCODE_TLV_CAPA_EXT_FSEQ_IMAGE_SUPPORT: external FSEQ image support
+ * @IWL_UCODE_TLV_CAPA_FW_ACCEPTS_RAW_DSM_TABLE: Firmware has capability of
+ *     handling raw DSM table data.
  *
  * @NUM_IWL_UCODE_TLV_CAPA: number of bits used
  */
         *      during assert handling even if the dump isn't split
         */
        IWL_UCODE_TLV_CAPA_RESET_DURING_ASSERT          = (__force iwl_ucode_tlv_capa_t)(4 * 32 +  0),
+       IWL_UCODE_TLV_CAPA_FW_ACCEPTS_RAW_DSM_TABLE     = (__force iwl_ucode_tlv_capa_t)(4 * 32 + 1),
        NUM_IWL_UCODE_TLV_CAPA
 /*
  * This construction make both sparse (which cannot increment the previous
 
 {
        int ret;
        u32 value;
+       bool has_raw_dsm_capa = fw_has_capa(&fwrt->fw->ucode_capa,
+                                           IWL_UCODE_TLV_CAPA_FW_ACCEPTS_RAW_DSM_TABLE);
        u8 cmd_ver = iwl_fw_lookup_cmd_ver(fwrt->fw,
                                           WIDE_ID(REGULATORY_AND_NVM_GROUP,
                                                   LARI_CONFIG_CHANGE), 1);
        cmd->config_bitmap = iwl_get_lari_config_bitmap(fwrt);
 
        ret = iwl_bios_get_dsm(fwrt, DSM_FUNC_11AX_ENABLEMENT, &value);
-       if (!ret)
+       if (!ret) {
+               if (!has_raw_dsm_capa)
+                       value &= DSM_11AX_ALLOW_BITMAP;
                cmd->oem_11ax_allow_bitmap = cpu_to_le32(value);
+       }
 
        ret = iwl_bios_get_dsm(fwrt, DSM_FUNC_ENABLE_UNII4_CHAN, &value);
        if (!ret) {
-               value &= DSM_UNII4_ALLOW_BITMAP;
+               if (!has_raw_dsm_capa)
+                       value &= DSM_UNII4_ALLOW_BITMAP;
 
                /* Since version 9, bits 4 and 5 are supported
-                * regardless of this capability.
+                * regardless of this capability, By pass this masking
+                * if firmware has capability of accepting raw DSM table.
                 */
-               if (cmd_ver < 9 &&
+               if (!has_raw_dsm_capa && cmd_ver < 9 &&
                    !fw_has_capa(&fwrt->fw->ucode_capa,
                                 IWL_UCODE_TLV_CAPA_BIOS_OVERRIDE_5G9_FOR_CA))
                        value &= ~(DSM_VALUE_UNII4_CANADA_OVERRIDE_MSK |
 
        ret = iwl_bios_get_dsm(fwrt, DSM_FUNC_ACTIVATE_CHANNEL, &value);
        if (!ret) {
-               if (cmd_ver < 8)
+               if (!has_raw_dsm_capa)
+                       value &= CHAN_STATE_ACTIVE_BITMAP_CMD_V12;
+
+               if (!has_raw_dsm_capa && cmd_ver < 8)
                        value &= ~ACTIVATE_5G2_IN_WW_MASK;
 
                /* Since version 12, bits 5 and 6 are supported
-                * regardless of this capability.
+                * regardless of this capability, By pass this masking
+                * if firmware has capability of accepting raw DSM table.
                 */
-               if (cmd_ver < 12 &&
+               if (!has_raw_dsm_capa && cmd_ver < 12 &&
                    !fw_has_capa(&fwrt->fw->ucode_capa,
                                 IWL_UCODE_TLV_CAPA_BIOS_OVERRIDE_UNII4_US_CA))
                        value &= CHAN_STATE_ACTIVE_BITMAP_CMD_V11;
                cmd->oem_uhb_allow_bitmap = cpu_to_le32(value);
 
        ret = iwl_bios_get_dsm(fwrt, DSM_FUNC_FORCE_DISABLE_CHANNELS, &value);
-       if (!ret)
+       if (!ret) {
+               if (!has_raw_dsm_capa)
+                       value &= DSM_FORCE_DISABLE_CHANNELS_ALLOWED_BITMAP;
                cmd->force_disable_channels_bitmap = cpu_to_le32(value);
+       }
 
        ret = iwl_bios_get_dsm(fwrt, DSM_FUNC_ENERGY_DETECTION_THRESHOLD,
                               &value);
-       if (!ret)
+       if (!ret) {
+               if (!has_raw_dsm_capa)
+                       value &= DSM_EDT_ALLOWED_BITMAP;
                cmd->edt_bitmap = cpu_to_le32(value);
+       }
 
        ret = iwl_bios_get_wbem(fwrt, &value);
        if (!ret)
 
                                DSM_VALUE_UNII4_CANADA_OVERRIDE_MSK     |\
                                DSM_VALUE_UNII4_CANADA_EN_MSK)
 
+#define DSM_11AX_ALLOW_BITMAP                          0xF
+#define DSM_EDT_ALLOWED_BITMAP                         0x7ffff0
+#define DSM_FORCE_DISABLE_CHANNELS_ALLOWED_BITMAP      0x7FF
+
 enum iwl_dsm_values_rfi {
        DSM_VALUE_RFI_DLVR_DISABLE      = BIT(0),
        DSM_VALUE_RFI_DDR_DISABLE       = BIT(1),
 
        struct iwl_lari_config_change_cmd cmd = {
                .config_bitmap = iwl_get_lari_config_bitmap(fwrt),
        };
+       bool has_raw_dsm_capa = fw_has_capa(&fwrt->fw->ucode_capa,
+                                           IWL_UCODE_TLV_CAPA_FW_ACCEPTS_RAW_DSM_TABLE);
        int ret;
        u32 value;
 
        ret = iwl_bios_get_dsm(fwrt, DSM_FUNC_11AX_ENABLEMENT, &value);
-       if (!ret)
+       if (!ret) {
+               if (!has_raw_dsm_capa)
+                       value &= DSM_11AX_ALLOW_BITMAP;
                cmd.oem_11ax_allow_bitmap = cpu_to_le32(value);
+       }
 
        ret = iwl_bios_get_dsm(fwrt, DSM_FUNC_ENABLE_UNII4_CHAN, &value);
-       if (!ret)
-               cmd.oem_unii4_allow_bitmap =
-                       cpu_to_le32(value &= DSM_UNII4_ALLOW_BITMAP);
+       if (!ret) {
+               if (!has_raw_dsm_capa)
+                       value &= DSM_UNII4_ALLOW_BITMAP;
+               cmd.oem_unii4_allow_bitmap = cpu_to_le32(value);
+       }
 
        ret = iwl_bios_get_dsm(fwrt, DSM_FUNC_ACTIVATE_CHANNEL, &value);
-       if (!ret)
+       if (!ret) {
+               if (!has_raw_dsm_capa)
+                       value &= CHAN_STATE_ACTIVE_BITMAP_CMD_V12;
                cmd.chan_state_active_bitmap = cpu_to_le32(value);
+       }
 
        ret = iwl_bios_get_dsm(fwrt, DSM_FUNC_ENABLE_6E, &value);
        if (!ret)
                cmd.oem_uhb_allow_bitmap = cpu_to_le32(value);
 
        ret = iwl_bios_get_dsm(fwrt, DSM_FUNC_FORCE_DISABLE_CHANNELS, &value);
-       if (!ret)
+       if (!ret) {
+               if (!has_raw_dsm_capa)
+                       value &= DSM_FORCE_DISABLE_CHANNELS_ALLOWED_BITMAP;
                cmd.force_disable_channels_bitmap = cpu_to_le32(value);
+       }
 
        ret = iwl_bios_get_dsm(fwrt, DSM_FUNC_ENERGY_DETECTION_THRESHOLD,
                               &value);
-       if (!ret)
+       if (!ret) {
+               if (!has_raw_dsm_capa)
+                       value &= DSM_EDT_ALLOWED_BITMAP;
                cmd.edt_bitmap = cpu_to_le32(value);
+       }
 
        ret = iwl_bios_get_wbem(fwrt, &value);
        if (!ret)