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#define BIT0		    0x00000001
23#define BIT1		    0x00000002
24#define BIT2		    0x00000004
25#define BIT3		    0x00000008
26#define BIT4		    0x00000010
27#define BIT5		    0x00000020
28#define BIT6		    0x00000040
29#define BIT7		    0x00000080
30#define BIT8		    0x00000100
31#define BIT9		    0x00000200
32#define BIT10		   0x00000400
33#define BIT11		   0x00000800
34#define BIT12		   0x00001000
35#define BIT13		   0x00002000
36#define BIT14		   0x00004000
37#define BIT15		   0x00008000
38#define BIT16		   0x00010000
39#define BIT17		   0x00020000
40#define BIT18		   0x00040000
41#define BIT19		   0x00080000
42#define BIT20		   0x00100000
43#define BIT21		   0x00200000
44#define BIT22		   0x00400000
45#define BIT23		   0x00800000
46#define BIT24		   0x01000000
47#define BIT25		   0x02000000
48#define BIT26		   0x04000000
49#define BIT27		   0x08000000
50#define BIT28		   0x10000000
51#define BIT29		   0x20000000
52#define BIT30		   0x40000000
53#define BIT31		   0x80000000
54
55union qos_tsinfo {
56	u8		charData[3];
57	struct {
58		u8		ucTrafficType:1;
59		u8		ucTSID:4;
60		u8		ucDirection:2;
61		u8		ucAccessPolicy:2;
62		u8		ucAggregation:1;
63		u8		ucPSB:1;
64		u8		ucUP:3;
65		u8		ucTSInfoAckPolicy:2;
66		u8		ucSchedule:1;
67		u8		ucReserved:7;
68	} field;
69};
70
71union tspec_body {
72	u8		charData[55];
73
74	struct {
75		union qos_tsinfo TSInfo;
76		u16	NominalMSDUsize;
77		u16	MaxMSDUsize;
78		u32	MinServiceItv;
79		u32	MaxServiceItv;
80		u32	InactivityItv;
81		u32	SuspenItv;
82		u32	ServiceStartTime;
83		u32	MinDataRate;
84		u32	MeanDataRate;
85		u32	PeakDataRate;
86		u32	MaxBurstSize;
87		u32	DelayBound;
88		u32	MinPhyRate;
89		u16	SurplusBandwidthAllowance;
90		u16	MediumTime;
91	} f;
92};
93
94struct wmm_tspec {
95	u8		ID;
96	u8		Length;
97	u8		OUI[3];
98	u8		OUI_Type;
99	u8		OUI_SubType;
100	u8		Version;
101	union tspec_body Body;
102};
103
104struct octet_string {
105	u8 *Octet;
106	u16 Length;
107};
108
109#define	MAX_WMMELE_LENGTH	64
110
111#define QOS_MODE u32
112
113#define QOS_DISABLE		0
114#define QOS_WMM		1
115#define QOS_WMMSA		2
116#define QOS_EDCA		4
117#define QOS_HCCA		8
118#define QOS_WMM_UAPSD		16
119
120#define WMM_PARAM_ELE_BODY_LEN	18
121
122#define MAX_STA_TS_COUNT			16
123#define MAX_AP_TS_COUNT			32
124#define QOS_TSTREAM_KEY_SIZE		13
125
126#define WMM_ACTION_CATEGORY_CODE	17
127#define WMM_PARAM_ELE_BODY_LEN	18
128
129#define MAX_TSPEC_TSID				15
130#define SESSION_REJECT_TSID			0xfe
131#define DEFAULT_TSID					0xff
132
133#define ADDTS_TIME_SLOT				100
134
135#define ACM_TIMEOUT				1000
136#define SESSION_REJECT_TIMEOUT		60000
137
138enum ack_policy {
139	eAckPlc0_ACK		= 0x00,
140	eAckPlc1_NoACK		= 0x01,
141};
142
143
144#define SET_WMM_QOS_INFO_FIELD(_pStart, _val)	\
145	WriteEF1Byte(_pStart, _val)
146
147#define GET_WMM_QOS_INFO_FIELD_PARAMETERSET_COUNT(_pStart) \
148	LE_BITS_TO_1BYTE(_pStart, 0, 4)
149#define SET_WMM_QOS_INFO_FIELD_PARAMETERSET_COUNT(_pStart, _val) \
150	SET_BITS_TO_LE_1BYTE(_pStart, 0, 4, _val)
151
152#define GET_WMM_QOS_INFO_FIELD_AP_UAPSD(_pStart) \
153	LE_BITS_TO_1BYTE(_pStart, 7, 1)
154#define SET_WMM_QOS_INFO_FIELD_AP_UAPSD(_pStart, _val) \
155	SET_BITS_TO_LE_1BYTE(_pStart, 7, 1, _val)
156
157#define GET_WMM_QOS_INFO_FIELD_STA_AC_VO_UAPSD(_pStart) \
158	LE_BITS_TO_1BYTE(_pStart, 0, 1)
159#define SET_WMM_QOS_INFO_FIELD_STA_AC_VO_UAPSD(_pStart, _val) \
160	SET_BITS_TO_LE_1BYTE(_pStart, 0, 1, _val)
161
162#define GET_WMM_QOS_INFO_FIELD_STA_AC_VI_UAPSD(_pStart) \
163	LE_BITS_TO_1BYTE(_pStart, 1, 1)
164#define SET_WMM_QOS_INFO_FIELD_STA_AC_VI_UAPSD(_pStart, _val) \
165	SET_BITS_TO_LE_1BYTE(_pStart, 1, 1, _val)
166
167#define GET_WMM_QOS_INFO_FIELD_STA_AC_BE_UAPSD(_pStart) \
168	LE_BITS_TO_1BYTE(_pStart, 2, 1)
169#define SET_WMM_QOS_INFO_FIELD_STA_AC_BE_UAPSD(_pStart, _val) \
170	SET_BITS_TO_LE_1BYTE(_pStart, 2, 1, _val)
171
172#define GET_WMM_QOS_INFO_FIELD_STA_AC_BK_UAPSD(_pStart) \
173	LE_BITS_TO_1BYTE(_pStart, 3, 1)
174#define SET_WMM_QOS_INFO_FIELD_STA_AC_BK_UAPSD(_pStart, _val) \
175	SET_BITS_TO_LE_1BYTE(_pStart, 3, 1, _val)
176
177#define GET_WMM_QOS_INFO_FIELD_STA_MAX_SP_LEN(_pStart) \
178	LE_BITS_TO_1BYTE(_pStart, 5, 2)
179#define SET_WMM_QOS_INFO_FIELD_STA_MAX_SP_LEN(_pStart, _val) \
180	SET_BITS_TO_LE_1BYTE(_pStart, 5, 2, _val)
181
182enum qos_ie_source {
183	QOSIE_SRC_ADDTSREQ,
184	QOSIE_SRC_ADDTSRSP,
185	QOSIE_SRC_REASOCREQ,
186	QOSIE_SRC_REASOCRSP,
187	QOSIE_SRC_DELTS,
188};
189
190
191#define AC_CODING u32
192
193#define AC0_BE	0
194#define AC1_BK	1
195#define AC2_VI	2
196#define AC3_VO	3
197#define AC_MAX	4
198
199
200#define AC_PARAM_SIZE	4
201
202#define WMM_PARAM_ELEMENT_SIZE	(8+(4*AC_PARAM_SIZE))
203
204enum qos_ele_subtype {
205	QOSELE_TYPE_INFO		= 0x00,
206	QOSELE_TYPE_PARAM	= 0x01,
207};
208
209
210enum direction_value {
211	DIR_UP			= 0,
212	DIR_DOWN		= 1,
213	DIR_DIRECT		= 2,
214	DIR_BI_DIR		= 3,
215};
216
217enum acm_method {
218	eAcmWay0_SwAndHw		= 0,
219	eAcmWay1_HW			= 1,
220	eAcmWay2_SW			= 2,
221};
222
223
224struct acm {
225	u64		UsedTime;
226	u64		MediumTime;
227	u8		HwAcmCtl;
228};
229
230
231
232#define AC_UAPSD	u8
233
234#define	GET_VO_UAPSD(_apsd) ((_apsd) & BIT0)
235#define	SET_VO_UAPSD(_apsd) ((_apsd) |= BIT0)
236
237#define	GET_VI_UAPSD(_apsd) ((_apsd) & BIT1)
238#define	SET_VI_UAPSD(_apsd) ((_apsd) |= BIT1)
239
240#define	GET_BK_UAPSD(_apsd) ((_apsd) & BIT2)
241#define	SET_BK_UAPSD(_apsd) ((_apsd) |= BIT2)
242
243#define	GET_BE_UAPSD(_apsd) ((_apsd) & BIT3)
244#define	SET_BE_UAPSD(_apsd) ((_apsd) |= BIT3)
245
246union qos_tclas {
247
248	struct _TYPE_GENERAL {
249		u8		Priority;
250		u8		ClassifierType;
251		u8		Mask;
252	} TYPE_GENERAL;
253
254	struct _TYPE0_ETH {
255		u8		Priority;
256		u8		ClassifierType;
257		u8		Mask;
258		u8		SrcAddr[6];
259		u8		DstAddr[6];
260		u16		Type;
261	} TYPE0_ETH;
262
263	struct _TYPE1_IPV4 {
264		u8		Priority;
265		u8		ClassifierType;
266		u8		Mask;
267		u8		Version;
268		u8		SrcIP[4];
269		u8		DstIP[4];
270		u16		SrcPort;
271		u16		DstPort;
272		u8		DSCP;
273		u8		Protocol;
274		u8		Reserved;
275	} TYPE1_IPV4;
276
277	struct _TYPE1_IPV6 {
278		u8		Priority;
279		u8		ClassifierType;
280		u8		Mask;
281		u8		Version;
282		u8		SrcIP[16];
283		u8		DstIP[16];
284		u16		SrcPort;
285		u16		DstPort;
286		u8		FlowLabel[3];
287	} TYPE1_IPV6;
288
289	struct _TYPE2_8021Q {
290		u8		Priority;
291		u8		ClassifierType;
292		u8		Mask;
293		u16		TagType;
294	} TYPE2_8021Q;
295};
296
297struct qos_tstream {
298
299	bool			bUsed;
300	u16			MsduLifetime;
301	bool			bEstablishing;
302	u8			TimeSlotCount;
303	u8			DialogToken;
304	struct wmm_tspec TSpec;
305	struct wmm_tspec OutStandingTSpec;
306	u8			NominalPhyRate;
307};
308
309struct sta_qos {
310	u8 WMMIEBuf[MAX_WMMELE_LENGTH];
311	u8 *WMMIE;
312
313	QOS_MODE QosCapability;
314	QOS_MODE CurrentQosMode;
315
316	AC_UAPSD b4ac_Uapsd;
317	AC_UAPSD Curr4acUapsd;
318	u8 bInServicePeriod;
319	u8 MaxSPLength;
320	int NumBcnBeforeTrigger;
321
322	u8 *pWMMInfoEle;
323	u8 WMMParamEle[WMM_PARAM_ELEMENT_SIZE];
324
325	struct acm acm[4];
326	enum acm_method AcmMethod;
327
328	struct qos_tstream StaTsArray[MAX_STA_TS_COUNT];
329	u8				DialogToken;
330	struct wmm_tspec TSpec;
331
332	u8				QBssWirelessMode;
333
334	bool				bNoAck;
335
336	bool				bEnableRxImmBA;
337
338};
339
340#define QBSS_LOAD_SIZE				5
341
342struct bss_qos {
343	QOS_MODE bdQoSMode;
344	u8 bdWMMIEBuf[MAX_WMMELE_LENGTH];
345	struct octet_string bdWMMIE;
346
347	enum qos_ele_subtype EleSubType;
348
349	u8 *pWMMInfoEle;
350	u8 *pWMMParamEle;
351
352	u8 QBssLoad[QBSS_LOAD_SIZE];
353	bool bQBssLoadValid;
354};
355
356#define IsACValid(ac)		((ac >= 0 && ac <= 7) ? true : false)
357
358
359union aci_aifsn {
360	u8	charData;
361
362	struct {
363		u8	AIFSN:4;
364		u8	acm:1;
365		u8	ACI:2;
366		u8	Reserved:1;
367	} f;
368};
369
370union ecw {
371	u8	charData;
372	struct {
373		u8	ECWmin:4;
374		u8	ECWmax:4;
375	} f;
376};
377
378union ac_param {
379	u32	longData;
380	u8	charData[4];
381
382	struct {
383		union aci_aifsn AciAifsn;
384		union ecw Ecw;
385		u16		TXOPLimit;
386	} f;
387};
388
389#endif
390