• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 WMM_PARAM_ELEMENT_SIZE	(8+(4*AC_PARAM_SIZE))
205 
206 enum qos_ele_subtype {
207 	QOSELE_TYPE_INFO		= 0x00,
208 	QOSELE_TYPE_PARAM	= 0x01,
209 };
210 
211 
212 enum direction_value {
213 	DIR_UP			= 0,
214 	DIR_DOWN		= 1,
215 	DIR_DIRECT		= 2,
216 	DIR_BI_DIR		= 3,
217 };
218 
219 enum acm_method {
220 	eAcmWay0_SwAndHw		= 0,
221 	eAcmWay1_HW			= 1,
222 	eAcmWay2_SW			= 2,
223 };
224 
225 
226 struct acm {
227 	u64		UsedTime;
228 	u64		MediumTime;
229 	u8		HwAcmCtl;
230 };
231 
232 
233 
234 #define AC_UAPSD	u8
235 
236 #define	GET_VO_UAPSD(_apsd) ((_apsd) & BIT0)
237 #define	SET_VO_UAPSD(_apsd) ((_apsd) |= BIT0)
238 
239 #define	GET_VI_UAPSD(_apsd) ((_apsd) & BIT1)
240 #define	SET_VI_UAPSD(_apsd) ((_apsd) |= BIT1)
241 
242 #define	GET_BK_UAPSD(_apsd) ((_apsd) & BIT2)
243 #define	SET_BK_UAPSD(_apsd) ((_apsd) |= BIT2)
244 
245 #define	GET_BE_UAPSD(_apsd) ((_apsd) & BIT3)
246 #define	SET_BE_UAPSD(_apsd) ((_apsd) |= BIT3)
247 
248 union qos_tclas {
249 
250 	struct _TYPE_GENERAL {
251 		u8		Priority;
252 		u8		ClassifierType;
253 		u8		Mask;
254 	} TYPE_GENERAL;
255 
256 	struct _TYPE0_ETH {
257 		u8		Priority;
258 		u8		ClassifierType;
259 		u8		Mask;
260 		u8		SrcAddr[6];
261 		u8		DstAddr[6];
262 		u16		Type;
263 	} TYPE0_ETH;
264 
265 	struct _TYPE1_IPV4 {
266 		u8		Priority;
267 		u8		ClassifierType;
268 		u8		Mask;
269 		u8		Version;
270 		u8		SrcIP[4];
271 		u8		DstIP[4];
272 		u16		SrcPort;
273 		u16		DstPort;
274 		u8		DSCP;
275 		u8		Protocol;
276 		u8		Reserved;
277 	} TYPE1_IPV4;
278 
279 	struct _TYPE1_IPV6 {
280 		u8		Priority;
281 		u8		ClassifierType;
282 		u8		Mask;
283 		u8		Version;
284 		u8		SrcIP[16];
285 		u8		DstIP[16];
286 		u16		SrcPort;
287 		u16		DstPort;
288 		u8		FlowLabel[3];
289 	} TYPE1_IPV6;
290 
291 	struct _TYPE2_8021Q {
292 		u8		Priority;
293 		u8		ClassifierType;
294 		u8		Mask;
295 		u16		TagType;
296 	} TYPE2_8021Q;
297 };
298 
299 struct qos_tstream {
300 
301 	bool			bUsed;
302 	u16			MsduLifetime;
303 	bool			bEstablishing;
304 	u8			TimeSlotCount;
305 	u8			DialogToken;
306 	struct wmm_tspec TSpec;
307 	struct wmm_tspec OutStandingTSpec;
308 	u8			NominalPhyRate;
309 };
310 
311 struct sta_qos {
312 	u8 WMMIEBuf[MAX_WMMELE_LENGTH];
313 	u8 *WMMIE;
314 
315 	QOS_MODE QosCapability;
316 	QOS_MODE CurrentQosMode;
317 
318 	AC_UAPSD b4ac_Uapsd;
319 	AC_UAPSD Curr4acUapsd;
320 	u8 bInServicePeriod;
321 	u8 MaxSPLength;
322 	int NumBcnBeforeTrigger;
323 
324 	u8 *pWMMInfoEle;
325 	u8 WMMParamEle[WMM_PARAM_ELEMENT_SIZE];
326 
327 	struct acm acm[4];
328 	enum acm_method AcmMethod;
329 
330 	struct qos_tstream StaTsArray[MAX_STA_TS_COUNT];
331 	u8				DialogToken;
332 	struct wmm_tspec TSpec;
333 
334 	u8				QBssWirelessMode;
335 
336 	bool				bNoAck;
337 
338 	bool				bEnableRxImmBA;
339 
340 };
341 
342 #define QBSS_LOAD_SIZE				5
343 #define GET_QBSS_LOAD_STA_COUNT(__pStart)	\
344 		ReadEF2Byte(__pStart)
345 #define SET_QBSS_LOAD_STA_COUNT(__pStart, __Value)	\
346 		WriteEF2Byte(__pStart, __Value)
347 #define GET_QBSS_LOAD_CHNL_UTILIZATION(__pStart)	\
348 		ReadEF1Byte((u8 *)(__pStart) + 2)
349 #define SET_QBSS_LOAD_CHNL_UTILIZATION(__pStart, __Value)	\
350 		WriteEF1Byte((u8 *)(__pStart) + 2, __Value)
351 #define GET_QBSS_LOAD_AVAILABLE_CAPACITY(__pStart)	\
352 		ReadEF2Byte((u8 *)(__pStart) + 3)
353 #define SET_QBSS_LOAD_AVAILABLE_CAPACITY(__pStart, __Value) \
354 		WriteEF2Byte((u8 *)(__pStart) + 3, __Value)
355 
356 struct bss_qos {
357 	QOS_MODE bdQoSMode;
358 	u8 bdWMMIEBuf[MAX_WMMELE_LENGTH];
359 	struct octet_string bdWMMIE;
360 
361 	enum qos_ele_subtype EleSubType;
362 
363 	u8 *pWMMInfoEle;
364 	u8 *pWMMParamEle;
365 
366 	u8 QBssLoad[QBSS_LOAD_SIZE];
367 	bool bQBssLoadValid;
368 };
369 
370 #define sQoSCtlLng	2
371 #define QOS_CTRL_LEN(_QosMode)	((_QosMode > QOS_DISABLE) ? sQoSCtlLng : 0)
372 
373 
374 #define IsACValid(ac)		((ac >= 0 && ac <= 7) ? true : false)
375 
376 
377 union aci_aifsn {
378 	u8	charData;
379 
380 	struct {
381 		u8	AIFSN:4;
382 		u8	acm:1;
383 		u8	ACI:2;
384 		u8	Reserved:1;
385 	} f;
386 };
387 
388 union ecw {
389 	u8	charData;
390 	struct {
391 		u8	ECWmin:4;
392 		u8	ECWmax:4;
393 	} f;
394 };
395 
396 union ac_param {
397 	u32	longData;
398 	u8	charData[4];
399 
400 	struct {
401 		union aci_aifsn AciAifsn;
402 		union ecw Ecw;
403 		u16		TXOPLimit;
404 	} f;
405 };
406 
407 #endif
408