Merge branch 'for-linus' of git://www.jni.nu/cris
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / drivers / staging / otus / 80211core / cagg.h
1 /*
2 * Copyright (c) 2007-2008 Atheros Communications Inc.
3 *
4 * Permission to use, copy, modify, and/or distribute this software for any
5 * purpose with or without fee is hereby granted, provided that the above
6 * copyright notice and this permission notice appear in all copies.
7 *
8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15 */
16 /* */
17 /* Module Name : cagg.h */
18 /* */
19 /* Abstract */
20 /* This module contains A-MPDU aggregation relatived functions. */
21 /* */
22 /* NOTES */
23 /* None */
24 /* */
25 /****************************************************************************/
26 /*Revision History: */
27 /* Who When What */
28 /* -------- -------- ----------------------------------------------*/
29 /* */
30 /* Honda 12-4-06 created */
31 /* */
32 /****************************************************************************/
33
34 #ifndef _CAGG_H
35 #define _CAGG_H
36
37
38 /*
39 * the aggregation functions flag, 0 if don't do aggregate
40 */
41
42 #define ZM_AGG_FPGA_DEBUG 1
43 #define ZM_AGG_FPGA_REORDERING 1
44
45 #ifndef ZM_AGG_TALLY
46 //#define ZM_AGG_TALLY
47 #endif
48 /*
49 * Aggregate control
50 */
51
52
53 #define ZM_AGG_POOL_SIZE 20
54 #define ZM_BAW_POOL_SIZE 32
55 #define ZM_AGGQ_SIZE 64
56 #define ZM_AGGQ_SIZE_MASK (ZM_AGGQ_SIZE-1)
57 #define ZM_AGG_LOW_THRESHOLD 1
58 #define ZM_AGG_HIGH_THRESHOLD 5
59
60 /*
61 * number of access categories (ac)
62 */
63 #define ZM_AC 4
64 /*
65 * the timer to clear aggregation queue, unit: 1 tick
66 * if the packet is too old (current time - arrival time)
67 * the packet and the aggregate queue will be cleared
68 */
69 #define ZM_AGG_CLEAR_TIME 10
70 /*
71 * delete the queue if idle for ZM_DELETE_TIME
72 * unit: 10ms
73 */
74 #define ZM_AGG_DELETE_TIME 10000
75
76 /*
77 * block ack window size
78 */
79 #define ZM_AGG_BAW_SIZE 64
80 #define ZM_AGG_BAW_MASK (ZM_AGG_BAW_SIZE-1)
81 /*
82 * originator ADDBA Resquest receiver
83 * |----------------------------->|
84 * 1| ACK |1
85 * |<-----------------------------|
86 * 2| ADDBA Response |2
87 * |<-----------------------------|
88 * 3| ACK |3
89 * |----------------------------->|
90 * 4 4
91 */
92 #define ZM_AGG_ADDBA_REQUEST 1
93 #define ZM_AGG_ADDBA_REQUEST_ACK 2
94 #define ZM_AGG_ADDBA_RESPONSE 3
95 #define ZM_AGG_ADDBA_RESPONSE_ACK 4
96
97 #define ZM_AGG_SINGLE_MPDU 00
98 #define ZM_AGG_FIRST_MPDU 01
99 #define ZM_AGG_MIDDLE_MPDU 11
100 #define ZM_AGG_LAST_MPDU 10
101 /*
102 * end of Aggregate control
103 */
104
105 #define TID_TX struct aggQueue*
106 #define TID_BAW struct baw_q*
107 #define BAW wd->baw_enabler
108 #define DESTQ wd->destQ
109
110 /*
111 * Queue access
112 */
113 #define zm_agg_qlen(dev, head, tail) ((head - tail) & ZM_AGGQ_SIZE_MASK)
114 #define zm_agg_inQ(tid_tx, pt) ((((pt - tid_tx->aggTail) & ZM_AGGQ_SIZE_MASK) < \
115 ((tid_tx->aggHead - tid_tx->aggTail) & ZM_AGGQ_SIZE_MASK))? TRUE:FALSE)
116 #define zm_agg_plus(pt) pt = (pt + 1) & ZM_AGGQ_SIZE_MASK
117 #define zm_agg_min(A, B) ((A>B)? B:A)
118 #define zm_agg_GetTime() wd->tick
119 #define TXQL (zfHpGetMaxTxdCount(dev) - zfHpGetFreeTxdCount(dev))
120
121 /* don't change AGG_MIN_TXQL easily, this might cause BAW BSOD */
122 #define AGG_MIN_TXQL 2
123 /*
124 * consider tcp,udp,ac(1234)
125 */
126 #define zm_agg_dynamic_threshold(dev, ar) ((ar > 16)? 11: \
127 (ar > 12)? 8: \
128 (ar > 8)? 5: \
129 (ar > 4)? 2:1)
130 #define zm_agg_weight(ac) ((3 == ac)? 4: \
131 (2 == ac)? 3: \
132 (0 == ac)? 2:1)
133 /*
134 * the required free queue ratio per ac
135 */
136
137 #define zm_agg_ratio(ac) ((3 == ac)? 3: \
138 (2 == ac)? (zfHpGetMaxTxdCount(dev)*1/4): \
139 (0 == ac)? (zfHpGetMaxTxdCount(dev)*2/4): \
140 (zfHpGetMaxTxdCount(dev)*3/4))
141
142 //#define zm_agg_ratio(ac) 3
143 /*
144 * end of Queue access
145 */
146
147 #define ZM_AGGMSG_LEV ZM_LV_3
148 #define zm_msg0_agg(lv, msg) if (ZM_AGGMSG_LEV >= lv) \
149 {zm_debug_msg0(msg);}
150 #define zm_msg1_agg(lv, msg, val) if (ZM_AGGMSG_LEV >= lv) \
151 {zm_debug_msg1(msg, val);}
152 #define zm_msg2_agg(lv, msg, val) if (ZM_AGGMSG_LEV >= lv) \
153 {zm_debug_msg2(msg, val);}
154
155 #ifndef ZM_ENABLE_FW_BA_RETRANSMISSION //disable BAW
156 struct baw_header_r {
157 u16_t *header;
158 u16_t *mic;
159 u16_t *snap;
160 u16_t headerLen;
161 u16_t micLen;
162 u16_t snapLen;
163 u16_t removeLen;
164 u8_t keyIdx;
165 };
166
167 struct baw_header {
168 u16_t header[29];//[(8+30+2+18)/2]; 58 bytes /* ctr+(4+a1+a2+a3+2+a4)+qos+iv */
169 u16_t headerLen;
170 u16_t mic[4]; //[8/2]; 8 bytes
171 u16_t micLen;
172 u16_t snap[4]; //[8/2]; 8 bytes
173 u16_t snapLen;
174 u16_t removeLen;
175 u8_t keyIdx;
176 };
177
178 struct bufInfo {
179 zbuf_t* buf;
180 u8_t baw_retransmit;
181 u32_t timestamp;
182 struct baw_header *baw_header;
183 };
184 #endif
185 struct aggElement
186 {
187 zbuf_t* buf;
188 u32_t arrivalTime;
189 u8_t baw_retransmit;
190 struct zsAdditionInfo addInfo;
191 //struct baw_header baw_header;
192 };
193
194
195 #ifndef ZM_ENABLE_FW_BA_RETRANSMISSION //disable BAW
196 struct baw_buf
197 {
198 zbuf_t* buf;
199 u16_t baw_seq;
200 u32_t timestamp;
201 u8_t baw_retransmit;
202 struct baw_header baw_header;
203 };
204
205 struct baw_q {
206 struct baw_buf frame[ZM_VTXQ_SIZE];
207 u16_t enabled;
208 u16_t start_seq;
209 u16_t head;
210 u16_t tail;
211 u16_t size;
212 TID_TX tid_tx;
213
214 //struct baw_header *baw_header;
215 };
216
217 struct baw_enabler
218 {
219 struct baw_q tid_baw[ZM_BAW_POOL_SIZE];
220 u8_t delPoint;
221 void (*core)(zdev_t* dev, u16_t baw_seq, u32_t bitmap, u16_t aggLen);
222 //void (*core);
223 void (*init)(zdev_t* dev);
224 TID_BAW (*getNewQ)(zdev_t* dev, u16_t start_seq, TID_TX tid_tx);
225 TID_BAW (*getQ)(zdev_t* dev, u16_t baw_seq);
226 u16_t (*insert)(zdev_t* dev, zbuf_t* buf, u16_t baw_seq, TID_BAW tid_baw, u8_t baw_retransmit, struct baw_header_r *header_r);
227 struct bufInfo* (*pop)(zdev_t* dev, u16_t index, TID_BAW tid_baw);
228 void (*enable)(zdev_t* dev, TID_BAW tid_baw, u16_t start_seq);
229 void (*disable)(zdev_t* dev, TID_BAW tid_baw);
230
231 };
232 #endif
233 struct aggQueue
234 {
235 struct aggElement aggvtxq[ZM_AGGQ_SIZE];
236 u16_t aggHead;
237 u16_t aggTail;
238 s16_t size;
239 u16_t aggQSTA;
240 u16_t aggQEnabled;
241 u16_t ac;
242 u16_t tid;
243 u16_t aggReady;
244 u16_t clearFlag;
245 u16_t deleteFlag;
246 u32_t lastArrival;
247 u16_t aggFrameSize;
248 u16_t bar_ssn; /* starting sequence number in BAR */
249 u16_t dst[3];
250 u16_t complete; /* complete indication pointer */
251 };
252
253 struct aggSta
254 {
255 u16_t count[ZM_AC];
256 TID_TX tid_tx[8];
257 u16_t aggFlag[ZM_AC];
258 };
259
260 struct agg_tid_rx
261 {
262 u16_t aid;
263 u16_t ac;
264 u16_t addBaExchangeStatusCode;
265 //struct zsAdditionInfo *addInfo;
266 u16_t seq_start; /* first seq expected next */
267 u16_t baw_head; /* head of valid block ack window */
268 u16_t baw_tail; /* tail of valid block ack window */
269 //u16_t free_count; /* block ack window size */
270 u8_t sq_exceed_count;
271 u8_t sq_behind_count;
272 struct aggElement frame[ZM_AGG_BAW_SIZE + 1]; /* out-of-order rx frames */
273 };
274
275 struct aggControl
276 {
277 u16_t aggEnabled;
278 u16_t ampduIndication;
279 u16_t addbaIndication;
280 //TID_BAW tid_baw;
281 u32_t timestamp;
282 };
283
284 struct aggBaFrameParameter
285 {
286 zbuf_t* buf;
287 u16_t ba_parameter;
288 u8_t dialog;
289 u16_t ba_policy;
290 u16_t tid;
291 u16_t buffer_size;
292 u16_t ba_timeout;
293 u16_t ba_start_seq;
294 u16_t status_code;
295 };
296
297 struct aggBarControl
298 {
299 u16_t bar_ack_policy ;
300 u16_t multi_tid ;
301 u16_t compressed_bitmap ;
302 u16_t tid_info ;
303 };
304
305 struct aggTally
306 {
307 u32_t got_packets_sum;
308 u32_t got_bytes_sum;
309 u32_t sent_packets_sum;
310 u32_t sent_bytes_sum;
311 u32_t avg_got_packets;
312 u32_t avg_got_bytes;
313 u32_t avg_sent_packets;
314 u32_t avg_sent_bytes;
315 u16_t time;
316 };
317
318
319 struct destQ {
320 struct dest{
321 u16_t Qtype : 1; /* 0 aggr, 1 vtxq */
322 TID_TX tid_tx;
323 void* vtxq;
324
325 struct dest* next;
326 } *dest[4];
327 struct dest* Head[4];
328 //s16_t size[4];
329 u16_t ppri;
330 void (*insert)(zdev_t* dev, u16_t Qtype, u16_t ac, TID_TX tid_tx, void* vtxq);
331 void (*delete)(zdev_t* dev, u16_t Qtype, TID_TX tid_tx, void* vtxq);
332 void (*init)(zdev_t* dev);
333 struct dest* (*getNext)(zdev_t* dev, u16_t ac);
334 u16_t (*exist)(zdev_t* dev, u16_t Qtype, u16_t ac, TID_TX tid_tx, void* vtxq);
335 //void (*scan)(zdev_t* dev);
336 };
337 /*
338 * aggregation tx
339 */
340 void zfAggInit(zdev_t* dev);
341 u16_t zfApFindSta(zdev_t* dev, u16_t* addr);
342 u16_t zfAggGetSta(zdev_t* dev, zbuf_t* buf);
343 TID_TX zfAggTxGetQueue(zdev_t* dev, u16_t aid, u16_t tid);
344 TID_TX zfAggTxNewQueue(zdev_t* dev, u16_t aid, u16_t tid, zbuf_t* buf);
345 u16_t zfAggTxEnqueue(zdev_t* dev, zbuf_t* buf, u16_t aid, TID_TX tid_tx);
346 u16_t zfAggTx(zdev_t* dev, zbuf_t* buf, u16_t tid);
347 u16_t zfAggTxReadyCount(zdev_t* dev, u16_t ac);
348 u16_t zfAggTxPartial(zdev_t* dev, u16_t ac, u16_t readycount);
349 u16_t zfAggTxSend(zdev_t* dev, u32_t freeTxd, TID_TX tid_tx);
350 TID_TX zfAggTxGetReadyQueue(zdev_t* dev, u16_t ac);
351 zbuf_t* zfAggTxGetVtxq(zdev_t* dev, TID_TX tid_tx);
352 u16_t zfAggTxDeleteQueue(zdev_t* dev, u16_t qnum);
353 u16_t zfAggScanAndClear(zdev_t* dev, u32_t time);
354 u16_t zfAggClearQueue(zdev_t* dev);
355 void zfAggTxScheduler(zdev_t* dev, u8_t ScanAndClear);
356
357 /* tid_tx manipulation */
358 #ifndef ZM_ENABLE_FW_BA_RETRANSMISSION //disable BAW
359 u16_t zfAggTidTxInsertHead(zdev_t* dev, struct bufInfo* buf_info, TID_TX tid_tx);
360 #endif
361 void zfAggDestInsert(zdev_t* dev, u16_t Qtype, u16_t ac, TID_TX tid_tx, void* vtxq);
362 void zfAggDestDelete(zdev_t* dev, u16_t Qtype, TID_TX tid_tx, void* vtxq);
363 void zfAggDestInit(zdev_t* dev);
364 struct dest* zfAggDestGetNext(zdev_t* dev, u16_t ac);
365 u16_t zfAggDestExist(zdev_t* dev, u16_t Qtype, u16_t ac, TID_TX tid_tx, void* vtxq);
366 /*
367 * aggregation rx
368 */
369 struct agg_tid_rx *zfAggRxEnabled(zdev_t* dev, zbuf_t* buf);
370 u16_t zfAggRx(zdev_t* dev, zbuf_t* buf, struct zsAdditionInfo *addInfo, struct agg_tid_rx *tid_rx);
371 struct agg_tid_rx *zfAggRxGetQueue(zdev_t* dev, zbuf_t* buf);
372 u16_t zfAggRxEnqueue(zdev_t* dev, zbuf_t* buf, struct agg_tid_rx *tid_rx, struct zsAdditionInfo *addInfo);
373 u16_t zfAggRxFlush(zdev_t* dev, u16_t seq_no, struct agg_tid_rx *tid_rx);
374 u16_t zfAggRxFreeBuf(zdev_t* dev, u16_t destroy);
375 u16_t zfAggRxClear(zdev_t* dev, u32_t time);
376 void zfAggRecvBAR(zdev_t* dev, zbuf_t* buf);
377 /*
378 * end of aggregation rx
379 */
380
381 /*
382 * ADDBA
383 */
384 u16_t zfAggSendAddbaRequest(zdev_t* dev, u16_t *dst, u16_t ac, u16_t up);
385 u16_t zfAggSetAddbaFrameBody(zdev_t* dev,zbuf_t* buf, u16_t offset, u16_t ac, u16_t up);
386 u16_t zfAggGenAddbaHeader(zdev_t* dev, u16_t* dst,
387 u16_t* header, u16_t len, zbuf_t* buf, u16_t vap, u8_t encrypt);
388 u16_t zfAggProcessAction(zdev_t* dev, zbuf_t* buf);
389 u16_t zfAggBlockAckActionFrame(zdev_t* dev, zbuf_t* buf);
390 u16_t zfAggRecvAddbaRequest(zdev_t* dev, zbuf_t* buf);
391 u16_t zfAggRecvAddbaResponse(zdev_t* dev, zbuf_t* buf);
392 u16_t zfAggRecvDelba(zdev_t* dev, zbuf_t* buf);
393 u16_t zfAggSendAddbaResponse(zdev_t* dev, struct aggBaFrameParameter *bf);
394 u16_t zfAggSetAddbaResponseFrameBody(zdev_t* dev, zbuf_t* buf,
395 struct aggBaFrameParameter *bf, u16_t offset);
396 u16_t zfAggAddbaSetTidRx(zdev_t* dev, zbuf_t* buf,
397 struct aggBaFrameParameter *bf);
398 /*
399 * zfAggTxSendEth
400 */
401 u16_t zfAggTxSendEth(zdev_t* dev, zbuf_t* buf, u16_t port, u16_t bufType, u8_t flag, struct aggControl *aggControl, TID_TX tid_tx);
402
403 /*
404 * statistics functions
405 */
406 u16_t zfAggTallyReset(zdev_t* dev);
407
408 u16_t zfAggPrintTally(zdev_t* dev);
409
410 /*
411 * BAR
412 */
413 void zfAggInvokeBar(zdev_t* dev, TID_TX tid_tx);
414 u16_t zfAggSendBar(zdev_t* dev, TID_TX tid_tx, struct aggBarControl *aggBarControl);
415 u16_t zfAggSetBarBody(zdev_t* dev, zbuf_t* buf, u16_t offset, TID_TX tid_tx, struct aggBarControl *aggBarControl);
416 u16_t zfAggGenBarHeader(zdev_t* dev, u16_t* dst,
417 u16_t* header, u16_t len, zbuf_t* buf, u16_t vap, u8_t encrypt);
418
419 #ifndef ZM_ENABLE_FW_BA_RETRANSMISSION //disable BAW
420 /* BAW BA retransmission */
421 void zfBawCore(zdev_t* dev, u16_t baw_seq, u32_t bitmap, u16_t aggLen);
422 void zfBawInit(zdev_t* dev);
423 TID_BAW zfBawGetNewQ(zdev_t* dev, u16_t start_seq, TID_TX tid_tx);
424 u16_t zfBawInsert(zdev_t* dev, zbuf_t* buf, u16_t baw_seq, TID_BAW tid_baw, u8_t baw_retransmit, struct baw_header_r *header_r);
425 struct bufInfo* zfBawPop(zdev_t* dev, u16_t index, TID_BAW tid_baw);
426 void zfBawEnable(zdev_t* dev, TID_BAW tid_baw, u16_t start_seq);
427 void zfBawDisable(zdev_t* dev, TID_BAW tid_baw);
428 TID_BAW zfBawGetQ(zdev_t* dev, u16_t baw_seq);
429 void zfAggTxRetransmit(zdev_t* dev, struct bufInfo *buf_info, struct aggControl *aggControl, TID_TX tid_tx);
430 #endif
431 /* extern functions */
432 extern zbuf_t* zfGetVtxq(zdev_t* dev, u8_t ac);
433
434 #endif /* #ifndef _CAGG_H */
435