File Index
Files and directories
Sign in
FILE

wifi.h

File preview with syntax highlighting.

linux-6.19.14/drivers/staging/rtl8723bs/include/wifi.h C
  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
 19enum {
 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
 26enum {
 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
192static inline unsigned char *rtl8723bs_get_ra(unsigned char *pframe)
193{
194	unsigned char *ra;
195	ra = GetAddr1Ptr(pframe);
196	return ra;
197}
198static inline unsigned char *get_ta(unsigned char *pframe)
199{
200	unsigned char *ta;
201	ta = GetAddr2Ptr(pframe);
202	return ta;
203}
204
205static 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
229static 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
252static 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
276static 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 */
333struct 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
342struct 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
356struct HT_info_element {
357	unsigned char primary_channel;
358	unsigned char infos[5];
359	unsigned char MCS_rate[16];
360}  __attribute__ ((packed));
361
362struct AC_param {
363	unsigned char 	ACI_AIFSN;
364	unsigned char 	CW;
365	__le16	TXOP_limit;
366}  __attribute__ ((packed));
367
368struct WMM_para_element {
369	unsigned char 	QoS_info;
370	unsigned char 	reserved;
371	struct AC_param	ac_param[4];
372}  __attribute__ ((packed));
373
374struct 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 ===================== */
404enum p2p_role {
405	P2P_ROLE_DISABLE = 0,
406	P2P_ROLE_DEVICE = 1,
407	P2P_ROLE_CLIENT = 2,
408	P2P_ROLE_GO = 3
409};
410
411enum 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
437enum 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 */
448struct regd_pair_mapping {
449	u16 reg_dmnenum;
450	u16 reg_2ghz_ctl;
451};
452
453struct 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_ */
~/ Read-only file preview.