if_iwnvar.h revision 1.13.14.1 1 /* $NetBSD: if_iwnvar.h,v 1.13.14.1 2013/06/23 06:20:18 tls Exp $ */
2 /* $OpenBSD: if_iwnvar.h,v 1.24 2012/11/17 14:02:51 kettenis Exp $ */
3
4 /*-
5 * Copyright (c) 2007, 2008
6 * Damien Bergamini <damien.bergamini (at) free.fr>
7 *
8 * Permission to use, copy, modify, and distribute this software for any
9 * purpose with or without fee is hereby granted, provided that the above
10 * copyright notice and this permission notice appear in all copies.
11 *
12 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
13 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
14 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
15 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
16 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
17 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
18 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19 */
20
21 /* XXX Added for NetBSD */
22 #define IEEE80211_NO_HT
23
24 struct iwn_rx_radiotap_header {
25 struct ieee80211_radiotap_header wr_ihdr;
26 uint64_t wr_tsft;
27 uint8_t wr_flags;
28 uint8_t wr_rate;
29 uint16_t wr_chan_freq;
30 uint16_t wr_chan_flags;
31 int8_t wr_dbm_antsignal;
32 int8_t wr_dbm_antnoise;
33 } __packed;
34
35 #define IWN_RX_RADIOTAP_PRESENT \
36 ((1 << IEEE80211_RADIOTAP_TSFT) | \
37 (1 << IEEE80211_RADIOTAP_FLAGS) | \
38 (1 << IEEE80211_RADIOTAP_RATE) | \
39 (1 << IEEE80211_RADIOTAP_CHANNEL) | \
40 (1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL) | \
41 (1 << IEEE80211_RADIOTAP_DBM_ANTNOISE))
42
43 struct iwn_tx_radiotap_header {
44 struct ieee80211_radiotap_header wt_ihdr;
45 uint8_t wt_flags;
46 uint8_t wt_rate;
47 uint16_t wt_chan_freq;
48 uint16_t wt_chan_flags;
49 uint8_t wt_hwqueue;
50 } __packed;
51
52 #define IWN_TX_RADIOTAP_PRESENT \
53 ((1 << IEEE80211_RADIOTAP_FLAGS) | \
54 (1 << IEEE80211_RADIOTAP_RATE) | \
55 (1 << IEEE80211_RADIOTAP_CHANNEL))
56 /* XXX OpenBSD also includes IEEE80211_RADIOTAP_HWQUEUE */
57
58 struct iwn_dma_info {
59 bus_dma_tag_t tag;
60 bus_dmamap_t map;
61 bus_dma_segment_t seg;
62 bus_addr_t paddr;
63 void * vaddr;
64 bus_size_t size;
65 };
66
67 struct iwn_tx_data {
68 bus_dmamap_t map;
69 bus_addr_t cmd_paddr;
70 bus_addr_t scratch_paddr;
71 struct mbuf *m;
72 struct ieee80211_node *ni;
73 };
74
75 struct iwn_tx_ring {
76 struct iwn_dma_info desc_dma;
77 struct iwn_dma_info cmd_dma;
78 struct iwn_tx_desc *desc;
79 struct iwn_tx_cmd *cmd;
80 struct iwn_tx_data data[IWN_TX_RING_COUNT];
81 int qid;
82 int queued;
83 int cur;
84 };
85
86 #define IWN_RBUF_COUNT (IWN_RX_RING_COUNT + 32)
87
88 struct iwn_softc;
89
90 struct iwn_rbuf {
91 struct iwn_softc *sc;
92 void * vaddr;
93 bus_addr_t paddr;
94 SLIST_ENTRY(iwn_rbuf) next;
95 };
96
97 struct iwn_rx_data {
98 struct mbuf *m;
99 bus_dmamap_t map;
100 };
101
102 struct iwn_rx_ring {
103 struct iwn_dma_info desc_dma;
104 struct iwn_dma_info stat_dma;
105 struct iwn_dma_info buf_dma;
106 uint32_t *desc;
107 struct iwn_rx_status *stat;
108 struct iwn_rx_data data[IWN_RX_RING_COUNT];
109 struct iwn_rbuf rbuf[IWN_RBUF_COUNT];
110 kmutex_t freelist_mtx;
111 SLIST_HEAD(, iwn_rbuf) freelist;
112 int nb_free_entries;
113 int cur;
114 };
115
116 struct iwn_node {
117 struct ieee80211_node ni; /* must be the first */
118 struct ieee80211_amrr_node amn;
119 uint16_t disable_tid;
120 uint8_t id;
121 uint8_t ridx[IEEE80211_RATE_MAXSIZE];
122 };
123
124 struct iwn_calib_state {
125 uint8_t state;
126 #define IWN_CALIB_STATE_INIT 0
127 #define IWN_CALIB_STATE_ASSOC 1
128 #define IWN_CALIB_STATE_RUN 2
129
130 u_int nbeacons;
131 uint32_t noise[3];
132 uint32_t rssi[3];
133 uint32_t ofdm_x1;
134 uint32_t ofdm_mrc_x1;
135 uint32_t ofdm_x4;
136 uint32_t ofdm_mrc_x4;
137 uint32_t cck_x4;
138 uint32_t cck_mrc_x4;
139 uint32_t bad_plcp_ofdm;
140 uint32_t fa_ofdm;
141 uint32_t bad_plcp_cck;
142 uint32_t fa_cck;
143 uint32_t low_fa;
144 uint8_t cck_state;
145 #define IWN_CCK_STATE_INIT 0
146 #define IWN_CCK_STATE_LOFA 1
147 #define IWN_CCK_STATE_HIFA 2
148
149 uint8_t noise_samples[20];
150 u_int cur_noise_sample;
151 uint8_t noise_ref;
152 uint32_t energy_samples[10];
153 u_int cur_energy_sample;
154 uint32_t energy_cck;
155 };
156
157 struct iwn_calib_info {
158 uint8_t *buf;
159 u_int len;
160 };
161
162 struct iwn_fw_part {
163 const uint8_t *text;
164 uint32_t textsz;
165 const uint8_t *data;
166 uint32_t datasz;
167 };
168
169 struct iwn_fw_info {
170 u_char *data;
171 size_t size;
172 struct iwn_fw_part init;
173 struct iwn_fw_part main;
174 struct iwn_fw_part boot;
175 };
176
177 struct iwn_ops {
178 int (*load_firmware)(struct iwn_softc *);
179 void (*read_eeprom)(struct iwn_softc *);
180 int (*post_alive)(struct iwn_softc *);
181 int (*nic_config)(struct iwn_softc *);
182 void (*update_sched)(struct iwn_softc *, int, int, uint8_t,
183 uint16_t);
184 int (*get_temperature)(struct iwn_softc *);
185 int (*get_rssi)(const struct iwn_rx_stat *);
186 int (*set_txpower)(struct iwn_softc *, int);
187 int (*init_gains)(struct iwn_softc *);
188 int (*set_gains)(struct iwn_softc *);
189 int (*add_node)(struct iwn_softc *, struct iwn_node_info *,
190 int);
191 void (*tx_done)(struct iwn_softc *, struct iwn_rx_desc *,
192 struct iwn_rx_data *);
193 #ifndef IEEE80211_NO_HT
194 void (*ampdu_tx_start)(struct iwn_softc *,
195 struct ieee80211_node *, uint8_t, uint16_t);
196 void (*ampdu_tx_stop)(struct iwn_softc *, uint8_t,
197 uint16_t);
198 #endif
199 };
200
201 struct iwn_softc {
202 device_t sc_dev;
203
204 struct ethercom sc_ec;
205 struct ieee80211com sc_ic;
206 int (*sc_newstate)(struct ieee80211com *,
207 enum ieee80211_state, int);
208
209 struct ieee80211_amrr amrr;
210 uint8_t fixed_ridx;
211
212 bus_dma_tag_t sc_dmat;
213
214 u_int sc_flags;
215 #define IWN_FLAG_HAS_5GHZ (1 << 0)
216 #define IWN_FLAG_HAS_OTPROM (1 << 1)
217 #define IWN_FLAG_CALIB_DONE (1 << 2)
218 #define IWN_FLAG_USE_ICT (1 << 3)
219 #define IWN_FLAG_INTERNAL_PA (1 << 4)
220 #define IWN_FLAG_HAS_11N (1 << 6)
221 #define IWN_FLAG_ENH_SENS (1 << 7)
222 /* Added for NetBSD */
223 #define IWN_FLAG_SCANNING (1 << 8)
224 #define IWN_FLAG_HW_INITED (1 << 9)
225
226 uint8_t hw_type;
227
228 struct iwn_ops ops;
229 const char *fwname;
230 const struct iwn_sensitivity_limits
231 *limits;
232 int ntxqs;
233 int ndmachnls;
234 uint8_t broadcast_id;
235 int rxonsz;
236 int schedsz;
237 uint32_t fw_text_maxsz;
238 uint32_t fw_data_maxsz;
239 uint32_t fwsz;
240 bus_size_t sched_txfact_addr;
241
242 /* TX scheduler rings. */
243 struct iwn_dma_info sched_dma;
244 uint16_t *sched;
245 uint32_t sched_base;
246
247 /* "Keep Warm" page. */
248 struct iwn_dma_info kw_dma;
249
250 /* Firmware DMA transfer. */
251 struct iwn_dma_info fw_dma;
252
253 /* ICT table. */
254 struct iwn_dma_info ict_dma;
255 uint32_t *ict;
256 int ict_cur;
257
258 /* TX/RX rings. */
259 struct iwn_tx_ring txq[IWN5000_NTXQUEUES];
260 struct iwn_rx_ring rxq;
261
262 bus_space_tag_t sc_st;
263 bus_space_handle_t sc_sh;
264 void *sc_ih;
265 pci_chipset_tag_t sc_pct;
266 pcitag_t sc_pcitag;
267 bus_size_t sc_sz;
268 int sc_cap_off; /* PCIe Capabilities. */
269 struct sysmon_envsys *sc_sme;
270 envsys_data_t sc_sensor;
271 callout_t calib_to;
272 int calib_cnt;
273 struct iwn_calib_state calib;
274
275 struct iwn_fw_info fw;
276 struct iwn_calib_info calibcmd[5];
277 uint32_t errptr;
278
279 struct iwn_rx_stat last_rx_stat;
280 int last_rx_valid;
281 struct iwn_ucode_info ucode_info;
282 struct iwn_rxon rxon;
283 uint32_t rawtemp;
284 int temp;
285 int noise;
286 uint32_t qfullmsk;
287
288 uint32_t prom_base;
289 struct iwn4965_eeprom_band
290 bands[IWN_NBANDS];
291 uint16_t rfcfg;
292 uint8_t calib_ver;
293 char eeprom_domain[4];
294 uint32_t eeprom_crystal;
295 int16_t eeprom_temp;
296 int16_t eeprom_voltage;
297 int8_t maxpwr2GHz;
298 int8_t maxpwr5GHz;
299 int8_t maxpwr[IEEE80211_CHAN_MAX];
300 int8_t enh_maxpwr[35];
301
302 int32_t temp_off;
303 uint32_t int_mask;
304 uint8_t ntxchains;
305 uint8_t nrxchains;
306 uint8_t txchainmask;
307 uint8_t rxchainmask;
308 uint8_t chainmask;
309
310 int sc_tx_timer;
311 void *powerhook;
312
313 struct bpf_if * sc_drvbpf;
314
315 union {
316 struct iwn_rx_radiotap_header th;
317 uint8_t pad[IEEE80211_RADIOTAP_HDRLEN];
318 } sc_rxtapu;
319 #define sc_rxtap sc_rxtapu.th
320 int sc_rxtap_len;
321
322 union {
323 struct iwn_tx_radiotap_header th;
324 uint8_t pad[IEEE80211_RADIOTAP_HDRLEN];
325 } sc_txtapu;
326 #define sc_txtap sc_txtapu.th
327 int sc_txtap_len;
328
329 kmutex_t sc_mtx; /* mutex for init/stop */
330
331 };
332
333