xref: /linux/drivers/net/wireless/realtek/rtw89/regd.c (revision 60a2f25de7b8b785baee2932db932ae9a5b8c86d)
1 // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
2 /* Copyright(c) 2019-2020  Realtek Corporation
3  */
4 
5 #include "acpi.h"
6 #include "debug.h"
7 #include "ps.h"
8 #include "util.h"
9 
10 #define COUNTRY_REGD(_alpha2, _txpwr_regd...) \
11 	{.alpha2 = (_alpha2), \
12 	 .txpwr_regd = {_txpwr_regd}, \
13 	}
14 
15 static const struct rtw89_regd rtw89_ww_regd =
16 	COUNTRY_REGD("00", RTW89_WW, RTW89_WW, RTW89_WW);
17 
18 static const struct rtw89_regd rtw89_regd_map[] = {
19 	COUNTRY_REGD("AR", RTW89_MEXICO, RTW89_MEXICO, RTW89_FCC),
20 	COUNTRY_REGD("BO", RTW89_FCC, RTW89_FCC, RTW89_FCC),
21 	COUNTRY_REGD("BR", RTW89_FCC, RTW89_FCC, RTW89_FCC),
22 	COUNTRY_REGD("CL", RTW89_CHILE, RTW89_CHILE, RTW89_CHILE),
23 	COUNTRY_REGD("CO", RTW89_FCC, RTW89_FCC, RTW89_FCC),
24 	COUNTRY_REGD("CR", RTW89_FCC, RTW89_FCC, RTW89_FCC),
25 	COUNTRY_REGD("EC", RTW89_FCC, RTW89_FCC, RTW89_NA),
26 	COUNTRY_REGD("SV", RTW89_FCC, RTW89_FCC, RTW89_FCC),
27 	COUNTRY_REGD("GT", RTW89_FCC, RTW89_FCC, RTW89_FCC),
28 	COUNTRY_REGD("HN", RTW89_FCC, RTW89_FCC, RTW89_FCC),
29 	COUNTRY_REGD("MX", RTW89_MEXICO, RTW89_MEXICO, RTW89_FCC),
30 	COUNTRY_REGD("NI", RTW89_FCC, RTW89_FCC, RTW89_NA),
31 	COUNTRY_REGD("PA", RTW89_FCC, RTW89_FCC, RTW89_NA),
32 	COUNTRY_REGD("PY", RTW89_FCC, RTW89_FCC, RTW89_NA),
33 	COUNTRY_REGD("PE", RTW89_FCC, RTW89_FCC, RTW89_FCC),
34 	COUNTRY_REGD("US", RTW89_FCC, RTW89_FCC, RTW89_FCC),
35 	COUNTRY_REGD("UY", RTW89_FCC, RTW89_FCC, RTW89_NA),
36 	COUNTRY_REGD("VE", RTW89_FCC, RTW89_FCC, RTW89_NA),
37 	COUNTRY_REGD("PR", RTW89_FCC, RTW89_FCC, RTW89_NA),
38 	COUNTRY_REGD("DO", RTW89_FCC, RTW89_FCC, RTW89_NA),
39 	COUNTRY_REGD("AT", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
40 	COUNTRY_REGD("BE", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
41 	COUNTRY_REGD("CY", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
42 	COUNTRY_REGD("CZ", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
43 	COUNTRY_REGD("DK", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
44 	COUNTRY_REGD("EE", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
45 	COUNTRY_REGD("FI", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
46 	COUNTRY_REGD("FR", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
47 	COUNTRY_REGD("DE", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
48 	COUNTRY_REGD("GR", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
49 	COUNTRY_REGD("HU", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
50 	COUNTRY_REGD("IS", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
51 	COUNTRY_REGD("IE", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
52 	COUNTRY_REGD("IT", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
53 	COUNTRY_REGD("LV", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
54 	COUNTRY_REGD("LI", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
55 	COUNTRY_REGD("LT", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
56 	COUNTRY_REGD("LU", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
57 	COUNTRY_REGD("MT", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
58 	COUNTRY_REGD("MC", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
59 	COUNTRY_REGD("NL", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
60 	COUNTRY_REGD("NO", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
61 	COUNTRY_REGD("PL", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
62 	COUNTRY_REGD("PT", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
63 	COUNTRY_REGD("SK", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
64 	COUNTRY_REGD("SI", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
65 	COUNTRY_REGD("ES", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
66 	COUNTRY_REGD("SE", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
67 	COUNTRY_REGD("CH", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
68 	COUNTRY_REGD("GB", RTW89_UK, RTW89_UK, RTW89_UK),
69 	COUNTRY_REGD("AL", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
70 	COUNTRY_REGD("AZ", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
71 	COUNTRY_REGD("BH", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
72 	COUNTRY_REGD("BA", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
73 	COUNTRY_REGD("BG", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
74 	COUNTRY_REGD("HR", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
75 	COUNTRY_REGD("EG", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
76 	COUNTRY_REGD("GH", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
77 	COUNTRY_REGD("IQ", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
78 	COUNTRY_REGD("IL", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
79 	COUNTRY_REGD("JO", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
80 	COUNTRY_REGD("KZ", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
81 	COUNTRY_REGD("KE", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
82 	COUNTRY_REGD("KW", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
83 	COUNTRY_REGD("KG", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
84 	COUNTRY_REGD("LB", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
85 	COUNTRY_REGD("LS", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
86 	COUNTRY_REGD("MK", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
87 	COUNTRY_REGD("MA", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
88 	COUNTRY_REGD("MZ", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
89 	COUNTRY_REGD("NA", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
90 	COUNTRY_REGD("NG", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
91 	COUNTRY_REGD("OM", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
92 	COUNTRY_REGD("QA", RTW89_QATAR, RTW89_QATAR, RTW89_QATAR),
93 	COUNTRY_REGD("RO", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
94 	COUNTRY_REGD("RU", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
95 	COUNTRY_REGD("SA", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
96 	COUNTRY_REGD("SN", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
97 	COUNTRY_REGD("RS", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
98 	COUNTRY_REGD("ME", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
99 	COUNTRY_REGD("ZA", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
100 	COUNTRY_REGD("TR", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
101 	COUNTRY_REGD("UA", RTW89_UKRAINE, RTW89_UKRAINE, RTW89_UKRAINE),
102 	COUNTRY_REGD("AE", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
103 	COUNTRY_REGD("YE", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
104 	COUNTRY_REGD("ZW", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
105 	COUNTRY_REGD("BD", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
106 	COUNTRY_REGD("KH", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
107 	COUNTRY_REGD("CN", RTW89_CN, RTW89_CN, RTW89_CN),
108 	COUNTRY_REGD("HK", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
109 	COUNTRY_REGD("IN", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
110 	COUNTRY_REGD("ID", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
111 	COUNTRY_REGD("KR", RTW89_KCC, RTW89_KCC, RTW89_KCC),
112 	COUNTRY_REGD("MY", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
113 	COUNTRY_REGD("PK", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
114 	COUNTRY_REGD("PH", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
115 	COUNTRY_REGD("SG", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
116 	COUNTRY_REGD("LK", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
117 	COUNTRY_REGD("TW", RTW89_FCC, RTW89_FCC, RTW89_ETSI),
118 	COUNTRY_REGD("TH", RTW89_ETSI, RTW89_ETSI, RTW89_THAILAND),
119 	COUNTRY_REGD("VN", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
120 	COUNTRY_REGD("AU", RTW89_ACMA, RTW89_ACMA, RTW89_ACMA),
121 	COUNTRY_REGD("NZ", RTW89_ACMA, RTW89_ACMA, RTW89_ACMA),
122 	COUNTRY_REGD("PG", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
123 	COUNTRY_REGD("CA", RTW89_IC, RTW89_IC, RTW89_IC),
124 	COUNTRY_REGD("JP", RTW89_MKK, RTW89_MKK, RTW89_MKK),
125 	COUNTRY_REGD("JM", RTW89_FCC, RTW89_FCC, RTW89_FCC),
126 	COUNTRY_REGD("AN", RTW89_FCC, RTW89_FCC, RTW89_FCC),
127 	COUNTRY_REGD("TT", RTW89_FCC, RTW89_FCC, RTW89_NA),
128 	COUNTRY_REGD("TN", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
129 	COUNTRY_REGD("AF", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
130 	COUNTRY_REGD("DZ", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
131 	COUNTRY_REGD("AS", RTW89_FCC, RTW89_FCC, RTW89_NA),
132 	COUNTRY_REGD("AD", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
133 	COUNTRY_REGD("AO", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
134 	COUNTRY_REGD("AI", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
135 	COUNTRY_REGD("AQ", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
136 	COUNTRY_REGD("AG", RTW89_FCC, RTW89_FCC, RTW89_FCC),
137 	COUNTRY_REGD("AM", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
138 	COUNTRY_REGD("AW", RTW89_FCC, RTW89_FCC, RTW89_FCC),
139 	COUNTRY_REGD("BS", RTW89_FCC, RTW89_FCC, RTW89_FCC),
140 	COUNTRY_REGD("BB", RTW89_FCC, RTW89_FCC, RTW89_FCC),
141 	COUNTRY_REGD("BY", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
142 	COUNTRY_REGD("BZ", RTW89_FCC, RTW89_FCC, RTW89_NA),
143 	COUNTRY_REGD("BJ", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
144 	COUNTRY_REGD("BM", RTW89_FCC, RTW89_FCC, RTW89_FCC),
145 	COUNTRY_REGD("BT", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
146 	COUNTRY_REGD("BW", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
147 	COUNTRY_REGD("BV", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
148 	COUNTRY_REGD("IO", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
149 	COUNTRY_REGD("VG", RTW89_FCC, RTW89_FCC, RTW89_FCC),
150 	COUNTRY_REGD("BN", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
151 	COUNTRY_REGD("BF", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
152 	COUNTRY_REGD("MM", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
153 	COUNTRY_REGD("BI", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
154 	COUNTRY_REGD("CM", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
155 	COUNTRY_REGD("CV", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
156 	COUNTRY_REGD("KY", RTW89_FCC, RTW89_FCC, RTW89_FCC),
157 	COUNTRY_REGD("CF", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
158 	COUNTRY_REGD("TD", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
159 	COUNTRY_REGD("CX", RTW89_ACMA, RTW89_ACMA, RTW89_NA),
160 	COUNTRY_REGD("CC", RTW89_ACMA, RTW89_ACMA, RTW89_NA),
161 	COUNTRY_REGD("KM", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
162 	COUNTRY_REGD("CG", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
163 	COUNTRY_REGD("CD", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
164 	COUNTRY_REGD("CK", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
165 	COUNTRY_REGD("CI", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
166 	COUNTRY_REGD("DJ", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
167 	COUNTRY_REGD("DM", RTW89_FCC, RTW89_FCC, RTW89_NA),
168 	COUNTRY_REGD("GQ", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
169 	COUNTRY_REGD("ER", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
170 	COUNTRY_REGD("ET", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
171 	COUNTRY_REGD("FK", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
172 	COUNTRY_REGD("FO", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
173 	COUNTRY_REGD("FJ", RTW89_FCC, RTW89_FCC, RTW89_NA),
174 	COUNTRY_REGD("GF", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
175 	COUNTRY_REGD("PF", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
176 	COUNTRY_REGD("TF", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
177 	COUNTRY_REGD("GA", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
178 	COUNTRY_REGD("GM", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
179 	COUNTRY_REGD("GE", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
180 	COUNTRY_REGD("GI", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
181 	COUNTRY_REGD("GL", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
182 	COUNTRY_REGD("GD", RTW89_FCC, RTW89_FCC, RTW89_FCC),
183 	COUNTRY_REGD("GP", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
184 	COUNTRY_REGD("GU", RTW89_FCC, RTW89_FCC, RTW89_NA),
185 	COUNTRY_REGD("GG", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
186 	COUNTRY_REGD("GN", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
187 	COUNTRY_REGD("GW", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
188 	COUNTRY_REGD("GY", RTW89_FCC, RTW89_FCC, RTW89_NA),
189 	COUNTRY_REGD("HT", RTW89_FCC, RTW89_FCC, RTW89_FCC),
190 	COUNTRY_REGD("HM", RTW89_ACMA, RTW89_ACMA, RTW89_NA),
191 	COUNTRY_REGD("VA", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
192 	COUNTRY_REGD("IM", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
193 	COUNTRY_REGD("JE", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
194 	COUNTRY_REGD("KI", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
195 	COUNTRY_REGD("XK", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
196 	COUNTRY_REGD("LA", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
197 	COUNTRY_REGD("LR", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
198 	COUNTRY_REGD("LY", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
199 	COUNTRY_REGD("MO", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
200 	COUNTRY_REGD("MG", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
201 	COUNTRY_REGD("MW", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
202 	COUNTRY_REGD("MV", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
203 	COUNTRY_REGD("ML", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
204 	COUNTRY_REGD("MH", RTW89_FCC, RTW89_FCC, RTW89_NA),
205 	COUNTRY_REGD("MQ", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
206 	COUNTRY_REGD("MR", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
207 	COUNTRY_REGD("MU", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
208 	COUNTRY_REGD("YT", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
209 	COUNTRY_REGD("FM", RTW89_FCC, RTW89_FCC, RTW89_NA),
210 	COUNTRY_REGD("MD", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
211 	COUNTRY_REGD("MN", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
212 	COUNTRY_REGD("MS", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
213 	COUNTRY_REGD("NR", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
214 	COUNTRY_REGD("NP", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
215 	COUNTRY_REGD("NC", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
216 	COUNTRY_REGD("NE", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
217 	COUNTRY_REGD("NU", RTW89_ACMA, RTW89_ACMA, RTW89_NA),
218 	COUNTRY_REGD("NF", RTW89_ACMA, RTW89_ACMA, RTW89_NA),
219 	COUNTRY_REGD("MP", RTW89_FCC, RTW89_FCC, RTW89_NA),
220 	COUNTRY_REGD("PW", RTW89_FCC, RTW89_FCC, RTW89_NA),
221 	COUNTRY_REGD("RE", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
222 	COUNTRY_REGD("RW", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
223 	COUNTRY_REGD("SH", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
224 	COUNTRY_REGD("KN", RTW89_FCC, RTW89_FCC, RTW89_FCC),
225 	COUNTRY_REGD("LC", RTW89_FCC, RTW89_FCC, RTW89_FCC),
226 	COUNTRY_REGD("MF", RTW89_FCC, RTW89_FCC, RTW89_NA),
227 	COUNTRY_REGD("SX", RTW89_FCC, RTW89_FCC, RTW89_NA),
228 	COUNTRY_REGD("PM", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
229 	COUNTRY_REGD("VC", RTW89_FCC, RTW89_FCC, RTW89_NA),
230 	COUNTRY_REGD("WS", RTW89_FCC, RTW89_FCC, RTW89_NA),
231 	COUNTRY_REGD("SM", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
232 	COUNTRY_REGD("ST", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
233 	COUNTRY_REGD("SC", RTW89_FCC, RTW89_FCC, RTW89_NA),
234 	COUNTRY_REGD("SL", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
235 	COUNTRY_REGD("SB", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
236 	COUNTRY_REGD("SO", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
237 	COUNTRY_REGD("GS", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
238 	COUNTRY_REGD("SR", RTW89_FCC, RTW89_FCC, RTW89_FCC),
239 	COUNTRY_REGD("SJ", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
240 	COUNTRY_REGD("SZ", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
241 	COUNTRY_REGD("TJ", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
242 	COUNTRY_REGD("TZ", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
243 	COUNTRY_REGD("TG", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
244 	COUNTRY_REGD("TK", RTW89_ACMA, RTW89_ACMA, RTW89_NA),
245 	COUNTRY_REGD("TO", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
246 	COUNTRY_REGD("TM", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
247 	COUNTRY_REGD("TC", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
248 	COUNTRY_REGD("TV", RTW89_ETSI, RTW89_NA, RTW89_NA),
249 	COUNTRY_REGD("UG", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
250 	COUNTRY_REGD("VI", RTW89_FCC, RTW89_FCC, RTW89_NA),
251 	COUNTRY_REGD("UZ", RTW89_ETSI, RTW89_ETSI, RTW89_ETSI),
252 	COUNTRY_REGD("VU", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
253 	COUNTRY_REGD("WF", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
254 	COUNTRY_REGD("EH", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
255 	COUNTRY_REGD("ZM", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
256 	COUNTRY_REGD("IR", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
257 	COUNTRY_REGD("PS", RTW89_ETSI, RTW89_ETSI, RTW89_NA),
258 };
259 
260 static const char rtw89_alpha2_list_eu[][3] = {
261 	"AT",
262 	"BE",
263 	"CY",
264 	"CZ",
265 	"DK",
266 	"EE",
267 	"FI",
268 	"FR",
269 	"DE",
270 	"GR",
271 	"HU",
272 	"IS",
273 	"IE",
274 	"IT",
275 	"LV",
276 	"LI",
277 	"LT",
278 	"LU",
279 	"MT",
280 	"MC",
281 	"NL",
282 	"NO",
283 	"PL",
284 	"PT",
285 	"SK",
286 	"SI",
287 	"ES",
288 	"SE",
289 	"CH",
290 	"BG",
291 	"HR",
292 	"RO",
293 };
294 
295 static const struct rtw89_regd *rtw89_regd_find_reg_by_name(const char *alpha2)
296 {
297 	u32 i;
298 
299 	for (i = 0; i < ARRAY_SIZE(rtw89_regd_map); i++) {
300 		if (!memcmp(rtw89_regd_map[i].alpha2, alpha2, 2))
301 			return &rtw89_regd_map[i];
302 	}
303 
304 	return &rtw89_ww_regd;
305 }
306 
307 static bool rtw89_regd_is_ww(const struct rtw89_regd *regd)
308 {
309 	return regd == &rtw89_ww_regd;
310 }
311 
312 static u8 rtw89_regd_get_index(const struct rtw89_regd *regd)
313 {
314 	BUILD_BUG_ON(ARRAY_SIZE(rtw89_regd_map) > RTW89_REGD_MAX_COUNTRY_NUM);
315 
316 	if (rtw89_regd_is_ww(regd))
317 		return RTW89_REGD_MAX_COUNTRY_NUM;
318 
319 	return regd - rtw89_regd_map;
320 }
321 
322 static u8 rtw89_regd_get_index_by_name(const char *alpha2)
323 {
324 	const struct rtw89_regd *regd;
325 
326 	regd = rtw89_regd_find_reg_by_name(alpha2);
327 	return rtw89_regd_get_index(regd);
328 }
329 
330 #define rtw89_debug_regd(_dev, _regd, _desc, _argv...) \
331 do { \
332 	typeof(_regd) __r = _regd; \
333 	rtw89_debug(_dev, RTW89_DBG_REGD, _desc \
334 		    ": %c%c: mapping txregd to {2g: %d, 5g: %d, 6g: %d}\n", \
335 		    ##_argv, __r->alpha2[0], __r->alpha2[1], \
336 		    __r->txpwr_regd[RTW89_BAND_2G], \
337 		    __r->txpwr_regd[RTW89_BAND_5G], \
338 		    __r->txpwr_regd[RTW89_BAND_6G]); \
339 } while (0)
340 
341 static void rtw89_regd_setup_unii4(struct rtw89_dev *rtwdev,
342 				   struct wiphy *wiphy)
343 {
344 	const struct rtw89_chip_info *chip = rtwdev->chip;
345 	bool regd_allow_unii_4 = chip->support_unii4;
346 	struct ieee80211_supported_band *sband;
347 	struct rtw89_acpi_dsm_result res = {};
348 	int ret;
349 	u8 val;
350 
351 	if (!chip->support_unii4)
352 		goto bottom;
353 
354 	ret = rtw89_acpi_evaluate_dsm(rtwdev, RTW89_ACPI_DSM_FUNC_59G_EN, &res);
355 	if (ret) {
356 		rtw89_debug(rtwdev, RTW89_DBG_REGD,
357 			    "acpi: cannot eval unii 4: %d\n", ret);
358 		goto bottom;
359 	}
360 
361 	val = res.u.value;
362 
363 	rtw89_debug(rtwdev, RTW89_DBG_REGD,
364 		    "acpi: eval if allow unii 4: %d\n", val);
365 
366 	switch (val) {
367 	case 0:
368 		regd_allow_unii_4 = false;
369 		break;
370 	case 1:
371 		regd_allow_unii_4 = true;
372 		break;
373 	default:
374 		break;
375 	}
376 
377 bottom:
378 	rtw89_debug(rtwdev, RTW89_DBG_REGD, "regd: allow unii 4: %d\n",
379 		    regd_allow_unii_4);
380 
381 	if (regd_allow_unii_4)
382 		return;
383 
384 	sband = wiphy->bands[NL80211_BAND_5GHZ];
385 	if (!sband)
386 		return;
387 
388 	sband->n_channels -= 3;
389 }
390 
391 static void __rtw89_regd_setup_policy_6ghz(struct rtw89_dev *rtwdev, bool block,
392 					   const char *alpha2)
393 {
394 	struct rtw89_regulatory_info *regulatory = &rtwdev->regulatory;
395 	u8 index;
396 
397 	index = rtw89_regd_get_index_by_name(alpha2);
398 	if (index == RTW89_REGD_MAX_COUNTRY_NUM) {
399 		rtw89_debug(rtwdev, RTW89_DBG_REGD, "%s: unknown alpha2 %c%c\n",
400 			    __func__, alpha2[0], alpha2[1]);
401 		return;
402 	}
403 
404 	if (block)
405 		set_bit(index, regulatory->block_6ghz);
406 	else
407 		clear_bit(index, regulatory->block_6ghz);
408 }
409 
410 static void rtw89_regd_setup_policy_6ghz(struct rtw89_dev *rtwdev)
411 {
412 	struct rtw89_regulatory_info *regulatory = &rtwdev->regulatory;
413 	const struct rtw89_acpi_country_code *country;
414 	const struct rtw89_acpi_policy_6ghz *ptr;
415 	struct rtw89_acpi_dsm_result res = {};
416 	bool to_block;
417 	int i, j;
418 	int ret;
419 
420 	ret = rtw89_acpi_evaluate_dsm(rtwdev, RTW89_ACPI_DSM_FUNC_6G_BP, &res);
421 	if (ret) {
422 		rtw89_debug(rtwdev, RTW89_DBG_REGD,
423 			    "acpi: cannot eval policy 6ghz: %d\n", ret);
424 		return;
425 	}
426 
427 	ptr = res.u.policy_6ghz;
428 
429 	switch (ptr->policy_mode) {
430 	case RTW89_ACPI_POLICY_BLOCK:
431 		to_block = true;
432 		break;
433 	case RTW89_ACPI_POLICY_ALLOW:
434 		to_block = false;
435 		/* only below list is allowed; block all first */
436 		bitmap_fill(regulatory->block_6ghz, RTW89_REGD_MAX_COUNTRY_NUM);
437 		break;
438 	default:
439 		rtw89_debug(rtwdev, RTW89_DBG_REGD,
440 			    "%s: unknown policy mode: %d\n", __func__,
441 			    ptr->policy_mode);
442 		goto out;
443 	}
444 
445 	for (i = 0; i < ptr->country_count; i++) {
446 		country = &ptr->country_list[i];
447 		if (memcmp("EU", country->alpha2, 2) != 0) {
448 			__rtw89_regd_setup_policy_6ghz(rtwdev, to_block,
449 						       country->alpha2);
450 			continue;
451 		}
452 
453 		for (j = 0; j < ARRAY_SIZE(rtw89_alpha2_list_eu); j++)
454 			__rtw89_regd_setup_policy_6ghz(rtwdev, to_block,
455 						       rtw89_alpha2_list_eu[j]);
456 	}
457 
458 out:
459 	kfree(ptr);
460 }
461 
462 static void rtw89_regd_setup_6ghz(struct rtw89_dev *rtwdev, struct wiphy *wiphy)
463 {
464 	const struct rtw89_chip_info *chip = rtwdev->chip;
465 	bool chip_support_6ghz = chip->support_bands & BIT(NL80211_BAND_6GHZ);
466 	bool regd_allow_6ghz = chip_support_6ghz;
467 	struct ieee80211_supported_band *sband;
468 	struct rtw89_acpi_dsm_result res = {};
469 	int ret;
470 	u8 val;
471 
472 	if (!chip_support_6ghz)
473 		goto bottom;
474 
475 	ret = rtw89_acpi_evaluate_dsm(rtwdev, RTW89_ACPI_DSM_FUNC_6G_DIS, &res);
476 	if (ret) {
477 		rtw89_debug(rtwdev, RTW89_DBG_REGD,
478 			    "acpi: cannot eval 6ghz: %d\n", ret);
479 		goto bottom;
480 	}
481 
482 	val = res.u.value;
483 
484 	rtw89_debug(rtwdev, RTW89_DBG_REGD,
485 		    "acpi: eval if disallow 6ghz: %d\n", val);
486 
487 	switch (val) {
488 	case 0:
489 		regd_allow_6ghz = true;
490 		break;
491 	case 1:
492 		regd_allow_6ghz = false;
493 		break;
494 	default:
495 		break;
496 	}
497 
498 bottom:
499 	rtw89_debug(rtwdev, RTW89_DBG_REGD, "regd: allow 6ghz: %d\n",
500 		    regd_allow_6ghz);
501 
502 	if (regd_allow_6ghz) {
503 		rtw89_regd_setup_policy_6ghz(rtwdev);
504 		return;
505 	}
506 
507 	sband = wiphy->bands[NL80211_BAND_6GHZ];
508 	if (!sband)
509 		return;
510 
511 	wiphy->bands[NL80211_BAND_6GHZ] = NULL;
512 	kfree((__force void *)sband->iftype_data);
513 	kfree(sband);
514 }
515 
516 int rtw89_regd_setup(struct rtw89_dev *rtwdev)
517 {
518 	struct wiphy *wiphy = rtwdev->hw->wiphy;
519 
520 	if (!wiphy)
521 		return -EINVAL;
522 
523 	rtw89_regd_setup_unii4(rtwdev, wiphy);
524 	rtw89_regd_setup_6ghz(rtwdev, wiphy);
525 
526 	wiphy->reg_notifier = rtw89_regd_notifier;
527 	return 0;
528 }
529 
530 int rtw89_regd_init(struct rtw89_dev *rtwdev,
531 		    void (*reg_notifier)(struct wiphy *wiphy,
532 					 struct regulatory_request *request))
533 {
534 	struct rtw89_regulatory_info *regulatory = &rtwdev->regulatory;
535 	const struct rtw89_regd *chip_regd;
536 	struct wiphy *wiphy = rtwdev->hw->wiphy;
537 	int ret;
538 
539 	regulatory->reg_6ghz_power = RTW89_REG_6GHZ_POWER_DFLT;
540 
541 	if (!wiphy)
542 		return -EINVAL;
543 
544 	chip_regd = rtw89_regd_find_reg_by_name(rtwdev->efuse.country_code);
545 	if (!rtw89_regd_is_ww(chip_regd)) {
546 		rtwdev->regulatory.regd = chip_regd;
547 		/* Ignore country ie if there is a country domain programmed in chip */
548 		wiphy->regulatory_flags |= REGULATORY_COUNTRY_IE_IGNORE;
549 		wiphy->regulatory_flags |= REGULATORY_STRICT_REG;
550 
551 		ret = regulatory_hint(rtwdev->hw->wiphy,
552 				      rtwdev->regulatory.regd->alpha2);
553 		if (ret)
554 			rtw89_warn(rtwdev, "failed to hint regulatory:%d\n", ret);
555 
556 		rtw89_debug_regd(rtwdev, chip_regd, "efuse country code");
557 		return 0;
558 	}
559 
560 	rtw89_debug_regd(rtwdev, rtwdev->regulatory.regd,
561 			 "worldwide roaming chip, follow the setting of stack");
562 	return 0;
563 }
564 
565 static void rtw89_regd_apply_policy_6ghz(struct rtw89_dev *rtwdev,
566 					 struct wiphy *wiphy)
567 {
568 	struct rtw89_regulatory_info *regulatory = &rtwdev->regulatory;
569 	const struct rtw89_regd *regd = regulatory->regd;
570 	struct ieee80211_supported_band *sband;
571 	u8 index;
572 	int i;
573 
574 	index = rtw89_regd_get_index(regd);
575 	if (index == RTW89_REGD_MAX_COUNTRY_NUM)
576 		return;
577 
578 	if (!test_bit(index, regulatory->block_6ghz))
579 		return;
580 
581 	rtw89_debug(rtwdev, RTW89_DBG_REGD, "%c%c 6 GHz is blocked by policy\n",
582 		    regd->alpha2[0], regd->alpha2[1]);
583 
584 	sband = wiphy->bands[NL80211_BAND_6GHZ];
585 	if (!sband)
586 		return;
587 
588 	for (i = 0; i < sband->n_channels; i++)
589 		sband->channels[i].flags |= IEEE80211_CHAN_DISABLED;
590 }
591 
592 static void rtw89_regd_notifier_apply(struct rtw89_dev *rtwdev,
593 				      struct wiphy *wiphy,
594 				      struct regulatory_request *request)
595 {
596 	rtwdev->regulatory.regd = rtw89_regd_find_reg_by_name(request->alpha2);
597 	/* This notification might be set from the system of distros,
598 	 * and it does not expect the regulatory will be modified by
599 	 * connecting to an AP (i.e. country ie).
600 	 */
601 	if (request->initiator == NL80211_REGDOM_SET_BY_USER &&
602 	    !rtw89_regd_is_ww(rtwdev->regulatory.regd))
603 		wiphy->regulatory_flags |= REGULATORY_COUNTRY_IE_IGNORE;
604 	else
605 		wiphy->regulatory_flags &= ~REGULATORY_COUNTRY_IE_IGNORE;
606 
607 	rtw89_regd_apply_policy_6ghz(rtwdev, wiphy);
608 }
609 
610 void rtw89_regd_notifier(struct wiphy *wiphy, struct regulatory_request *request)
611 {
612 	struct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy);
613 	struct rtw89_dev *rtwdev = hw->priv;
614 
615 	mutex_lock(&rtwdev->mutex);
616 	rtw89_leave_ps_mode(rtwdev);
617 
618 	if (wiphy->regd) {
619 		rtw89_debug(rtwdev, RTW89_DBG_REGD,
620 			    "There is a country domain programmed in chip, ignore notifications\n");
621 		goto exit;
622 	}
623 	rtw89_regd_notifier_apply(rtwdev, wiphy, request);
624 	rtw89_debug_regd(rtwdev, rtwdev->regulatory.regd,
625 			 "get from initiator %d, alpha2",
626 			 request->initiator);
627 
628 	rtw89_core_set_chip_txpwr(rtwdev);
629 
630 exit:
631 	mutex_unlock(&rtwdev->mutex);
632 }
633 
634 static void __rtw89_reg_6ghz_power_recalc(struct rtw89_dev *rtwdev)
635 {
636 	struct rtw89_regulatory_info *regulatory = &rtwdev->regulatory;
637 	enum rtw89_reg_6ghz_power sel;
638 	const struct rtw89_chan *chan;
639 	struct rtw89_vif *rtwvif;
640 	int count = 0;
641 
642 	rtw89_for_each_rtwvif(rtwdev, rtwvif) {
643 		chan = rtw89_chan_get(rtwdev, rtwvif->sub_entity_idx);
644 		if (chan->band_type != RTW89_BAND_6G)
645 			continue;
646 
647 		if (count != 0 && rtwvif->reg_6ghz_power == sel)
648 			continue;
649 
650 		sel = rtwvif->reg_6ghz_power;
651 		count++;
652 	}
653 
654 	if (count != 1)
655 		sel = RTW89_REG_6GHZ_POWER_DFLT;
656 
657 	if (regulatory->reg_6ghz_power == sel)
658 		return;
659 
660 	rtw89_debug(rtwdev, RTW89_DBG_REGD,
661 		    "recalc 6 GHz reg power type to %d\n", sel);
662 
663 	regulatory->reg_6ghz_power = sel;
664 
665 	rtw89_core_set_chip_txpwr(rtwdev);
666 }
667 
668 void rtw89_reg_6ghz_power_recalc(struct rtw89_dev *rtwdev,
669 				 struct rtw89_vif *rtwvif, bool active)
670 {
671 	struct ieee80211_vif *vif = rtwvif_to_vif(rtwvif);
672 
673 	lockdep_assert_held(&rtwdev->mutex);
674 
675 	if (active) {
676 		switch (vif->bss_conf.power_type) {
677 		case IEEE80211_REG_VLP_AP:
678 			rtwvif->reg_6ghz_power = RTW89_REG_6GHZ_POWER_VLP;
679 			break;
680 		case IEEE80211_REG_LPI_AP:
681 			rtwvif->reg_6ghz_power = RTW89_REG_6GHZ_POWER_LPI;
682 			break;
683 		case IEEE80211_REG_SP_AP:
684 			rtwvif->reg_6ghz_power = RTW89_REG_6GHZ_POWER_STD;
685 			break;
686 		default:
687 			rtwvif->reg_6ghz_power = RTW89_REG_6GHZ_POWER_DFLT;
688 			break;
689 		}
690 	} else {
691 		rtwvif->reg_6ghz_power = RTW89_REG_6GHZ_POWER_DFLT;
692 	}
693 
694 	__rtw89_reg_6ghz_power_recalc(rtwdev);
695 }
696