.def_num_link = 0,
                .max_mlo_peer = 256,
+
+               .otp_board_id_register = QCN9274_QFPROM_RAW_RFA_PDET_ROW13_LSB,
        },
        {
                .name = "wcn7850 hw2.0",
 
                .def_num_link = 2,
                .max_mlo_peer = 32,
+
+               .otp_board_id_register = 0,
        },
        {
                .name = "qcn9274 hw2.0",
                        .board_size = 256 * 1024,
                        .cal_offset = 128 * 1024,
                },
-               .max_radios = 1,
+               .max_radios = 2,
                .single_pdev_only = false,
                .qmi_service_ins_id = ATH12K_QMI_WLFW_SERVICE_INS_ID_V01_QCN9274,
                .internal_sleep_clock = false,
 
                .def_num_link = 0,
                .max_mlo_peer = 256,
+
+               .otp_board_id_register = QCN9274_QFPROM_RAW_RFA_PDET_ROW13_LSB,
        },
 };
 
 
 #include "pci.h"
 
 #define MHI_TIMEOUT_DEFAULT_MS 90000
+#define OTP_INVALID_BOARD_ID   0xFFFF
+#define OTP_VALID_DUALMAC_BOARD_ID_MASK                0x1000
 
 static const struct mhi_channel_config ath12k_mhi_channels_qcn9274[] = {
        {
 {
        struct ath12k_base *ab = ab_pci->ab;
        struct mhi_controller *mhi_ctrl;
+       unsigned int board_id;
        int ret;
+       bool dualmac = false;
 
        mhi_ctrl = mhi_alloc_controller();
        if (!mhi_ctrl)
        mhi_ctrl->reg_len = ab->mem_len;
        mhi_ctrl->rddm_size = ab->hw_params->rddm_size;
 
-       if (ab->fw.amss_data && ab->fw.amss_len > 0) {
-               /* use MHI firmware file from firmware-N.bin */
-               mhi_ctrl->fw_data = ab->fw.amss_data;
-               mhi_ctrl->fw_sz = ab->fw.amss_len;
+       if (ab->hw_params->otp_board_id_register) {
+               board_id =
+                       ath12k_pci_read32(ab, ab->hw_params->otp_board_id_register);
+               board_id = u32_get_bits(board_id, OTP_BOARD_ID_MASK);
+
+               if (!board_id || (board_id == OTP_INVALID_BOARD_ID)) {
+                       ath12k_dbg(ab, ATH12K_DBG_BOOT,
+                                  "failed to read board id\n");
+               } else if (board_id & OTP_VALID_DUALMAC_BOARD_ID_MASK) {
+                       dualmac = true;
+                       ath12k_dbg(ab, ATH12K_DBG_BOOT,
+                                  "dualmac fw selected for board id: %x\n", board_id);
+               }
+       }
+
+       if (dualmac) {
+               if (ab->fw.amss_dualmac_data && ab->fw.amss_dualmac_len > 0) {
+                       /* use MHI firmware file from firmware-N.bin */
+                       mhi_ctrl->fw_data = ab->fw.amss_dualmac_data;
+                       mhi_ctrl->fw_sz = ab->fw.amss_dualmac_len;
+               } else {
+                       ath12k_warn(ab, "dualmac firmware IE not present in firmware-N.bin\n");
+                       ret = -ENOENT;
+                       goto free_controller;
+               }
        } else {
-               /* use the old separate mhi.bin MHI firmware file */
-               ath12k_core_create_firmware_path(ab, ATH12K_AMSS_FILE,
-                                                ab_pci->amss_path,
-                                                sizeof(ab_pci->amss_path));
-               mhi_ctrl->fw_image = ab_pci->amss_path;
+               if (ab->fw.amss_data && ab->fw.amss_len > 0) {
+                       /* use MHI firmware file from firmware-N.bin */
+                       mhi_ctrl->fw_data = ab->fw.amss_data;
+                       mhi_ctrl->fw_sz = ab->fw.amss_len;
+               } else {
+                       /* use the old separate mhi.bin MHI firmware file */
+                       ath12k_core_create_firmware_path(ab, ATH12K_AMSS_FILE,
+                                                        ab_pci->amss_path,
+                                                        sizeof(ab_pci->amss_path));
+                       mhi_ctrl->fw_image = ab_pci->amss_path;
+               }
        }
 
        ret = ath12k_mhi_get_msi(ab_pci);