Skip to content

Commit 72a3f7e

Browse files
ArunmaniAlagarsamy2710kartben
authored andcommitted
drivers: wifi: siwx91x: Add support for setting regulatory domain
Add support for configuring the regulatory domain (region code) to ensure the device operates in compliance with local RF regulations. The region must be set before the Wi-Fi interface becomes active i.e., before scan or connection in STA mode, or before starting in AP mode. Since the SDK does not support setting the country code directly, the driver maps country codes to region codes Signed-off-by: Arunmani Alagarsamy <[email protected]>
1 parent 9cfbed6 commit 72a3f7e

File tree

1 file changed

+78
-0
lines changed

1 file changed

+78
-0
lines changed

drivers/wifi/siwx91x/siwx91x_wifi.c

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,44 @@ LOG_MODULE_REGISTER(siwx91x_wifi);
2424

2525
NET_BUF_POOL_FIXED_DEFINE(siwx91x_tx_pool, 1, _NET_ETH_MAX_FRAME_SIZE, 0, NULL);
2626

27+
typedef struct {
28+
const char *const *codes;
29+
size_t num_codes;
30+
sl_wifi_region_code_t region_code;
31+
} region_map_t;
32+
33+
static const char *const us_codes[] = {
34+
"AE", "AR", "AS", "BB", "BM", "BR", "BS", "CA", "CO", "CR", "CU", "CX",
35+
"DM", "DO", "EC", "FM", "GD", "GY", "GU", "HN", "HT", "JM", "KY", "LB",
36+
"LK", "MH", "MN", "MP", "MO", "MY", "NI", "PA", "PE", "PG", "PH", "PK",
37+
"PR", "PW", "PY", "SG", "MX", "SV", "TC", "TH", "TT", "US", "UY", "VE",
38+
"VI", "VN", "VU", "00"
39+
/* Map "00" (world domain) to US region,
40+
* as using the world domain is not recommended
41+
*/
42+
};
43+
static const char *const eu_codes[] = {
44+
"AD", "AF", "AI", "AL", "AM", "AN", "AT", "AW", "AU", "AZ", "BA", "BE",
45+
"BG", "BH", "BL", "BT", "BY", "CH", "CY", "CZ", "DE", "DK", "EE", "ES",
46+
"FR", "GB", "GE", "GF", "GL", "GP", "GR", "GT", "HK", "HR", "HU", "ID",
47+
"IE", "IL", "IN", "IR", "IS", "IT", "JO", "KH", "FI", "KN", "KW", "KZ",
48+
"LC", "LI", "LT", "LU", "LV", "MD", "ME", "MK", "MF", "MT", "MV", "MQ",
49+
"NL", "NO", "NZ", "OM", "PF", "PL", "PM", "PT", "QA", "RO", "RS", "RU",
50+
"SA", "SE", "SI", "SK", "SR", "SY", "TR", "TW", "UA", "UZ", "VC", "WF",
51+
"WS", "YE", "RE", "YT"
52+
};
53+
static const char *const jp_codes[] = {"BD", "BN", "BO", "CL", "BZ", "JP", "NP"};
54+
static const char *const kr_codes[] = {"KR", "KP"};
55+
static const char *const cn_codes[] = {"CN"};
56+
57+
static const region_map_t region_maps[] = {
58+
{us_codes, ARRAY_SIZE(us_codes), SL_WIFI_REGION_US},
59+
{eu_codes, ARRAY_SIZE(eu_codes), SL_WIFI_REGION_EU},
60+
{jp_codes, ARRAY_SIZE(jp_codes), SL_WIFI_REGION_JP},
61+
{kr_codes, ARRAY_SIZE(kr_codes), SL_WIFI_REGION_KR},
62+
{cn_codes, ARRAY_SIZE(cn_codes), SL_WIFI_REGION_CN},
63+
};
64+
2765
static int siwx91x_sl_to_z_mode(sl_wifi_interface_t interface)
2866
{
2967
switch (interface) {
@@ -369,6 +407,45 @@ static int siwx91x_get_version(const struct device *dev, struct wifi_version *pa
369407
return 0;
370408
}
371409

410+
sl_wifi_region_code_t siwx91x_map_country_code_to_region(const char *country_code)
411+
{
412+
__ASSERT(country_code, "country_code cannot be NULL");
413+
414+
ARRAY_FOR_EACH(region_maps, i) {
415+
for (size_t j = 0; j < region_maps[i].num_codes; j++) {
416+
if (memcmp(country_code, region_maps[i].codes[j],
417+
WIFI_COUNTRY_CODE_LEN) == 0) {
418+
return region_maps[i].region_code;
419+
}
420+
}
421+
}
422+
return SL_WIFI_DEFAULT_REGION;
423+
}
424+
425+
static int siwx91x_wifi_reg_domain(const struct device *dev, struct wifi_reg_domain *reg_domain)
426+
{
427+
sl_wifi_operation_mode_t oper_mode = sli_get_opermode();
428+
sl_wifi_region_code_t region_code;
429+
int ret;
430+
431+
__ASSERT(reg_domain, "reg_domain cannot be NULL");
432+
433+
if (reg_domain->oper == WIFI_MGMT_SET) {
434+
region_code = siwx91x_map_country_code_to_region(reg_domain->country_code);
435+
ret = sl_si91x_set_device_region(oper_mode, SL_WIFI_BAND_MODE_2_4GHZ, region_code);
436+
if (ret) {
437+
LOG_ERR("Failed to set device region: %x", ret);
438+
return -EINVAL;
439+
}
440+
441+
if (region_code == SL_WIFI_DEFAULT_REGION) {
442+
LOG_INF("Country code not supported, using default region");
443+
}
444+
}
445+
446+
return 0;
447+
}
448+
372449
static void siwx91x_iface_init(struct net_if *iface)
373450
{
374451
const struct siwx91x_config *siwx91x_cfg = iface->if_dev->dev->config;
@@ -432,6 +509,7 @@ static const struct wifi_mgmt_ops siwx91x_mgmt = {
432509
.get_stats = siwx91x_stats,
433510
#endif
434511
.get_version = siwx91x_get_version,
512+
.reg_domain = siwx91x_wifi_reg_domain,
435513
};
436514

437515
static const struct net_wifi_mgmt_offload siwx91x_api = {

0 commit comments

Comments
 (0)