Fixed Tx hang issue with DMA segment length = 0
[ralink_drivers/rt2860_fbsd72.git] / rt2860_softc.h
blobd96587afada0a7451dcb4e58601536fab3ef3301
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_amrr.h"
59 #define RT2860_SOFTC_LOCK(sc) mtx_lock(&(sc)->lock)
60 #define RT2860_SOFTC_UNLOCK(sc) mtx_unlock(&(sc)->lock)
61 #define RT2860_SOFTC_ASSERT_LOCKED(sc) mtx_assert(&(sc)->lock, MA_OWNED)
63 #define RT2860_SOFTC_FLAGS_UCODE_LOADED (1 << 0)
65 #define RT2860_SOFTC_LED_OFF_COUNT 3
67 #define RT2860_SOFTC_RSSI_OFF_COUNT 3
69 #define RT2860_SOFTC_LNA_GAIN_COUNT 4
71 #define RT2860_SOFTC_TXPOW_COUNT 50
73 #define RT2860_SOFTC_TXPOW_RATE_COUNT 5
75 #define RT2860_SOFTC_TSSI_COUNT 9
77 #define RT2860_SOFTC_BBP_EEPROM_COUNT 8
79 #define RT2860_SOFTC_AMRR_NODE_COUNT 256
81 #define RT2860_SOFTC_TX_RING_COUNT 6
83 #define RT2860_SOFTC_RX_RING_DATA_COUNT 128
85 #define RT2860_SOFTC_MAX_SCATTER 5
87 #define RT2860_SOFTC_TX_RING_DATA_COUNT 128
88 #define RT2860_SOFTC_TX_RING_DESC_COUNT \
89 (RT2860_SOFTC_TX_RING_DATA_COUNT * RT2860_SOFTC_MAX_SCATTER)
91 #define RT2860_SOFTC_RX_RADIOTAP_PRESENT \
92 ((1 << IEEE80211_RADIOTAP_FLAGS) | \
93 (1 << IEEE80211_RADIOTAP_RATE) | \
94 (1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL) | \
95 (1 << IEEE80211_RADIOTAP_DBM_ANTNOISE) | \
96 (1 << IEEE80211_RADIOTAP_ANTENNA) | \
97 (1 << IEEE80211_RADIOTAP_DB_ANTSIGNAL) | \
98 (1 << IEEE80211_RADIOTAP_XCHANNEL))
100 #define RT2860_SOFTC_TX_RADIOTAP_PRESENT \
101 ((1 << IEEE80211_RADIOTAP_FLAGS) | \
102 (1 << IEEE80211_RADIOTAP_RATE) | \
103 (1 << IEEE80211_RADIOTAP_XCHANNEL))
105 struct rt2860_softc_rx_data
107 bus_dmamap_t dma_map;
108 struct mbuf *m;
111 struct rt2860_softc_rx_ring
113 bus_dma_tag_t desc_dma_tag;
114 bus_dmamap_t desc_dma_map;
115 bus_addr_t desc_phys_addr;
116 struct rt2860_rxdesc *desc;
117 bus_dma_tag_t data_dma_tag;
118 struct rt2860_softc_rx_data data[RT2860_SOFTC_RX_RING_DATA_COUNT];
119 int cur;
122 struct rt2860_softc_tx_data
124 bus_dmamap_t dma_map;
125 struct ieee80211_node *ni;
126 struct mbuf *m;
129 struct rt2860_softc_tx_ring
131 bus_dma_tag_t desc_dma_tag;
132 bus_dmamap_t desc_dma_map;
133 bus_addr_t desc_phys_addr;
134 struct rt2860_txdesc *desc;
135 int desc_queued;
136 int desc_cur;
137 int desc_next;
138 bus_dma_tag_t seg0_dma_tag;
139 bus_dmamap_t seg0_dma_map;
140 bus_addr_t seg0_phys_addr;
141 uint8_t *seg0;
142 bus_dma_tag_t data_dma_tag;
143 struct rt2860_softc_tx_data data[RT2860_SOFTC_TX_RING_DATA_COUNT];
144 int data_queued;
145 int data_cur;
146 int data_next;
147 int qid;
150 struct rt2860_softc_rx_radiotap_header
152 struct ieee80211_radiotap_header ihdr;
153 uint8_t flags;
154 uint8_t rate;
155 int8_t dbm_antsignal;
156 int8_t dbm_antnoise;
157 uint8_t antenna;
158 uint8_t antsignal;
159 uint32_t chan_flags;
160 uint16_t chan_freq;
161 uint8_t chan_ieee;
162 int8_t chan_maxpow;
165 struct rt2860_softc_tx_radiotap_header
167 struct ieee80211_radiotap_header ihdr;
168 uint8_t flags;
169 uint8_t rate;
170 uint32_t chan_flags;
171 uint16_t chan_freq;
172 uint8_t chan_ieee;
173 int8_t chan_maxpow;
176 struct rt2860_softc
178 struct mtx lock;
180 uint32_t flags;
182 device_t dev;
184 int mem_rid;
185 struct resource *mem;
187 int irq_rid;
188 struct resource *irq;
189 void *irqh;
191 bus_space_tag_t bst;
192 bus_space_handle_t bsh;
194 struct ifnet *ifp;
195 int if_flags;
197 struct ieee80211com ic;
199 struct ieee80211_beacon_offsets beacon_offsets;
201 struct rt2860_amrr amrr;
202 struct rt2860_amrr_node amrr_node[RT2860_SOFTC_AMRR_NODE_COUNT];
204 int (*newstate)(struct ieee80211com *ic,
205 enum ieee80211_state nstate, int arg);
207 void (*recv_action)(struct ieee80211_node *ni,
208 const uint8_t *frm, const uint8_t *efrm);
210 int (*send_action)(struct ieee80211_node *ni,
211 int category, int action, uint16_t args[4]);
213 uint32_t mac_rev;
214 uint8_t eeprom_addr_num;
215 uint16_t eeprom_rev;
216 uint8_t rf_rev;
218 uint8_t mac_addr[IEEE80211_ADDR_LEN];
220 uint8_t ntxpath;
221 uint8_t nrxpath;
223 int hw_radio_cntl;
224 int tx_agc_cntl;
225 int ext_lna_2ghz;
226 int ext_lna_5ghz;
228 uint8_t country_2ghz;
229 uint8_t country_5ghz;
231 uint8_t rf_freq_off;
233 uint8_t led_cntl;
234 uint16_t led_off[RT2860_SOFTC_LED_OFF_COUNT];
236 int8_t rssi_off_2ghz[RT2860_SOFTC_RSSI_OFF_COUNT];
237 int8_t rssi_off_5ghz[RT2860_SOFTC_RSSI_OFF_COUNT];
239 int8_t lna_gain[RT2860_SOFTC_LNA_GAIN_COUNT];
241 int8_t txpow1[RT2860_SOFTC_TXPOW_COUNT];
242 int8_t txpow2[RT2860_SOFTC_TXPOW_COUNT];
244 int8_t txpow_rate_delta_2ghz;
245 int8_t txpow_rate_delta_5ghz;
246 uint32_t txpow_rate_20mhz[RT2860_SOFTC_TXPOW_RATE_COUNT];
247 uint32_t txpow_rate_40mhz_2ghz[RT2860_SOFTC_TXPOW_RATE_COUNT];
248 uint32_t txpow_rate_40mhz_5ghz[RT2860_SOFTC_TXPOW_RATE_COUNT];
250 int tx_agc_cntl_2ghz;
251 int tx_agc_cntl_5ghz;
253 uint8_t tssi_2ghz[RT2860_SOFTC_TSSI_COUNT];
254 uint8_t tssi_step_2ghz;
255 uint8_t tssi_5ghz[RT2860_SOFTC_TSSI_COUNT];
256 uint8_t tssi_step_5ghz;
258 struct
260 uint8_t val;
261 uint8_t reg;
262 } __packed bbp_eeprom[RT2860_SOFTC_BBP_EEPROM_COUNT];
264 uint16_t powersave_level;
266 int sifs;
268 uint32_t intr_enable_mask;
269 uint32_t intr_disable_mask;
270 uint32_t intr_pending_mask;
272 struct task rx_done_task;
273 int rx_process_limit;
275 struct task tx_done_task;
277 struct task fifo_sta_full_task;
279 struct task periodic_task;
280 struct callout periodic_ch;
281 unsigned long periodic_round;
283 struct taskqueue *taskqueue;
285 struct rt2860_softc_rx_ring rx_ring;
287 struct rt2860_softc_tx_ring tx_ring[RT2860_SOFTC_TX_RING_COUNT];
288 int tx_ring_mgtqid;
290 struct callout tx_watchdog_ch;
291 int tx_timer;
293 struct bpf_if *drvbpf;
295 union
297 struct rt2860_softc_rx_radiotap_header th;
298 uint8_t pad[64];
299 } rxtapu;
301 #define rxtap rxtapu.th
303 int rxtap_len;
305 union
307 struct rt2860_softc_tx_radiotap_header th;
308 uint8_t pad[64];
309 } txtapu;
311 #define txtap txtapu.th
313 int txtap_len;
315 /* statistic counters */
317 unsigned long interrupts;
318 unsigned long tx_coherent_interrupts;
319 unsigned long rx_coherent_interrupts;
320 unsigned long txrx_coherent_interrupts;
321 unsigned long fifo_sta_full_interrupts;
322 unsigned long rx_interrupts;
323 unsigned long rx_delay_interrupts;
324 unsigned long tx_interrupts[RT2860_SOFTC_TX_RING_COUNT];
325 unsigned long tx_delay_interrupts;
326 unsigned long pre_tbtt_interrupts;
327 unsigned long tbtt_interrupts;
328 unsigned long mcu_cmd_interrupts;
329 unsigned long auto_wakeup_interrupts;
330 unsigned long gp_timer_interrupts;
332 unsigned long tx_watchdog_timeouts;
334 unsigned long tx_defrag_packets;
336 unsigned long no_tx_desc_avail;
338 unsigned long rx_mbuf_alloc_errors;
339 unsigned long rx_mbuf_dmamap_errors;
341 unsigned long tx_queue_not_empty[2];
343 unsigned long rx_packets;
344 unsigned long rx_crc_errors;
345 unsigned long rx_phy_errors;
346 unsigned long rx_false_ccas;
347 unsigned long rx_plcp_errors;
348 unsigned long rx_dup_packets;
349 unsigned long rx_fifo_overflows;
351 #ifdef RT2860_DEBUG
352 int debug;
353 #endif
356 #endif /* #ifndef _RT2860_SOFTC_H_ */