rt2860var.h revision 1.1 1 1.1 christos /* $NetBSD: rt2860var.h,v 1.1 2016/04/26 21:17:20 christos Exp $ */
2 1.1 christos /* $OpenBSD: rt2860var.h,v 1.23 2016/03/21 21:16:30 stsp Exp $ */
3 1.1 christos
4 1.1 christos /*-
5 1.1 christos * Copyright (c) 2007
6 1.1 christos * Damien Bergamini <damien.bergamini (at) free.fr>
7 1.1 christos *
8 1.1 christos * Permission to use, copy, modify, and distribute this software for any
9 1.1 christos * purpose with or without fee is hereby granted, provided that the above
10 1.1 christos * copyright notice and this permission notice appear in all copies.
11 1.1 christos *
12 1.1 christos * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
13 1.1 christos * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
14 1.1 christos * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
15 1.1 christos * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
16 1.1 christos * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
17 1.1 christos * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
18 1.1 christos * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19 1.1 christos */
20 1.1 christos
21 1.1 christos #define RT2860_MAX_SCATTER 15
22 1.1 christos #define RT2860_MAX_SCATTER_TXD (1 + (RT2860_MAX_SCATTER / 2))
23 1.1 christos
24 1.1 christos #define RT2860_RX_RING_COUNT 128
25 1.1 christos #define RT2860_TX_RING_COUNT 64
26 1.1 christos #define RT2860_TX_RING_MAX (RT2860_TX_RING_COUNT - 1)
27 1.1 christos #define RT2860_TX_RING_ONEMORE (RT2860_TX_RING_MAX - RT2860_MAX_SCATTER_TXD)
28 1.1 christos #define RT2860_TX_POOL_COUNT (RT2860_TX_RING_COUNT * 2)
29 1.1 christos
30 1.1 christos /* HW supports up to 255 STAs */
31 1.1 christos #define RT2860_WCID_MAX 254
32 1.1 christos #define RT2860_AID2WCID(aid) ((aid) & 0xff)
33 1.1 christos
34 1.1 christos struct rt2860_rx_radiotap_header {
35 1.1 christos struct ieee80211_radiotap_header wr_ihdr;
36 1.1 christos uint8_t wr_flags;
37 1.1 christos uint8_t wr_rate;
38 1.1 christos uint16_t wr_chan_freq;
39 1.1 christos uint16_t wr_chan_flags;
40 1.1 christos uint8_t wr_dbm_antsignal;
41 1.1 christos uint8_t wr_antenna;
42 1.1 christos uint8_t wr_antsignal;
43 1.1 christos } __packed;
44 1.1 christos
45 1.1 christos #define RT2860_RX_RADIOTAP_PRESENT \
46 1.1 christos (1 << IEEE80211_RADIOTAP_FLAGS | \
47 1.1 christos 1 << IEEE80211_RADIOTAP_RATE | \
48 1.1 christos 1 << IEEE80211_RADIOTAP_CHANNEL | \
49 1.1 christos 1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL | \
50 1.1 christos 1 << IEEE80211_RADIOTAP_ANTENNA | \
51 1.1 christos 1 << IEEE80211_RADIOTAP_DB_ANTSIGNAL)
52 1.1 christos
53 1.1 christos struct rt2860_tx_radiotap_header {
54 1.1 christos struct ieee80211_radiotap_header wt_ihdr;
55 1.1 christos uint8_t wt_flags;
56 1.1 christos uint8_t wt_rate;
57 1.1 christos uint16_t wt_chan_freq;
58 1.1 christos uint16_t wt_chan_flags;
59 1.1 christos uint8_t wt_hwqueue;
60 1.1 christos } __packed;
61 1.1 christos
62 1.1 christos #define RT2860_TX_RADIOTAP_PRESENT \
63 1.1 christos (1 << IEEE80211_RADIOTAP_FLAGS | \
64 1.1 christos 1 << IEEE80211_RADIOTAP_RATE | \
65 1.1 christos 1 << IEEE80211_RADIOTAP_CHANNEL | \
66 1.1 christos 1 << IEEE80211_RADIOTAP_HWQUEUE)
67 1.1 christos
68 1.1 christos struct rt2860_tx_data {
69 1.1 christos struct rt2860_txwi *txwi;
70 1.1 christos struct mbuf *m;
71 1.1 christos struct ieee80211_node *ni;
72 1.1 christos bus_dmamap_t map;
73 1.1 christos bus_addr_t paddr;
74 1.1 christos SLIST_ENTRY(rt2860_tx_data) next;
75 1.1 christos };
76 1.1 christos
77 1.1 christos struct rt2860_tx_ring {
78 1.1 christos struct rt2860_txd *txd;
79 1.1 christos bus_addr_t paddr;
80 1.1 christos bus_dmamap_t map;
81 1.1 christos bus_dma_segment_t seg;
82 1.1 christos struct rt2860_tx_data *data[RT2860_TX_RING_COUNT];
83 1.1 christos int cur;
84 1.1 christos int next;
85 1.1 christos int queued;
86 1.1 christos };
87 1.1 christos
88 1.1 christos struct rt2860_rx_data {
89 1.1 christos struct mbuf *m;
90 1.1 christos bus_dmamap_t map;
91 1.1 christos };
92 1.1 christos
93 1.1 christos struct rt2860_rx_ring {
94 1.1 christos struct rt2860_rxd *rxd;
95 1.1 christos bus_addr_t paddr;
96 1.1 christos bus_dmamap_t map;
97 1.1 christos bus_dma_segment_t seg;
98 1.1 christos unsigned int cur; /* must be unsigned */
99 1.1 christos struct rt2860_rx_data data[RT2860_RX_RING_COUNT];
100 1.1 christos };
101 1.1 christos
102 1.1 christos struct rt2860_node {
103 1.1 christos struct ieee80211_node ni;
104 1.1 christos uint8_t wcid;
105 1.1 christos uint8_t ridx[IEEE80211_RATE_MAXSIZE];
106 1.1 christos uint8_t ctl_ridx[IEEE80211_RATE_MAXSIZE];
107 1.1 christos };
108 1.1 christos
109 1.1 christos struct rt2860_softc {
110 1.1 christos struct device sc_dev;
111 1.1 christos
112 1.1 christos struct ieee80211com sc_ic;
113 1.1 christos int (*sc_newstate)(struct ieee80211com *,
114 1.1 christos enum ieee80211_state, int);
115 1.1 christos struct ieee80211_amrr amrr;
116 1.1 christos
117 1.1 christos int (*sc_enable)(struct rt2860_softc *);
118 1.1 christos void (*sc_disable)(struct rt2860_softc *);
119 1.1 christos
120 1.1 christos bus_dma_tag_t sc_dmat;
121 1.1 christos bus_space_tag_t sc_st;
122 1.1 christos bus_space_handle_t sc_sh;
123 1.1 christos
124 1.1 christos uint16_t (*sc_srom_read)(struct rt2860_softc *,
125 1.1 christos uint16_t);
126 1.1 christos
127 1.1 christos int sc_flags;
128 1.1 christos #define RT2860_ENABLED (1 << 0)
129 1.1 christos #define RT2860_ADVANCED_PS (1 << 1)
130 1.1 christos #define RT2860_PCIE (1 << 2)
131 1.1 christos
132 1.1 christos uint32_t sc_ic_flags;
133 1.1 christos int fixed_ridx;
134 1.1 christos
135 1.1 christos u_char *ucode;
136 1.1 christos size_t ucsize;
137 1.1 christos
138 1.1 christos struct rt2860_tx_ring txq[6];
139 1.1 christos struct rt2860_rx_ring rxq;
140 1.1 christos
141 1.1 christos SLIST_HEAD(, rt2860_tx_data) data_pool;
142 1.1 christos struct rt2860_tx_data data[RT2860_TX_POOL_COUNT];
143 1.1 christos bus_dmamap_t txwi_map;
144 1.1 christos bus_dma_segment_t txwi_seg;
145 1.1 christos caddr_t txwi_vaddr;
146 1.1 christos
147 1.1 christos int sc_tx_timer;
148 1.1 christos int mgtqid;
149 1.1 christos uint8_t qfullmsk;
150 1.1 christos
151 1.1 christos uint16_t mac_ver;
152 1.1 christos uint16_t mac_rev;
153 1.1 christos uint8_t rf_rev;
154 1.1 christos uint8_t freq;
155 1.1 christos uint8_t ntxchains;
156 1.1 christos uint8_t nrxchains;
157 1.1 christos uint8_t pslevel;
158 1.1 christos int8_t txpow1[54];
159 1.1 christos int8_t txpow2[54];
160 1.1 christos int8_t rssi_2ghz[3];
161 1.1 christos int8_t rssi_5ghz[3];
162 1.1 christos uint8_t lna[4];
163 1.1 christos uint8_t rf24_20mhz;
164 1.1 christos uint8_t rf24_40mhz;
165 1.1 christos uint8_t patch_dac;
166 1.1 christos uint8_t rfswitch;
167 1.1 christos uint8_t ext_2ghz_lna;
168 1.1 christos uint8_t ext_5ghz_lna;
169 1.1 christos uint8_t calib_2ghz;
170 1.1 christos uint8_t calib_5ghz;
171 1.1 christos uint8_t txmixgain_2ghz;
172 1.1 christos uint8_t txmixgain_5ghz;
173 1.1 christos uint8_t tssi_2ghz[9];
174 1.1 christos uint8_t tssi_5ghz[9];
175 1.1 christos uint8_t step_2ghz;
176 1.1 christos uint8_t step_5ghz;
177 1.1 christos struct {
178 1.1 christos uint8_t reg;
179 1.1 christos uint8_t val;
180 1.1 christos } bbp[8], rf[10];
181 1.1 christos uint8_t leds;
182 1.1 christos uint16_t led[3];
183 1.1 christos uint32_t txpow20mhz[5];
184 1.1 christos uint32_t txpow40mhz_2ghz[5];
185 1.1 christos uint32_t txpow40mhz_5ghz[5];
186 1.1 christos
187 1.1 christos struct ieee80211_amrr_node amn[RT2860_WCID_MAX + 1];
188 1.1 christos
189 1.1 christos #if NBPFILTER > 0
190 1.1 christos caddr_t sc_drvbpf;
191 1.1 christos union {
192 1.1 christos struct rt2860_rx_radiotap_header th;
193 1.1 christos uint8_t pad[64];
194 1.1 christos } sc_rxtapu;
195 1.1 christos #define sc_rxtap sc_rxtapu.th
196 1.1 christos int sc_rxtap_len;
197 1.1 christos
198 1.1 christos union {
199 1.1 christos struct rt2860_tx_radiotap_header th;
200 1.1 christos uint8_t pad[64];
201 1.1 christos } sc_txtapu;
202 1.1 christos #define sc_txtap sc_txtapu.th
203 1.1 christos int sc_txtap_len;
204 1.1 christos #endif
205 1.1 christos };
206 1.1 christos
207 1.1 christos int rt2860_attach(void *, int);
208 1.1 christos int rt2860_detach(void *);
209 1.1 christos void rt2860_suspend(void *);
210 1.1 christos void rt2860_wakeup(void *);
211 1.1 christos int rt2860_intr(void *);
212