From 50e36095dd77063902c1cb7be19867dd49fdc885 Mon Sep 17 00:00:00 2001 From: Nitin Pandey Date: Sat, 12 Apr 2025 11:12:30 +0530 Subject: [PATCH] driver: wifi: siwx91x: Add roaming configuration - Defined Kconfig macros for Roam config - Added set roam configuration API call after BGSCAN Signed-off-by: Nitin Pandey --- drivers/wifi/siwx91x/Kconfig.siwx91x | 38 +++++++++++++++++++++++++ drivers/wifi/siwx91x/siwx91x_wifi.c | 16 +++++++++++ soc/silabs/silabs_siwx91x/siwg917/nwp.c | 5 ++++ 3 files changed, 59 insertions(+) diff --git a/drivers/wifi/siwx91x/Kconfig.siwx91x b/drivers/wifi/siwx91x/Kconfig.siwx91x index 29fe93b5454..e1ece13c9b9 100644 --- a/drivers/wifi/siwx91x/Kconfig.siwx91x +++ b/drivers/wifi/siwx91x/Kconfig.siwx91x @@ -45,6 +45,44 @@ config NET_MGMT_EVENT_STACK_SIZE config NET_MGMT_EVENT_QUEUE_SIZE default 10 +config WIFI_SILABS_SIWX91X_ENABLE_ROAMING + bool "WiFi roaming support" + help + Enable this option to configure roaming parameters. + Roaming will be enabled automatically when the + background scan is active, improving connectivity + and performance during transitions between access points. + +config WIFI_SILABS_SIWX91X_ROAMING_USE_DEAUTH + bool "Use deauth frames for roaming" + depends on WIFI_SILABS_SIWX91X_ENABLE_ROAMING + help + Enable this option to allow roaming using + deauthentication frames. By default, roaming + is performed using Null data packets. + +config WIFI_SILABS_SIWX91X_ROAMING_TRIGGER_LEVEL + int "Default value of roam trigger level (in dBm)" + default -70 + range -10 -100 + depends on WIFI_SILABS_SIWX91X_ENABLE_ROAMING + help + Sets the default roam trigger level. Higher values trigger + earlier roaming; lower values delay it. It determines + when to start searching for a new AP. + +config WIFI_SILABS_SIWX91X_ROAMING_TRIGGER_LEVEL_CHANGE + int "Default value of roam trigger level change (in dBm)" + default 5 + range 0 90 + depends on WIFI_SILABS_SIWX91X_ENABLE_ROAMING + help + Configure the default trigger level change for WiFi roaming. + This value determines the change in signal strength (in dBm) + required to initiate a roaming event. A smaller value may result + in more sensitive roaming behavior, while a larger value can + reduce the frequency of roaming events. It determines + the signal difference needed to switch to a new AP. config WIFI_SILABS_SIWX91X_ADV_SCAN_THRESHOLD int "Advanced scan threshold (in dBm)" diff --git a/drivers/wifi/siwx91x/siwx91x_wifi.c b/drivers/wifi/siwx91x/siwx91x_wifi.c index d89c4963163..e86b4f6fd0b 100644 --- a/drivers/wifi/siwx91x/siwx91x_wifi.c +++ b/drivers/wifi/siwx91x/siwx91x_wifi.c @@ -20,6 +20,7 @@ #include "sl_net_default_values.h" #include "sl_wifi.h" #include "sl_net.h" +#include "sl_wifi_constants.h" #define SIWX91X_DRIVER_VERSION KERNEL_VERSION_STRING @@ -537,6 +538,15 @@ static int siwx91x_scan(const struct device *dev, struct wifi_scan_params *z_sca .enable_multi_probe = CONFIG_WIFI_SILABS_SIWX91X_ADV_MULTIPROBE, .enable_instant_scan = CONFIG_WIFI_SILABS_SIWX91X_ENABLE_INSTANT_SCAN, }; + sl_wifi_roam_configuration_t roam_configuration = { +#ifdef CONFIG_WIFI_SILABS_SIWX91X_ENABLE_ROAMING + .trigger_level = CONFIG_WIFI_SILABS_SIWX91X_ROAMING_TRIGGER_LEVEL, + .trigger_level_change = CONFIG_WIFI_SILABS_SIWX91X_ROAMING_TRIGGER_LEVEL_CHANGE, +#else + .trigger_level = SL_WIFI_NEVER_ROAM, + .trigger_level_change = 0, +#endif + }; struct siwx91x_dev *sidev = dev->data; sl_wifi_interface_t interface; sl_wifi_ssid_t ssid = { }; @@ -573,6 +583,12 @@ static int siwx91x_scan(const struct device *dev, struct wifi_scan_params *z_sca return -EINVAL; } + ret = sl_wifi_set_roam_configuration(interface, &roam_configuration); + if (ret != SL_STATUS_OK) { + LOG_ERR("roaming configuration failed with status %x", ret); + return -EINVAL; + } + sl_scan_config.type = SL_WIFI_SCAN_TYPE_ADV_SCAN; sl_scan_config.periodic_scan_interval = CONFIG_WIFI_SILABS_SIWX91X_ADV_SCAN_PERIODICITY; diff --git a/soc/silabs/silabs_siwx91x/siwg917/nwp.c b/soc/silabs/silabs_siwx91x/siwg917/nwp.c index 3104ceebb90..0838ca41e8b 100644 --- a/soc/silabs/silabs_siwx91x/siwg917/nwp.c +++ b/soc/silabs/silabs_siwx91x/siwg917/nwp.c @@ -45,6 +45,11 @@ int siwg91x_get_nwp_config(int wifi_oper_mode, sl_wifi_device_configuration_t *g if (wifi_oper_mode == SL_SI91X_CLIENT_MODE) { boot_config->oper_mode = SL_SI91X_CLIENT_MODE; + if (IS_ENABLED(CONFIG_WIFI_SILABS_SIWX91X_ROAMING_USE_DEAUTH)) { + boot_config->custom_feature_bit_map |= + SL_SI91X_CUSTOM_FEAT_ROAM_WITH_DEAUTH_OR_NULL_DATA; + } + if (IS_ENABLED(CONFIG_WIFI_SILABS_SIWX91X) && IS_ENABLED(CONFIG_BT_SILABS_SIWX91X)) { boot_config->coex_mode = SL_SI91X_WLAN_BLE_MODE;