Merge "qca-wifi: Replace QDF_MAC_ADDR_STR and QDF_MAC_ADDR_ARRAY"
diff --git a/dp/wifi3.0/dp_tx_capture.c b/dp/wifi3.0/dp_tx_capture.c
index 9946795..fee5546 100644
--- a/dp/wifi3.0/dp_tx_capture.c
+++ b/dp/wifi3.0/dp_tx_capture.c
@@ -115,6 +115,8 @@
 /* Maximum number of retries */
 #define MAX_RETRY_Q_COUNT 20
 
+#define DP_PEER_TX_TID_INIT_DONE_BIT 0
+
 #ifdef WLAN_TX_PKT_CAPTURE_ENH
 
 /* stats counter */
@@ -489,8 +491,11 @@
 
 	for (tid = 0; tid < DP_MAX_TIDS; tid++) {
 		tx_tid = &peer->tx_capture.tx_tid[tid];
-		if (tx_tid->init_done)
+
+		if (qdf_atomic_test_and_set_bit(DP_PEER_TX_TID_INIT_DONE_BIT,
+						&tx_tid->tid_flags))
 			continue;
+
 		tx_tid->tid = tid;
 		qdf_nbuf_queue_init(&tx_tid->defer_msdu_q);
 		qdf_nbuf_queue_init(&tx_tid->msdu_comp_q);
@@ -510,6 +515,8 @@
 			for (i = 0; i < tid; i++) {
 				tx_tid = &peer->tx_capture.tx_tid[i];
 				qdf_mem_free(tx_tid->xretry_ppdu);
+				qdf_atomic_clear_bit(DP_PEER_TX_TID_INIT_DONE_BIT,
+							&tx_tid->tid_flags);
 			}
 			QDF_ASSERT(0);
 			return;
@@ -518,7 +525,6 @@
 		/* spinlock create */
 		qdf_spinlock_create(&tx_tid->tid_lock);
 		qdf_spinlock_create(&tx_tid->tasklet_tid_lock);
-		tx_tid->init_done = 1;
 	}
 
 	peer->tx_capture.is_tid_initialized = 1;
@@ -572,6 +578,11 @@
 
 	for (tid = 0; tid < DP_MAX_TIDS; tid++) {
 		tx_tid = &peer->tx_capture.tx_tid[tid];
+
+		if (!qdf_atomic_test_and_clear_bit(DP_PEER_TX_TID_INIT_DONE_BIT,
+						&tx_tid->tid_flags))
+			continue;
+
 		xretry_ppdu = tx_tid->xretry_ppdu;
 		xretry_user = &xretry_ppdu->user[0];
 
diff --git a/dp/wifi3.0/dp_tx_capture.h b/dp/wifi3.0/dp_tx_capture.h
index 5618d21..6e0e103 100644
--- a/dp/wifi3.0/dp_tx_capture.h
+++ b/dp/wifi3.0/dp_tx_capture.h
@@ -161,7 +161,7 @@
 	uint16_t first_data_seq_ctrl;
 	uint32_t mpdu_cnt;
 	uint32_t mpdu_fcs_ok_bitmap[QDF_MON_STATUS_MPDU_FCS_BMAP_NWORDS];
-	uint8_t init_done;
+	unsigned long tid_flags;
 };
 
 struct dp_peer_tx_capture {
diff --git a/dp/wifi3.0/dp_txrx_me.c b/dp/wifi3.0/dp_txrx_me.c
index c8c2c9c..215e6cb 100644
--- a/dp/wifi3.0/dp_txrx_me.c
+++ b/dp/wifi3.0/dp_txrx_me.c
@@ -210,6 +210,24 @@
 	return QDF_STATUS_E_FAILURE;
 }
 
+/**
+ * dp_tx_prepare_send_igmp_me(): Call to check igmp ,convert mcast to ucast
+ * @vdev: DP VDEV handle
+ * @nbuf: Multicast buffer
+ *
+ * Return: no of packets transmitted
+ */
+QDF_STATUS
+dp_tx_prepare_send_igmp_me(struct dp_vdev *vdev, qdf_nbuf_t nbuf)
+{
+	if (dp_igmp_me_mcast_convert((struct cdp_soc_t *)(vdev->pdev->soc),
+				     vdev->vdev_id, vdev->pdev->pdev_id,
+				     nbuf) > 0)
+		return QDF_STATUS_SUCCESS;
+
+	return QDF_STATUS_E_FAILURE;
+}
+
 /*
  * dp_tx_me_mem_free(): Function to free allocated memory in mcast enahncement
  * pdev: pointer to DP PDEV structure
@@ -249,6 +267,8 @@
  * @nbuf: Multicast nbuf
  * @newmac: Table of the clients to which packets have to be sent
  * @new_mac_cnt: No of clients
+ * @tid: desired tid
+ * @is_igmp: flag to indicate if packet is igmp
  *
  * return: no of converted packets
  */
@@ -256,7 +276,8 @@
 dp_tx_me_send_convert_ucast(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
 			    qdf_nbuf_t nbuf,
 			    uint8_t newmac[][QDF_MAC_ADDR_SIZE],
-			    uint8_t new_mac_cnt)
+			    uint8_t new_mac_cnt, uint8_t tid,
+			    bool is_igmp)
 {
 	struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl);
 	struct dp_pdev *pdev;
@@ -414,12 +435,22 @@
 	msdu_info.num_seg = new_mac_cnt;
 	msdu_info.frm_type = dp_tx_frm_me;
 
-	msdu_info.tid = HTT_INVALID_TID;
-	if (qdf_unlikely(vdev->mcast_enhancement_en > 0) &&
-	    qdf_unlikely(pdev->hmmc_tid_override_en))
-		msdu_info.tid = pdev->hmmc_tid;
+	if (tid == HTT_INVALID_TID) {
+		msdu_info.tid = HTT_INVALID_TID;
+		if (qdf_unlikely(vdev->mcast_enhancement_en > 0) &&
+		    qdf_unlikely(pdev->hmmc_tid_override_en))
+			msdu_info.tid = pdev->hmmc_tid;
+	} else {
+		msdu_info.tid = tid;
+	}
 
-	DP_STATS_INC(vdev, tx_i.mcast_en.ucast, new_mac_cnt);
+	if (is_igmp) {
+		DP_STATS_INC(vdev, tx_i.igmp_mcast_en.igmp_ucast_converted,
+			     new_mac_cnt);
+	} else {
+		DP_STATS_INC(vdev, tx_i.mcast_en.ucast, new_mac_cnt);
+	}
+
 	dp_tx_send_msdu_multiple(vdev, nbuf, &msdu_info);
 
 	while (seg_info_head->next) {
diff --git a/dp/wifi3.0/dp_txrx_me.h b/dp/wifi3.0/dp_txrx_me.h
index a716bdc..c801de7 100644
--- a/dp/wifi3.0/dp_txrx_me.h
+++ b/dp/wifi3.0/dp_txrx_me.h
@@ -21,15 +21,23 @@
 dp_tx_me_send_convert_ucast(struct cdp_soc_t *soc, uint8_t vdev_id,
 			    qdf_nbuf_t nbuf,
 			    uint8_t newmac[][QDF_MAC_ADDR_SIZE],
-			    uint8_t new_mac_cnt);
+			    uint8_t new_mac_cnt, uint8_t tid,
+			    bool is_igmp);
 void dp_tx_me_alloc_descriptor(struct cdp_soc_t *soc, uint8_t pdev_id);
 void dp_tx_me_free_descriptor(struct cdp_soc_t *soc, uint8_t pdev_id);
 void dp_tx_me_exit(struct dp_pdev *pdev);
 QDF_STATUS
 dp_tx_prepare_send_me(struct dp_vdev *vdev, qdf_nbuf_t nbuf);
+QDF_STATUS
+dp_tx_prepare_send_igmp_me(struct dp_vdev *vdev, qdf_nbuf_t nbuf);
 extern int
 dp_me_mcast_convert(struct cdp_soc_t *soc,
 		    uint8_t vdev_id,
 		    uint8_t pdev_id,
 		    qdf_nbuf_t wbuf);
+extern int
+dp_igmp_me_mcast_convert(struct cdp_soc_t *soc,
+			 uint8_t vdev_id,
+			 uint8_t pdev_id,
+			 qdf_nbuf_t wbuf);
 #endif
diff --git a/tools/linux/cfg80211_ven_cmd.h b/tools/linux/cfg80211_ven_cmd.h
index 051a8af..c12fe62 100644
--- a/tools/linux/cfg80211_ven_cmd.h
+++ b/tools/linux/cfg80211_ven_cmd.h
@@ -777,6 +777,8 @@
 	IEEE80211_PARAM_TX_VAP                     = 708, /* Current Tx Vap */
 	IEEE80211_PARAM_FILS_IS_ENABLE            = 709, /* Fils enable frames*/
 	IEEE80211_PARAM_MBSS_TXVDEV                = 710,
+	IEEE80211_PARAM_IGMP_ME      = 711, /* Set IGMP Mcast enhancement option: 0 disable, 1 enable */
+	IEEE80211_PARAM_HLOS_TID_OVERRIDE          = 712,   /* enable/disable hlos tid override support per vap */
 };
 
 enum {
@@ -1235,6 +1237,8 @@
 	OL_ATH_PARAM_ACS_PRECAC_SUPPORT = 457,
 	/* MBSSID AUTO MODE TX VDEV derivation */
 	OL_ATH_PARAM_MBSS_AUTOMODE = 458,
+	/* RNR selective addition */
+	OL_ATH_PARAM_RNR_SELECTIVE_ADD = 459,
 };
 
 #ifdef CONFIG_SUPPORT_LIBROXML
@@ -2211,6 +2215,10 @@
 	{"rxtimeout",           35839, SET_PARAM, 1},
 	{"oce_version_override ",     IEEE80211_PARAM_OCE_VERSION_OVERRIDE, SET_PARAM, 1},
 	{"g_oce_version_override ",   IEEE80211_PARAM_OCE_VERSION_OVERRIDE, GET_PARAM, 0},
+	{"igmpmcasten",         IEEE80211_PARAM_IGMP_ME, SET_PARAM, 1},
+	{"g_igmpmcasten",       IEEE80211_PARAM_IGMP_ME, GET_PARAM, 0},
+	{"hlos_tidoverride ",     IEEE80211_PARAM_HLOS_TID_OVERRIDE, SET_PARAM, 1},
+	{"g_hlos_tidoverride ",     IEEE80211_PARAM_HLOS_TID_OVERRIDE, GET_PARAM, 0},
 };
 
 struct vendor_commands radio_vendor_cmds[] = {
@@ -3134,9 +3142,9 @@
 		OL_ATH_PARAM_SHIFT | OL_ATH_PARAM_NO_BACKHAUL_RADIO, SET_PARAM, 1},
 	{"g_nobckhlradio",
 		OL_ATH_PARAM_SHIFT | OL_ATH_PARAM_NO_BACKHAUL_RADIO, GET_PARAM, 0},
-	{"enable_additional_triplets",
+	{"set_triplets_bw",
 		OL_ATH_PARAM_SHIFT | OL_ATH_PARAM_ENABLE_ADDITIONAL_TRIPLETS, SET_PARAM, 1},
-	{"g_enable_additional_triplets",
+	{"get_triplets_bw",
 		OL_ATH_PARAM_SHIFT | OL_ATH_PARAM_ENABLE_ADDITIONAL_TRIPLETS, GET_PARAM, 0},
 #ifdef QCA_SUPPORT_DFS_CHAN_POSTNOL
 	{"setpostNOLfreq",
@@ -3180,6 +3188,12 @@
 		OL_ATH_PARAM_SHIFT | OL_ATH_PARAM_MBSS_AUTOMODE, SET_PARAM, 1},
 	{"g_mbss_auto",
 		OL_ATH_PARAM_SHIFT | OL_ATH_PARAM_MBSS_AUTOMODE, GET_PARAM, 0},
+	{"selective_rnr_nontx",
+		OL_ATH_PARAM_SHIFT | OL_ATH_PARAM_RNR_SELECTIVE_ADD,
+		SET_PARAM, 1},
+	{"g_selective_rnr_nontx",
+		OL_ATH_PARAM_SHIFT | OL_ATH_PARAM_RNR_SELECTIVE_ADD,
+		GET_PARAM, 0},
 };
 #endif
 #endif
diff --git a/umac/dfs/core/src/misc/dfs_zero_cac.c b/umac/dfs/core/src/misc/dfs_zero_cac.c
index 2134008..3192af4 100644
--- a/umac/dfs/core/src/misc/dfs_zero_cac.c
+++ b/umac/dfs/core/src/misc/dfs_zero_cac.c
@@ -2993,6 +2993,7 @@
 	return false;
 }
 
+#ifdef ATH_SUPPORT_ZERO_CAC_DFS
 enum precac_status_for_chan
 dfs_precac_status_for_channel(struct wlan_dfs *dfs,
 			      struct dfs_channel *deschan)
@@ -3005,6 +3006,7 @@
 
 	return DFS_PRECAC_REQUIRED_CHAN;
 }
+#endif
 
 void dfs_print_precaclists(struct wlan_dfs *dfs)
 {
diff --git a/umac/mlme/conn_mgr/core/src/wlan_cm_blm_main.c b/umac/mlme/conn_mgr/core/src/wlan_cm_blm_main.c
index 08ed235..5d0738f 100644
--- a/umac/mlme/conn_mgr/core/src/wlan_cm_blm_main.c
+++ b/umac/mlme/conn_mgr/core/src/wlan_cm_blm_main.c
@@ -17,7 +17,6 @@
 /**
  * DOC: Implement APIs related to the Blacklist manager
  */
-#if 0
 #include <wlan_objmgr_cmn.h>
 #include <wlan_objmgr_pdev_obj.h>
 #include <wlan_scan_utils_api.h>
@@ -124,4 +123,3 @@
 
 	return CM_BLM_NO_ACTION;
 }
-#endif
diff --git a/umac/mlme/conn_mgr/core/src/wlan_cm_blm_main.h b/umac/mlme/conn_mgr/core/src/wlan_cm_blm_main.h
index 7f84de1..3fa3138 100644
--- a/umac/mlme/conn_mgr/core/src/wlan_cm_blm_main.h
+++ b/umac/mlme/conn_mgr/core/src/wlan_cm_blm_main.h
@@ -20,7 +20,6 @@
 
 #ifndef _WLAN_CM_BLM_MAIN_H_
 #define _WLAN_CM_BLM_MAIN_H_
-#if 0
 #include <wlan_scan_public_structs.h>
 
 /**
@@ -35,4 +34,3 @@
 	bool match;
 };
 #endif
-#endif
diff --git a/umac/mlme/conn_mgr/dispatcher/inc/wlan_cm_blm.h b/umac/mlme/conn_mgr/dispatcher/inc/wlan_cm_blm.h
index e9e932a..22a9eac 100644
--- a/umac/mlme/conn_mgr/dispatcher/inc/wlan_cm_blm.h
+++ b/umac/mlme/conn_mgr/dispatcher/inc/wlan_cm_blm.h
@@ -20,7 +20,6 @@
 
 #ifndef _WLAN_CM_BLM_H_
 #define _WLAN_CM_BLM_H_
-#if 0
 #include <wlan_scan_utils_api.h>
 
 /*
@@ -88,4 +87,3 @@
  */
 qdf_time_t wlan_cm_get_bad_ap_timeout(struct wlan_objmgr_vdev *vdev);
 #endif
-#endif
diff --git a/umac/rnr/inc/wlan_rnr.h b/umac/rnr/inc/wlan_rnr.h
new file mode 100644
index 0000000..e306774
--- /dev/null
+++ b/umac/rnr/inc/wlan_rnr.h
@@ -0,0 +1,157 @@
+/*
+ * Copyright (c) 2020 The Linux Foundation. All rights reserved.
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#ifndef _WLAN_RNR_H_
+#define _WLAN_RNR_H_
+#include <qdf_atomic.h>
+#include <wlan_objmgr_pdev_obj.h>
+
+/**
+ * struct rnr_global_info - Global context for RNR
+ * @vdev_lower_band_cnt:    5ghz/2ghz vdev count
+ * @vdev_6ghz_band_cnt:     6ghz vdev count
+ * @pdev_6ghz_ctx:          6Ghz pdev context
+ */
+struct rnr_global_info {
+	qdf_atomic_t vdev_lower_band_cnt;
+	qdf_atomic_t vdev_6ghz_band_cnt;
+	uint32_t rnr_mbss_idx_map;
+	struct wlan_objmgr_pdev *pdev_6ghz_ctx;
+};
+
+/**
+ * wlan_rnr_lower_band_vdev_inc - Atomic increment of
+ *				  global lower band vdev counter
+ *
+ * API to increment global lower band vdev counter
+ *
+ * Return:void
+ */
+void wlan_rnr_lower_band_vdev_inc(void);
+
+/**
+ * wlan_rnr_lower_band_vdev_dec - Atomic decrement of
+ *				  global lower band vdev counter
+ *
+ * API to decrement global lower band vdev counter
+ *
+ * Return:void
+ */
+void wlan_rnr_lower_band_vdev_dec(void);
+
+/**
+ * wlan_rnr_6ghz_vdev_inc - Atomic increment of
+ *			    6ghz vdev counter
+ *
+ * API to increment of 6Ghz vdev counter
+ *
+ * Return:void
+ */
+void wlan_rnr_6ghz_vdev_inc(void);
+
+/**
+ * wlan_rnr_6ghz_vdev_dec - Atomic decrement of
+ *			    6ghz vdev counter
+ *
+ * API to decrement of 6Ghz vdev counter
+ *
+ * Return:void
+ */
+void wlan_rnr_6ghz_vdev_dec(void);
+
+/**
+ * wlan_global_6ghz_pdev_set - Store 6Ghz pdev in
+ *			       global context
+ *
+ * API to save 6Ghz pdev in global context for
+ * faster access
+ *
+ * Return:void
+ */
+void wlan_global_6ghz_pdev_set(struct wlan_objmgr_pdev *pdev);
+
+/**
+ * wlan_global_6ghz_pdev_destroy - Delete 6Ghz pdev in
+ *				   global context
+ *
+ * API to delete 6Ghz pdev in global context for
+ * faster access
+ *
+ * Return:void
+ */
+void wlan_global_6ghz_pdev_destroy(void);
+
+/**
+ * wlan_lower_band_ap_cnt_get - Get lower band AP count
+ *
+ * API to get lower band vdev from global context for
+ * faster access
+ *
+ * Return: int32_t
+ */
+int32_t wlan_lower_band_ap_cnt_get(void);
+
+/**
+ * wlan_rnr_init_cnt - Initialize counters for
+ *			6Ghz vdev and lower band vdev
+ *
+ * API to initialize atomic counters used for 6Ghz vdev
+ * and lower band vdev
+ *
+ * Return: void
+ */
+void wlan_rnr_init_cnt(void);
+
+/**
+ * wlan_gbl_6ghz_pdev_get - Retrieve 6Ghz pdev pointer
+ *
+ * API to get 6Ghz pdev pointer
+ *
+ * Return: struct wlan_objmgr_pdev
+ */
+struct wlan_objmgr_pdev *wlan_gbl_6ghz_pdev_get(void);
+
+/**
+ * wlan_rnr_set_bss_idx - Set bit corresponding to bss index
+ *
+ * API to set bss index bitmap for adding Non Tx APs
+ * not included in Mbss IE in the RNR IE
+ *
+ * Return: void
+ */
+void wlan_rnr_set_bss_idx(uint32_t bss_idx);
+
+/**
+ * wlan_rnr_get_bss_idx - Get bit corresponding to bss index
+ *
+ * API to Get bss index bitmap for adding Non Tx APs
+ * not included in Mbss IE in the RNR IE
+ *
+ * Return: void
+ */
+uint32_t wlan_rnr_get_bss_idx(void);
+
+/**
+ * wlan_rnr_clear_bss_idx - Clear bits corresponding to bss index map
+ *
+ * API to clear bss index bitmap for adding Non Tx APs
+ * not included in Mbss IE in the RNR IE
+ *
+ * Return: void
+ */
+void wlan_rnr_clear_bss_idx(void);
+
+#endif /* End of _WLAN_RNR_H_ */
diff --git a/umac/rnr/src/wlan_rnr.c b/umac/rnr/src/wlan_rnr.c
new file mode 100644
index 0000000..bfc9ee5
--- /dev/null
+++ b/umac/rnr/src/wlan_rnr.c
@@ -0,0 +1,102 @@
+/*
+ * Copyright (c) 2020 The Linux Foundation. All rights reserved.
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <wlan_rnr.h>
+#include <qdf_module.h>
+#include <qdf_status.h>
+#include <qdf_types.h>
+
+struct rnr_global_info g_rnr_info;
+
+void wlan_rnr_init_cnt(void)
+{
+	qdf_atomic_init(&(g_rnr_info.vdev_lower_band_cnt));
+	qdf_atomic_init(&(g_rnr_info.vdev_6ghz_band_cnt));
+}
+
+qdf_export_symbol(wlan_rnr_init_cnt);
+
+void wlan_rnr_lower_band_vdev_inc(void)
+{
+	qdf_atomic_inc(&(g_rnr_info.vdev_lower_band_cnt));
+}
+
+qdf_export_symbol(wlan_rnr_lower_band_vdev_inc);
+
+void wlan_rnr_lower_band_vdev_dec(void)
+{
+	qdf_atomic_dec(&(g_rnr_info.vdev_lower_band_cnt));
+}
+
+qdf_export_symbol(wlan_rnr_lower_band_vdev_dec);
+
+void wlan_rnr_6ghz_vdev_inc(void)
+{
+	qdf_atomic_inc(&(g_rnr_info.vdev_6ghz_band_cnt));
+}
+
+qdf_export_symbol(wlan_rnr_6ghz_vdev_inc);
+
+void wlan_rnr_6ghz_vdev_dec(void)
+{
+	qdf_atomic_dec(&(g_rnr_info.vdev_6ghz_band_cnt));
+}
+
+qdf_export_symbol(wlan_rnr_6ghz_vdev_dec);
+
+void wlan_global_6ghz_pdev_set(struct wlan_objmgr_pdev *pdev)
+{
+	if (pdev)
+		g_rnr_info.pdev_6ghz_ctx = pdev;
+}
+
+qdf_export_symbol(wlan_global_6ghz_pdev_set);
+
+void wlan_global_6ghz_pdev_destroy(void)
+{
+	g_rnr_info.pdev_6ghz_ctx = NULL;
+}
+
+qdf_export_symbol(wlan_global_6ghz_pdev_destroy);
+
+int32_t wlan_lower_band_ap_cnt_get(void)
+{
+	return qdf_atomic_read(&(g_rnr_info.vdev_lower_band_cnt));
+}
+
+qdf_export_symbol(wlan_lower_band_ap_cnt_get);
+
+struct wlan_objmgr_pdev *wlan_gbl_6ghz_pdev_get(void)
+{
+	return g_rnr_info.pdev_6ghz_ctx;
+}
+
+qdf_export_symbol(wlan_gbl_6ghz_pdev_get);
+
+void wlan_rnr_set_bss_idx(uint32_t bss_idx)
+{
+	g_rnr_info.rnr_mbss_idx_map |= (1 << (bss_idx-1));
+}
+
+uint32_t wlan_rnr_get_bss_idx(void)
+{
+	return g_rnr_info.rnr_mbss_idx_map;
+}
+
+void  wlan_rnr_clear_bss_idx(void)
+{
+	g_rnr_info.rnr_mbss_idx_map = 0;
+}