if_iwnvar.h revision 1.16 1 /* $NetBSD: if_iwnvar.h,v 1.16 2014/10/30 13:05:58 nonaka Exp $ */
2 /* $OpenBSD: if_iwnvar.h,v 1.28 2014/09/09 18:55:08 sthen 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 int (*config_bt_coex)(struct iwn_softc *);
183 void (*update_sched)(struct iwn_softc *, int, int, uint8_t,
184 uint16_t);
185 int (*get_temperature)(struct iwn_softc *);
186 int (*get_rssi)(const struct iwn_rx_stat *);
187 int (*set_txpower)(struct iwn_softc *, int);
188 int (*init_gains)(struct iwn_softc *);
189 int (*set_gains)(struct iwn_softc *);
190 int (*add_node)(struct iwn_softc *, struct iwn_node_info *,
191 int);
192 void (*tx_done)(struct iwn_softc *, struct iwn_rx_desc *,
193 struct iwn_rx_data *);
194 #ifndef IEEE80211_NO_HT
195 void (*ampdu_tx_start)(struct iwn_softc *,
196 struct ieee80211_node *, uint8_t, uint16_t);
197 void (*ampdu_tx_stop)(struct iwn_softc *, uint8_t,
198 uint16_t);
199 #endif
200 };
201
202 struct iwn_softc {
203 device_t sc_dev;
204
205 struct ethercom sc_ec;
206 struct ieee80211com sc_ic;
207 int (*sc_newstate)(struct ieee80211com *,
208 enum ieee80211_state, int);
209
210 struct ieee80211_amrr amrr;
211 uint8_t fixed_ridx;
212
213 bus_dma_tag_t sc_dmat;
214
215 u_int sc_flags;
216 #define IWN_FLAG_HAS_5GHZ (1 << 0)
217 #define IWN_FLAG_HAS_OTPROM (1 << 1)
218 #define IWN_FLAG_CALIB_DONE (1 << 2)
219 #define IWN_FLAG_USE_ICT (1 << 3)
220 #define IWN_FLAG_INTERNAL_PA (1 << 4)
221 #define IWN_FLAG_HAS_11N (1 << 6)
222 #define IWN_FLAG_ENH_SENS (1 << 7)
223 /* Added for NetBSD */
224 #define IWN_FLAG_SCANNING (1 << 8)
225 #define IWN_FLAG_HW_INITED (1 << 9)
226
227 uint8_t hw_type;
228
229 struct iwn_ops ops;
230 const char *fwname;
231 const struct iwn_sensitivity_limits
232 *limits;
233 int ntxqs;
234 int ndmachnls;
235 uint8_t broadcast_id;
236 int rxonsz;
237 int schedsz;
238 uint32_t fw_text_maxsz;
239 uint32_t fw_data_maxsz;
240 uint32_t fwsz;
241 bus_size_t sched_txfact_addr;
242
243 /* TX scheduler rings. */
244 struct iwn_dma_info sched_dma;
245 uint16_t *sched;
246 uint32_t sched_base;
247
248 /* "Keep Warm" page. */
249 struct iwn_dma_info kw_dma;
250
251 /* Firmware DMA transfer. */
252 struct iwn_dma_info fw_dma;
253
254 /* ICT table. */
255 struct iwn_dma_info ict_dma;
256 uint32_t *ict;
257 int ict_cur;
258
259 /* TX/RX rings. */
260 struct iwn_tx_ring txq[IWN5000_NTXQUEUES];
261 struct iwn_rx_ring rxq;
262
263 bus_space_tag_t sc_st;
264 bus_space_handle_t sc_sh;
265 void *sc_ih;
266 pci_chipset_tag_t sc_pct;
267 pcitag_t sc_pcitag;
268 bus_size_t sc_sz;
269 int sc_cap_off; /* PCIe Capabilities. */
270 struct sysmon_envsys *sc_sme;
271 envsys_data_t sc_sensor;
272 callout_t calib_to;
273 int calib_cnt;
274 struct iwn_calib_state calib;
275
276 struct iwn_fw_info fw;
277 struct iwn_calib_info calibcmd[5];
278 uint32_t errptr;
279
280 struct iwn_rx_stat last_rx_stat;
281 int last_rx_valid;
282 struct iwn_ucode_info ucode_info;
283 struct iwn_rxon rxon;
284 uint32_t rawtemp;
285 int temp;
286 int noise;
287 uint32_t qfullmsk;
288
289 uint32_t prom_base;
290 struct iwn4965_eeprom_band
291 bands[IWN_NBANDS];
292 uint16_t rfcfg;
293 uint8_t calib_ver;
294 char eeprom_domain[4];
295 uint32_t eeprom_crystal;
296 int16_t eeprom_temp;
297 int16_t eeprom_voltage;
298 int16_t eeprom_rawtemp;
299 int8_t maxpwr2GHz;
300 int8_t maxpwr5GHz;
301 int8_t maxpwr[IEEE80211_CHAN_MAX];
302 int8_t enh_maxpwr[35];
303
304 uint8_t reset_noise_gain;
305 uint8_t noise_gain;
306
307 uint32_t tlv_feature_flags;
308
309 int32_t temp_off;
310 uint32_t int_mask;
311 uint8_t ntxchains;
312 uint8_t nrxchains;
313 uint8_t txchainmask;
314 uint8_t rxchainmask;
315 uint8_t chainmask;
316
317 int sc_tx_timer;
318 void *powerhook;
319
320 struct bpf_if * sc_drvbpf;
321
322 union {
323 struct iwn_rx_radiotap_header th;
324 uint8_t pad[IEEE80211_RADIOTAP_HDRLEN];
325 } sc_rxtapu;
326 #define sc_rxtap sc_rxtapu.th
327 int sc_rxtap_len;
328
329 union {
330 struct iwn_tx_radiotap_header th;
331 uint8_t pad[IEEE80211_RADIOTAP_HDRLEN];
332 } sc_txtapu;
333 #define sc_txtap sc_txtapu.th
334 int sc_txtap_len;
335
336 kmutex_t sc_mtx; /* mutex for init/stop */
337
338 };
339
340