Index: chromeos/drivers/ath6kl/reorder/aggr_rx_internal.h |
diff --git a/chromeos/drivers/ath6kl/reorder/aggr_rx_internal.h b/chromeos/drivers/ath6kl/reorder/aggr_rx_internal.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..567a3ff185ca9eb00b8fcd3385945355a5cb239e |
--- /dev/null |
+++ b/chromeos/drivers/ath6kl/reorder/aggr_rx_internal.h |
@@ -0,0 +1,112 @@ |
+/* |
+ * |
+ * Copyright (c) 2004-2007 Atheros Communications Inc. |
+ * All rights reserved. |
+ * |
+ * |
+// This program is free software; you can redistribute it and/or modify |
+// it under the terms of the GNU General Public License version 2 as |
+// published by the Free Software Foundation; |
+// |
+// Software distributed under the License is distributed on an "AS |
+// IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or |
+// implied. See the License for the specific language governing |
+// rights and limitations under the License. |
+// |
+// |
+ * |
+ */ |
+ |
+#ifndef __AGGR_RX_INTERNAL_H__ |
+#define __AGGR_RX_INTERNAL_H__ |
+ |
+#include "a_osapi.h" |
+#include "aggr_recv_api.h" |
+ |
+#define AGGR_WIN_IDX(x, y) ((x) % (y)) |
+#define AGGR_INCR_IDX(x, y) AGGR_WIN_IDX(((x)+1), (y)) |
+#define AGGR_DCRM_IDX(x, y) AGGR_WIN_IDX(((x)-1), (y)) |
+#define IEEE80211_MAX_SEQ_NO 0xFFF |
+#define IEEE80211_NEXT_SEQ_NO(x) (((x) + 1) & IEEE80211_MAX_SEQ_NO) |
+ |
+ |
+#define NUM_OF_TIDS 8 |
+#define AGGR_SZ_DEFAULT 8 |
+ |
+#define AGGR_WIN_SZ_MIN 2 |
+#define AGGR_WIN_SZ_MAX 8 |
+/* TID Window sz is double of what is negotiated. Derive TID_WINDOW_SZ from win_sz, per tid */ |
+#define TID_WINDOW_SZ(_x) ((_x) << 1) |
+ |
+#define AGGR_NUM_OF_FREE_NETBUFS 16 |
+ |
+#define AGGR_GET_RXTID_STATS(_p, _x) (&(_p->stat[(_x)])) |
+#define AGGR_GET_RXTID(_p, _x) (&(_p->RxTid[(_x)])) |
+ |
+/* Hold q is a function of win_sz, which is negotiated per tid */ |
+#define HOLD_Q_SZ(_x) (TID_WINDOW_SZ((_x))*sizeof(OSBUF_HOLD_Q)) |
+/* AGGR_RX_TIMEOUT value is important as a (too) small value can cause frames to be |
+ * delivered out of order and a (too) large value can cause undesirable latency in |
+ * certain situations. */ |
+#define AGGR_RX_TIMEOUT 400 /* Timeout(in ms) for delivery of frames, if they are stuck */ |
+ |
+typedef enum { |
+ ALL_SEQNO = 0, |
+ CONTIGUOUS_SEQNO = 1, |
+}DELIVERY_ORDER; |
+ |
+typedef struct { |
+ void *osbuf; |
+ A_BOOL is_amsdu; |
+ A_UINT16 seq_no; |
+}OSBUF_HOLD_Q; |
+ |
+ |
+#if 0 |
+typedef struct { |
+ A_UINT16 seqno_st; |
+ A_UINT16 seqno_end; |
+}WINDOW_SNAPSHOT; |
+#endif |
+ |
+typedef struct { |
+ A_BOOL aggr; /* is it ON or OFF */ |
+ A_BOOL progress; /* TRUE when frames have arrived after a timer start */ |
+ A_BOOL timerMon; /* TRUE if the timer started for the sake of this TID */ |
+ A_UINT16 win_sz; /* negotiated window size */ |
+ A_UINT16 seq_next; /* Next seq no, in current window */ |
+ A_UINT32 hold_q_sz; /* Num of frames that can be held in hold q */ |
+ OSBUF_HOLD_Q *hold_q; /* Hold q for re-order */ |
+#if 0 |
+ WINDOW_SNAPSHOT old_win; /* Sliding window snapshot - for timeout */ |
+#endif |
+ A_NETBUF_QUEUE_T q; /* q head for enqueuing frames for dispatch */ |
+ A_MUTEX_T lock; |
+}RXTID; |
+ |
+typedef struct { |
+ A_UINT32 num_into_aggr; /* hitting at the input of this module */ |
+ A_UINT32 num_dups; /* duplicate */ |
+ A_UINT32 num_oow; /* out of window */ |
+ A_UINT32 num_mpdu; /* single payload 802.3/802.11 frame */ |
+ A_UINT32 num_amsdu; /* AMSDU */ |
+ A_UINT32 num_delivered; /* frames delivered to IP stack */ |
+ A_UINT32 num_timeouts; /* num of timeouts, during which frames delivered */ |
+ A_UINT32 num_hole; /* frame not present, when window moved over */ |
+ A_UINT32 num_bar; /* num of resets of seq_num, via BAR */ |
+}RXTID_STATS; |
+ |
+typedef struct { |
+ A_UINT8 aggr_sz; /* config value of aggregation size */ |
+ A_UINT8 timerScheduled; |
+ A_TIMER timer; /* timer for returning held up pkts in re-order que */ |
+ void *dev; /* dev handle */ |
+ RX_CALLBACK rx_fn; /* callback function to return frames; to upper layer */ |
+ RXTID RxTid[NUM_OF_TIDS]; /* Per tid window */ |
+ ALLOC_NETBUFS netbuf_allocator; /* OS netbuf alloc fn */ |
+ A_NETBUF_QUEUE_T freeQ; /* pre-allocated buffers - for A_MSDU slicing */ |
+ RXTID_STATS stat[NUM_OF_TIDS]; /* Tid based statistics */ |
+ PACKET_LOG pkt_log; /* Log info of the packets */ |
+}AGGR_INFO; |
+ |
+#endif /* __AGGR_RX_INTERNAL_H__ */ |