77#include "ps.h"
88#include "util.h"
99
10- #define COUNTRY_REGD (_alpha2 , _txpwr_regd ...) \
11- {.alpha2 = (_alpha2), \
12- .txpwr_regd = {_txpwr_regd}, \
10+ #define COUNTRY_REGD (_alpha2 , _rule_2ghz , _rule_5ghz , _rule_6ghz ) \
11+ { \
12+ .alpha2 = _alpha2, \
13+ .txpwr_regd[RTW89_BAND_2G] = _rule_2ghz, \
14+ .txpwr_regd[RTW89_BAND_5G] = _rule_5ghz, \
15+ .txpwr_regd[RTW89_BAND_6G] = _rule_6ghz, \
1316 }
1417
1518static const struct rtw89_regd rtw89_ww_regd =
@@ -295,13 +298,16 @@ static const char rtw89_alpha2_list_eu[][3] = {
295298 "RO" ,
296299};
297300
298- static const struct rtw89_regd * rtw89_regd_find_reg_by_name (const char * alpha2 )
301+ static const struct rtw89_regd * rtw89_regd_find_reg_by_name (struct rtw89_dev * rtwdev ,
302+ const char * alpha2 )
299303{
304+ struct rtw89_regulatory_info * regulatory = & rtwdev -> regulatory ;
305+ const struct rtw89_regd_ctrl * regd_ctrl = & regulatory -> ctrl ;
300306 u32 i ;
301307
302- for (i = 0 ; i < ARRAY_SIZE ( rtw89_regd_map ) ; i ++ ) {
303- if (!memcmp (rtw89_regd_map [i ].alpha2 , alpha2 , 2 ))
304- return & rtw89_regd_map [i ];
308+ for (i = 0 ; i < regd_ctrl -> nr ; i ++ ) {
309+ if (!memcmp (regd_ctrl -> map [i ].alpha2 , alpha2 , 2 ))
310+ return & regd_ctrl -> map [i ];
305311 }
306312
307313 return & rtw89_ww_regd ;
@@ -312,22 +318,25 @@ static bool rtw89_regd_is_ww(const struct rtw89_regd *regd)
312318 return regd == & rtw89_ww_regd ;
313319}
314320
315- static u8 rtw89_regd_get_index (const struct rtw89_regd * regd )
321+ static u8 rtw89_regd_get_index (struct rtw89_dev * rtwdev , const struct rtw89_regd * regd )
316322{
323+ struct rtw89_regulatory_info * regulatory = & rtwdev -> regulatory ;
324+ const struct rtw89_regd_ctrl * regd_ctrl = & regulatory -> ctrl ;
325+
317326 BUILD_BUG_ON (ARRAY_SIZE (rtw89_regd_map ) > RTW89_REGD_MAX_COUNTRY_NUM );
318327
319328 if (rtw89_regd_is_ww (regd ))
320329 return RTW89_REGD_MAX_COUNTRY_NUM ;
321330
322- return regd - rtw89_regd_map ;
331+ return regd - regd_ctrl -> map ;
323332}
324333
325- static u8 rtw89_regd_get_index_by_name (const char * alpha2 )
334+ static u8 rtw89_regd_get_index_by_name (struct rtw89_dev * rtwdev , const char * alpha2 )
326335{
327336 const struct rtw89_regd * regd ;
328337
329- regd = rtw89_regd_find_reg_by_name (alpha2 );
330- return rtw89_regd_get_index (regd );
338+ regd = rtw89_regd_find_reg_by_name (rtwdev , alpha2 );
339+ return rtw89_regd_get_index (rtwdev , regd );
331340}
332341
333342#define rtw89_debug_regd (_dev , _regd , _desc , _argv ...) \
@@ -345,6 +354,7 @@ static void rtw89_regd_setup_unii4(struct rtw89_dev *rtwdev,
345354 struct wiphy * wiphy )
346355{
347356 struct rtw89_regulatory_info * regulatory = & rtwdev -> regulatory ;
357+ const struct rtw89_regd_ctrl * regd_ctrl = & regulatory -> ctrl ;
348358 const struct rtw89_chip_info * chip = rtwdev -> chip ;
349359 struct ieee80211_supported_band * sband ;
350360 struct rtw89_acpi_dsm_result res = {};
@@ -382,8 +392,8 @@ static void rtw89_regd_setup_unii4(struct rtw89_dev *rtwdev,
382392 "acpi: eval if allow unii-4: 0x%x\n" , val );
383393
384394bottom :
385- for (i = 0 ; i < ARRAY_SIZE ( rtw89_regd_map ) ; i ++ ) {
386- const struct rtw89_regd * regd = & rtw89_regd_map [i ];
395+ for (i = 0 ; i < regd_ctrl -> nr ; i ++ ) {
396+ const struct rtw89_regd * regd = & regd_ctrl -> map [i ];
387397
388398 switch (regd -> txpwr_regd [RTW89_BAND_5G ]) {
389399 case RTW89_FCC :
@@ -406,7 +416,7 @@ static void __rtw89_regd_setup_policy_6ghz(struct rtw89_dev *rtwdev, bool block,
406416 struct rtw89_regulatory_info * regulatory = & rtwdev -> regulatory ;
407417 u8 index ;
408418
409- index = rtw89_regd_get_index_by_name (alpha2 );
419+ index = rtw89_regd_get_index_by_name (rtwdev , alpha2 );
410420 if (index == RTW89_REGD_MAX_COUNTRY_NUM ) {
411421 rtw89_debug (rtwdev , RTW89_DBG_REGD , "%s: unknown alpha2 %c%c\n" ,
412422 __func__ , alpha2 [0 ], alpha2 [1 ]);
@@ -474,6 +484,7 @@ static void rtw89_regd_setup_policy_6ghz(struct rtw89_dev *rtwdev)
474484static void rtw89_regd_setup_policy_6ghz_sp (struct rtw89_dev * rtwdev )
475485{
476486 struct rtw89_regulatory_info * regulatory = & rtwdev -> regulatory ;
487+ const struct rtw89_regd_ctrl * regd_ctrl = & regulatory -> ctrl ;
477488 const struct rtw89_acpi_policy_6ghz_sp * ptr ;
478489 struct rtw89_acpi_dsm_result res = {};
479490 bool enable_by_us ;
@@ -505,8 +516,8 @@ static void rtw89_regd_setup_policy_6ghz_sp(struct rtw89_dev *rtwdev)
505516
506517 enable_by_us = u8_get_bits (ptr -> conf , RTW89_ACPI_CONF_6GHZ_SP_US );
507518
508- for (i = 0 ; i < ARRAY_SIZE ( rtw89_regd_map ) ; i ++ ) {
509- const struct rtw89_regd * tmp = & rtw89_regd_map [i ];
519+ for (i = 0 ; i < regd_ctrl -> nr ; i ++ ) {
520+ const struct rtw89_regd * tmp = & regd_ctrl -> map [i ];
510521
511522 if (enable_by_us && memcmp (tmp -> alpha2 , "US" , 2 ) == 0 )
512523 clear_bit (i , regulatory -> block_6ghz_sp );
@@ -573,8 +584,19 @@ static void rtw89_regd_setup_6ghz(struct rtw89_dev *rtwdev, struct wiphy *wiphy)
573584
574585int rtw89_regd_setup (struct rtw89_dev * rtwdev )
575586{
587+ struct rtw89_regulatory_info * regulatory = & rtwdev -> regulatory ;
588+ struct rtw89_fw_elm_info * elm_info = & rtwdev -> fw .elm_info ;
589+ const struct rtw89_regd_data * regd_data = elm_info -> regd ;
576590 struct wiphy * wiphy = rtwdev -> hw -> wiphy ;
577591
592+ if (regd_data ) {
593+ regulatory -> ctrl .nr = regd_data -> nr ;
594+ regulatory -> ctrl .map = regd_data -> map ;
595+ } else {
596+ regulatory -> ctrl .nr = ARRAY_SIZE (rtw89_regd_map );
597+ regulatory -> ctrl .map = rtw89_regd_map ;
598+ }
599+
578600 if (!wiphy )
579601 return - EINVAL ;
580602
@@ -599,7 +621,7 @@ int rtw89_regd_init(struct rtw89_dev *rtwdev,
599621 if (!wiphy )
600622 return - EINVAL ;
601623
602- chip_regd = rtw89_regd_find_reg_by_name (rtwdev -> efuse .country_code );
624+ chip_regd = rtw89_regd_find_reg_by_name (rtwdev , rtwdev -> efuse .country_code );
603625 if (!rtw89_regd_is_ww (chip_regd )) {
604626 rtwdev -> regulatory .regd = chip_regd ;
605627 /* Ignore country ie if there is a country domain programmed in chip */
@@ -637,7 +659,7 @@ static void rtw89_regd_apply_policy_unii4(struct rtw89_dev *rtwdev,
637659 if (!chip -> support_unii4 )
638660 return ;
639661
640- index = rtw89_regd_get_index (regd );
662+ index = rtw89_regd_get_index (rtwdev , regd );
641663 if (index != RTW89_REGD_MAX_COUNTRY_NUM &&
642664 !test_bit (index , regulatory -> block_unii4 ))
643665 return ;
@@ -655,7 +677,7 @@ static bool regd_is_6ghz_blocked(struct rtw89_dev *rtwdev)
655677 const struct rtw89_regd * regd = regulatory -> regd ;
656678 u8 index ;
657679
658- index = rtw89_regd_get_index (regd );
680+ index = rtw89_regd_get_index (rtwdev , regd );
659681 if (index != RTW89_REGD_MAX_COUNTRY_NUM &&
660682 !test_bit (index , regulatory -> block_6ghz ))
661683 return false;
@@ -700,7 +722,7 @@ static void rtw89_regd_notifier_apply(struct rtw89_dev *rtwdev,
700722 struct wiphy * wiphy ,
701723 struct regulatory_request * request )
702724{
703- rtwdev -> regulatory .regd = rtw89_regd_find_reg_by_name (request -> alpha2 );
725+ rtwdev -> regulatory .regd = rtw89_regd_find_reg_by_name (rtwdev , request -> alpha2 );
704726 /* This notification might be set from the system of distros,
705727 * and it does not expect the regulatory will be modified by
706728 * connecting to an AP (i.e. country ie).
@@ -925,7 +947,7 @@ static bool __rtw89_reg_6ghz_power_recalc(struct rtw89_dev *rtwdev)
925947 sel = RTW89_REG_6GHZ_POWER_DFLT ;
926948
927949 if (sel == RTW89_REG_6GHZ_POWER_STD ) {
928- index = rtw89_regd_get_index (regd );
950+ index = rtw89_regd_get_index (rtwdev , regd );
929951 if (index == RTW89_REGD_MAX_COUNTRY_NUM ||
930952 test_bit (index , regulatory -> block_6ghz_sp )) {
931953 rtw89_debug (rtwdev , RTW89_DBG_REGD ,
0 commit comments