1/* $NetBSD: if_iwnvar.h,v 1.17 2015/09/22 23:23:06 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@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
24struct 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
43struct 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
58struct 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
67struct 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
75struct 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
88struct iwn_softc;
89
90struct iwn_rbuf {
91 struct iwn_softc *sc;
92 void * vaddr;
93 bus_addr_t paddr;
94 SLIST_ENTRY(iwn_rbuf) next;
95};
96
97struct iwn_rx_data {
98 struct mbuf *m;
99 bus_dmamap_t map;
100};
101
102struct 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
116struct 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
124struct 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
157struct iwn_calib_info {
158 uint8_t *buf;
159 u_int len;
160};
161
162struct iwn_fw_part {
163 const uint8_t *text;
164 uint32_t textsz;
165 const uint8_t *data;
166 uint32_t datasz;
167};
168
169struct 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
177struct 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
202struct 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_HW_INITED (1 << 8)
225#define IWN_FLAG_SCANNING_2GHZ (1 << 9)
226#define IWN_FLAG_SCANNING_5GHZ (1 << 10)
227#define IWN_FLAG_SCANNING (IWN_FLAG_SCANNING_2GHZ|IWN_FLAG_SCANNING_5GHZ)
228
229 uint8_t hw_type;
230
231 struct iwn_ops ops;
232 const char *fwname;
233 const struct iwn_sensitivity_limits
234 *limits;
235 int ntxqs;
236 int ndmachnls;
237 uint8_t broadcast_id;
238 int rxonsz;
239 int schedsz;
240 uint32_t fw_text_maxsz;
241 uint32_t fw_data_maxsz;
242 uint32_t fwsz;
243 bus_size_t sched_txfact_addr;
244
245 /* TX scheduler rings. */
246 struct iwn_dma_info sched_dma;
247 uint16_t *sched;
248 uint32_t sched_base;
249
250 /* "Keep Warm" page. */
251 struct iwn_dma_info kw_dma;
252
253 /* Firmware DMA transfer. */
254 struct iwn_dma_info fw_dma;
255
256 /* ICT table. */
257 struct iwn_dma_info ict_dma;
258 uint32_t *ict;
259 int ict_cur;
260
261 /* TX/RX rings. */
262 struct iwn_tx_ring txq[IWN5000_NTXQUEUES];
263 struct iwn_rx_ring rxq;
264
265 bus_space_tag_t sc_st;
266 bus_space_handle_t sc_sh;
267 void *sc_ih;
268 pci_chipset_tag_t sc_pct;
269 pcitag_t sc_pcitag;
270 bus_size_t sc_sz;
271 int sc_cap_off; /* PCIe Capabilities. */
272 struct sysmon_envsys *sc_sme;
273 envsys_data_t sc_sensor;
274 callout_t calib_to;
275 int calib_cnt;
276 struct iwn_calib_state calib;
277
278 struct iwn_fw_info fw;
279 struct iwn_calib_info calibcmd[5];
280 uint32_t errptr;
281
282 struct iwn_rx_stat last_rx_stat;
283 int last_rx_valid;
284 struct iwn_ucode_info ucode_info;
285 struct iwn_rxon rxon;
286 uint32_t rawtemp;
287 int temp;
288 int noise;
289 uint32_t qfullmsk;
290
291 uint32_t prom_base;
292 struct iwn4965_eeprom_band
293 bands[IWN_NBANDS];
294 uint16_t rfcfg;
295 uint8_t calib_ver;
296 char eeprom_domain[4];
297 uint32_t eeprom_crystal;
298 int16_t eeprom_temp;
299 int16_t eeprom_voltage;
300 int16_t eeprom_rawtemp;
301 int8_t maxpwr2GHz;
302 int8_t maxpwr5GHz;
303 int8_t maxpwr[IEEE80211_CHAN_MAX];
304 int8_t enh_maxpwr[35];
305
306 uint8_t reset_noise_gain;
307 uint8_t noise_gain;
308
309 uint32_t tlv_feature_flags;
310
311 int32_t temp_off;
312 uint32_t int_mask;
313 uint8_t ntxchains;
314 uint8_t nrxchains;
315 uint8_t txchainmask;
316 uint8_t rxchainmask;
317 uint8_t chainmask;
318
319 int sc_tx_timer;
320 void *powerhook;
321
322 struct bpf_if * sc_drvbpf;
323
324 union {
325 struct iwn_rx_radiotap_header th;
326 uint8_t pad[IEEE80211_RADIOTAP_HDRLEN];
327 } sc_rxtapu;
328#define sc_rxtap sc_rxtapu.th
329 int sc_rxtap_len;
330
331 union {
332 struct iwn_tx_radiotap_header th;
333 uint8_t pad[IEEE80211_RADIOTAP_HDRLEN];
334 } sc_txtapu;
335#define sc_txtap sc_txtapu.th
336 int sc_txtap_len;
337
338 kmutex_t sc_mtx; /* mutex for init/stop */
339
340};
341
342