Wakeup ASIC during initialization; Clear BA session bit after receiving DELBA request...
[ralink_drivers/rt2860_fbsd8.git] / rt2860_softc.h
blob3e22032b2562f31fec86f84b61439bfbc013de6e
2 /*-
3 * Copyright (c) 2009-2010 Alexander Egorenkov <egorenar@gmail.com>
4 * Copyright (c) 2009 Damien Bergamini <damien.bergamini@free.fr>
6 * Permission to use, copy, modify, and distribute this software for any
7 * purpose with or without fee is hereby granted, provided that the above
8 * copyright notice and this permission notice appear in all copies.
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19 #ifndef _RT2860_SOFTC_H_
20 #define _RT2860_SOFTC_H_
22 #include <sys/param.h>
23 #include <sys/sysctl.h>
24 #include <sys/sockio.h>
25 #include <sys/mbuf.h>
26 #include <sys/kernel.h>
27 #include <sys/socket.h>
28 #include <sys/systm.h>
29 #include <sys/malloc.h>
30 #include <sys/taskqueue.h>
31 #include <sys/module.h>
32 #include <sys/bus.h>
33 #include <sys/endian.h>
35 #include <machine/bus.h>
36 #include <machine/resource.h>
37 #include <sys/rman.h>
39 #include <net/bpf.h>
40 #include <net/if.h>
41 #include <net/if_arp.h>
42 #include <net/ethernet.h>
43 #include <net/if_dl.h>
44 #include <net/if_media.h>
45 #include <net/if_types.h>
47 #include <net80211/ieee80211_var.h>
48 #include <net80211/ieee80211_input.h>
49 #include <net80211/ieee80211_radiotap.h>
50 #include <net80211/ieee80211_regdomain.h>
52 #include <dev/pci/pcireg.h>
53 #include <dev/pci/pcivar.h>
55 #include "rt2860_rxdesc.h"
56 #include "rt2860_txdesc.h"
57 #include "rt2860_txwi.h"
58 #include "rt2860_amrr.h"
60 #define RT2860_SOFTC_LOCK(sc) mtx_lock(&(sc)->lock)
61 #define RT2860_SOFTC_UNLOCK(sc) mtx_unlock(&(sc)->lock)
62 #define RT2860_SOFTC_ASSERT_LOCKED(sc) mtx_assert(&(sc)->lock, MA_OWNED)
64 #define RT2860_SOFTC_TX_RING_LOCK(ring) mtx_lock(&(ring)->lock)
65 #define RT2860_SOFTC_TX_RING_UNLOCK(ring) mtx_unlock(&(ring)->lock)
66 #define RT2860_SOFTC_TX_RING_ASSERT_LOCKED(ring) mtx_assert(&(ring)->lock, MA_OWNED)
68 #define RT2860_SOFTC_FLAGS_UCODE_LOADED (1 << 0)
70 #define RT2860_SOFTC_LED_OFF_COUNT 3
72 #define RT2860_SOFTC_RSSI_OFF_COUNT 3
74 #define RT2860_SOFTC_LNA_GAIN_COUNT 4
76 #define RT2860_SOFTC_TXPOW_COUNT 50
78 #define RT2860_SOFTC_TXPOW_RATE_COUNT 5
80 #define RT2860_SOFTC_TSSI_COUNT 9
82 #define RT2860_SOFTC_BBP_EEPROM_COUNT 8
84 #define RT2860_SOFTC_RSSI_COUNT 3
86 #define RT2860_SOFTC_STAID_COUNT 64
88 #define RT2860_SOFTC_TX_RING_COUNT 6
90 #define RT2860_SOFTC_RX_RING_DATA_COUNT 128
92 #define RT2860_SOFTC_MAX_SCATTER 10
94 #define RT2860_SOFTC_TX_RING_DATA_COUNT 256
95 #define RT2860_SOFTC_TX_RING_DESC_COUNT \
96 (RT2860_SOFTC_TX_RING_DATA_COUNT * RT2860_SOFTC_MAX_SCATTER)
98 #define RT2860_SOFTC_RX_RADIOTAP_PRESENT \
99 ((1 << IEEE80211_RADIOTAP_FLAGS) | \
100 (1 << IEEE80211_RADIOTAP_RATE) | \
101 (1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL) | \
102 (1 << IEEE80211_RADIOTAP_DBM_ANTNOISE) | \
103 (1 << IEEE80211_RADIOTAP_ANTENNA) | \
104 (1 << IEEE80211_RADIOTAP_DB_ANTSIGNAL) | \
105 (1 << IEEE80211_RADIOTAP_XCHANNEL))
107 #define RT2860_SOFTC_TX_RADIOTAP_PRESENT \
108 ((1 << IEEE80211_RADIOTAP_FLAGS) | \
109 (1 << IEEE80211_RADIOTAP_RATE) | \
110 (1 << IEEE80211_RADIOTAP_XCHANNEL))
112 struct rt2860_softc_rx_data
114 bus_dmamap_t dma_map;
115 struct mbuf *m;
118 struct rt2860_softc_rx_ring
120 bus_dma_tag_t desc_dma_tag;
121 bus_dmamap_t desc_dma_map;
122 bus_addr_t desc_phys_addr;
123 struct rt2860_rxdesc *desc;
124 bus_dma_tag_t data_dma_tag;
125 bus_dmamap_t spare_dma_map;
126 struct rt2860_softc_rx_data data[RT2860_SOFTC_RX_RING_DATA_COUNT];
127 int cur;
130 struct rt2860_softc_tx_data
132 bus_dmamap_t dma_map;
133 struct ieee80211_node *ni;
134 struct mbuf *m;
137 struct rt2860_softc_tx_ring
139 struct mtx lock;
140 bus_dma_tag_t desc_dma_tag;
141 bus_dmamap_t desc_dma_map;
142 bus_addr_t desc_phys_addr;
143 struct rt2860_txdesc *desc;
144 int desc_queued;
145 int desc_cur;
146 int desc_next;
147 bus_dma_tag_t seg0_dma_tag;
148 bus_dmamap_t seg0_dma_map;
149 bus_addr_t seg0_phys_addr;
150 uint8_t *seg0;
151 bus_dma_tag_t data_dma_tag;
152 struct rt2860_softc_tx_data data[RT2860_SOFTC_TX_RING_DATA_COUNT];
153 int data_queued;
154 int data_cur;
155 int data_next;
156 int qid;
159 struct rt2860_softc_node
161 struct ieee80211_node ni;
163 uint8_t staid;
165 uint8_t last_rssi[RT2860_SOFTC_RSSI_COUNT];
166 int8_t last_rssi_dbm[RT2860_SOFTC_RSSI_COUNT];
169 struct rt2860_softc_vap
171 struct ieee80211vap vap;
173 struct ieee80211_beacon_offsets beacon_offsets;
174 struct mbuf *beacon_mbuf;
175 struct rt2860_txwi beacon_txwi;
177 struct rt2860_amrr amrr;
179 int (*newstate)(struct ieee80211vap *vap,
180 enum ieee80211_state nstate, int arg);
183 struct rt2860_softc_rx_radiotap_header
185 struct ieee80211_radiotap_header ihdr;
186 uint8_t flags;
187 uint8_t rate;
188 int8_t dbm_antsignal;
189 int8_t dbm_antnoise;
190 uint8_t antenna;
191 uint8_t antsignal;
192 uint8_t pad[2];
193 uint32_t chan_flags;
194 uint16_t chan_freq;
195 uint8_t chan_ieee;
196 int8_t chan_maxpow;
197 } __packed;
199 struct rt2860_softc_tx_radiotap_header
201 struct ieee80211_radiotap_header ihdr;
202 uint8_t flags;
203 uint8_t rate;
204 uint8_t pad[2];
205 uint32_t chan_flags;
206 uint16_t chan_freq;
207 uint8_t chan_ieee;
208 int8_t chan_maxpow;
209 } __packed;
211 struct rt2860_softc
213 struct mtx lock;
215 uint32_t flags;
217 device_t dev;
219 int mem_rid;
220 struct resource *mem;
222 int irq_rid;
223 struct resource *irq;
224 void *irqh;
226 bus_space_tag_t bst;
227 bus_space_handle_t bsh;
229 struct ifnet *ifp;
230 int if_flags;
232 int nvaps;
233 int napvaps;
234 int nadhocvaps;
235 int nstavaps;
236 int nwdsvaps;
238 void (*node_cleanup)(struct ieee80211_node *ni);
240 int tx_ampdu_sessions;
242 int (*recv_action)(struct ieee80211_node *ni,
243 const struct ieee80211_frame *wh,
244 const uint8_t *frm, const uint8_t *efrm);
246 int (*send_action)(struct ieee80211_node *ni,
247 int cat, int act, void *sa);
249 int (*addba_response)(struct ieee80211_node *ni,
250 struct ieee80211_tx_ampdu *tap,
251 int status, int baparamset, int batimeout);
253 void (*addba_stop)(struct ieee80211_node *ni,
254 struct ieee80211_tx_ampdu *tap);
256 struct rt2860_amrr_node amrr_node[RT2860_SOFTC_STAID_COUNT];
258 uint32_t mac_rev;
259 uint8_t eeprom_addr_num;
260 uint16_t eeprom_rev;
261 uint8_t rf_rev;
263 uint8_t mac_addr[IEEE80211_ADDR_LEN];
265 uint8_t ntxpath;
266 uint8_t nrxpath;
268 int hw_radio_cntl;
269 int tx_agc_cntl;
270 int ext_lna_2ghz;
271 int ext_lna_5ghz;
273 uint8_t country_2ghz;
274 uint8_t country_5ghz;
276 uint8_t rf_freq_off;
278 uint8_t led_cntl;
279 uint16_t led_off[RT2860_SOFTC_LED_OFF_COUNT];
281 int8_t rssi_off_2ghz[RT2860_SOFTC_RSSI_OFF_COUNT];
282 int8_t rssi_off_5ghz[RT2860_SOFTC_RSSI_OFF_COUNT];
284 int8_t lna_gain[RT2860_SOFTC_LNA_GAIN_COUNT];
286 int8_t txpow1[RT2860_SOFTC_TXPOW_COUNT];
287 int8_t txpow2[RT2860_SOFTC_TXPOW_COUNT];
289 int8_t txpow_rate_delta_2ghz;
290 int8_t txpow_rate_delta_5ghz;
291 uint32_t txpow_rate_20mhz[RT2860_SOFTC_TXPOW_RATE_COUNT];
292 uint32_t txpow_rate_40mhz_2ghz[RT2860_SOFTC_TXPOW_RATE_COUNT];
293 uint32_t txpow_rate_40mhz_5ghz[RT2860_SOFTC_TXPOW_RATE_COUNT];
295 int tx_agc_cntl_2ghz;
296 int tx_agc_cntl_5ghz;
298 uint8_t tssi_2ghz[RT2860_SOFTC_TSSI_COUNT];
299 uint8_t tssi_step_2ghz;
300 uint8_t tssi_5ghz[RT2860_SOFTC_TSSI_COUNT];
301 uint8_t tssi_step_5ghz;
303 struct
305 uint8_t val;
306 uint8_t reg;
307 } __packed bbp_eeprom[RT2860_SOFTC_BBP_EEPROM_COUNT];
309 uint16_t powersave_level;
311 uint8_t staid_mask[RT2860_SOFTC_STAID_COUNT / NBBY];
313 uint32_t intr_enable_mask;
314 uint32_t intr_disable_mask;
315 uint32_t intr_pending_mask;
317 struct task rx_done_task;
318 int rx_process_limit;
320 struct task tx_done_task;
322 struct task fifo_sta_full_task;
324 struct task periodic_task;
325 struct callout periodic_ch;
326 unsigned long periodic_round;
328 struct taskqueue *taskqueue;
330 struct rt2860_softc_rx_ring rx_ring;
332 struct rt2860_softc_tx_ring tx_ring[RT2860_SOFTC_TX_RING_COUNT];
333 int tx_ring_mgtqid;
335 struct callout tx_watchdog_ch;
336 int tx_timer;
338 struct rt2860_softc_rx_radiotap_header rxtap;
339 struct rt2860_softc_tx_radiotap_header txtap;
341 /* statistic counters */
343 unsigned long interrupts;
344 unsigned long tx_coherent_interrupts;
345 unsigned long rx_coherent_interrupts;
346 unsigned long txrx_coherent_interrupts;
347 unsigned long fifo_sta_full_interrupts;
348 unsigned long rx_interrupts;
349 unsigned long rx_delay_interrupts;
350 unsigned long tx_interrupts[RT2860_SOFTC_TX_RING_COUNT];
351 unsigned long tx_delay_interrupts;
352 unsigned long pre_tbtt_interrupts;
353 unsigned long tbtt_interrupts;
354 unsigned long mcu_cmd_interrupts;
355 unsigned long auto_wakeup_interrupts;
356 unsigned long gp_timer_interrupts;
358 unsigned long tx_data_queue_full[RT2860_SOFTC_TX_RING_COUNT];
360 unsigned long tx_watchdog_timeouts;
362 unsigned long tx_defrag_packets;
364 unsigned long no_tx_desc_avail;
366 unsigned long rx_mbuf_alloc_errors;
367 unsigned long rx_mbuf_dmamap_errors;
369 unsigned long tx_queue_not_empty[2];
371 unsigned long tx_beacons;
372 unsigned long tx_noretryok;
373 unsigned long tx_retryok;
374 unsigned long tx_failed;
375 unsigned long tx_underflows;
376 unsigned long tx_zerolen;
377 unsigned long tx_nonagg;
378 unsigned long tx_agg;
379 unsigned long tx_ampdu;
380 unsigned long tx_mpdu_zero_density;
382 unsigned long rx_packets;
383 unsigned long rx_ampdu;
384 unsigned long rx_ampdu_retries;
385 unsigned long rx_mpdu_zero_density;
386 unsigned long rx_amsdu;
387 unsigned long rx_crc_errors;
388 unsigned long rx_phy_errors;
389 unsigned long rx_false_ccas;
390 unsigned long rx_plcp_errors;
391 unsigned long rx_dup_packets;
392 unsigned long rx_fifo_overflows;
393 unsigned long rx_cipher_no_errors;
394 unsigned long rx_cipher_icv_errors;
395 unsigned long rx_cipher_mic_errors;
396 unsigned long rx_cipher_invalid_key_errors;
398 int tx_stbc;
400 #ifdef RT2860_DEBUG
401 int debug;
402 #endif
405 #endif /* #ifndef _RT2860_SOFTC_H_ */