blob: 657ba172e6da1616d7ba58eb147374c645d6c252 [file] [log] [blame]
From 47094ac819aba0809c899fe8ad1083b319617813 Mon Sep 17 00:00:00 2001
From: "Allen.Ye" <allen.ye@mediatek.com>
Date: Thu, 8 Sep 2022 10:31:06 +0800
Subject: [PATCH] HAL: add get and set radio mode
---
source/wifi/wifi_hal.c | 120 ++++++++++++++++++++++++++++++++++++++++-
1 file changed, 119 insertions(+), 1 deletion(-)
diff --git a/source/wifi/wifi_hal.c b/source/wifi/wifi_hal.c
index fa1af2e..9e17de6 100644
--- a/source/wifi/wifi_hal.c
+++ b/source/wifi/wifi_hal.c
@@ -170,6 +170,15 @@ typedef enum
band_6 = 2,
} wifi_band;
+typedef enum {
+ WIFI_MODE_A = 0x01,
+ WIFI_MODE_B = 0x02,
+ WIFI_MODE_G = 0x04,
+ WIFI_MODE_N = 0x08,
+ WIFI_MODE_AC = 0x10,
+ WIFI_MODE_AX = 0x20,
+} wifi_ieee80211_Mode;
+
#ifdef WIFI_HAL_VERSION_3
// Return number of elements in array
@@ -1696,7 +1705,63 @@ INT wifi_getRadioStandard(INT radioIndex, CHAR *output_string, BOOL *gOnly, BOOL
#endif
}
-//Set the radio operating mode, and pure mode flag.
+INT wifi_getRadioMode(INT radioIndex, CHAR *output_string, UINT *pureMode)
+{
+ char cmd[128] = {0};
+ char buf[64] = {0};
+ char config_file[64] = {0};
+ wifi_band band;
+
+ WIFI_ENTRY_EXIT_DEBUG("Inside %s:%d\n",__func__, __LINE__);
+ if(NULL == output_string || NULL == pureMode)
+ return RETURN_ERR;
+
+ // grep all of the ieee80211 protocol config set to 1
+ snprintf(config_file, sizeof(cmd), "%s%d.conf", CONFIG_PREFIX, radioIndex);
+ snprintf(cmd, sizeof(cmd), "cat %s | grep -E\"^ieee.*=1\" | cut -d '=' -f1 | tr -d 'ieee80211'", config_file);
+ _syscmd(cmd, buf, sizeof(buf));
+
+ band = wifi_index_to_band(radioIndex);
+ // puremode is a bit map
+ *pureMode = 0;
+ if (band == band_2_4) {
+ strcat(output_string, "b,g");
+ *pureMode |= WIFI_MODE_B | WIFI_MODE_G;
+ if (strstr(buf, "n") != NULL) {
+ strcat(output_string, ",n");
+ *pureMode |= WIFI_MODE_N;
+ }
+ if (strstr(buf, "ax") != NULL) {
+ strcat(output_string, ",ax");
+ *pureMode |= WIFI_MODE_AX;
+ }
+ } else if (band == band_5) {
+ strcat(output_string, "a");
+ *pureMode |= WIFI_MODE_A;
+ if (strstr(buf, "n") != NULL) {
+ strcat(output_string, ",n");
+ *pureMode |= WIFI_MODE_N;
+ }
+ if (strstr(buf, "ac") != NULL) {
+ strcat(output_string, ",ac");
+ *pureMode |= WIFI_MODE_AC;
+ }
+ if (strstr(buf, "ax") != NULL) {
+ strcat(output_string, ",ax");
+ *pureMode |= WIFI_MODE_AX;
+ }
+ } else if (band == band_6) {
+ if (strstr(buf, "ax") != NULL) {
+ strcat(output_string, "ax");
+ *pureMode |= WIFI_MODE_AX;
+ }
+ }
+
+ WIFI_ENTRY_EXIT_DEBUG("Exiting %s:%d\n",__func__, __LINE__);
+ return RETURN_OK;
+}
+
+// Set the radio operating mode, and pure mode flag.
INT wifi_setRadioChannelMode(INT radioIndex, CHAR *channelMode, BOOL gOnlyFlag, BOOL nOnlyFlag, BOOL acOnlyFlag) //RDKB
{
WIFI_ENTRY_EXIT_DEBUG("Inside %s_%s_%d_%d:%d\n",__func__,channelMode,nOnlyFlag,gOnlyFlag,__LINE__);
@@ -1791,6 +1856,59 @@ INT wifi_setRadioChannelMode(INT radioIndex, CHAR *channelMode, BOOL gOnlyFlag,
return RETURN_OK;
}
+// Set the radio operating mode, and pure mode flag.
+INT wifi_setRadioMode(INT radioIndex, CHAR *channelMode, UINT pureMode)
+{
+ int num_hostapd_support_mode = 3; // n, ac, ax
+ struct params list[num_hostapd_support_mode];
+ char config_file[64] = {0};
+ char bandwidth[16] = {0};
+ int mode_check_bit = 1 << 3; // n mode
+ wifi_ieee80211_Mode mode = (wifi_ieee80211_Mode)pureMode;
+
+ WIFI_ENTRY_EXIT_DEBUG("Inside %s_%d:%d\n", __func__, channelMode, pureMode, __LINE__);
+ // Set radio mode
+ list[0].name = "ieee80211n";
+ list[1].name = "ieee80211ac";
+ list[2].name = "ieee80211ax";
+ snprintf(config_file, sizeof(config_file), "%s%d.conf", CONFIG_PREFIX, radioIndex);
+
+ // check the bit map from n to ax, and set hostapd config
+ if (mode & WIFI_MODE_N)
+ list[0].value = "1";
+ else
+ list[0].value = "0";
+ if (mode & WIFI_MODE_AC)
+ list[1].value = "1";
+ else
+ list[1].value = "0";
+ if (mode & WIFI_MODE_AX)
+ list[2].value = "1";
+ else
+ list[2].value = "0";
+ wifi_hostapdWrite(config_file, list, num_hostapd_support_mode);
+
+ if (channelMode == NULL || strlen(channelMode) == 0)
+ return RETURN_OK;
+ // Set bandwidth
+ if (strstr(channelMode, "40") != NULL)
+ strcpy(bandwidth, "40MHz");
+ else if (strstr(channelMode, "80") != NULL)
+ strcpy(bandwidth, "80MHz");
+ else if (strstr(channelMode, "160") != NULL)
+ strcpy(bandwidth, "160MHz");
+ else // 11A, 11B, 11G....
+ strcpy(bandwidth, "20MHz");
+
+ writeBandWidth(radioIndex, bandwidth);
+ wifi_setRadioOperatingChannelBandwidth(radioIndex, bandwidth);
+
+ wifi_reloadAp(radioIndex);
+ WIFI_ENTRY_EXIT_DEBUG("Exiting %s:%d\n",__func__, __LINE__);
+
+ return RETURN_OK;
+}
+
//Get the list of supported channel. eg: "1-11"
//The output_string is a max length 64 octet string that is allocated by the RDKB code. Implementations must ensure that strings are not longer than this.
INT wifi_getRadioPossibleChannels(INT radioIndex, CHAR *output_string) //RDKB
--
2.18.0