diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2008-08-08 14:15:23 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-08-08 14:15:23 -0400 |
commit | f2d7499be1b1fe1cd8a5e6a01c1f44173894a241 (patch) | |
tree | 64d341a90d8cb831a5097e365d303367906f1373 /drivers/net/wireless/ath9k/core.h | |
parent | 8d659f5e43c5db2630e85f507b7384365e9e1c1e (diff) | |
parent | 76aab2c1eae491a5d73ac83deec97dd28ebac584 (diff) |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6: (99 commits)
pkt_sched: Fix actions referencing
bnx2x: fix logical op
tcp: (whitespace only) fix confusing indentation
pkt_sched: Fix qdisc config when link is down.
[Bluetooth] Add full quirk implementation for btusb driver
[Bluetooth] Removal of unnecessary ignore module parameter
[Bluetooth] Add parameters to control BNEP header compression
ath9k: Revamp wireless mode usage
ath9k: More unused macros
ath9k: Remove a few unused macros and fix indentation
ath9k: Use mac80211's band macros and remove enum hal_freq_band
ath9k: Remove redundant data structure ath9k_txq_info
ath9k: Cleanup data structures related to HW capabilities
ath9k: work around gcc ICEs
ath9k: Add new Atheros IEEE 802.11n driver
ath5k: remove Atheros 11n devices from supported list
list.h: add list_cut_position()
list.h: Add list_splice_tail() and list_splice_tail_init()
p54: swap short slot time dcf values
rt2x00: Block all unsupported modes
...
Diffstat (limited to 'drivers/net/wireless/ath9k/core.h')
-rw-r--r-- | drivers/net/wireless/ath9k/core.h | 1072 |
1 files changed, 1072 insertions, 0 deletions
diff --git a/drivers/net/wireless/ath9k/core.h b/drivers/net/wireless/ath9k/core.h new file mode 100644 index 000000000000..673b3d81133a --- /dev/null +++ b/drivers/net/wireless/ath9k/core.h | |||
@@ -0,0 +1,1072 @@ | |||
1 | /* | ||
2 | * Copyright (c) 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 | #ifndef CORE_H | ||
18 | #define CORE_H | ||
19 | |||
20 | #include <linux/version.h> | ||
21 | #include <linux/autoconf.h> | ||
22 | #include <linux/kernel.h> | ||
23 | #include <linux/module.h> | ||
24 | #include <linux/spinlock.h> | ||
25 | #include <linux/errno.h> | ||
26 | #include <linux/skbuff.h> | ||
27 | #include <linux/netdevice.h> | ||
28 | #include <linux/etherdevice.h> | ||
29 | #include <linux/ip.h> | ||
30 | #include <linux/tcp.h> | ||
31 | #include <linux/in.h> | ||
32 | #include <linux/delay.h> | ||
33 | #include <linux/wait.h> | ||
34 | #include <linux/pci.h> | ||
35 | #include <linux/interrupt.h> | ||
36 | #include <linux/sched.h> | ||
37 | #include <linux/list.h> | ||
38 | #include <asm/byteorder.h> | ||
39 | #include <linux/scatterlist.h> | ||
40 | #include <asm/page.h> | ||
41 | #include <net/mac80211.h> | ||
42 | |||
43 | #include "ath9k.h" | ||
44 | #include "rc.h" | ||
45 | |||
46 | struct ath_node; | ||
47 | |||
48 | /******************/ | ||
49 | /* Utility macros */ | ||
50 | /******************/ | ||
51 | |||
52 | /* Macro to expand scalars to 64-bit objects */ | ||
53 | |||
54 | #define ito64(x) (sizeof(x) == 8) ? \ | ||
55 | (((unsigned long long int)(x)) & (0xff)) : \ | ||
56 | (sizeof(x) == 16) ? \ | ||
57 | (((unsigned long long int)(x)) & 0xffff) : \ | ||
58 | ((sizeof(x) == 32) ? \ | ||
59 | (((unsigned long long int)(x)) & 0xffffffff) : \ | ||
60 | (unsigned long long int)(x)) | ||
61 | |||
62 | /* increment with wrap-around */ | ||
63 | #define INCR(_l, _sz) do { \ | ||
64 | (_l)++; \ | ||
65 | (_l) &= ((_sz) - 1); \ | ||
66 | } while (0) | ||
67 | |||
68 | /* decrement with wrap-around */ | ||
69 | #define DECR(_l, _sz) do { \ | ||
70 | (_l)--; \ | ||
71 | (_l) &= ((_sz) - 1); \ | ||
72 | } while (0) | ||
73 | |||
74 | #define A_MAX(a, b) ((a) > (b) ? (a) : (b)) | ||
75 | |||
76 | #define ASSERT(exp) do { \ | ||
77 | if (unlikely(!(exp))) { \ | ||
78 | BUG(); \ | ||
79 | } \ | ||
80 | } while (0) | ||
81 | |||
82 | /* XXX: remove */ | ||
83 | #define memzero(_buf, _len) memset(_buf, 0, _len) | ||
84 | |||
85 | #define get_dma_mem_context(var, field) (&((var)->field)) | ||
86 | #define copy_dma_mem_context(dst, src) (*dst = *src) | ||
87 | |||
88 | #define ATH9K_BH_STATUS_INTACT 0 | ||
89 | #define ATH9K_BH_STATUS_CHANGE 1 | ||
90 | |||
91 | #define ATH_TXQ_SETUP(sc, i) ((sc)->sc_txqsetup & (1<<i)) | ||
92 | |||
93 | static inline unsigned long get_timestamp(void) | ||
94 | { | ||
95 | return ((jiffies / HZ) * 1000) + (jiffies % HZ) * (1000 / HZ); | ||
96 | } | ||
97 | |||
98 | /*************/ | ||
99 | /* Debugging */ | ||
100 | /*************/ | ||
101 | |||
102 | enum ATH_DEBUG { | ||
103 | ATH_DBG_RESET = 0x00000001, | ||
104 | ATH_DBG_PHY_IO = 0x00000002, | ||
105 | ATH_DBG_REG_IO = 0x00000004, | ||
106 | ATH_DBG_QUEUE = 0x00000008, | ||
107 | ATH_DBG_EEPROM = 0x00000010, | ||
108 | ATH_DBG_NF_CAL = 0x00000020, | ||
109 | ATH_DBG_CALIBRATE = 0x00000040, | ||
110 | ATH_DBG_CHANNEL = 0x00000080, | ||
111 | ATH_DBG_INTERRUPT = 0x00000100, | ||
112 | ATH_DBG_REGULATORY = 0x00000200, | ||
113 | ATH_DBG_ANI = 0x00000400, | ||
114 | ATH_DBG_POWER_MGMT = 0x00000800, | ||
115 | ATH_DBG_XMIT = 0x00001000, | ||
116 | ATH_DBG_BEACON = 0x00002000, | ||
117 | ATH_DBG_RATE = 0x00004000, | ||
118 | ATH_DBG_CONFIG = 0x00008000, | ||
119 | ATH_DBG_KEYCACHE = 0x00010000, | ||
120 | ATH_DBG_AGGR = 0x00020000, | ||
121 | ATH_DBG_FATAL = 0x00040000, | ||
122 | ATH_DBG_ANY = 0xffffffff | ||
123 | }; | ||
124 | |||
125 | #define DBG_DEFAULT (ATH_DBG_FATAL) | ||
126 | |||
127 | #define DPRINTF(sc, _m, _fmt, ...) do { \ | ||
128 | if (sc->sc_debug & (_m)) \ | ||
129 | printk(_fmt , ##__VA_ARGS__); \ | ||
130 | } while (0) | ||
131 | |||
132 | /***************************/ | ||
133 | /* Load-time Configuration */ | ||
134 | /***************************/ | ||
135 | |||
136 | /* Per-instance load-time (note: NOT run-time) configurations | ||
137 | * for Atheros Device */ | ||
138 | struct ath_config { | ||
139 | u32 ath_aggr_prot; | ||
140 | u16 txpowlimit; | ||
141 | u16 txpowlimit_override; | ||
142 | u8 cabqReadytime; /* Cabq Readytime % */ | ||
143 | u8 swBeaconProcess; /* Process received beacons in SW (vs HW) */ | ||
144 | }; | ||
145 | |||
146 | /***********************/ | ||
147 | /* Chainmask Selection */ | ||
148 | /***********************/ | ||
149 | |||
150 | #define ATH_CHAINMASK_SEL_TIMEOUT 6000 | ||
151 | /* Default - Number of last RSSI values that is used for | ||
152 | * chainmask selection */ | ||
153 | #define ATH_CHAINMASK_SEL_RSSI_CNT 10 | ||
154 | /* Means use 3x3 chainmask instead of configured chainmask */ | ||
155 | #define ATH_CHAINMASK_SEL_3X3 7 | ||
156 | /* Default - Rssi threshold below which we have to switch to 3x3 */ | ||
157 | #define ATH_CHAINMASK_SEL_UP_RSSI_THRES 20 | ||
158 | /* Default - Rssi threshold above which we have to switch to | ||
159 | * user configured values */ | ||
160 | #define ATH_CHAINMASK_SEL_DOWN_RSSI_THRES 35 | ||
161 | /* Struct to store the chainmask select related info */ | ||
162 | struct ath_chainmask_sel { | ||
163 | struct timer_list timer; | ||
164 | int cur_tx_mask; /* user configured or 3x3 */ | ||
165 | int cur_rx_mask; /* user configured or 3x3 */ | ||
166 | int tx_avgrssi; | ||
167 | u8 switch_allowed:1, /* timer will set this */ | ||
168 | cm_sel_enabled : 1; | ||
169 | }; | ||
170 | |||
171 | int ath_chainmask_sel_logic(struct ath_softc *sc, struct ath_node *an); | ||
172 | void ath_update_chainmask(struct ath_softc *sc, int is_ht); | ||
173 | |||
174 | /*************************/ | ||
175 | /* Descriptor Management */ | ||
176 | /*************************/ | ||
177 | |||
178 | /* Number of descriptors per buffer. The only case where we see skbuff | ||
179 | chains is due to FF aggregation in the driver. */ | ||
180 | #define ATH_TXDESC 1 | ||
181 | /* if there's more fragment for this MSDU */ | ||
182 | #define ATH_BF_MORE_MPDU 1 | ||
183 | #define ATH_TXBUF_RESET(_bf) do { \ | ||
184 | (_bf)->bf_status = 0; \ | ||
185 | (_bf)->bf_lastbf = NULL; \ | ||
186 | (_bf)->bf_lastfrm = NULL; \ | ||
187 | (_bf)->bf_next = NULL; \ | ||
188 | memzero(&((_bf)->bf_state), \ | ||
189 | sizeof(struct ath_buf_state)); \ | ||
190 | } while (0) | ||
191 | |||
192 | struct ath_buf_state { | ||
193 | int bfs_nframes; /* # frames in aggregate */ | ||
194 | u16 bfs_al; /* length of aggregate */ | ||
195 | u16 bfs_frmlen; /* length of frame */ | ||
196 | int bfs_seqno; /* sequence number */ | ||
197 | int bfs_tidno; /* tid of this frame */ | ||
198 | int bfs_retries; /* current retries */ | ||
199 | struct ath_rc_series bfs_rcs[4]; /* rate series */ | ||
200 | u8 bfs_isdata:1; /* is a data frame/aggregate */ | ||
201 | u8 bfs_isaggr:1; /* is an aggregate */ | ||
202 | u8 bfs_isampdu:1; /* is an a-mpdu, aggregate or not */ | ||
203 | u8 bfs_ht:1; /* is an HT frame */ | ||
204 | u8 bfs_isretried:1; /* is retried */ | ||
205 | u8 bfs_isxretried:1; /* is excessive retried */ | ||
206 | u8 bfs_shpreamble:1; /* is short preamble */ | ||
207 | u8 bfs_isbar:1; /* is a BAR */ | ||
208 | u8 bfs_ispspoll:1; /* is a PS-Poll */ | ||
209 | u8 bfs_aggrburst:1; /* is a aggr burst */ | ||
210 | u8 bfs_calcairtime:1; /* requests airtime be calculated | ||
211 | when set for tx frame */ | ||
212 | int bfs_rifsburst_elem; /* RIFS burst/bar */ | ||
213 | int bfs_nrifsubframes; /* # of elements in burst */ | ||
214 | /* key type use to encrypt this frame */ | ||
215 | enum ath9k_key_type bfs_keytype; | ||
216 | }; | ||
217 | |||
218 | #define bf_nframes bf_state.bfs_nframes | ||
219 | #define bf_al bf_state.bfs_al | ||
220 | #define bf_frmlen bf_state.bfs_frmlen | ||
221 | #define bf_retries bf_state.bfs_retries | ||
222 | #define bf_seqno bf_state.bfs_seqno | ||
223 | #define bf_tidno bf_state.bfs_tidno | ||
224 | #define bf_rcs bf_state.bfs_rcs | ||
225 | #define bf_isdata bf_state.bfs_isdata | ||
226 | #define bf_isaggr bf_state.bfs_isaggr | ||
227 | #define bf_isampdu bf_state.bfs_isampdu | ||
228 | #define bf_ht bf_state.bfs_ht | ||
229 | #define bf_isretried bf_state.bfs_isretried | ||
230 | #define bf_isxretried bf_state.bfs_isxretried | ||
231 | #define bf_shpreamble bf_state.bfs_shpreamble | ||
232 | #define bf_rifsburst_elem bf_state.bfs_rifsburst_elem | ||
233 | #define bf_nrifsubframes bf_state.bfs_nrifsubframes | ||
234 | #define bf_keytype bf_state.bfs_keytype | ||
235 | #define bf_isbar bf_state.bfs_isbar | ||
236 | #define bf_ispspoll bf_state.bfs_ispspoll | ||
237 | #define bf_aggrburst bf_state.bfs_aggrburst | ||
238 | #define bf_calcairtime bf_state.bfs_calcairtime | ||
239 | |||
240 | /* | ||
241 | * Abstraction of a contiguous buffer to transmit/receive. There is only | ||
242 | * a single hw descriptor encapsulated here. | ||
243 | */ | ||
244 | |||
245 | struct ath_buf { | ||
246 | struct list_head list; | ||
247 | struct list_head *last; | ||
248 | struct ath_buf *bf_lastbf; /* last buf of this unit (a frame or | ||
249 | an aggregate) */ | ||
250 | struct ath_buf *bf_lastfrm; /* last buf of this frame */ | ||
251 | struct ath_buf *bf_next; /* next subframe in the aggregate */ | ||
252 | struct ath_buf *bf_rifslast; /* last buf for RIFS burst */ | ||
253 | void *bf_mpdu; /* enclosing frame structure */ | ||
254 | void *bf_node; /* pointer to the node */ | ||
255 | struct ath_desc *bf_desc; /* virtual addr of desc */ | ||
256 | dma_addr_t bf_daddr; /* physical addr of desc */ | ||
257 | dma_addr_t bf_buf_addr; /* physical addr of data buffer */ | ||
258 | u32 bf_status; | ||
259 | u16 bf_flags; /* tx descriptor flags */ | ||
260 | struct ath_buf_state bf_state; /* buffer state */ | ||
261 | dma_addr_t bf_dmacontext; | ||
262 | }; | ||
263 | |||
264 | /* | ||
265 | * reset the rx buffer. | ||
266 | * any new fields added to the athbuf and require | ||
267 | * reset need to be added to this macro. | ||
268 | * currently bf_status is the only one requires that | ||
269 | * requires reset. | ||
270 | */ | ||
271 | #define ATH_RXBUF_RESET(_bf) ((_bf)->bf_status = 0) | ||
272 | |||
273 | /* hw processing complete, desc processed by hal */ | ||
274 | #define ATH_BUFSTATUS_DONE 0x00000001 | ||
275 | /* hw processing complete, desc hold for hw */ | ||
276 | #define ATH_BUFSTATUS_STALE 0x00000002 | ||
277 | /* Rx-only: OS is done with this packet and it's ok to queued it to hw */ | ||
278 | #define ATH_BUFSTATUS_FREE 0x00000004 | ||
279 | |||
280 | /* DMA state for tx/rx descriptors */ | ||
281 | |||
282 | struct ath_descdma { | ||
283 | const char *dd_name; | ||
284 | struct ath_desc *dd_desc; /* descriptors */ | ||
285 | dma_addr_t dd_desc_paddr; /* physical addr of dd_desc */ | ||
286 | u32 dd_desc_len; /* size of dd_desc */ | ||
287 | struct ath_buf *dd_bufptr; /* associated buffers */ | ||
288 | dma_addr_t dd_dmacontext; | ||
289 | }; | ||
290 | |||
291 | /* Abstraction of a received RX MPDU/MMPDU, or a RX fragment */ | ||
292 | |||
293 | struct ath_rx_context { | ||
294 | struct ath_buf *ctx_rxbuf; /* associated ath_buf for rx */ | ||
295 | }; | ||
296 | #define ATH_RX_CONTEXT(skb) ((struct ath_rx_context *)skb->cb) | ||
297 | |||
298 | int ath_descdma_setup(struct ath_softc *sc, | ||
299 | struct ath_descdma *dd, | ||
300 | struct list_head *head, | ||
301 | const char *name, | ||
302 | int nbuf, | ||
303 | int ndesc); | ||
304 | int ath_desc_alloc(struct ath_softc *sc); | ||
305 | void ath_desc_free(struct ath_softc *sc); | ||
306 | void ath_descdma_cleanup(struct ath_softc *sc, | ||
307 | struct ath_descdma *dd, | ||
308 | struct list_head *head); | ||
309 | |||
310 | /******/ | ||
311 | /* RX */ | ||
312 | /******/ | ||
313 | |||
314 | #define ATH_MAX_ANTENNA 3 | ||
315 | #define ATH_RXBUF 512 | ||
316 | #define ATH_RX_TIMEOUT 40 /* 40 milliseconds */ | ||
317 | #define WME_NUM_TID 16 | ||
318 | #define IEEE80211_BAR_CTL_TID_M 0xF000 /* tid mask */ | ||
319 | #define IEEE80211_BAR_CTL_TID_S 2 /* tid shift */ | ||
320 | |||
321 | enum ATH_RX_TYPE { | ||
322 | ATH_RX_NON_CONSUMED = 0, | ||
323 | ATH_RX_CONSUMED | ||
324 | }; | ||
325 | |||
326 | /* per frame rx status block */ | ||
327 | struct ath_recv_status { | ||
328 | u64 tsf; /* mac tsf */ | ||
329 | int8_t rssi; /* RSSI (noise floor ajusted) */ | ||
330 | int8_t rssictl[ATH_MAX_ANTENNA]; /* RSSI (noise floor ajusted) */ | ||
331 | int8_t rssiextn[ATH_MAX_ANTENNA]; /* RSSI (noise floor ajusted) */ | ||
332 | int8_t abs_rssi; /* absolute RSSI */ | ||
333 | u8 rateieee; /* data rate received (IEEE rate code) */ | ||
334 | u8 ratecode; /* phy rate code */ | ||
335 | int rateKbps; /* data rate received (Kbps) */ | ||
336 | int antenna; /* rx antenna */ | ||
337 | int flags; /* status of associated skb */ | ||
338 | #define ATH_RX_FCS_ERROR 0x01 | ||
339 | #define ATH_RX_MIC_ERROR 0x02 | ||
340 | #define ATH_RX_DECRYPT_ERROR 0x04 | ||
341 | #define ATH_RX_RSSI_VALID 0x08 | ||
342 | /* if any of ctl,extn chainrssis are valid */ | ||
343 | #define ATH_RX_CHAIN_RSSI_VALID 0x10 | ||
344 | /* if extn chain rssis are valid */ | ||
345 | #define ATH_RX_RSSI_EXTN_VALID 0x20 | ||
346 | /* set if 40Mhz, clear if 20Mhz */ | ||
347 | #define ATH_RX_40MHZ 0x40 | ||
348 | /* set if short GI, clear if full GI */ | ||
349 | #define ATH_RX_SHORT_GI 0x80 | ||
350 | }; | ||
351 | |||
352 | struct ath_rxbuf { | ||
353 | struct sk_buff *rx_wbuf; | ||
354 | unsigned long rx_time; /* system time when received */ | ||
355 | struct ath_recv_status rx_status; /* cached rx status */ | ||
356 | }; | ||
357 | |||
358 | /* Per-TID aggregate receiver state for a node */ | ||
359 | struct ath_arx_tid { | ||
360 | struct ath_node *an; | ||
361 | struct ath_rxbuf *rxbuf; /* re-ordering buffer */ | ||
362 | struct timer_list timer; | ||
363 | spinlock_t tidlock; | ||
364 | int baw_head; /* seq_next at head */ | ||
365 | int baw_tail; /* tail of block-ack window */ | ||
366 | int seq_reset; /* need to reset start sequence */ | ||
367 | int addba_exchangecomplete; | ||
368 | u16 seq_next; /* next expected sequence */ | ||
369 | u16 baw_size; /* block-ack window size */ | ||
370 | }; | ||
371 | |||
372 | /* Per-node receiver aggregate state */ | ||
373 | struct ath_arx { | ||
374 | struct ath_arx_tid tid[WME_NUM_TID]; | ||
375 | }; | ||
376 | |||
377 | int ath_startrecv(struct ath_softc *sc); | ||
378 | bool ath_stoprecv(struct ath_softc *sc); | ||
379 | void ath_flushrecv(struct ath_softc *sc); | ||
380 | u32 ath_calcrxfilter(struct ath_softc *sc); | ||
381 | void ath_rx_node_init(struct ath_softc *sc, struct ath_node *an); | ||
382 | void ath_rx_node_free(struct ath_softc *sc, struct ath_node *an); | ||
383 | void ath_rx_node_cleanup(struct ath_softc *sc, struct ath_node *an); | ||
384 | void ath_handle_rx_intr(struct ath_softc *sc); | ||
385 | int ath_rx_init(struct ath_softc *sc, int nbufs); | ||
386 | void ath_rx_cleanup(struct ath_softc *sc); | ||
387 | int ath_rx_tasklet(struct ath_softc *sc, int flush); | ||
388 | int ath_rx_input(struct ath_softc *sc, | ||
389 | struct ath_node *node, | ||
390 | int is_ampdu, | ||
391 | struct sk_buff *skb, | ||
392 | struct ath_recv_status *rx_status, | ||
393 | enum ATH_RX_TYPE *status); | ||
394 | int ath__rx_indicate(struct ath_softc *sc, | ||
395 | struct sk_buff *skb, | ||
396 | struct ath_recv_status *status, | ||
397 | u16 keyix); | ||
398 | int ath_rx_subframe(struct ath_node *an, struct sk_buff *skb, | ||
399 | struct ath_recv_status *status); | ||
400 | |||
401 | /******/ | ||
402 | /* TX */ | ||
403 | /******/ | ||
404 | |||
405 | #define ATH_FRAG_PER_MSDU 1 | ||
406 | #define ATH_TXBUF (512/ATH_FRAG_PER_MSDU) | ||
407 | /* max number of transmit attempts (tries) */ | ||
408 | #define ATH_TXMAXTRY 13 | ||
409 | /* max number of 11n transmit attempts (tries) */ | ||
410 | #define ATH_11N_TXMAXTRY 10 | ||
411 | /* max number of tries for management and control frames */ | ||
412 | #define ATH_MGT_TXMAXTRY 4 | ||
413 | #define WME_BA_BMP_SIZE 64 | ||
414 | #define WME_MAX_BA WME_BA_BMP_SIZE | ||
415 | #define ATH_TID_MAX_BUFS (2 * WME_MAX_BA) | ||
416 | #define TID_TO_WME_AC(_tid) \ | ||
417 | ((((_tid) == 0) || ((_tid) == 3)) ? WME_AC_BE : \ | ||
418 | (((_tid) == 1) || ((_tid) == 2)) ? WME_AC_BK : \ | ||
419 | (((_tid) == 4) || ((_tid) == 5)) ? WME_AC_VI : \ | ||
420 | WME_AC_VO) | ||
421 | |||
422 | |||
423 | /* Wireless Multimedia Extension Defines */ | ||
424 | #define WME_AC_BE 0 /* best effort */ | ||
425 | #define WME_AC_BK 1 /* background */ | ||
426 | #define WME_AC_VI 2 /* video */ | ||
427 | #define WME_AC_VO 3 /* voice */ | ||
428 | #define WME_NUM_AC 4 | ||
429 | |||
430 | enum ATH_SM_PWRSAV{ | ||
431 | ATH_SM_ENABLE, | ||
432 | ATH_SM_PWRSAV_STATIC, | ||
433 | ATH_SM_PWRSAV_DYNAMIC, | ||
434 | }; | ||
435 | |||
436 | /* | ||
437 | * Data transmit queue state. One of these exists for each | ||
438 | * hardware transmit queue. Packets sent to us from above | ||
439 | * are assigned to queues based on their priority. Not all | ||
440 | * devices support a complete set of hardware transmit queues. | ||
441 | * For those devices the array sc_ac2q will map multiple | ||
442 | * priorities to fewer hardware queues (typically all to one | ||
443 | * hardware queue). | ||
444 | */ | ||
445 | struct ath_txq { | ||
446 | u32 axq_qnum; /* hardware q number */ | ||
447 | u32 *axq_link; /* link ptr in last TX desc */ | ||
448 | struct list_head axq_q; /* transmit queue */ | ||
449 | spinlock_t axq_lock; | ||
450 | unsigned long axq_lockflags; /* intr state when must cli */ | ||
451 | u32 axq_depth; /* queue depth */ | ||
452 | u8 axq_aggr_depth; /* aggregates queued */ | ||
453 | u32 axq_totalqueued; /* total ever queued */ | ||
454 | |||
455 | /* count to determine if descriptor should generate int on this txq. */ | ||
456 | u32 axq_intrcnt; | ||
457 | |||
458 | bool stopped; /* Is mac80211 queue stopped ? */ | ||
459 | struct ath_buf *axq_linkbuf; /* virtual addr of last buffer*/ | ||
460 | |||
461 | /* first desc of the last descriptor that contains CTS */ | ||
462 | struct ath_desc *axq_lastdsWithCTS; | ||
463 | |||
464 | /* final desc of the gating desc that determines whether | ||
465 | lastdsWithCTS has been DMA'ed or not */ | ||
466 | struct ath_desc *axq_gatingds; | ||
467 | |||
468 | struct list_head axq_acq; | ||
469 | }; | ||
470 | |||
471 | /* per TID aggregate tx state for a destination */ | ||
472 | struct ath_atx_tid { | ||
473 | struct list_head list; /* round-robin tid entry */ | ||
474 | struct list_head buf_q; /* pending buffers */ | ||
475 | struct ath_node *an; | ||
476 | struct ath_atx_ac *ac; | ||
477 | struct ath_buf *tx_buf[ATH_TID_MAX_BUFS]; /* active tx frames */ | ||
478 | u16 seq_start; | ||
479 | u16 seq_next; | ||
480 | u16 baw_size; | ||
481 | int tidno; | ||
482 | int baw_head; /* first un-acked tx buffer */ | ||
483 | int baw_tail; /* next unused tx buffer slot */ | ||
484 | int sched; | ||
485 | int paused; | ||
486 | int cleanup_inprogress; | ||
487 | u32 addba_exchangecomplete:1; | ||
488 | int32_t addba_exchangeinprogress; | ||
489 | int addba_exchangeattempts; | ||
490 | }; | ||
491 | |||
492 | /* per access-category aggregate tx state for a destination */ | ||
493 | struct ath_atx_ac { | ||
494 | int sched; /* dest-ac is scheduled */ | ||
495 | int qnum; /* H/W queue number associated | ||
496 | with this AC */ | ||
497 | struct list_head list; /* round-robin txq entry */ | ||
498 | struct list_head tid_q; /* queue of TIDs with buffers */ | ||
499 | }; | ||
500 | |||
501 | /* per dest tx state */ | ||
502 | struct ath_atx { | ||
503 | struct ath_atx_tid tid[WME_NUM_TID]; | ||
504 | struct ath_atx_ac ac[WME_NUM_AC]; | ||
505 | }; | ||
506 | |||
507 | /* per-frame tx control block */ | ||
508 | struct ath_tx_control { | ||
509 | struct ath_node *an; | ||
510 | int if_id; | ||
511 | int qnum; | ||
512 | u32 ht:1; | ||
513 | u32 ps:1; | ||
514 | u32 use_minrate:1; | ||
515 | enum ath9k_pkt_type atype; | ||
516 | enum ath9k_key_type keytype; | ||
517 | u32 flags; | ||
518 | u16 seqno; | ||
519 | u16 tidno; | ||
520 | u16 txpower; | ||
521 | u16 frmlen; | ||
522 | u32 keyix; | ||
523 | int min_rate; | ||
524 | int mcast_rate; | ||
525 | u16 nextfraglen; | ||
526 | struct ath_softc *dev; | ||
527 | dma_addr_t dmacontext; | ||
528 | }; | ||
529 | |||
530 | /* per frame tx status block */ | ||
531 | struct ath_xmit_status { | ||
532 | int retries; /* number of retries to successufully | ||
533 | transmit this frame */ | ||
534 | int flags; /* status of transmit */ | ||
535 | #define ATH_TX_ERROR 0x01 | ||
536 | #define ATH_TX_XRETRY 0x02 | ||
537 | #define ATH_TX_BAR 0x04 | ||
538 | }; | ||
539 | |||
540 | struct ath_tx_stat { | ||
541 | int rssi; /* RSSI (noise floor ajusted) */ | ||
542 | int rssictl[ATH_MAX_ANTENNA]; /* RSSI (noise floor ajusted) */ | ||
543 | int rssiextn[ATH_MAX_ANTENNA]; /* RSSI (noise floor ajusted) */ | ||
544 | int rateieee; /* data rate xmitted (IEEE rate code) */ | ||
545 | int rateKbps; /* data rate xmitted (Kbps) */ | ||
546 | int ratecode; /* phy rate code */ | ||
547 | int flags; /* validity flags */ | ||
548 | /* if any of ctl,extn chain rssis are valid */ | ||
549 | #define ATH_TX_CHAIN_RSSI_VALID 0x01 | ||
550 | /* if extn chain rssis are valid */ | ||
551 | #define ATH_TX_RSSI_EXTN_VALID 0x02 | ||
552 | u32 airtime; /* time on air per final tx rate */ | ||
553 | }; | ||
554 | |||
555 | struct ath_txq *ath_txq_setup(struct ath_softc *sc, int qtype, int subtype); | ||
556 | void ath_tx_cleanupq(struct ath_softc *sc, struct ath_txq *txq); | ||
557 | int ath_tx_setup(struct ath_softc *sc, int haltype); | ||
558 | void ath_draintxq(struct ath_softc *sc, bool retry_tx); | ||
559 | void ath_tx_draintxq(struct ath_softc *sc, | ||
560 | struct ath_txq *txq, bool retry_tx); | ||
561 | void ath_tx_node_init(struct ath_softc *sc, struct ath_node *an); | ||
562 | void ath_tx_node_cleanup(struct ath_softc *sc, | ||
563 | struct ath_node *an, bool bh_flag); | ||
564 | void ath_tx_node_free(struct ath_softc *sc, struct ath_node *an); | ||
565 | void ath_txq_schedule(struct ath_softc *sc, struct ath_txq *txq); | ||
566 | int ath_tx_init(struct ath_softc *sc, int nbufs); | ||
567 | int ath_tx_cleanup(struct ath_softc *sc); | ||
568 | int ath_tx_get_qnum(struct ath_softc *sc, int qtype, int haltype); | ||
569 | int ath_txq_update(struct ath_softc *sc, int qnum, | ||
570 | struct ath9k_tx_queue_info *q); | ||
571 | int ath_tx_start(struct ath_softc *sc, struct sk_buff *skb); | ||
572 | void ath_tx_tasklet(struct ath_softc *sc); | ||
573 | u32 ath_txq_depth(struct ath_softc *sc, int qnum); | ||
574 | u32 ath_txq_aggr_depth(struct ath_softc *sc, int qnum); | ||
575 | void ath_notify_txq_status(struct ath_softc *sc, u16 queue_depth); | ||
576 | void ath_tx_complete(struct ath_softc *sc, struct sk_buff *skb, | ||
577 | struct ath_xmit_status *tx_status, struct ath_node *an); | ||
578 | |||
579 | /**********************/ | ||
580 | /* Node / Aggregation */ | ||
581 | /**********************/ | ||
582 | |||
583 | /* indicates the node is clened up */ | ||
584 | #define ATH_NODE_CLEAN 0x1 | ||
585 | /* indicates the node is 80211 power save */ | ||
586 | #define ATH_NODE_PWRSAVE 0x2 | ||
587 | |||
588 | #define ADDBA_TIMEOUT 200 /* 200 milliseconds */ | ||
589 | #define ADDBA_EXCHANGE_ATTEMPTS 10 | ||
590 | #define ATH_AGGR_DELIM_SZ 4 /* delimiter size */ | ||
591 | #define ATH_AGGR_MINPLEN 256 /* in bytes, minimum packet length */ | ||
592 | /* number of delimiters for encryption padding */ | ||
593 | #define ATH_AGGR_ENCRYPTDELIM 10 | ||
594 | /* minimum h/w qdepth to be sustained to maximize aggregation */ | ||
595 | #define ATH_AGGR_MIN_QDEPTH 2 | ||
596 | #define ATH_AMPDU_SUBFRAME_DEFAULT 32 | ||
597 | #define IEEE80211_SEQ_SEQ_SHIFT 4 | ||
598 | #define IEEE80211_SEQ_MAX 4096 | ||
599 | #define IEEE80211_MIN_AMPDU_BUF 0x8 | ||
600 | |||
601 | /* return whether a bit at index _n in bitmap _bm is set | ||
602 | * _sz is the size of the bitmap */ | ||
603 | #define ATH_BA_ISSET(_bm, _n) (((_n) < (WME_BA_BMP_SIZE)) && \ | ||
604 | ((_bm)[(_n) >> 5] & (1 << ((_n) & 31)))) | ||
605 | |||
606 | /* return block-ack bitmap index given sequence and starting sequence */ | ||
607 | #define ATH_BA_INDEX(_st, _seq) (((_seq) - (_st)) & (IEEE80211_SEQ_MAX - 1)) | ||
608 | |||
609 | /* returns delimiter padding required given the packet length */ | ||
610 | #define ATH_AGGR_GET_NDELIM(_len) \ | ||
611 | (((((_len) + ATH_AGGR_DELIM_SZ) < ATH_AGGR_MINPLEN) ? \ | ||
612 | (ATH_AGGR_MINPLEN - (_len) - ATH_AGGR_DELIM_SZ) : 0) >> 2) | ||
613 | |||
614 | #define BAW_WITHIN(_start, _bawsz, _seqno) \ | ||
615 | ((((_seqno) - (_start)) & 4095) < (_bawsz)) | ||
616 | |||
617 | #define ATH_DS_BA_SEQ(_ds) ((_ds)->ds_us.tx.ts_seqnum) | ||
618 | #define ATH_DS_BA_BITMAP(_ds) (&(_ds)->ds_us.tx.ba_low) | ||
619 | #define ATH_DS_TX_BA(_ds) ((_ds)->ds_us.tx.ts_flags & ATH9K_TX_BA) | ||
620 | #define ATH_AN_2_TID(_an, _tidno) (&(_an)->an_aggr.tx.tid[(_tidno)]) | ||
621 | |||
622 | enum ATH_AGGR_STATUS { | ||
623 | ATH_AGGR_DONE, | ||
624 | ATH_AGGR_BAW_CLOSED, | ||
625 | ATH_AGGR_LIMITED, | ||
626 | ATH_AGGR_SHORTPKT, | ||
627 | ATH_AGGR_8K_LIMITED, | ||
628 | }; | ||
629 | |||
630 | enum ATH_AGGR_CHECK { | ||
631 | AGGR_NOT_REQUIRED, | ||
632 | AGGR_REQUIRED, | ||
633 | AGGR_CLEANUP_PROGRESS, | ||
634 | AGGR_EXCHANGE_PROGRESS, | ||
635 | AGGR_EXCHANGE_DONE | ||
636 | }; | ||
637 | |||
638 | struct aggr_rifs_param { | ||
639 | int param_max_frames; | ||
640 | int param_max_len; | ||
641 | int param_rl; | ||
642 | int param_al; | ||
643 | struct ath_rc_series *param_rcs; | ||
644 | }; | ||
645 | |||
646 | /* Per-node aggregation state */ | ||
647 | struct ath_node_aggr { | ||
648 | struct ath_atx tx; /* node transmit state */ | ||
649 | struct ath_arx rx; /* node receive state */ | ||
650 | }; | ||
651 | |||
652 | /* driver-specific node state */ | ||
653 | struct ath_node { | ||
654 | struct list_head list; | ||
655 | struct ath_softc *an_sc; | ||
656 | atomic_t an_refcnt; | ||
657 | struct ath_chainmask_sel an_chainmask_sel; | ||
658 | struct ath_node_aggr an_aggr; | ||
659 | u8 an_smmode; /* SM Power save mode */ | ||
660 | u8 an_flags; | ||
661 | u8 an_addr[ETH_ALEN]; | ||
662 | }; | ||
663 | |||
664 | void ath_tx_resume_tid(struct ath_softc *sc, | ||
665 | struct ath_atx_tid *tid); | ||
666 | enum ATH_AGGR_CHECK ath_tx_aggr_check(struct ath_softc *sc, | ||
667 | struct ath_node *an, u8 tidno); | ||
668 | void ath_tx_aggr_teardown(struct ath_softc *sc, | ||
669 | struct ath_node *an, u8 tidno); | ||
670 | void ath_rx_aggr_teardown(struct ath_softc *sc, | ||
671 | struct ath_node *an, u8 tidno); | ||
672 | int ath_rx_aggr_start(struct ath_softc *sc, | ||
673 | const u8 *addr, | ||
674 | u16 tid, | ||
675 | u16 *ssn); | ||
676 | int ath_rx_aggr_stop(struct ath_softc *sc, | ||
677 | const u8 *addr, | ||
678 | u16 tid); | ||
679 | int ath_tx_aggr_start(struct ath_softc *sc, | ||
680 | const u8 *addr, | ||
681 | u16 tid, | ||
682 | u16 *ssn); | ||
683 | int ath_tx_aggr_stop(struct ath_softc *sc, | ||
684 | const u8 *addr, | ||
685 | u16 tid); | ||
686 | void ath_newassoc(struct ath_softc *sc, | ||
687 | struct ath_node *node, int isnew, int isuapsd); | ||
688 | struct ath_node *ath_node_attach(struct ath_softc *sc, | ||
689 | u8 addr[ETH_ALEN], int if_id); | ||
690 | void ath_node_detach(struct ath_softc *sc, struct ath_node *an, bool bh_flag); | ||
691 | struct ath_node *ath_node_get(struct ath_softc *sc, u8 addr[ETH_ALEN]); | ||
692 | void ath_node_put(struct ath_softc *sc, struct ath_node *an, bool bh_flag); | ||
693 | struct ath_node *ath_node_find(struct ath_softc *sc, u8 *addr); | ||
694 | |||
695 | /*******************/ | ||
696 | /* Beacon Handling */ | ||
697 | /*******************/ | ||
698 | |||
699 | /* | ||
700 | * Regardless of the number of beacons we stagger, (i.e. regardless of the | ||
701 | * number of BSSIDs) if a given beacon does not go out even after waiting this | ||
702 | * number of beacon intervals, the game's up. | ||
703 | */ | ||
704 | #define BSTUCK_THRESH (9 * ATH_BCBUF) | ||
705 | #define ATH_BCBUF 4 /* number of beacon buffers */ | ||
706 | #define ATH_DEFAULT_BINTVAL 100 /* default beacon interval in TU */ | ||
707 | #define ATH_DEFAULT_BMISS_LIMIT 10 | ||
708 | #define ATH_BEACON_AIFS_DEFAULT 0 /* Default aifs for ap beacon q */ | ||
709 | #define ATH_BEACON_CWMIN_DEFAULT 0 /* Default cwmin for ap beacon q */ | ||
710 | #define ATH_BEACON_CWMAX_DEFAULT 0 /* Default cwmax for ap beacon q */ | ||
711 | #define IEEE80211_MS_TO_TU(x) (((x) * 1000) / 1024) | ||
712 | |||
713 | /* beacon configuration */ | ||
714 | struct ath_beacon_config { | ||
715 | u16 beacon_interval; | ||
716 | u16 listen_interval; | ||
717 | u16 dtim_period; | ||
718 | u16 bmiss_timeout; | ||
719 | u8 dtim_count; | ||
720 | u8 tim_offset; | ||
721 | union { | ||
722 | u64 last_tsf; | ||
723 | u8 last_tstamp[8]; | ||
724 | } u; /* last received beacon/probe response timestamp of this BSS. */ | ||
725 | }; | ||
726 | |||
727 | /* offsets in a beacon frame for | ||
728 | * quick acess of beacon content by low-level driver */ | ||
729 | struct ath_beacon_offset { | ||
730 | u8 *bo_tim; /* start of atim/dtim */ | ||
731 | }; | ||
732 | |||
733 | void ath9k_beacon_tasklet(unsigned long data); | ||
734 | void ath_beacon_config(struct ath_softc *sc, int if_id); | ||
735 | int ath_beaconq_setup(struct ath_hal *ah); | ||
736 | int ath_beacon_alloc(struct ath_softc *sc, int if_id); | ||
737 | void ath_bstuck_process(struct ath_softc *sc); | ||
738 | void ath_beacon_tasklet(struct ath_softc *sc, int *needmark); | ||
739 | void ath_beacon_free(struct ath_softc *sc); | ||
740 | void ath_beacon_return(struct ath_softc *sc, struct ath_vap *avp); | ||
741 | void ath_beacon_sync(struct ath_softc *sc, int if_id); | ||
742 | void ath_update_beacon_info(struct ath_softc *sc, int avgbrssi); | ||
743 | void ath_get_beaconconfig(struct ath_softc *sc, | ||
744 | int if_id, | ||
745 | struct ath_beacon_config *conf); | ||
746 | int ath_update_beacon(struct ath_softc *sc, | ||
747 | int if_id, | ||
748 | struct ath_beacon_offset *bo, | ||
749 | struct sk_buff *skb, | ||
750 | int mcast); | ||
751 | /********/ | ||
752 | /* VAPs */ | ||
753 | /********/ | ||
754 | |||
755 | /* | ||
756 | * Define the scheme that we select MAC address for multiple | ||
757 | * BSS on the same radio. The very first VAP will just use the MAC | ||
758 | * address from the EEPROM. For the next 3 VAPs, we set the | ||
759 | * U/L bit (bit 1) in MAC address, and use the next two bits as the | ||
760 | * index of the VAP. | ||
761 | */ | ||
762 | |||
763 | #define ATH_SET_VAP_BSSID_MASK(bssid_mask) \ | ||
764 | ((bssid_mask)[0] &= ~(((ATH_BCBUF-1)<<2)|0x02)) | ||
765 | |||
766 | /* VAP configuration (from protocol layer) */ | ||
767 | struct ath_vap_config { | ||
768 | u32 av_fixed_rateset; | ||
769 | u32 av_fixed_retryset; | ||
770 | }; | ||
771 | |||
772 | /* driver-specific vap state */ | ||
773 | struct ath_vap { | ||
774 | struct ieee80211_vif *av_if_data; | ||
775 | enum ath9k_opmode av_opmode; /* VAP operational mode */ | ||
776 | struct ath_buf *av_bcbuf; /* beacon buffer */ | ||
777 | struct ath_beacon_offset av_boff; /* dynamic update state */ | ||
778 | struct ath_tx_control av_btxctl; /* txctl information for beacon */ | ||
779 | int av_bslot; /* beacon slot index */ | ||
780 | struct ath_txq av_mcastq; /* multicast transmit queue */ | ||
781 | struct ath_vap_config av_config;/* vap configuration parameters*/ | ||
782 | struct ath_rate_node *rc_node; | ||
783 | }; | ||
784 | |||
785 | int ath_vap_attach(struct ath_softc *sc, | ||
786 | int if_id, | ||
787 | struct ieee80211_vif *if_data, | ||
788 | enum ath9k_opmode opmode); | ||
789 | int ath_vap_detach(struct ath_softc *sc, int if_id); | ||
790 | int ath_vap_config(struct ath_softc *sc, | ||
791 | int if_id, struct ath_vap_config *if_config); | ||
792 | int ath_vap_listen(struct ath_softc *sc, int if_id); | ||
793 | |||
794 | /*********************/ | ||
795 | /* Antenna diversity */ | ||
796 | /*********************/ | ||
797 | |||
798 | #define ATH_ANT_DIV_MAX_CFG 2 | ||
799 | #define ATH_ANT_DIV_MIN_IDLE_US 1000000 /* us */ | ||
800 | #define ATH_ANT_DIV_MIN_SCAN_US 50000 /* us */ | ||
801 | |||
802 | enum ATH_ANT_DIV_STATE{ | ||
803 | ATH_ANT_DIV_IDLE, | ||
804 | ATH_ANT_DIV_SCAN, /* evaluating antenna */ | ||
805 | }; | ||
806 | |||
807 | struct ath_antdiv { | ||
808 | struct ath_softc *antdiv_sc; | ||
809 | u8 antdiv_start; | ||
810 | enum ATH_ANT_DIV_STATE antdiv_state; | ||
811 | u8 antdiv_num_antcfg; | ||
812 | u8 antdiv_curcfg; | ||
813 | u8 antdiv_bestcfg; | ||
814 | int32_t antdivf_rssitrig; | ||
815 | int32_t antdiv_lastbrssi[ATH_ANT_DIV_MAX_CFG]; | ||
816 | u64 antdiv_lastbtsf[ATH_ANT_DIV_MAX_CFG]; | ||
817 | u64 antdiv_laststatetsf; | ||
818 | u8 antdiv_bssid[ETH_ALEN]; | ||
819 | }; | ||
820 | |||
821 | void ath_slow_ant_div_init(struct ath_antdiv *antdiv, | ||
822 | struct ath_softc *sc, int32_t rssitrig); | ||
823 | void ath_slow_ant_div_start(struct ath_antdiv *antdiv, | ||
824 | u8 num_antcfg, | ||
825 | const u8 *bssid); | ||
826 | void ath_slow_ant_div_stop(struct ath_antdiv *antdiv); | ||
827 | void ath_slow_ant_div(struct ath_antdiv *antdiv, | ||
828 | struct ieee80211_hdr *wh, | ||
829 | struct ath_rx_status *rx_stats); | ||
830 | void ath_setdefantenna(void *sc, u32 antenna); | ||
831 | |||
832 | /********************/ | ||
833 | /* Main driver core */ | ||
834 | /********************/ | ||
835 | |||
836 | /* | ||
837 | * Default cache line size, in bytes. | ||
838 | * Used when PCI device not fully initialized by bootrom/BIOS | ||
839 | */ | ||
840 | #define DEFAULT_CACHELINE 32 | ||
841 | #define ATH_DEFAULT_NOISE_FLOOR -95 | ||
842 | #define ATH_REGCLASSIDS_MAX 10 | ||
843 | #define ATH_CABQ_READY_TIME 80 /* % of beacon interval */ | ||
844 | #define ATH_PREAMBLE_SHORT (1<<0) | ||
845 | #define ATH_PROTECT_ENABLE (1<<1) | ||
846 | #define ATH_MAX_SW_RETRIES 10 | ||
847 | /* Num farmes difference in tx to flip default recv */ | ||
848 | #define ATH_ANTENNA_DIFF 2 | ||
849 | #define ATH_CHAN_MAX 255 | ||
850 | #define IEEE80211_WEP_NKID 4 /* number of key ids */ | ||
851 | #define IEEE80211_RATE_VAL 0x7f | ||
852 | /* | ||
853 | * The key cache is used for h/w cipher state and also for | ||
854 | * tracking station state such as the current tx antenna. | ||
855 | * We also setup a mapping table between key cache slot indices | ||
856 | * and station state to short-circuit node lookups on rx. | ||
857 | * Different parts have different size key caches. We handle | ||
858 | * up to ATH_KEYMAX entries (could dynamically allocate state). | ||
859 | */ | ||
860 | #define ATH_KEYMAX 128 /* max key cache size we handle */ | ||
861 | |||
862 | #define RESET_RETRY_TXQ 0x00000001 | ||
863 | #define ATH_IF_ID_ANY 0xff | ||
864 | |||
865 | #define ATH_TXPOWER_MAX 100 /* .5 dBm units */ | ||
866 | |||
867 | #define RSSI_LPF_THRESHOLD -20 | ||
868 | #define ATH_RSSI_EP_MULTIPLIER (1<<7) /* pow2 to optimize out * and / */ | ||
869 | #define ATH_RATE_DUMMY_MARKER 0 | ||
870 | #define ATH_RSSI_LPF_LEN 10 | ||
871 | #define ATH_RSSI_DUMMY_MARKER 0x127 | ||
872 | |||
873 | #define ATH_EP_MUL(x, mul) ((x) * (mul)) | ||
874 | #define ATH_EP_RND(x, mul) \ | ||
875 | ((((x)%(mul)) >= ((mul)/2)) ? ((x) + ((mul) - 1)) / (mul) : (x)/(mul)) | ||
876 | #define ATH_RSSI_OUT(x) \ | ||
877 | (((x) != ATH_RSSI_DUMMY_MARKER) ? \ | ||
878 | (ATH_EP_RND((x), ATH_RSSI_EP_MULTIPLIER)) : ATH_RSSI_DUMMY_MARKER) | ||
879 | #define ATH_RSSI_IN(x) \ | ||
880 | (ATH_EP_MUL((x), ATH_RSSI_EP_MULTIPLIER)) | ||
881 | #define ATH_LPF_RSSI(x, y, len) \ | ||
882 | ((x != ATH_RSSI_DUMMY_MARKER) ? \ | ||
883 | (((x) * ((len) - 1) + (y)) / (len)) : (y)) | ||
884 | #define ATH_RSSI_LPF(x, y) do { \ | ||
885 | if ((y) >= RSSI_LPF_THRESHOLD) \ | ||
886 | x = ATH_LPF_RSSI((x), \ | ||
887 | ATH_RSSI_IN((y)), ATH_RSSI_LPF_LEN); \ | ||
888 | } while (0) | ||
889 | |||
890 | |||
891 | enum PROT_MODE { | ||
892 | PROT_M_NONE = 0, | ||
893 | PROT_M_RTSCTS, | ||
894 | PROT_M_CTSONLY | ||
895 | }; | ||
896 | |||
897 | enum RATE_TYPE { | ||
898 | NORMAL_RATE = 0, | ||
899 | HALF_RATE, | ||
900 | QUARTER_RATE | ||
901 | }; | ||
902 | |||
903 | struct ath_ht_info { | ||
904 | enum ath9k_ht_macmode tx_chan_width; | ||
905 | u16 maxampdu; | ||
906 | u8 mpdudensity; | ||
907 | u8 ext_chan_offset; | ||
908 | }; | ||
909 | |||
910 | struct ath_softc { | ||
911 | struct ieee80211_hw *hw; | ||
912 | struct pci_dev *pdev; | ||
913 | void __iomem *mem; | ||
914 | struct tasklet_struct intr_tq; | ||
915 | struct tasklet_struct bcon_tasklet; | ||
916 | struct ath_config sc_config; /* load-time parameters */ | ||
917 | int sc_debug; | ||
918 | struct ath_hal *sc_ah; | ||
919 | struct ath_rate_softc *sc_rc; /* tx rate control support */ | ||
920 | u32 sc_intrstatus; | ||
921 | enum ath9k_opmode sc_opmode; /* current operating mode */ | ||
922 | |||
923 | u8 sc_invalid; /* being detached */ | ||
924 | u8 sc_beacons; /* beacons running */ | ||
925 | u8 sc_scanning; /* scanning active */ | ||
926 | u8 sc_txaggr; /* enable 11n tx aggregation */ | ||
927 | u8 sc_rxaggr; /* enable 11n rx aggregation */ | ||
928 | u8 sc_update_chainmask; /* change chain mask */ | ||
929 | u8 sc_full_reset; /* force full reset */ | ||
930 | enum wireless_mode sc_curmode; /* current phy mode */ | ||
931 | u16 sc_curtxpow; | ||
932 | u16 sc_curaid; | ||
933 | u8 sc_curbssid[ETH_ALEN]; | ||
934 | u8 sc_myaddr[ETH_ALEN]; | ||
935 | enum PROT_MODE sc_protmode; | ||
936 | u8 sc_mcastantenna; | ||
937 | u8 sc_txantenna; /* data tx antenna (fixed or auto) */ | ||
938 | u8 sc_nbcnvaps; /* # of vaps sending beacons */ | ||
939 | u16 sc_nvaps; /* # of active virtual ap's */ | ||
940 | struct ath_vap *sc_vaps[ATH_BCBUF]; | ||
941 | enum ath9k_int sc_imask; | ||
942 | u8 sc_bssidmask[ETH_ALEN]; | ||
943 | u8 sc_defant; /* current default antenna */ | ||
944 | u8 sc_rxotherant; /* rx's on non-default antenna */ | ||
945 | u16 sc_cachelsz; | ||
946 | int sc_slotupdate; /* slot to next advance fsm */ | ||
947 | int sc_slottime; | ||
948 | u8 sc_noreset; | ||
949 | int sc_bslot[ATH_BCBUF]; | ||
950 | struct ath9k_node_stats sc_halstats; /* station-mode rssi stats */ | ||
951 | struct list_head node_list; | ||
952 | struct ath_ht_info sc_ht_info; | ||
953 | int16_t sc_noise_floor; /* signal noise floor in dBm */ | ||
954 | enum ath9k_ht_extprotspacing sc_ht_extprotspacing; | ||
955 | u8 sc_tx_chainmask; | ||
956 | u8 sc_rx_chainmask; | ||
957 | u8 sc_rxchaindetect_ref; | ||
958 | u8 sc_rxchaindetect_thresh5GHz; | ||
959 | u8 sc_rxchaindetect_thresh2GHz; | ||
960 | u8 sc_rxchaindetect_delta5GHz; | ||
961 | u8 sc_rxchaindetect_delta2GHz; | ||
962 | u32 sc_rtsaggrlimit; /* Chipset specific aggr limit */ | ||
963 | u32 sc_flags; | ||
964 | #ifdef CONFIG_SLOW_ANT_DIV | ||
965 | struct ath_antdiv sc_antdiv; | ||
966 | #endif | ||
967 | enum { | ||
968 | OK, /* no change needed */ | ||
969 | UPDATE, /* update pending */ | ||
970 | COMMIT /* beacon sent, commit change */ | ||
971 | } sc_updateslot; /* slot time update fsm */ | ||
972 | |||
973 | /* Crypto */ | ||
974 | u32 sc_keymax; /* size of key cache */ | ||
975 | DECLARE_BITMAP(sc_keymap, ATH_KEYMAX); /* key use bit map */ | ||
976 | u8 sc_splitmic; /* split TKIP MIC keys */ | ||
977 | int sc_keytype; | ||
978 | |||
979 | /* RX */ | ||
980 | struct list_head sc_rxbuf; | ||
981 | struct ath_descdma sc_rxdma; | ||
982 | int sc_rxbufsize; /* rx size based on mtu */ | ||
983 | u32 *sc_rxlink; /* link ptr in last RX desc */ | ||
984 | u32 sc_rxflush; /* rx flush in progress */ | ||
985 | u64 sc_lastrx; /* tsf of last rx'd frame */ | ||
986 | |||
987 | /* TX */ | ||
988 | struct list_head sc_txbuf; | ||
989 | struct ath_txq sc_txq[ATH9K_NUM_TX_QUEUES]; | ||
990 | struct ath_descdma sc_txdma; | ||
991 | u32 sc_txqsetup; | ||
992 | u32 sc_txintrperiod; /* tx interrupt batching */ | ||
993 | int sc_haltype2q[ATH9K_WME_AC_VO+1]; /* HAL WME AC -> h/w qnum */ | ||
994 | u32 sc_ant_tx[8]; /* recent tx frames/antenna */ | ||
995 | |||
996 | /* Beacon */ | ||
997 | struct ath9k_tx_queue_info sc_beacon_qi; | ||
998 | struct ath_descdma sc_bdma; | ||
999 | struct ath_txq *sc_cabq; | ||
1000 | struct list_head sc_bbuf; | ||
1001 | u32 sc_bhalq; | ||
1002 | u32 sc_bmisscount; | ||
1003 | u32 ast_be_xmit; /* beacons transmitted */ | ||
1004 | |||
1005 | /* Rate */ | ||
1006 | struct ieee80211_rate rates[IEEE80211_NUM_BANDS][ATH_RATE_MAX]; | ||
1007 | const struct ath9k_rate_table *sc_currates; | ||
1008 | u8 sc_rixmap[256]; /* IEEE to h/w rate table ix */ | ||
1009 | u8 sc_protrix; /* protection rate index */ | ||
1010 | struct { | ||
1011 | u32 rateKbps; /* transfer rate in kbs */ | ||
1012 | u8 ieeerate; /* IEEE rate */ | ||
1013 | } sc_hwmap[256]; /* h/w rate ix mappings */ | ||
1014 | |||
1015 | /* Channel, Band */ | ||
1016 | struct ieee80211_channel channels[IEEE80211_NUM_BANDS][ATH_CHAN_MAX]; | ||
1017 | struct ieee80211_supported_band sbands[IEEE80211_NUM_BANDS]; | ||
1018 | struct ath9k_channel sc_curchan; | ||
1019 | |||
1020 | /* Locks */ | ||
1021 | spinlock_t sc_rxflushlock; | ||
1022 | spinlock_t sc_rxbuflock; | ||
1023 | spinlock_t sc_txbuflock; | ||
1024 | spinlock_t sc_resetlock; | ||
1025 | spinlock_t node_lock; | ||
1026 | }; | ||
1027 | |||
1028 | int ath_init(u16 devid, struct ath_softc *sc); | ||
1029 | void ath_deinit(struct ath_softc *sc); | ||
1030 | int ath_open(struct ath_softc *sc, struct ath9k_channel *initial_chan); | ||
1031 | int ath_suspend(struct ath_softc *sc); | ||
1032 | irqreturn_t ath_isr(int irq, void *dev); | ||
1033 | int ath_reset(struct ath_softc *sc); | ||
1034 | void ath_scan_start(struct ath_softc *sc); | ||
1035 | void ath_scan_end(struct ath_softc *sc); | ||
1036 | int ath_set_channel(struct ath_softc *sc, struct ath9k_channel *hchan); | ||
1037 | void ath_setup_rate(struct ath_softc *sc, | ||
1038 | enum wireless_mode wMode, | ||
1039 | enum RATE_TYPE type, | ||
1040 | const struct ath9k_rate_table *rt); | ||
1041 | |||
1042 | /*********************/ | ||
1043 | /* Utility Functions */ | ||
1044 | /*********************/ | ||
1045 | |||
1046 | void ath_key_reset(struct ath_softc *sc, u16 keyix, int freeslot); | ||
1047 | int ath_keyset(struct ath_softc *sc, | ||
1048 | u16 keyix, | ||
1049 | struct ath9k_keyval *hk, | ||
1050 | const u8 mac[ETH_ALEN]); | ||
1051 | int ath_get_hal_qnum(u16 queue, struct ath_softc *sc); | ||
1052 | int ath_get_mac80211_qnum(u32 queue, struct ath_softc *sc); | ||
1053 | void ath_setslottime(struct ath_softc *sc); | ||
1054 | void ath_update_txpow(struct ath_softc *sc); | ||
1055 | int ath_cabq_update(struct ath_softc *); | ||
1056 | void ath_get_currentCountry(struct ath_softc *sc, | ||
1057 | struct ath9k_country_entry *ctry); | ||
1058 | u64 ath_extend_tsf(struct ath_softc *sc, u32 rstamp); | ||
1059 | void ath_internal_reset(struct ath_softc *sc); | ||
1060 | u32 ath_chan2flags(struct ieee80211_channel *chan, struct ath_softc *sc); | ||
1061 | dma_addr_t ath_skb_map_single(struct ath_softc *sc, | ||
1062 | struct sk_buff *skb, | ||
1063 | int direction, | ||
1064 | dma_addr_t *pa); | ||
1065 | void ath_skb_unmap_single(struct ath_softc *sc, | ||
1066 | struct sk_buff *skb, | ||
1067 | int direction, | ||
1068 | dma_addr_t *pa); | ||
1069 | void ath_mcast_merge(struct ath_softc *sc, u32 mfilt[2]); | ||
1070 | enum ath9k_ht_macmode ath_cwm_macmode(struct ath_softc *sc); | ||
1071 | |||
1072 | #endif /* CORE_H */ | ||