1 /* SPDX-License-Identifier: GPL-2.0 */
2 /******************************************************************************
3  *
4  * Copyright(c) 2007 - 2010 Realtek Corporation. All rights reserved.
5  *
6  * Modifications for inclusion into the Linux staging tree are
7  * Copyright(c) 2010 Larry Finger. All rights reserved.
8  *
9  * Contact information:
10  * WLAN FAE <wlanfae@realtek.com>
11  * Larry Finger <Larry.Finger@lwfinger.net>
12  *
13  ******************************************************************************/
14 #ifndef _WIFI_H_
15 #define _WIFI_H_
16 
17 #include <linux/compiler.h>
18 #include <linux/ieee80211.h>
19 
20 #define WLAN_HDR_A3_LEN		24
21 #define WLAN_HDR_A3_QOS_LEN	26
22 
23 enum WIFI_FRAME_TYPE {
24 	WIFI_QOS_DATA_TYPE	= (BIT(7) | BIT(3)),	/*!< QoS Data */
25 };
26 
27 #define SetToDs(pbuf) ({ \
28 	*(__le16 *)(pbuf) |= cpu_to_le16(IEEE80211_FCTL_TODS); \
29 })
30 
31 #define GetToDs(pbuf)	(((*(__le16 *)(pbuf)) & cpu_to_le16(IEEE80211_FCTL_TODS)) != 0)
32 
33 #define ClearToDs(pbuf)	({ \
34 	*(__le16 *)(pbuf) &= (~cpu_to_le16(IEEE80211_FCTL_TODS)); \
35 })
36 
37 #define SetFrDs(pbuf) ({ \
38 	*(__le16 *)(pbuf) |= cpu_to_le16(IEEE80211_FCTL_FROMDS); \
39 })
40 
41 #define GetFrDs(pbuf)	(((*(__le16 *)(pbuf)) & cpu_to_le16(IEEE80211_FCTL_FROMDS)) != 0)
42 
43 #define ClearFrDs(pbuf)	({ \
44 	*(__le16 *)(pbuf) &= (~cpu_to_le16(IEEE80211_FCTL_FROMDS)); \
45 })
46 
get_tofr_ds(unsigned char * pframe)47 static inline unsigned char get_tofr_ds(unsigned char *pframe)
48 {
49 	return ((GetToDs(pframe) << 1) | GetFrDs(pframe));
50 }
51 
52 #define SetMFrag(pbuf) ({ \
53 	*(__le16 *)(pbuf) |= cpu_to_le16(IEEE80211_FCTL_MOREFRAGS); \
54 })
55 
56 #define GetMFrag(pbuf)	(((*(__le16 *)(pbuf)) & cpu_to_le16(IEEE80211_FCTL_MOREFRAGS)) != 0)
57 
58 #define ClearMFrag(pbuf) ({ \
59 	*(__le16 *)(pbuf) &= (~cpu_to_le16(IEEE80211_FCTL_MOREFRAGS)); \
60 })
61 
62 #define SetRetry(pbuf) ({ \
63 	*(__le16 *)(pbuf) |= cpu_to_le16(IEEE80211_FCTL_RETRY); \
64 })
65 
66 #define GetRetry(pbuf)	(((*(__le16 *)(pbuf)) & cpu_to_le16(IEEE80211_FCTL_RETRY)) != 0)
67 
68 #define ClearRetry(pbuf) ({ \
69 	*(__le16 *)(pbuf) &= (~cpu_to_le16(IEEE80211_FCTL_RETRY)); \
70 })
71 
72 #define SetPwrMgt(pbuf) ({ \
73 	*(__le16 *)(pbuf) |= cpu_to_le16(IEEE80211_FCTL_PM); \
74 })
75 
76 #define GetPwrMgt(pbuf)	(((*(__le16 *)(pbuf)) & \
77 			cpu_to_le16(IEEE80211_FCTL_PM)) != 0)
78 
79 #define ClearPwrMgt(pbuf) ({ \
80 	*(__le16 *)(pbuf) &= (~cpu_to_le16(IEEE80211_FCTL_PM)); \
81 })
82 
83 #define SetMData(pbuf) ({ \
84 	*(__le16 *)(pbuf) |= cpu_to_le16(IEEE80211_FCTL_MOREDATA); \
85 })
86 
87 #define GetMData(pbuf)	(((*(__le16 *)(pbuf)) & \
88 			cpu_to_le16(IEEE80211_FCTL_MOREDATA)) != 0)
89 
90 #define ClearMData(pbuf) ({ \
91 	*(__le16 *)(pbuf) &= (~cpu_to_le16(IEEE80211_FCTL_MOREDATA)); \
92 })
93 
94 #define SetPrivacy(pbuf) ({ \
95 	*(__le16 *)(pbuf) |= cpu_to_le16(IEEE80211_FCTL_PROTECTED); \
96 })
97 
98 #define GetPrivacy(pbuf)	(((*(__le16 *)(pbuf)) & \
99 				cpu_to_le16(IEEE80211_FCTL_PROTECTED)) != 0)
100 
101 #define GetOrder(pbuf)	(((*(__le16 *)(pbuf)) & \
102 			cpu_to_le16(IEEE80211_FCTL_ORDER)) != 0)
103 
104 #define GetFrameType(pbuf)	(le16_to_cpu(*(__le16 *)(pbuf)) & \
105 				(BIT(3) | BIT(2)))
106 
107 #define SetFrameType(pbuf, type)	\
108 	do {	\
109 		*(__le16 *)(pbuf) &= cpu_to_le16(~(BIT(3) | \
110 		BIT(2))); \
111 		*(__le16 *)(pbuf) |= cpu_to_le16(type); \
112 	} while (0)
113 
114 #define GetFrameSubType(pbuf)	(le16_to_cpu(*(__le16 *)(pbuf)) & \
115 				(BIT(7) | BIT(6) | BIT(5) | BIT(4) | BIT(3) | \
116 				BIT(2)))
117 
118 #define SetFrameSubType(pbuf, type) \
119 	do {    \
120 		*(__le16 *)(pbuf) &= cpu_to_le16(~(BIT(7) | BIT(6) | \
121 		BIT(5) | BIT(4) | BIT(3) | BIT(2))); \
122 		*(__le16 *)(pbuf) |= cpu_to_le16(type); \
123 	} while (0)
124 
125 #define GetSequence(pbuf)	(le16_to_cpu(*(__le16 *)\
126 				((addr_t)(pbuf) + 22)) >> 4)
127 
128 #define GetFragNum(pbuf)	(le16_to_cpu(*(__le16 *)((addr_t)\
129 				(pbuf) + 22)) & 0x0f)
130 
131 #define SetSeqNum(pbuf, num) ({ \
132 	*(__le16 *)((addr_t)(pbuf) + 22) = \
133 	cpu_to_le16((le16_to_cpu(*(__le16 *)((addr_t)(pbuf) + 22)) & \
134 	0x000f) | (0xfff0 & (num << 4))); \
135 })
136 
137 #define SetPriority(pbuf, tid) ({ \
138 	*(__le16 *)(pbuf) |= cpu_to_le16(tid & 0xf); \
139 })
140 
141 #define GetPriority(pbuf)	((le16_to_cpu(*(__le16 *)(pbuf))) & 0xf)
142 
143 #define SetAckpolicy(pbuf, ack) ({ \
144 	*(__le16 *)(pbuf) |= cpu_to_le16((ack & 3) << 5); \
145 })
146 
147 #define GetAckpolicy(pbuf) (((le16_to_cpu(*(__le16 *)pbuf)) >> 5) & 0x3)
148 
149 #define GetAMsdu(pbuf) (((le16_to_cpu(*(__le16 *)pbuf)) >> 7) & 0x1)
150 
151 #define GetAddr1Ptr(pbuf)	((unsigned char *)((addr_t)(pbuf) + 4))
152 
153 #define GetAddr2Ptr(pbuf)	((unsigned char *)((addr_t)(pbuf) + 10))
154 
155 #define GetAddr3Ptr(pbuf)	((unsigned char *)((addr_t)(pbuf) + 16))
156 
157 #define GetAddr4Ptr(pbuf)	((unsigned char *)((addr_t)(pbuf) + 24))
158 
get_hdr_bssid(unsigned char * pframe)159 static inline unsigned char *get_hdr_bssid(unsigned char *pframe)
160 {
161 	unsigned char	*sa;
162 	unsigned int	to_fr_ds = (GetToDs(pframe) << 1) | GetFrDs(pframe);
163 
164 	switch (to_fr_ds) {
165 	case 0x00:	/* ToDs=0, FromDs=0 */
166 		sa = GetAddr3Ptr(pframe);
167 		break;
168 	case 0x01:	/* ToDs=0, FromDs=1 */
169 		sa = GetAddr2Ptr(pframe);
170 		break;
171 	case 0x02:	/* ToDs=1, FromDs=0 */
172 		sa = GetAddr1Ptr(pframe);
173 		break;
174 	default:	/* ToDs=1, FromDs=1 */
175 		sa = NULL;
176 		break;
177 	}
178 	return sa;
179 }
180 
181 /* ---------------------------------------------------------------------------
182  *			Below is the fixed elements...
183  * ---------------------------------------------------------------------------
184  */
185 #define _BEACON_ITERVAL_		2
186 #define _CAPABILITY_			2
187 #define _TIMESTAMP_				8
188 
189 
190 /*-----------------------------------------------------------------------------
191  *			Below is the definition for WMM
192  *------------------------------------------------------------------------------
193  */
194 #define _WMM_IE_Length_				7  /* for WMM STA */
195 
196 #endif /* _WIFI_H_ */
197 
198