2 * Copyright (c) 2007-2008 Atheros Communications Inc.
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.
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.
17 /* Module Name : cagg.h */
20 /* This module contains A-MPDU aggregation relatived functions. */
25 /****************************************************************************/
26 /*Revision History: */
28 /* -------- -------- ----------------------------------------------*/
30 /* Honda 12-4-06 created */
32 /****************************************************************************/
39 * the aggregation functions flag, 0 if don't do aggregate
42 #define ZM_AGG_FPGA_DEBUG 1
43 #define ZM_AGG_FPGA_REORDERING 1
46 //#define ZM_AGG_TALLY
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
61 * number of access categories (ac)
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
69 #define ZM_AGG_CLEAR_TIME 10
71 * delete the queue if idle for ZM_DELETE_TIME
74 #define ZM_AGG_DELETE_TIME 10000
77 * block ack window size
79 #define ZM_AGG_BAW_SIZE 64
80 #define ZM_AGG_BAW_MASK (ZM_AGG_BAW_SIZE-1)
82 * originator ADDBA Resquest receiver
83 * |----------------------------->|
85 * |<-----------------------------|
86 * 2| ADDBA Response |2
87 * |<-----------------------------|
89 * |----------------------------->|
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
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
102 * end of Aggregate control
105 #define TID_TX struct aggQueue*
106 #define TID_BAW struct baw_q*
107 #define BAW wd->baw_enabler
108 #define DESTQ wd->destQ
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))
121 /* don't change AGG_MIN_TXQL easily, this might cause BAW BSOD */
122 #define AGG_MIN_TXQL 2
124 * consider tcp,udp,ac(1234)
126 #define zm_agg_dynamic_threshold(dev, ar) ((ar > 16)? 11: \
130 #define zm_agg_weight(ac) ((3 == ac)? 4: \
134 * the required free queue ratio per ac
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))
142 //#define zm_agg_ratio(ac) 3
144 * end of Queue access
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);}
155 #ifndef ZM_ENABLE_FW_BA_RETRANSMISSION //disable BAW
156 struct baw_header_r
{
168 u16_t header
[29];//[(8+30+2+18)/2]; 58 bytes /* ctr+(4+a1+a2+a3+2+a4)+qos+iv */
170 u16_t mic
[4]; //[8/2]; 8 bytes
172 u16_t snap
[4]; //[8/2]; 8 bytes
182 struct baw_header
*baw_header
;
190 struct zsAdditionInfo addInfo
;
191 //struct baw_header baw_header;
195 #ifndef ZM_ENABLE_FW_BA_RETRANSMISSION //disable BAW
202 struct baw_header baw_header
;
206 struct baw_buf frame
[ZM_VTXQ_SIZE
];
214 //struct baw_header *baw_header;
219 struct baw_q tid_baw
[ZM_BAW_POOL_SIZE
];
221 void (*core
)(zdev_t
* dev
, u16_t baw_seq
, u32_t bitmap
, u16_t aggLen
);
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
);
235 struct aggElement aggvtxq
[ZM_AGGQ_SIZE
];
248 u16_t bar_ssn
; /* starting sequence number in BAR */
250 u16_t complete
; /* complete indication pointer */
257 u16_t aggFlag
[ZM_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 */
278 u16_t ampduIndication
;
279 u16_t addbaIndication
;
284 struct aggBaFrameParameter
299 u16_t bar_ack_policy
;
301 u16_t compressed_bitmap
;
307 u32_t got_packets_sum
;
309 u32_t sent_packets_sum
;
310 u32_t sent_bytes_sum
;
311 u32_t avg_got_packets
;
313 u32_t avg_sent_packets
;
314 u32_t avg_sent_bytes
;
321 u16_t Qtype
: 1; /* 0 aggr, 1 vtxq */
327 struct dest
* Head
[4];
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);
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
);
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
);
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
);
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
);
378 * end of aggregation rx
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
);
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
);
404 * statistics functions
406 u16_t
zfAggTallyReset(zdev_t
* dev
);
408 u16_t
zfAggPrintTally(zdev_t
* dev
);
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
);
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
);
431 /* extern functions */
432 extern zbuf_t
* zfGetVtxq(zdev_t
* dev
, u8_t ac
);
434 #endif /* #ifndef _CAGG_H */