int i;
        struct ath11k_pdev *pdev;
 
+       if (ab->hw_params.single_pdev_only) {
+               pdev = rcu_dereference(ab->pdevs_active[0]);
+               return pdev ? pdev->ar : NULL;
+       }
+
        if (WARN_ON(pdev_id > ab->num_radios))
                return NULL;
 
        }
 }
 
+static u32 ath11k_get_phy_id(struct ath11k *ar, u32 band)
+{
+       struct ath11k_pdev *pdev = ar->pdev;
+       struct ath11k_pdev_cap *pdev_cap = &pdev->cap;
+
+       if (band == WMI_HOST_WLAN_2G_CAP)
+               return pdev_cap->band[NL80211_BAND_2GHZ].phy_id;
+
+       if (band == WMI_HOST_WLAN_5G_CAP)
+               return pdev_cap->band[NL80211_BAND_5GHZ].phy_id;
+
+       ath11k_warn(ar->ab, "unsupported phy cap:%d\n", band);
+
+       return 0;
+}
+
 static int ath11k_mac_setup_channels_rates(struct ath11k *ar,
                                           u32 supported_bands)
 {
        struct ieee80211_supported_band *band;
        struct ath11k_hal_reg_capabilities_ext *reg_cap;
        void *channels;
+       u32 phy_id;
 
        BUILD_BUG_ON((ARRAY_SIZE(ath11k_2ghz_channels) +
                      ARRAY_SIZE(ath11k_5ghz_channels) +
                band->n_bitrates = ath11k_g_rates_size;
                band->bitrates = ath11k_g_rates;
                ar->hw->wiphy->bands[NL80211_BAND_2GHZ] = band;
+
+               if (ar->ab->hw_params.single_pdev_only) {
+                       phy_id = ath11k_get_phy_id(ar, WMI_HOST_WLAN_2G_CAP);
+                       reg_cap = &ar->ab->hal_reg_cap[phy_id];
+               }
                ath11k_mac_update_ch_list(ar, band,
                                          reg_cap->low_2ghz_chan,
                                          reg_cap->high_2ghz_chan);
                        band->n_bitrates = ath11k_a_rates_size;
                        band->bitrates = ath11k_a_rates;
                        ar->hw->wiphy->bands[NL80211_BAND_5GHZ] = band;
+
+                       if (ar->ab->hw_params.single_pdev_only) {
+                               phy_id = ath11k_get_phy_id(ar, WMI_HOST_WLAN_5G_CAP);
+                               reg_cap = &ar->ab->hal_reg_cap[phy_id];
+                       }
+
                        ath11k_mac_update_ch_list(ar, band,
                                                  reg_cap->low_5ghz_chan,
                                                  reg_cap->high_5ghz_chan);
 
        mac_phy_caps = wmi_mac_phy_caps + phy_idx;
 
        pdev->pdev_id = mac_phy_caps->pdev_id;
-       pdev_cap->supported_bands = mac_phy_caps->supported_bands;
+       pdev_cap->supported_bands |= mac_phy_caps->supported_bands;
        pdev_cap->ampdu_density = mac_phy_caps->ampdu_density;
 
        /* Take non-zero tx/rx chainmask. If tx/rx chainmask differs from
        pdev_cap->rx_chain_mask_shift =
                        find_first_bit((unsigned long *)&pdev_cap->rx_chain_mask, 32);
 
-       cap_band = &pdev_cap->band[NL80211_BAND_2GHZ];
-       cap_band->max_bw_supported = mac_phy_caps->max_bw_supported_2g;
-       cap_band->ht_cap_info = mac_phy_caps->ht_cap_info_2g;
-       cap_band->he_cap_info[0] = mac_phy_caps->he_cap_info_2g;
-       cap_band->he_cap_info[1] = mac_phy_caps->he_cap_info_2g_ext;
-       cap_band->he_mcs = mac_phy_caps->he_supp_mcs_2g;
-       memcpy(cap_band->he_cap_phy_info, &mac_phy_caps->he_cap_phy_info_2g,
-              sizeof(u32) * PSOC_HOST_MAX_PHY_SIZE);
-       memcpy(&cap_band->he_ppet, &mac_phy_caps->he_ppet2g,
-              sizeof(struct ath11k_ppe_threshold));
-
-       cap_band = &pdev_cap->band[NL80211_BAND_5GHZ];
-       cap_band->max_bw_supported = mac_phy_caps->max_bw_supported_5g;
-       cap_band->ht_cap_info = mac_phy_caps->ht_cap_info_5g;
-       cap_band->he_cap_info[0] = mac_phy_caps->he_cap_info_5g;
-       cap_band->he_cap_info[1] = mac_phy_caps->he_cap_info_5g_ext;
-       cap_band->he_mcs = mac_phy_caps->he_supp_mcs_5g;
-       memcpy(cap_band->he_cap_phy_info, &mac_phy_caps->he_cap_phy_info_5g,
-              sizeof(u32) * PSOC_HOST_MAX_PHY_SIZE);
-       memcpy(&cap_band->he_ppet, &mac_phy_caps->he_ppet5g,
-              sizeof(struct ath11k_ppe_threshold));
+       if (mac_phy_caps->supported_bands & WMI_HOST_WLAN_2G_CAP) {
+               cap_band = &pdev_cap->band[NL80211_BAND_2GHZ];
+               cap_band->phy_id = mac_phy_caps->phy_id;
+               cap_band->max_bw_supported = mac_phy_caps->max_bw_supported_2g;
+               cap_band->ht_cap_info = mac_phy_caps->ht_cap_info_2g;
+               cap_band->he_cap_info[0] = mac_phy_caps->he_cap_info_2g;
+               cap_band->he_cap_info[1] = mac_phy_caps->he_cap_info_2g_ext;
+               cap_band->he_mcs = mac_phy_caps->he_supp_mcs_2g;
+               memcpy(cap_band->he_cap_phy_info, &mac_phy_caps->he_cap_phy_info_2g,
+                      sizeof(u32) * PSOC_HOST_MAX_PHY_SIZE);
+               memcpy(&cap_band->he_ppet, &mac_phy_caps->he_ppet2g,
+                      sizeof(struct ath11k_ppe_threshold));
+       }
+
+       if (mac_phy_caps->supported_bands & WMI_HOST_WLAN_5G_CAP) {
+               cap_band = &pdev_cap->band[NL80211_BAND_5GHZ];
+               cap_band->phy_id = mac_phy_caps->phy_id;
+               cap_band->max_bw_supported = mac_phy_caps->max_bw_supported_5g;
+               cap_band->ht_cap_info = mac_phy_caps->ht_cap_info_5g;
+               cap_band->he_cap_info[0] = mac_phy_caps->he_cap_info_5g;
+               cap_band->he_cap_info[1] = mac_phy_caps->he_cap_info_5g_ext;
+               cap_band->he_mcs = mac_phy_caps->he_supp_mcs_5g;
+               memcpy(cap_band->he_cap_phy_info, &mac_phy_caps->he_cap_phy_info_5g,
+                      sizeof(u32) * PSOC_HOST_MAX_PHY_SIZE);
+               memcpy(&cap_band->he_ppet, &mac_phy_caps->he_ppet5g,
+                      sizeof(struct ath11k_ppe_threshold));
+       }
 
        cap_band = &pdev_cap->band[NL80211_BAND_6GHZ];
        cap_band->max_bw_supported = mac_phy_caps->max_bw_supported_5g;
        init_param.hw_mode_id = wmi_sc->preferred_hw_mode;
        init_param.mem_chunks = wmi_sc->mem_chunks;
 
-       if (wmi_sc->preferred_hw_mode == WMI_HOST_HW_MODE_SINGLE)
+       if (wmi_sc->preferred_hw_mode == WMI_HOST_HW_MODE_SINGLE ||
+           ab->hw_params.single_pdev_only)
                init_param.hw_mode_id = WMI_HOST_HW_MODE_MAX;
 
        init_param.num_band_to_mac = ab->num_radios;
                i++;
        }
 
+       ath11k_dbg(soc, ATH11K_DBG_WMI, "preferred_hw_mode:%d\n",
+                  soc->wmi_ab.preferred_hw_mode);
        if (soc->wmi_ab.preferred_hw_mode == WMI_HOST_HW_MODE_MAX)
                return -EINVAL;
 
        struct wmi_tlv_svc_rdy_ext_parse *svc_rdy_ext = data;
        u8 hw_mode_id = svc_rdy_ext->pref_hw_mode_caps.hw_mode_id;
        u32 phy_id_map;
+       int pdev_index = 0;
        int ret;
 
        svc_rdy_ext->soc_hal_reg_caps = (struct wmi_soc_hal_reg_capabilities *)ptr;
                                                            svc_rdy_ext->soc_hal_reg_caps,
                                                            svc_rdy_ext->mac_phy_caps,
                                                            hw_mode_id, soc->num_radios,
-                                                           &soc->pdevs[soc->num_radios]);
+                                                           &soc->pdevs[pdev_index]);
                if (ret) {
                        ath11k_warn(soc, "failed to extract mac caps, idx :%d\n",
                                    soc->num_radios);
 
                soc->num_radios++;
 
+               /* For QCA6390, save mac_phy capability in the same pdev */
+               if (soc->hw_params.single_pdev_only)
+                       pdev_index = 0;
+               else
+                       pdev_index = soc->num_radios;
+
                /* TODO: mac_phy_cap prints */
                phy_id_map >>= 1;
        }
+
+       /* For QCA6390, set num_radios to 1 because host manages
+        * both 2G and 5G radio in one pdev.
+        * Set pdev_id = 0 and 0 means soc level.
+        */
+       if (soc->hw_params.single_pdev_only) {
+               soc->num_radios = 1;
+               soc->pdevs[0].pdev_id = 0;
+       }
+
        return 0;
 }
 
 
        pdev_idx = reg_info->phy_id;
 
-       if (pdev_idx >= ab->num_radios)
-               goto fallback;
+       if (pdev_idx >= ab->num_radios) {
+               if (ab->hw_params.single_pdev_only)
+                       goto mem_free;
+               else
+                       goto fallback;
+       }
 
        /* Avoid multiple overwrites to default regd, during core
         * stop-start after mac registration.
        ab->wmi_ab.ab = ab;
        ab->wmi_ab.preferred_hw_mode = WMI_HOST_HW_MODE_MAX;
 
+       /* It's overwritten when service_ext_ready is handled */
+       if (ab->hw_params.single_pdev_only)
+               ab->wmi_ab.preferred_hw_mode = WMI_HOST_HW_MODE_SINGLE;
+
        /* TODO: Init remaining wmi soc resources required */
        init_completion(&ab->wmi_ab.service_ready);
        init_completion(&ab->wmi_ab.unified_ready);