[rdk-b][mt7986][wifi-hal][Add get and set guard interval functions]
[Description]
Add get and set guard interval functions. And record GI value in the file.
The function getRadioGuardInterval and setRadioGuardInterval is deprecated, So I implement them just call the corresponding new functions.
Use iw instead of hostapd beacause hostapd can not set GI in he mode.
[Release-log]
N/A
diff --git a/recipes-ccsp/hal/hal-wifi-patches/0039-HAL-add-get-and-set-guard-interval-functions.patch b/recipes-ccsp/hal/hal-wifi-patches/0039-HAL-add-get-and-set-guard-interval-functions.patch
new file mode 100644
index 0000000..87d684a
--- /dev/null
+++ b/recipes-ccsp/hal/hal-wifi-patches/0039-HAL-add-get-and-set-guard-interval-functions.patch
@@ -0,0 +1,177 @@
+From 9fe2a7b984e3b008bbb1605eb33f7937d43cf018 Mon Sep 17 00:00:00 2001
+From: "Allen.Ye" <allen.ye@mediatek.com>
+Date: Wed, 17 Aug 2022 09:55:10 +0800
+Subject: [PATCH] HAL: add get and set guard interval functions
+
+---
+ source/wifi/wifi_hal.c | 132 +++++++++++++++++++++++++++++++++++++++--
+ 1 file changed, 128 insertions(+), 4 deletions(-)
+
+diff --git a/source/wifi/wifi_hal.c b/source/wifi/wifi_hal.c
+index dd5e8d4..19aa67e 100644
+--- a/source/wifi/wifi_hal.c
++++ b/source/wifi/wifi_hal.c
+@@ -74,6 +74,7 @@ Licensed under the ISC license
+ #define SOCK_PREFIX "/var/run/hostapd/wifi"
+ #define VAP_STATUS_FILE "/tmp/vap-status"
+ #define ESSID_FILE "/tmp/essid"
++#define GUARD_INTERVAL_FILE "/tmp/guard-interval"
+
+ #ifdef MTK_IMPL
+ #define DRIVER_2GHZ "mt7915e"
+@@ -2409,18 +2410,53 @@ INT wifi_setRadioExtChannel(INT radioIndex, CHAR *string) //Tr181 //AP only
+ //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_getRadioGuardInterval(INT radioIndex, CHAR *output_string) //Tr181
+ {
+- //save config and apply instantly
+- if (NULL == output_string)
++ wifi_guard_interval_t GI;
++
++ WIFI_ENTRY_EXIT_DEBUG("Inside %s:%d\n",__func__, __LINE__);
++
++ if (output_string == NULL || wifi_getGuardInterval(radioIndex, &GI) == RETURN_ERR)
+ return RETURN_ERR;
+- snprintf(output_string, 64, "Auto");
+
++ if (GI == wifi_guard_interval_400)
++ strcpy(output_string, "400nsec");
++ else if (GI == wifi_guard_interval_800)
++ strcpy(output_string, "800nsec");
++ else if (GI == wifi_guard_interval_1600)
++ strcpy(output_string, "1600nsec");
++ else if (GI == wifi_guard_interval_3200)
++ strcpy(output_string, "3200nsec");
++ else
++ strcpy(output_string, "auto");
++
++ WIFI_ENTRY_EXIT_DEBUG("Exiting %s:%d\n",__func__, __LINE__);
+ return RETURN_OK;
+ }
+
+ //Set the guard interval value.
+ INT wifi_setRadioGuardInterval(INT radioIndex, CHAR *string) //Tr181
+ {
+- //Apply setting instantly
++ wifi_guard_interval_t GI;
++ int ret = 0;
++
++ WIFI_ENTRY_EXIT_DEBUG("Inside %s:%d\n",__func__, __LINE__);
++
++ if (strcmp(string, "400nsec") == 0)
++ GI = wifi_guard_interval_400;
++ else if (strcmp(string , "800nsec") == 0 || strcmp(string, "auto") == 0)
++ GI = wifi_guard_interval_800;
++ else if (strcmp(string , "1600nsec") == 0)
++ GI = wifi_guard_interval_1600;
++ else if (strcmp(string , "3200nsec") == 0)
++ GI = wifi_guard_interval_3200;
++
++ ret = wifi_setGuardInterval(radioIndex, GI);
++
++ if (ret == RETURN_ERR) {
++ wifi_dbg_printf("%s: wifi_setGuardInterval return error\n", __func__);
++ return RETURN_ERR;
++ }
++
++ WIFI_ENTRY_EXIT_DEBUG("Exiting %s:%d\n",__func__, __LINE__);
+ return RETURN_OK;
+ }
+
+@@ -9456,6 +9492,94 @@ INT wifi_isZeroDFSSupported(UINT radioIndex, BOOL *supported)
+ return RETURN_OK;
+ }
+
++INT wifi_setGuardInterval(INT radio_index, wifi_guard_interval_t guard_interval)
++{
++ char cmd[128] = {0};
++ char buf[64] = {0};
++ char band_str[8] = {0};
++ char GI[8] = {0};
++ int tmp = 0;
++ BOOL ax_mode = FALSE;
++ BOOL short_GI = FALSE;
++ FILE *f = NULL;
++ wifi_band band;
++
++ WIFI_ENTRY_EXIT_DEBUG("Inside %s:%d\n",__func__, __LINE__);
++
++ if (wifi_getRadioMode(radio_index, buf, &tmp) == RETURN_ERR) {
++ wifi_dbg_printf("%s: wifi_getRadioMode return error\n", __func__);
++ return RETURN_ERR;
++ }
++ if (strstr(buf, "ax") != NULL)
++ ax_mode = TRUE;
++
++ if (guard_interval == wifi_guard_interval_400 && ax_mode != TRUE) {
++ short_GI = TRUE;
++ strcpy(GI, "0.4");
++ } else if (guard_interval == wifi_guard_interval_1600 && ax_mode == TRUE)
++ strcpy(GI, "1.6");
++ else if (guard_interval == wifi_guard_interval_3200 && ax_mode == TRUE)
++ strcpy(GI, "3.2");
++ else // default
++ strcpy(GI, "0.8");
++
++ band = wifi_index_to_band(radio_index);
++ if (band == band_2_4)
++ strcpy(band_str, "2.4");
++ else if (band == band_5)
++ strcpy(band_str, "5");
++ else if (band == band_6)
++ strcpy(band_str, "6");
++ else {
++ wifi_dbg_printf("%s: invalid band\n");
++ return RETURN_ERR;
++ }
++
++ if (ax_mode == TRUE)
++ snprintf(cmd, sizeof(cmd), "iw dev %s%d set bitrates he-gi-%s %s", AP_PREFIX, radio_index, band_str, GI);
++ else
++ snprintf(cmd, sizeof(cmd), "iw dev %s%d set bitrates %sgi-%s", AP_PREFIX, radio_index, (short_GI)?"s":"l", band_str);
++ _syscmd(cmd, buf, sizeof(buf));
++
++ // Record GI for get GI function
++ snprintf(buf, sizeof(buf), "%s%d.txt", GUARD_INTERVAL_FILE, radio_index);
++ f = fopen(buf, "w");
++ if (f != NULL) {
++ fprintf(f, "%s", GI);
++ }
++ fclose(f);
++ WIFI_ENTRY_EXIT_DEBUG("Exiting %s:%d\n",__func__, __LINE__);
++ return RETURN_OK;
++}
++
++INT wifi_getGuardInterval(INT radio_index, wifi_guard_interval_t *guard_interval)
++{
++ char buf[32] = {0};
++ char cmd[64] = {0};
++
++ WIFI_ENTRY_EXIT_DEBUG("Inside %s:%d\n",__func__, __LINE__);
++
++ if (guard_interval == NULL)
++ return RETURN_ERR;
++
++ snprintf(cmd, sizeof(cmd), "cat %s%d.txt", GUARD_INTERVAL_FILE, radio_index);
++ _syscmd(cmd, buf, sizeof(buf));
++
++ if (strcmp(buf, "0.4") == 0)
++ *guard_interval = wifi_guard_interval_400;
++ else if (strcmp(buf, "0.8") == 0)
++ *guard_interval = wifi_guard_interval_800;
++ else if (strcmp(buf, "1.6") == 0)
++ *guard_interval = wifi_guard_interval_1600;
++ else if (strcmp(buf, "3.2") == 0)
++ *guard_interval = wifi_guard_interval_3200;
++ else
++ *guard_interval = wifi_guard_interval_auto;
++
++ WIFI_ENTRY_EXIT_DEBUG("Exiting %s:%d\n",__func__, __LINE__);
++ return RETURN_OK;
++}
++
+ /* multi-psk support */
+ INT wifi_getMultiPskClientKey(INT apIndex, mac_address_t mac, wifi_key_multi_psk_t *key)
+ {
+--
+2.18.0
+