• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /******************************************************************************
2  *
3  * Copyright(c) 2007 - 2018 Realtek Corporation.
4  *
5  * This program is free software; you can redistribute it and/or modify it
6  * under the terms of version 2 of the GNU General Public License as
7  * published by the Free Software Foundation.
8  *
9  * This program is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12  * more details.
13  *
14  *****************************************************************************/
15 #ifndef __RTW_CHPLAN_H__
16 #define __RTW_CHPLAN_H__
17 
18 #define RTW_CHPLAN_IOCTL_NULL			0xFFFE /* special value by ioctl: null(empty) chplan */
19 #define RTW_CHPLAN_IOCTL_UNSPECIFIED	0xFFFF /* special value by ioctl: no change (keep original) */
20 
21 #define RTW_CHPLAN_NULL			0x1A
22 #define RTW_CHPLAN_WORLDWIDE	0x7F
23 #define RTW_CHPLAN_UNSPECIFIED	0xFF
24 #define RTW_CHPLAN_6G_NULL			0x00
25 #define RTW_CHPLAN_6G_WORLDWIDE		0x7F
26 #define RTW_CHPLAN_6G_UNSPECIFIED	0xFF
27 
28 u8 rtw_chplan_get_default_regd_2g(u8 id);
29 u8 rtw_chplan_get_default_regd_5g(u8 id);
30 bool rtw_is_channel_plan_valid(u8 id);
31 bool rtw_regsty_is_excl_chs(struct registry_priv *regsty, u8 ch);
32 
33 #if CONFIG_IEEE80211_BAND_6GHZ
34 u8 rtw_chplan_get_default_regd_6g(u8 id);
35 bool rtw_is_channel_plan_6g_valid(u8 id);
36 bool rtw_regsty_is_excl_chs_6g(struct registry_priv *regsty, u8 ch);
37 #endif
38 
39 u8 rtw_chplan_is_chbw_valid(u8 id, u8 id_6g, BAND_TYPE band, u8 ch, u8 bw, u8 offset
40 	, bool allow_primary_passive, bool allow_passive, struct registry_priv *regsty);
41 
42 enum regd_src_t {
43 	REGD_SRC_RTK_PRIV = 0, /* Regulatory settings from Realtek framework (Realtek defined or customized) */
44 	REGD_SRC_OS = 1, /* Regulatory settings from OS */
45 	REGD_SRC_NUM,
46 };
47 
48 #define regd_src_is_valid(src) ((src) < REGD_SRC_NUM)
49 
50 extern const char *_regd_src_str[];
51 #define regd_src_str(src) ((src) >= REGD_SRC_NUM ? _regd_src_str[REGD_SRC_NUM] : _regd_src_str[src])
52 
53 struct _RT_CHANNEL_INFO;
54 u8 init_channel_set(_adapter *adapter);
55 bool rtw_chset_is_dfs_range(struct _RT_CHANNEL_INFO *chset, u32 hi, u32 lo);
56 bool rtw_chset_is_dfs_ch(struct _RT_CHANNEL_INFO *chset, u8 ch);
57 bool rtw_chset_is_dfs_chbw(struct _RT_CHANNEL_INFO *chset, u8 ch, u8 bw, u8 offset);
58 bool rtw_chinfo_allow_beacon_hint(struct _RT_CHANNEL_INFO *chinfo);
59 u8 rtw_process_beacon_hint(_adapter *adapter, WLAN_BSSID_EX *bss);
60 
61 #define ALPHA2_FMT "%c%c"
62 #define ALPHA2_ARG(a2) ((is_alpha(a2[0]) || is_decimal(a2[0])) ? a2[0] : '-'), ((is_alpha(a2[1]) || is_decimal(a2[1])) ? a2[1] : '-')
63 
64 #define WORLDWIDE_ALPHA2	"00"
65 #define UNSPEC_ALPHA2		"99"
66 
67 #define IS_ALPHA2_WORLDWIDE(_alpha2)	(strncmp(_alpha2, WORLDWIDE_ALPHA2, 2) == 0)
68 #define IS_ALPHA2_UNSPEC(_alpha2)		(strncmp(_alpha2, UNSPEC_ALPHA2, 2) == 0)
69 #define SET_UNSPEC_ALPHA2(_alpha2)		do { _rtw_memcpy(_alpha2, UNSPEC_ALPHA2, 2); } while (0)
70 
71 #define RTW_MODULE_RTL8821AE_HMC_M2		BIT0	/* RTL8821AE(HMC + M.2) */
72 #define RTW_MODULE_RTL8821AU			BIT1	/* RTL8821AU */
73 #define RTW_MODULE_RTL8812AENF_NGFF		BIT2	/* RTL8812AENF(8812AE+8761)_NGFF */
74 #define RTW_MODULE_RTL8812AEBT_HMC		BIT3	/* RTL8812AEBT(8812AE+8761)_HMC */
75 #define RTW_MODULE_RTL8188EE_HMC_M2		BIT4	/* RTL8188EE(HMC + M.2) */
76 #define RTW_MODULE_RTL8723BE_HMC_M2		BIT5	/* RTL8723BE(HMC + M.2) */
77 #define RTW_MODULE_RTL8723BS_NGFF1216	BIT6	/* RTL8723BS(NGFF1216) */
78 #define RTW_MODULE_RTL8192EEBT_HMC_M2	BIT7	/* RTL8192EEBT(8192EE+8761AU)_(HMC + M.2) */
79 #define RTW_MODULE_RTL8723DE_NGFF1630	BIT8	/* RTL8723DE(NGFF1630) */
80 #define RTW_MODULE_RTL8822BE			BIT9	/* RTL8822BE */
81 #define RTW_MODULE_RTL8821CE			BIT10	/* RTL8821CE */
82 #define RTW_MODULE_RTL8822CE			BIT11	/* RTL8822CE */
83 
84 enum rtw_regd_inr {
85 	RTW_REGD_SET_BY_INIT = 0,
86 	RTW_REGD_SET_BY_USER = 1,
87 	RTW_REGD_SET_BY_COUNTRY_IE = 2,
88 
89 	/* below is not used for REGD_SRC_RTK_PRIV */
90 	RTW_REGD_SET_BY_DRIVER = 3,
91 	RTW_REGD_SET_BY_CORE = 4,
92 
93 	RTW_REGD_SET_BY_NUM,
94 };
95 
96 extern const char *const _regd_inr_str[];
97 #define regd_inr_str(inr) (((inr) >= RTW_REGD_SET_BY_NUM) ? _regd_inr_str[RTW_REGD_SET_BY_NUM] : _regd_inr_str[(inr)])
98 
99 enum rtw_regd {
100 	RTW_REGD_NA = 0,
101 	RTW_REGD_FCC = 1,
102 	RTW_REGD_MKK = 2,
103 	RTW_REGD_ETSI = 3,
104 	RTW_REGD_IC = 4,
105 	RTW_REGD_KCC = 5,
106 	RTW_REGD_NCC = 6,
107 	RTW_REGD_ACMA = 7,
108 	RTW_REGD_CHILE = 8,
109 	RTW_REGD_MEX = 9,
110 	RTW_REGD_WW,
111 	RTW_REGD_NUM,
112 };
113 
114 extern const char *const _regd_str[];
115 #define regd_str(regd) (((regd) >= RTW_REGD_NUM) ? _regd_str[RTW_REGD_NA] : _regd_str[(regd)])
116 
117 enum rtw_edcca_mode {
118 	RTW_EDCCA_NORMAL	= 0, /* normal */
119 	RTW_EDCCA_ADAPT		= 1, /* adaptivity */
120 	RTW_EDCCA_CS		= 2, /* carrier sense */
121 
122 	RTW_EDCCA_MODE_NUM,
123 	RTW_EDCCA_DEF		= RTW_EDCCA_MODE_NUM, /* default (ref to domain code), used at country chplan map's override field */
124 };
125 
126 extern const char *const _rtw_edcca_mode_str[];
127 #define rtw_edcca_mode_str(mode) (((mode) >= RTW_EDCCA_MODE_NUM) ? _rtw_edcca_mode_str[RTW_EDCCA_NORMAL] : _rtw_edcca_mode_str[(mode)])
128 
129 enum rtw_dfs_regd {
130 	RTW_DFS_REGD_NONE	= 0,
131 	RTW_DFS_REGD_FCC	= 1,
132 	RTW_DFS_REGD_MKK	= 2,
133 	RTW_DFS_REGD_ETSI	= 3,
134 	RTW_DFS_REGD_NUM,
135 	RTW_DFS_REGD_AUTO	= 0xFF, /* follow channel plan */
136 };
137 
138 extern const char *_rtw_dfs_regd_str[];
139 #define rtw_dfs_regd_str(region) (((region) >= RTW_DFS_REGD_NUM) ? _rtw_dfs_regd_str[RTW_DFS_REGD_NONE] : _rtw_dfs_regd_str[(region)])
140 
141 typedef enum _REGULATION_TXPWR_LMT {
142 	TXPWR_LMT_NONE = 0, /* no limit */
143 	TXPWR_LMT_FCC = 1,
144 	TXPWR_LMT_MKK = 2,
145 	TXPWR_LMT_ETSI = 3,
146 	TXPWR_LMT_IC = 4,
147 	TXPWR_LMT_KCC = 5,
148 	TXPWR_LMT_NCC = 6,
149 	TXPWR_LMT_ACMA = 7,
150 	TXPWR_LMT_CHILE = 8,
151 	TXPWR_LMT_UKRAINE = 9,
152 	TXPWR_LMT_MEXICO = 10,
153 	TXPWR_LMT_CN = 11,
154 	TXPWR_LMT_QATAR = 12,
155 	TXPWR_LMT_WW, /* smallest of all available limit, keep last */
156 
157 	TXPWR_LMT_NUM,
158 	TXPWR_LMT_DEF = TXPWR_LMT_NUM, /* default (ref to domain code), used at country chplan map's override field */
159 } REGULATION_TXPWR_LMT;
160 
161 extern const char *const _txpwr_lmt_str[];
162 #define txpwr_lmt_str(regd) (((regd) >= TXPWR_LMT_NUM) ? _txpwr_lmt_str[TXPWR_LMT_NUM] : _txpwr_lmt_str[(regd)])
163 
164 extern const REGULATION_TXPWR_LMT _txpwr_lmt_alternate[];
165 #define txpwr_lmt_alternate(ori) (((ori) > TXPWR_LMT_NUM) ? _txpwr_lmt_alternate[TXPWR_LMT_WW] : _txpwr_lmt_alternate[(ori)])
166 
167 #define TXPWR_LMT_ALTERNATE_DEFINED(txpwr_lmt) (txpwr_lmt_alternate(txpwr_lmt) != txpwr_lmt)
168 
169 extern const enum rtw_edcca_mode _rtw_regd_to_edcca_mode[RTW_REGD_NUM];
170 #define rtw_regd_to_edcca_mode(regd) (((regd) >= RTW_REGD_NUM) ? RTW_EDCCA_NORMAL : _rtw_regd_to_edcca_mode[(regd)])
171 
172 extern const REGULATION_TXPWR_LMT _rtw_regd_to_txpwr_lmt[];
173 #define rtw_regd_to_txpwr_lmt(regd) (((regd) >= RTW_REGD_NUM) ? TXPWR_LMT_WW : _rtw_regd_to_txpwr_lmt[(regd)])
174 
175 #define EDCCA_MODES_STR_LEN (((6 + 3 + 1) * BAND_MAX) + 1)
176 char *rtw_get_edcca_modes_str(char *buf, u8 modes[]);
177 void rtw_edcca_mode_update(struct dvobj_priv *dvobj);
178 u8 rtw_get_edcca_mode(struct dvobj_priv *dvobj, BAND_TYPE band);
179 
180 #define TXPWR_NAMES_STR_LEN (((1 + 7 + 1) * BAND_MAX) + 1)
181 char *rtw_get_txpwr_lmt_names_str(char *buf, const char *names[], u8 unknown_bmp);
182 
183 #define CHPLAN_PROTO_EN_AC		BIT0
184 #define CHPLAN_PROTO_EN_AX		BIT1
185 #define CHPLAN_PROTO_EN_ALL	0xFF
186 
187 struct country_chplan {
188 	char alpha2[2];
189 	u8 chplan;
190 #if CONFIG_IEEE80211_BAND_6GHZ
191 	u8 chplan_6g;
192 #endif
193 	u8 edcca_mode_2g_override:2;
194 #if CONFIG_IEEE80211_BAND_5GHZ
195 	u8 edcca_mode_5g_override:2;
196 #endif
197 #if CONFIG_IEEE80211_BAND_6GHZ
198 	u8 edcca_mode_6g_override:2;
199 #endif
200 	u8 txpwr_lmt_override;
201 #if defined(CONFIG_80211AX_HE) || defined(CONFIG_80211AC_VHT)
202 	u8 proto_en;
203 #endif
204 };
205 
206 #ifdef CONFIG_80211AC_VHT
207 #define COUNTRY_CHPLAN_EN_11AC(_ent) (((_ent)->proto_en & CHPLAN_PROTO_EN_AC) ? 1 : 0)
208 #else
209 #define COUNTRY_CHPLAN_EN_11AC(_ent) 0
210 #endif
211 
212 #ifdef CONFIG_80211AX_HE
213 #define COUNTRY_CHPLAN_EN_11AX(_ent) (((_ent)->proto_en & CHPLAN_PROTO_EN_AX) ? 1 : 0)
214 #else
215 #define COUNTRY_CHPLAN_EN_11AX(_ent) 0
216 #endif
217 
218 void rtw_get_chplan_worldwide(struct country_chplan *ent);
219 bool rtw_get_chplan_from_country(const char *country_code, struct country_chplan *ent);
220 
221 void rtw_chplan_ioctl_input_mapping(u16 *chplan, u16 *chplan_6g);
222 bool rtw_chplan_ids_is_world_wide(u8 chplan, u8 chplan_6g);
223 
224 u8 rtw_country_chplan_is_chbw_valid(struct country_chplan *ent, BAND_TYPE band, u8 ch, u8 bw, u8 offset
225 	, bool allow_primary_passive, bool allow_passive, struct registry_priv *regsty);
226 
227 enum country_ie_slave_status {
228 	COUNTRY_IE_SLAVE_NOCOUNTRY		= 0,
229 	COUNTRY_IE_SLAVE_UNKNOWN		= 1,
230 	COUNTRY_IE_SLAVE_OPCH_NOEXIST	= 2,
231 	COUNTRY_IE_SLAVE_APPLICABLE		= 3,
232 
233 	COUNTRY_IE_SLAVE_STATUS_NUM,
234 };
235 
236 struct country_ie_slave_record {
237 	char alpha2[2]; /* country code get from connected AP of STA ifaces, "\x00\x00" is not set */
238 	BAND_TYPE band;
239 	u8 opch;
240 	enum country_ie_slave_status status;
241 };
242 
243 #ifdef CONFIG_80211D
244 extern const char *const _cis_status_str[];
245 #define cis_status_str(s) (((s) >= COUNTRY_IE_SLAVE_STATUS_NUM) ? _cis_status_str[COUNTRY_IE_SLAVE_STATUS_NUM] : _cis_status_str[(s)])
246 
247 void dump_country_ie_slave_records(void *sel, struct rf_ctl_t *rfctl, bool skip_noset);
248 
249 enum country_ie_slave_status rtw_get_chplan_from_recv_country_ie(_adapter *adapter
250 		, BAND_TYPE band, u8 opch, const u8 *country_ie, struct country_chplan *ent
251 		, struct country_ie_slave_record *cisr, const char *caller_msg);
252 
253 enum country_ie_slave_status rtw_get_chplan_from_cisrs(struct rf_ctl_t *rfctl
254 	, struct country_chplan *ent, const char *caller_msg);
255 #endif
256 
257 void dump_country_chplan(void *sel, const struct country_chplan *ent, bool regd_info);
258 void dump_country_chplan_map(void *sel, bool regd_info);
259 void dump_country_list(void *sel);
260 void dump_chplan_id_list(void *sel);
261 void dump_chplan_country_list(void *sel);
262 #if CONFIG_IEEE80211_BAND_6GHZ
263 void dump_chplan_6g_id_list(void *sel);
264 void dump_chplan_6g_country_list(void *sel);
265 #endif
266 #ifdef CONFIG_RTW_DEBUG
267 void dump_chplan_test(void *sel);
268 #endif
269 void dump_chplan_ver(void *sel);
270 
271 #endif /* __RTW_CHPLAN_H__ */
272