1 /* SPDX-License-Identifier: GPL-2.0 */
2 /******************************************************************************
3 *
4 * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved.
5 *
6 ******************************************************************************/
7 #ifndef _WIFI_H_
8 #define _WIFI_H_
9
10 #define WLAN_HDR_A3_LEN 24
11 #define WLAN_HDR_A3_QOS_LEN 26
12
13 #define WLAN_WMM_LEN 24
14
15 /* This value is tested by WiFi 11n Test Plan 5.2.3. */
16 /* This test verifies the WLAN NIC can update the NAV through sending the CTS with large duration. */
17 #define WiFiNavUpperUs 30000 /* 30 ms */
18
19 enum {
20 WIFI_MGT_TYPE = (0),
21 WIFI_CTRL_TYPE = (BIT(2)),
22 WIFI_DATA_TYPE = (BIT(3)),
23 WIFI_QOS_DATA_TYPE = (BIT(7)|BIT(3)), /* QoS Data */
24 };
25
26 enum {
27
28 /* below is for mgt frame */
29 WIFI_ASSOCREQ = (0 | WIFI_MGT_TYPE),
30 WIFI_ASSOCRSP = (BIT(4) | WIFI_MGT_TYPE),
31 WIFI_REASSOCREQ = (BIT(5) | WIFI_MGT_TYPE),
32 WIFI_REASSOCRSP = (BIT(5) | BIT(4) | WIFI_MGT_TYPE),
33 WIFI_PROBEREQ = (BIT(6) | WIFI_MGT_TYPE),
34 WIFI_PROBERSP = (BIT(6) | BIT(4) | WIFI_MGT_TYPE),
35 WIFI_BEACON = (BIT(7) | WIFI_MGT_TYPE),
36 WIFI_ATIM = (BIT(7) | BIT(4) | WIFI_MGT_TYPE),
37 WIFI_DISASSOC = (BIT(7) | BIT(5) | WIFI_MGT_TYPE),
38 WIFI_AUTH = (BIT(7) | BIT(5) | BIT(4) | WIFI_MGT_TYPE),
39 WIFI_DEAUTH = (BIT(7) | BIT(6) | WIFI_MGT_TYPE),
40 WIFI_ACTION = (BIT(7) | BIT(6) | BIT(4) | WIFI_MGT_TYPE),
41 WIFI_ACTION_NOACK = (BIT(7) | BIT(6) | BIT(5) | WIFI_MGT_TYPE),
42
43 /* below is for control frame */
44 WIFI_NDPA = (BIT(6) | BIT(4) | WIFI_CTRL_TYPE),
45 WIFI_PSPOLL = (BIT(7) | BIT(5) | WIFI_CTRL_TYPE),
46 WIFI_RTS = (BIT(7) | BIT(5) | BIT(4) | WIFI_CTRL_TYPE),
47 WIFI_CTS = (BIT(7) | BIT(6) | WIFI_CTRL_TYPE),
48 WIFI_ACK = (BIT(7) | BIT(6) | BIT(4) | WIFI_CTRL_TYPE),
49 WIFI_CFEND = (BIT(7) | BIT(6) | BIT(5) | WIFI_CTRL_TYPE),
50 WIFI_CFEND_CFACK = (BIT(7) | BIT(6) | BIT(5) | BIT(4) | WIFI_CTRL_TYPE),
51
52 /* below is for data frame */
53 WIFI_DATA = (0 | WIFI_DATA_TYPE),
54 WIFI_DATA_CFACK = (BIT(4) | WIFI_DATA_TYPE),
55 WIFI_DATA_CFPOLL = (BIT(5) | WIFI_DATA_TYPE),
56 WIFI_DATA_CFACKPOLL = (BIT(5) | BIT(4) | WIFI_DATA_TYPE),
57 WIFI_DATA_NULL = (BIT(6) | WIFI_DATA_TYPE),
58 WIFI_CF_ACK = (BIT(6) | BIT(4) | WIFI_DATA_TYPE),
59 WIFI_CF_POLL = (BIT(6) | BIT(5) | WIFI_DATA_TYPE),
60 WIFI_CF_ACKPOLL = (BIT(6) | BIT(5) | BIT(4) | WIFI_DATA_TYPE),
61 WIFI_QOS_DATA_NULL = (BIT(6) | WIFI_QOS_DATA_TYPE),
62 };
63
64 #define _TO_DS_ BIT(8)
65 #define _FROM_DS_ BIT(9)
66 #define _MORE_FRAG_ BIT(10)
67 #define _RETRY_ BIT(11)
68 #define _PWRMGT_ BIT(12)
69 #define _MORE_DATA_ BIT(13)
70 #define _PRIVACY_ BIT(14)
71 #define _ORDER_ BIT(15)
72
73 #define SetToDs(pbuf) \
74 (*(__le16 *)(pbuf) |= cpu_to_le16(_TO_DS_))
75
76 #define GetToDs(pbuf) (((*(__le16 *)(pbuf)) & cpu_to_le16(_TO_DS_)) != 0)
77
78 #define SetFrDs(pbuf) \
79 (*(__le16 *)(pbuf) |= cpu_to_le16(_FROM_DS_))
80
81 #define GetFrDs(pbuf) (((*(__le16 *)(pbuf)) & cpu_to_le16(_FROM_DS_)) != 0)
82
83 #define get_tofr_ds(pframe) ((GetToDs(pframe) << 1) | GetFrDs(pframe))
84
85 #define SetMFrag(pbuf) \
86 (*(__le16 *)(pbuf) |= cpu_to_le16(_MORE_FRAG_))
87
88 #define GetMFrag(pbuf) (((*(__le16 *)(pbuf)) & cpu_to_le16(_MORE_FRAG_)) != 0)
89
90 #define ClearMFrag(pbuf) \
91 (*(__le16 *)(pbuf) &= (~cpu_to_le16(_MORE_FRAG_)))
92
93 #define GetRetry(pbuf) (((*(__le16 *)(pbuf)) & cpu_to_le16(_RETRY_)) != 0)
94
95 #define ClearRetry(pbuf) \
96 (*(__le16 *)(pbuf) &= (~cpu_to_le16(_RETRY_)))
97
98 #define SetPwrMgt(pbuf) \
99 (*(__le16 *)(pbuf) |= cpu_to_le16(_PWRMGT_))
100
101 #define GetPwrMgt(pbuf) (((*(__le16 *)(pbuf)) & cpu_to_le16(_PWRMGT_)) != 0)
102
103 #define ClearPwrMgt(pbuf) \
104 (*(__le16 *)(pbuf) &= (~cpu_to_le16(_PWRMGT_)))
105
106 #define SetMData(pbuf) \
107 (*(__le16 *)(pbuf) |= cpu_to_le16(_MORE_DATA_))
108
109 #define GetMData(pbuf) (((*(__le16 *)(pbuf)) & cpu_to_le16(_MORE_DATA_)) != 0)
110
111 #define ClearMData(pbuf) \
112 (*(__le16 *)(pbuf) &= (~cpu_to_le16(_MORE_DATA_)))
113
114 #define SetPrivacy(pbuf) \
115 (*(__le16 *)(pbuf) |= cpu_to_le16(_PRIVACY_))
116
117 #define GetPrivacy(pbuf) \
118 (((*(__le16 *)(pbuf)) & cpu_to_le16(_PRIVACY_)) != 0)
119
120 #define GetOrder(pbuf) \
121 (((*(__le16 *)(pbuf)) & cpu_to_le16(_ORDER_)) != 0)
122
123 #define GetFrameType(pbuf) \
124 (le16_to_cpu(*(__le16 *)(pbuf)) & (BIT(3) | BIT(2)))
125
126 #define SetFrameType(pbuf, type) \
127 do { \
128 *(unsigned short *)(pbuf) &= cpu_to_le16(~(BIT(3) | BIT(2))); \
129 *(unsigned short *)(pbuf) |= cpu_to_le16(type); \
130 } while (0)
131
132 #define GetFrameSubType(pbuf) (le16_to_cpu(*(__le16 *)(pbuf)) & (BIT(7) |\
133 BIT(6) | BIT(5) | BIT(4) | BIT(3) | BIT(2)))
134
135 #define SetFrameSubType(pbuf, type) \
136 do { \
137 *(__le16 *)(pbuf) &= cpu_to_le16(~(BIT(7) | BIT(6) | \
138 BIT(5) | BIT(4) | BIT(3) | BIT(2))); \
139 *(__le16 *)(pbuf) |= cpu_to_le16(type); \
140 } while (0)
141
142 #define GetSequence(pbuf) \
143 (le16_to_cpu(*(__le16 *)((size_t)(pbuf) + 22)) >> 4)
144
145 #define GetFragNum(pbuf) \
146 (le16_to_cpu(*(__le16 *)((size_t)(pbuf) + 22)) & 0x0f)
147
148 #define SetFragNum(pbuf, num) \
149 do { \
150 *(unsigned short *)((size_t)(pbuf) + 22) = \
151 ((*(unsigned short *)((size_t)(pbuf) + 22)) & \
152 le16_to_cpu(~(0x000f))) | \
153 cpu_to_le16(0x0f & (num)); \
154 } while (0)
155
156 #define SetSeqNum(pbuf, num) \
157 do { \
158 *(__le16 *)((size_t)(pbuf) + 22) = \
159 ((*(__le16 *)((size_t)(pbuf) + 22)) & cpu_to_le16((unsigned short)0x000f)) | \
160 cpu_to_le16((unsigned short)(0xfff0 & (num << 4))); \
161 } while (0)
162
163 #define SetDuration(pbuf, dur) \
164 (*(__le16 *)((size_t)(pbuf) + 2) = cpu_to_le16(0xffff & (dur)))
165
166
167 #define SetPriority(pbuf, tid) \
168 (*(__le16 *)(pbuf) |= cpu_to_le16(tid & 0xf))
169
170 #define GetPriority(pbuf) ((le16_to_cpu(*(__le16 *)(pbuf))) & 0xf)
171
172 #define SetEOSP(pbuf, eosp) \
173 (*(__le16 *)(pbuf) |= cpu_to_le16((eosp & 1) << 4))
174
175 #define SetAckpolicy(pbuf, ack) \
176 (*(__le16 *)(pbuf) |= cpu_to_le16((ack & 3) << 5))
177
178 #define GetAckpolicy(pbuf) (((le16_to_cpu(*(__le16 *)pbuf)) >> 5) & 0x3)
179
180 #define GetAMsdu(pbuf) (((le16_to_cpu(*(__le16 *)pbuf)) >> 7) & 0x1)
181
182 #define GetAid(pbuf) (le16_to_cpu(*(__le16 *)((size_t)(pbuf) + 2)) & 0x3fff)
183
184 #define GetAddr1Ptr(pbuf) ((unsigned char *)((size_t)(pbuf) + 4))
185
186 #define GetAddr2Ptr(pbuf) ((unsigned char *)((size_t)(pbuf) + 10))
187
188 #define GetAddr3Ptr(pbuf) ((unsigned char *)((size_t)(pbuf) + 16))
189
190 #define GetAddr4Ptr(pbuf) ((unsigned char *)((size_t)(pbuf) + 24))
191
rtl8723bs_get_ra(unsigned char * pframe)192 static inline unsigned char *rtl8723bs_get_ra(unsigned char *pframe)
193 {
194 unsigned char *ra;
195 ra = GetAddr1Ptr(pframe);
196 return ra;
197 }
get_ta(unsigned char * pframe)198 static inline unsigned char *get_ta(unsigned char *pframe)
199 {
200 unsigned char *ta;
201 ta = GetAddr2Ptr(pframe);
202 return ta;
203 }
204
get_da(unsigned char * pframe)205 static inline unsigned char *get_da(unsigned char *pframe)
206 {
207 unsigned char *da;
208 unsigned int to_fr_ds = (GetToDs(pframe) << 1) | GetFrDs(pframe);
209
210 switch (to_fr_ds) {
211 case 0x00: /* ToDs = 0, FromDs = 0 */
212 da = GetAddr1Ptr(pframe);
213 break;
214 case 0x01: /* ToDs = 0, FromDs = 1 */
215 da = GetAddr1Ptr(pframe);
216 break;
217 case 0x02: /* ToDs = 1, FromDs = 0 */
218 da = GetAddr3Ptr(pframe);
219 break;
220 default: /* ToDs = 1, FromDs = 1 */
221 da = GetAddr3Ptr(pframe);
222 break;
223 }
224
225 return da;
226 }
227
228
get_sa(unsigned char * pframe)229 static inline unsigned char *get_sa(unsigned char *pframe)
230 {
231 unsigned char *sa;
232 unsigned int to_fr_ds = (GetToDs(pframe) << 1) | GetFrDs(pframe);
233
234 switch (to_fr_ds) {
235 case 0x00: /* ToDs = 0, FromDs = 0 */
236 sa = GetAddr2Ptr(pframe);
237 break;
238 case 0x01: /* ToDs = 0, FromDs = 1 */
239 sa = GetAddr3Ptr(pframe);
240 break;
241 case 0x02: /* ToDs = 1, FromDs = 0 */
242 sa = GetAddr2Ptr(pframe);
243 break;
244 default: /* ToDs = 1, FromDs = 1 */
245 sa = GetAddr4Ptr(pframe);
246 break;
247 }
248
249 return sa;
250 }
251
get_hdr_bssid(unsigned char * pframe)252 static inline unsigned char *get_hdr_bssid(unsigned char *pframe)
253 {
254 unsigned char *sa = NULL;
255 unsigned int to_fr_ds = (GetToDs(pframe) << 1) | GetFrDs(pframe);
256
257 switch (to_fr_ds) {
258 case 0x00: /* ToDs = 0, FromDs = 0 */
259 sa = GetAddr3Ptr(pframe);
260 break;
261 case 0x01: /* ToDs = 0, FromDs = 1 */
262 sa = GetAddr2Ptr(pframe);
263 break;
264 case 0x02: /* ToDs = 1, FromDs = 0 */
265 sa = GetAddr1Ptr(pframe);
266 break;
267 case 0x03: /* ToDs = 1, FromDs = 1 */
268 sa = GetAddr1Ptr(pframe);
269 break;
270 }
271
272 return sa;
273 }
274
275
IsFrameTypeCtrl(unsigned char * pframe)276 static inline int IsFrameTypeCtrl(unsigned char *pframe)
277 {
278 if (WIFI_CTRL_TYPE == GetFrameType(pframe))
279 return true;
280 else
281 return false;
282 }
283 /*-----------------------------------------------------------------------------
284 Below is for the security related definition
285 ------------------------------------------------------------------------------*/
286
287 #define _ASOCREQ_IE_OFFSET_ 4 /* excluding wlan_hdr */
288 #define _REASOCREQ_IE_OFFSET_ 10
289 #define _PROBEREQ_IE_OFFSET_ 0
290 #define _PROBERSP_IE_OFFSET_ 12
291 #define _AUTH_IE_OFFSET_ 6
292 #define _BEACON_IE_OFFSET_ 12
293
294 #define _FIXED_IE_LENGTH_ _BEACON_IE_OFFSET_
295
296 /* ---------------------------------------------------------------------------
297 Below is the fixed elements...
298 -----------------------------------------------------------------------------*/
299 #define _AUTH_ALGM_NUM_ 2
300 #define _AUTH_SEQ_NUM_ 2
301 #define _BEACON_ITERVAL_ 2
302 #define _CAPABILITY_ 2
303 #define _RSON_CODE_ 2
304 #define _ASOC_ID_ 2
305 #define _STATUS_CODE_ 2
306 #define _TIMESTAMP_ 8
307
308 /*-----------------------------------------------------------------------------
309 Below is the definition for 802.11i / 802.1x
310 ------------------------------------------------------------------------------*/
311 #define _IEEE8021X_MGT_ 1 /* WPA */
312 #define _IEEE8021X_PSK_ 2 /* WPA with pre-shared key */
313
314 #define _MME_IE_LENGTH_ 18
315 /*-----------------------------------------------------------------------------
316 Below is the definition for WMM
317 ------------------------------------------------------------------------------*/
318 #define _WMM_IE_Length_ 7 /* for WMM STA */
319
320 /*-----------------------------------------------------------------------------
321 Below is the definition for 802.11n
322 ------------------------------------------------------------------------------*/
323 #define GetOrderBit(pbuf) (((*(unsigned short *)(pbuf)) & cpu_to_le16(_ORDER_)) != 0)
324
325 #define ACT_CAT_VENDOR 0x7F/* 127 */
326
327 /**
328 * struct rtw_ieee80211_ht_cap - HT additional information
329 *
330 * This structure refers to "HT information element" as
331 * described in 802.11n draft section 7.3.2.53
332 */
333 struct ieee80211_ht_addt_info {
334 unsigned char control_chan;
335 unsigned char ht_param;
336 __le16 operation_mode;
337 __le16 stbc_param;
338 unsigned char basic_set[16];
339 } __attribute__ ((packed));
340
341
342 struct HT_caps_element {
343 union {
344 struct {
345 __le16 HT_caps_info;
346 unsigned char AMPDU_para;
347 unsigned char MCS_rate[16];
348 __le16 HT_ext_caps;
349 __le16 Beamforming_caps;
350 unsigned char ASEL_caps;
351 } HT_cap_element;
352 unsigned char HT_cap[26];
353 } u;
354 } __attribute__ ((packed));
355
356 struct HT_info_element {
357 unsigned char primary_channel;
358 unsigned char infos[5];
359 unsigned char MCS_rate[16];
360 } __attribute__ ((packed));
361
362 struct AC_param {
363 unsigned char ACI_AIFSN;
364 unsigned char CW;
365 __le16 TXOP_limit;
366 } __attribute__ ((packed));
367
368 struct WMM_para_element {
369 unsigned char QoS_info;
370 unsigned char reserved;
371 struct AC_param ac_param[4];
372 } __attribute__ ((packed));
373
374 struct ADDBA_request {
375 unsigned char dialog_token;
376 __le16 BA_para_set;
377 __le16 BA_timeout_value;
378 __le16 BA_starting_seqctrl;
379 } __attribute__ ((packed));
380
381 /* 802.11n HT capabilities masks */
382 #define IEEE80211_HT_CAP_LDPC_CODING 0x0001
383 #define IEEE80211_HT_CAP_SUP_WIDTH 0x0002
384 #define IEEE80211_HT_CAP_SM_PS 0x000C
385 #define IEEE80211_HT_CAP_GRN_FLD 0x0010
386 #define IEEE80211_HT_CAP_SGI_20 0x0020
387 #define IEEE80211_HT_CAP_SGI_40 0x0040
388 #define IEEE80211_HT_CAP_TX_STBC 0x0080
389 #define IEEE80211_HT_CAP_RX_STBC_1R 0x0100
390 #define IEEE80211_HT_CAP_RX_STBC_3R 0x0300
391 #define IEEE80211_HT_CAP_MAX_AMSDU 0x0800
392 #define IEEE80211_HT_CAP_DSSSCCK40 0x1000
393 /* 802.11n HT capability AMPDU settings */
394 #define IEEE80211_HT_CAP_AMPDU_FACTOR 0x03
395 #define IEEE80211_HT_CAP_AMPDU_DENSITY 0x1C
396
397 /* endif */
398
399 /* ===============WPS Section =============== */
400 /* WPS attribute ID */
401 #define WPS_ATTR_SELECTED_REGISTRAR 0x1041
402
403 /* =====================P2P Section ===================== */
404 enum p2p_role {
405 P2P_ROLE_DISABLE = 0,
406 P2P_ROLE_DEVICE = 1,
407 P2P_ROLE_CLIENT = 2,
408 P2P_ROLE_GO = 3
409 };
410
411 enum p2p_state {
412 P2P_STATE_NONE = 0, /* P2P disable */
413 P2P_STATE_IDLE = 1, /* P2P had enabled and do nothing */
414 P2P_STATE_LISTEN = 2, /* In pure listen state */
415 P2P_STATE_SCAN = 3, /* In scan phase */
416 P2P_STATE_FIND_PHASE_LISTEN = 4, /* In the listen state of find phase */
417 P2P_STATE_FIND_PHASE_SEARCH = 5, /* In the search state of find phase */
418 P2P_STATE_TX_PROVISION_DIS_REQ = 6, /* In P2P provisioning discovery */
419 P2P_STATE_RX_PROVISION_DIS_RSP = 7,
420 P2P_STATE_RX_PROVISION_DIS_REQ = 8,
421 P2P_STATE_GONEGO_ING = 9, /* Doing the group owner negotiation handshake */
422 P2P_STATE_GONEGO_OK = 10, /* finish the group negotiation handshake with success */
423 P2P_STATE_GONEGO_FAIL = 11, /* finish the group negotiation handshake with failure */
424 P2P_STATE_RECV_INVITE_REQ_MATCH = 12, /* receiving the P2P Invitation request and match with the profile. */
425 P2P_STATE_PROVISIONING_ING = 13, /* Doing the P2P WPS */
426 P2P_STATE_PROVISIONING_DONE = 14, /* Finish the P2P WPS */
427 P2P_STATE_TX_INVITE_REQ = 15, /* Transmit the P2P Invitation request */
428 P2P_STATE_RX_INVITE_RESP_OK = 16, /* Receiving the P2P Invitation response */
429 P2P_STATE_RECV_INVITE_REQ_DISMATCH = 17, /* receiving the P2P Invitation request and mismatch with the profile. */
430 P2P_STATE_RECV_INVITE_REQ_GO = 18, /* receiving the P2P Invitation request and this wifi is GO. */
431 P2P_STATE_RECV_INVITE_REQ_JOIN = 19, /* receiving the P2P Invitation request to join an existing P2P Group. */
432 P2P_STATE_RX_INVITE_RESP_FAIL = 20, /* recveing the P2P Invitation response with failure */
433 P2P_STATE_RX_INFOR_NOREADY = 21, /* receiving p2p negotiation response with information is not available */
434 P2P_STATE_TX_INFOR_NOREADY = 22, /* sending p2p negotiation response with information is not available */
435 };
436
437 enum p2p_wpsinfo {
438 P2P_NO_WPSINFO = 0,
439 P2P_GOT_WPSINFO_PEER_DISPLAY_PIN = 1,
440 P2P_GOT_WPSINFO_SELF_DISPLAY_PIN = 2,
441 P2P_GOT_WPSINFO_PBC = 3,
442 };
443
444 #define IP_MCAST_MAC(mac) ((mac[0] == 0x01) && (mac[1] == 0x00) && (mac[2] == 0x5e))
445 #define ICMPV6_MCAST_MAC(mac) ((mac[0] == 0x33) && (mac[1] == 0x33) && (mac[2] != 0xff))
446
447 /* Regulatroy Domain */
448 struct regd_pair_mapping {
449 u16 reg_dmnenum;
450 u16 reg_2ghz_ctl;
451 };
452
453 struct rtw_regulatory {
454 char alpha2[2];
455 u16 country_code;
456 u16 max_power_level;
457 u32 tp_scale;
458 u16 current_rd;
459 u16 current_rd_ext;
460 int16_t power_limit;
461 struct regd_pair_mapping *regpair;
462 };
463
464 #endif /* _WIFI_H_ */
465