]> git.karo-electronics.de Git - karo-tx-linux.git/blob - drivers/staging/rtl8192e/rtl819x_Qos.h
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input
[karo-tx-linux.git] / drivers / staging / rtl8192e / rtl819x_Qos.h
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