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 <nitin.pandey@silabs.com>
This commit is contained in:
Nitin Pandey 2025-04-12 11:12:30 +05:30 committed by Benjamin Cabé
commit 50e36095dd
3 changed files with 59 additions and 0 deletions

View file

@ -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)"

View file

@ -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;

View file

@ -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;