band = NL80211_BAND_6GHZ;
 
        for_each_ar(ah, ar, i) {
-               /* TODO 5 GHz low high split changes */
-               if (ar->mac.sbands[band].channels)
+               if (ar->mac.sbands[band].channels &&
+                   center_freq >= KHZ_TO_MHZ(ar->freq_range.start_freq) &&
+                   center_freq <= KHZ_TO_MHZ(ar->freq_range.end_freq))
                        return ar;
        }
 
        return 0;
 }
 
+static int ath12k_mac_update_band(struct ath12k *ar,
+                                 struct ieee80211_supported_band *orig_band,
+                                 struct ieee80211_supported_band *new_band)
+{
+       int i;
+
+       if (!orig_band || !new_band)
+               return -EINVAL;
+
+       if (orig_band->band != new_band->band)
+               return -EINVAL;
+
+       for (i = 0; i < new_band->n_channels; i++) {
+               if (new_band->channels[i].flags & IEEE80211_CHAN_DISABLED)
+                       continue;
+               /* An enabled channel in new_band should not be already enabled
+                * in the orig_band
+                */
+               if (WARN_ON(!(orig_band->channels[i].flags &
+                             IEEE80211_CHAN_DISABLED)))
+                       return -EINVAL;
+               orig_band->channels[i].flags &= ~IEEE80211_CHAN_DISABLED;
+       }
+       return 0;
+}
+
 static int ath12k_mac_setup_channels_rates(struct ath12k *ar,
                                           u32 supported_bands,
                                           struct ieee80211_supported_band *bands[])
        u32 phy_id, freq_low, freq_high;
        struct ath12k_hw *ah = ar->ah;
        void *channels;
+       int ret;
 
        BUILD_BUG_ON((ARRAY_SIZE(ath12k_2ghz_channels) +
                      ARRAY_SIZE(ath12k_5ghz_channels) +
                band->channels = channels;
                band->n_bitrates = ath12k_g_rates_size;
                band->bitrates = ath12k_g_rates;
-               bands[NL80211_BAND_2GHZ] = band;
 
                if (ab->hw_params->single_pdev_only) {
                        phy_id = ath12k_get_phy_id(ar, WMI_HOST_WLAN_2GHZ_CAP);
                                          reg_cap->high_2ghz_chan);
 
                ath12k_mac_update_freq_range(ar, freq_low, freq_high);
+
+               if (!bands[NL80211_BAND_2GHZ]) {
+                       bands[NL80211_BAND_2GHZ] = band;
+               } else {
+                       /* Split mac in same band under same wiphy */
+                       ret = ath12k_mac_update_band(ar, bands[NL80211_BAND_2GHZ], band);
+                       if (ret) {
+                               kfree(channels);
+                               band->channels = NULL;
+                               return ret;
+                       }
+                       ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac pdev %u identified as 2 GHz split mac with start freq %d end freq %d",
+                                  ar->pdev->pdev_id,
+                                  KHZ_TO_MHZ(ar->freq_range.start_freq),
+                                  KHZ_TO_MHZ(ar->freq_range.end_freq));
+               }
        }
 
        if (supported_bands & WMI_HOST_WLAN_5GHZ_CAP) {
                        band->channels = channels;
                        band->n_bitrates = ath12k_a_rates_size;
                        band->bitrates = ath12k_a_rates;
-                       bands[NL80211_BAND_6GHZ] = band;
 
                        freq_low = max(reg_cap->low_5ghz_chan,
                                       ab->reg_freq_6ghz.start_freq);
 
                        ath12k_mac_update_freq_range(ar, freq_low, freq_high);
                        ah->use_6ghz_regd = true;
+
+                       if (!bands[NL80211_BAND_6GHZ]) {
+                               bands[NL80211_BAND_6GHZ] = band;
+                       } else {
+                               /* Split mac in same band under same wiphy */
+                               ret = ath12k_mac_update_band(ar,
+                                                            bands[NL80211_BAND_6GHZ],
+                                                            band);
+                               if (ret) {
+                                       kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels);
+                                       ar->mac.sbands[NL80211_BAND_2GHZ].channels = NULL;
+                                       kfree(channels);
+                                       band->channels = NULL;
+                                       return ret;
+                               }
+                               ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac pdev %u identified as 6 GHz split mac with start freq %d end freq %d",
+                                          ar->pdev->pdev_id,
+                                          KHZ_TO_MHZ(ar->freq_range.start_freq),
+                                          KHZ_TO_MHZ(ar->freq_range.end_freq));
+                       }
                }
 
                if (reg_cap->low_5ghz_chan < ATH12K_MIN_6GHZ_FREQ) {
                        band->channels = channels;
                        band->n_bitrates = ath12k_a_rates_size;
                        band->bitrates = ath12k_a_rates;
-                       bands[NL80211_BAND_5GHZ] = band;
 
                        if (ab->hw_params->single_pdev_only) {
                                phy_id = ath12k_get_phy_id(ar, WMI_HOST_WLAN_5GHZ_CAP);
                                                  reg_cap->high_5ghz_chan);
 
                        ath12k_mac_update_freq_range(ar, freq_low, freq_high);
+
+                       if (!bands[NL80211_BAND_5GHZ]) {
+                               bands[NL80211_BAND_5GHZ] = band;
+                       } else {
+                               /* Split mac in same band under same wiphy */
+                               ret = ath12k_mac_update_band(ar,
+                                                            bands[NL80211_BAND_5GHZ],
+                                                            band);
+                               if (ret) {
+                                       kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels);
+                                       ar->mac.sbands[NL80211_BAND_2GHZ].channels = NULL;
+                                       kfree(ar->mac.sbands[NL80211_BAND_6GHZ].channels);
+                                       ar->mac.sbands[NL80211_BAND_2GHZ].channels = NULL;
+                                       kfree(channels);
+                                       band->channels = NULL;
+                                       return ret;
+                               }
+                               ath12k_dbg(ar->ab, ATH12K_DBG_MAC, "mac pdev %u identified as 5 GHz split mac with start freq %d end freq %d",
+                                          ar->pdev->pdev_id,
+                                          KHZ_TO_MHZ(ar->freq_range.start_freq),
+                                          KHZ_TO_MHZ(ar->freq_range.end_freq));
+                       }
                }
        }