1 /*
2  * Copyright (c) 2017-2021 The Linux Foundation. All rights reserved.
3  * Copyright (c) 2021-2024 Qualcomm Innovation Center, Inc. All rights reserved.
4  *
5  * Permission to use, copy, modify, and/or distribute this software for
6  * any purpose with or without fee is hereby granted, provided that the
7  * above copyright notice and this permission notice appear in all
8  * copies.
9  *
10  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
11  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
12  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
13  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
14  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
15  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
16  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17  * PERFORMANCE OF THIS SOFTWARE.
18  */
19 
20 /**
21  * DOC: reg_services_public_struct.h
22  * This file contains regulatory data structures
23  */
24 
25 #ifndef __REG_SERVICES_PUBLIC_STRUCT_H_
26 #define __REG_SERVICES_PUBLIC_STRUCT_H_
27 
28 #ifdef CONFIG_AFC_SUPPORT
29 #include <wlan_reg_afc.h>
30 #endif
31 
32 #ifdef CONFIG_BAND_6GHZ
33 #define REG_MAX_CHANNELS_PER_OPERATING_CLASS        70
34 /*
35  * These tx-power macros are present till the 6G regdomains are defined to
36  * support tx-power values for various client types.
37  */
38 #define REG_PSD_MAX_TXPOWER_FOR_DEFAULT_CLIENT      (-1) /* dBm */
39 #define REG_PSD_MAX_TXPOWER_FOR_SUBORDINATE_CLIENT  5    /* dBm */
40 #define REG_EIRP_MAX_TXPOWER_FOR_SUBORDINATE_CLIENT 24   /* dBm */
41 #else
42 #define REG_MAX_CHANNELS_PER_OPERATING_CLASS        28
43 #endif
44 
45 #define REG_MAX_SUPP_OPER_CLASSES 32
46 #define REG_MAX_CHAN_CHANGE_CBKS 30
47 #define REG_INVALID_TXPOWER 255
48 #define MAX_STA_VDEV_CNT 4
49 #define INVALID_VDEV_ID 0xFF
50 #define INVALID_CHANNEL_NUM 0x0
51 #define CH_AVOID_MAX_RANGE   (NUM_5GHZ_CHANNELS + NUM_24GHZ_CHANNELS)
52 #define REG_ALPHA2_LEN 2
53 #define MAX_REG_RULES 10
54 #define MAX_6G_REG_RULES 5
55 
56 #define REGULATORY_CHAN_DISABLED     BIT(0)
57 #define REGULATORY_CHAN_NO_IR        BIT(1)
58 #define REGULATORY_CHAN_RADAR        BIT(3)
59 #define REGULATORY_CHAN_NO_OFDM      BIT(6)
60 #define REGULATORY_CHAN_INDOOR_ONLY  BIT(9)
61 #define REGULATORY_CHAN_AFC          BIT(13)
62 #define REGULATORY_CHAN_AFC_NOT_DONE BIT(16)
63 
64 #define REGULATORY_CHAN_NO_HT40      BIT(4)
65 #define REGULATORY_CHAN_NO_80MHZ     BIT(7)
66 #define REGULATORY_CHAN_NO_160MHZ    BIT(8)
67 #define REGULATORY_CHAN_NO_20MHZ     BIT(11)
68 #define REGULATORY_CHAN_NO_10MHZ     BIT(12)
69 #define REGULATORY_CHAN_INVALID      BIT(14)
70 
71 #define REGULATORY_PHYMODE_NO11A     BIT(0)
72 #define REGULATORY_PHYMODE_NO11B     BIT(1)
73 #define REGULATORY_PHYMODE_NO11G     BIT(2)
74 #define REGULATORY_CHAN_NO11N        BIT(3)
75 #define REGULATORY_PHYMODE_NO11AC    BIT(4)
76 #define REGULATORY_PHYMODE_NO11AX    BIT(5)
77 #ifdef WLAN_FEATURE_11BE
78 #define REGULATORY_PHYMODE_NO11BE    BIT(6)
79 #endif
80 
81 #define BW_5_MHZ      5
82 #define BW_10_MHZ     10
83 #define BW_20_MHZ     20
84 #define BW_25_MHZ     25
85 #define BW_40_MHZ     40
86 #define BW_80_MHZ     80
87 #define BW_160_MHZ    160
88 #ifdef WLAN_FEATURE_11BE
89 #define BW_320_MHZ    320
90 #endif
91 #define BW_40_MHZ     40
92 
93 #define MAX_NUM_PWR_LEVEL 16
94 
95 #ifdef CONFIG_REG_CLIENT
96 #define MAX_NUM_FCC_RULES 2
97 /*
98  * As per spec valid range is range –64 dBm to 63 dBm.
99  * Powers in range of 64 - 191 will be invalid.
100  */
101 #define INVALID_TPE_POWER 100
102 /* 802.11ax-2021 Table 9-276 Meaning of Local Maximum Transmit Power Count
103  * subfield if the Maximum Transmit Power Interpretation subfield is 0 or 2
104  */
105 #define MAX_TX_PWR_COUNT_FOR_160MHZ 3
106 /* 802.11ax-2021 Table 9-277 Meaning of Maximum Transmit Power Count subfield
107  * if Maximum Transmit Power Interpretation subfield is 1 or 3
108  */
109 #define MAX_TX_PWR_COUNT_FOR_160MHZ_PSD 4
110 #define MAX_NUM_TX_POWER_FOR_320MHZ 5
111 #define PUNCTURED_CHAN_POWER 128
112 #endif
113 
114 /* no subchannels punctured */
115 #define NO_SCHANS_PUNC 0x0000
116 
117 #define REG_MIN_POWER -128
118 
119 /**
120  * enum dfs_reg - DFS region
121  * @DFS_UNINIT_REGION: un-initialized region
122  * @DFS_FCC_REGION: FCC region
123  * @DFS_ETSI_REGION: ETSI region
124  * @DFS_MKK_REGION: MKK region
125  * @DFS_CN_REGION: China region
126  * @DFS_KR_REGION: Korea region
127  * @DFS_MKKN_REGION: MKKN region
128  * that supports updated W53 RADAR pattern
129  * detection.
130  * @DFS_UNDEF_REGION: Undefined region
131  */
132 
133 enum dfs_reg {
134 	DFS_UNINIT_REGION = 0,
135 	DFS_FCC_REGION = 1,
136 	DFS_ETSI_REGION = 2,
137 	DFS_MKK_REGION = 3,
138 	DFS_CN_REGION = 4,
139 	DFS_KR_REGION = 5,
140 	DFS_MKKN_REGION = 6,
141 	DFS_UNDEF_REGION = 0xFFFF,
142 };
143 
144 /**
145  * enum op_class_table_num
146  * @OP_CLASS_US: Class corresponds to US
147  * @OP_CLASS_EU: Class corresponds to EU
148  * @OP_CLASS_JAPAN: Class corresponds to JAPAN
149  * @OP_CLASS_GLOBAL: Class corresponds to GLOBAL
150  * @OP_CLASS_CHINA: Class corresponds to CHINA
151  */
152 enum op_class_table_num {
153 	OP_CLASS_US = 1,
154 	OP_CLASS_EU,
155 	OP_CLASS_JAPAN,
156 	OP_CLASS_GLOBAL,
157 	OP_CLASS_CHINA
158 };
159 
160 /*
161  * NB: not using kernel-doc comment marker since kernel-doc doesn't
162  *     properly handle the conditional compilation
163  * enum channel_enum - channel enumeration
164  * @CHAN_ENUM_2412: channel with freq 2412
165  * @CHAN_ENUM_2417: channel with freq 2417
166  * @CHAN_ENUM_2422: channel with freq 2422
167  * @CHAN_ENUM_2427: channel with freq 2427
168  * @CHAN_ENUM_2432: channel with freq 2432
169  * @CHAN_ENUM_2437: channel with freq 2437
170  * @CHAN_ENUM_2442: channel with freq 2442
171  * @CHAN_ENUM_2447: channel with freq 2447
172  * @CHAN_ENUM_2452: channel with freq 2452
173  * @CHAN_ENUM_2457: channel with freq 2457
174  * @CHAN_ENUM_2462: channel with freq 2462
175  * @CHAN_ENUM_2467: channel with freq 2467
176  * @CHAN_ENUM_2472: channel with freq 2472
177  * @CHAN_ENUM_2484: channel with freq 2484
178  * @CHAN_ENUM_4912: channel with freq 4912
179  * @CHAN_ENUM_4915: channel with freq 4915
180  * @CHAN_ENUM_4917: channel with freq 4917
181  * @CHAN_ENUM_4920: channel with freq 4920
182  * @CHAN_ENUM_4922: channel with freq 4922
183  * @CHAN_ENUM_4925: channel with freq 4925
184  * @CHAN_ENUM_4927: channel with freq 4927
185  * @CHAN_ENUM_4932: channel with freq 4932
186  * @CHAN_ENUM_4935: channel with freq 4935
187  * @CHAN_ENUM_4937: channel with freq 4937
188  * @CHAN_ENUM_4940: channel with freq 4940
189  * @CHAN_ENUM_4942: channel with freq 4942
190  * @CHAN_ENUM_4945: channel with freq 4945
191  * @CHAN_ENUM_4947: channel with freq 4947
192  * @CHAN_ENUM_4950: channel with freq 4950
193  * @CHAN_ENUM_4952: channel with freq 4952
194  * @CHAN_ENUM_4955: channel with freq 4955
195  * @CHAN_ENUM_4957: channel with freq 4957
196  * @CHAN_ENUM_4960: channel with freq 4960
197  * @CHAN_ENUM_4962: channel with freq 4962
198  * @CHAN_ENUM_4965: channel with freq 4965
199  * @CHAN_ENUM_4967: channel with freq 4967
200  * @CHAN_ENUM_4970: channel with freq 4970
201  * @CHAN_ENUM_4972: channel with freq 4972
202  * @CHAN_ENUM_4975: channel with freq 4975
203  * @CHAN_ENUM_4977: channel with freq 4977
204  * @CHAN_ENUM_4980: channel with freq 4980
205  * @CHAN_ENUM_4982: channel with freq 4982
206  * @CHAN_ENUM_4985: channel with freq 4985
207  * @CHAN_ENUM_4987: channel with freq 4987
208  * @CHAN_ENUM_5032: channel with freq 5032
209  * @CHAN_ENUM_5035: channel with freq 5035
210  * @CHAN_ENUM_5037: channel with freq 5037
211  * @CHAN_ENUM_5040: channel with freq 5040
212  * @CHAN_ENUM_5042: channel with freq 5042
213  * @CHAN_ENUM_5045: channel with freq 5045
214  * @CHAN_ENUM_5047: channel with freq 5047
215  * @CHAN_ENUM_5052: channel with freq 5052
216  * @CHAN_ENUM_5055: channel with freq 5055
217  * @CHAN_ENUM_5057: channel with freq 5057
218  * @CHAN_ENUM_5060: channel with freq 5060
219  * @CHAN_ENUM_5080: channel with freq 5080
220  * @CHAN_ENUM_5180: channel with freq 5180
221  * @CHAN_ENUM_5200: channel with freq 5200
222  * @CHAN_ENUM_5220: channel with freq 5220
223  * @CHAN_ENUM_5240: channel with freq 5240
224  * @CHAN_ENUM_5260: channel with freq 5260
225  * @CHAN_ENUM_5280: channel with freq 5280
226  * @CHAN_ENUM_5300: channel with freq 5300
227  * @CHAN_ENUM_5320: channel with freq 5320
228  * @CHAN_ENUM_5500: channel with freq 5500
229  * @CHAN_ENUM_5520: channel with freq 5520
230  * @CHAN_ENUM_5540: channel with freq 5540
231  * @CHAN_ENUM_5560: channel with freq 5560
232  * @CHAN_ENUM_5580: channel with freq 5580
233  * @CHAN_ENUM_5600: channel with freq 5600
234  * @CHAN_ENUM_5620: channel with freq 5620
235  * @CHAN_ENUM_5640: channel with freq 5640
236  * @CHAN_ENUM_5660: channel with freq 5660
237  * @CHAN_ENUM_5680: channel with freq 5680
238  * @CHAN_ENUM_5700: channel with freq 5700
239  * @CHAN_ENUM_5720: channel with freq 5720
240  * @CHAN_ENUM_5745: channel with freq 5745
241  * @CHAN_ENUM_5765: channel with freq 5765
242  * @CHAN_ENUM_5785: channel with freq 5785
243  * @CHAN_ENUM_5805: channel with freq 5805
244  * @CHAN_ENUM_5825: channel with freq 5825
245  * @CHAN_ENUM_5845: channel with freq 5845
246  * @CHAN_ENUM_5850: channel with freq 5850
247  * @CHAN_ENUM_5855: channel with freq 5855
248  * @CHAN_ENUM_5860: channel with freq 5860
249  * @CHAN_ENUM_5865: channel with freq 5865
250  * @CHAN_ENUM_5870: channel with freq 5870
251  * @CHAN_ENUM_5875: channel with freq 5875
252  * @CHAN_ENUM_5880: channel with freq 5880
253  * @CHAN_ENUM_5885: channel with freq 5885
254  * @CHAN_ENUM_5890: channel with freq 5890
255  * @CHAN_ENUM_5895: channel with freq 5895
256  * @CHAN_ENUM_5900: channel with freq 5900
257  * @CHAN_ENUM_5905: channel with freq 5905
258  * @CHAN_ENUM_5910: channel with freq 5910
259  * @CHAN_ENUM_5915: channel with freq 5915
260  * @CHAN_ENUM_5920: channel with freq 5920
261  * @CHAN_ENUM_5935: channel with freq 5935
262  * @CHAN_ENUM_5955: channel with freq 5955
263  * @CHAN_ENUM_5975: channel with freq 5975
264  * @CHAN_ENUM_5995: channel with freq 5995
265  * @CHAN_ENUM_6015: channel with freq 6015
266  * @CHAN_ENUM_6035: channel with freq 6035
267  * @CHAN_ENUM_6055: channel with freq 6055
268  * @CHAN_ENUM_6075: channel with freq 6075
269  * @CHAN_ENUM_6095: channel with freq 6095
270  * @CHAN_ENUM_6115: channel with freq 6115
271  * @CHAN_ENUM_6135: channel with freq 6135
272  * @CHAN_ENUM_6155: channel with freq 6155
273  * @CHAN_ENUM_6175: channel with freq 6175
274  * @CHAN_ENUM_6195: channel with freq 6195
275  * @CHAN_ENUM_6215: channel with freq 6215
276  * @CHAN_ENUM_6235: channel with freq 6235
277  * @CHAN_ENUM_6255: channel with freq 6255
278  * @CHAN_ENUM_6275: channel with freq 6275
279  * @CHAN_ENUM_6295: channel with freq 6295
280  * @CHAN_ENUM_6315: channel with freq 6315
281  * @CHAN_ENUM_6335: channel with freq 6335
282  * @CHAN_ENUM_6355: channel with freq 6355
283  * @CHAN_ENUM_6375: channel with freq 6375
284  * @CHAN_ENUM_6395: channel with freq 6395
285  * @CHAN_ENUM_6415: channel with freq 6415
286  * @CHAN_ENUM_6435: channel with freq 6435
287  * @CHAN_ENUM_6455: channel with freq 6455
288  * @CHAN_ENUM_6475: channel with freq 6475
289  * @CHAN_ENUM_6495: channel with freq 6495
290  * @CHAN_ENUM_6515: channel with freq 6515
291  * @CHAN_ENUM_6535: channel with freq 6535
292  * @CHAN_ENUM_6555: channel with freq 6555
293  * @CHAN_ENUM_6575: channel with freq 6575
294  * @CHAN_ENUM_6595: channel with freq 6595
295  * @CHAN_ENUM_6615: channel with freq 6615
296  * @CHAN_ENUM_6635: channel with freq 6635
297  * @CHAN_ENUM_6655: channel with freq 6655
298  * @CHAN_ENUM_6675: channel with freq 6675
299  * @CHAN_ENUM_6695: channel with freq 6695
300  * @CHAN_ENUM_6715: channel with freq 6715
301  * @CHAN_ENUM_6735: channel with freq 6735
302  * @CHAN_ENUM_6755: channel with freq 6755
303  * @CHAN_ENUM_6775: channel with freq 6775
304  * @CHAN_ENUM_6795: channel with freq 6795
305  * @CHAN_ENUM_6815: channel with freq 6815
306  * @CHAN_ENUM_6835: channel with freq 6835
307  * @CHAN_ENUM_6855: channel with freq 6855
308  * @CHAN_ENUM_6875: channel with freq 6875
309  * @CHAN_ENUM_6895: channel with freq 6895
310  * @CHAN_ENUM_6915: channel with freq 6915
311  * @CHAN_ENUM_6935: channel with freq 6935
312  * @CHAN_ENUM_6955: channel with freq 6955
313  * @CHAN_ENUM_6975: channel with freq 6975
314  * @CHAN_ENUM_6995: channel with freq 6995
315  * @CHAN_ENUM_7015: channel with freq 7015
316  * @CHAN_ENUM_7035: channel with freq 7035
317  * @CHAN_ENUM_7055: channel with freq 7055
318  * @CHAN_ENUM_7075: channel with freq 7075
319  * @CHAN_ENUM_7095: channel with freq 7095
320  * @CHAN_ENUM_7115: channel with freq 7115
321  */
322 enum channel_enum {
323 	CHAN_ENUM_2412,
324 	CHAN_ENUM_2417,
325 	CHAN_ENUM_2422,
326 	CHAN_ENUM_2427,
327 	CHAN_ENUM_2432,
328 	CHAN_ENUM_2437,
329 	CHAN_ENUM_2442,
330 	CHAN_ENUM_2447,
331 	CHAN_ENUM_2452,
332 	CHAN_ENUM_2457,
333 	CHAN_ENUM_2462,
334 	CHAN_ENUM_2467,
335 	CHAN_ENUM_2472,
336 	CHAN_ENUM_2484,
337 #ifdef CONFIG_49GHZ_CHAN
338 	CHAN_ENUM_4912,
339 	CHAN_ENUM_4915,
340 	CHAN_ENUM_4917,
341 	CHAN_ENUM_4920,
342 	CHAN_ENUM_4922,
343 	CHAN_ENUM_4925,
344 	CHAN_ENUM_4927,
345 	CHAN_ENUM_4932,
346 	CHAN_ENUM_4935,
347 	CHAN_ENUM_4937,
348 	CHAN_ENUM_4940,
349 	CHAN_ENUM_4942,
350 	CHAN_ENUM_4945,
351 	CHAN_ENUM_4947,
352 	CHAN_ENUM_4950,
353 	CHAN_ENUM_4952,
354 	CHAN_ENUM_4955,
355 	CHAN_ENUM_4957,
356 	CHAN_ENUM_4960,
357 	CHAN_ENUM_4962,
358 	CHAN_ENUM_4965,
359 	CHAN_ENUM_4967,
360 	CHAN_ENUM_4970,
361 	CHAN_ENUM_4972,
362 	CHAN_ENUM_4975,
363 	CHAN_ENUM_4977,
364 	CHAN_ENUM_4980,
365 	CHAN_ENUM_4982,
366 	CHAN_ENUM_4985,
367 	CHAN_ENUM_4987,
368 	CHAN_ENUM_5032,
369 	CHAN_ENUM_5035,
370 	CHAN_ENUM_5037,
371 	CHAN_ENUM_5040,
372 	CHAN_ENUM_5042,
373 	CHAN_ENUM_5045,
374 	CHAN_ENUM_5047,
375 	CHAN_ENUM_5052,
376 	CHAN_ENUM_5055,
377 	CHAN_ENUM_5057,
378 	CHAN_ENUM_5060,
379 	CHAN_ENUM_5080,
380 #endif /* CONFIG_49GHZ_CHAN */
381 	CHAN_ENUM_5180,
382 	CHAN_ENUM_5200,
383 	CHAN_ENUM_5220,
384 	CHAN_ENUM_5240,
385 	CHAN_ENUM_5260,
386 	CHAN_ENUM_5280,
387 	CHAN_ENUM_5300,
388 	CHAN_ENUM_5320,
389 	CHAN_ENUM_5500,
390 	CHAN_ENUM_5520,
391 	CHAN_ENUM_5540,
392 	CHAN_ENUM_5560,
393 	CHAN_ENUM_5580,
394 	CHAN_ENUM_5600,
395 	CHAN_ENUM_5620,
396 	CHAN_ENUM_5640,
397 	CHAN_ENUM_5660,
398 	CHAN_ENUM_5680,
399 	CHAN_ENUM_5700,
400 	CHAN_ENUM_5720,
401 	CHAN_ENUM_5745,
402 	CHAN_ENUM_5765,
403 	CHAN_ENUM_5785,
404 	CHAN_ENUM_5805,
405 	CHAN_ENUM_5825,
406 	CHAN_ENUM_5845,
407 #ifdef WLAN_FEATURE_DSRC
408 	CHAN_ENUM_5850,
409 	CHAN_ENUM_5855,
410 	CHAN_ENUM_5860,
411 #endif
412 	CHAN_ENUM_5865,
413 #ifdef WLAN_FEATURE_DSRC
414 	CHAN_ENUM_5870,
415 	CHAN_ENUM_5875,
416 	CHAN_ENUM_5880,
417 #endif
418 	CHAN_ENUM_5885,
419 #ifdef WLAN_FEATURE_DSRC
420 	CHAN_ENUM_5890,
421 	CHAN_ENUM_5895,
422 	CHAN_ENUM_5900,
423 	CHAN_ENUM_5905,
424 	CHAN_ENUM_5910,
425 	CHAN_ENUM_5915,
426 	CHAN_ENUM_5920,
427 #endif /* WLAN_FEATURE_DSRC */
428 #ifdef CONFIG_BAND_6GHZ
429 	CHAN_ENUM_5935,
430 	CHAN_ENUM_5955,
431 	CHAN_ENUM_5975,
432 	CHAN_ENUM_5995,
433 	CHAN_ENUM_6015,
434 	CHAN_ENUM_6035,
435 	CHAN_ENUM_6055,
436 	CHAN_ENUM_6075,
437 	CHAN_ENUM_6095,
438 	CHAN_ENUM_6115,
439 	CHAN_ENUM_6135,
440 	CHAN_ENUM_6155,
441 	CHAN_ENUM_6175,
442 	CHAN_ENUM_6195,
443 	CHAN_ENUM_6215,
444 	CHAN_ENUM_6235,
445 	CHAN_ENUM_6255,
446 	CHAN_ENUM_6275,
447 	CHAN_ENUM_6295,
448 	CHAN_ENUM_6315,
449 	CHAN_ENUM_6335,
450 	CHAN_ENUM_6355,
451 	CHAN_ENUM_6375,
452 	CHAN_ENUM_6395,
453 	CHAN_ENUM_6415,
454 	CHAN_ENUM_6435,
455 	CHAN_ENUM_6455,
456 	CHAN_ENUM_6475,
457 	CHAN_ENUM_6495,
458 	CHAN_ENUM_6515,
459 	CHAN_ENUM_6535,
460 	CHAN_ENUM_6555,
461 	CHAN_ENUM_6575,
462 	CHAN_ENUM_6595,
463 	CHAN_ENUM_6615,
464 	CHAN_ENUM_6635,
465 	CHAN_ENUM_6655,
466 	CHAN_ENUM_6675,
467 	CHAN_ENUM_6695,
468 	CHAN_ENUM_6715,
469 	CHAN_ENUM_6735,
470 	CHAN_ENUM_6755,
471 	CHAN_ENUM_6775,
472 	CHAN_ENUM_6795,
473 	CHAN_ENUM_6815,
474 	CHAN_ENUM_6835,
475 	CHAN_ENUM_6855,
476 	CHAN_ENUM_6875,
477 	CHAN_ENUM_6895,
478 	CHAN_ENUM_6915,
479 	CHAN_ENUM_6935,
480 	CHAN_ENUM_6955,
481 	CHAN_ENUM_6975,
482 	CHAN_ENUM_6995,
483 	CHAN_ENUM_7015,
484 	CHAN_ENUM_7035,
485 	CHAN_ENUM_7055,
486 	CHAN_ENUM_7075,
487 	CHAN_ENUM_7095,
488 	CHAN_ENUM_7115,
489 #endif /* CONFIG_BAND_6GHZ */
490 
491 	NUM_CHANNELS,
492 
493 	MIN_CHANNEL = CHAN_ENUM_2412,
494 	MAX_CHANNEL = (NUM_CHANNELS - 1),
495 
496 	MIN_24GHZ_CHANNEL = CHAN_ENUM_2412,
497 	MAX_24GHZ_CHANNEL = CHAN_ENUM_2484,
498 	NUM_24GHZ_CHANNELS = (MAX_24GHZ_CHANNEL - MIN_24GHZ_CHANNEL + 1),
499 
500 	INVALID_CHANNEL = NUM_CHANNELS,
501 
502 #ifdef CONFIG_49GHZ_CHAN
503 	MIN_49GHZ_CHANNEL = CHAN_ENUM_4912,
504 	MAX_49GHZ_CHANNEL = CHAN_ENUM_5080,
505 	NUM_49GHZ_CHANNELS = (MAX_49GHZ_CHANNEL - MIN_49GHZ_CHANNEL + 1),
506 #else
507 	MIN_49GHZ_CHANNEL = INVALID_CHANNEL,
508 	MAX_49GHZ_CHANNEL = INVALID_CHANNEL,
509 	NUM_49GHZ_CHANNELS = 0,
510 #endif /* CONFIG_49GHZ_CHAN */
511 
512 	MIN_5GHZ_CHANNEL = CHAN_ENUM_5180,
513 #ifdef WLAN_FEATURE_DSRC
514 	MAX_5GHZ_CHANNEL = CHAN_ENUM_5920,
515 #else
516 	MAX_5GHZ_CHANNEL = CHAN_ENUM_5885,
517 #endif
518 	NUM_5GHZ_CHANNELS = (MAX_5GHZ_CHANNEL - MIN_5GHZ_CHANNEL + 1),
519 
520 #ifdef WLAN_FEATURE_DSRC
521 	MIN_DSRC_CHANNEL = CHAN_ENUM_5850,
522 	MAX_DSRC_CHANNEL = CHAN_ENUM_5920,
523 	NUM_DSRC_CHANNELS = (MAX_DSRC_CHANNEL - MIN_DSRC_CHANNEL + 1),
524 #endif
525 
526 	MIN_5DOT9_CHANNEL = CHAN_ENUM_5845,
527 	MAX_5DOT9_CHANNEL = CHAN_ENUM_5885,
528 	NUM_5DOT9_CHANNELS = (MAX_5DOT9_CHANNEL - MIN_5DOT9_CHANNEL + 1),
529 
530 #ifdef CONFIG_49GHZ_CHAN
531 #define BAND_5GHZ_START_CHANNEL MIN_49GHZ_CHANNEL
532 #else
533 #define BAND_5GHZ_START_CHANNEL MIN_5GHZ_CHANNEL
534 #endif /* CONFIG_49GHZ_CHAN */
535 
536 #ifdef DISABLE_UNII_SHARED_BANDS
537 	MIN_UNII_1_BAND_CHANNEL = CHAN_ENUM_5180,
538 	MAX_UNII_1_BAND_CHANNEL = CHAN_ENUM_5240,
539 	NUM_UNII_1_BAND_CHANNELS = (MAX_UNII_1_BAND_CHANNEL -
540 				    MIN_UNII_1_BAND_CHANNEL + 1),
541 
542 	MIN_UNII_2A_BAND_CHANNEL = CHAN_ENUM_5260,
543 	MAX_UNII_2A_BAND_CHANNEL = CHAN_ENUM_5320,
544 	NUM_UNII_2A_BAND_CHANNELS = (MAX_UNII_2A_BAND_CHANNEL -
545 				     MIN_UNII_2A_BAND_CHANNEL + 1),
546 #endif
547 
548 #ifdef CONFIG_BAND_6GHZ
549 	MIN_6GHZ_CHANNEL = CHAN_ENUM_5935,
550 	MAX_6GHZ_CHANNEL = CHAN_ENUM_7115,
551 	NUM_6GHZ_CHANNELS = (MAX_6GHZ_CHANNEL - MIN_6GHZ_CHANNEL + 1),
552 	MIN_6GHZ_NON_ORPHAN_CHANNEL = CHAN_ENUM_5955,
553 #else
554 	MIN_6GHZ_CHANNEL = INVALID_CHANNEL,
555 	MAX_6GHZ_CHANNEL = INVALID_CHANNEL,
556 	NUM_6GHZ_CHANNELS = 0,
557 	MIN_6GHZ_NON_ORPHAN_CHANNEL = INVALID_CHANNEL,
558 #endif /* CONFIG_BAND_6GHZ */
559 };
560 
561 /**
562  * enum channel_state - channel state
563  * @CHANNEL_STATE_DISABLE: disabled state
564  * @CHANNEL_STATE_PASSIVE: passive state
565  * @CHANNEL_STATE_DFS: dfs state
566  * @CHANNEL_STATE_ENABLE: enabled state
567  * @CHANNEL_STATE_INVALID: invalid state
568  */
569 enum channel_state {
570 	CHANNEL_STATE_DISABLE,
571 	CHANNEL_STATE_PASSIVE,
572 	CHANNEL_STATE_DFS,
573 	CHANNEL_STATE_ENABLE,
574 	CHANNEL_STATE_INVALID,
575 };
576 
577 /**
578  * enum reg_6g_ap_type - Regulatory AP type for regulatory info subfield.
579  * @REG_INDOOR_AP: Indoor AP
580  * @REG_STANDARD_POWER_AP: Standard Power AP
581  * @REG_VERY_LOW_POWER_AP: Very low power AP
582  * @REG_CURRENT_MAX_AP_TYPE: current maximum, used to determine array size
583  * @REG_MAX_SUPP_AP_TYPE: Current maximum AP power typer supported in the IEEE
584  * standard.
585  * @REG_MAX_AP_TYPE: Maximum value possible for (3 bits) regulatory info
586  * sub-field in the 6G HE Operation IE
587  */
588 enum reg_6g_ap_type {
589 	REG_INDOOR_AP = 0,
590 	REG_STANDARD_POWER_AP = 1,
591 	REG_VERY_LOW_POWER_AP = 2,
592 	REG_CURRENT_MAX_AP_TYPE,
593 	REG_MAX_SUPP_AP_TYPE = REG_VERY_LOW_POWER_AP,
594 	REG_MAX_AP_TYPE = 7,
595 };
596 
597 /**
598  * enum reg_6g_client_type - Regulatory client type for max tx-power category
599  * @REG_DEFAULT_CLIENT: Default client
600  * @REG_SUBORDINATE_CLIENT: Subordinate client
601  * @REG_MAX_CLIENT_TYPE: Maximum value possible for max tx-power category
602  * (2 bits) sub-field in the TPE (Transmit Power Envelope) IE
603  * @REG_INVALID_CLIENT_TYPE: Invalid client type
604  */
605 enum reg_6g_client_type {
606 	REG_DEFAULT_CLIENT = 0,
607 	REG_SUBORDINATE_CLIENT = 1,
608 	REG_MAX_CLIENT_TYPE = 2,
609 	REG_INVALID_CLIENT_TYPE = REG_MAX_CLIENT_TYPE,
610 };
611 
612 /**
613  * enum v_REGDOMAIN_t: reg domain
614  * @REGDOMAIN_FCC: FCC domain
615  * @REGDOMAIN_ETSI: ETSI domain
616  * @REGDOMAIN_JAPAN: JAPAN domain
617  * @REGDOMAIN_WORLD: WORLD domain
618  * @REGDOMAIN_COUNT: Max domain
619  */
620 typedef enum {
621 	REGDOMAIN_FCC,
622 	REGDOMAIN_ETSI,
623 	REGDOMAIN_JAPAN,
624 	REGDOMAIN_WORLD,
625 	REGDOMAIN_COUNT
626 } v_REGDOMAIN_t;
627 
628 /**
629  * enum ctl_value - CTL value
630  * @CTL_FCC: CTL FCC
631  * @CTL_MKK: CTL MKK
632  * @CTL_ETSI: CTL ETSI
633  * @CTL_KOR: CTL KOR
634  * @CTL_CHN: CTL CHINA
635  * @CTL_USER_DEF: CTL USER_DEF
636  * @CTL_NONE: CTL NONE
637  */
638 enum ctl_value {
639 	CTL_FCC = 0x10,
640 	CTL_ETSI = 0x30,
641 	CTL_MKK = 0x40,
642 	CTL_KOR = 0x50,
643 	CTL_CHN = 0x60,
644 	CTL_USER_DEF = 0x70,
645 	CTL_NONE = 0xff
646 };
647 
648 /**
649  * struct freq_range: The range/band of frequencies, indicated by left and right
650  * edge frequencies.
651  * @left: Left edge frequency(inclusive)
652  * @right: Right edge frequency(inclusive)
653  */
654 struct freq_range {
655 	qdf_freq_t left;
656 	qdf_freq_t right;
657 };
658 
659 /**
660  * struct ch_params
661  * @ch_width: channel width
662  * @sec_ch_offset: secondary channel offset
663  * @center_freq_seg0: channel number for segment 0
664  * @center_freq_seg1: channel number segment 1
665  * @mhz_freq_seg0: Center frequency for segment 0
666  * @mhz_freq_seg1: Center frequency for segment 1
667  * @reg_punc_bitmap: Output puncturing bitmap
668  * @is_create_punc_bitmap: Whether puncturing bitmap is to be created or not
669  *                         Parameter 'reg_punc_bitmap' is valid only if
670  *                         is_create_punc_bitmap is true
671  * @input_punc_bitmap: Input puncture bitmap. The channels which are indicated
672  *                     as punctured by this bitmap are not validated by the
673  *                     regulatory.
674  */
675 struct ch_params {
676 	enum phy_ch_width ch_width;
677 	uint8_t sec_ch_offset;
678 	uint8_t center_freq_seg0;
679 	uint8_t center_freq_seg1;
680 	qdf_freq_t mhz_freq_seg0;
681 	qdf_freq_t mhz_freq_seg1;
682 #ifdef WLAN_FEATURE_11BE
683 	uint16_t reg_punc_bitmap;
684 	bool is_create_punc_bitmap;
685 	uint16_t input_punc_bitmap;
686 #endif
687 };
688 
689 #ifdef WLAN_FEATURE_11BE
690 #define MAX_NUM_CHAN_PARAM 2
691 
692 /**
693  * struct reg_channel_list
694  * @num_ch_params: Number of chan_param elements
695  * @chan_param: Object of type struct ch_params to hold channel params
696  * Currently chan_param is an array of 2 because maximum possible 320
697  * channels for a given primary channel is 2. This may be dynamically
698  * allocated in the future by the caller if num_ch_params is greater than 2.
699  *
700  */
701 struct reg_channel_list {
702 	uint8_t num_ch_params;
703 	struct ch_params chan_param[MAX_NUM_CHAN_PARAM];
704 };
705 #endif
706 
707 /**
708  * struct channel_power
709  * @center_freq: Channel Center Frequency
710  * @chan_num: channel number
711  * @tx_power: TX power
712  */
713 struct channel_power {
714 	qdf_freq_t center_freq;
715 	uint8_t chan_num;
716 	uint32_t tx_power;
717 };
718 
719 /**
720  * enum offset_t: channel offset
721  * @BW20: 20 mhz channel
722  * @BW40_LOW_PRIMARY: lower channel in 40 mhz
723  * @BW40_HIGH_PRIMARY: higher channel in 40 mhz
724  * @BW80: 80 mhz channel
725  * @BWALL: unknown bandwidth
726  * @BW_INVALID: invalid bandwidth
727  */
728 enum offset_t {
729 	BW20 = 0,
730 	BW40_LOW_PRIMARY = 1,
731 	BW40_HIGH_PRIMARY = 3,
732 	BW80,
733 	BWALL,
734 	BW_INVALID = 0xFF
735 };
736 
737 /**
738  * enum behav_limit - behavior limit
739  * @BEHAV_NONE: none
740  * @BEHAV_BW40_LOW_PRIMARY: BW40 low primary
741  * @BEHAV_BW40_HIGH_PRIMARY: BW40 high primary
742  * @BEHAV_BW80_PLUS: BW 80 plus
743  * @BEHAV_INVALID: invalid behavior
744  */
745 enum behav_limit {
746 	BEHAV_NONE,
747 	BEHAV_BW40_LOW_PRIMARY,
748 	BEHAV_BW40_HIGH_PRIMARY,
749 	BEHAV_BW80_PLUS,
750 	BEHAV_INVALID = 0xFF
751 };
752 
753 /**
754  * struct c_freq_lst: The list data structure for the center frequencies
755  * @num_cfis: Number of center frequencies
756  * @p_cfis_arr: Start address of the array of center frequency indices. Center
757  *              for 40/80/160/320MHz band channel opclasses. For 20MHz the list
758  *              is empty as it is already available in @channels variable.
759  */
760 struct c_freq_lst {
761 	uint8_t num_cfis;
762 	const uint8_t *p_cfis_arr;
763 };
764 
765 /**
766  * struct reg_dmn_op_class_map_t: operating class
767  * @op_class: operating class number
768  * @chan_spacing: channel spacing
769  * @offset: offset
770  * @behav_limit: OR of bitmaps of enum behav_limit
771  * @start_freq: starting frequency
772  * @channels: channel set
773  * @p_cfi_lst_obj: Pointer to center frequency indices list
774  */
775 struct reg_dmn_op_class_map_t {
776 	uint8_t op_class;
777 	uint16_t chan_spacing;
778 	enum offset_t offset;
779 	uint16_t behav_limit;
780 	qdf_freq_t start_freq;
781 	uint8_t channels[REG_MAX_CHANNELS_PER_OPERATING_CLASS];
782 	const struct c_freq_lst *p_cfi_lst_obj;
783 };
784 
785 /**
786  * enum opclass_config: Opclass configuration
787  * @OPCLASSES_SUPPORTED_BY_CUR_HWMODE: Retrieve opclasses that is supported
788  * by the current hw mode.
789  * @OPCLASSES_NOT_SUPPORTED_BY_CUR_HWMODE: Retrieve opclasses that are not
790  * supported by the current hw mode.
791  * @OPCLASSES_SUPPORTED_BY_DOMAIN: Populate the opclass supported by the radio
792  * without considering the capability of current hwmode.
793  */
794 enum opclass_config {
795 	OPCLASSES_SUPPORTED_BY_CUR_HWMODE = 1,
796 	OPCLASSES_NOT_SUPPORTED_BY_CUR_HWMODE = 2,
797 	OPCLASSES_SUPPORTED_BY_DOMAIN = 3
798 };
799 
800 /**
801  * struct regdmn_ap_cap_opclass_t: AP Cap operation class table
802  * @op_class: operating class number
803  * @ch_width: channel width in MHz
804  * @start_freq: Starting Frequency in MHz
805  * @behav_limit: OR of bitmaps of enum behav_limit
806  * @max_tx_pwr_dbm: Maximum tx power in dbm
807  * @num_supported_chan: Number of supported channels
808  * @num_non_supported_chan: Number of non-supported channels
809  * @sup_chan_list: Array of supported channel numbers
810  * @non_sup_chan_list: Array of non supported channel numbers
811  */
812 struct regdmn_ap_cap_opclass_t {
813 	uint8_t op_class;
814 	uint16_t ch_width;
815 	qdf_freq_t start_freq;
816 	uint16_t behav_limit;
817 	uint8_t max_tx_pwr_dbm;
818 	uint8_t num_supported_chan;
819 	uint8_t num_non_supported_chan;
820 	uint8_t sup_chan_list[REG_MAX_CHANNELS_PER_OPERATING_CLASS];
821 	uint8_t non_sup_chan_list[REG_MAX_CHANNELS_PER_OPERATING_CLASS];
822 };
823 
824 /**
825  * struct reg_dmn_supp_op_classes: operating classes
826  * @num_classes: number of classes
827  * @classes: classes
828  */
829 struct reg_dmn_supp_op_classes {
830 	uint8_t num_classes;
831 	uint8_t classes[REG_MAX_SUPP_OPER_CLASSES];
832 };
833 
834 /**
835  * struct reg_start_11d_scan_req: start 11d scan request
836  * @vdev_id: vdev id
837  * @scan_period_msec: scan duration in milli-seconds
838  * @start_interval_msec: offset duration to start the scan in milli-seconds
839  */
840 struct reg_start_11d_scan_req {
841 	uint8_t vdev_id;
842 	uint32_t scan_period_msec;
843 	uint32_t start_interval_msec;
844 };
845 
846 /**
847  * struct reg_11d_scan_msg: 11d scan message structure
848  * @psoc: pointer to psoc object
849  * @enable_11d_supp: enable 11d scan or disable 11d scan
850  */
851 struct reg_11d_scan_msg {
852 	struct wlan_objmgr_psoc *psoc;
853 	bool enable_11d_supp;
854 };
855 /**
856  * struct reg_stop_11d_scan_req: stop 11d scan request
857  * @vdev_id: vdev id
858  */
859 struct reg_stop_11d_scan_req {
860 	uint8_t vdev_id;
861 };
862 
863 /**
864  * struct reg_11d_new_country: regulatory 11d new coutry code
865  * @alpha2: new 11d alpha2
866  */
867 struct reg_11d_new_country {
868 	uint8_t alpha2[REG_ALPHA2_LEN + 1];
869 };
870 
871 /**
872  * enum country_src: country source
873  * @SOURCE_UNKNOWN: source unknown
874  * @SOURCE_QUERY: source query
875  * @SOURCE_CORE: source regulatory core
876  * @SOURCE_DRIVER: source driver
877  * @SOURCE_USERSPACE: source userspace
878  * @SOURCE_11D: source 11D
879  */
880 enum country_src {
881 	SOURCE_UNKNOWN,
882 	SOURCE_QUERY,
883 	SOURCE_CORE,
884 	SOURCE_DRIVER,
885 	SOURCE_USERSPACE,
886 	SOURCE_11D
887 };
888 
889 #ifdef WLAN_FEATURE_GET_USABLE_CHAN_LIST
890 /**
891  * enum iftype - (virtual) interface types
892  *
893  * @IFTYPE_UNSPECIFIED: unspecified type, driver decides
894  * @IFTYPE_ADHOC: independent BSS member
895  * @IFTYPE_STATION: managed BSS member
896  * @IFTYPE_AP: access point
897  * @IFTYPE_AP_VLAN: VLAN interface for access points; VLAN interfaces
898  *      are a bit special in that they must always be tied to a pre-existing
899  *      AP type interface.
900  * @IFTYPE_WDS: wireless distribution interface
901  * @IFTYPE_MONITOR: monitor interface receiving all frames
902  * @IFTYPE_MESH_POINT: mesh point
903  * @IFTYPE_P2P_CLIENT: P2P client
904  * @IFTYPE_P2P_GO: P2P group owner
905  * @IFTYPE_P2P_DEVICE: P2P device interface type, this is not a netdev
906  *      and therefore can't be created in the normal ways, use the
907  *      %NL80211_CMD_START_P2P_DEVICE and %NL80211_CMD_STOP_P2P_DEVICE
908  *      commands to create and destroy one
909  * @IFTYPE_OCB: Outside Context of a BSS
910  *      This mode corresponds to the MIB variable dot11OCBActivated=true
911  * @IFTYPE_NAN: NAN mode
912  * @IFTYPE_MAX: highest interface type number currently defined
913  * @NUM_IFTYPES: number of defined interface types
914  *
915  * These values are used with the %NL80211_ATTR_IFTYPE
916  * to set the type of an interface.
917  *
918  */
919 enum iftype {
920 	IFTYPE_UNSPECIFIED,
921 	IFTYPE_ADHOC,
922 	IFTYPE_STATION,
923 	IFTYPE_AP,
924 	IFTYPE_AP_VLAN,
925 	IFTYPE_WDS,
926 	IFTYPE_MONITOR,
927 	IFTYPE_MESH_POINT,
928 	IFTYPE_P2P_CLIENT,
929 	IFTYPE_P2P_GO,
930 	IFTYPE_P2P_DEVICE,
931 	IFTYPE_OCB,
932 	IFTYPE_NAN,
933 
934 	/* keep last */
935 	NUM_IFTYPES,
936 	IFTYPE_MAX = NUM_IFTYPES - 1
937 };
938 
939 /**
940  * enum usable_channels_filter - Filters to get usable channels
941  * @FILTER_CELLULAR_COEX: Avoid lte coex channels
942  * @FILTER_WLAN_CONCURRENCY: Avoid con channels
943  **/
944 enum usable_channels_filter {
945 	FILTER_CELLULAR_COEX = 0,
946 	FILTER_WLAN_CONCURRENCY = 1,
947 };
948 
949 /**
950  * struct get_usable_chan_res_params - Usable channels resp params
951  * @freq : center freq
952  * @seg0_freq : seg0 freq
953  * @seg1_freq: seg1 freq
954  * @bw : bandwidth
955  * @state: channel state
956  * @iface_mode_mask: interface mode mask
957  **/
958 struct get_usable_chan_res_params {
959 	qdf_freq_t freq;
960 	uint32_t seg0_freq;
961 	uint32_t seg1_freq;
962 	enum phy_ch_width bw;
963 	uint32_t iface_mode_mask;
964 	enum channel_state state;
965 };
966 
967 /**
968  * struct get_usable_chan_req_params - Usable channels req params
969  * @band_mask: band mask
970  * @iface_mode_mask: interface mode mask
971  * @filter_mask: filter mask
972  **/
973 struct get_usable_chan_req_params {
974 	uint32_t band_mask;
975 	uint32_t iface_mode_mask;
976 	uint32_t filter_mask;
977 };
978 #endif
979 
980 /**
981  * struct regulatory_channel
982  * @center_freq: center frequency
983  * @chan_num: channel number
984  * @state: channel state
985  * @chan_flags: channel flags
986  * @tx_power: TX powers
987  * @min_bw: min bandwidth
988  * @max_bw: max bandwidth
989  * @ant_gain: antenna gain
990  * @nol_chan: whether channel is nol
991  * @nol_history: Set NOL-History when STA vap detects RADAR.
992  * @is_chan_hop_blocked: Whether channel is blocked for ACS hopping.
993  * @ht40intol_flags: Contains Flags to indicate whether the 40PLUS/40MINUS
994  *                   version of the channel is blocked by ACS due to
995  *                   intolerance.
996  * @psd_flag: is PSD channel or not
997  * @psd_eirp: PSD power level
998  * @is_static_punctured: is static punctured
999  * @opclass_chan_disable: Whether the channel is disabled/enabled by a user
1000  *                        command. The command provides an opclass and a
1001  *                        subset of the channels belonging to that opclass
1002  *                        as inputs and expects the driver to disable/enable
1003  *                        the channels in the subset.
1004  * @power_type: channel power type
1005  */
1006 struct regulatory_channel {
1007 	qdf_freq_t center_freq;
1008 	uint8_t chan_num;
1009 	enum channel_state state;
1010 	uint32_t chan_flags;
1011 	int32_t tx_power;
1012 	uint16_t min_bw;
1013 	uint16_t max_bw;
1014 	uint8_t ant_gain;
1015 	bool nol_chan;
1016 	bool nol_history;
1017 #ifdef CONFIG_HOST_FIND_CHAN
1018 	bool is_chan_hop_blocked;
1019 	uint8_t ht40intol_flags;
1020 #endif
1021 #ifdef CONFIG_BAND_6GHZ
1022 	bool psd_flag;
1023 	uint16_t psd_eirp;
1024 #endif
1025 #ifdef CONFIG_REG_CLIENT
1026 	uint8_t is_static_punctured;
1027 	enum reg_6g_ap_type power_type;
1028 #endif
1029 #ifndef CONFIG_REG_CLIENT
1030 	bool opclass_chan_disable;
1031 #endif
1032 };
1033 
1034 /**
1035  * struct ap_cli_pwr_mode_info: AP and client power mode information
1036  * @is_mode_ap: Is it AP or CLIENT
1037  * @cli_type:  Is the client a default or subordinate
1038  * @ap_pwr_mode: LPI, SP or VLP
1039  */
1040 struct ap_cli_pwr_mode_info {
1041 	bool is_mode_ap;
1042 	enum reg_6g_client_type cli_type;
1043 	enum reg_6g_ap_type ap_pwr_mode;
1044 };
1045 
1046 /**
1047  * enum supported_6g_pwr_types: 6G supported AP and Client power types
1048  * @REG_BEST_PWR_MODE: Best power mode
1049  * @REG_CURRENT_PWR_MODE: Current power mode
1050  * @REG_AP_LPI: LPI AP power mode
1051  * @REG_AP_SP: SP AP power mode
1052  * @REG_AP_VLP: VLP AP power mode
1053  * @REG_CLI_DEF_LPI: LPI default client mode
1054  * @REG_CLI_DEF_SP: SP default client mode
1055  * @REG_CLI_DEF_VLP: VLP default client mode
1056  * @REG_CLI_SUB_LPI: LPI subordinate client mode
1057  * @REG_CLI_SUB_SP: SP subordinate client mode
1058  * @REG_CLI_SUB_VLP: VLP subordinate client mode
1059  * @REG_INVALID_PWR_MODE: Invalid power mode
1060  */
1061 enum supported_6g_pwr_types {
1062 	REG_BEST_PWR_MODE    = -1,
1063 	REG_CURRENT_PWR_MODE = 0,
1064 	REG_AP_LPI           = 1,
1065 	REG_AP_SP            = 2,
1066 	REG_AP_VLP           = 3,
1067 	REG_CLI_DEF_LPI      = 4,
1068 	REG_CLI_DEF_SP       = 5,
1069 	REG_CLI_DEF_VLP      = 6,
1070 	REG_CLI_SUB_LPI      = 7,
1071 	REG_CLI_SUB_SP       = 8,
1072 	REG_CLI_SUB_VLP      = 9,
1073 	REG_INVALID_PWR_MODE = 10,
1074 };
1075 
1076 #define MAX_PWR_TYPES 10
1077 /**
1078  * struct psd_val: Regulatory power information
1079  * @psd_flag: Boolean to indicate if PSD is supported or not
1080  * @psd_eirp: PSD power
1081  * @tx_power: Maximum EIRP
1082  */
1083 struct psd_val {
1084 	bool psd_flag;
1085 	uint16_t psd_eirp;
1086 	uint32_t tx_power;
1087 };
1088 
1089 /**
1090  * struct super_chan_info: Information of a 6G channel for every power
1091  * mode
1092  * @power_types: Bitmap whose bit positions indicate the power modes supported
1093  * by a channel
1094  * @best_power_mode: Best power mode of a channel
1095  * @min_bw: Array of minimum bandwidths per power mode
1096  * @max_bw: Array of maximum bandwidths per power mode
1097  * @chan_flags_arr: Array of channel flags
1098  * @reg_chan_pwr: Array of powers
1099  * @state_arr: Array of states
1100  */
1101 struct super_chan_info {
1102 	uint16_t power_types;
1103 	enum supported_6g_pwr_types best_power_mode;
1104 	uint16_t min_bw[MAX_PWR_TYPES];
1105 	uint16_t max_bw[MAX_PWR_TYPES];
1106 	uint32_t chan_flags_arr[MAX_PWR_TYPES];
1107 	struct psd_val reg_chan_pwr[MAX_PWR_TYPES];
1108 	enum channel_state state_arr[MAX_PWR_TYPES];
1109 };
1110 
1111 /**
1112  * struct regulatory: regulatory information
1113  * @reg_domain: regulatory domain pair
1114  * @eeprom_rd_ext: eeprom value
1115  * @country_code: current country in integer
1116  * @alpha2: current alpha2
1117  * @def_country: default country alpha2
1118  * @def_region: DFS region
1119  * @ctl_2g: 2G CTL value
1120  * @ctl_5g: 5G CTL value
1121  * @regpair: pointer to regulatory pair
1122  * @cc_src: country code src
1123  * @reg_flags: kernel regulatory flags
1124  */
1125 struct regulatory {
1126 	uint32_t reg_domain;
1127 	uint32_t eeprom_rd_ext;
1128 	uint16_t country_code;
1129 	uint8_t alpha2[REG_ALPHA2_LEN + 1];
1130 	uint8_t ctl_2g;
1131 	uint8_t ctl_5g;
1132 	const void *regpair;
1133 	enum country_src cc_src;
1134 	uint32_t reg_flags;
1135 };
1136 
1137 /**
1138  * struct chan_map
1139  * @center_freq: center freq in mhz
1140  * @chan_num: channel number
1141  * @min_bw: min bw
1142  * @max_bw: max bw
1143  */
1144 struct chan_map {
1145 	qdf_freq_t center_freq;
1146 	uint8_t chan_num;
1147 	uint16_t min_bw;
1148 	uint16_t max_bw;
1149 };
1150 
1151 /**
1152  * struct bonded_channel
1153  * @start_ch: start channel
1154  * @end_ch: end channel
1155  */
1156 struct bonded_channel {
1157 	uint8_t start_ch;
1158 	uint8_t end_ch;
1159 };
1160 
1161 /**
1162  * struct bonded_channel_freq
1163  * @start_freq: start channel frequency
1164  * @end_freq: end channel frequency
1165  */
1166 struct bonded_channel_freq {
1167 	uint16_t start_freq;
1168 	uint16_t end_freq;
1169 };
1170 
1171 struct set_country {
1172 	uint8_t country[REG_ALPHA2_LEN + 1];
1173 	uint8_t pdev_id;
1174 };
1175 /**
1176  * enum ht_sec_ch_offset
1177  * @NO_SEC_CH: no secondary
1178  * @LOW_PRIMARY_CH: low primary
1179  * @HIGH_PRIMARY_CH: high primary
1180  */
1181 enum ht_sec_ch_offset {
1182 	NO_SEC_CH = 0,
1183 	LOW_PRIMARY_CH = 1,
1184 	HIGH_PRIMARY_CH = 3,
1185 };
1186 
1187 enum cc_setting_code {
1188 	REG_SET_CC_STATUS_PASS = 0,
1189 	REG_CURRENT_ALPHA2_NOT_FOUND = 1,
1190 	REG_INIT_ALPHA2_NOT_FOUND = 2,
1191 	REG_SET_CC_CHANGE_NOT_ALLOWED = 3,
1192 	REG_SET_CC_STATUS_NO_MEMORY = 4,
1193 	REG_SET_CC_STATUS_FAIL = 5,
1194 };
1195 
1196 /**
1197  * struct cur_reg_rule
1198  * @start_freq: start frequency
1199  * @end_freq: end frequency
1200  * @max_bw: maximum bandwidth
1201  * @reg_power: regulatory power
1202  * @ant_gain: antenna gain
1203  * @flags: regulatory flags
1204  * @psd_flag: is PSD power used
1205  * @psd_eirp: maximum PSD EIRP value
1206  */
1207 struct cur_reg_rule {
1208 	uint16_t start_freq;
1209 	uint16_t end_freq;
1210 	uint16_t max_bw;
1211 	uint8_t reg_power;
1212 	uint8_t ant_gain;
1213 	uint16_t flags;
1214 	bool psd_flag;
1215 	uint16_t psd_eirp;
1216 };
1217 
1218 #ifdef CONFIG_REG_CLIENT
1219 /**
1220  * struct cur_fcc_rule
1221  * @center_freq: center frequency
1222  * @tx_power: transmission power
1223  */
1224 struct cur_fcc_rule {
1225 	uint16_t center_freq;
1226 	uint8_t tx_power;
1227 };
1228 #endif
1229 
1230 /**
1231  * struct cur_regulatory_info
1232  * @psoc: psoc ptr
1233  * @status_code: status value
1234  * @num_phy: number of phy
1235  * @phy_id: phy id
1236  * @reg_dmn_pair: reg domain pair
1237  * @ctry_code: country code
1238  * @alpha2: country alpha2
1239  * @offload_enabled: offload enabled
1240  * @dfs_region: dfs region
1241  * @phybitmap: phy bit map
1242  * @min_bw_2g: minimum 2G bw
1243  * @max_bw_2g: maximum 2G bw
1244  * @min_bw_5g: minimum 5G bw
1245  * @max_bw_5g: maximum 5G bw
1246  * @num_2g_reg_rules: number 2G reg rules
1247  * @num_5g_reg_rules: number 5G  and 6G reg rules
1248  * @reg_6g_thresh_priority_freq: All frequencies greater or equal will be given
1249  * priority during channel selection by upper layer
1250  * @reg_rules_2g_ptr: ptr to 2G reg rules
1251  * @reg_rules_5g_ptr: ptr to 5G reg rules
1252  * @client_type: type of client
1253  * @rnr_tpe_usable: if RNR TPE octet is usable for country
1254  * @unspecified_ap_usable: if not set, AP usable for country
1255  * @domain_code_6g_ap: domain code for 6G AP
1256  * @domain_code_6g_client: domain code for 6G client in SP mode
1257  * @domain_code_6g_super_id: 6G super domain ID
1258  * @min_bw_6g_ap: minimum 6G bw for AP
1259  * @max_bw_6g_ap: maximum 6G bw for AP
1260  * @min_bw_6g_client: list of minimum 6G bw for clients
1261  * @max_bw_6g_client: list of maximum 6G bw for clients
1262  * @num_6g_reg_rules_ap: number of 6G reg rules for AP
1263  * @num_6g_reg_rules_client: list of number of 6G reg rules for client
1264  * @reg_rules_6g_ap_ptr: ptr to 6G AP reg rules
1265  * @reg_rules_6g_client_ptr: list of ptr to 6G client reg rules
1266  * @fcc_rules_ptr: ptr to fcc rules
1267  * @num_fcc_rules: Number of fcc rules sent by firmware
1268  */
1269 struct cur_regulatory_info {
1270 	struct wlan_objmgr_psoc *psoc;
1271 	enum cc_setting_code status_code;
1272 	uint8_t num_phy;
1273 	uint8_t phy_id;
1274 	uint16_t reg_dmn_pair;
1275 	uint16_t ctry_code;
1276 	uint8_t alpha2[REG_ALPHA2_LEN + 1];
1277 	bool offload_enabled;
1278 	enum dfs_reg dfs_region;
1279 	uint32_t phybitmap;
1280 	uint32_t min_bw_2g;
1281 	uint32_t max_bw_2g;
1282 	uint32_t min_bw_5g;
1283 	uint32_t max_bw_5g;
1284 	uint32_t num_2g_reg_rules;
1285 	uint32_t num_5g_reg_rules;
1286 	qdf_freq_t reg_6g_thresh_priority_freq;
1287 	struct cur_reg_rule *reg_rules_2g_ptr;
1288 	struct cur_reg_rule *reg_rules_5g_ptr;
1289 	enum reg_6g_client_type client_type;
1290 	bool rnr_tpe_usable;
1291 	bool unspecified_ap_usable;
1292 	uint8_t domain_code_6g_ap[REG_CURRENT_MAX_AP_TYPE];
1293 	uint8_t domain_code_6g_client[REG_CURRENT_MAX_AP_TYPE][REG_MAX_CLIENT_TYPE];
1294 	uint32_t domain_code_6g_super_id;
1295 	uint32_t min_bw_6g_ap[REG_CURRENT_MAX_AP_TYPE];
1296 	uint32_t max_bw_6g_ap[REG_CURRENT_MAX_AP_TYPE];
1297 	uint32_t min_bw_6g_client[REG_CURRENT_MAX_AP_TYPE][REG_MAX_CLIENT_TYPE];
1298 	uint32_t max_bw_6g_client[REG_CURRENT_MAX_AP_TYPE][REG_MAX_CLIENT_TYPE];
1299 	uint32_t num_6g_reg_rules_ap[REG_CURRENT_MAX_AP_TYPE];
1300 	uint32_t num_6g_reg_rules_client[REG_CURRENT_MAX_AP_TYPE][REG_MAX_CLIENT_TYPE];
1301 	struct cur_reg_rule *reg_rules_6g_ap_ptr[REG_CURRENT_MAX_AP_TYPE];
1302 	struct cur_reg_rule *reg_rules_6g_client_ptr[REG_CURRENT_MAX_AP_TYPE][REG_MAX_CLIENT_TYPE];
1303 #ifdef CONFIG_REG_CLIENT
1304 	struct cur_fcc_rule *fcc_rules_ptr;
1305 	uint32_t num_fcc_rules;
1306 #endif
1307 };
1308 
1309 #if defined(CONFIG_AFC_SUPPORT) && defined(CONFIG_BAND_6GHZ)
1310 
1311 /**
1312  * enum reg_afc_event_type - indicates the type of AFC event from FW to host.
1313  * @REG_AFC_EVENT_POWER_INFO:
1314  * 1. For sending Power Info REG_AFC_EVENT_POWER_INFO event is used.
1315  * @REG_AFC_EVENT_TIMER_EXPIRY:
1316  * 2. For sending AFC expiry use REG_AFC_EVENT_TIMER_EXPIRY
1317  *
1318  * This type can be expanded in future as per requirements.
1319  */
1320 enum reg_afc_event_type {
1321 	REG_AFC_EVENT_POWER_INFO = 1,
1322 	REG_AFC_EVENT_TIMER_EXPIRY = 2,
1323 };
1324 
1325 /**
1326  * enum reg_afc_expiry_event_subtype - indicates the AFC expiry subtype.
1327  * @REG_AFC_EXPIRY_EVENT_START:
1328  * 1. At boot up AFC expiry will contain AFC start.
1329  * @REG_AFC_EXPIRY_EVENT_RENEW:
1330  * 2. If AFC timer expires AFC_RENEW status code will be sent to host
1331  *    with expiry event.
1332  * @REG_AFC_EXPIRY_EVENT_SWITCH_TO_LPI:
1333  * 3. If AFC server is not responding to FW in specified time, FW will
1334  *    indicate host to switch to LPI.
1335  * @REG_AFC_EXPIRY_EVENT_STOP_TX:
1336  */
1337 enum reg_afc_expiry_event_subtype {
1338 	REG_AFC_EXPIRY_EVENT_START = 1,
1339 	REG_AFC_EXPIRY_EVENT_RENEW = 2,
1340 	REG_AFC_EXPIRY_EVENT_SWITCH_TO_LPI = 3,
1341 	REG_AFC_EXPIRY_EVENT_STOP_TX = 4,
1342 };
1343 
1344 /**
1345  * enum reg_fw_afc_power_event_status_code
1346  * @REG_FW_AFC_POWER_EVENT_SUCCESS:
1347  * 0. AFC power event is success.
1348  * @REG_FW_AFC_POWER_EVENT_RESP_NOT_RECEIVED:
1349  * 1. If Host does not indicate AFC indication cmd within certain time
1350  *    of AFC expiry, REG_FW_AFC_POWER_EVENT_RESP_NOT_RECEIVED will be used.
1351  * @REG_FW_AFC_POWER_EVENT_RESP_PARSING_FAILURE:
1352  * 2. If FW is not able to parse afc_info, parsing_failure will be
1353  *    indicated using REG_FW_AFC_POWER_EVENT_RESP_NOT_RECEIVED.
1354  * @REG_FW_AFC_POWER_EVENT_FAILURE:
1355  * 3. If due to some local reason AFC event is failed, AFC event failure
1356  *    is indicated using REG_FW_AFC_POWER_EVENT_FAILURE.
1357  *
1358  * Firmware AFC power event status codes
1359  */
1360 enum reg_fw_afc_power_event_status_code {
1361 	REG_FW_AFC_POWER_EVENT_SUCCESS = 0,
1362 	REG_FW_AFC_POWER_EVENT_RESP_NOT_RECEIVED = 1,
1363 	REG_FW_AFC_POWER_EVENT_RESP_PARSING_FAILURE = 2,
1364 	REG_FW_AFC_POWER_EVENT_FAILURE = 3,
1365 };
1366 
1367 /**
1368  * enum reg_afc_serv_resp_code - AFC server response codes
1369  * @REG_AFC_SERV_RESP_GENERAL_FAILURE:
1370  * @REG_AFC_SERV_RESP_SUCCESS:
1371  * @REG_AFC_SERV_RESP_VERSION_NOT_SUPPORTED:
1372  * @REG_AFC_SERV_RESP_DEVICE_UNALLOWED:
1373  * @REG_AFC_SERV_RESP_MISSING_PARAM:
1374  * @REG_AFC_SERV_RESP_INVALID_VALUE:
1375  * @REG_AFC_SERV_RESP_UNEXPECTED_PARAM:
1376  * @REG_AFC_SERV_RESP_UNSUPPORTED_SPECTRUM:
1377  *
1378  * The following reg_afc_server_resp_code is mutually exclusive.
1379  * This response code will be indicated to AFC server.
1380  * These codes are defined in WIFI spec doc for AFC as follows
1381  * -1: General Failure
1382  * 0:  Success
1383  * 100 - 199: General errors related to the protocol
1384  * 300 - 399: Error events specific to message exchange for the
1385  *            Available Spectrum Inquiry
1386  */
1387 enum reg_afc_serv_resp_code {
1388 	REG_AFC_SERV_RESP_GENERAL_FAILURE = -1,
1389 	REG_AFC_SERV_RESP_SUCCESS = 0,
1390 	REG_AFC_SERV_RESP_VERSION_NOT_SUPPORTED = 100,
1391 	REG_AFC_SERV_RESP_DEVICE_UNALLOWED = 101,
1392 	REG_AFC_SERV_RESP_MISSING_PARAM = 102,
1393 	REG_AFC_SERV_RESP_INVALID_VALUE = 103,
1394 	REG_AFC_SERV_RESP_UNEXPECTED_PARAM = 106,
1395 	REG_AFC_SERV_RESP_UNSUPPORTED_SPECTRUM = 300,
1396 };
1397 
1398 /**
1399  * struct afc_freq_obj
1400  * @low_freq: Lower edge frequency
1401  * @high_freq: Upper edge frequency
1402  * @max_psd: Max PSD in 0.01 dBm/MHz units
1403  */
1404 struct afc_freq_obj {
1405 	qdf_freq_t low_freq;
1406 	qdf_freq_t high_freq;
1407 	int16_t max_psd;
1408 };
1409 
1410 /**
1411  * struct chan_eirp_obj
1412  * @cfi: Channel frequency index
1413  * @eirp_power: Max EIRP power in 0.01 dBm units
1414  */
1415 struct chan_eirp_obj {
1416 	uint8_t cfi;
1417 	int16_t eirp_power;
1418 };
1419 
1420 /**
1421  * struct afc_chan_obj
1422  * @global_opclass: Global Operating class
1423  * @num_chans: Number of channels
1424  * @chan_eirp_info: Pointer to afc channel EIRP object
1425  */
1426 struct afc_chan_obj {
1427 	uint8_t global_opclass;
1428 	uint8_t num_chans;
1429 	struct chan_eirp_obj *chan_eirp_info;
1430 };
1431 
1432 /**
1433  * struct reg_afc_expiry_event
1434  * @request_id: AFC request id generated by the firmware
1435  * @event_subtype: AFC expiry event subtype
1436  */
1437 struct reg_afc_expiry_event {
1438 	uint32_t request_id;
1439 	enum reg_afc_expiry_event_subtype event_subtype;
1440 };
1441 
1442 /**
1443  * struct reg_fw_afc_power_event
1444  * @resp_id: AFC server response id
1445  * @fw_status_code: firmware status code
1446  * @serv_resp_code: AFC server response code
1447  * @afc_wfa_version: AFC version
1448  * @avail_exp_time_d: Expiry date of the AFC power info
1449  * @avail_exp_time_t: Time left for expiry of the AFC power info
1450  * @num_freq_objs: Number of freq objects
1451  * @num_chan_objs: Number of channel objects
1452  * @afc_freq_info: Pointer to AFC freq object
1453  * @afc_chan_info: Pointer to AFC channel object
1454  */
1455 struct reg_fw_afc_power_event {
1456 	uint32_t resp_id;
1457 	enum reg_fw_afc_power_event_status_code fw_status_code;
1458 	enum reg_afc_serv_resp_code serv_resp_code;
1459 	uint32_t afc_wfa_version;
1460 	uint32_t avail_exp_time_d;
1461 	uint32_t avail_exp_time_t;
1462 	uint8_t num_freq_objs;
1463 	uint8_t num_chan_objs;
1464 	struct afc_freq_obj *afc_freq_info;
1465 	struct afc_chan_obj *afc_chan_info;
1466 };
1467 
1468 /**
1469  * struct afc_regulatory_info
1470  * @psoc: psoc ptr
1471  * @phy_id: phy id
1472  * @event_type: AFC event type
1473  * @expiry_info: pointer to information present in the AFC expiry event
1474  * @power_info: pointer to information present in the AFC power event
1475  */
1476 struct afc_regulatory_info {
1477 	struct wlan_objmgr_psoc *psoc;
1478 	uint8_t phy_id;
1479 	enum reg_afc_event_type event_type;
1480 	union {
1481 		struct reg_afc_expiry_event *expiry_info;
1482 		struct reg_fw_afc_power_event *power_info;
1483 	};
1484 };
1485 #endif
1486 
1487 /**
1488  * struct reg_rule_info
1489  * @alpha2: alpha2 of reg rules
1490  * @dfs_region: dfs region
1491  * @num_of_reg_rules: number of reg rules
1492  * @reg_rules: regulatory rules array
1493  * @num_of_6g_ap_reg_rules: number of 6g AP reg rules
1494  * @reg_rules_6g_ap: reg rules for all 6g AP
1495  * @num_of_6g_client_reg_rules: number of 6g client reg rules
1496  * @reg_rules_6g_client: reg rules for all 6g clients
1497  */
1498 struct reg_rule_info {
1499 	uint8_t alpha2[REG_ALPHA2_LEN + 1];
1500 	enum dfs_reg dfs_region;
1501 	uint8_t num_of_reg_rules;
1502 	struct cur_reg_rule reg_rules[MAX_REG_RULES];
1503 #ifdef CONFIG_BAND_6GHZ
1504 	uint8_t num_of_6g_ap_reg_rules[REG_CURRENT_MAX_AP_TYPE];
1505 	struct cur_reg_rule reg_rules_6g_ap[REG_CURRENT_MAX_AP_TYPE][MAX_6G_REG_RULES];
1506 	uint8_t num_of_6g_client_reg_rules[REG_CURRENT_MAX_AP_TYPE];
1507 	struct cur_reg_rule reg_rules_6g_client[REG_CURRENT_MAX_AP_TYPE][MAX_6G_REG_RULES];
1508 #endif
1509 };
1510 
1511 /**
1512  * enum reg_wifi_band
1513  * @REG_BAND_2G: 2G band
1514  * @REG_BAND_5G: 5G band
1515  * @REG_BAND_6G: 6G band
1516  * @REG_BAND_UNKNOWN: Unsupported band
1517  */
1518 enum reg_wifi_band {
1519 	REG_BAND_2G,
1520 	REG_BAND_5G,
1521 	REG_BAND_6G,
1522 	REG_BAND_UNKNOWN
1523 };
1524 
1525 #ifdef DISABLE_UNII_SHARED_BANDS
1526 /**
1527  * enum reg_unii_band
1528  * @REG_UNII_BAND_1: Disable UNII-1 band channels
1529  * @REG_UNII_BAND_2A: Disable UNII-2A band channels
1530  */
1531 enum reg_unii_band {
1532 	REG_UNII_BAND_1 = 0x0,
1533 	REG_UNII_BAND_2A = 0x1,
1534 };
1535 #endif
1536 
1537 #define REG_BAND_MASK_ALL (BIT(REG_BAND_2G) | BIT(REG_BAND_5G) \
1538 			  | BIT(REG_BAND_6G))
1539 
1540 /* Avoid the use of band_info as it does not support 6GHz band. Use
1541  * reg_wifi_band, as it supports the 6GHz band
1542  */
1543 /**
1544  * enum band_info
1545  * @BAND_ALL:all bands
1546  * @BAND_2G: 2G band
1547  * @BAND_5G: 5G band
1548  * @BAND_UNKNOWN: Unsupported band
1549  */
1550 enum band_info {
1551 	BAND_ALL,
1552 	BAND_2G,
1553 	BAND_5G,
1554 	BAND_UNKNOWN
1555 };
1556 
1557 /**
1558  * enum restart_beaconing_on_ch_avoid_rule: control the beaconing entity to
1559  * move away from active LTE channels
1560  * @CH_AVOID_RULE_DO_NOT_RESTART: Do not move from active LTE
1561  *                              channels
1562  * @CH_AVOID_RULE_RESTART: Move from active LTE channels
1563  * @CH_AVOID_RULE_RESTART_24G_ONLY: move from 2.4G active LTE
1564  *                                channels only
1565  */
1566 enum restart_beaconing_on_ch_avoid_rule {
1567 	CH_AVOID_RULE_DO_NOT_RESTART,
1568 	CH_AVOID_RULE_RESTART,
1569 	CH_AVOID_RULE_RESTART_24G_ONLY,
1570 };
1571 
1572 /**
1573  * struct reg_config_vars
1574  * @enable_11d_support: enable 11d support
1575  * @scan_11d_interval: 11d scan interval in ms
1576  * @userspace_ctry_priority: user priority
1577  * @band_capability: band capability
1578  * @dfs_enabled: dfs enabled
1579  * @indoor_chan_enabled: indoor channel support
1580  * @force_ssc_disable_indoor_channel: Disable indoor channel on sap start
1581  * @restart_beaconing: control the beaconing entity to move
1582  * away from active LTE channels
1583  * @enable_srd_chan_in_master_mode: SRD channel support in master mode
1584  * @enable_11d_in_world_mode: enable 11d in world mode
1585  * @enable_5dot9_ghz_chan_in_master_mode: 5.9 GHz channel support in
1586  * master mode
1587  * @retain_nol_across_regdmn_update: Retain the NOL list across the regdomain.
1588  * @coex_unsafe_chan_nb_user_prefer: Honor coex unsafe chan cmd from firmware or
1589  * userspace
1590  * @coex_unsafe_chan_reg_disable: To disable reg channels for received coex
1591  * unsafe channels list
1592  * @enable_6ghz_sp_pwrmode_supp: Enable target 6 GHz Standard Power mode support
1593  * @afc_disable_timer_check: Disable target AFC timer check
1594  * @afc_disable_request_id_check: Disable target AFC request id check
1595  * @is_afc_reg_noaction: Whether no action to AFC power event
1596  * @sta_sap_scc_on_indoor_channel: Value of sap+sta scc on indoor support
1597  * @p2p_indoor_ch_support: Allow P2P GO in indoor channels
1598  */
1599 struct reg_config_vars {
1600 	uint32_t enable_11d_support;
1601 	uint32_t scan_11d_interval;
1602 	uint32_t userspace_ctry_priority;
1603 	uint32_t band_capability;
1604 	uint32_t dfs_enabled;
1605 	uint32_t indoor_chan_enabled;
1606 	uint32_t force_ssc_disable_indoor_channel;
1607 	enum restart_beaconing_on_ch_avoid_rule restart_beaconing;
1608 	uint8_t enable_srd_chan_in_master_mode;
1609 	bool enable_11d_in_world_mode;
1610 	bool enable_5dot9_ghz_chan_in_master_mode;
1611 	bool retain_nol_across_regdmn_update;
1612 #ifdef FEATURE_WLAN_CH_AVOID_EXT
1613 	bool coex_unsafe_chan_nb_user_prefer;
1614 	bool coex_unsafe_chan_reg_disable;
1615 #endif
1616 #if defined(CONFIG_AFC_SUPPORT) && defined(CONFIG_BAND_6GHZ)
1617 	bool enable_6ghz_sp_pwrmode_supp;
1618 	bool afc_disable_timer_check;
1619 	bool afc_disable_request_id_check;
1620 	bool is_afc_reg_noaction;
1621 #endif
1622 	bool sta_sap_scc_on_indoor_channel;
1623 	bool p2p_indoor_ch_support;
1624 };
1625 
1626 /**
1627  * struct reg_freq_range
1628  * @low_freq: low frequency
1629  * @high_freq: high frequency
1630  */
1631 struct reg_freq_range {
1632 	uint32_t low_freq;
1633 	uint32_t high_freq;
1634 };
1635 
1636 /**
1637  * enum direction
1638  * @NORTHBOUND: northbound
1639  * @SOUTHBOUND: southbound
1640  */
1641 enum direction {
1642 	NORTHBOUND,
1643 	SOUTHBOUND,
1644 };
1645 
1646 /**
1647  * struct mas_chan_params
1648  * @dfs_region: dfs region
1649  * @phybitmap: phybitmap
1650  * @mas_chan_list: master chan list for 2GHz and 5GHz channels
1651  * @is_6g_channel_list_populated: indicates the channel lists are populated
1652  * @mas_chan_list_6g_ap: master chan list for 6GHz AP channels
1653  * @mas_chan_list_6g_client: master chan list for 6GHz client
1654  * @is_6g_afc_power_event_received: indicates if the AFC event is received.
1655  * @mas_chan_list_6g_afc: master chan list for 6GHz AFC
1656  * @default_country: default country
1657  * @current_country: current country
1658  * @def_region_domain: default reg domain
1659  * @def_country_code: default country code
1660  * @reg_dmn_pair: reg domain pair
1661  * @reg_6g_superid: 6G super domain ID
1662  * @ctry_code: country code
1663  * @reg_rules: regulatory rules
1664  * @ap_pwr_type: type of AP
1665  * @client_type: type of client
1666  * @rnr_tpe_usable: if RNR TPE octet is usable for country
1667  * @unspecified_ap_usable: if not set, AP usable for country
1668  * @reg_6g_thresh_priority_freq: All frequencies greater or equal will be given
1669  * priority during channel selection by upper layer
1670  * @max_bw_5g: Maximum 5g Bandwidth
1671  */
1672 struct mas_chan_params {
1673 	enum dfs_reg dfs_region;
1674 	uint32_t phybitmap;
1675 	struct regulatory_channel mas_chan_list[NUM_CHANNELS];
1676 #ifdef CONFIG_BAND_6GHZ
1677 	bool is_6g_channel_list_populated;
1678 	struct regulatory_channel mas_chan_list_6g_ap[REG_CURRENT_MAX_AP_TYPE][NUM_6GHZ_CHANNELS];
1679 	struct regulatory_channel mas_chan_list_6g_client[REG_CURRENT_MAX_AP_TYPE][REG_MAX_CLIENT_TYPE][NUM_6GHZ_CHANNELS];
1680 #ifdef CONFIG_AFC_SUPPORT
1681 	bool is_6g_afc_power_event_received;
1682 	struct regulatory_channel mas_chan_list_6g_afc[NUM_6GHZ_CHANNELS];
1683 #endif
1684 #endif
1685 	char default_country[REG_ALPHA2_LEN + 1];
1686 	char current_country[REG_ALPHA2_LEN + 1];
1687 	uint16_t def_region_domain;
1688 	uint16_t def_country_code;
1689 	uint32_t reg_dmn_pair;
1690 	uint16_t reg_6g_superid;
1691 	uint16_t ctry_code;
1692 	struct reg_rule_info reg_rules;
1693 #ifdef CONFIG_BAND_6GHZ
1694 	enum reg_6g_ap_type ap_pwr_type;
1695 	enum reg_6g_client_type client_type;
1696 	bool rnr_tpe_usable;
1697 	bool unspecified_ap_usable;
1698 	qdf_freq_t reg_6g_thresh_priority_freq;
1699 #endif
1700 	uint16_t max_bw_5g;
1701 };
1702 
1703 /**
1704  * enum cc_regdmn_flag: Regdomain flags
1705  * @INVALID_CC:    Invalid flag
1706  * @CC_IS_SET:     Country code is set
1707  * @REGDMN_IS_SET: Regdomain ID is set
1708  * @ALPHA_IS_SET:  Country ISO is set
1709  */
1710 enum cc_regdmn_flag {
1711 	INVALID_CC,
1712 	CC_IS_SET,
1713 	REGDMN_IS_SET,
1714 	ALPHA_IS_SET,
1715 };
1716 
1717 /**
1718  * struct cc_regdmn_s: User country code or regdomain
1719  * @cc: Union of country code/regulatory domain
1720  * @cc.country_code: Country code
1721  * @cc.regdmn: Regulatory domain
1722  * @cc.regdmn.reg_2g_5g_pair_id:  Regdomain pair ID (2Ghz + 5Ghz domain pair)
1723  * @cc.regdmn.sixg_superdmn_id: 6Ghz super domain id
1724  * @cc.alpha: Country ISO
1725  * @flags: Regdomain flags (see enum cc_regdmn_flag)
1726  */
1727 struct cc_regdmn_s {
1728 	union {
1729 		uint16_t country_code;
1730 		struct {
1731 			uint16_t reg_2g_5g_pair_id;
1732 			uint16_t sixg_superdmn_id;
1733 		} regdmn;
1734 		uint8_t alpha[REG_ALPHA2_LEN + 1];
1735 	} cc;
1736 	uint8_t flags;
1737 };
1738 
1739 /**
1740  * struct cur_regdmn_info: Current regulatory info
1741  * @regdmn_pair_id: Current regdomain pair ID
1742  * @dmn_id_2g: 2GHz regdomain ID
1743  * @dmn_id_5g: 5GHz regdomain ID
1744  * @ctl_2g: 2GHz CTL value
1745  * @ctl_5g: 5GHzCTL value
1746  * @dfs_region: dfs region
1747  */
1748 struct cur_regdmn_info {
1749 	uint16_t regdmn_pair_id;
1750 	uint16_t dmn_id_2g;
1751 	uint16_t dmn_id_5g;
1752 	uint8_t ctl_2g;
1753 	uint8_t ctl_5g;
1754 	uint8_t dfs_region;
1755 };
1756 
1757 /**
1758  * struct ch_avoid_freq_type
1759  * @start_freq: start freq
1760  * @end_freq: end freq
1761  * @txpower: txpower
1762  * @is_valid_txpower: Is @txpower valid
1763  */
1764 struct ch_avoid_freq_type {
1765 	qdf_freq_t start_freq;
1766 	qdf_freq_t end_freq;
1767 	int32_t txpower;
1768 	bool is_valid_txpower;
1769 };
1770 
1771 /**
1772  * struct ch_avoid_ind_type
1773  * @ch_avoid_range_cnt: count
1774  * @avoid_freq_range: avoid freq range array
1775  * @restriction_mask: restriction mask to apply txpower
1776  */
1777 struct ch_avoid_ind_type {
1778 	uint32_t ch_avoid_range_cnt;
1779 	struct ch_avoid_freq_type avoid_freq_range[CH_AVOID_MAX_RANGE];
1780 	uint32_t restriction_mask;
1781 };
1782 
1783 /**
1784  * struct unsafe_ch_list
1785  * @chan_cnt: no.of channels
1786  * @chan_freq_list: channel frequency list
1787  * @txpower: Tx power per channel
1788  * @is_valid_txpower: Is @txpower valid per channel
1789  */
1790 struct unsafe_ch_list {
1791 	uint16_t chan_cnt;
1792 	uint16_t chan_freq_list[NUM_CHANNELS];
1793 	int32_t txpower[NUM_CHANNELS];
1794 	bool is_valid_txpower[NUM_CHANNELS];
1795 };
1796 
1797 /**
1798  * struct avoid_freq_ind_data
1799  * @freq_list: frequency list
1800  * @chan_list: channel list
1801  */
1802 struct avoid_freq_ind_data {
1803 	struct ch_avoid_ind_type freq_list;
1804 	struct unsafe_ch_list chan_list;
1805 };
1806 
1807 /**
1808  * struct reg_sched_payload
1809  * @psoc: psoc ptr
1810  * @pdev: pdev ptr
1811  * @ch_avoid_ind: if avoidance event indicated
1812  * @avoid_info: chan avoid info if @ch_avoid_ind is true
1813  */
1814 struct reg_sched_payload {
1815 	struct wlan_objmgr_psoc *psoc;
1816 	struct wlan_objmgr_pdev *pdev;
1817 	bool ch_avoid_ind;
1818 	struct avoid_freq_ind_data avoid_info;
1819 };
1820 
1821 #define FIVEG_STARTING_FREQ        5000
1822 #define TWOG_STARTING_FREQ         2407
1823 #define TWOG_CHAN_14_IN_MHZ        2484
1824 #define TWOG_CHAN_1_IN_MHZ         2412
1825 #define TWOG_CHAN_5_IN_MHZ         2432
1826 #define TWOG_CHAN_6_IN_MHZ         2437
1827 #define TWOG_CHAN_9_IN_MHZ         2452
1828 #define TWOG_CHAN_13_IN_MHZ        2472
1829 #define FIVEG_CHAN_36_IN_MHZ       5180
1830 #define FIVEG_CHAN_177_IN_MHZ      5885
1831 #define SIXG_CHAN_2_IN_MHZ         5935
1832 #define SIXG_CHAN_1_IN_MHZ         5955
1833 #define SIXG_CHAN_233_IN_MHZ       7115
1834 
1835 #define HT40_SEC_OFFSET              20
1836 
1837 #define IEEE_2GHZ_CH1                 1
1838 #define IEEE_2GHZ_CH14               14
1839 #define IEEE_5GHZ_CH36               36
1840 #define IEEE_6GHZ_CH1                 1
1841 #define IEEE_6GHZ_CH2                 2
1842 #define IEEE_CH_SEP                   5
1843 
1844 /**
1845  * struct reg_ctl_params - reg ctl and regd info
1846  * @regd: regdomain pair
1847  * @regd_2g: 2g sub domain code
1848  * @regd_5g: 5g sub domain code
1849  * @ctl_2g: 2g ctl info
1850  * @ctl_5g: 5g ctl info
1851  */
1852 struct reg_ctl_params {
1853 	uint32_t regd;
1854 	uint16_t regd_2g;
1855 	uint16_t regd_5g;
1856 	uint8_t ctl_2g;
1857 	uint8_t ctl_5g;
1858 };
1859 
1860 /**
1861  * enum reg_phymode - Regulatory phymode
1862  * @REG_PHYMODE_INVALID: Invalid phymode
1863  * @REG_PHYMODE_11B: 802.11b phymode
1864  * @REG_PHYMODE_11G: 802.11g phymode
1865  * @REG_PHYMODE_11A: 802.11a phymode
1866  * @REG_PHYMODE_11N: 802.11n phymode
1867  * @REG_PHYMODE_11AC: 802.11ac phymode
1868  * @REG_PHYMODE_11AX: 802.11ax phymode
1869  * @REG_PHYMODE_11BE: 802.11be phymode
1870  * @REG_PHYMODE_MAX: placeholder for future phymodes
1871  */
1872 enum reg_phymode {
1873 	REG_PHYMODE_INVALID,
1874 	REG_PHYMODE_11B,
1875 	REG_PHYMODE_11G,
1876 	REG_PHYMODE_11A,
1877 	REG_PHYMODE_11N,
1878 	REG_PHYMODE_11AC,
1879 	REG_PHYMODE_11AX,
1880 #ifdef WLAN_FEATURE_11BE
1881 	REG_PHYMODE_11BE,
1882 #endif
1883 	REG_PHYMODE_MAX,
1884 };
1885 
1886 /**
1887  * struct chan_power_info - TPE containing power info per channel chunk
1888  * @chan_cfreq: channel center freq (MHz)
1889  * @tx_power: transmit power (dBm)
1890  */
1891 struct chan_power_info {
1892 	qdf_freq_t chan_cfreq;
1893 	int8_t tx_power;
1894 };
1895 
1896 /**
1897  * struct reg_tpc_power_info - regulatory TPC power info
1898  * @is_psd_power: is PSD power or not
1899  * @eirp_power: Maximum EIRP power (dBm), valid only if power is PSD
1900  * @power_type_6g: type of power (SP/LPI/VLP)
1901  * @num_pwr_levels: number of power levels
1902  * @reg_max: Array of maximum TX power (dBm) per PSD value
1903  * @ap_constraint_power: AP constraint power (dBm)
1904  * @frequency: Array of operating frequency
1905  * @tpe: TPE values processed from TPE IE
1906  * @chan_power_info: power info to send to FW
1907  * @is_power_constraint_abs: is power constraint absolute or not
1908  */
1909 struct reg_tpc_power_info {
1910 	bool is_psd_power;
1911 	int8_t eirp_power;
1912 	uint8_t power_type_6g;
1913 	uint8_t num_pwr_levels;
1914 	uint8_t reg_max[MAX_NUM_PWR_LEVEL];
1915 	uint8_t ap_constraint_power;
1916 	qdf_freq_t frequency[MAX_NUM_PWR_LEVEL];
1917 	uint8_t tpe[MAX_NUM_PWR_LEVEL];
1918 	struct chan_power_info chan_power_info[MAX_NUM_PWR_LEVEL];
1919 	bool is_power_constraint_abs;
1920 };
1921 
1922 #ifdef FEATURE_WLAN_CH_AVOID_EXT
1923 typedef struct unsafe_ch_list avoid_ch_ext_list;
1924 /**
1925  * struct chan_5g_center_freq
1926  * @center_freq_20: center frequency of max 200Mhz
1927  * @center_freq_40: center frequency of max 40Mhz
1928  * @center_freq_80: center frequency of max 80Mhz
1929  * @center_freq_160: center frequency of max 160Mhz
1930  */
1931 struct chan_5g_center_freq {
1932 	qdf_freq_t center_freq_20;
1933 	qdf_freq_t center_freq_40;
1934 	qdf_freq_t center_freq_80;
1935 	qdf_freq_t center_freq_160;
1936 };
1937 
1938 #define INVALID_CENTER_FREQ 0
1939 /*MAX 5g channel numbers, not include dsrc*/
1940 #define MAX_5G_CHAN_NUM 28
1941 
1942 #endif
1943 
1944 /**
1945  * enum HOST_REGDMN_MODE:
1946  * @HOST_REGDMN_MODE_11A: 11a channels
1947  * @HOST_REGDMN_MODE_TURBO: 11a turbo-only channels
1948  * @HOST_REGDMN_MODE_11B: 11b channels
1949  * @HOST_REGDMN_MODE_PUREG: 11g channels (OFDM only)
1950  * @HOST_REGDMN_MODE_11G: historical
1951  * @HOST_REGDMN_MODE_108G: 11g+Turbo channels
1952  * @HOST_REGDMN_MODE_108A: 11a+Turbo channels
1953  * @HOST_REGDMN_MODE_11AC_VHT20_2G: 2GHz, VHT20
1954  * @HOST_REGDMN_MODE_XR: XR channels
1955  * @HOST_REGDMN_MODE_11A_HALF_RATE: 11a half rate channels
1956  * @HOST_REGDMN_MODE_11A_QUARTER_RATE: 11a quarter rate channels
1957  * @HOST_REGDMN_MODE_11NG_HT20: 11ng HT20 channels
1958  * @HOST_REGDMN_MODE_11NA_HT20: 11na HT20 channels
1959  * @HOST_REGDMN_MODE_11NG_HT40PLUS: 11ng HT40+ channels
1960  * @HOST_REGDMN_MODE_11NG_HT40MINUS: 11ng HT40- channels
1961  * @HOST_REGDMN_MODE_11NA_HT40PLUS: 11na HT40+ channels
1962  * @HOST_REGDMN_MODE_11NA_HT40MINUS: 11na HT40- channels
1963  * @HOST_REGDMN_MODE_11AC_VHT20: 5GHz, VHT20
1964  * @HOST_REGDMN_MODE_11AC_VHT40PLUS: 5GHz, VHT40+ channels
1965  * @HOST_REGDMN_MODE_11AC_VHT40MINUS: 5GHz, VHT40- channels
1966  * @HOST_REGDMN_MODE_11AC_VHT80: 5GHz, VHT80 channels
1967  * @HOST_REGDMN_MODE_11AC_VHT160: 5GHz, VHT160 channels
1968  * @HOST_REGDMN_MODE_11AC_VHT80_80: 5GHz, VHT80+80 channels
1969  * @HOST_REGDMN_MODE_11AXG_HE20: 11ax 2.4GHz, HE20 channels
1970  * @HOST_REGDMN_MODE_11AXA_HE20: 11ax 5GHz, HE20 channels
1971  * @HOST_REGDMN_MODE_11AXG_HE40PLUS: 11ax 2.4GHz, HE40+ channels
1972  * @HOST_REGDMN_MODE_11AXG_HE40MINUS: 11ax 2.4GHz, HE40- channels
1973  * @HOST_REGDMN_MODE_11AXA_HE40PLUS: 11ax 5GHz, HE40+ channels
1974  * @HOST_REGDMN_MODE_11AXA_HE40MINUS: 11ax 5GHz, HE40- channels
1975  * @HOST_REGDMN_MODE_11AXA_HE80: 11ax 5GHz, HE80 channels
1976  * @HOST_REGDMN_MODE_11AXA_HE160: 11ax 5GHz, HE160 channels
1977  * @HOST_REGDMN_MODE_11AXA_HE80_80: 11ax 5GHz, HE80+80 channels
1978  * @HOST_REGDMN_MODE_11BEG_EHT20: 11be 2.4GHz, EHT20 channels
1979  * @HOST_REGDMN_MODE_11BEA_EHT20: 11be 5GHz, EHT20 channels
1980  * @HOST_REGDMN_MODE_11BEG_EHT40PLUS: 11be 2.4GHz, EHT40+ channels
1981  * @HOST_REGDMN_MODE_11BEG_EHT40MINUS: 11be 2.4GHz, EHT40- channels
1982  * @HOST_REGDMN_MODE_11BEA_EHT40PLUS: 11be 5GHz, EHT40+ channels
1983  * @HOST_REGDMN_MODE_11BEA_EHT40MINUS: 11be 5GHz, EHT40- channels
1984  * @HOST_REGDMN_MODE_11BEA_EHT80: 11be 5GHz, EHT80 channels
1985  * @HOST_REGDMN_MODE_11BEA_EHT160: 11be 5GHz, EHT160 channels
1986  * @HOST_REGDMN_MODE_11BEA_EHT320: 11be 5GHz, EHT320 channels
1987  * @HOST_REGDMN_MODE_ALL: All modes selected
1988  */
1989 enum HOST_REGDMN_MODE {
1990 	HOST_REGDMN_MODE_11A = 0x00000001,
1991 	HOST_REGDMN_MODE_TURBO = 0x00000002,
1992 	HOST_REGDMN_MODE_11B = 0x00000004,
1993 	HOST_REGDMN_MODE_PUREG = 0x00000008,
1994 	HOST_REGDMN_MODE_11G = 0x00000008,
1995 	HOST_REGDMN_MODE_108G = 0x00000020,
1996 	HOST_REGDMN_MODE_108A = 0x00000040,
1997 	HOST_REGDMN_MODE_11AC_VHT20_2G = 0x00000080,
1998 	HOST_REGDMN_MODE_XR = 0x00000100,
1999 	HOST_REGDMN_MODE_11A_HALF_RATE = 0x00000200,
2000 	HOST_REGDMN_MODE_11A_QUARTER_RATE = 0x00000400,
2001 	HOST_REGDMN_MODE_11NG_HT20 = 0x00000800,
2002 	HOST_REGDMN_MODE_11NA_HT20 = 0x00001000,
2003 	HOST_REGDMN_MODE_11NG_HT40PLUS = 0x00002000,
2004 	HOST_REGDMN_MODE_11NG_HT40MINUS = 0x00004000,
2005 	HOST_REGDMN_MODE_11NA_HT40PLUS = 0x00008000,
2006 	HOST_REGDMN_MODE_11NA_HT40MINUS = 0x00010000,
2007 	HOST_REGDMN_MODE_11AC_VHT20 = 0x00020000,
2008 	HOST_REGDMN_MODE_11AC_VHT40PLUS = 0x00040000,
2009 	HOST_REGDMN_MODE_11AC_VHT40MINUS = 0x00080000,
2010 	HOST_REGDMN_MODE_11AC_VHT80 = 0x00100000,
2011 	HOST_REGDMN_MODE_11AC_VHT160 = 0x00200000,
2012 	HOST_REGDMN_MODE_11AC_VHT80_80 = 0x00400000,
2013 	HOST_REGDMN_MODE_11AXG_HE20 = 0x00800000,
2014 	HOST_REGDMN_MODE_11AXA_HE20 = 0x01000000,
2015 	HOST_REGDMN_MODE_11AXG_HE40PLUS = 0x02000000,
2016 	HOST_REGDMN_MODE_11AXG_HE40MINUS = 0x04000000,
2017 	HOST_REGDMN_MODE_11AXA_HE40PLUS = 0x08000000,
2018 	HOST_REGDMN_MODE_11AXA_HE40MINUS = 0x10000000,
2019 	HOST_REGDMN_MODE_11AXA_HE80 = 0x20000000,
2020 	HOST_REGDMN_MODE_11AXA_HE160 = 0x40000000,
2021 	HOST_REGDMN_MODE_11AXA_HE80_80 = 0x80000000,
2022 #ifdef WLAN_FEATURE_11BE
2023 	HOST_REGDMN_MODE_11BEG_EHT20 = 0x0000000100000000,
2024 	HOST_REGDMN_MODE_11BEA_EHT20 = 0x0000000200000000,
2025 	HOST_REGDMN_MODE_11BEG_EHT40PLUS = 0x0000000400000000,
2026 	HOST_REGDMN_MODE_11BEG_EHT40MINUS = 0x0000000800000000,
2027 	HOST_REGDMN_MODE_11BEA_EHT40PLUS = 0x0000001000000000,
2028 	HOST_REGDMN_MODE_11BEA_EHT40MINUS = 0x0000002000000000,
2029 	HOST_REGDMN_MODE_11BEA_EHT80 = 0x0000004000000000,
2030 	HOST_REGDMN_MODE_11BEA_EHT160 = 0x0000008000000000,
2031 	HOST_REGDMN_MODE_11BEA_EHT320 = 0x0000010000000000,
2032 #endif
2033 	HOST_REGDMN_MODE_ALL = 0xffffffffffffffff
2034 };
2035 
2036 #define WIRELESS_11AX_MODES  (HOST_REGDMN_MODE_11AXG_HE20 \
2037 			      | HOST_REGDMN_MODE_11AXG_HE40PLUS \
2038 			      | HOST_REGDMN_MODE_11AXG_HE40MINUS \
2039 			      | HOST_REGDMN_MODE_11AXA_HE20 \
2040 			      | HOST_REGDMN_MODE_11AXA_HE40PLUS \
2041 			      | HOST_REGDMN_MODE_11AXA_HE40MINUS \
2042 			      | HOST_REGDMN_MODE_11AXA_HE80 \
2043 			      | HOST_REGDMN_MODE_11AXA_HE160 \
2044 			      | HOST_REGDMN_MODE_11AXA_HE80_80)
2045 
2046 #ifdef WLAN_FEATURE_11BE
2047 #define WIRELESS_11BE_MODES  (HOST_REGDMN_MODE_11BEG_EHT20 \
2048 			      | HOST_REGDMN_MODE_11BEA_EHT20 \
2049 			      | HOST_REGDMN_MODE_11BEG_EHT40PLUS \
2050 			      | HOST_REGDMN_MODE_11BEG_EHT40MINUS \
2051 			      | HOST_REGDMN_MODE_11BEA_EHT40PLUS \
2052 			      | HOST_REGDMN_MODE_11BEA_EHT40MINUS \
2053 			      | HOST_REGDMN_MODE_11BEA_EHT80 \
2054 			      | HOST_REGDMN_MODE_11BEA_EHT160 \
2055 			      | HOST_REGDMN_MODE_11BEA_EHT320)
2056 #endif
2057 
2058 #define WIRELESS_11AC_MODES  (HOST_REGDMN_MODE_11AC_VHT20 \
2059 			      | HOST_REGDMN_MODE_11AC_VHT40PLUS \
2060 			      | HOST_REGDMN_MODE_11AC_VHT40MINUS \
2061 			      | HOST_REGDMN_MODE_11AC_VHT80 \
2062 			      | HOST_REGDMN_MODE_11AC_VHT160 \
2063 			      | HOST_REGDMN_MODE_11AC_VHT80_80)
2064 
2065 #define WIRELESS_11N_MODES   (HOST_REGDMN_MODE_11NG_HT20 \
2066 			      | HOST_REGDMN_MODE_11NA_HT20 \
2067 			      | HOST_REGDMN_MODE_11NG_HT40PLUS \
2068 			      | HOST_REGDMN_MODE_11NG_HT40MINUS \
2069 			      | HOST_REGDMN_MODE_11NA_HT40PLUS \
2070 			      | HOST_REGDMN_MODE_11NA_HT40MINUS)
2071 
2072 #define WIRELESS_11G_MODES   (HOST_REGDMN_MODE_PUREG \
2073 			      | HOST_REGDMN_MODE_11G \
2074 			      | HOST_REGDMN_MODE_108G)
2075 
2076 #define WIRELESS_11B_MODES   (HOST_REGDMN_MODE_11B)
2077 
2078 #define WIRELESS_11A_MODES   (HOST_REGDMN_MODE_11A \
2079 			      | HOST_REGDMN_MODE_TURBO \
2080 			      | HOST_REGDMN_MODE_108A \
2081 			      | HOST_REGDMN_MODE_11A_HALF_RATE \
2082 			      | HOST_REGDMN_MODE_11A_QUARTER_RATE)
2083 
2084 #ifdef WLAN_FEATURE_11BE
2085 #define WIRELESS_20_MODES    (HOST_REGDMN_MODE_11A \
2086 			      | HOST_REGDMN_MODE_TURBO \
2087 			      | HOST_REGDMN_MODE_11B \
2088 			      | HOST_REGDMN_MODE_PUREG \
2089 			      | HOST_REGDMN_MODE_11G \
2090 			      | HOST_REGDMN_MODE_11AC_VHT20_2G \
2091 			      | HOST_REGDMN_MODE_11NG_HT20 \
2092 			      | HOST_REGDMN_MODE_11NA_HT20 \
2093 			      | HOST_REGDMN_MODE_11AC_VHT20 \
2094 			      | HOST_REGDMN_MODE_11AXG_HE20 \
2095 			      | HOST_REGDMN_MODE_11AXA_HE20 \
2096 			      | HOST_REGDMN_MODE_11BEA_EHT20 \
2097 			      | HOST_REGDMN_MODE_11BEG_EHT20)
2098 #else
2099 #define WIRELESS_20_MODES    (HOST_REGDMN_MODE_11A \
2100 			      | HOST_REGDMN_MODE_TURBO \
2101 			      | HOST_REGDMN_MODE_11B \
2102 			      | HOST_REGDMN_MODE_PUREG \
2103 			      | HOST_REGDMN_MODE_11G \
2104 			      | HOST_REGDMN_MODE_11AC_VHT20_2G \
2105 			      | HOST_REGDMN_MODE_11NG_HT20 \
2106 			      | HOST_REGDMN_MODE_11NA_HT20 \
2107 			      | HOST_REGDMN_MODE_11AC_VHT20 \
2108 			      | HOST_REGDMN_MODE_11AXG_HE20 \
2109 			      | HOST_REGDMN_MODE_11AXA_HE20)
2110 #endif
2111 
2112 #define WIRELESS_10_MODES   (HOST_REGDMN_MODE_11A_HALF_RATE)
2113 #define WIRELESS_5_MODES    (HOST_REGDMN_MODE_11A_QUARTER_RATE)
2114 
2115 #ifdef WLAN_FEATURE_11BE
2116 #define WIRELESS_40_MODES    (HOST_REGDMN_MODE_11NG_HT40PLUS \
2117 			      | HOST_REGDMN_MODE_11NG_HT40MINUS \
2118 			      | HOST_REGDMN_MODE_11NA_HT40PLUS \
2119 			      | HOST_REGDMN_MODE_11NA_HT40MINUS \
2120 			      | HOST_REGDMN_MODE_11AC_VHT40PLUS \
2121 			      | HOST_REGDMN_MODE_11AC_VHT40MINUS \
2122 			      | HOST_REGDMN_MODE_11AXG_HE40PLUS \
2123 			      | HOST_REGDMN_MODE_11AXG_HE40MINUS \
2124 			      | HOST_REGDMN_MODE_11AXA_HE40PLUS \
2125 			      | HOST_REGDMN_MODE_11AXA_HE40MINUS \
2126 			      | HOST_REGDMN_MODE_11BEA_EHT40PLUS \
2127 			      | HOST_REGDMN_MODE_11BEA_EHT40MINUS \
2128 			      | HOST_REGDMN_MODE_11BEG_EHT40PLUS \
2129 			      | HOST_REGDMN_MODE_11BEG_EHT40MINUS)
2130 #else
2131 #define WIRELESS_40_MODES    (HOST_REGDMN_MODE_11NG_HT40PLUS \
2132 			      | HOST_REGDMN_MODE_11NG_HT40MINUS \
2133 			      | HOST_REGDMN_MODE_11NA_HT40PLUS \
2134 			      | HOST_REGDMN_MODE_11NA_HT40MINUS \
2135 			      | HOST_REGDMN_MODE_11AC_VHT40PLUS \
2136 			      | HOST_REGDMN_MODE_11AC_VHT40MINUS \
2137 			      | HOST_REGDMN_MODE_11AXG_HE40PLUS \
2138 			      | HOST_REGDMN_MODE_11AXG_HE40MINUS \
2139 			      | HOST_REGDMN_MODE_11AXA_HE40PLUS \
2140 			      | HOST_REGDMN_MODE_11AXA_HE40MINUS)
2141 #endif
2142 
2143 #ifdef WLAN_FEATURE_11BE
2144 #define WIRELESS_80_MODES    (HOST_REGDMN_MODE_11AC_VHT80 \
2145 			      | HOST_REGDMN_MODE_11AXA_HE80 \
2146 			      | HOST_REGDMN_MODE_11BEA_EHT80)
2147 #else
2148 #define WIRELESS_80_MODES    (HOST_REGDMN_MODE_11AC_VHT80 \
2149 			      | HOST_REGDMN_MODE_11AXA_HE80)
2150 #endif
2151 
2152 #ifdef WLAN_FEATURE_11BE
2153 #define WIRELESS_160_MODES   (HOST_REGDMN_MODE_11AC_VHT160 \
2154 			      | HOST_REGDMN_MODE_11AXA_HE160 \
2155 			      | HOST_REGDMN_MODE_11BEA_EHT160)
2156 #else
2157 #define WIRELESS_160_MODES   (HOST_REGDMN_MODE_11AC_VHT160 \
2158 			      | HOST_REGDMN_MODE_11AXA_HE160)
2159 #endif
2160 
2161 #define WIRELESS_80P80_MODES (HOST_REGDMN_MODE_11AC_VHT80_80 \
2162 			      | HOST_REGDMN_MODE_11AXA_HE80_80)
2163 
2164 #ifdef WLAN_FEATURE_11BE
2165 #define WIRELESS_320_MODES (HOST_REGDMN_MODE_11BEA_EHT320)
2166 #endif
2167 
2168 #ifdef WLAN_FEATURE_11BE
2169 #define WIRELESS_6G_MODES_11BE (HOST_REGDMN_MODE_11BEA_EHT20 \
2170 				| HOST_REGDMN_MODE_11BEA_EHT40PLUS \
2171 				| HOST_REGDMN_MODE_11BEA_EHT40MINUS \
2172 				| HOST_REGDMN_MODE_11BEA_EHT80 \
2173 				| HOST_REGDMN_MODE_11BEA_EHT160 \
2174 				| HOST_REGDMN_MODE_11BEA_EHT320)
2175 #else
2176 #define WIRELESS_6G_MODES_11BE 0
2177 #endif /* WLAN_FEATURE_11BE*/
2178 
2179 #ifdef WLAN_FEATURE_11BE
2180 #define WIRELESS_6G_MODES (HOST_REGDMN_MODE_11AXA_HE20 \
2181 			   | HOST_REGDMN_MODE_11AXA_HE40PLUS \
2182 			   | HOST_REGDMN_MODE_11AXA_HE40MINUS \
2183 			   | HOST_REGDMN_MODE_11AXA_HE80 \
2184 			   | HOST_REGDMN_MODE_11AXA_HE160 \
2185 			   | HOST_REGDMN_MODE_11AXA_HE80_80 \
2186 			   | HOST_REGDMN_MODE_11BEA_EHT20 \
2187 			   | HOST_REGDMN_MODE_11BEA_EHT40PLUS \
2188 			   | HOST_REGDMN_MODE_11BEA_EHT40MINUS \
2189 			   | HOST_REGDMN_MODE_11BEA_EHT80 \
2190 			   | HOST_REGDMN_MODE_11BEA_EHT160 \
2191 			   | HOST_REGDMN_MODE_11BEA_EHT320)
2192 #else
2193 #define WIRELESS_6G_MODES (HOST_REGDMN_MODE_11AXA_HE20 \
2194 			   | HOST_REGDMN_MODE_11AXA_HE40PLUS \
2195 			   | HOST_REGDMN_MODE_11AXA_HE40MINUS \
2196 			   | HOST_REGDMN_MODE_11AXA_HE80 \
2197 			   | HOST_REGDMN_MODE_11AXA_HE160 \
2198 			   | HOST_REGDMN_MODE_11AXA_HE80_80)
2199 #endif
2200 
2201 #ifdef WLAN_FEATURE_11BE
2202 #define WIRELESS_5G_MODES_11BE (HOST_REGDMN_MODE_11BEA_EHT20 \
2203 				| HOST_REGDMN_MODE_11BEA_EHT40PLUS \
2204 				| HOST_REGDMN_MODE_11BEA_EHT40MINUS \
2205 				| HOST_REGDMN_MODE_11BEA_EHT80 \
2206 				| HOST_REGDMN_MODE_11BEA_EHT160 \
2207 				| HOST_REGDMN_MODE_11BEA_EHT320)
2208 #else
2209 #define WIRELESS_5G_MODES_11BE 0
2210 #endif /* WLAN_FEATURE_11BE*/
2211 
2212 #ifdef WLAN_FEATURE_11BE
2213 #define WIRELESS_5G_MODES (HOST_REGDMN_MODE_11BEA_EHT20 \
2214 			   | HOST_REGDMN_MODE_11BEA_EHT40PLUS \
2215 			   | HOST_REGDMN_MODE_11BEA_EHT40MINUS \
2216 			   | HOST_REGDMN_MODE_11BEA_EHT80 \
2217 			   | HOST_REGDMN_MODE_11BEA_EHT160 \
2218 			   | HOST_REGDMN_MODE_11BEA_EHT320 \
2219 			   | HOST_REGDMN_MODE_11AXA_HE20 \
2220 			   | HOST_REGDMN_MODE_11AXA_HE40PLUS \
2221 			   | HOST_REGDMN_MODE_11AXA_HE40MINUS \
2222 			   | HOST_REGDMN_MODE_11AXA_HE80 \
2223 			   | HOST_REGDMN_MODE_11AXA_HE160 \
2224 			   | HOST_REGDMN_MODE_11AXA_HE80_80 \
2225 			   | HOST_REGDMN_MODE_11AC_VHT20 \
2226 			   | HOST_REGDMN_MODE_11AC_VHT40PLUS \
2227 			   | HOST_REGDMN_MODE_11AC_VHT40MINUS \
2228 			   | HOST_REGDMN_MODE_11AC_VHT80 \
2229 			   | HOST_REGDMN_MODE_11AC_VHT160 \
2230 			   | HOST_REGDMN_MODE_11AC_VHT80_80 \
2231 			   | HOST_REGDMN_MODE_11NA_HT20 \
2232 			   | HOST_REGDMN_MODE_11NA_HT40PLUS \
2233 			   | HOST_REGDMN_MODE_11NA_HT40MINUS \
2234 			   | HOST_REGDMN_MODE_11A \
2235 			   | HOST_REGDMN_MODE_TURBO \
2236 			   | HOST_REGDMN_MODE_108A \
2237 			   | HOST_REGDMN_MODE_11A_HALF_RATE \
2238 			   | HOST_REGDMN_MODE_11A_QUARTER_RATE)
2239 #else
2240 #define WIRELESS_5G_MODES (HOST_REGDMN_MODE_11AXA_HE20 \
2241 			   | HOST_REGDMN_MODE_11AXA_HE40PLUS \
2242 			   | HOST_REGDMN_MODE_11AXA_HE40MINUS \
2243 			   | HOST_REGDMN_MODE_11AXA_HE80 \
2244 			   | HOST_REGDMN_MODE_11AXA_HE160 \
2245 			   | HOST_REGDMN_MODE_11AXA_HE80_80 \
2246 			   | HOST_REGDMN_MODE_11AC_VHT20 \
2247 			   | HOST_REGDMN_MODE_11AC_VHT40PLUS \
2248 			   | HOST_REGDMN_MODE_11AC_VHT40MINUS \
2249 			   | HOST_REGDMN_MODE_11AC_VHT80 \
2250 			   | HOST_REGDMN_MODE_11AC_VHT160 \
2251 			   | HOST_REGDMN_MODE_11AC_VHT80_80 \
2252 			   | HOST_REGDMN_MODE_11NA_HT20 \
2253 			   | HOST_REGDMN_MODE_11NA_HT40PLUS \
2254 			   | HOST_REGDMN_MODE_11NA_HT40MINUS \
2255 			   | HOST_REGDMN_MODE_11A \
2256 			   | HOST_REGDMN_MODE_TURBO \
2257 			   | HOST_REGDMN_MODE_108A \
2258 			   | HOST_REGDMN_MODE_11A_HALF_RATE \
2259 			   | HOST_REGDMN_MODE_11A_QUARTER_RATE)
2260 #endif
2261 
2262 #define WIRELESS_49G_MODES (HOST_REGDMN_MODE_11A \
2263 			    | HOST_REGDMN_MODE_11A_HALF_RATE \
2264 			    | HOST_REGDMN_MODE_11A_QUARTER_RATE)
2265 #ifdef WLAN_FEATURE_11BE
2266 #define WIRELESS_2G_MODES_11BE (HOST_REGDMN_MODE_11BEG_EHT20 \
2267 				| HOST_REGDMN_MODE_11BEG_EHT40PLUS \
2268 				| HOST_REGDMN_MODE_11BEG_EHT40MINUS)
2269 #else
2270 #define WIRELESS_2G_MODES_11BE 0
2271 #endif /* WLAN_FEATURE_11BE*/
2272 
2273 #ifdef WLAN_FEATURE_11BE
2274 #define WIRELESS_2G_MODES (HOST_REGDMN_MODE_11BEG_EHT20 \
2275 			   | HOST_REGDMN_MODE_11BEG_EHT40PLUS \
2276 			   | HOST_REGDMN_MODE_11BEG_EHT40MINUS \
2277 			   | HOST_REGDMN_MODE_11AXG_HE20 \
2278 			   | HOST_REGDMN_MODE_11AXG_HE40PLUS \
2279 			   | HOST_REGDMN_MODE_11AXG_HE40MINUS \
2280 			   | HOST_REGDMN_MODE_11NG_HT20 \
2281 			   | HOST_REGDMN_MODE_11NG_HT40PLUS \
2282 			   | HOST_REGDMN_MODE_11NG_HT40MINUS \
2283 			   | HOST_REGDMN_MODE_PUREG \
2284 			   | HOST_REGDMN_MODE_11G \
2285 			   | HOST_REGDMN_MODE_108G \
2286 			   | HOST_REGDMN_MODE_11B)
2287 #else
2288 #define WIRELESS_2G_MODES (HOST_REGDMN_MODE_11AXG_HE20 \
2289 			   | HOST_REGDMN_MODE_11AXG_HE40PLUS \
2290 			   | HOST_REGDMN_MODE_11AXG_HE40MINUS \
2291 			   | HOST_REGDMN_MODE_11NG_HT20 \
2292 			   | HOST_REGDMN_MODE_11NG_HT40PLUS \
2293 			   | HOST_REGDMN_MODE_11NG_HT40MINUS \
2294 			   | HOST_REGDMN_MODE_PUREG \
2295 			   | HOST_REGDMN_MODE_11G \
2296 			   | HOST_REGDMN_MODE_108G \
2297 			   | HOST_REGDMN_MODE_11B)
2298 #endif
2299 
2300 #ifdef CONFIG_AFC_SUPPORT
2301 /**
2302  * enum reg_afc_cmd_type - Type of AFC command sent to FW
2303  * @REG_AFC_CMD_SERV_RESP_READY: Server response is ready
2304  * @REG_AFC_CMD_RESET_AFC: Ask the target to send an AFC expiry event
2305  * @REG_AFC_CMD_CLEAR_AFC_PAYLOAD: Ask the target to clear AFC Payload.
2306  * The target in response sends REG_AFC_EXPIRY_EVENT_STOP_TX to host.
2307  */
2308 enum reg_afc_cmd_type {
2309 	REG_AFC_CMD_SERV_RESP_READY = 1,
2310 	REG_AFC_CMD_RESET_AFC = 2,
2311 	REG_AFC_CMD_CLEAR_AFC_PAYLOAD = 3,
2312 };
2313 
2314 /**
2315  * enum reg_afc_serv_resp_format - Indicate the format in which afc_serv_format
2316  *                                 is written in FW memory
2317  * @REG_AFC_SERV_RESP_FORMAT_JSON: Server response in JSON format
2318  * @REG_AFC_SERV_RESP_FORMAT_BINARY: Server response in BINARY format
2319  */
2320 enum reg_afc_serv_resp_format {
2321 	REG_AFC_SERV_RESP_FORMAT_JSON = 0,
2322 	REG_AFC_SERV_RESP_FORMAT_BINARY = 1,
2323 };
2324 
2325 /**
2326  * struct reg_afc_resp_rx_ind_info - regulatory AFC indication info
2327  * @cmd_type: Type of AFC command send to FW
2328  * @serv_resp_format: AFC server response format
2329  */
2330 struct reg_afc_resp_rx_ind_info {
2331 	enum reg_afc_cmd_type cmd_type;
2332 	enum reg_afc_serv_resp_format serv_resp_format;
2333 };
2334 
2335 /**
2336  * typedef afc_req_rx_evt_handler() - Function prototype of AFC request
2337  *                                    received event handler
2338  * @pdev: Pointer to pdev
2339  * @afc_req: Pointer to AFC request
2340  * @arg: Pointer to void (opaque) argument object
2341  *
2342  * Return: void
2343  */
2344 typedef void (*afc_req_rx_evt_handler)(struct wlan_objmgr_pdev *pdev,
2345 				       struct wlan_afc_host_request *afc_req,
2346 				       void *arg);
2347 
2348 /**
2349  * typedef afc_power_tx_evt_handler() - Function prototype of AFC power event
2350  *                                      sent handler
2351  * @pdev: Pointer to pdev
2352  * @power_info: Pointer to AFC power event data
2353  * @arg: Pointer to void (opaque) argument object
2354  *
2355  * Return: void
2356  */
2357 typedef void
2358 (*afc_power_tx_evt_handler)(struct wlan_objmgr_pdev *pdev,
2359 			    struct reg_fw_afc_power_event *power_info,
2360 			    void *arg);
2361 
2362 /**
2363  * typedef afc_payload_reset_tx_evt_handler() - Function prototype of AFC
2364  * payload reset event sent handler
2365  * @pdev: Pointer to pdev
2366  * @arg: Pointer to void (opaque) argument object
2367  *
2368  * Return: void
2369  */
2370 typedef void
2371 (*afc_payload_reset_tx_evt_handler)(struct wlan_objmgr_pdev *pdev,
2372 				    void *arg);
2373 #endif
2374 
2375 /**
2376  * reg_is_chan_enum_invalid() - Checks if the channel enum is invalid or not.
2377  * @chan_enum: Input channel enum.
2378  *
2379  * Return: true if channel enum is invalid else false.
2380  */
reg_is_chan_enum_invalid(enum channel_enum chan_enum)2381 static inline bool reg_is_chan_enum_invalid(enum channel_enum chan_enum)
2382 {
2383 	return chan_enum >= INVALID_CHANNEL;
2384 }
2385 
2386 /**
2387  * struct r2p_table_update_status_obj
2388  * @pdev_id: pdev id from target
2389  * @status: rate2power update status
2390  */
2391 struct r2p_table_update_status_obj {
2392 	uint32_t pdev_id;
2393 	uint32_t status;
2394 };
2395 #endif
2396