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 	{
78 		union qos_tsinfo TSInfo;
79 		u16	NominalMSDUsize;
80 		u16	MaxMSDUsize;
81 		u32	MinServiceItv;
82 		u32	MaxServiceItv;
83 		u32	InactivityItv;
84 		u32	SuspenItv;
85 		u32	ServiceStartTime;
86 		u32	MinDataRate;
87 		u32	MeanDataRate;
88 		u32	PeakDataRate;
89 		u32	MaxBurstSize;
90 		u32	DelayBound;
91 		u32	MinPhyRate;
92 		u16	SurplusBandwidthAllowance;
93 		u16	MediumTime;
94 	} f;
95 };
96 
97 struct wmm_tspec {
98 	u8		ID;
99 	u8		Length;
100 	u8		OUI[3];
101 	u8		OUI_Type;
102 	u8		OUI_SubType;
103 	u8		Version;
104 	union tspec_body Body;
105 };
106 
107 struct octet_string {
108         u8		*Octet;
109         u16             Length;
110 };//, *struct octet_string *;
111 #define	MAX_WMMELE_LENGTH	64
112 
113 typedef u32 QOS_MODE, *PQOS_MODE;
114 #define QOS_DISABLE		0
115 #define QOS_WMM		1
116 #define QOS_WMMSA		2
117 #define QOS_EDCA		4
118 #define QOS_HCCA		8
119 #define QOS_WMM_UAPSD		16
120 
121 #define WMM_PARAM_ELE_BODY_LEN	18
122 
123 #define MAX_STA_TS_COUNT			16
124 #define MAX_AP_TS_COUNT			32
125 #define QOS_TSTREAM_KEY_SIZE		13
126 
127 #define WMM_ACTION_CATEGORY_CODE	17
128 #define WMM_PARAM_ELE_BODY_LEN	18
129 
130 #define MAX_TSPEC_TSID				15
131 #define SESSION_REJECT_TSID			0xfe
132 #define DEFAULT_TSID					0xff
133 
134 #define ADDTS_TIME_SLOT				100
135 
136 #define ACM_TIMEOUT				1000
137 #define SESSION_REJECT_TIMEOUT		60000
138 
139 typedef	enum _ACK_POLICY{
140 	eAckPlc0_ACK		= 0x00,
141 	eAckPlc1_NoACK		= 0x01,
142 }ACK_POLICY,*PACK_POLICY;
143 
144 
145 #define SET_WMM_QOS_INFO_FIELD(_pStart, _val)						WriteEF1Byte(_pStart, _val)
146 
147 #define GET_WMM_QOS_INFO_FIELD_PARAMETERSET_COUNT(_pStart)		LE_BITS_TO_1BYTE(_pStart, 0, 4)
148 #define SET_WMM_QOS_INFO_FIELD_PARAMETERSET_COUNT(_pStart, _val)	SET_BITS_TO_LE_1BYTE(_pStart, 0, 4, _val)
149 
150 #define GET_WMM_QOS_INFO_FIELD_AP_UAPSD(_pStart)					LE_BITS_TO_1BYTE(_pStart, 7, 1)
151 #define SET_WMM_QOS_INFO_FIELD_AP_UAPSD(_pStart, _val)				SET_BITS_TO_LE_1BYTE(_pStart, 7, 1, _val)
152 
153 #define GET_WMM_QOS_INFO_FIELD_STA_AC_VO_UAPSD(_pStart)			LE_BITS_TO_1BYTE(_pStart, 0, 1)
154 #define SET_WMM_QOS_INFO_FIELD_STA_AC_VO_UAPSD(_pStart, _val)		SET_BITS_TO_LE_1BYTE(_pStart, 0, 1, _val)
155 
156 #define GET_WMM_QOS_INFO_FIELD_STA_AC_VI_UAPSD(_pStart)			LE_BITS_TO_1BYTE(_pStart, 1, 1)
157 #define SET_WMM_QOS_INFO_FIELD_STA_AC_VI_UAPSD(_pStart, _val)		SET_BITS_TO_LE_1BYTE(_pStart, 1, 1, _val)
158 
159 #define GET_WMM_QOS_INFO_FIELD_STA_AC_BE_UAPSD(_pStart)			LE_BITS_TO_1BYTE(_pStart, 2, 1)
160 #define SET_WMM_QOS_INFO_FIELD_STA_AC_BE_UAPSD(_pStart, _val)		SET_BITS_TO_LE_1BYTE(_pStart, 2, 1, _val)
161 
162 #define GET_WMM_QOS_INFO_FIELD_STA_AC_BK_UAPSD(_pStart)			LE_BITS_TO_1BYTE(_pStart, 3, 1)
163 #define SET_WMM_QOS_INFO_FIELD_STA_AC_BK_UAPSD(_pStart, _val)		SET_BITS_TO_LE_1BYTE(_pStart, 3, 1, _val)
164 
165 #define GET_WMM_QOS_INFO_FIELD_STA_MAX_SP_LEN(_pStart)			LE_BITS_TO_1BYTE(_pStart, 5, 2)
166 #define SET_WMM_QOS_INFO_FIELD_STA_MAX_SP_LEN(_pStart, _val)		SET_BITS_TO_LE_1BYTE(_pStart, 5, 2, _val)
167 
168 typedef enum {
169 	QOSIE_SRC_ADDTSREQ,
170 	QOSIE_SRC_ADDTSRSP,
171 	QOSIE_SRC_REASOCREQ,
172 	QOSIE_SRC_REASOCRSP,
173 	QOSIE_SRC_DELTS,
174 } QOSIE_SOURCE;
175 
176 
177 typedef u32 AC_CODING;
178 #define AC0_BE	0
179 #define AC1_BK	1
180 #define AC2_VI	2
181 #define AC3_VO	3
182 #define AC_MAX	4
183 
184 
185 #define AC_PARAM_SIZE	4
186 
187 #define GET_WMM_AC_PARAM_AIFSN(_pStart)				( (u8)LE_BITS_TO_4BYTE(_pStart, 0, 4) )
188 #define SET_WMM_AC_PARAM_AIFSN(_pStart, _val)		SET_BITS_TO_LE_4BYTE(_pStart, 0, 4, _val)
189 
190 #define GET_WMM_AC_PARAM_ACM(_pStart)				( (u8)LE_BITS_TO_4BYTE(_pStart, 4, 1) )
191 #define SET_WMM_AC_PARAM_ACM(_pStart, _val)			SET_BITS_TO_LE_4BYTE(_pStart, 4, 1, _val)
192 
193 #define GET_WMM_AC_PARAM_ACI(_pStart)				( (u8)LE_BITS_TO_4BYTE(_pStart, 5, 2) )
194 #define SET_WMM_AC_PARAM_ACI(_pStart, _val)			SET_BITS_TO_LE_4BYTE(_pStart, 5, 2, _val)
195 
196 #define GET_WMM_AC_PARAM_ACI_AIFSN(_pStart)			( (u8)LE_BITS_TO_4BYTE(_pStart, 0, 8) )
197 #define SET_WMM_AC_PARAM_ACI_AIFSN(_pStart, _val)	SET_BITS_TO_LE_4BYTE(_pStart, 0, 8, _val)
198 
199 #define GET_WMM_AC_PARAM_ECWMIN(_pStart)			( (u8)LE_BITS_TO_4BYTE(_pStart, 8, 4) )
200 #define SET_WMM_AC_PARAM_ECWMIN(_pStart, _val)		SET_BITS_TO_LE_4BYTE(_pStart, 8, 4, _val)
201 
202 #define GET_WMM_AC_PARAM_ECWMAX(_pStart)			( (u8)LE_BITS_TO_4BYTE(_pStart, 12, 4) )
203 #define SET_WMM_AC_PARAM_ECWMAX(_pStart, _val)		SET_BITS_TO_LE_4BYTE(_pStart, 12, 4, _val)
204 
205 #define GET_WMM_AC_PARAM_TXOP_LIMIT(_pStart)		( (u8)LE_BITS_TO_4BYTE(_pStart, 16, 16) )
206 #define SET_WMM_AC_PARAM_TXOP_LIMIT(_pStart, _val)	SET_BITS_TO_LE_4BYTE(_pStart, 16, 16, _val)
207 
208 
209 
210 #define WMM_PARAM_ELEMENT_SIZE	(8+(4*AC_PARAM_SIZE))
211 
212 typedef	enum _QOS_ELE_SUBTYPE{
213 	QOSELE_TYPE_INFO		= 0x00,
214 	QOSELE_TYPE_PARAM	= 0x01,
215 }QOS_ELE_SUBTYPE,*PQOS_ELE_SUBTYPE;
216 
217 
218 typedef	enum _DIRECTION_VALUE{
219 	DIR_UP			= 0,
220 	DIR_DOWN		= 1,
221 	DIR_DIRECT		= 2,
222 	DIR_BI_DIR		= 3,
223 }DIRECTION_VALUE,*PDIRECTION_VALUE;
224 
225 typedef	enum _ACM_METHOD{
226 	eAcmWay0_SwAndHw		= 0,
227 	eAcmWay1_HW			= 1,
228 	eAcmWay2_SW			= 2,
229 }ACM_METHOD,*PACM_METHOD;
230 
231 
232 struct acm {
233 	u64		UsedTime;
234 	u64		MediumTime;
235 	u8		HwAcmCtl;
236 };//, *struct acm *;
237 
238 
239 
240 typedef	u8		AC_UAPSD, *PAC_UAPSD;
241 
242 #define	GET_VO_UAPSD(_apsd) ((_apsd) & BIT0)
243 #define	SET_VO_UAPSD(_apsd) ((_apsd) |= BIT0)
244 
245 #define	GET_VI_UAPSD(_apsd) ((_apsd) & BIT1)
246 #define	SET_VI_UAPSD(_apsd) ((_apsd) |= BIT1)
247 
248 #define	GET_BK_UAPSD(_apsd) ((_apsd) & BIT2)
249 #define	SET_BK_UAPSD(_apsd) ((_apsd) |= BIT2)
250 
251 #define	GET_BE_UAPSD(_apsd) ((_apsd) & BIT3)
252 #define	SET_BE_UAPSD(_apsd) ((_apsd) |= BIT3)
253 
254 union qos_tclas {
255 
256 	struct _TYPE_GENERAL{
257 		u8		Priority;
258 		u8		ClassifierType;
259 		u8		Mask;
260 	} TYPE_GENERAL;
261 
262 	struct _TYPE0_ETH{
263 		u8		Priority;
264 		u8		ClassifierType;
265 		u8		Mask;
266 		u8		SrcAddr[6];
267 		u8		DstAddr[6];
268 		u16		Type;
269 	} TYPE0_ETH;
270 
271 	struct _TYPE1_IPV4{
272 		u8		Priority;
273 		u8		ClassifierType;
274 		u8		Mask;
275 		u8		Version;
276 		u8		SrcIP[4];
277 		u8		DstIP[4];
278 		u16		SrcPort;
279 		u16		DstPort;
280 		u8		DSCP;
281 		u8		Protocol;
282 		u8		Reserved;
283 	} TYPE1_IPV4;
284 
285 	struct _TYPE1_IPV6{
286 		u8		Priority;
287 		u8		ClassifierType;
288 		u8		Mask;
289 		u8		Version;
290 		u8		SrcIP[16];
291 		u8		DstIP[16];
292 		u16		SrcPort;
293 		u16		DstPort;
294 		u8		FlowLabel[3];
295 	} TYPE1_IPV6;
296 
297 	struct _TYPE2_8021Q{
298 		u8		Priority;
299 		u8		ClassifierType;
300 		u8		Mask;
301 		u16		TagType;
302 	} TYPE2_8021Q;
303 };
304 
305 struct qos_tstream {
306 
307 	bool			bUsed;
308 	u16			MsduLifetime;
309 	bool			bEstablishing;
310 	u8			TimeSlotCount;
311 	u8			DialogToken;
312 	struct wmm_tspec TSpec;
313 	struct wmm_tspec OutStandingTSpec;
314 	u8			NominalPhyRate;
315 };
316 
317 struct sta_qos {
318 	u8				WMMIEBuf[MAX_WMMELE_LENGTH];
319 	u8*				WMMIE;
320 
321 	QOS_MODE		QosCapability;
322 	QOS_MODE		CurrentQosMode;
323 
324 	AC_UAPSD		b4ac_Uapsd;
325 	AC_UAPSD		Curr4acUapsd;
326 	u8				bInServicePeriod;
327 	u8				MaxSPLength;
328 	int				NumBcnBeforeTrigger;
329 
330 	u8 *				pWMMInfoEle;
331 	u8				WMMParamEle[WMM_PARAM_ELEMENT_SIZE];
332 
333 	struct acm acm[4];
334 	ACM_METHOD		AcmMethod;
335 
336 	struct qos_tstream StaTsArray[MAX_STA_TS_COUNT];
337 	u8				DialogToken;
338 	struct wmm_tspec TSpec;
339 
340 	u8				QBssWirelessMode;
341 
342 	bool				bNoAck;
343 
344 	bool				bEnableRxImmBA;
345 
346 };//, *struct sta_qos *;
347 
348 #define QBSS_LOAD_SIZE 5
349 #define GET_QBSS_LOAD_STA_COUNT(__pStart)					ReadEF2Byte(__pStart)
350 #define SET_QBSS_LOAD_STA_COUNT(__pStart, __Value)			WriteEF2Byte(__pStart, __Value)
351 #define GET_QBSS_LOAD_CHNL_UTILIZATION(__pStart)			ReadEF1Byte((u8*)(__pStart) + 2)
352 #define SET_QBSS_LOAD_CHNL_UTILIZATION(__pStart, __Value)		WriteEF1Byte((u8*)(__pStart) + 2, __Value)
353 #define GET_QBSS_LOAD_AVAILABLE_CAPACITY(__pStart)			ReadEF2Byte((u8*)(__pStart) + 3)
354 #define SET_QBSS_LOAD_AVAILABLE_CAPACITY(__pStart, __Value)	WriteEF2Byte((u8*)(__pStart) + 3, __Value)
355 
356 struct bss_qos {
357 
358 	QOS_MODE			bdQoSMode;
359 	u8					bdWMMIEBuf[MAX_WMMELE_LENGTH];
360 	struct octet_string bdWMMIE;
361 
362 	QOS_ELE_SUBTYPE		EleSubType;
363 
364 	u8*					pWMMInfoEle;
365 	u8*					pWMMParamEle;
366 
367 	u8					QBssLoad[QBSS_LOAD_SIZE];
368 	bool					bQBssLoadValid;
369 };//, *struct bss_qos *;
370 
371 #define sQoSCtlLng	2
372 #define QOS_CTRL_LEN(_QosMode)		( (_QosMode > QOS_DISABLE)? sQoSCtlLng : 0 )
373 
374 
375 #define IsACValid(ac)		( ( ac>=0 && ac<=7 )? true : false )
376 
377 
378 union aci_aifsn {
379 	u8	charData;
380 
381 	struct
382 	{
383 		u8	AIFSN:4;
384 		u8	acm:1;
385 		u8	ACI:2;
386 		u8	Reserved:1;
387 	}f;
388 };
389 
390 union ecw {
391 	u8	charData;
392 	struct
393 	{
394 		u8	ECWmin:4;
395 		u8	ECWmax:4;
396 	}f;
397 };
398 
399 union ac_param {
400 	u32	longData;
401 	u8	charData[4];
402 
403 	struct
404 	{
405 		union aci_aifsn AciAifsn;
406 		union ecw Ecw;
407 		u16		TXOPLimit;
408 	}f;
409 };
410 
411 #endif
412