if_iwnvar.h revision 1.12 1 /* $NetBSD: if_iwnvar.h,v 1.12 2010/07/02 14:47:25 christos Exp $ */
2 /* $OpenBSD: if_iwnvar.h,v 1.19 2010/05/05 19:47:43 damien 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_hal {
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 int ntxqs;
200 int ndmachnls;
201 uint8_t broadcast_id;
202 int rxonsz;
203 int schedsz;
204 uint32_t fw_text_maxsz;
205 uint32_t fw_data_maxsz;
206 uint32_t fwsz;
207 bus_size_t sched_txfact_addr;
208 };
209
210 struct iwn_softc {
211 device_t sc_dev;
212
213 struct ethercom sc_ec;
214 struct ieee80211com sc_ic;
215 int (*sc_newstate)(struct ieee80211com *,
216 enum ieee80211_state, int);
217
218 struct ieee80211_amrr amrr;
219 uint8_t fixed_ridx;
220
221 bus_dma_tag_t sc_dmat;
222
223 u_int sc_flags;
224 #define IWN_FLAG_HAS_5GHZ (1 << 0)
225 #define IWN_FLAG_HAS_OTPROM (1 << 1)
226 #define IWN_FLAG_CALIB_DONE (1 << 2)
227 #define IWN_FLAG_USE_ICT (1 << 3)
228 #define IWN_FLAG_INTERNAL_PA (1 << 4)
229 /* Added for NetBSD */
230 #define IWN_FLAG_SCANNING (1 << 8)
231 #define IWN_FLAG_HW_INITED (1 << 9)
232
233 uint8_t hw_type;
234 const struct iwn_hal *sc_hal;
235 const char *fwname;
236 const struct iwn_sensitivity_limits
237 *limits;
238
239 /* TX scheduler rings. */
240 struct iwn_dma_info sched_dma;
241 uint16_t *sched;
242 uint32_t sched_base;
243
244 /* "Keep Warm" page. */
245 struct iwn_dma_info kw_dma;
246
247 /* Firmware DMA transfer. */
248 struct iwn_dma_info fw_dma;
249
250 /* ICT table. */
251 struct iwn_dma_info ict_dma;
252 uint32_t *ict;
253 int ict_cur;
254
255 /* TX/RX rings. */
256 struct iwn_tx_ring txq[IWN5000_NTXQUEUES];
257 struct iwn_rx_ring rxq;
258
259 bus_space_tag_t sc_st;
260 bus_space_handle_t sc_sh;
261 void *sc_ih;
262 pci_chipset_tag_t sc_pct;
263 pcitag_t sc_pcitag;
264 bus_size_t sc_sz;
265 int sc_cap_off; /* PCIe Capabilities. */
266 struct sysmon_envsys *sc_sme;
267 envsys_data_t sc_sensor;
268 callout_t calib_to;
269 int calib_cnt;
270 struct iwn_calib_state calib;
271
272 struct iwn_fw_info fw;
273 struct iwn_calib_info calibcmd[5];
274 uint32_t errptr;
275
276 struct iwn_rx_stat last_rx_stat;
277 int last_rx_valid;
278 struct iwn_ucode_info ucode_info;
279 struct iwn_rxon rxon;
280 uint32_t rawtemp;
281 int temp;
282 int noise;
283 uint32_t qfullmsk;
284
285 uint32_t prom_base;
286 struct iwn4965_eeprom_band
287 bands[IWN_NBANDS];
288 uint16_t rfcfg;
289 uint8_t calib_ver;
290 char eeprom_domain[4];
291 uint32_t eeprom_crystal;
292 int16_t eeprom_voltage;
293 int8_t maxpwr2GHz;
294 int8_t maxpwr5GHz;
295 int8_t maxpwr[IEEE80211_CHAN_MAX];
296 int8_t enh_maxpwr[35];
297
298 int32_t temp_off;
299 uint32_t int_mask;
300 uint8_t ntxchains;
301 uint8_t nrxchains;
302 uint8_t txchainmask;
303 uint8_t rxchainmask;
304 uint8_t chainmask;
305
306 int sc_tx_timer;
307 void *powerhook;
308
309 struct bpf_if * sc_drvbpf;
310
311 union {
312 struct iwn_rx_radiotap_header th;
313 uint8_t pad[IEEE80211_RADIOTAP_HDRLEN];
314 } sc_rxtapu;
315 #define sc_rxtap sc_rxtapu.th
316 int sc_rxtap_len;
317
318 union {
319 struct iwn_tx_radiotap_header th;
320 uint8_t pad[IEEE80211_RADIOTAP_HDRLEN];
321 } sc_txtapu;
322 #define sc_txtap sc_txtapu.th
323 int sc_txtap_len;
324
325 kmutex_t sc_mtx; /* mutex for init/stop */
326
327 };
328
329