1 /******************************************************************************
2  * Copyright(c) 2008 - 2010 Realtek Corporation. All rights reserved.
3  *
4  * This program is distributed in the hope that it will be useful, but WITHOUT
5  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
6  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
7  * more details.
8  *
9  * You should have received a copy of the GNU General Public License along with
10  * this program; if not, write to the Free Software Foundation, Inc.,
11  * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
12  *
13  * The full GNU General Public License is included in this distribution in the
14  * file called LICENSE.
15  *
16  * Contact Information:
17  * wlanfae <wlanfae@realtek.com>
18 ******************************************************************************/
19 #ifndef __INC_QOS_TYPE_H
20 #define __INC_QOS_TYPE_H
21 
22 #include "rtllib_endianfree.h"
23 
24 #define BIT0		    0x00000001
25 #define BIT1		    0x00000002
26 #define BIT2		    0x00000004
27 #define BIT3		    0x00000008
28 #define BIT4		    0x00000010
29 #define BIT5		    0x00000020
30 #define BIT6		    0x00000040
31 #define BIT7		    0x00000080
32 #define BIT8		    0x00000100
33 #define BIT9		    0x00000200
34 #define BIT10		   0x00000400
35 #define BIT11		   0x00000800
36 #define BIT12		   0x00001000
37 #define BIT13		   0x00002000
38 #define BIT14		   0x00004000
39 #define BIT15		   0x00008000
40 #define BIT16		   0x00010000
41 #define BIT17		   0x00020000
42 #define BIT18		   0x00040000
43 #define BIT19		   0x00080000
44 #define BIT20		   0x00100000
45 #define BIT21		   0x00200000
46 #define BIT22		   0x00400000
47 #define BIT23		   0x00800000
48 #define BIT24		   0x01000000
49 #define BIT25		   0x02000000
50 #define BIT26		   0x04000000
51 #define BIT27		   0x08000000
52 #define BIT28		   0x10000000
53 #define BIT29		   0x20000000
54 #define BIT30		   0x40000000
55 #define BIT31		   0x80000000
56 
57 union qos_tsinfo {
58 	u8		charData[3];
59 	struct {
60 		u8		ucTrafficType:1;
61 		u8		ucTSID:4;
62 		u8		ucDirection:2;
63 		u8		ucAccessPolicy:2;
64 		u8		ucAggregation:1;
65 		u8		ucPSB:1;
66 		u8		ucUP:3;
67 		u8		ucTSInfoAckPolicy:2;
68 		u8		ucSchedule:1;
69 		u8		ucReserved:7;
70 	} field;
71 };
72 
73 union tspec_body {
74 	u8		charData[55];
75 
76 	struct {
77 		union qos_tsinfo TSInfo;
78 		u16	NominalMSDUsize;
79 		u16	MaxMSDUsize;
80 		u32	MinServiceItv;
81 		u32	MaxServiceItv;
82 		u32	InactivityItv;
83 		u32	SuspenItv;
84 		u32	ServiceStartTime;
85 		u32	MinDataRate;
86 		u32	MeanDataRate;
87 		u32	PeakDataRate;
88 		u32	MaxBurstSize;
89 		u32	DelayBound;
90 		u32	MinPhyRate;
91 		u16	SurplusBandwidthAllowance;
92 		u16	MediumTime;
93 	} f;
94 };
95 
96 struct wmm_tspec {
97 	u8		ID;
98 	u8		Length;
99 	u8		OUI[3];
100 	u8		OUI_Type;
101 	u8		OUI_SubType;
102 	u8		Version;
103 	union tspec_body Body;
104 };
105 
106 struct octet_string {
107 	u8 *Octet;
108 	u16 Length;
109 };
110 
111 #define	MAX_WMMELE_LENGTH	64
112 
113 #define QOS_MODE u32
114 
115 #define QOS_DISABLE		0
116 #define QOS_WMM		1
117 #define QOS_WMMSA		2
118 #define QOS_EDCA		4
119 #define QOS_HCCA		8
120 #define QOS_WMM_UAPSD		16
121 
122 #define WMM_PARAM_ELE_BODY_LEN	18
123 
124 #define MAX_STA_TS_COUNT			16
125 #define MAX_AP_TS_COUNT			32
126 #define QOS_TSTREAM_KEY_SIZE		13
127 
128 #define WMM_ACTION_CATEGORY_CODE	17
129 #define WMM_PARAM_ELE_BODY_LEN	18
130 
131 #define MAX_TSPEC_TSID				15
132 #define SESSION_REJECT_TSID			0xfe
133 #define DEFAULT_TSID					0xff
134 
135 #define ADDTS_TIME_SLOT				100
136 
137 #define ACM_TIMEOUT				1000
138 #define SESSION_REJECT_TIMEOUT		60000
139 
140 enum ack_policy {
141 	eAckPlc0_ACK		= 0x00,
142 	eAckPlc1_NoACK		= 0x01,
143 };
144 
145 
146 #define SET_WMM_QOS_INFO_FIELD(_pStart, _val)	\
147 	WriteEF1Byte(_pStart, _val)
148 
149 #define GET_WMM_QOS_INFO_FIELD_PARAMETERSET_COUNT(_pStart) \
150 	LE_BITS_TO_1BYTE(_pStart, 0, 4)
151 #define SET_WMM_QOS_INFO_FIELD_PARAMETERSET_COUNT(_pStart, _val) \
152 	SET_BITS_TO_LE_1BYTE(_pStart, 0, 4, _val)
153 
154 #define GET_WMM_QOS_INFO_FIELD_AP_UAPSD(_pStart) \
155 	LE_BITS_TO_1BYTE(_pStart, 7, 1)
156 #define SET_WMM_QOS_INFO_FIELD_AP_UAPSD(_pStart, _val) \
157 	SET_BITS_TO_LE_1BYTE(_pStart, 7, 1, _val)
158 
159 #define GET_WMM_QOS_INFO_FIELD_STA_AC_VO_UAPSD(_pStart) \
160 	LE_BITS_TO_1BYTE(_pStart, 0, 1)
161 #define SET_WMM_QOS_INFO_FIELD_STA_AC_VO_UAPSD(_pStart, _val) \
162 	SET_BITS_TO_LE_1BYTE(_pStart, 0, 1, _val)
163 
164 #define GET_WMM_QOS_INFO_FIELD_STA_AC_VI_UAPSD(_pStart) \
165 	LE_BITS_TO_1BYTE(_pStart, 1, 1)
166 #define SET_WMM_QOS_INFO_FIELD_STA_AC_VI_UAPSD(_pStart, _val) \
167 	SET_BITS_TO_LE_1BYTE(_pStart, 1, 1, _val)
168 
169 #define GET_WMM_QOS_INFO_FIELD_STA_AC_BE_UAPSD(_pStart) \
170 	LE_BITS_TO_1BYTE(_pStart, 2, 1)
171 #define SET_WMM_QOS_INFO_FIELD_STA_AC_BE_UAPSD(_pStart, _val) \
172 	SET_BITS_TO_LE_1BYTE(_pStart, 2, 1, _val)
173 
174 #define GET_WMM_QOS_INFO_FIELD_STA_AC_BK_UAPSD(_pStart) \
175 	LE_BITS_TO_1BYTE(_pStart, 3, 1)
176 #define SET_WMM_QOS_INFO_FIELD_STA_AC_BK_UAPSD(_pStart, _val) \
177 	SET_BITS_TO_LE_1BYTE(_pStart, 3, 1, _val)
178 
179 #define GET_WMM_QOS_INFO_FIELD_STA_MAX_SP_LEN(_pStart) \
180 	LE_BITS_TO_1BYTE(_pStart, 5, 2)
181 #define SET_WMM_QOS_INFO_FIELD_STA_MAX_SP_LEN(_pStart, _val) \
182 	SET_BITS_TO_LE_1BYTE(_pStart, 5, 2, _val)
183 
184 enum qos_ie_source {
185 	QOSIE_SRC_ADDTSREQ,
186 	QOSIE_SRC_ADDTSRSP,
187 	QOSIE_SRC_REASOCREQ,
188 	QOSIE_SRC_REASOCRSP,
189 	QOSIE_SRC_DELTS,
190 };
191 
192 
193 #define AC_CODING u32
194 
195 #define AC0_BE	0
196 #define AC1_BK	1
197 #define AC2_VI	2
198 #define AC3_VO	3
199 #define AC_MAX	4
200 
201 
202 #define AC_PARAM_SIZE	4
203 
204 #define GET_WMM_AC_PARAM_AIFSN(_pStart) \
205 	((u8)LE_BITS_TO_4BYTE(_pStart, 0, 4))
206 #define SET_WMM_AC_PARAM_AIFSN(_pStart, _val) \
207 	SET_BITS_TO_LE_4BYTE(_pStart, 0, 4, _val)
208 
209 #define GET_WMM_AC_PARAM_ACM(_pStart) \
210 	((u8)LE_BITS_TO_4BYTE(_pStart, 4, 1))
211 #define SET_WMM_AC_PARAM_ACM(_pStart, _val) \
212 	SET_BITS_TO_LE_4BYTE(_pStart, 4, 1, _val)
213 
214 #define GET_WMM_AC_PARAM_ACI(_pStart) \
215 	((u8)LE_BITS_TO_4BYTE(_pStart, 5, 2))
216 #define SET_WMM_AC_PARAM_ACI(_pStart, _val) \
217 	SET_BITS_TO_LE_4BYTE(_pStart, 5, 2, _val)
218 
219 #define GET_WMM_AC_PARAM_ACI_AIFSN(_pStart) \
220 	((u8)LE_BITS_TO_4BYTE(_pStart, 0, 8))
221 #define SET_WMM_AC_PARAM_ACI_AIFSN(_pStart, _val) \
222 	SET_BITS_TO_LE_4BYTE(_pStart, 0, 8, _val)
223 
224 #define GET_WMM_AC_PARAM_ECWMIN(_pStart) \
225 	((u8)LE_BITS_TO_4BYTE(_pStart, 8, 4))
226 #define SET_WMM_AC_PARAM_ECWMIN(_pStart, _val) \
227 	SET_BITS_TO_LE_4BYTE(_pStart, 8, 4, _val)
228 
229 #define GET_WMM_AC_PARAM_ECWMAX(_pStart) \
230 	((u8)LE_BITS_TO_4BYTE(_pStart, 12, 4))
231 #define SET_WMM_AC_PARAM_ECWMAX(_pStart, _val) \
232 	SET_BITS_TO_LE_4BYTE(_pStart, 12, 4, _val)
233 
234 #define GET_WMM_AC_PARAM_TXOP_LIMIT(_pStart) \
235 	((u8)LE_BITS_TO_4BYTE(_pStart, 16, 16))
236 #define SET_WMM_AC_PARAM_TXOP_LIMIT(_pStart, _val) \
237 	SET_BITS_TO_LE_4BYTE(_pStart, 16, 16, _val)
238 
239 
240 
241 #define WMM_PARAM_ELEMENT_SIZE	(8+(4*AC_PARAM_SIZE))
242 
243 enum qos_ele_subtype {
244 	QOSELE_TYPE_INFO		= 0x00,
245 	QOSELE_TYPE_PARAM	= 0x01,
246 };
247 
248 
249 enum direction_value {
250 	DIR_UP			= 0,
251 	DIR_DOWN		= 1,
252 	DIR_DIRECT		= 2,
253 	DIR_BI_DIR		= 3,
254 };
255 
256 enum acm_method {
257 	eAcmWay0_SwAndHw		= 0,
258 	eAcmWay1_HW			= 1,
259 	eAcmWay2_SW			= 2,
260 };
261 
262 
263 struct acm {
264 	u64		UsedTime;
265 	u64		MediumTime;
266 	u8		HwAcmCtl;
267 };
268 
269 
270 
271 #define AC_UAPSD	u8
272 
273 #define	GET_VO_UAPSD(_apsd) ((_apsd) & BIT0)
274 #define	SET_VO_UAPSD(_apsd) ((_apsd) |= BIT0)
275 
276 #define	GET_VI_UAPSD(_apsd) ((_apsd) & BIT1)
277 #define	SET_VI_UAPSD(_apsd) ((_apsd) |= BIT1)
278 
279 #define	GET_BK_UAPSD(_apsd) ((_apsd) & BIT2)
280 #define	SET_BK_UAPSD(_apsd) ((_apsd) |= BIT2)
281 
282 #define	GET_BE_UAPSD(_apsd) ((_apsd) & BIT3)
283 #define	SET_BE_UAPSD(_apsd) ((_apsd) |= BIT3)
284 
285 union qos_tclas {
286 
287 	struct _TYPE_GENERAL {
288 		u8		Priority;
289 		u8		ClassifierType;
290 		u8		Mask;
291 	} TYPE_GENERAL;
292 
293 	struct _TYPE0_ETH {
294 		u8		Priority;
295 		u8		ClassifierType;
296 		u8		Mask;
297 		u8		SrcAddr[6];
298 		u8		DstAddr[6];
299 		u16		Type;
300 	} TYPE0_ETH;
301 
302 	struct _TYPE1_IPV4 {
303 		u8		Priority;
304 		u8		ClassifierType;
305 		u8		Mask;
306 		u8		Version;
307 		u8		SrcIP[4];
308 		u8		DstIP[4];
309 		u16		SrcPort;
310 		u16		DstPort;
311 		u8		DSCP;
312 		u8		Protocol;
313 		u8		Reserved;
314 	} TYPE1_IPV4;
315 
316 	struct _TYPE1_IPV6 {
317 		u8		Priority;
318 		u8		ClassifierType;
319 		u8		Mask;
320 		u8		Version;
321 		u8		SrcIP[16];
322 		u8		DstIP[16];
323 		u16		SrcPort;
324 		u16		DstPort;
325 		u8		FlowLabel[3];
326 	} TYPE1_IPV6;
327 
328 	struct _TYPE2_8021Q {
329 		u8		Priority;
330 		u8		ClassifierType;
331 		u8		Mask;
332 		u16		TagType;
333 	} TYPE2_8021Q;
334 };
335 
336 struct qos_tstream {
337 
338 	bool			bUsed;
339 	u16			MsduLifetime;
340 	bool			bEstablishing;
341 	u8			TimeSlotCount;
342 	u8			DialogToken;
343 	struct wmm_tspec TSpec;
344 	struct wmm_tspec OutStandingTSpec;
345 	u8			NominalPhyRate;
346 };
347 
348 struct sta_qos {
349 	u8 WMMIEBuf[MAX_WMMELE_LENGTH];
350 	u8 *WMMIE;
351 
352 	QOS_MODE QosCapability;
353 	QOS_MODE CurrentQosMode;
354 
355 	AC_UAPSD b4ac_Uapsd;
356 	AC_UAPSD Curr4acUapsd;
357 	u8 bInServicePeriod;
358 	u8 MaxSPLength;
359 	int NumBcnBeforeTrigger;
360 
361 	u8 *pWMMInfoEle;
362 	u8 WMMParamEle[WMM_PARAM_ELEMENT_SIZE];
363 
364 	struct acm acm[4];
365 	enum acm_method AcmMethod;
366 
367 	struct qos_tstream StaTsArray[MAX_STA_TS_COUNT];
368 	u8				DialogToken;
369 	struct wmm_tspec TSpec;
370 
371 	u8				QBssWirelessMode;
372 
373 	bool				bNoAck;
374 
375 	bool				bEnableRxImmBA;
376 
377 };
378 
379 #define QBSS_LOAD_SIZE				5
380 #define GET_QBSS_LOAD_STA_COUNT(__pStart)	\
381 		ReadEF2Byte(__pStart)
382 #define SET_QBSS_LOAD_STA_COUNT(__pStart, __Value)	\
383 		WriteEF2Byte(__pStart, __Value)
384 #define GET_QBSS_LOAD_CHNL_UTILIZATION(__pStart)	\
385 		ReadEF1Byte((u8 *)(__pStart) + 2)
386 #define SET_QBSS_LOAD_CHNL_UTILIZATION(__pStart, __Value)	\
387 		WriteEF1Byte((u8 *)(__pStart) + 2, __Value)
388 #define GET_QBSS_LOAD_AVAILABLE_CAPACITY(__pStart)	\
389 		ReadEF2Byte((u8 *)(__pStart) + 3)
390 #define SET_QBSS_LOAD_AVAILABLE_CAPACITY(__pStart, __Value) \
391 		WriteEF2Byte((u8 *)(__pStart) + 3, __Value)
392 
393 struct bss_qos {
394 	QOS_MODE bdQoSMode;
395 	u8 bdWMMIEBuf[MAX_WMMELE_LENGTH];
396 	struct octet_string bdWMMIE;
397 
398 	enum qos_ele_subtype EleSubType;
399 
400 	u8 *pWMMInfoEle;
401 	u8 *pWMMParamEle;
402 
403 	u8 QBssLoad[QBSS_LOAD_SIZE];
404 	bool bQBssLoadValid;
405 };
406 
407 #define sQoSCtlLng	2
408 #define QOS_CTRL_LEN(_QosMode)	((_QosMode > QOS_DISABLE) ? sQoSCtlLng : 0)
409 
410 
411 #define IsACValid(ac)		((ac >= 0 && ac <= 7) ? true : false)
412 
413 
414 union aci_aifsn {
415 	u8	charData;
416 
417 	struct {
418 		u8	AIFSN:4;
419 		u8	acm:1;
420 		u8	ACI:2;
421 		u8	Reserved:1;
422 	} f;
423 };
424 
425 union ecw {
426 	u8	charData;
427 	struct {
428 		u8	ECWmin:4;
429 		u8	ECWmax:4;
430 	} f;
431 };
432 
433 union ac_param {
434 	u32	longData;
435 	u8	charData[4];
436 
437 	struct {
438 		union aci_aifsn AciAifsn;
439 		union ecw Ecw;
440 		u16		TXOPLimit;
441 	} f;
442 };
443 
444 #endif
445