@@ -24,6 +24,44 @@ LOG_MODULE_REGISTER(siwx91x_wifi);
24
24
25
25
NET_BUF_POOL_FIXED_DEFINE (siwx91x_tx_pool , 1 , _NET_ETH_MAX_FRAME_SIZE , 0 , NULL );
26
26
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
+
27
65
static int siwx91x_sl_to_z_mode (sl_wifi_interface_t interface )
28
66
{
29
67
switch (interface ) {
@@ -369,6 +407,45 @@ static int siwx91x_get_version(const struct device *dev, struct wifi_version *pa
369
407
return 0 ;
370
408
}
371
409
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
+
372
449
static void siwx91x_iface_init (struct net_if * iface )
373
450
{
374
451
const struct siwx91x_config * siwx91x_cfg = iface -> if_dev -> dev -> config ;
@@ -432,6 +509,7 @@ static const struct wifi_mgmt_ops siwx91x_mgmt = {
432
509
.get_stats = siwx91x_stats ,
433
510
#endif
434
511
.get_version = siwx91x_get_version ,
512
+ .reg_domain = siwx91x_wifi_reg_domain ,
435
513
};
436
514
437
515
static const struct net_wifi_mgmt_offload siwx91x_api = {
0 commit comments