Merge "[[RDKB][WIFI7][MT7990][SYNC][OSBNB00175215]MTK RDKB Beta2 - DataModel SSID interface order is not in compliance with CcspWiFiAgent]"
diff --git a/src/logan_wifi/wifi_hal.c b/src/logan_wifi/wifi_hal.c
index d8e558a..bb65d56 100644
--- a/src/logan_wifi/wifi_hal.c
+++ b/src/logan_wifi/wifi_hal.c
@@ -307,6 +307,10 @@
 };
 struct mld_configuration mld_config;
 
+wifi_hal_capability_t g_hal_cap;
+
+#define RUNTIME_MAX_RADIO g_phy_count
+
 static int util_unii_5g_centerfreq(const char *ht_mode, int channel);
 static int util_unii_6g_centerfreq(const char *ht_mode, int channel);
 wifi_secur_list *	   wifi_get_item_by_key(wifi_secur_list *list, int list_sz, int key);
@@ -582,6 +586,7 @@
 static char l1profile[32] = "/etc/wireless/l1profile.dat";
 char main_prefix[MAX_NUM_RADIOS][IFNAMSIZ];
 char ext_prefix[MAX_NUM_RADIOS][IFNAMSIZ];
+int g_phy_count = 0;
 #define MAX_SSID_LEN  64
 char default_ssid[MAX_NUM_RADIOS][MAX_SSID_LEN];;
 int radio_band[MAX_NUM_RADIOS];
@@ -690,8 +695,8 @@
 #define WMODE_CAP_2G(_x) \
 (((_x) & (WMODE_B | WMODE_G | WMODE_GN | WMODE_AX_24G | WMODE_BE_24G)) != 0)
 
-static int array_index_to_vap_index(UINT radioIndex, int arrayIndex);
-static int vap_index_to_array_index(int vapIndex, int *radioIndex, int *arrayIndex);
+static int array_index_to_vap_index(UINT radioIndex, int arrayIndex, int *vap_index);
+static int vap_index_to_radio_array_index(int vapIndex, int *radioIndex, int *arrayIndex);
 static int wifi_datfileRead(char *conf_file, char *param, char *output, int output_size);
 int hwaddr_aton2(const char *txt, unsigned char *addr);
 static int wifi_GetInterfaceName(int apIndex, char *interface_name);
@@ -702,7 +707,7 @@
 								char *output,
 								int output_size,
 								char *default_value);
-static int array_index_to_vap_index(UINT radioIndex, int arrayIndex);
+static int array_index_to_vap_index(UINT radioIndex, int arrayIndex, int *vap_index);
 struct params
 {
 	char * name;
@@ -835,6 +840,7 @@
 	char *token;
 	long mld_index;
 	unsigned char ap_index;
+	int vap_idx;
 	struct multi_link_device *mld;
 	BOOL ap_enable = 0;
 	struct bss_mlo_info ml_info;
@@ -842,7 +848,7 @@
 	wifi_debug(DEBUG_ERROR, "==========>\n");
 
 	memset(&mld_config, 0, sizeof(mld_config));
-	for (band = 0; band < MAX_NUM_RADIOS; band++) {
+	for (band = 0; band < RUNTIME_MAX_RADIO; band++) {
 		res = snprintf(config_file, sizeof(config_file), "%s%d.dat", LOGAN_DAT_FILE, band);
 		if (os_snprintf_error(sizeof(config_file), res)) {
 			wifi_debug(DEBUG_ERROR, "Unexpected snprintf fail\n");
@@ -866,8 +872,11 @@
 			}
 
 			mld_set(mld_index, 1);
-			ap_index = array_index_to_vap_index(band, bss_idx);
-
+			if (array_index_to_vap_index(band, bss_idx, &vap_idx) != RETURN_OK) {
+				wifi_debug(DEBUG_ERROR, "invalid band %d, bss_idx %d, skip it.\n", band, bss_idx);
+				continue;
+			}
+			ap_index = vap_idx;
 			mld = &(mld_config.mld[mld_index]);
 			mld->mld_index = mld_index;
 //			mld->type = mld_index <= MAX_ML_MLD_CNT ? AP_MLD_MULTI_LINK : AP_MLD_SINGLE_LINK;
@@ -1047,12 +1056,11 @@
 
 INT wifi_eht_add_to_ap_mld(unsigned char mld_index, INT ap_index)
 {
-	int res;
+	int res, radio1, radio2, bss_idx;
 //	enum mld_type type;
 	struct multi_link_device *mld;
 	char interface_name[IF_NAME_SIZE] = {0};
 	unsigned char i;
-	int max_radio_num;
 
 	if (ap_index < 0 || ap_index >= MAX_APS) {
 		wifi_debug(DEBUG_ERROR, "invalid ap_index %d\n", ap_index);
@@ -1096,17 +1104,24 @@
 	} else if (mld->type == AP_MLD_MULTI_LINK) {
 #endif
 		/*check if a same band ap already has been joined before*/
-	wifi_getMaxRadioNumber(&max_radio_num);
-	if(max_radio_num == 0){
-		return RETURN_ERR;
-	}
 	for (i = 0; i < MAX_APS; i++) {
 		if(mld_ap_test(mld, i)) {
 			if (i == ap_index) {
 				wifi_debug(DEBUG_ERROR, "current ap(index=%d) has already joined current mld\n", i);
 				return RETURN_OK;
 			}
+
+			if (vap_index_to_radio_array_index(i, &radio1, &bss_idx) != RETURN_OK) {
+				wifi_debug(DEBUG_ERROR, "invalid vap index %d\n", i);
+				return RETURN_ERR;
+			}
+
+			if (vap_index_to_radio_array_index(ap_index, &radio2, &bss_idx) != RETURN_OK) {
+				wifi_debug(DEBUG_ERROR, "invalid vap index %d\n", i);
+				return RETURN_ERR;
+			}
-			if ((i % max_radio_num) == (ap_index % max_radio_num)) {
+
+			if (radio1 == radio2) {
 				wifi_debug(DEBUG_ERROR, "same band ap(index=%d) has already joined current mld\n", i);
 				return RETURN_ERR;
 			}
@@ -1198,12 +1213,11 @@
 INT wifi_eht_mld_ap_transfer(unsigned char old_mld_index,
 	unsigned char new_mld_index, INT ap_index)
 {
-	int res;
+	int res, radio1, radio2, bss_idx;
 //	enum mld_type type;
 	struct multi_link_device *mld, *old_mld;
 	char interface_name[IF_NAME_SIZE] = {0};
 	unsigned char i;
-	int max_radio_num;
 
 	if (old_mld_index == new_mld_index) {
 		wifi_debug(DEBUG_ERROR, "same mld index %d\n", new_mld_index);
@@ -1245,17 +1259,25 @@
 
 	mld = &(mld_config.mld[new_mld_index]);
 
-	wifi_getMaxRadioNumber(&max_radio_num);
-	if(max_radio_num == 0){
-		return RETURN_ERR;
-	}
+
 	for (i = 0; i < MAX_APS; i++) {
 		if(mld_ap_test(mld, i)) {
 			if (i == ap_index) {
 				wifi_debug(DEBUG_ERROR, "current ap has already joined current mld\n");
 				return RETURN_OK;
 			}
+
+			if (vap_index_to_radio_array_index(i, &radio1, &bss_idx) != RETURN_OK) {
+				wifi_debug(DEBUG_ERROR, "invalid vap index %d\n", i);
+				return RETURN_ERR;
+			}
+
+			if (vap_index_to_radio_array_index(ap_index, &radio2, &bss_idx) != RETURN_OK) {
+				wifi_debug(DEBUG_ERROR, "invalid vap index %d\n", i);
+				return RETURN_ERR;
+			}
-			if ((i % max_radio_num) == (ap_index % max_radio_num)) {
+
+			if (radio1 == radio2) {
 				wifi_debug(DEBUG_ERROR, "same band ap(index=%d) has already joined current mld\n", i);
 				return RETURN_ERR;
 			}
@@ -1282,7 +1304,7 @@
 	int res, vap_index, len = 0, bssidnum;
 	struct params MldGroup;
 
-	if (band >= MAX_NUM_RADIOS) {
+	if (band >= RUNTIME_MAX_RADIO) {
 		wifi_debug(DEBUG_ERROR, "invalid band %u\n", band);
 		return RETURN_ERR;
 	}
@@ -1310,8 +1332,7 @@
 	}
 
 	for (bss_idx = 0; bss_idx < bssidnum; bss_idx++) {
-		vap_index = array_index_to_vap_index(band, bss_idx);
-		if (vap_index == RETURN_ERR) {
+		if (array_index_to_vap_index(band, bss_idx, &vap_index) != RETURN_OK) {
 			wifi_debug(DEBUG_ERROR, "invalide vap index, band=%d, bss_idx=%d\n", (int)band, (int)bss_idx);
 			break;
 		}
@@ -1336,7 +1357,7 @@
 {
 	unsigned char band;
 
-	for (band = 0; band < MAX_NUM_RADIOS; band++) {
+	for (band = 0; band < RUNTIME_MAX_RADIO; band++) {
 		wifi_eht_config_sync2_dat_by_radio(band);
 	}
 }
@@ -1671,17 +1692,16 @@
 	long int nl80211_band = 0;
 	int i = 0;
 	int phyIndex = 0;
-	int radioIndex = 0;
-	int max_radio_num = 0;
+	int radioIndex = 0, bss_idx;
 	wifi_band band = band_invalid;
 	int res;
 	WIFI_ENTRY_EXIT_DEBUG("Inside %s:%d\n",__func__, __LINE__);
 
-	wifi_getMaxRadioNumber(&max_radio_num);
-	if(max_radio_num == 0){
+	if (vap_index_to_radio_array_index(apIndex, &radioIndex, &bss_idx) != RETURN_OK) {
+		wifi_debug(DEBUG_ERROR, "invalid vap index %d\n", apIndex);
 		return RETURN_ERR;
 	}
-	radioIndex = apIndex % max_radio_num;
+
 	phyIndex = radio_index_to_phy(radioIndex);
 	while (i < 10) {
 		res = _syscmd_secure(buf, sizeof(buf),
@@ -1920,8 +1940,13 @@
 	char buf[MAX_CMD_SIZE]={'\0'};
 	UCHAR channel = 0;
 	int res;
+	int main_vap_idx;
 
-	if (wifi_GetInterfaceName(radio_index, interface_name) != RETURN_OK)
+	if (array_index_to_vap_index(radio_index, 0, &main_vap_idx) != RETURN_OK) {
+		wifi_debug(DEBUG_ERROR, "invalid radio_index[%d]\n", radio_index);
+	}
+
+	if (wifi_GetInterfaceName(main_vap_idx, interface_name) != RETURN_OK)
 		return RETURN_ERR;
 	/*interface name to channel number*/
 	res = _syscmd_secure(buf, sizeof(buf), "iw dev %s info | grep -i 'channel' | cut -d ' ' -f2", interface_name);
@@ -2492,7 +2517,7 @@
 			}
 			if (get_value(card_profile, buf, band_profile, sizeof(band_profile)) < 0) {
 				/* LOG */
-				break;
+				continue;
 			}
 
 			res = snprintf(buf, sizeof(buf), "INDEX%d_main_ifname", card_idx);
@@ -2524,6 +2549,7 @@
 			wmode = cfgmode_to_wmode(wireless_mode);
 			radio_band[phy_idx] = wlan_config_set_ch_band(wmode);
 			phy_idx++;
+			g_phy_count = phy_idx;
 		}
 	}
 
@@ -2548,7 +2574,10 @@
 	for (radio_idx = 0; radio_idx < MAX_NUM_RADIOS; radio_idx++) {
 
 		for (bss_idx = 0; bss_idx < LOGAN_MAX_NUM_VAP_PER_RADIO; bss_idx++) {
-			ap_idx = array_index_to_vap_index(radio_idx, bss_idx);
+			if (array_index_to_vap_index(radio_idx, bss_idx, &ap_idx) != RETURN_OK) {
+				wifi_debug(DEBUG_ERROR, "invalid radio_idx %d, bss_idx %d\n", radio_idx, bss_idx);
+				continue;
+			}
 
 			res = snprintf(config_file, sizeof(config_file), "%s%d.conf", CONFIG_PREFIX, ap_idx);
 			if (os_snprintf_error(sizeof(config_file), res)) {
@@ -2643,7 +2672,10 @@
 	wifi_debug(DEBUG_ERROR, "band %d BssidNum %d\n", radio_idx, bss_num);
 	/*TBD: we need refine setup flow and mbss flow*/
     for (bss_idx = 0; bss_idx < bss_num; bss_idx++) {
-		ap_idx = array_index_to_vap_index(radio_idx, bss_idx);
+		if (array_index_to_vap_index(radio_idx, bss_idx, &ap_idx) != RETURN_OK) {
+			wifi_debug(DEBUG_ERROR, "invalid radio_idx %d, bss_idx %d\n", radio_idx, bss_idx);
+			continue;
+		}
 
 		res = _syscmd_secure(ret_buf, sizeof(ret_buf), "touch %s%d.psk", PSK_FILE, ap_idx);
 		if (res) {
@@ -2688,7 +2720,7 @@
     int band_idx;
 
     WIFI_ENTRY_EXIT_DEBUG("Inside %s:%d\n",__func__, __LINE__);
-    for (radio_idx = 0; radio_idx < MAX_NUM_RADIOS; radio_idx++) {
+    for (radio_idx = 0; radio_idx < RUNTIME_MAX_RADIO; radio_idx++) {
         band_idx = radio_index_to_band(radio_idx);
         if (band_idx < 0) {
             break;
@@ -2723,7 +2755,7 @@
 	int band_idx;
 
 	WIFI_ENTRY_EXIT_DEBUG("Inside %s:%d\n",__func__, __LINE__);
-	for (radio_idx = 0; radio_idx < MAX_NUM_RADIOS; radio_idx++) {
+	for (radio_idx = 0; radio_idx < RUNTIME_MAX_RADIO; radio_idx++) {
 		band_idx = radio_index_to_band(radio_idx);
 		if (band_idx < 0) {
 			break;
@@ -2847,10 +2879,8 @@
 	unsigned char i = 0;
 	char file[MAX_SUB_CMD_SIZE] = {0};
 	FILE *f = NULL;
-	INT radio_num = 0;
 
-	wifi_getMaxRadioNumber(&radio_num);
-	for (i = 0; i < radio_num; i++) {
+	for (i = 0; i < RUNTIME_MAX_RADIO; i++) {
 		res = snprintf(file, sizeof(file), "%s%d.txt", GUARD_INTERVAL_FILE, i);
 		if (os_snprintf_error(sizeof(file), res)) {
 			wifi_debug(DEBUG_ERROR, "Unexpected snprintf fail\n");
@@ -2907,10 +2937,8 @@
 	unsigned char i = 0;
 	char file[MAX_SUB_CMD_SIZE] = {0};
 	FILE *f = NULL;
-	INT radio_num = 0;
 
-	wifi_getMaxRadioNumber(&radio_num);
-	for (i = 0; i < radio_num; i++) {
+	for (i = 0; i < RUNTIME_MAX_RADIO; i++) {
 		res = snprintf(file, sizeof(file), "%s%d.txt", MCS_FILE, i);
 		if (os_snprintf_error(sizeof(file), res)) {
 			wifi_debug(DEBUG_ERROR, "Unexpected snprintf fail\n");
@@ -3044,10 +3072,7 @@
 INT wifi_down()
 {
 	//TODO: turns off transmit power for the entire Wifi subsystem, for all radios
-	int max_num_radios = 0;
-	wifi_getMaxRadioNumber(&max_num_radios);
-
-	for (int radioIndex = 0; radioIndex < max_num_radios; radioIndex++)
+	for (int radioIndex = 0; radioIndex < RUNTIME_MAX_RADIO; radioIndex++)
 		wifi_setRadioEnable(radioIndex, FALSE);
 
 	return RETURN_OK;
@@ -3161,10 +3186,15 @@
 	unsigned long tmp_ul;
 	size_t len = 0;
 	FILE *f = NULL;
+	int main_vap_idx;
 
 	WIFI_ENTRY_EXIT_DEBUG("Inside %s:%d\n",__func__, __LINE__);
 
-	if (wifi_GetInterfaceName(radioIndex, interface_name) != RETURN_OK)
+	if (array_index_to_vap_index(radioIndex, 0, &main_vap_idx) != RETURN_OK) {
+		wifi_debug(DEBUG_ERROR, "invalid radio_index[%d]\n", radioIndex);
+	}
+
+	if (wifi_GetInterfaceName(main_vap_idx, interface_name) != RETURN_OK)
 		return RETURN_ERR;
 
 	res = _syscmd_secure(buf, sizeof(buf), "iw %s scan | grep signal | awk '{print $2}' | sort -n | tail -n1", interface_name);
@@ -3302,7 +3332,7 @@
 {
 	if (NULL == output)
 		return RETURN_ERR;
-	*output = MAX_NUM_RADIOS;
+	*output = RUNTIME_MAX_RADIO;
 
 	return RETURN_OK;
 }
@@ -3322,22 +3352,20 @@
 {
 	char interface_name[16] = {0};
 	char buf[128] = {0};
-	int apIndex;
-	int max_radio_num = 0;
+	int apIndex, bss_idx;
 
 	if (NULL == output_bool)
 		return RETURN_ERR;
 
 	*output_bool = FALSE;
 
-	wifi_getMaxRadioNumber(&max_radio_num);
-
-	if (radioIndex >= max_radio_num)
-		return RETURN_ERR;
-
 	/* loop all interface in radio, if any is enable, reture true, else return false */
-	for(apIndex = radioIndex; apIndex < MAX_APS; apIndex += max_radio_num)
+	for (bss_idx = 0; bss_idx < LOGAN_MAX_NUM_VAP_PER_RADIO; bss_idx++)
 	{
+		if (array_index_to_vap_index(radioIndex, bss_idx, &apIndex) != RETURN_OK) {
+			wifi_debug(DEBUG_ERROR, "invalid radioIndex %d, bss_idx %d\n", radioIndex, bss_idx);
+			continue;
+		}
 		if (wifi_GetInterfaceName(apIndex, interface_name) != RETURN_OK)
 			continue;
 
@@ -3503,19 +3531,21 @@
 {
 	char interface_name[16] = {0};
 	char buf[MAX_BUF_SIZE] = {0};
-	int apIndex;
-	int max_radio_num = 0;
+	int apIndex, bss_idx;
 	int phyId = 0, res;
+	int main_vap_idx;
 
 	WIFI_ENTRY_EXIT_DEBUG("Inside %s:%d\n",__func__, __LINE__);
 
 	phyId = radio_index_to_phy(radioIndex);
 
-	wifi_getMaxRadioNumber(&max_radio_num);
-
 	if(enable == FALSE) {
 
+		if (array_index_to_vap_index(radioIndex, 0, &main_vap_idx) != RETURN_OK) {
+			wifi_debug(DEBUG_ERROR, "invalid radio_index[%d]\n", radioIndex);
+		}
+
-		if (wifi_GetInterfaceName(radioIndex, interface_name) != RETURN_OK)
+		if (wifi_GetInterfaceName(main_vap_idx, interface_name) != RETURN_OK)
 			return RETURN_ERR;
 
 
@@ -3533,9 +3563,15 @@
 		if(strncmp(buf, "OK", 2))
 			wifi_debug(DEBUG_ERROR, "Could not detach %s from hostapd daemon", interface_name);
 	} else {
-		for (apIndex = radioIndex; apIndex < MAX_APS; apIndex += max_radio_num) {
-			if (wifi_GetInterfaceName(apIndex, interface_name) != RETURN_OK)
+		for (bss_idx = 0; bss_idx < LOGAN_MAX_NUM_VAP_PER_RADIO; bss_idx++) {
+			if (array_index_to_vap_index(radioIndex, bss_idx, &apIndex) != RETURN_OK) {
+				wifi_debug(DEBUG_ERROR, "invalid radioIndex %d, bss_idx %d\n", radioIndex, bss_idx);
+				continue;
+			}
+			if (wifi_GetInterfaceName(apIndex, interface_name) != RETURN_OK) {
+				wifi_debug(DEBUG_ERROR, "!!!Fail to get name of apIndex[%d]\n", apIndex);
 				return RETURN_ERR;
+			}
 
 			memset(buf, 0, MAX_BUF_SIZE);
 
@@ -3581,9 +3617,15 @@
 //Get the Radio Interface name from platform, eg "wlan0"
 INT wifi_getRadioIfName(INT radioIndex, CHAR *output_string) //Tr181
 {
-	if (NULL == output_string || radioIndex>=MAX_NUM_RADIOS || radioIndex<0)
+	int main_vap_idx;
+
+	if (NULL == output_string || radioIndex>=RUNTIME_MAX_RADIO || radioIndex<0)
 		return RETURN_ERR;
-	return wifi_GetInterfaceName(radioIndex, output_string);
+
+	if (array_index_to_vap_index(radioIndex, 0, &main_vap_idx) != RETURN_OK) {
+		wifi_debug(DEBUG_ERROR, "invalid radio_index[%d]\n", radioIndex);
+	}
+	return wifi_GetInterfaceName(main_vap_idx, output_string);
 }
 
 int mtk_get_vow_info_callback(struct nl_msg *msg, void *data)
@@ -3684,7 +3726,6 @@
 
 INT wifi_setATMEnable(BOOL enable)
 {
-	int max_radio_num = 0;
 	int radio_idx = 0;
 	int bss_idx;
 	char dat_file[MAX_BUF_SIZE] = {0};
@@ -3692,8 +3733,7 @@
 	struct params params[3];
 	struct vow_group_en_param atc_en_param;
 
-	wifi_getMaxRadioNumber(&max_radio_num);
-	for (radio_idx = 0; radio_idx < max_radio_num; radio_idx++) {
+	for (radio_idx = 0; radio_idx < RUNTIME_MAX_RADIO; radio_idx++) {
 		if (mtk_wifi_set_air_time_management
 			(radio_idx, MTK_NL80211_VENDOR_ATTR_AP_VOW_ATF_EN_INFO,
 			NULL, (char *)&enable, 1, NULL)!= RETURN_OK) {
@@ -3740,7 +3780,6 @@
 
 INT wifi_getATMEnable(BOOL *output_enable)
 {
-	int max_radio_num = 0;
 	int radio_idx = 0;
 	struct vow_info vow_info;
 	struct vow_info get_vow_info;
@@ -3749,7 +3788,6 @@
 	if (output_enable == NULL)
 		return RETURN_ERR;
 
-	wifi_getMaxRadioNumber(&max_radio_num);
 
 	*output_enable = FALSE;
 
@@ -3758,7 +3796,7 @@
 	cb_data.out_buf = (char *)&vow_info;
 	cb_data.out_len = sizeof(struct vow_info);
 
-	for (radio_idx = 0; radio_idx < max_radio_num; radio_idx++) {
+	for (radio_idx = 0; radio_idx < RUNTIME_MAX_RADIO; radio_idx++) {
 		if (mtk_wifi_set_air_time_management
 			(radio_idx, MTK_NL80211_VENDOR_ATTR_AP_VOW_GET_INFO,
 			mtk_get_vow_info_callback, (char *)&get_vow_info, sizeof(struct vow_info), &cb_data)!= RETURN_OK) {
@@ -4426,12 +4464,18 @@
 	struct nlattr * msg_data = NULL;
 	struct mtk_nl80211_param param;
 	struct mtk_nl80211_cb_data cb_data;
+	int main_vap_idx;
 
 	WIFI_ENTRY_EXIT_DEBUG("Inside %s:%d\n",__func__, __LINE__);
 	if (NULL == output_string || NULL == pureMode)
 		return RETURN_ERR;
 
-	if (wifi_GetInterfaceName(radioIndex, interface_name) != RETURN_OK)
+	if (array_index_to_vap_index(radioIndex, 0, &main_vap_idx) != RETURN_OK) {
+		wifi_debug(DEBUG_ERROR, "invalid radio_index[%d]\n", radioIndex);
+		return RETURN_ERR;
+	}
+
+	if (wifi_GetInterfaceName(main_vap_idx, interface_name) != RETURN_OK)
 		return RETURN_ERR;
 
 	if_idx = if_nametoindex(interface_name);
@@ -4634,6 +4678,7 @@
 	char dat_file[MAX_BUF_SIZE] = {0};
 	struct params params={0};
 	int res;
+	int main_vap_idx;
 
 	WIFI_ENTRY_EXIT_DEBUG("Inside %s_%s:%d_%d\n", __func__, channelMode, pureMode, __LINE__);
 
@@ -4644,7 +4689,12 @@
 		return RETURN_ERR;
 	}
 
-	if (wifi_GetInterfaceName(radioIndex, interface_name) != RETURN_OK)
+	if (array_index_to_vap_index(radioIndex, 0, &main_vap_idx) != RETURN_OK) {
+		wifi_debug(DEBUG_ERROR, "invalid radio_index[%d]\n", radioIndex);
+		return RETURN_ERR;
+	}
+
+	if (wifi_GetInterfaceName(main_vap_idx, interface_name) != RETURN_OK)
 		return RETURN_ERR;
 
 	if_idx = if_nametoindex(interface_name);
@@ -5051,10 +5101,16 @@
 	struct nlattr * msg_data = NULL;
 	struct mtk_nl80211_param param;
 	UCHAR ext_ch = EXT_NONE;
+	int main_vap_idx;
 
 	WIFI_ENTRY_EXIT_DEBUG("Inside %s:%d\n",__func__, __LINE__);
 
-	if (wifi_GetInterfaceName(radioIndex, interface_name) != RETURN_OK)
+	if (array_index_to_vap_index(radioIndex, 0, &main_vap_idx) != RETURN_OK) {
+		wifi_debug(DEBUG_ERROR, "invalid radio_index[%d]\n", radioIndex);
+		return RETURN_ERR;
+	}
+
+	if (wifi_GetInterfaceName(main_vap_idx, interface_name) != RETURN_OK)
 		return RETURN_ERR;
 
 	if_idx = if_nametoindex(interface_name);
@@ -5498,7 +5554,7 @@
 	struct params list[2];
 	char str_idx[16];
 	char config_file[64];
-	int max_num_radios = 0, res;
+	int res, bss_idx, vap_idx;
 	wifi_band band = band_invalid;
 
 	band = wifi_index_to_band(radioIndex);
@@ -5516,13 +5572,13 @@
 	list[1].name = "he_oper_centr_freq_seg0_idx";
 	list[1].value = str_idx;
 
-	wifi_getMaxRadioNumber(&max_num_radios);
-	if(max_num_radios== 0){
-		return RETURN_ERR;
-	}
-	for(int i=0; i<=MAX_APS/max_num_radios; i++)
+	for (bss_idx = 0; bss_idx < LOGAN_MAX_NUM_VAP_PER_RADIO; bss_idx++)
 	{
-		res = snprintf(config_file, sizeof(config_file), "%s%d.conf", CONFIG_PREFIX, radioIndex+(max_num_radios*i));
+		if (array_index_to_vap_index(radioIndex, bss_idx, &vap_idx) != RETURN_OK) {
+			wifi_debug(DEBUG_ERROR, "invalid radioIndex[%d], bss_idx[%d]\n", radioIndex, bss_idx);
+			return RETURN_ERR;
+		}
+		res = snprintf(config_file, sizeof(config_file), "%s%d.conf", CONFIG_PREFIX, vap_idx);
 		if (os_snprintf_error(sizeof(config_file), res)) {
 			wifi_debug(DEBUG_ERROR, "Unexpected snprintf fail\n");
 			return RETURN_ERR;
@@ -5646,7 +5702,7 @@
 
 	memset(ret_buf, 0, sizeof(ret_buf));
 
-	vap_index_to_array_index(apIndex, &radio_idx, &bss_idx);
+	vap_index_to_radio_array_index(apIndex, &radio_idx, &bss_idx);
 
 	/*prepare new config file*/
 
@@ -6069,12 +6125,18 @@
 	struct nlattr * msg_data = NULL;
 	struct mtk_nl80211_param param;
 	unsigned long checktime = 0;
+	int main_vap_idx;
 
 	WIFI_ENTRY_EXIT_DEBUG("Inside %s:%d\n",__func__, __LINE__);
 	if (NULL == output_ulong)
 		return RETURN_ERR;
 
-	if (wifi_GetInterfaceName(radioIndex, interface_name) != RETURN_OK)
+	if (array_index_to_vap_index(radioIndex, 0, &main_vap_idx) != RETURN_OK) {
+		wifi_debug(DEBUG_ERROR, "invalid radio_index[%d]\n", radioIndex);
+		return RETURN_ERR;
+	}
+
+	if (wifi_GetInterfaceName(main_vap_idx, interface_name) != RETURN_OK)
 		return RETURN_ERR;
 
 	if_idx = if_nametoindex(interface_name);
@@ -6131,10 +6193,16 @@
 	struct nl_msg *msg  = NULL;
 	struct nlattr * msg_data = NULL;
 	struct mtk_nl80211_param param;
+	int main_vap_idx;
 
 	WIFI_ENTRY_EXIT_DEBUG("Inside %s:%d\n",__func__, __LINE__);
 
-	if (wifi_GetInterfaceName(radioIndex, interface_name) != RETURN_OK)
+	if (array_index_to_vap_index(radioIndex, 0, &main_vap_idx) != RETURN_OK) {
+		wifi_debug(DEBUG_ERROR, "invalid radio_index[%d]\n", radioIndex);
+		return RETURN_ERR;
+	}
+
+	if (wifi_GetInterfaceName(main_vap_idx, interface_name) != RETURN_OK)
 		return RETURN_ERR;
 
 	if_idx = if_nametoindex(interface_name);
@@ -6509,6 +6577,7 @@
 	int centr_channel = 0;
 	UINT mode_map = 0;
 	int freq=0, res;
+	int main_vap_idx;
 
 	if (output_string == NULL)
 		return RETURN_ERR;
@@ -6520,10 +6589,16 @@
 	band = wifi_index_to_band(radioIndex);
 	if (band == band_invalid)
 		return RETURN_ERR;
-	if (wifi_GetInterfaceName(radioIndex, interface_name) != RETURN_OK)
+
+	if (array_index_to_vap_index(radioIndex, 0, &main_vap_idx) != RETURN_OK) {
+		wifi_debug(DEBUG_ERROR, "invalid radio_index[%d]\n", radioIndex);
 		return RETURN_ERR;
+	}
 
-	res = snprintf(config_file, sizeof(config_file), "%s%d.conf", CONFIG_PREFIX, radioIndex);
+	if (wifi_GetInterfaceName(main_vap_idx, interface_name) != RETURN_OK)
+		return RETURN_ERR;
+
+	res = snprintf(config_file, sizeof(config_file), "%s%d.conf", CONFIG_PREFIX, main_vap_idx);
 	if (os_snprintf_error(sizeof(config_file), res)) {
 		wifi_debug(DEBUG_ERROR, "Unexpected snprintf fail\n");
 		return RETURN_ERR;
@@ -6597,7 +6672,7 @@
 	char ext_channel[64] = {0};
 	unsigned char ext_ch;
 	char buf[128] = {0};
-	int max_radio_num =0, ret = 0;
+	int ret = 0, bss_idx, vap_idx;
 	long int bandwidth = 0;
 	unsigned long channel = 0;
 	bool stbcEnable = FALSE;
@@ -6668,18 +6743,17 @@
 	}
 	wifi_datfileWrite(config_dat_file, &params, 1);
 
-	wifi_getMaxRadioNumber(&max_radio_num);
-	if(max_radio_num== 0){
-		return RETURN_ERR;
-	}
-	for(int i=0; i<=MAX_APS/max_radio_num; i++)
-	{
-		res = snprintf(config_file, sizeof(config_file), "%s%d.conf",CONFIG_PREFIX,radioIndex+(max_radio_num*i));
+	for (bss_idx = 0; bss_idx < LOGAN_MAX_NUM_VAP_PER_RADIO; bss_idx++) {
+		if (array_index_to_vap_index(radioIndex, bss_idx, &vap_idx) != RETURN_OK) {
+			wifi_debug(DEBUG_ERROR, "invalid radioIndex[%d], bss_idx[%d]\n", radioIndex, bss_idx);
+			return RETURN_ERR;
+		}
+		res = snprintf(config_file, sizeof(config_file), "%s%d.conf", CONFIG_PREFIX, vap_idx);
 		if (os_snprintf_error(sizeof(config_file), res)) {
 			wifi_debug(DEBUG_ERROR, "Unexpected snprintf fail\n");
 			return RETURN_ERR;
 		}
-		wifi_setRadioSTBCEnable(radioIndex+(max_radio_num*i), stbcEnable);
+		wifi_setRadioSTBCEnable(vap_idx, stbcEnable);
 	}
 
 	/*do ext_ch quicking setting*/
@@ -6905,17 +6979,22 @@
 INT wifi_getRadioTransmitPower(INT radioIndex, ULONG *output_ulong)	//RDKB
 {
 	char interface_name[16] = {0};
-
 	char buf[16]={0};
 	char pwr_file[128]={0};
 	int res;
+	int main_vap_idx;
 
 	WIFI_ENTRY_EXIT_DEBUG("Inside %s:%d\n",__func__, __LINE__);
 
 	if(output_ulong == NULL)
 		return RETURN_ERR;
 
-	if (wifi_GetInterfaceName(radioIndex, interface_name) != RETURN_OK)
+	if (array_index_to_vap_index(radioIndex, 0, &main_vap_idx) != RETURN_OK) {
+		wifi_debug(DEBUG_ERROR, "invalid radio_index[%d]\n", radioIndex);
+		return RETURN_ERR;
+	}
+
+	if (wifi_GetInterfaceName(main_vap_idx, interface_name) != RETURN_OK)
 		return RETURN_ERR;
 	res = snprintf(pwr_file, sizeof(pwr_file), "%s%d.txt", POWER_PERCENTAGE, radio_index_to_band(radioIndex));
 	if (os_snprintf_error(sizeof(pwr_file), res)) {
@@ -6954,10 +7033,16 @@
 	struct mtk_nl80211_param param;
 	struct unl unl_ins;
 	int res;
+	int main_vap_idx;
 
 	WIFI_ENTRY_EXIT_DEBUG("Inside %s:%d\n",__func__, __LINE__);
 
-	if (wifi_GetInterfaceName(radioIndex, interface_name) != RETURN_OK)
+	if (array_index_to_vap_index(radioIndex, 0, &main_vap_idx) != RETURN_OK) {
+		wifi_debug(DEBUG_ERROR, "invalid radio_index[%d]\n", radioIndex);
+		return RETURN_ERR;
+	}
+
+	if (wifi_GetInterfaceName(main_vap_idx, interface_name) != RETURN_OK)
 		return RETURN_ERR;
 	// Get the Tx power supported list and check that is the input in the list
 	res = snprintf(txpower_str, sizeof(txpower_str), "%lu", TransmitPower);
@@ -7143,15 +7228,20 @@
 INT wifi_getRadioBeaconPeriod(INT radioIndex, UINT *output)
 {
 	char interface_name[16] = {0};
-
 	char buf[MAX_CMD_SIZE]={'\0'};
 	int res;
+	int main_vap_idx;
 
 	WIFI_ENTRY_EXIT_DEBUG("Inside %s:%d\n",__func__, __LINE__);
 	if(output == NULL)
 		return RETURN_ERR;
 
-	if (wifi_GetInterfaceName(radioIndex, interface_name) != RETURN_OK)
+	if (array_index_to_vap_index(radioIndex, 0, &main_vap_idx) != RETURN_OK) {
+		wifi_debug(DEBUG_ERROR, "invalid radio_index[%d]\n", radioIndex);
+		return RETURN_ERR;
+	}
+
+	if (wifi_GetInterfaceName(main_vap_idx, interface_name) != RETURN_OK)
 		return RETURN_ERR;
 
 	res = _syscmd_secure(buf, sizeof(buf), "hostapd_cli -i %s status | grep beacon_int | cut -d '=' -f2 | tr -d '\n'", interface_name);
@@ -7535,15 +7625,21 @@
 	CHAR interface_name[64] = {0};
 	BOOL iface_status = FALSE;
 	wifi_radioTrafficStats2_t radioTrafficStats = {0};
+	int main_vap_idx;
 
 	WIFI_ENTRY_EXIT_DEBUG("Inside %s:%d\n", __func__, __LINE__);
 	if (NULL == output_struct)
 		return RETURN_ERR;
 
-	if (wifi_GetInterfaceName(radioIndex, interface_name) != RETURN_OK)
+	if (array_index_to_vap_index(radioIndex, 0, &main_vap_idx) != RETURN_OK) {
+		wifi_debug(DEBUG_ERROR, "invalid radio_index[%d]\n", radioIndex);
+		return RETURN_ERR;
+	}
+
+	if (wifi_GetInterfaceName(main_vap_idx, interface_name) != RETURN_OK)
 		return RETURN_ERR;
 
-	wifi_getApEnable(radioIndex, &iface_status);
+	wifi_getApEnable(main_vap_idx, &iface_status);
 
 	if (iface_status == TRUE)
 		wifi_halGetIfStats(interface_name, &radioTrafficStats);
@@ -7589,8 +7685,14 @@
 	struct nl_msg *msg	= NULL;
 	struct nlattr * msg_data = NULL;
 	struct mtk_nl80211_param param;
+	int main_vap_idx;
+
+	if (array_index_to_vap_index(radioIndex, 0, &main_vap_idx) != RETURN_OK) {
+		wifi_debug(DEBUG_ERROR, "invalid radio_index[%d]\n", radioIndex);
+		return RETURN_ERR;
+	}
 
-	if (wifi_GetInterfaceName(radioIndex, inf_name) != RETURN_OK)
+	if (wifi_GetInterfaceName(main_vap_idx, inf_name) != RETURN_OK)
 		return RETURN_ERR;
 	if_idx = if_nametoindex(inf_name);
 	if (!if_idx) {
@@ -7641,8 +7743,14 @@
 	struct nl_msg *msg	= NULL;
 	struct nlattr * msg_data = NULL;
 	struct mtk_nl80211_param param;
+	int main_vap_idx;
 
-	if (wifi_GetInterfaceName(radioIndex, inf_name) != RETURN_OK)
+	if (array_index_to_vap_index(radioIndex, 0, &main_vap_idx) != RETURN_OK) {
+		wifi_debug(DEBUG_ERROR, "invalid radio_index[%d]\n", radioIndex);
+		return RETURN_ERR;
+	}
+
+	if (wifi_GetInterfaceName(main_vap_idx, inf_name) != RETURN_OK)
 		return RETURN_ERR;
 	if_idx = if_nametoindex(inf_name);
 	if (!if_idx) {
@@ -7702,14 +7810,16 @@
 //Get the radio index assocated with this SSID entry
 INT wifi_getSSIDRadioIndex(INT ssidIndex, INT *radioIndex)
 {
+	int bss_idx;
+
 	if(NULL == radioIndex)
 		return RETURN_ERR;
-	int max_radio_num = 0;
-	wifi_getMaxRadioNumber(&max_radio_num);
-	if(max_radio_num == 0){
+
+	if (vap_index_to_radio_array_index(ssidIndex, radioIndex, &bss_idx) != RETURN_OK) {
+		wifi_debug(DEBUG_ERROR, "invalid ssidIndex[%d]\n", ssidIndex);
 		return RETURN_ERR;
 	}
-	*radioIndex = ssidIndex%max_radio_num;
+
 	return RETURN_OK;
 }
 
@@ -7851,16 +7961,9 @@
 	BOOL status = false;
 	char buf[MAX_CMD_SIZE] = {0};
 	int apIndex, ret;
-	int max_radio_num = 0;
-	int radioIndex = 0;
+	int radioIndex = 0, bss_idx;
 	int res;
 
-	wifi_getMaxRadioNumber(&max_radio_num);
-	if(max_radio_num == 0){
-		return RETURN_ERR;
-	}
-	radioIndex = ssidIndex % max_radio_num;
-
 	wifi_getApEnable(ssidIndex,&status);
 	// Do not apply when ssid index is disabled
 	if (status == false)
@@ -7879,8 +7982,16 @@
 	 * when first created interface will be removed
 	 * then all vaps other vaps on same phy are removed
 	 * after calling setApEnable to false readd all enabled vaps */
-	for(int i=0; i < MAX_APS/max_radio_num; i++) {
-		apIndex = max_radio_num*i+radioIndex;
+	if (vap_index_to_radio_array_index(ssidIndex, &radioIndex, &bss_idx) != RETURN_OK) {
+		wifi_debug(DEBUG_ERROR, "invalid ssidIndex[%d]\n", ssidIndex);
+		return RETURN_ERR;
+	}
+
+	for (bss_idx=0; bss_idx < LOGAN_MAX_NUM_VAP_PER_RADIO; bss_idx++) {
+		if (array_index_to_vap_index(radioIndex, bss_idx, &apIndex) != RETURN_OK) {
+			wifi_debug(DEBUG_ERROR, "invalid radioIndex[%d] bss_idx[%d]\n", radioIndex, bss_idx);
+			continue;
+		}
 		if (wifi_GetInterfaceName(apIndex, interface_name) != RETURN_OK)
 			return RETURN_ERR;
 
@@ -7908,8 +8019,14 @@
 	char cmd[128] = {0};
 	char line[256] = {0};
 	int tmp = 0, arr_index = -1, res;
+	int main_vap_idx;
 
-	if (wifi_GetInterfaceName(radioIndex, interface_name) != RETURN_OK)
+	if (array_index_to_vap_index(radioIndex, 0, &main_vap_idx) != RETURN_OK) {
+		wifi_debug(DEBUG_ERROR, "invalid radio_index[%d]\n", radioIndex);
+		return RETURN_ERR;
+	}
+
+	if (wifi_GetInterfaceName(main_vap_idx, interface_name) != RETURN_OK)
 		return RETURN_ERR;
 
 	res = snprintf(cmd, sizeof(cmd), "iw dev %s survey dump | grep 'frequency\\|noise' | awk '{print $2}'", interface_name);
@@ -7964,13 +8081,19 @@
 	int phyId = 0, res;
 	unsigned long len, tmp;
 	unsigned int DTIM_count;
+	int main_vap_idx;
 
 	WIFI_ENTRY_EXIT_DEBUG("Inside %s: %d\n", __func__, __LINE__);
 
-	if (wifi_GetInterfaceName(radioIndex, interface_name) != RETURN_OK)
+	if (array_index_to_vap_index(radioIndex, 0, &main_vap_idx) != RETURN_OK) {
+		wifi_debug(DEBUG_ERROR, "invalid radio_index[%d]\n", radioIndex);
+		return RETURN_ERR;
+	}
+
+	if (wifi_GetInterfaceName(main_vap_idx, interface_name) != RETURN_OK)
 		return RETURN_ERR;
 
-	res = snprintf(file_name, sizeof(file_name), "%s%d.txt", ESSID_FILE, radioIndex);
+	res = snprintf(file_name, sizeof(file_name), "%s%d.txt", ESSID_FILE, main_vap_idx);
 	if (os_snprintf_error(sizeof(file_name), res)) {
 		wifi_debug(DEBUG_ERROR, "Unexpected snprintf fail\n");
 		return RETURN_ERR;
@@ -8901,8 +9024,14 @@
 	struct nl_msg *msg	= NULL;
 	struct nlattr * msg_data = NULL;
 	struct mtk_nl80211_param param;
+	int main_vap_idx;
+
+	if (array_index_to_vap_index(radioIndex, 0, &main_vap_idx) != RETURN_OK) {
+		wifi_debug(DEBUG_ERROR, "invalid radio_index[%d]\n", radioIndex);
+		return RETURN_ERR;
+	}
 
-	if (wifi_GetInterfaceName(radioIndex, inf_name) != RETURN_OK)
+	if (wifi_GetInterfaceName(main_vap_idx, inf_name) != RETURN_OK)
 		return RETURN_ERR;
 	if_idx = if_nametoindex(inf_name);
 	/*init mtk nl80211 vendor cmd*/
@@ -8948,8 +9077,14 @@
 	struct nlattr * msg_data = NULL;
 	struct mtk_nl80211_param param;
 	int ret = -1;
+	int main_vap_idx;
+
+	if (array_index_to_vap_index(radioIndex, 0, &main_vap_idx) != RETURN_OK) {
+		wifi_debug(DEBUG_ERROR, "invalid radio_index[%d]\n", radioIndex);
+		return RETURN_ERR;
+	}
 
-	if (wifi_GetInterfaceName(radioIndex, inf_name) != RETURN_OK)
+	if (wifi_GetInterfaceName(main_vap_idx, inf_name) != RETURN_OK)
 		return RETURN_ERR;
 	if_idx = if_nametoindex(inf_name);
 	/*init mtk nl80211 vendor cmd*/
@@ -9586,13 +9721,20 @@
 	struct nlattr * msg_data = NULL;
 	struct mtk_nl80211_param param;
 	struct unl unl_ins;
+	int main_vap_idx;
 
 	if (radioIndex > MAX_APS) {
 		wifi_debug(DEBUG_ERROR, "Invalid apIndex %d\n", radioIndex);
 		return RETURN_ERR;
 	}
 	WIFI_ENTRY_EXIT_DEBUG("Inside %s:%d\n",__func__, __LINE__);
-	if (wifi_GetInterfaceName(radioIndex, interface_name) != RETURN_OK)
+
+	if (array_index_to_vap_index(radioIndex, 0, &main_vap_idx) != RETURN_OK) {
+		wifi_debug(DEBUG_ERROR, "invalid radio_index[%d]\n", radioIndex);
+		return RETURN_ERR;
+	}
+
+	if (wifi_GetInterfaceName(main_vap_idx, interface_name) != RETURN_OK)
 		return RETURN_ERR;
 
 	if_idx = if_nametoindex(interface_name);
@@ -9806,7 +9948,7 @@
 		return RETURN_ERR;
 
 	if (wifi_GetInterfaceName(apIndex, interface_name) != RETURN_OK) {
-		vap_index_to_array_index(apIndex, &radio_idx, &bss_idx);
+		vap_index_to_radio_array_index(apIndex, &radio_idx, &bss_idx);
 
 		res = snprintf(output_string, IF_NAME_SIZE, "%s%d", ext_prefix[radio_idx], bss_idx);	// For wifiagent generating data model.
 	} else
@@ -9824,7 +9966,7 @@
 INT wifi_getIndexFromName(CHAR *inputSsidString, INT *output_int)
 {
 	char buf[32] = {0};
-	char ap_idx = 0;
+	int ap_idx = 0;
 	char *apIndex_str = NULL;
 	char radio_idx = 0;
 	char bss_idx = 0;
@@ -9866,7 +10008,10 @@
 		return RETURN_ERR;
 	}
 
-	ap_idx = array_index_to_vap_index(radio_idx, bss_idx);
+	if(array_index_to_vap_index(radio_idx, bss_idx, &ap_idx) != RETURN_OK) {
+		wifi_debug(DEBUG_ERROR, "invalid radio_idx %d, bss_idx %d\n", radio_idx, bss_idx);
+		return RETURN_ERR;
+	}
 
 	if (ap_idx >= 0 && ap_idx < MAX_APS) {
 		printf("%s: hostapd conf not find, inf(%s), use inf idx(%d).\n",
@@ -10385,16 +10530,17 @@
 // outputs the radio index for the specified ap. similar as wifi_getSsidRadioIndex
 INT wifi_getApRadioIndex(INT apIndex, INT *output_int)
 {
-	int max_radio_num = 0;
+	int radioIndex, bss_idx;
 
 	if(NULL == output_int)
 		return RETURN_ERR;
 
-	wifi_getMaxRadioNumber(&max_radio_num);
-	if(max_radio_num == 0){
+	if (vap_index_to_radio_array_index(apIndex, &radioIndex, &bss_idx) != RETURN_OK) {
+		wifi_debug(DEBUG_ERROR, "invalid apIndex[%d]\n", apIndex);
 		return RETURN_ERR;
 	}
-	*output_int = apIndex % max_radio_num;
+
+	*output_int = radioIndex;
 
 	return RETURN_OK;
 }
@@ -11372,13 +11518,12 @@
 
 	char buf[MAX_BUF_SIZE] = {0};
 	BOOL status = FALSE;
-	int  max_radio_num = 0;
+	int radioIndex, bss_idx;
 	int phyId = 0;
 	int res;
 
 	wifi_getApEnable(apIndex, &status);
 
-	wifi_getMaxRadioNumber(&max_radio_num);
 	if (enable == status)
 		return RETURN_OK;
 
@@ -11386,7 +11531,10 @@
 		return RETURN_ERR;
 
 	if (enable == TRUE) {
-		int radioIndex = apIndex % max_radio_num;
+		if (vap_index_to_radio_array_index(apIndex, &radioIndex, &bss_idx) != RETURN_OK) {
+			wifi_debug(DEBUG_ERROR, "invalid apIndex[%d]\n", apIndex);
+			return RETURN_ERR;
+		}
 		phyId = radio_index_to_phy(radioIndex);
 
 		res = _syscmd_secure(buf, sizeof(buf), "ifconfig %s up", interface_name);
@@ -11404,7 +11552,7 @@
 			wifi_debug(DEBUG_ERROR, "_syscmd_secure fail\n");
 		}
 	} else {
-		if (apIndex >= MAX_NUM_RADIOS) {
+		if (apIndex >= RUNTIME_MAX_RADIO) {
 			res = _syscmd_secure(buf, sizeof(buf), "hostapd_cli -i global raw REMOVE %s", interface_name);
 		    if (res) {
 				wifi_debug(DEBUG_ERROR, "_syscmd_secure fail\n");
@@ -11672,17 +11820,16 @@
 {
 	//get the running status from driver
 	char buf[128] = {0};
-	int max_radio_num = 0, radioIndex = 0;
+	int radioIndex = 0, bss_idx;
 	int phyId = 0;
 	int res;
 
 	WIFI_ENTRY_EXIT_DEBUG("Inside %s:%d\n",__func__, __LINE__);
 
-	wifi_getMaxRadioNumber(&max_radio_num);
-	if(max_radio_num == 0){
+	if (vap_index_to_radio_array_index(apIndex, &radioIndex, &bss_idx) != RETURN_OK) {
+		wifi_debug(DEBUG_ERROR, "invalid apIndex[%d]\n", apIndex);
 		return RETURN_ERR;
 	}
-	radioIndex = apIndex % max_radio_num;
 	phyId = radio_index_to_phy(radioIndex);
 
 	res = _syscmd_secure(buf, sizeof(buf), "iw phy phy%d info | grep u-APSD", phyId);
@@ -14079,8 +14226,14 @@
 	char interface_name[16] = {0};
 	char buf[1024];
 	int res;
+	int main_vap_idx;
 
-	if (wifi_GetInterfaceName(radioIndex, interface_name) != RETURN_OK)
+	if (array_index_to_vap_index(radioIndex, 0, &main_vap_idx) != RETURN_OK) {
+		wifi_debug(DEBUG_ERROR, "invalid radio_index[%d]\n", radioIndex);
+		return RETURN_ERR;
+	}
+
+	if (wifi_GetInterfaceName(main_vap_idx, interface_name) != RETURN_OK)
 		return RETURN_ERR;
 	res = _syscmd_secure(buf, sizeof(buf), "iwconfig %s freq %d",interface_name,channel);
 	if (res) {
@@ -14822,6 +14975,7 @@
 	int center_chan = 0;
 	int center_freq1 = 0;
 	int res;
+	int main_vap_idx;
 
 	res = snprintf(config_file, sizeof(config_file), "%s%d.conf", CONFIG_PREFIX, radioIndex);
 	if (os_snprintf_error(sizeof(config_file), res)) {
@@ -14829,12 +14983,17 @@
 		return RETURN_ERR;
 	}
 
-	if (wifi_GetInterfaceName(radioIndex, interface_name) != RETURN_OK)
+	if (array_index_to_vap_index(radioIndex, 0, &main_vap_idx) != RETURN_OK) {
+		wifi_debug(DEBUG_ERROR, "invalid radio_index[%d]\n", radioIndex);
+		return RETURN_ERR;
+	}
+
+	if (wifi_GetInterfaceName(main_vap_idx, interface_name) != RETURN_OK)
 		return RETURN_ERR;
 
 	WIFI_ENTRY_EXIT_DEBUG("Inside %s:%d\n",__func__, __LINE__);
 
-	band = wifi_index_to_band(radioIndex);
+	band = wifi_index_to_band(main_vap_idx);
 
 	width = channel_width_MHz > 20 ? channel_width_MHz : 20;
 
@@ -14957,6 +15116,7 @@
 	int res;
 	unsigned long len;
 	struct channels_noise *channels_noise_arr = NULL;
+	int main_vap_idx;
 
 	WIFI_ENTRY_EXIT_DEBUG("Inside %s: %d\n", __func__, __LINE__);
 
@@ -14982,7 +15142,12 @@
 		}
 	}
 
-	if (wifi_GetInterfaceName(radio_index, interface_name) != RETURN_OK)
+	if (array_index_to_vap_index(radio_index, 0, &main_vap_idx) != RETURN_OK) {
+		wifi_debug(DEBUG_ERROR, "invalid radio_index[%d]\n", radio_index);
+		return RETURN_ERR;
+	}
+
+	if (wifi_GetInterfaceName(main_vap_idx, interface_name) != RETURN_OK)
 		return RETURN_ERR;
 
 	phyId = radio_index_to_phy(radio_index);
@@ -16062,14 +16227,12 @@
 {
 	char file_name[128] = {0};
 	FILE *f = NULL;
-	int max_num_radios = 0;
 	int res, ret;
 
 	WIFI_ENTRY_EXIT_DEBUG("Inside %s:%d\n",__func__, __LINE__);
 
-	wifi_getMaxRadioNumber(&max_num_radios);
 	if (essid == NULL || strlen(essid) == 0 || apIndex == -1) {
-		for (int index = 0; index < max_num_radios; index++) {
+		for (int index = 0; index < RUNTIME_MAX_RADIO; index++) {
 			res = snprintf(file_name, sizeof(file_name), "%s%d.txt", ESSID_FILE, index);
 			if (os_snprintf_error(sizeof(file_name), res)) {
 				wifi_debug(DEBUG_ERROR, "Unexpected snprintf fail\n");
@@ -16198,9 +16361,15 @@
 	char  if_name[IF_NAME_SIZE];
 	char interface_name[IF_NAME_SIZE] = {0};
 	int res;
+	int main_vap_idx;
 
-	if (wifi_GetInterfaceName(radioIndex, interface_name) != RETURN_OK)
+	if (array_index_to_vap_index(radioIndex, 0, &main_vap_idx) != RETURN_OK) {
+		wifi_debug(DEBUG_ERROR, "invalid radio_index[%d]\n", radioIndex);
 		return RETURN_ERR;
+	}
+
+	if (wifi_GetInterfaceName(main_vap_idx, interface_name) != RETURN_OK)
+		return RETURN_ERR;
 
 	res = snprintf(if_name, sizeof(if_name), "%s", interface_name);
 	if (os_snprintf_error(sizeof(if_name), res)) {
@@ -16458,7 +16627,14 @@
 {
 	Netlink nl;
 	char if_name[32];
-	if (wifi_GetInterfaceName(radioIndex, if_name) != RETURN_OK)
+	int main_vap_idx;
+
+	if (array_index_to_vap_index(radioIndex, 0, &main_vap_idx) != RETURN_OK) {
+		wifi_debug(DEBUG_ERROR, "invalid radio_index[%d]\n", radioIndex);
+		return RETURN_ERR;
+	}
+
+	if (wifi_GetInterfaceName(main_vap_idx, if_name) != RETURN_OK)
 		return RETURN_ERR;
 
 	*output_array_size = sizeof(wifi_associated_dev_rate_info_rx_stats_t);
@@ -16602,8 +16778,14 @@
 	char if_name[IF_NAME_SIZE];
 	char interface_name[IF_NAME_SIZE] = {0};
 	int res;
+	int main_vap_idx;
 
-	if (wifi_GetInterfaceName(radioIndex, interface_name) != RETURN_OK)
+	if (array_index_to_vap_index(radioIndex, 0, &main_vap_idx) != RETURN_OK) {
+		wifi_debug(DEBUG_ERROR, "invalid radio_index[%d]\n", radioIndex);
+		return RETURN_ERR;
+	}
+
+	if (wifi_GetInterfaceName(main_vap_idx, interface_name) != RETURN_OK)
 		return RETURN_ERR;
 
 	*output_array_size = sizeof(wifi_associated_dev_rate_info_tx_stats_t);
@@ -16818,6 +17000,7 @@
 	char cmd[MAX_CMD_SIZE] = {'\0'};
 	char interface_name[16] = {0};
 	int res;
+	int main_vap_idx;
 
 	ieee80211_channel_to_frequency(channel, &freqMHz);
 	if (freqMHz == -1) {
@@ -16825,7 +17008,12 @@
 		return -1;
 	}
 
+	if (array_index_to_vap_index(radioIndex, 0, &main_vap_idx) != RETURN_OK) {
+		wifi_debug(DEBUG_ERROR, "invalid radio_index[%d]\n", radioIndex);
+		return RETURN_ERR;
+	}
+
-	if (wifi_GetInterfaceName(radioIndex, interface_name) != RETURN_OK) {
+	if (wifi_GetInterfaceName(main_vap_idx, interface_name) != RETURN_OK) {
 		wifi_debug(DEBUG_ERROR, "wifi_GetInterfaceName fail\n");
 	}
 	res = snprintf(cmd, sizeof(cmd), "iw dev %s survey dump | grep -A5 %d | tr -d '\\t'", interface_name, freqMHz);
@@ -16898,10 +17086,16 @@
 	Netlink nl;
 	wifi_channelStats_t_loc local[array_size];
 	char  if_name[32];
+	int main_vap_idx;
 
 	local[0].array_size = array_size;
 
-	if (wifi_GetInterfaceName(radioIndex, if_name) != RETURN_OK)
+	if (array_index_to_vap_index(radioIndex, 0, &main_vap_idx) != RETURN_OK) {
+		wifi_debug(DEBUG_ERROR, "invalid radio_index[%d]\n", radioIndex);
+		return RETURN_ERR;
+	}
+
+	if (wifi_GetInterfaceName(main_vap_idx, if_name) != RETURN_OK)
 		return RETURN_ERR;
 
 	nl.id = initSock80211(&nl);
@@ -17472,10 +17666,16 @@
 	struct mtk_nl80211_param param;
 	struct mtk_nl80211_cb_data cb_data;
 	wdev_ap_metric ap_metric;
+	int main_vap_idx;
 
 	/*init mtk nl80211 vendor cmd*/
 
+	if (array_index_to_vap_index(radioIndex, 0, &main_vap_idx) != RETURN_OK) {
+		wifi_debug(DEBUG_ERROR, "invalid radio_index[%d]\n", radioIndex);
+		return RETURN_ERR;
+	}
+
-	if (wifi_GetInterfaceName(radioIndex, inf_name) != RETURN_OK)
+	if (wifi_GetInterfaceName(main_vap_idx, inf_name) != RETURN_OK)
 		return RETURN_ERR;
 	if_idx = if_nametoindex(inf_name);
 	if (!if_idx) {
@@ -18489,7 +18689,7 @@
 	int index;
 	INT ret=0;
 	char buf[1024]="";
-
+	wifi_ParseProfile();
 	WIFI_ENTRY_EXIT_DEBUG("Inside %s:%d\n",__func__, __LINE__);
 	if(argc<3)
 	{
@@ -19848,7 +20048,10 @@
 	
 	if (current_param.dtimPeriod != operationParam->dtimPeriod) {
 		for (i = 0; i < bss_num; i++) {
-			ApIndex = array_index_to_vap_index(index, i);
+			if (array_index_to_vap_index(index, i, &ApIndex) != RETURN_OK) {
+				wifi_debug(DEBUG_ERROR, "invalid index %d, i %d\n", index, i);
+				continue;
+			}
 			if (wifi_setApDTIMInterval(ApIndex, operationParam->dtimPeriod) != RETURN_OK) {
 				wifi_debug(DEBUG_ERROR, "wifi_setApDTIMInterval return error.\n");
 				goto err;
@@ -19858,7 +20061,11 @@
 	}
 	if (current_param.beaconInterval != operationParam->beaconInterval) {
 		for (i = 0; i < bss_num; i++) {
-			ApIndex = array_index_to_vap_index(index, i);
+			if (array_index_to_vap_index(index, i, &ApIndex) != RETURN_OK) {
+				wifi_debug(DEBUG_ERROR, "invalid index %d, i %d\n", index, i);
+				continue;
+			}
+
 			if (wifi_setRadioBeaconPeriod(ApIndex, operationParam->beaconInterval) != RETURN_OK) {
 				wifi_debug(DEBUG_ERROR, "wifi_setRadioBeaconPeriod return error.\n");
 				goto err;
@@ -19869,7 +20076,10 @@
 	if (current_param.operationalDataTransmitRates != operationParam->operationalDataTransmitRates) {
 		BitMapToTransmitRates(operationParam->operationalDataTransmitRates, buf, sizeof(buf));
 		for (i = 0; i < bss_num; i++) {
-			ApIndex = array_index_to_vap_index(index, i);
+			if (array_index_to_vap_index(index, i, &ApIndex) != RETURN_OK) {
+				wifi_debug(DEBUG_ERROR, "invalid index %d, i %d\n", index, i);
+				continue;
+			}
 			if (wifi_setRadioBasicDataTransmitRates(ApIndex, buf) != RETURN_OK) {
 				wifi_debug(DEBUG_ERROR, "wifi_setRadioBasicDataTransmitRates return error.\n");
 				goto err;
@@ -19879,7 +20089,10 @@
 	}
 	if (current_param.fragmentationThreshold != operationParam->fragmentationThreshold) {
 		for (i = 0; i < bss_num; i++) {
-			ApIndex = array_index_to_vap_index(index, i);
+			if (array_index_to_vap_index(index, i, &ApIndex) != RETURN_OK) {
+				wifi_debug(DEBUG_ERROR, "invalid index %d, i %d\n", index, i);
+				continue;
+			}
 			if (wifi_setRadioFragmentationThreshold(ApIndex, operationParam->fragmentationThreshold) != RETURN_OK) {
 				wifi_debug(DEBUG_ERROR, "wifi_setRadioFragmentationThreshold return error.\n");
 				goto err;
@@ -19890,7 +20103,10 @@
 
 	if (current_param.rtsThreshold != operationParam->rtsThreshold) {
 		for (i = 0; i < bss_num; i++) {
-			ApIndex = array_index_to_vap_index(index, i);
+			if (array_index_to_vap_index(index, i, &ApIndex) != RETURN_OK) {
+				wifi_debug(DEBUG_ERROR, "invalid index %d, i %d\n", index, i);
+				continue;
+			}
 			if (wifi_setApRtsThreshold(ApIndex, operationParam->rtsThreshold) != RETURN_OK) {
 				wifi_debug(DEBUG_ERROR, "wifi_setApRtsThreshold return error.\n");
 				goto err;
@@ -19957,7 +20173,10 @@
 		}
 	} else if (hapd_conf_change == TRUE) {
 		for (i = 0; i < bss_num; i++) {
-			ApIndex = array_index_to_vap_index(index, i);
+			if (array_index_to_vap_index(index, i, &ApIndex) != RETURN_OK) {
+				wifi_debug(DEBUG_ERROR, "invalid index %d, i %d\n", index, i);
+				continue;
+			}
 			wifi_quick_reload_ap(ApIndex);
 		}
 	}
@@ -20181,34 +20400,40 @@
 	return RETURN_OK;
 }
 
-static int array_index_to_vap_index(UINT radioIndex, int arrayIndex)
+static int array_index_to_vap_index(UINT radioIndex, int arrayIndex, int *vap_index)
 {
-	int max_radio_num = 0;
-
-	wifi_getMaxRadioNumber(&max_radio_num);
-	if (radioIndex >= max_radio_num) {
-		wifi_debug(DEBUG_ERROR, "Wrong radio index (%d)\n", radioIndex);
+	if (radioIndex > 2 || arrayIndex < 0 || arrayIndex >= LOGAN_MAX_NUM_VAP_PER_RADIO)
 		return RETURN_ERR;
-	}
 
-	return (arrayIndex * max_radio_num) + radioIndex;
-}
+	if (radioIndex < 2)
+		*vap_index = arrayIndex * 2 + radioIndex;
+	else if (radioIndex == 2)
+		*vap_index = (2 * LOGAN_MAX_NUM_VAP_PER_RADIO) + arrayIndex;
 
-static int vap_index_to_array_index(int vapIndex, int *radioIndex, int *arrayIndex)
-{
-	int max_radio_num = 0;
+	return RETURN_OK;
+}
 
-	if ((vapIndex < 0) || (vapIndex >  MAX_NUM_VAP_PER_RADIO*MAX_NUM_RADIOS))
-	return -1;
+/*
+ * 2.4G vap index: 0 2 4 6 8 10 12 14 ... (2*bss_idx)
+ * 5G vap index:   1 3 5 7 9 11 13 15 ... (2*bss_idx + 1)
+ * 6G vap index:   16 17 18 19 20 21 22 23 ... (2*LOGAN_MAX_NUM_VAP_PER_RADIO + bss_idx)
+ */
 
-	wifi_getMaxRadioNumber(&max_radio_num);
-	if(max_radio_num == 0){
+//static int vap_index_to_array_index(int vapIndex, int *radioIndex, int *arrayIndex)
+static int vap_index_to_radio_array_index(int vapIndex, int *radioIndex, int *arrayIndex)
+{
+	if (vapIndex >= MAX_APS || vapIndex < 0)
 		return RETURN_ERR;
+
+	if (vapIndex >= 0 && vapIndex < (2 * LOGAN_MAX_NUM_VAP_PER_RADIO)) {
+		*radioIndex = vapIndex % 2;
+		*arrayIndex = vapIndex / 2;
+	} else if (vapIndex >= (2 * LOGAN_MAX_NUM_VAP_PER_RADIO) && vapIndex < (3 * LOGAN_MAX_NUM_VAP_PER_RADIO)) {
+		*radioIndex = 2;
+		*arrayIndex = vapIndex - (2 * LOGAN_MAX_NUM_VAP_PER_RADIO);
 	}
-	(*radioIndex) = vapIndex % max_radio_num;
-	(*arrayIndex) = vapIndex / max_radio_num;
 
-	return 0;
+	return RETURN_OK;
 }
 
 
@@ -20317,9 +20542,8 @@
 	{
 		map->vap_array[i].radio_index = index;
 
-		vap_index = array_index_to_vap_index(index, i);
-		if (vap_index < 0) {
-			res = RETURN_ERR;
+		if (array_index_to_vap_index(index, i, &vap_index) != RETURN_OK) {
+			wifi_debug(DEBUG_ERROR, "invalid index %d, i %d\n", index, i);
 			continue;
 		}
 
@@ -20519,13 +20743,12 @@
 
 	char buf[MAX_BUF_SIZE] = {0};
 	BOOL status = FALSE;
-	int  max_radio_num = 0;
 	int phyId = 0;
+	int radioIndex, bss_idx;
 	int res;
 
 	wifi_getApEnable(apIndex, &status);
 
-	wifi_getMaxRadioNumber(&max_radio_num);
 	if (enable == status)
 		return RETURN_OK;
 
@@ -20533,7 +20756,10 @@
 		return RETURN_ERR;
 
 	if (enable == TRUE) {
-		int radioIndex = apIndex % max_radio_num;
+		if (vap_index_to_radio_array_index(apIndex, &radioIndex, &bss_idx) != RETURN_OK) {
+			wifi_debug(DEBUG_ERROR, "invalid apIndex[%d]\n", apIndex);
+			return RETURN_ERR;
+		}
 		phyId = radio_index_to_phy(radioIndex);
 		res = snprintf(config_file, MAX_BUF_SIZE, "%s%d.conf", CONFIG_PREFIX, apIndex);
 		if (os_snprintf_error(MAX_CMD_SIZE, res)) {
@@ -20938,6 +21164,7 @@
 	CHAR interface_name[16] = {0};
 	wifi_band band;
 	int res;
+	int main_vap_idx;
 
 	if(rcap == NULL)
 	{
@@ -21001,7 +21228,12 @@
 	rcap->csi.maxDevices = 8;
 	rcap->csi.soudingFrameSupported = TRUE;
 
-	if (wifi_GetInterfaceName(radioIndex, interface_name) != RETURN_OK) {
+	if (array_index_to_vap_index(radioIndex, 0, &main_vap_idx) != RETURN_OK) {
+		wifi_debug(DEBUG_ERROR, "invalid radio_index[%d]\n", radioIndex);
+		return RETURN_ERR;
+	}
+
+	if (wifi_GetInterfaceName(main_vap_idx, interface_name) != RETURN_OK) {
 		wifi_debug(DEBUG_ERROR, "wifi_GetInterfaceName fail\n");
 	}
 	res = snprintf(rcap->ifaceName, sizeof(interface_name), "%s",interface_name);
@@ -21071,11 +21303,9 @@
 }
 
 
-wifi_hal_capability_t g_hal_cap;
-
 INT wifi_getHalCapability(wifi_hal_capability_t *cap)
 {
-	INT status = 0, radioIndex = 0;
+	INT status = 0, radioIndex = 0, vap_idx;
 	char output[MAX_BUF_SIZE] = {0};
 	int iter = 0;
 	unsigned int j = 0;
@@ -21104,7 +21334,7 @@
 
 		for (j = 0; j < cap->wifi_prop.radiocap[radioIndex].maxNumberVAPs; j++)
 		{
-			if (iter >= MAX_NUM_RADIOS * MAX_NUM_VAP_PER_RADIO)
+			if (iter >= RUNTIME_MAX_RADIO * MAX_NUM_VAP_PER_RADIO)
 			{
 				 printf("%s: to many vaps for index map (%d)\n", __func__, iter);
 				 return RETURN_ERR;
@@ -21113,7 +21343,12 @@
 			iface_info->phy_index = radioIndex; // XXX: parse phyX index instead
 			iface_info->rdk_radio_index = radioIndex;
 
+			if (array_index_to_vap_index(radioIndex, j, &vap_idx) != RETURN_OK) {
+				wifi_debug(DEBUG_ERROR, "invalid radioIndex %d, j %d\n", radioIndex, j);
+				continue;
+			}
+
-			iface_info->index = array_index_to_vap_index(radioIndex, j);
+			iface_info->index = vap_idx;
 
 			if (wifi_GetInterfaceName(iface_info->index, output))
 				strncpy(iface_info->interface_name, output, sizeof(iface_info->interface_name) - 1);
@@ -21697,7 +21932,7 @@
 
 INT wifi_getRadioStatsEnable(INT radioIndex, BOOL *output_enable)
 {
-	if (NULL == output_enable || radioIndex >=MAX_NUM_RADIOS)
+	if (NULL == output_enable || radioIndex >=RUNTIME_MAX_RADIO)
 		return RETURN_ERR;
 	*output_enable=TRUE;
 	return RETURN_OK;
@@ -21709,12 +21944,11 @@
 	char buf[128] = {0};
 	char line[128] = {0};
 	FILE *f = NULL;
-	int index = 0;
+	int index = 0, bss_idx;
 	int exp = 0;
 	int mantissa = 0;
 	int duration = 0;
 	int radio_index = 0;
-	int max_radio_num = 0;
 	uint twt_wake_interval = 0;
 	int phyId = 0;
 	int res;
@@ -21722,12 +21956,10 @@
 
 	WIFI_ENTRY_EXIT_DEBUG("Inside %s:%d\n",__func__, __LINE__);
 
-	wifi_getMaxRadioNumber(&max_radio_num);
-	if(max_radio_num == 0){
+	if (vap_index_to_radio_array_index(ap_index, &radio_index, &bss_idx)!= RETURN_OK) {
+		wifi_debug(DEBUG_ERROR, "invalid ap_index[%d]\n", ap_index);
 		return RETURN_ERR;
 	}
-	radio_index = ap_index % max_radio_num;
-
 	phyId = radio_index_to_phy(radio_index);
 
 	res = _syscmd_secure(buf, sizeof(buf),"cat /sys/kernel/debug/ieee80211/phy%d/mt76/twt_stats | wc -l", phyId);