iwn - wlan_assert_serialized in iwn_init/_start/_ioctl
[dragonfly.git] / sys / dev / netif / iwn / if_iwn.c
1 /*-
2  * Copyright (c) 2007-2009
3  *      Damien Bergamini <damien.bergamini@free.fr>
4  * Copyright (c) 2008
5  *      Benjamin Close <benjsc@FreeBSD.org>
6  * Copyright (c) 2008 Sam Leffler, Errno Consulting
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 /*
22  * Driver for Intel WiFi Link 4965 and 1000/5000/6000 Series 802.11 network
23  * adapters.
24  */
25
26 /* $FreeBSD$ */
27
28 #include <sys/param.h>
29 #include <sys/sockio.h>
30 #include <sys/sysctl.h>
31 #include <sys/mbuf.h>
32 #include <sys/kernel.h>
33 #include <sys/socket.h>
34 #include <sys/systm.h>
35 #include <sys/malloc.h>
36 #include <sys/bus.h>
37 #include <sys/rman.h>
38 #include <sys/endian.h>
39 #include <sys/firmware.h>
40 #include <sys/limits.h>
41 #include <sys/module.h>
42 #include <sys/queue.h>
43 #include <sys/taskqueue.h>
44 #include <sys/libkern.h>
45
46 #include <sys/bus.h>
47 #include <sys/resource.h>
48 #include <machine/clock.h>
49
50 #include <bus/pci/pcireg.h>
51 #include <bus/pci/pcivar.h>
52
53 #include <net/bpf.h>
54 #include <net/if.h>
55 #include <net/if_arp.h>
56 #include <net/ifq_var.h>
57 #include <net/ethernet.h>
58 #include <net/if_dl.h>
59 #include <net/if_media.h>
60 #include <net/if_types.h>
61
62 #include <netinet/in.h>
63 #include <netinet/in_systm.h>
64 #include <netinet/in_var.h>
65 #include <netinet/if_ether.h>
66 #include <netinet/ip.h>
67
68 #include <netproto/802_11/ieee80211_var.h>
69 #include <netproto/802_11/ieee80211_radiotap.h>
70 #include <netproto/802_11/ieee80211_regdomain.h>
71 #include <netproto/802_11/ieee80211_ratectl.h>
72
73 #include "if_iwnreg.h"
74 #include "if_iwnvar.h"
75
76 static int      iwn_pci_probe(device_t);
77 static int      iwn_pci_attach(device_t);
78 static const struct iwn_hal *iwn_hal_attach(struct iwn_softc *);
79 static void     iwn_radiotap_attach(struct iwn_softc *);
80 static struct ieee80211vap *iwn_vap_create(struct ieee80211com *,
81                     const char name[IFNAMSIZ], int unit, int opmode,
82                     int flags, const uint8_t bssid[IEEE80211_ADDR_LEN],
83                     const uint8_t mac[IEEE80211_ADDR_LEN]);
84 static void     iwn_vap_delete(struct ieee80211vap *);
85 static int      iwn_cleanup(device_t);
86 static int      iwn_pci_detach(device_t);
87 static int      iwn_nic_lock(struct iwn_softc *);
88 static int      iwn_eeprom_lock(struct iwn_softc *);
89 static int      iwn_init_otprom(struct iwn_softc *);
90 static int      iwn_read_prom_data(struct iwn_softc *, uint32_t, void *, int);
91 static void     iwn_dma_map_addr(void *, bus_dma_segment_t *, int, int);
92 static int      iwn_dma_contig_alloc(struct iwn_softc *, struct iwn_dma_info *,
93                     void **, bus_size_t, bus_size_t, int);
94 static void     iwn_dma_contig_free(struct iwn_dma_info *);
95 static int      iwn_alloc_sched(struct iwn_softc *);
96 static void     iwn_free_sched(struct iwn_softc *);
97 static int      iwn_alloc_kw(struct iwn_softc *);
98 static void     iwn_free_kw(struct iwn_softc *);
99 static int      iwn_alloc_ict(struct iwn_softc *);
100 static void     iwn_free_ict(struct iwn_softc *);
101 static int      iwn_alloc_fwmem(struct iwn_softc *);
102 static void     iwn_free_fwmem(struct iwn_softc *);
103 static int      iwn_alloc_rx_ring(struct iwn_softc *, struct iwn_rx_ring *);
104 static void     iwn_reset_rx_ring(struct iwn_softc *, struct iwn_rx_ring *);
105 static void     iwn_free_rx_ring(struct iwn_softc *, struct iwn_rx_ring *);
106 static int      iwn_alloc_tx_ring(struct iwn_softc *, struct iwn_tx_ring *,
107                     int);
108 static void     iwn_reset_tx_ring(struct iwn_softc *, struct iwn_tx_ring *);
109 static void     iwn_free_tx_ring(struct iwn_softc *, struct iwn_tx_ring *);
110 static void     iwn5000_ict_reset(struct iwn_softc *);
111 static int      iwn_read_eeprom(struct iwn_softc *,
112                     uint8_t macaddr[IEEE80211_ADDR_LEN]);
113 static void     iwn4965_read_eeprom(struct iwn_softc *);
114 static void     iwn4965_print_power_group(struct iwn_softc *, int);
115 static void     iwn5000_read_eeprom(struct iwn_softc *);
116 static uint32_t iwn_eeprom_channel_flags(struct iwn_eeprom_chan *);
117 static void     iwn_read_eeprom_band(struct iwn_softc *, int);
118 #if 0   /* HT */
119 static void     iwn_read_eeprom_ht40(struct iwn_softc *, int);
120 #endif
121 static void     iwn_read_eeprom_channels(struct iwn_softc *, int,
122                     uint32_t);
123 static void     iwn_read_eeprom_enhinfo(struct iwn_softc *);
124 static struct ieee80211_node *iwn_node_alloc(struct ieee80211vap *,
125                     const uint8_t mac[IEEE80211_ADDR_LEN]);
126 static void     iwn_newassoc(struct ieee80211_node *, int);
127 static int      iwn_media_change(struct ifnet *);
128 static int      iwn_newstate(struct ieee80211vap *, enum ieee80211_state, int);
129 static void     iwn_rx_phy(struct iwn_softc *, struct iwn_rx_desc *,
130                     struct iwn_rx_data *);
131 static void     iwn_timer_callout(void *);
132 static void     iwn_calib_reset(struct iwn_softc *);
133 static void     iwn_rx_done(struct iwn_softc *, struct iwn_rx_desc *,
134                     struct iwn_rx_data *);
135 #if 0   /* HT */
136 static void     iwn_rx_compressed_ba(struct iwn_softc *, struct iwn_rx_desc *,
137                     struct iwn_rx_data *);
138 #endif
139 static void     iwn5000_rx_calib_results(struct iwn_softc *,
140                     struct iwn_rx_desc *, struct iwn_rx_data *);
141 static void     iwn_rx_statistics(struct iwn_softc *, struct iwn_rx_desc *,
142                     struct iwn_rx_data *);
143 static void     iwn4965_tx_done(struct iwn_softc *, struct iwn_rx_desc *,
144                     struct iwn_rx_data *);
145 static void     iwn5000_tx_done(struct iwn_softc *, struct iwn_rx_desc *,
146                     struct iwn_rx_data *);
147 static void     iwn_tx_done(struct iwn_softc *, struct iwn_rx_desc *, int,
148                     uint8_t);
149 static void     iwn_cmd_done(struct iwn_softc *, struct iwn_rx_desc *);
150 static void     iwn_notif_intr(struct iwn_softc *);
151 static void     iwn_wakeup_intr(struct iwn_softc *);
152 static void     iwn_rftoggle_intr(struct iwn_softc *);
153 static void     iwn_fatal_intr(struct iwn_softc *);
154 static void     iwn_intr(void *);
155 static void     iwn4965_update_sched(struct iwn_softc *, int, int, uint8_t,
156                     uint16_t);
157 static void     iwn5000_update_sched(struct iwn_softc *, int, int, uint8_t,
158                     uint16_t);
159 #ifdef notyet
160 static void     iwn5000_reset_sched(struct iwn_softc *, int, int);
161 #endif
162 static uint8_t  iwn_plcp_signal(int);
163 static int      iwn_tx_data(struct iwn_softc *, struct mbuf *,
164                     struct ieee80211_node *, struct iwn_tx_ring *);
165 static int      iwn_raw_xmit(struct ieee80211_node *, struct mbuf *,
166                     const struct ieee80211_bpf_params *);
167 static void     iwn_start(struct ifnet *);
168 static void     iwn_start_locked(struct ifnet *);
169 static void     iwn_watchdog(struct iwn_softc *sc);
170 static int      iwn_ioctl(struct ifnet *, u_long, caddr_t, struct ucred *);
171 static int      iwn_cmd(struct iwn_softc *, int, const void *, int, int);
172 static int      iwn4965_add_node(struct iwn_softc *, struct iwn_node_info *,
173                     int);
174 static int      iwn5000_add_node(struct iwn_softc *, struct iwn_node_info *,
175                     int);
176 static int      iwn_set_link_quality(struct iwn_softc *, uint8_t, int);
177 static int      iwn_add_broadcast_node(struct iwn_softc *, int);
178 static int      iwn_wme_update(struct ieee80211com *);
179 static void     iwn_update_mcast(struct ifnet *);
180 static void     iwn_set_led(struct iwn_softc *, uint8_t, uint8_t, uint8_t);
181 static int      iwn_set_critical_temp(struct iwn_softc *);
182 static int      iwn_set_timing(struct iwn_softc *, struct ieee80211_node *);
183 static void     iwn4965_power_calibration(struct iwn_softc *, int);
184 static int      iwn4965_set_txpower(struct iwn_softc *,
185                     struct ieee80211_channel *, int);
186 static int      iwn5000_set_txpower(struct iwn_softc *,
187                     struct ieee80211_channel *, int);
188 static int      iwn4965_get_rssi(struct iwn_softc *, struct iwn_rx_stat *);
189 static int      iwn5000_get_rssi(struct iwn_softc *, struct iwn_rx_stat *);
190 static int      iwn_get_noise(const struct iwn_rx_general_stats *);
191 static int      iwn4965_get_temperature(struct iwn_softc *);
192 static int      iwn5000_get_temperature(struct iwn_softc *);
193 static int      iwn_init_sensitivity(struct iwn_softc *);
194 static void     iwn_collect_noise(struct iwn_softc *,
195                     const struct iwn_rx_general_stats *);
196 static int      iwn4965_init_gains(struct iwn_softc *);
197 static int      iwn5000_init_gains(struct iwn_softc *);
198 static int      iwn4965_set_gains(struct iwn_softc *);
199 static int      iwn5000_set_gains(struct iwn_softc *);
200 static void     iwn_tune_sensitivity(struct iwn_softc *,
201                     const struct iwn_rx_stats *);
202 static int      iwn_send_sensitivity(struct iwn_softc *);
203 static int      iwn_set_pslevel(struct iwn_softc *, int, int, int);
204 static int      iwn_config(struct iwn_softc *);
205 static int      iwn_scan(struct iwn_softc *);
206 static int      iwn_auth(struct iwn_softc *, struct ieee80211vap *vap);
207 static int      iwn_run(struct iwn_softc *, struct ieee80211vap *vap);
208 #if 0   /* HT */
209 static int      iwn_ampdu_rx_start(struct ieee80211com *,
210                     struct ieee80211_node *, uint8_t);
211 static void     iwn_ampdu_rx_stop(struct ieee80211com *,
212                     struct ieee80211_node *, uint8_t);
213 static int      iwn_ampdu_tx_start(struct ieee80211com *,
214                     struct ieee80211_node *, uint8_t);
215 static void     iwn_ampdu_tx_stop(struct ieee80211com *,
216                     struct ieee80211_node *, uint8_t);
217 static void     iwn4965_ampdu_tx_start(struct iwn_softc *,
218                     struct ieee80211_node *, uint8_t, uint16_t);
219 static void     iwn4965_ampdu_tx_stop(struct iwn_softc *, uint8_t, uint16_t);
220 static void     iwn5000_ampdu_tx_start(struct iwn_softc *,
221                     struct ieee80211_node *, uint8_t, uint16_t);
222 static void     iwn5000_ampdu_tx_stop(struct iwn_softc *, uint8_t, uint16_t);
223 #endif
224 static int      iwn5000_query_calibration(struct iwn_softc *);
225 static int      iwn5000_send_calibration(struct iwn_softc *);
226 static int      iwn5000_send_wimax_coex(struct iwn_softc *);
227 static int      iwn4965_post_alive(struct iwn_softc *);
228 static int      iwn5000_post_alive(struct iwn_softc *);
229 static int      iwn4965_load_bootcode(struct iwn_softc *, const uint8_t *,
230                     int);
231 static int      iwn4965_load_firmware(struct iwn_softc *);
232 static int      iwn5000_load_firmware_section(struct iwn_softc *, uint32_t,
233                     const uint8_t *, int);
234 static int      iwn5000_load_firmware(struct iwn_softc *);
235 static int      iwn_read_firmware(struct iwn_softc *);
236 static int      iwn_clock_wait(struct iwn_softc *);
237 static int      iwn_apm_init(struct iwn_softc *);
238 static void     iwn_apm_stop_master(struct iwn_softc *);
239 static void     iwn_apm_stop(struct iwn_softc *);
240 static int      iwn4965_nic_config(struct iwn_softc *);
241 static int      iwn5000_nic_config(struct iwn_softc *);
242 static int      iwn_hw_prepare(struct iwn_softc *);
243 static int      iwn_hw_init(struct iwn_softc *);
244 static void     iwn_hw_stop(struct iwn_softc *);
245 static void     iwn_init_locked(struct iwn_softc *);
246 static void     iwn_init(void *);
247 static void     iwn_stop_locked(struct iwn_softc *);
248 static void     iwn_stop(struct iwn_softc *);
249 static void     iwn_scan_start(struct ieee80211com *);
250 static void     iwn_scan_end(struct ieee80211com *);
251 static void     iwn_set_channel(struct ieee80211com *);
252 static void     iwn_scan_curchan(struct ieee80211_scan_state *, unsigned long);
253 static void     iwn_scan_mindwell(struct ieee80211_scan_state *);
254 static struct iwn_eeprom_chan *iwn_find_eeprom_channel(struct iwn_softc *,
255                     struct ieee80211_channel *);
256 static int      iwn_setregdomain(struct ieee80211com *,
257                     struct ieee80211_regdomain *, int,
258                     struct ieee80211_channel []);
259 static void     iwn_hw_reset_task(void *, int);
260 static void     iwn_radio_on_task(void *, int);
261 static void     iwn_radio_off_task(void *, int);
262 static void     iwn_sysctlattach(struct iwn_softc *);
263 static int      iwn_pci_shutdown(device_t);
264 static int      iwn_pci_suspend(device_t);
265 static int      iwn_pci_resume(device_t);
266
267 #define IWN_DEBUG
268 #ifdef IWN_DEBUG
269 enum {
270         IWN_DEBUG_XMIT          = 0x00000001,   /* basic xmit operation */
271         IWN_DEBUG_RECV          = 0x00000002,   /* basic recv operation */
272         IWN_DEBUG_STATE         = 0x00000004,   /* 802.11 state transitions */
273         IWN_DEBUG_TXPOW         = 0x00000008,   /* tx power processing */
274         IWN_DEBUG_RESET         = 0x00000010,   /* reset processing */
275         IWN_DEBUG_OPS           = 0x00000020,   /* iwn_ops processing */
276         IWN_DEBUG_BEACON        = 0x00000040,   /* beacon handling */
277         IWN_DEBUG_WATCHDOG      = 0x00000080,   /* watchdog timeout */
278         IWN_DEBUG_INTR          = 0x00000100,   /* ISR */
279         IWN_DEBUG_CALIBRATE     = 0x00000200,   /* periodic calibration */
280         IWN_DEBUG_NODE          = 0x00000400,   /* node management */
281         IWN_DEBUG_LED           = 0x00000800,   /* led management */
282         IWN_DEBUG_CMD           = 0x00001000,   /* cmd submission */
283         IWN_DEBUG_FATAL         = 0x80000000,   /* fatal errors */
284         IWN_DEBUG_ANY           = 0xffffffff
285 };
286
287 #define DPRINTF(sc, m, fmt, ...) do {                   \
288         if (sc->sc_debug & (m))                         \
289                 kprintf(fmt, __VA_ARGS__);              \
290 } while (0)
291
292 static const char *iwn_intr_str(uint8_t);
293 #else
294 #define DPRINTF(sc, m, fmt, ...) do { (void) sc; } while (0)
295 #endif
296
297 struct iwn_ident {
298         uint16_t        vendor;
299         uint16_t        device;
300         const char      *name;
301 };
302
303 static const struct iwn_ident iwn_ident_table [] = {
304         { 0x8086, 0x4229, "Intel(R) PRO/Wireless 4965BGN" },
305         { 0x8086, 0x422D, "Intel(R) PRO/Wireless 4965BGN" },
306         { 0x8086, 0x4230, "Intel(R) PRO/Wireless 4965BGN" },
307         { 0x8086, 0x4233, "Intel(R) PRO/Wireless 4965BGN" },
308         { 0x8086, 0x4232, "Intel(R) PRO/Wireless 5100" },
309         { 0x8086, 0x4237, "Intel(R) PRO/Wireless 5100" },
310         { 0x8086, 0x423C, "Intel(R) PRO/Wireless 5150" },
311         { 0x8086, 0x423D, "Intel(R) PRO/Wireless 5150" },
312         { 0x8086, 0x4235, "Intel(R) PRO/Wireless 5300" },
313         { 0x8086, 0x4236, "Intel(R) PRO/Wireless 5300" },
314         { 0x8086, 0x423A, "Intel(R) PRO/Wireless 5350" },
315         { 0x8086, 0x423B, "Intel(R) PRO/Wireless 5350" },
316         { 0x8086, 0x0083, "Intel(R) PRO/Wireless 1000" },
317         { 0x8086, 0x0084, "Intel(R) PRO/Wireless 1000" },
318         { 0x8086, 0x008D, "Intel(R) PRO/Wireless 6000" },
319         { 0x8086, 0x008E, "Intel(R) PRO/Wireless 6000" },
320         { 0x8086, 0x4238, "Intel(R) PRO/Wireless 6000" },
321         { 0x8086, 0x4239, "Intel(R) PRO/Wireless 6000" },
322         { 0x8086, 0x422B, "Intel(R) PRO/Wireless 6000" },
323         { 0x8086, 0x422C, "Intel(R) PRO/Wireless 6000" },
324         { 0x8086, 0x0086, "Intel(R) PRO/Wireless 6050" },
325         { 0x8086, 0x0087, "Intel(R) PRO/Wireless 6050" },
326         { 0x8086, 0x08AE, "Intel(R) Centrino Wireless-N 100" },
327         { 0, 0, NULL }
328 };
329
330 static const struct iwn_hal iwn4965_hal = {
331         iwn4965_load_firmware,
332         iwn4965_read_eeprom,
333         iwn4965_post_alive,
334         iwn4965_nic_config,
335         iwn4965_update_sched,
336         iwn4965_get_temperature,
337         iwn4965_get_rssi,
338         iwn4965_set_txpower,
339         iwn4965_init_gains,
340         iwn4965_set_gains,
341         iwn4965_add_node,
342         iwn4965_tx_done,
343 #if 0   /* HT */
344         iwn4965_ampdu_tx_start,
345         iwn4965_ampdu_tx_stop,
346 #endif
347         IWN4965_NTXQUEUES,
348         IWN4965_NDMACHNLS,
349         IWN4965_ID_BROADCAST,
350         IWN4965_RXONSZ,
351         IWN4965_SCHEDSZ,
352         IWN4965_FW_TEXT_MAXSZ,
353         IWN4965_FW_DATA_MAXSZ,
354         IWN4965_FWSZ,
355         IWN4965_SCHED_TXFACT
356 };
357
358 static const struct iwn_hal iwn5000_hal = {
359         iwn5000_load_firmware,
360         iwn5000_read_eeprom,
361         iwn5000_post_alive,
362         iwn5000_nic_config,
363         iwn5000_update_sched,
364         iwn5000_get_temperature,
365         iwn5000_get_rssi,
366         iwn5000_set_txpower,
367         iwn5000_init_gains,
368         iwn5000_set_gains,
369         iwn5000_add_node,
370         iwn5000_tx_done,
371 #if 0   /* HT */
372         iwn5000_ampdu_tx_start,
373         iwn5000_ampdu_tx_stop,
374 #endif
375         IWN5000_NTXQUEUES,
376         IWN5000_NDMACHNLS,
377         IWN5000_ID_BROADCAST,
378         IWN5000_RXONSZ,
379         IWN5000_SCHEDSZ,
380         IWN5000_FW_TEXT_MAXSZ,
381         IWN5000_FW_DATA_MAXSZ,
382         IWN5000_FWSZ,
383         IWN5000_SCHED_TXFACT
384 };
385
386 static int
387 iwn_pci_probe(device_t dev)
388 {
389         const struct iwn_ident *ident;
390
391         /* no wlan serializer needed */
392         for (ident = iwn_ident_table; ident->name != NULL; ident++) {
393                 if (pci_get_vendor(dev) == ident->vendor &&
394                     pci_get_device(dev) == ident->device) {
395                         device_set_desc(dev, ident->name);
396                         return 0;
397                 }
398         }
399         return ENXIO;
400 }
401
402 static int
403 iwn_pci_attach(device_t dev)
404 {
405         struct iwn_softc *sc = (struct iwn_softc *)device_get_softc(dev);
406         struct ieee80211com *ic;
407         struct ifnet *ifp;
408         const struct iwn_hal *hal;
409         uint32_t tmp;
410         int i, error;
411 #ifdef OLD_MSI
412         int result;
413 #endif
414         uint8_t macaddr[IEEE80211_ADDR_LEN];
415
416         wlan_serialize_enter();
417
418         sc->sc_dev = dev;
419         sc->sc_dmat = NULL;
420
421         if (bus_dma_tag_create(sc->sc_dmat,
422                         1, 0,
423                         BUS_SPACE_MAXADDR_32BIT,
424                         BUS_SPACE_MAXADDR,
425                         NULL, NULL,
426                         BUS_SPACE_MAXSIZE,
427                         IWN_MAX_SCATTER,
428                         BUS_SPACE_MAXSIZE,
429                         BUS_DMA_ALLOCNOW,
430                         &sc->sc_dmat)) {
431                 device_printf(dev, "cannot allocate DMA tag\n");
432                 error = ENOMEM;
433                 goto fail;
434         }
435
436
437
438         /* prepare sysctl tree for use in sub modules */
439         sysctl_ctx_init(&sc->sc_sysctl_ctx);
440         sc->sc_sysctl_tree = SYSCTL_ADD_NODE(&sc->sc_sysctl_ctx,
441                 SYSCTL_STATIC_CHILDREN(_hw),
442                 OID_AUTO,
443                 device_get_nameunit(sc->sc_dev),
444                 CTLFLAG_RD, 0, "");
445
446         /*
447          * Get the offset of the PCI Express Capability Structure in PCI
448          * Configuration Space.
449          */
450         error = pci_find_extcap(dev, PCIY_EXPRESS, &sc->sc_cap_off);
451         if (error != 0) {
452                 device_printf(dev, "PCIe capability structure not found!\n");
453                 goto fail2;
454         }
455
456         /* Clear device-specific "PCI retry timeout" register (41h). */
457         pci_write_config(dev, 0x41, 0, 1);
458
459         /* Hardware bug workaround. */
460         tmp = pci_read_config(dev, PCIR_COMMAND, 1);
461         if (tmp & PCIM_CMD_INTxDIS) {
462                 DPRINTF(sc, IWN_DEBUG_RESET, "%s: PCIe INTx Disable set\n",
463                     __func__);
464                 tmp &= ~PCIM_CMD_INTxDIS;
465                 pci_write_config(dev, PCIR_COMMAND, tmp, 1);
466         }
467
468         /* Enable bus-mastering. */
469         pci_enable_busmaster(dev);
470
471         sc->mem_rid = PCIR_BAR(0);
472         sc->mem = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &sc->mem_rid,
473             RF_ACTIVE);
474         if (sc->mem == NULL ) {
475                 device_printf(dev, "could not allocate memory resources\n");
476                 error = ENOMEM;
477                 goto fail2;
478         }
479
480         sc->sc_st = rman_get_bustag(sc->mem);
481         sc->sc_sh = rman_get_bushandle(sc->mem);
482         sc->irq_rid = 0;
483 #ifdef OLD_MSI
484         if ((result = pci_msi_count(dev)) == 1 &&
485             pci_alloc_msi(dev, &result) == 0)
486                 sc->irq_rid = 1;
487 #endif
488         sc->irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, &sc->irq_rid,
489             RF_ACTIVE | RF_SHAREABLE);
490         if (sc->irq == NULL) {
491                 device_printf(dev, "could not allocate interrupt resource\n");
492                 error = ENOMEM;
493                 goto fail;
494         }
495
496         callout_init(&sc->sc_timer_to);
497         TASK_INIT(&sc->sc_reinit_task, 0, iwn_hw_reset_task, sc );
498         TASK_INIT(&sc->sc_radioon_task, 0, iwn_radio_on_task, sc );
499         TASK_INIT(&sc->sc_radiooff_task, 0, iwn_radio_off_task, sc );
500
501         /* Attach Hardware Abstraction Layer. */
502         hal = iwn_hal_attach(sc);
503         if (hal == NULL) {
504                 error = ENXIO;  /* XXX: Wrong error code? */
505                 goto fail;
506         }
507
508         error = iwn_hw_prepare(sc);
509         if (error != 0) {
510                 device_printf(dev, "hardware not ready, error %d\n", error);
511                 goto fail;
512         }
513
514         /* Allocate DMA memory for firmware transfers. */
515         error = iwn_alloc_fwmem(sc);
516         if (error != 0) {
517                 device_printf(dev,
518                     "could not allocate memory for firmware, error %d\n",
519                     error);
520                 goto fail;
521         }
522
523         /* Allocate "Keep Warm" page. */
524         error = iwn_alloc_kw(sc);
525         if (error != 0) {
526                 device_printf(dev,
527                     "could not allocate \"Keep Warm\" page, error %d\n", error);
528                 goto fail;
529         }
530
531         /* Allocate ICT table for 5000 Series. */
532         if (sc->hw_type != IWN_HW_REV_TYPE_4965 &&
533             (error = iwn_alloc_ict(sc)) != 0) {
534                 device_printf(dev,
535                     "%s: could not allocate ICT table, error %d\n",
536                     __func__, error);
537                 goto fail;
538         }
539
540         /* Allocate TX scheduler "rings". */
541         error = iwn_alloc_sched(sc);
542         if (error != 0) {
543                 device_printf(dev,
544                     "could not allocate TX scheduler rings, error %d\n",
545                     error);
546                 goto fail;
547         }
548
549         /* Allocate TX rings (16 on 4965AGN, 20 on 5000). */
550         for (i = 0; i < hal->ntxqs; i++) {
551                 error = iwn_alloc_tx_ring(sc, &sc->txq[i], i);
552                 if (error != 0) {
553                         device_printf(dev,
554                             "could not allocate Tx ring %d, error %d\n",
555                             i, error);
556                         goto fail;
557                 }
558         }
559
560         /* Allocate RX ring. */
561         error = iwn_alloc_rx_ring(sc, &sc->rxq);
562         if (error != 0 ){
563                 device_printf(dev,
564                     "could not allocate Rx ring, error %d\n", error);
565                 goto fail;
566         }
567
568         /* Clear pending interrupts. */
569         IWN_WRITE(sc, IWN_INT, 0xffffffff);
570
571         /* Count the number of available chains. */
572         sc->ntxchains =
573             ((sc->txchainmask >> 2) & 1) +
574             ((sc->txchainmask >> 1) & 1) +
575             ((sc->txchainmask >> 0) & 1);
576         sc->nrxchains =
577             ((sc->rxchainmask >> 2) & 1) +
578             ((sc->rxchainmask >> 1) & 1) +
579             ((sc->rxchainmask >> 0) & 1);
580
581         ifp = sc->sc_ifp = if_alloc(IFT_IEEE80211);
582         if (ifp == NULL) {
583                 device_printf(dev, "can not allocate ifnet structure\n");
584                 goto fail;
585         }
586         ic = ifp->if_l2com;
587
588         ic->ic_ifp = ifp;
589         ic->ic_phytype = IEEE80211_T_OFDM;      /* not only, but not used */
590         ic->ic_opmode = IEEE80211_M_STA;        /* default to BSS mode */
591
592         /* Set device capabilities. */
593         ic->ic_caps =
594                   IEEE80211_C_STA               /* station mode supported */
595                 | IEEE80211_C_MONITOR           /* monitor mode supported */
596                 | IEEE80211_C_TXPMGT            /* tx power management */
597                 | IEEE80211_C_SHSLOT            /* short slot time supported */
598                 | IEEE80211_C_WPA
599                 | IEEE80211_C_SHPREAMBLE        /* short preamble supported */
600                 | IEEE80211_C_BGSCAN            /* background scanning */
601 #if 0
602                 | IEEE80211_C_IBSS              /* ibss/adhoc mode */
603 #endif
604                 | IEEE80211_C_WME               /* WME */
605                 ;
606 #if 0   /* HT */
607         /* XXX disable until HT channel setup works */
608         ic->ic_htcaps =
609                   IEEE80211_HTCAP_SMPS_ENA      /* SM PS mode enabled */
610                 | IEEE80211_HTCAP_CHWIDTH40     /* 40MHz channel width */
611                 | IEEE80211_HTCAP_SHORTGI20     /* short GI in 20MHz */
612                 | IEEE80211_HTCAP_SHORTGI40     /* short GI in 40MHz */
613                 | IEEE80211_HTCAP_RXSTBC_2STREAM/* 1-2 spatial streams */
614                 | IEEE80211_HTCAP_MAXAMSDU_3839 /* max A-MSDU length */
615                 /* s/w capabilities */
616                 | IEEE80211_HTC_HT              /* HT operation */
617                 | IEEE80211_HTC_AMPDU           /* tx A-MPDU */
618                 | IEEE80211_HTC_AMSDU           /* tx A-MSDU */
619                 ;
620
621         /* Set HT capabilities. */
622         ic->ic_htcaps =
623 #if IWN_RBUF_SIZE == 8192
624             IEEE80211_HTCAP_AMSDU7935 |
625 #endif
626             IEEE80211_HTCAP_CBW20_40 |
627             IEEE80211_HTCAP_SGI20 |
628             IEEE80211_HTCAP_SGI40;
629         if (sc->hw_type != IWN_HW_REV_TYPE_4965)
630                 ic->ic_htcaps |= IEEE80211_HTCAP_GF;
631         if (sc->hw_type == IWN_HW_REV_TYPE_6050)
632                 ic->ic_htcaps |= IEEE80211_HTCAP_SMPS_DYN;
633         else
634                 ic->ic_htcaps |= IEEE80211_HTCAP_SMPS_DIS;
635 #endif
636
637         /* Read MAC address, channels, etc from EEPROM. */
638         error = iwn_read_eeprom(sc, macaddr);
639         if (error != 0) {
640                 device_printf(dev, "could not read EEPROM, error %d\n",
641                     error);
642                 goto fail;
643         }
644
645         device_printf(sc->sc_dev, "MIMO %dT%dR, %.4s, address %6D\n",
646             sc->ntxchains, sc->nrxchains, sc->eeprom_domain,
647             macaddr, ":");
648
649 #if 0   /* HT */
650         /* Set supported HT rates. */
651         ic->ic_sup_mcs[0] = 0xff;
652         if (sc->nrxchains > 1)
653                 ic->ic_sup_mcs[1] = 0xff;
654         if (sc->nrxchains > 2)
655                 ic->ic_sup_mcs[2] = 0xff;
656 #endif
657
658         if_initname(ifp, device_get_name(dev), device_get_unit(dev));
659         ifp->if_softc = sc;
660         ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
661         ifp->if_init = iwn_init;
662         ifp->if_ioctl = iwn_ioctl;
663         ifp->if_start = iwn_start;
664         ifq_set_maxlen(&ifp->if_snd, IFQ_MAXLEN);
665         ifq_set_ready(&ifp->if_snd);
666
667         ieee80211_ifattach(ic, macaddr);
668         ic->ic_vap_create = iwn_vap_create;
669         ic->ic_vap_delete = iwn_vap_delete;
670         ic->ic_raw_xmit = iwn_raw_xmit;
671         ic->ic_node_alloc = iwn_node_alloc;
672         ic->ic_newassoc = iwn_newassoc;
673         ic->ic_wme.wme_update = iwn_wme_update;
674         ic->ic_update_mcast = iwn_update_mcast;
675         ic->ic_scan_start = iwn_scan_start;
676         ic->ic_scan_end = iwn_scan_end;
677         ic->ic_set_channel = iwn_set_channel;
678         ic->ic_scan_curchan = iwn_scan_curchan;
679         ic->ic_scan_mindwell = iwn_scan_mindwell;
680         ic->ic_setregdomain = iwn_setregdomain;
681 #if 0   /* HT */
682         ic->ic_ampdu_rx_start = iwn_ampdu_rx_start;
683         ic->ic_ampdu_rx_stop = iwn_ampdu_rx_stop;
684         ic->ic_ampdu_tx_start = iwn_ampdu_tx_start;
685         ic->ic_ampdu_tx_stop = iwn_ampdu_tx_stop;
686 #endif
687
688         iwn_radiotap_attach(sc);
689         iwn_sysctlattach(sc);
690
691         /*
692          * Hook our interrupt after all initialization is complete.
693          */
694         error = bus_setup_intr(dev, sc->irq, INTR_MPSAFE,
695                                iwn_intr, sc, &sc->sc_ih,
696                                &wlan_global_serializer);
697         if (error != 0) {
698                 device_printf(dev, "could not set up interrupt, error %d\n",
699                     error);
700                 goto fail;
701         }
702
703         ieee80211_announce(ic);
704         wlan_serialize_exit();
705         return 0;
706 fail:
707         iwn_cleanup(dev);
708 fail2:
709         wlan_serialize_exit();
710         return error;
711 }
712
713 static const struct iwn_hal *
714 iwn_hal_attach(struct iwn_softc *sc)
715 {
716         sc->hw_type = (IWN_READ(sc, IWN_HW_REV) >> 4) & 0xf;
717
718         switch (sc->hw_type) {
719         case IWN_HW_REV_TYPE_4965:
720                 sc->sc_hal = &iwn4965_hal;
721                 sc->limits = &iwn4965_sensitivity_limits;
722                 sc->fwname = "iwn4965fw";
723                 sc->txchainmask = IWN_ANT_AB;
724                 sc->rxchainmask = IWN_ANT_ABC;
725                 break;
726         case IWN_HW_REV_TYPE_5100:
727                 sc->sc_hal = &iwn5000_hal;
728                 sc->limits = &iwn5000_sensitivity_limits;
729                 sc->fwname = "iwn5000fw";
730                 sc->txchainmask = IWN_ANT_B;
731                 sc->rxchainmask = IWN_ANT_AB;
732                 break;
733         case IWN_HW_REV_TYPE_5150:
734                 sc->sc_hal = &iwn5000_hal;
735                 sc->limits = &iwn5150_sensitivity_limits;
736                 sc->fwname = "iwn5150fw";
737                 sc->txchainmask = IWN_ANT_A;
738                 sc->rxchainmask = IWN_ANT_AB;
739                 break;
740         case IWN_HW_REV_TYPE_5300:
741         case IWN_HW_REV_TYPE_5350:
742                 sc->sc_hal = &iwn5000_hal;
743                 sc->limits = &iwn5000_sensitivity_limits;
744                 sc->fwname = "iwn5000fw";
745                 sc->txchainmask = IWN_ANT_ABC;
746                 sc->rxchainmask = IWN_ANT_ABC;
747                 break;
748         case IWN_HW_REV_TYPE_1000:
749                 sc->sc_hal = &iwn5000_hal;
750                 sc->limits = &iwn1000_sensitivity_limits;
751                 sc->fwname = "iwn1000fw";
752                 sc->txchainmask = IWN_ANT_A;
753                 sc->rxchainmask = IWN_ANT_AB;
754                 break;
755         case IWN_HW_REV_TYPE_6000:
756                 sc->sc_hal = &iwn5000_hal;
757                 sc->limits = &iwn6000_sensitivity_limits;
758                 sc->fwname = "iwn6000fw";
759                 switch (pci_get_device(sc->sc_dev)) {
760                 case 0x422C:
761                 case 0x4239:
762                         sc->sc_flags |= IWN_FLAG_INTERNAL_PA;
763                         sc->txchainmask = IWN_ANT_BC;
764                         sc->rxchainmask = IWN_ANT_BC;
765                         break;
766                 default:
767                         sc->txchainmask = IWN_ANT_ABC;
768                         sc->rxchainmask = IWN_ANT_ABC;
769                         break;
770                 }
771                 break;
772         case IWN_HW_REV_TYPE_6050:
773                 sc->sc_hal = &iwn5000_hal;
774                 sc->limits = &iwn6000_sensitivity_limits;
775                 sc->fwname = "iwn6000fw";
776                 sc->txchainmask = IWN_ANT_AB;
777                 sc->rxchainmask = IWN_ANT_AB;
778                 break;
779         default:
780                 device_printf(sc->sc_dev, "adapter type %d not supported\n",
781                     sc->hw_type);
782                 return NULL;
783         }
784         return sc->sc_hal;
785 }
786
787 /*
788  * Attach the interface to 802.11 radiotap.
789  */
790 static void
791 iwn_radiotap_attach(struct iwn_softc *sc)
792 {
793         struct ifnet *ifp = sc->sc_ifp;
794         struct ieee80211com *ic = ifp->if_l2com;
795
796         ieee80211_radiotap_attach(ic,
797             &sc->sc_txtap.wt_ihdr, sizeof(sc->sc_txtap),
798                 IWN_TX_RADIOTAP_PRESENT,
799             &sc->sc_rxtap.wr_ihdr, sizeof(sc->sc_rxtap),
800                 IWN_RX_RADIOTAP_PRESENT);
801 }
802
803 static struct ieee80211vap *
804 iwn_vap_create(struct ieee80211com *ic,
805         const char name[IFNAMSIZ], int unit, int opmode, int flags,
806         const uint8_t bssid[IEEE80211_ADDR_LEN],
807         const uint8_t mac[IEEE80211_ADDR_LEN])
808 {
809         struct iwn_vap *ivp;
810         struct ieee80211vap *vap;
811
812         if (!TAILQ_EMPTY(&ic->ic_vaps))         /* only one at a time */
813                 return NULL;
814         ivp = (struct iwn_vap *) kmalloc(sizeof(struct iwn_vap),
815             M_80211_VAP, M_INTWAIT | M_ZERO);
816         if (ivp == NULL)
817                 return NULL;
818         vap = &ivp->iv_vap;
819         ieee80211_vap_setup(ic, vap, name, unit, opmode, flags, bssid, mac);
820         vap->iv_bmissthreshold = 10;            /* override default */
821         /* Override with driver methods. */
822         ivp->iv_newstate = vap->iv_newstate;
823         vap->iv_newstate = iwn_newstate;
824
825         ieee80211_ratectl_init(vap);
826         /* Complete setup. */
827         ieee80211_vap_attach(vap, iwn_media_change, ieee80211_media_status);
828         ic->ic_opmode = opmode;
829         return vap;
830 }
831
832 static void
833 iwn_vap_delete(struct ieee80211vap *vap)
834 {
835         struct iwn_vap *ivp = IWN_VAP(vap);
836
837         ieee80211_ratectl_deinit(vap);
838         ieee80211_vap_detach(vap);
839         kfree(ivp, M_80211_VAP);
840 }
841
842 static int
843 iwn_cleanup(device_t dev)
844 {
845         struct iwn_softc *sc = device_get_softc(dev);
846         struct ifnet *ifp = sc->sc_ifp;
847         struct ieee80211com *ic;
848         int i;
849
850         if (ifp != NULL) {
851                 ic = ifp->if_l2com;
852
853                 ieee80211_draintask(ic, &sc->sc_reinit_task);
854                 ieee80211_draintask(ic, &sc->sc_radioon_task);
855                 ieee80211_draintask(ic, &sc->sc_radiooff_task);
856
857                 iwn_stop(sc);
858                 callout_stop(&sc->sc_timer_to);
859                 ieee80211_ifdetach(ic);
860         }
861
862         /* cleanup sysctl nodes */
863         sysctl_ctx_free(&sc->sc_sysctl_ctx);
864
865         /* Free DMA resources. */
866         iwn_free_rx_ring(sc, &sc->rxq);
867         if (sc->sc_hal != NULL)
868                 for (i = 0; i < sc->sc_hal->ntxqs; i++)
869                         iwn_free_tx_ring(sc, &sc->txq[i]);
870         iwn_free_sched(sc);
871         iwn_free_kw(sc);
872         if (sc->ict != NULL) {
873                 iwn_free_ict(sc);
874                 sc->ict = NULL;
875         }
876         iwn_free_fwmem(sc);
877
878         if (sc->irq != NULL) {
879                 bus_teardown_intr(dev, sc->irq, sc->sc_ih);
880                 bus_release_resource(dev, SYS_RES_IRQ, sc->irq_rid, sc->irq);
881                 if (sc->irq_rid == 1)
882                         pci_release_msi(dev);
883                 sc->irq = NULL;
884         }
885
886         if (sc->mem != NULL) {
887                 bus_release_resource(dev, SYS_RES_MEMORY, sc->mem_rid, sc->mem);
888                 sc->mem = NULL;
889         }
890
891         if (ifp != NULL) {
892                 if_free(ifp);
893                 sc->sc_ifp = NULL;
894         }
895
896         return 0;
897 }
898
899 static int
900 iwn_pci_detach(device_t dev)
901 {
902         struct iwn_softc *sc = (struct iwn_softc *)device_get_softc(dev);
903
904         wlan_serialize_enter();
905         iwn_cleanup(dev);
906         bus_dma_tag_destroy(sc->sc_dmat);
907         wlan_serialize_exit();
908
909         return 0;
910 }
911
912 static int
913 iwn_nic_lock(struct iwn_softc *sc)
914 {
915         int ntries;
916
917         /* Request exclusive access to NIC. */
918         IWN_SETBITS(sc, IWN_GP_CNTRL, IWN_GP_CNTRL_MAC_ACCESS_REQ);
919
920         /* Spin until we actually get the lock. */
921         for (ntries = 0; ntries < 1000; ntries++) {
922                 if ((IWN_READ(sc, IWN_GP_CNTRL) &
923                     (IWN_GP_CNTRL_MAC_ACCESS_ENA | IWN_GP_CNTRL_SLEEP)) ==
924                     IWN_GP_CNTRL_MAC_ACCESS_ENA)
925                         return 0;
926                 DELAY(10);
927         }
928         return ETIMEDOUT;
929 }
930
931 static __inline void
932 iwn_nic_unlock(struct iwn_softc *sc)
933 {
934         IWN_CLRBITS(sc, IWN_GP_CNTRL, IWN_GP_CNTRL_MAC_ACCESS_REQ);
935 }
936
937 static __inline uint32_t
938 iwn_prph_read(struct iwn_softc *sc, uint32_t addr)
939 {
940         IWN_WRITE(sc, IWN_PRPH_RADDR, IWN_PRPH_DWORD | addr);
941         IWN_BARRIER_READ_WRITE(sc);
942         return IWN_READ(sc, IWN_PRPH_RDATA);
943 }
944
945 static __inline void
946 iwn_prph_write(struct iwn_softc *sc, uint32_t addr, uint32_t data)
947 {
948         IWN_WRITE(sc, IWN_PRPH_WADDR, IWN_PRPH_DWORD | addr);
949         IWN_BARRIER_WRITE(sc);
950         IWN_WRITE(sc, IWN_PRPH_WDATA, data);
951 }
952
953 static __inline void
954 iwn_prph_setbits(struct iwn_softc *sc, uint32_t addr, uint32_t mask)
955 {
956         iwn_prph_write(sc, addr, iwn_prph_read(sc, addr) | mask);
957 }
958
959 static __inline void
960 iwn_prph_clrbits(struct iwn_softc *sc, uint32_t addr, uint32_t mask)
961 {
962         iwn_prph_write(sc, addr, iwn_prph_read(sc, addr) & ~mask);
963 }
964
965 static __inline void
966 iwn_prph_write_region_4(struct iwn_softc *sc, uint32_t addr,
967     const uint32_t *data, int count)
968 {
969         for (; count > 0; count--, data++, addr += 4)
970                 iwn_prph_write(sc, addr, *data);
971 }
972
973 static __inline uint32_t
974 iwn_mem_read(struct iwn_softc *sc, uint32_t addr)
975 {
976         IWN_WRITE(sc, IWN_MEM_RADDR, addr);
977         IWN_BARRIER_READ_WRITE(sc);
978         return IWN_READ(sc, IWN_MEM_RDATA);
979 }
980
981 static __inline void
982 iwn_mem_write(struct iwn_softc *sc, uint32_t addr, uint32_t data)
983 {
984         IWN_WRITE(sc, IWN_MEM_WADDR, addr);
985         IWN_BARRIER_WRITE(sc);
986         IWN_WRITE(sc, IWN_MEM_WDATA, data);
987 }
988
989 static __inline void
990 iwn_mem_write_2(struct iwn_softc *sc, uint32_t addr, uint16_t data)
991 {
992         uint32_t tmp;
993
994         tmp = iwn_mem_read(sc, addr & ~3);
995         if (addr & 3)
996                 tmp = (tmp & 0x0000ffff) | data << 16;
997         else
998                 tmp = (tmp & 0xffff0000) | data;
999         iwn_mem_write(sc, addr & ~3, tmp);
1000 }
1001
1002 static __inline void
1003 iwn_mem_read_region_4(struct iwn_softc *sc, uint32_t addr, uint32_t *data,
1004     int count)
1005 {
1006         for (; count > 0; count--, addr += 4)
1007                 *data++ = iwn_mem_read(sc, addr);
1008 }
1009
1010 static __inline void
1011 iwn_mem_set_region_4(struct iwn_softc *sc, uint32_t addr, uint32_t val,
1012     int count)
1013 {
1014         for (; count > 0; count--, addr += 4)
1015                 iwn_mem_write(sc, addr, val);
1016 }
1017
1018 static int
1019 iwn_eeprom_lock(struct iwn_softc *sc)
1020 {
1021         int i, ntries;
1022
1023         for (i = 0; i < 100; i++) {
1024                 /* Request exclusive access to EEPROM. */
1025                 IWN_SETBITS(sc, IWN_HW_IF_CONFIG,
1026                     IWN_HW_IF_CONFIG_EEPROM_LOCKED);
1027
1028                 /* Spin until we actually get the lock. */
1029                 for (ntries = 0; ntries < 100; ntries++) {
1030                         if (IWN_READ(sc, IWN_HW_IF_CONFIG) &
1031                             IWN_HW_IF_CONFIG_EEPROM_LOCKED)
1032                                 return 0;
1033                         DELAY(10);
1034                 }
1035         }
1036         return ETIMEDOUT;
1037 }
1038
1039 static __inline void
1040 iwn_eeprom_unlock(struct iwn_softc *sc)
1041 {
1042         IWN_CLRBITS(sc, IWN_HW_IF_CONFIG, IWN_HW_IF_CONFIG_EEPROM_LOCKED);
1043 }
1044
1045 /*
1046  * Initialize access by host to One Time Programmable ROM.
1047  * NB: This kind of ROM can be found on 1000 or 6000 Series only.
1048  */
1049 static int
1050 iwn_init_otprom(struct iwn_softc *sc)
1051 {
1052         uint16_t prev, base, next;
1053         int count, error;
1054
1055         /* Wait for clock stabilization before accessing prph. */
1056         error = iwn_clock_wait(sc);
1057         if (error != 0)
1058                 return error;
1059
1060         error = iwn_nic_lock(sc);
1061         if (error != 0)
1062                 return error;
1063         iwn_prph_setbits(sc, IWN_APMG_PS, IWN_APMG_PS_RESET_REQ);
1064         DELAY(5);
1065         iwn_prph_clrbits(sc, IWN_APMG_PS, IWN_APMG_PS_RESET_REQ);
1066         iwn_nic_unlock(sc);
1067
1068         /* Set auto clock gate disable bit for HW with OTP shadow RAM. */
1069         if (sc->hw_type != IWN_HW_REV_TYPE_1000) {
1070                 IWN_SETBITS(sc, IWN_DBG_LINK_PWR_MGMT,
1071                     IWN_RESET_LINK_PWR_MGMT_DIS);
1072         }
1073         IWN_CLRBITS(sc, IWN_EEPROM_GP, IWN_EEPROM_GP_IF_OWNER);
1074         /* Clear ECC status. */
1075         IWN_SETBITS(sc, IWN_OTP_GP,
1076             IWN_OTP_GP_ECC_CORR_STTS | IWN_OTP_GP_ECC_UNCORR_STTS);
1077
1078         /*
1079          * Find the block before last block (contains the EEPROM image)
1080          * for HW without OTP shadow RAM.
1081          */
1082         if (sc->hw_type == IWN_HW_REV_TYPE_1000) {
1083                 /* Switch to absolute addressing mode. */
1084                 IWN_CLRBITS(sc, IWN_OTP_GP, IWN_OTP_GP_RELATIVE_ACCESS);
1085                 base = prev = 0;
1086                 for (count = 0; count < IWN1000_OTP_NBLOCKS; count++) {
1087                         error = iwn_read_prom_data(sc, base, &next, 2);
1088                         if (error != 0)
1089                                 return error;
1090                         if (next == 0)  /* End of linked-list. */
1091                                 break;
1092                         prev = base;
1093                         base = le16toh(next);
1094                 }
1095                 if (count == 0 || count == IWN1000_OTP_NBLOCKS)
1096                         return EIO;
1097                 /* Skip "next" word. */
1098                 sc->prom_base = prev + 1;
1099         }
1100         return 0;
1101 }
1102
1103 static int
1104 iwn_read_prom_data(struct iwn_softc *sc, uint32_t addr, void *data, int count)
1105 {
1106         uint32_t val, tmp;
1107         int ntries;
1108         uint8_t *out = data;
1109
1110         addr += sc->prom_base;
1111         for (; count > 0; count -= 2, addr++) {
1112                 IWN_WRITE(sc, IWN_EEPROM, addr << 2);
1113                 for (ntries = 0; ntries < 10; ntries++) {
1114                         val = IWN_READ(sc, IWN_EEPROM);
1115                         if (val & IWN_EEPROM_READ_VALID)
1116                                 break;
1117                         DELAY(5);
1118                 }
1119                 if (ntries == 10) {
1120                         device_printf(sc->sc_dev,
1121                             "timeout reading ROM at 0x%x\n", addr);
1122                         return ETIMEDOUT;
1123                 }
1124                 if (sc->sc_flags & IWN_FLAG_HAS_OTPROM) {
1125                         /* OTPROM, check for ECC errors. */
1126                         tmp = IWN_READ(sc, IWN_OTP_GP);
1127                         if (tmp & IWN_OTP_GP_ECC_UNCORR_STTS) {
1128                                 device_printf(sc->sc_dev,
1129                                     "OTPROM ECC error at 0x%x\n", addr);
1130                                 return EIO;
1131                         }
1132                         if (tmp & IWN_OTP_GP_ECC_CORR_STTS) {
1133                                 /* Correctable ECC error, clear bit. */
1134                                 IWN_SETBITS(sc, IWN_OTP_GP,
1135                                     IWN_OTP_GP_ECC_CORR_STTS);
1136                         }
1137                 }
1138                 *out++ = val >> 16;
1139                 if (count > 1)
1140                         *out++ = val >> 24;
1141         }
1142         return 0;
1143 }
1144
1145 static void
1146 iwn_dma_map_addr(void *arg, bus_dma_segment_t *segs, int nsegs, int error)
1147 {
1148         if (error != 0)
1149                 return;
1150         KASSERT(nsegs == 1, ("too many DMA segments, %d should be 1", nsegs));
1151         *(bus_addr_t *)arg = segs[0].ds_addr;
1152 }
1153
1154 static int
1155 iwn_dma_contig_alloc(struct iwn_softc *sc, struct iwn_dma_info *dma,
1156         void **kvap, bus_size_t size, bus_size_t alignment, int flags)
1157 {
1158         int error;
1159
1160         dma->size = size;
1161         dma->tag = NULL;
1162
1163         error = bus_dma_tag_create(sc->sc_dmat, alignment,
1164             0, BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL, size,
1165             1, size, flags, &dma->tag);
1166         if (error != 0) {
1167                 device_printf(sc->sc_dev,
1168                     "%s: bus_dma_tag_create failed, error %d\n",
1169                     __func__, error);
1170                 goto fail;
1171         }
1172         error = bus_dmamem_alloc(dma->tag, (void **)&dma->vaddr,
1173             flags | BUS_DMA_ZERO, &dma->map);
1174         if (error != 0) {
1175                 device_printf(sc->sc_dev,
1176                     "%s: bus_dmamem_alloc failed, error %d\n", __func__, error);
1177                 goto fail;
1178         }
1179         error = bus_dmamap_load(dma->tag, dma->map, dma->vaddr,
1180             size, iwn_dma_map_addr, &dma->paddr, flags);
1181         if (error != 0) {
1182                 device_printf(sc->sc_dev,
1183                     "%s: bus_dmamap_load failed, error %d\n", __func__, error);
1184                 goto fail;
1185         }
1186
1187         if (kvap != NULL)
1188                 *kvap = dma->vaddr;
1189         return 0;
1190 fail:
1191         iwn_dma_contig_free(dma);
1192         return error;
1193 }
1194
1195 static void
1196 iwn_dma_contig_free(struct iwn_dma_info *dma)
1197 {
1198         if (dma->tag != NULL) {
1199                 if (dma->map != NULL) {
1200                         if (dma->paddr == 0) {
1201                                 bus_dmamap_sync(dma->tag, dma->map,
1202                                     BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE);
1203                                 bus_dmamap_unload(dma->tag, dma->map);
1204                         }
1205                         bus_dmamap_destroy(dma->tag, dma->map);
1206                 }
1207                 bus_dmamem_free(dma->tag, dma->vaddr, dma->map);
1208                 bus_dma_tag_destroy(dma->tag);
1209         }
1210 }
1211
1212 static int
1213 iwn_alloc_sched(struct iwn_softc *sc)
1214 {
1215         /* TX scheduler rings must be aligned on a 1KB boundary. */
1216         return iwn_dma_contig_alloc(sc, &sc->sched_dma,
1217             (void **)&sc->sched, sc->sc_hal->schedsz, 1024, BUS_DMA_NOWAIT);
1218 }
1219
1220 static void
1221 iwn_free_sched(struct iwn_softc *sc)
1222 {
1223         iwn_dma_contig_free(&sc->sched_dma);
1224 }
1225
1226 static int
1227 iwn_alloc_kw(struct iwn_softc *sc)
1228 {
1229         /* "Keep Warm" page must be aligned on a 4KB boundary. */
1230         return iwn_dma_contig_alloc(sc, &sc->kw_dma, NULL, 4096, 4096,
1231             BUS_DMA_NOWAIT);
1232 }
1233
1234 static void
1235 iwn_free_kw(struct iwn_softc *sc)
1236 {
1237         iwn_dma_contig_free(&sc->kw_dma);
1238 }
1239
1240 static int
1241 iwn_alloc_ict(struct iwn_softc *sc)
1242 {
1243         /* ICT table must be aligned on a 4KB boundary. */
1244         return iwn_dma_contig_alloc(sc, &sc->ict_dma,
1245             (void **)&sc->ict, IWN_ICT_SIZE, 4096, BUS_DMA_NOWAIT);
1246 }
1247
1248 static void
1249 iwn_free_ict(struct iwn_softc *sc)
1250 {
1251         iwn_dma_contig_free(&sc->ict_dma);
1252 }
1253
1254 static int
1255 iwn_alloc_fwmem(struct iwn_softc *sc)
1256 {
1257         /* Must be aligned on a 16-byte boundary. */
1258         return iwn_dma_contig_alloc(sc, &sc->fw_dma, NULL,
1259             sc->sc_hal->fwsz, 16, BUS_DMA_NOWAIT);
1260 }
1261
1262 static void
1263 iwn_free_fwmem(struct iwn_softc *sc)
1264 {
1265         iwn_dma_contig_free(&sc->fw_dma);
1266 }
1267
1268 static int
1269 iwn_alloc_rx_ring(struct iwn_softc *sc, struct iwn_rx_ring *ring)
1270 {
1271         bus_size_t size;
1272         int i, error;
1273
1274         ring->cur = 0;
1275
1276         /* Allocate RX descriptors (256-byte aligned). */
1277         size = IWN_RX_RING_COUNT * sizeof (uint32_t);
1278         error = iwn_dma_contig_alloc(sc, &ring->desc_dma,
1279             (void **)&ring->desc, size, 256, BUS_DMA_NOWAIT);
1280         if (error != 0) {
1281                 device_printf(sc->sc_dev,
1282                     "%s: could not allocate Rx ring DMA memory, error %d\n",
1283                     __func__, error);
1284                 goto fail;
1285         }
1286
1287         error = bus_dma_tag_create(sc->sc_dmat, 1, 0,
1288             BUS_SPACE_MAXADDR_32BIT,
1289             BUS_SPACE_MAXADDR, NULL, NULL, MJUMPAGESIZE, 1,
1290             MJUMPAGESIZE, BUS_DMA_NOWAIT, &ring->data_dmat);
1291         if (error != 0) {
1292                 device_printf(sc->sc_dev,
1293                     "%s: bus_dma_tag_create_failed, error %d\n",
1294                     __func__, error);
1295                 goto fail;
1296         }
1297
1298         /* Allocate RX status area (16-byte aligned). */
1299         error = iwn_dma_contig_alloc(sc, &ring->stat_dma,
1300             (void **)&ring->stat, sizeof (struct iwn_rx_status),
1301             16, BUS_DMA_NOWAIT);
1302         if (error != 0) {
1303                 device_printf(sc->sc_dev,
1304                     "%s: could not allocate Rx status DMA memory, error %d\n",
1305                     __func__, error);
1306                 goto fail;
1307         }
1308
1309         /*
1310          * Allocate and map RX buffers.
1311          */
1312         for (i = 0; i < IWN_RX_RING_COUNT; i++) {
1313                 struct iwn_rx_data *data = &ring->data[i];
1314                 bus_addr_t paddr;
1315
1316                 error = bus_dmamap_create(ring->data_dmat, 0, &data->map);
1317                 if (error != 0) {
1318                         device_printf(sc->sc_dev,
1319                             "%s: bus_dmamap_create failed, error %d\n",
1320                             __func__, error);
1321                         goto fail;
1322                 }
1323
1324                 data->m = m_getjcl(MB_DONTWAIT, MT_DATA, M_PKTHDR,
1325                                    MJUMPAGESIZE);
1326                 if (data->m == NULL) {
1327                         device_printf(sc->sc_dev,
1328                             "%s: could not allocate rx mbuf\n", __func__);
1329                         error = ENOMEM;
1330                         goto fail;
1331                 }
1332
1333                 /* Map page. */
1334                 error = bus_dmamap_load(ring->data_dmat, data->map,
1335                     mtod(data->m, caddr_t), MJUMPAGESIZE,
1336                     iwn_dma_map_addr, &paddr, BUS_DMA_NOWAIT);
1337                 if (error != 0 && error != EFBIG) {
1338                         device_printf(sc->sc_dev,
1339                             "%s: bus_dmamap_load failed, error %d\n",
1340                             __func__, error);
1341                         m_freem(data->m);
1342                         error = ENOMEM; /* XXX unique code */
1343                         goto fail;
1344                 }
1345                 bus_dmamap_sync(ring->data_dmat, data->map,
1346                     BUS_DMASYNC_PREWRITE);
1347
1348                 /* Set physical address of RX buffer (256-byte aligned). */
1349                 ring->desc[i] = htole32(paddr >> 8);
1350         }
1351         bus_dmamap_sync(ring->desc_dma.tag, ring->desc_dma.map,
1352             BUS_DMASYNC_PREWRITE);
1353         return 0;
1354 fail:
1355         iwn_free_rx_ring(sc, ring);
1356         return error;
1357 }
1358
1359 static void
1360 iwn_reset_rx_ring(struct iwn_softc *sc, struct iwn_rx_ring *ring)
1361 {
1362         int ntries;
1363
1364         if (iwn_nic_lock(sc) == 0) {
1365                 IWN_WRITE(sc, IWN_FH_RX_CONFIG, 0);
1366                 for (ntries = 0; ntries < 1000; ntries++) {
1367                         if (IWN_READ(sc, IWN_FH_RX_STATUS) &
1368                             IWN_FH_RX_STATUS_IDLE)
1369                                 break;
1370                         DELAY(10);
1371                 }
1372                 iwn_nic_unlock(sc);
1373 #ifdef IWN_DEBUG
1374                 if (ntries == 1000)
1375                         DPRINTF(sc, IWN_DEBUG_ANY, "%s\n",
1376                             "timeout resetting Rx ring");
1377 #endif
1378         }
1379         ring->cur = 0;
1380         sc->last_rx_valid = 0;
1381 }
1382
1383 static void
1384 iwn_free_rx_ring(struct iwn_softc *sc, struct iwn_rx_ring *ring)
1385 {
1386         int i;
1387
1388         iwn_dma_contig_free(&ring->desc_dma);
1389         iwn_dma_contig_free(&ring->stat_dma);
1390
1391         for (i = 0; i < IWN_RX_RING_COUNT; i++) {
1392                 struct iwn_rx_data *data = &ring->data[i];
1393
1394                 if (data->m != NULL) {
1395                         bus_dmamap_sync(ring->data_dmat, data->map,
1396                             BUS_DMASYNC_POSTREAD);
1397                         bus_dmamap_unload(ring->data_dmat, data->map);
1398                         m_freem(data->m);
1399                 }
1400                 if (data->map != NULL)
1401                         bus_dmamap_destroy(ring->data_dmat, data->map);
1402         }
1403 }
1404
1405 static int
1406 iwn_alloc_tx_ring(struct iwn_softc *sc, struct iwn_tx_ring *ring, int qid)
1407 {
1408         bus_size_t size;
1409         bus_addr_t paddr;
1410         int i, error;
1411
1412         ring->qid = qid;
1413         ring->queued = 0;
1414         ring->cur = 0;
1415
1416         /* Allocate TX descriptors (256-byte aligned.) */
1417         size = IWN_TX_RING_COUNT * sizeof(struct iwn_tx_desc);
1418         error = iwn_dma_contig_alloc(sc, &ring->desc_dma,
1419             (void **)&ring->desc, size, 256, BUS_DMA_NOWAIT);
1420         if (error != 0) {
1421                 device_printf(sc->sc_dev,
1422                     "%s: could not allocate TX ring DMA memory, error %d\n",
1423                     __func__, error);
1424                 goto fail;
1425         }
1426
1427         /*
1428          * We only use rings 0 through 4 (4 EDCA + cmd) so there is no need
1429          * to allocate commands space for other rings.
1430          */
1431         if (qid > 4)
1432                 return 0;
1433
1434         size = IWN_TX_RING_COUNT * sizeof(struct iwn_tx_cmd);
1435         error = iwn_dma_contig_alloc(sc, &ring->cmd_dma,
1436             (void **)&ring->cmd, size, 4, BUS_DMA_NOWAIT);
1437         if (error != 0) {
1438                 device_printf(sc->sc_dev,
1439                     "%s: could not allocate TX cmd DMA memory, error %d\n",
1440                     __func__, error);
1441                 goto fail;
1442         }
1443
1444         error = bus_dma_tag_create(sc->sc_dmat, 1, 0,
1445             BUS_SPACE_MAXADDR_32BIT,
1446             BUS_SPACE_MAXADDR, NULL, NULL, MJUMPAGESIZE, IWN_MAX_SCATTER - 1,
1447             MJUMPAGESIZE, BUS_DMA_NOWAIT, &ring->data_dmat);
1448         if (error != 0) {
1449                 device_printf(sc->sc_dev,
1450                     "%s: bus_dma_tag_create_failed, error %d\n",
1451                     __func__, error);
1452                 goto fail;
1453         }
1454
1455         paddr = ring->cmd_dma.paddr;
1456         for (i = 0; i < IWN_TX_RING_COUNT; i++) {
1457                 struct iwn_tx_data *data = &ring->data[i];
1458
1459                 data->cmd_paddr = paddr;
1460                 data->scratch_paddr = paddr + 12;
1461                 paddr += sizeof (struct iwn_tx_cmd);
1462
1463                 error = bus_dmamap_create(ring->data_dmat, 0, &data->map);
1464                 if (error != 0) {
1465                         device_printf(sc->sc_dev,
1466                             "%s: bus_dmamap_create failed, error %d\n",
1467                             __func__, error);
1468                         goto fail;
1469                 }
1470                 bus_dmamap_sync(ring->data_dmat, data->map,
1471                     BUS_DMASYNC_PREWRITE);
1472         }
1473         return 0;
1474 fail:
1475         iwn_free_tx_ring(sc, ring);
1476         return error;
1477 }
1478
1479 static void
1480 iwn_reset_tx_ring(struct iwn_softc *sc, struct iwn_tx_ring *ring)
1481 {
1482         int i;
1483
1484         for (i = 0; i < IWN_TX_RING_COUNT; i++) {
1485                 struct iwn_tx_data *data = &ring->data[i];
1486
1487                 if (data->m != NULL) {
1488                         bus_dmamap_unload(ring->data_dmat, data->map);
1489                         m_freem(data->m);
1490                         data->m = NULL;
1491                 }
1492         }
1493         /* Clear TX descriptors. */
1494         memset(ring->desc, 0, ring->desc_dma.size);
1495         bus_dmamap_sync(ring->desc_dma.tag, ring->desc_dma.map,
1496             BUS_DMASYNC_PREWRITE);
1497         sc->qfullmsk &= ~(1 << ring->qid);
1498         ring->queued = 0;
1499         ring->cur = 0;
1500 }
1501
1502 static void
1503 iwn_free_tx_ring(struct iwn_softc *sc, struct iwn_tx_ring *ring)
1504 {
1505         int i;
1506
1507         iwn_dma_contig_free(&ring->desc_dma);
1508         iwn_dma_contig_free(&ring->cmd_dma);
1509
1510         for (i = 0; i < IWN_TX_RING_COUNT; i++) {
1511                 struct iwn_tx_data *data = &ring->data[i];
1512
1513                 if (data->m != NULL) {
1514                         bus_dmamap_sync(ring->data_dmat, data->map,
1515                             BUS_DMASYNC_POSTWRITE);
1516                         bus_dmamap_unload(ring->data_dmat, data->map);
1517                         m_freem(data->m);
1518                 }
1519                 if (data->map != NULL)
1520                         bus_dmamap_destroy(ring->data_dmat, data->map);
1521         }
1522 }
1523
1524 static void
1525 iwn5000_ict_reset(struct iwn_softc *sc)
1526 {
1527         /* Disable interrupts. */
1528         IWN_WRITE(sc, IWN_INT_MASK, 0);
1529
1530         /* Reset ICT table. */
1531         memset(sc->ict, 0, IWN_ICT_SIZE);
1532         sc->ict_cur = 0;
1533
1534         /* Set physical address of ICT table (4KB aligned.) */
1535         DPRINTF(sc, IWN_DEBUG_RESET, "%s: enabling ICT\n", __func__);
1536         IWN_WRITE(sc, IWN_DRAM_INT_TBL, IWN_DRAM_INT_TBL_ENABLE |
1537             IWN_DRAM_INT_TBL_WRAP_CHECK | sc->ict_dma.paddr >> 12);
1538
1539         /* Enable periodic RX interrupt. */
1540         sc->int_mask |= IWN_INT_RX_PERIODIC;
1541         /* Switch to ICT interrupt mode in driver. */
1542         sc->sc_flags |= IWN_FLAG_USE_ICT;
1543
1544         /* Re-enable interrupts. */
1545         IWN_WRITE(sc, IWN_INT, 0xffffffff);
1546         IWN_WRITE(sc, IWN_INT_MASK, sc->int_mask);
1547 }
1548
1549 static int
1550 iwn_read_eeprom(struct iwn_softc *sc, uint8_t macaddr[IEEE80211_ADDR_LEN])
1551 {
1552         const struct iwn_hal *hal = sc->sc_hal;
1553         int error;
1554         uint16_t val;
1555
1556         /* Check whether adapter has an EEPROM or an OTPROM. */
1557         if (sc->hw_type >= IWN_HW_REV_TYPE_1000 &&
1558             (IWN_READ(sc, IWN_OTP_GP) & IWN_OTP_GP_DEV_SEL_OTP))
1559                 sc->sc_flags |= IWN_FLAG_HAS_OTPROM;
1560         DPRINTF(sc, IWN_DEBUG_RESET, "%s found\n",
1561             (sc->sc_flags & IWN_FLAG_HAS_OTPROM) ? "OTPROM" : "EEPROM");
1562
1563         /* Adapter has to be powered on for EEPROM access to work. */
1564         error = iwn_apm_init(sc);
1565         if (error != 0) {
1566                 device_printf(sc->sc_dev,
1567                     "%s: could not power ON adapter, error %d\n",
1568                     __func__, error);
1569                 return error;
1570         }
1571
1572         if ((IWN_READ(sc, IWN_EEPROM_GP) & 0x7) == 0) {
1573                 device_printf(sc->sc_dev, "%s: bad ROM signature\n", __func__);
1574                 return EIO;
1575         }
1576         error = iwn_eeprom_lock(sc);
1577         if (error != 0) {
1578                 device_printf(sc->sc_dev,
1579                     "%s: could not lock ROM, error %d\n",
1580                     __func__, error);
1581                 return error;
1582         }
1583
1584         if (sc->sc_flags & IWN_FLAG_HAS_OTPROM) {
1585                 error = iwn_init_otprom(sc);
1586                 if (error != 0) {
1587                         device_printf(sc->sc_dev,
1588                             "%s: could not initialize OTPROM, error %d\n",
1589                             __func__, error);
1590                         return error;
1591                 }
1592         }
1593
1594         iwn_read_prom_data(sc, IWN_EEPROM_RFCFG, &val, 2);
1595         sc->rfcfg = le16toh(val);
1596         DPRINTF(sc, IWN_DEBUG_RESET, "radio config=0x%04x\n", sc->rfcfg);
1597
1598         /* Read MAC address. */
1599         iwn_read_prom_data(sc, IWN_EEPROM_MAC, macaddr, 6);
1600
1601         /* Read adapter-specific information from EEPROM. */
1602         hal->read_eeprom(sc);
1603
1604         iwn_apm_stop(sc);       /* Power OFF adapter. */
1605
1606         iwn_eeprom_unlock(sc);
1607         return 0;
1608 }
1609
1610 static void
1611 iwn4965_read_eeprom(struct iwn_softc *sc)
1612 {
1613         uint32_t addr;
1614         int i;
1615         uint16_t val;
1616
1617         /* Read regulatory domain (4 ASCII characters.) */
1618         iwn_read_prom_data(sc, IWN4965_EEPROM_DOMAIN, sc->eeprom_domain, 4);
1619
1620         /* Read the list of authorized channels (20MHz ones only.) */
1621         for (i = 0; i < 5; i++) {
1622                 addr = iwn4965_regulatory_bands[i];
1623                 iwn_read_eeprom_channels(sc, i, addr);
1624         }
1625
1626         /* Read maximum allowed TX power for 2GHz and 5GHz bands. */
1627         iwn_read_prom_data(sc, IWN4965_EEPROM_MAXPOW, &val, 2);
1628         sc->maxpwr2GHz = val & 0xff;
1629         sc->maxpwr5GHz = val >> 8;
1630         /* Check that EEPROM values are within valid range. */
1631         if (sc->maxpwr5GHz < 20 || sc->maxpwr5GHz > 50)
1632                 sc->maxpwr5GHz = 38;
1633         if (sc->maxpwr2GHz < 20 || sc->maxpwr2GHz > 50)
1634                 sc->maxpwr2GHz = 38;
1635         DPRINTF(sc, IWN_DEBUG_RESET, "maxpwr 2GHz=%d 5GHz=%d\n",
1636             sc->maxpwr2GHz, sc->maxpwr5GHz);
1637
1638         /* Read samples for each TX power group. */
1639         iwn_read_prom_data(sc, IWN4965_EEPROM_BANDS, sc->bands,
1640             sizeof sc->bands);
1641
1642         /* Read voltage at which samples were taken. */
1643         iwn_read_prom_data(sc, IWN4965_EEPROM_VOLTAGE, &val, 2);
1644         sc->eeprom_voltage = (int16_t)le16toh(val);
1645         DPRINTF(sc, IWN_DEBUG_RESET, "voltage=%d (in 0.3V)\n",
1646             sc->eeprom_voltage);
1647
1648 #ifdef IWN_DEBUG
1649         /* Print samples. */
1650         if (sc->sc_debug & IWN_DEBUG_ANY) {
1651                 for (i = 0; i < IWN_NBANDS; i++)
1652                         iwn4965_print_power_group(sc, i);
1653         }
1654 #endif
1655 }
1656
1657 #ifdef IWN_DEBUG
1658 static void
1659 iwn4965_print_power_group(struct iwn_softc *sc, int i)
1660 {
1661         struct iwn4965_eeprom_band *band = &sc->bands[i];
1662         struct iwn4965_eeprom_chan_samples *chans = band->chans;
1663         int j, c;
1664
1665         kprintf("===band %d===\n", i);
1666         kprintf("chan lo=%d, chan hi=%d\n", band->lo, band->hi);
1667         kprintf("chan1 num=%d\n", chans[0].num);
1668         for (c = 0; c < 2; c++) {
1669                 for (j = 0; j < IWN_NSAMPLES; j++) {
1670                         kprintf("chain %d, sample %d: temp=%d gain=%d "
1671                             "power=%d pa_det=%d\n", c, j,
1672                             chans[0].samples[c][j].temp,
1673                             chans[0].samples[c][j].gain,
1674                             chans[0].samples[c][j].power,
1675                             chans[0].samples[c][j].pa_det);
1676                 }
1677         }
1678         kprintf("chan2 num=%d\n", chans[1].num);
1679         for (c = 0; c < 2; c++) {
1680                 for (j = 0; j < IWN_NSAMPLES; j++) {
1681                         kprintf("chain %d, sample %d: temp=%d gain=%d "
1682                             "power=%d pa_det=%d\n", c, j,
1683                             chans[1].samples[c][j].temp,
1684                             chans[1].samples[c][j].gain,
1685                             chans[1].samples[c][j].power,
1686                             chans[1].samples[c][j].pa_det);
1687                 }
1688         }
1689 }
1690 #endif
1691
1692 static void
1693 iwn5000_read_eeprom(struct iwn_softc *sc)
1694 {
1695         struct iwn5000_eeprom_calib_hdr hdr;
1696         int32_t temp, volt;
1697         uint32_t addr, base;
1698         int i;
1699         uint16_t val;
1700
1701         /* Read regulatory domain (4 ASCII characters.) */
1702         iwn_read_prom_data(sc, IWN5000_EEPROM_REG, &val, 2);
1703         base = le16toh(val);
1704         iwn_read_prom_data(sc, base + IWN5000_EEPROM_DOMAIN,
1705             sc->eeprom_domain, 4);
1706
1707         /* Read the list of authorized channels (20MHz ones only.) */
1708         for (i = 0; i < 5; i++) {
1709                 addr = base + iwn5000_regulatory_bands[i];
1710                 iwn_read_eeprom_channels(sc, i, addr);
1711         }
1712
1713         /* Read enhanced TX power information for 6000 Series. */
1714         if (sc->hw_type >= IWN_HW_REV_TYPE_6000)
1715                 iwn_read_eeprom_enhinfo(sc);
1716
1717         iwn_read_prom_data(sc, IWN5000_EEPROM_CAL, &val, 2);
1718         base = le16toh(val);
1719         iwn_read_prom_data(sc, base, &hdr, sizeof hdr);
1720         DPRINTF(sc, IWN_DEBUG_CALIBRATE,
1721             "%s: calib version=%u pa type=%u voltage=%u\n",
1722             __func__, hdr.version, hdr.pa_type, le16toh(hdr.volt));
1723             sc->calib_ver = hdr.version;
1724
1725         if (sc->hw_type == IWN_HW_REV_TYPE_5150) {
1726                 /* Compute temperature offset. */
1727                 iwn_read_prom_data(sc, base + IWN5000_EEPROM_TEMP, &val, 2);
1728                 temp = le16toh(val);
1729                 iwn_read_prom_data(sc, base + IWN5000_EEPROM_VOLT, &val, 2);
1730                 volt = le16toh(val);
1731                 sc->temp_off = temp - (volt / -5);
1732                 DPRINTF(sc, IWN_DEBUG_CALIBRATE, "temp=%d volt=%d offset=%dK\n",
1733                     temp, volt, sc->temp_off);
1734         } else {
1735                 /* Read crystal calibration. */
1736                 iwn_read_prom_data(sc, base + IWN5000_EEPROM_CRYSTAL,
1737                     &sc->eeprom_crystal, sizeof (uint32_t));
1738                 DPRINTF(sc, IWN_DEBUG_CALIBRATE, "crystal calibration 0x%08x\n",
1739                 le32toh(sc->eeprom_crystal));
1740         }
1741 }
1742
1743 /*
1744  * Translate EEPROM flags to net80211.
1745  */
1746 static uint32_t
1747 iwn_eeprom_channel_flags(struct iwn_eeprom_chan *channel)
1748 {
1749         uint32_t nflags;
1750
1751         nflags = 0;
1752         if ((channel->flags & IWN_EEPROM_CHAN_ACTIVE) == 0)
1753                 nflags |= IEEE80211_CHAN_PASSIVE;
1754         if ((channel->flags & IWN_EEPROM_CHAN_IBSS) == 0)
1755                 nflags |= IEEE80211_CHAN_NOADHOC;
1756         if (channel->flags & IWN_EEPROM_CHAN_RADAR) {
1757                 nflags |= IEEE80211_CHAN_DFS;
1758                 /* XXX apparently IBSS may still be marked */
1759                 nflags |= IEEE80211_CHAN_NOADHOC;
1760         }
1761
1762         return nflags;
1763 }
1764
1765 static void
1766 iwn_read_eeprom_band(struct iwn_softc *sc, int n)
1767 {
1768         struct ifnet *ifp = sc->sc_ifp;
1769         struct ieee80211com *ic = ifp->if_l2com;
1770         struct iwn_eeprom_chan *channels = sc->eeprom_channels[n];
1771         const struct iwn_chan_band *band = &iwn_bands[n];
1772         struct ieee80211_channel *c;
1773         int i, chan, nflags;
1774
1775         for (i = 0; i < band->nchan; i++) {
1776                 if (!(channels[i].flags & IWN_EEPROM_CHAN_VALID)) {
1777                         DPRINTF(sc, IWN_DEBUG_RESET,
1778                             "skip chan %d flags 0x%x maxpwr %d\n",
1779                             band->chan[i], channels[i].flags,
1780                             channels[i].maxpwr);
1781                         continue;
1782                 }
1783                 chan = band->chan[i];
1784                 nflags = iwn_eeprom_channel_flags(&channels[i]);
1785
1786                 DPRINTF(sc, IWN_DEBUG_RESET,
1787                     "add chan %d flags 0x%x maxpwr %d\n",
1788                     chan, channels[i].flags, channels[i].maxpwr);
1789
1790                 c = &ic->ic_channels[ic->ic_nchans++];
1791                 c->ic_ieee = chan;
1792                 c->ic_maxregpower = channels[i].maxpwr;
1793                 c->ic_maxpower = 2*c->ic_maxregpower;
1794
1795                 /* Save maximum allowed TX power for this channel. */
1796                 sc->maxpwr[chan] = channels[i].maxpwr;
1797
1798                 if (n == 0) {   /* 2GHz band */
1799                         c->ic_freq = ieee80211_ieee2mhz(chan,
1800                             IEEE80211_CHAN_G);
1801
1802                         /* G =>'s B is supported */
1803                         c->ic_flags = IEEE80211_CHAN_B | nflags;
1804
1805                         c = &ic->ic_channels[ic->ic_nchans++];
1806                         c[0] = c[-1];
1807                         c->ic_flags = IEEE80211_CHAN_G | nflags;
1808                 } else {        /* 5GHz band */
1809                         c->ic_freq = ieee80211_ieee2mhz(chan,
1810                             IEEE80211_CHAN_A);
1811                         c->ic_flags = IEEE80211_CHAN_A | nflags;
1812                         sc->sc_flags |= IWN_FLAG_HAS_5GHZ;
1813                 }
1814 #if 0   /* HT */
1815                 /* XXX no constraints on using HT20 */
1816                 /* add HT20, HT40 added separately */
1817                 c = &ic->ic_channels[ic->ic_nchans++];
1818                 c[0] = c[-1];
1819                 c->ic_flags |= IEEE80211_CHAN_HT20;
1820                 /* XXX NARROW =>'s 1/2 and 1/4 width? */
1821 #endif
1822         }
1823 }
1824
1825 #if 0   /* HT */
1826 static void
1827 iwn_read_eeprom_ht40(struct iwn_softc *sc, int n)
1828 {
1829         struct ifnet *ifp = sc->sc_ifp;
1830         struct ieee80211com *ic = ifp->if_l2com;
1831         struct iwn_eeprom_chan *channels = sc->eeprom_channels[n];
1832         const struct iwn_chan_band *band = &iwn_bands[n];
1833         struct ieee80211_channel *c, *cent, *extc;
1834         int i;
1835
1836         for (i = 0; i < band->nchan; i++) {
1837                 if (!(channels[i].flags & IWN_EEPROM_CHAN_VALID) ||
1838                     !(channels[i].flags & IWN_EEPROM_CHAN_WIDE)) {
1839                         DPRINTF(sc, IWN_DEBUG_RESET,
1840                             "skip chan %d flags 0x%x maxpwr %d\n",
1841                             band->chan[i], channels[i].flags,
1842                             channels[i].maxpwr);
1843                         continue;
1844                 }
1845                 /*
1846                  * Each entry defines an HT40 channel pair; find the
1847                  * center channel, then the extension channel above.
1848                  */
1849                 cent = ieee80211_find_channel_byieee(ic, band->chan[i],
1850                     band->flags & ~IEEE80211_CHAN_HT);
1851                 if (cent == NULL) {     /* XXX shouldn't happen */
1852                         device_printf(sc->sc_dev,
1853                             "%s: no entry for channel %d\n",
1854                             __func__, band->chan[i]);
1855                         continue;
1856                 }
1857                 extc = ieee80211_find_channel(ic, cent->ic_freq+20,
1858                     band->flags & ~IEEE80211_CHAN_HT);
1859                 if (extc == NULL) {
1860                         DPRINTF(sc, IWN_DEBUG_RESET,
1861                             "skip chan %d, extension channel not found\n",
1862                             band->chan[i]);
1863                         continue;
1864                 }
1865
1866                 DPRINTF(sc, IWN_DEBUG_RESET,
1867                     "add ht40 chan %d flags 0x%x maxpwr %d\n",
1868                     band->chan[i], channels[i].flags, channels[i].maxpwr);
1869
1870                 c = &ic->ic_channels[ic->ic_nchans++];
1871                 c[0] = cent[0];
1872                 c->ic_extieee = extc->ic_ieee;
1873                 c->ic_flags &= ~IEEE80211_CHAN_HT;
1874                 c->ic_flags |= IEEE80211_CHAN_HT40U;
1875                 c = &ic->ic_channels[ic->ic_nchans++];
1876                 c[0] = extc[0];
1877                 c->ic_extieee = cent->ic_ieee;
1878                 c->ic_flags &= ~IEEE80211_CHAN_HT;
1879                 c->ic_flags |= IEEE80211_CHAN_HT40D;
1880         }
1881 }
1882 #endif
1883
1884 static void
1885 iwn_read_eeprom_channels(struct iwn_softc *sc, int n, uint32_t addr)
1886 {
1887         struct ifnet *ifp = sc->sc_ifp;
1888         struct ieee80211com *ic = ifp->if_l2com;
1889
1890         iwn_read_prom_data(sc, addr, &sc->eeprom_channels[n],
1891             iwn_bands[n].nchan * sizeof (struct iwn_eeprom_chan));
1892
1893         if (n < 5)
1894                 iwn_read_eeprom_band(sc, n);
1895 #if 0   /* HT */
1896         else
1897                 iwn_read_eeprom_ht40(sc, n);
1898 #endif
1899         ieee80211_sort_channels(ic->ic_channels, ic->ic_nchans);
1900 }
1901
1902 static void
1903 iwn_read_eeprom_enhinfo(struct iwn_softc *sc)
1904 {
1905         struct iwn_eeprom_enhinfo enhinfo[35];
1906         uint16_t val, base;
1907         int8_t maxpwr;
1908         int i;
1909
1910         iwn_read_prom_data(sc, IWN5000_EEPROM_REG, &val, 2);
1911         base = le16toh(val);
1912         iwn_read_prom_data(sc, base + IWN6000_EEPROM_ENHINFO,
1913             enhinfo, sizeof enhinfo);
1914
1915         memset(sc->enh_maxpwr, 0, sizeof sc->enh_maxpwr);
1916         for (i = 0; i < NELEM(enhinfo); i++) {
1917                 if (enhinfo[i].chan == 0 || enhinfo[i].reserved != 0)
1918                         continue;       /* Skip invalid entries. */
1919
1920                 maxpwr = 0;
1921                 if (sc->txchainmask & IWN_ANT_A)
1922                         maxpwr = MAX(maxpwr, enhinfo[i].chain[0]);
1923                 if (sc->txchainmask & IWN_ANT_B)
1924                         maxpwr = MAX(maxpwr, enhinfo[i].chain[1]);
1925                 if (sc->txchainmask & IWN_ANT_C)
1926                         maxpwr = MAX(maxpwr, enhinfo[i].chain[2]);
1927                 if (sc->ntxchains == 2)
1928                         maxpwr = MAX(maxpwr, enhinfo[i].mimo2);
1929                 else if (sc->ntxchains == 3)
1930                         maxpwr = MAX(maxpwr, enhinfo[i].mimo3);
1931                 maxpwr /= 2;    /* Convert half-dBm to dBm. */
1932
1933                 DPRINTF(sc, IWN_DEBUG_RESET, "enhinfo %d, maxpwr=%d\n", i,
1934                     maxpwr);
1935                 sc->enh_maxpwr[i] = maxpwr;
1936         }
1937 }
1938
1939 static struct ieee80211_node *
1940 iwn_node_alloc(struct ieee80211vap *vap, const uint8_t mac[IEEE80211_ADDR_LEN])
1941 {
1942         return kmalloc(sizeof (struct iwn_node), M_80211_NODE,M_INTWAIT | M_ZERO);
1943 }
1944
1945 static void
1946 iwn_newassoc(struct ieee80211_node *ni, int isnew)
1947 {
1948         /* XXX move */
1949         //if (!isnew) {
1950                 ieee80211_ratectl_node_deinit(ni);
1951         //}
1952
1953         ieee80211_ratectl_node_init(ni);
1954 }
1955
1956 static int
1957 iwn_media_change(struct ifnet *ifp)
1958 {
1959         int error = ieee80211_media_change(ifp);
1960         /* NB: only the fixed rate can change and that doesn't need a reset */
1961         return (error == ENETRESET ? 0 : error);
1962 }
1963
1964 static int
1965 iwn_newstate(struct ieee80211vap *vap, enum ieee80211_state nstate, int arg)
1966 {
1967         struct iwn_vap *ivp = IWN_VAP(vap);
1968         struct ieee80211com *ic = vap->iv_ic;
1969         struct iwn_softc *sc = ic->ic_ifp->if_softc;
1970         int error;
1971
1972         DPRINTF(sc, IWN_DEBUG_STATE, "%s: %s -> %s\n", __func__,
1973                 ieee80211_state_name[vap->iv_state],
1974                 ieee80211_state_name[nstate]);
1975
1976         callout_stop(&sc->sc_timer_to);
1977
1978         if (nstate == IEEE80211_S_AUTH && vap->iv_state != IEEE80211_S_AUTH) {
1979                 /* !AUTH -> AUTH requires adapter config */
1980                 /* Reset state to handle reassociations correctly. */
1981                 sc->rxon.associd = 0;
1982                 sc->rxon.filter &= ~htole32(IWN_FILTER_BSS);
1983                 iwn_calib_reset(sc);
1984                 error = iwn_auth(sc, vap);
1985         }
1986         if (nstate == IEEE80211_S_RUN && vap->iv_state != IEEE80211_S_RUN) {
1987                 /*
1988                  * !RUN -> RUN requires setting the association id
1989                  * which is done with a firmware cmd.  We also defer
1990                  * starting the timers until that work is done.
1991                  */
1992                 error = iwn_run(sc, vap);
1993         }
1994         if (nstate == IEEE80211_S_RUN) {
1995                 /*
1996                  * RUN -> RUN transition; just restart the timers.
1997                  */
1998                 iwn_calib_reset(sc);
1999         }
2000         return ivp->iv_newstate(vap, nstate, arg);
2001 }
2002
2003 /*
2004  * Process an RX_PHY firmware notification.  This is usually immediately
2005  * followed by an MPDU_RX_DONE notification.
2006  */
2007 static void
2008 iwn_rx_phy(struct iwn_softc *sc, struct iwn_rx_desc *desc,
2009     struct iwn_rx_data *data)
2010 {
2011         struct iwn_rx_stat *stat = (struct iwn_rx_stat *)(desc + 1);
2012
2013         DPRINTF(sc, IWN_DEBUG_CALIBRATE, "%s: received PHY stats\n", __func__);
2014         bus_dmamap_sync(sc->rxq.data_dmat, data->map, BUS_DMASYNC_POSTREAD);
2015
2016         /* Save RX statistics, they will be used on MPDU_RX_DONE. */
2017         memcpy(&sc->last_rx_stat, stat, sizeof (*stat));
2018         sc->last_rx_valid = 1;
2019 }
2020
2021 static void
2022 iwn_timer_callout(void *arg)
2023 {
2024         struct iwn_softc *sc = arg;
2025         uint32_t flags = 0;
2026
2027         wlan_serialize_enter();
2028         if (sc->calib_cnt && --sc->calib_cnt == 0) {
2029                 DPRINTF(sc, IWN_DEBUG_CALIBRATE, "%s\n",
2030                     "send statistics request");
2031                 (void) iwn_cmd(sc, IWN_CMD_GET_STATISTICS, &flags,
2032                     sizeof flags, 1);
2033                 sc->calib_cnt = 60;     /* do calibration every 60s */
2034         }
2035         iwn_watchdog(sc);               /* NB: piggyback tx watchdog */
2036         callout_reset(&sc->sc_timer_to, hz, iwn_timer_callout, sc);
2037         wlan_serialize_exit();
2038 }
2039
2040 static void
2041 iwn_calib_reset(struct iwn_softc *sc)
2042 {
2043         callout_reset(&sc->sc_timer_to, hz, iwn_timer_callout, sc);
2044         sc->calib_cnt = 60;             /* do calibration every 60s */
2045 }
2046
2047 /*
2048  * Process an RX_DONE (4965AGN only) or MPDU_RX_DONE firmware notification.
2049  * Each MPDU_RX_DONE notification must be preceded by an RX_PHY one.
2050  */
2051 static void
2052 iwn_rx_done(struct iwn_softc *sc, struct iwn_rx_desc *desc,
2053     struct iwn_rx_data *data)
2054 {
2055         const struct iwn_hal *hal = sc->sc_hal;
2056         struct ifnet *ifp = sc->sc_ifp;
2057         struct ieee80211com *ic = ifp->if_l2com;
2058         struct iwn_rx_ring *ring = &sc->rxq;
2059         struct ieee80211_frame *wh;
2060         struct ieee80211_node *ni;
2061         struct mbuf *m, *m1;
2062         struct iwn_rx_stat *stat;
2063         caddr_t head;
2064         bus_addr_t paddr;
2065         uint32_t flags;
2066         int error, len, rssi, nf;
2067
2068         if (desc->type == IWN_MPDU_RX_DONE) {
2069                 /* Check for prior RX_PHY notification. */
2070                 if (!sc->last_rx_valid) {
2071                         DPRINTF(sc, IWN_DEBUG_ANY,
2072                             "%s: missing RX_PHY\n", __func__);
2073                         ifp->if_ierrors++;
2074                         return;
2075                 }
2076                 sc->last_rx_valid = 0;
2077                 stat = &sc->last_rx_stat;
2078         } else
2079                 stat = (struct iwn_rx_stat *)(desc + 1);
2080
2081         bus_dmamap_sync(ring->data_dmat, data->map, BUS_DMASYNC_POSTREAD);
2082
2083         if (stat->cfg_phy_len > IWN_STAT_MAXLEN) {
2084                 device_printf(sc->sc_dev,
2085                     "%s: invalid rx statistic header, len %d\n",
2086                     __func__, stat->cfg_phy_len);
2087                 ifp->if_ierrors++;
2088                 return;
2089         }
2090         if (desc->type == IWN_MPDU_RX_DONE) {
2091                 struct iwn_rx_mpdu *mpdu = (struct iwn_rx_mpdu *)(desc + 1);
2092                 head = (caddr_t)(mpdu + 1);
2093                 len = le16toh(mpdu->len);
2094         } else {
2095                 head = (caddr_t)(stat + 1) + stat->cfg_phy_len;
2096                 len = le16toh(stat->len);
2097         }
2098
2099         flags = le32toh(*(uint32_t *)(head + len));
2100
2101         /* Discard frames with a bad FCS early. */
2102         if ((flags & IWN_RX_NOERROR) != IWN_RX_NOERROR) {
2103                 DPRINTF(sc, IWN_DEBUG_RECV, "%s: rx flags error %x\n",
2104                     __func__, flags);
2105                 ifp->if_ierrors++;
2106                 return;
2107         }
2108         /* Discard frames that are too short. */
2109         if (len < sizeof (*wh)) {
2110                 DPRINTF(sc, IWN_DEBUG_RECV, "%s: frame too short: %d\n",
2111                     __func__, len);
2112                 ifp->if_ierrors++;
2113                 return;
2114         }
2115
2116         /* XXX don't need mbuf, just dma buffer */
2117         m1 = m_getjcl(MB_DONTWAIT, MT_DATA, M_PKTHDR, MJUMPAGESIZE);
2118         if (m1 == NULL) {
2119                 DPRINTF(sc, IWN_DEBUG_ANY, "%s: no mbuf to restock ring\n",
2120                     __func__);
2121                 ifp->if_ierrors++;
2122                 return;
2123         }
2124         bus_dmamap_unload(ring->data_dmat, data->map);
2125
2126         error = bus_dmamap_load(ring->data_dmat, data->map,
2127             mtod(m1, caddr_t), MJUMPAGESIZE,
2128             iwn_dma_map_addr, &paddr, BUS_DMA_NOWAIT);
2129         if (error != 0 && error != EFBIG) {
2130                 device_printf(sc->sc_dev,
2131                     "%s: bus_dmamap_load failed, error %d\n", __func__, error);
2132                 m_freem(m1);
2133                 ifp->if_ierrors++;
2134                 return;
2135         }
2136
2137         m = data->m;
2138         data->m = m1;
2139         /* Update RX descriptor. */
2140         ring->desc[ring->cur] = htole32(paddr >> 8);
2141         bus_dmamap_sync(ring->desc_dma.tag, ring->desc_dma.map,
2142             BUS_DMASYNC_PREWRITE);
2143
2144         /* Finalize mbuf. */
2145         m->m_pkthdr.rcvif = ifp;
2146         m->m_data = head;
2147         m->m_pkthdr.len = m->m_len = len;
2148
2149         rssi = hal->get_rssi(sc, stat);
2150
2151         /* Grab a reference to the source node. */
2152         wh = mtod(m, struct ieee80211_frame *);
2153         ni = ieee80211_find_rxnode(ic, (struct ieee80211_frame_min *)wh);
2154         nf = (ni != NULL && ni->ni_vap->iv_state == IEEE80211_S_RUN &&
2155             (ic->ic_flags & IEEE80211_F_SCAN) == 0) ? sc->noise : -95;
2156
2157         if (ieee80211_radiotap_active(ic)) {
2158                 struct iwn_rx_radiotap_header *tap = &sc->sc_rxtap;
2159
2160                 tap->wr_tsft = htole64(stat->tstamp);
2161                 tap->wr_flags = 0;
2162                 if (stat->flags & htole16(IWN_STAT_FLAG_SHPREAMBLE))
2163                         tap->wr_flags |= IEEE80211_RADIOTAP_F_SHORTPRE;
2164                 switch (stat->rate) {
2165                 /* CCK rates. */
2166                 case  10: tap->wr_rate =   2; break;
2167                 case  20: tap->wr_rate =   4; break;
2168                 case  55: tap->wr_rate =  11; break;
2169                 case 110: tap->wr_rate =  22; break;
2170                 /* OFDM rates. */
2171                 case 0xd: tap->wr_rate =  12; break;
2172                 case 0xf: tap->wr_rate =  18; break;
2173                 case 0x5: tap->wr_rate =  24; break;
2174                 case 0x7: tap->wr_rate =  36; break;
2175                 case 0x9: tap->wr_rate =  48; break;
2176                 case 0xb: tap->wr_rate =  72; break;
2177                 case 0x1: tap->wr_rate =  96; break;
2178                 case 0x3: tap->wr_rate = 108; break;
2179                 /* Unknown rate: should not happen. */
2180                 default:  tap->wr_rate =   0;
2181                 }
2182                 tap->wr_dbm_antsignal = rssi;
2183                 tap->wr_dbm_antnoise = nf;
2184         }
2185
2186         /* Send the frame to the 802.11 layer. */
2187         if (ni != NULL) {
2188                 (void) ieee80211_input(ni, m, rssi - nf, nf);
2189                 /* Node is no longer needed. */
2190                 ieee80211_free_node(ni);
2191         } else {
2192                 (void) ieee80211_input_all(ic, m, rssi - nf, nf);
2193         }
2194 }
2195
2196 #if 0   /* HT */
2197 /* Process an incoming Compressed BlockAck. */
2198 static void
2199 iwn_rx_compressed_ba(struct iwn_softc *sc, struct iwn_rx_desc *desc,
2200     struct iwn_rx_data *data)
2201 {
2202         struct iwn_compressed_ba *ba = (struct iwn_compressed_ba *)(desc + 1);
2203         struct iwn_tx_ring *txq;
2204
2205         txq = &sc->txq[letoh16(ba->qid)];
2206         /* XXX TBD */
2207 }
2208 #endif
2209
2210 /*
2211  * Process a CALIBRATION_RESULT notification sent by the initialization
2212  * firmware on response to a CMD_CALIB_CONFIG command (5000 only.)
2213  */
2214 static void
2215 iwn5000_rx_calib_results(struct iwn_softc *sc, struct iwn_rx_desc *desc,
2216     struct iwn_rx_data *data)
2217 {
2218         struct iwn_phy_calib *calib = (struct iwn_phy_calib *)(desc + 1);
2219         int len, idx = -1;
2220
2221         /* Runtime firmware should not send such a notification. */
2222         if (sc->sc_flags & IWN_FLAG_CALIB_DONE)
2223                 return;
2224
2225         bus_dmamap_sync(sc->rxq.data_dmat, data->map, BUS_DMASYNC_POSTREAD);
2226         len = (le32toh(desc->len) & 0x3fff) - 4;
2227
2228         switch (calib->code) {
2229         case IWN5000_PHY_CALIB_DC:
2230                 if (sc->hw_type == IWN_HW_REV_TYPE_5150 ||
2231                     sc->hw_type == IWN_HW_REV_TYPE_6050)
2232                         idx = 0;
2233                 break;
2234         case IWN5000_PHY_CALIB_LO:
2235                 idx = 1;
2236                 break;
2237         case IWN5000_PHY_CALIB_TX_IQ:
2238                 idx = 2;
2239                 break;
2240         case IWN5000_PHY_CALIB_TX_IQ_PERIODIC:
2241                 if (sc->hw_type < IWN_HW_REV_TYPE_6000 &&
2242                     sc->hw_type != IWN_HW_REV_TYPE_5150)
2243                         idx = 3;
2244                 break;
2245         case IWN5000_PHY_CALIB_BASE_BAND:
2246                 idx = 4;
2247                 break;
2248         }
2249         if (idx == -1)  /* Ignore other results. */
2250                 return;
2251
2252         /* Save calibration result. */
2253         if (sc->calibcmd[idx].buf != NULL)
2254                 kfree(sc->calibcmd[idx].buf, M_DEVBUF);
2255         sc->calibcmd[idx].buf = kmalloc(len, M_DEVBUF, M_INTWAIT);
2256         if (sc->calibcmd[idx].buf == NULL) {
2257                 DPRINTF(sc, IWN_DEBUG_CALIBRATE,
2258                     "not enough memory for calibration result %d\n",
2259                     calib->code);
2260                 return;
2261         }
2262         DPRINTF(sc, IWN_DEBUG_CALIBRATE,
2263             "saving calibration result code=%d len=%d\n", calib->code, len);
2264         sc->calibcmd[idx].len = len;
2265         memcpy(sc->calibcmd[idx].buf, calib, len);
2266 }
2267
2268 /*
2269  * Process an RX_STATISTICS or BEACON_STATISTICS firmware notification.
2270  * The latter is sent by the firmware after each received beacon.
2271  */
2272 static void
2273 iwn_rx_statistics(struct iwn_softc *sc, struct iwn_rx_desc *desc,
2274     struct iwn_rx_data *data)
2275 {
2276         const struct iwn_hal *hal = sc->sc_hal;
2277         struct ifnet *ifp = sc->sc_ifp;
2278         struct ieee80211com *ic = ifp->if_l2com;
2279         struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps);
2280         struct iwn_calib_state *calib = &sc->calib;
2281         struct iwn_stats *stats = (struct iwn_stats *)(desc + 1);
2282         int temp;
2283
2284         /* Beacon stats are meaningful only when associated and not scanning. */
2285         if (vap->iv_state != IEEE80211_S_RUN ||
2286             (ic->ic_flags & IEEE80211_F_SCAN))
2287                 return;
2288
2289         bus_dmamap_sync(sc->rxq.data_dmat, data->map, BUS_DMASYNC_POSTREAD);
2290         DPRINTF(sc, IWN_DEBUG_CALIBRATE, "%s: cmd %d\n", __func__, desc->type);
2291         iwn_calib_reset(sc);    /* Reset TX power calibration timeout. */
2292
2293         /* Test if temperature has changed. */
2294         if (stats->general.temp != sc->rawtemp) {
2295                 /* Convert "raw" temperature to degC. */
2296                 sc->rawtemp = stats->general.temp;
2297                 temp = hal->get_temperature(sc);
2298                 DPRINTF(sc, IWN_DEBUG_CALIBRATE, "%s: temperature %d\n",
2299                     __func__, temp);
2300
2301                 /* Update TX power if need be (4965AGN only.) */
2302                 if (sc->hw_type == IWN_HW_REV_TYPE_4965)
2303                         iwn4965_power_calibration(sc, temp);
2304         }
2305
2306         if (desc->type != IWN_BEACON_STATISTICS)
2307                 return; /* Reply to a statistics request. */
2308
2309         sc->noise = iwn_get_noise(&stats->rx.general);
2310         DPRINTF(sc, IWN_DEBUG_CALIBRATE, "%s: noise %d\n", __func__, sc->noise);
2311
2312         /* Test that RSSI and noise are present in stats report. */
2313         if (le32toh(stats->rx.general.flags) != 1) {
2314                 DPRINTF(sc, IWN_DEBUG_ANY, "%s\n",
2315                     "received statistics without RSSI");
2316                 return;
2317         }
2318
2319         if (calib->state == IWN_CALIB_STATE_ASSOC)
2320                 iwn_collect_noise(sc, &stats->rx.general);
2321         else if (calib->state == IWN_CALIB_STATE_RUN)
2322                 iwn_tune_sensitivity(sc, &stats->rx);
2323 }
2324
2325 /*
2326  * Process a TX_DONE firmware notification.  Unfortunately, the 4965AGN
2327  * and 5000 adapters have different incompatible TX status formats.
2328  */
2329 static void
2330 iwn4965_tx_done(struct iwn_softc *sc, struct iwn_rx_desc *desc,
2331     struct iwn_rx_data *data)
2332 {
2333         struct iwn4965_tx_stat *stat = (struct iwn4965_tx_stat *)(desc + 1);
2334         struct iwn_tx_ring *ring = &sc->txq[desc->qid & 0xf];
2335
2336         DPRINTF(sc, IWN_DEBUG_XMIT, "%s: "
2337             "qid %d idx %d retries %d nkill %d rate %x duration %d status %x\n",
2338             __func__, desc->qid, desc->idx, stat->ackfailcnt,
2339             stat->btkillcnt, stat->rate, le16toh(stat->duration),
2340             le32toh(stat->status));
2341
2342         bus_dmamap_sync(ring->data_dmat, data->map, BUS_DMASYNC_POSTREAD);
2343         iwn_tx_done(sc, desc, stat->ackfailcnt, le32toh(stat->status) & 0xff);
2344 }
2345
2346 static void
2347 iwn5000_tx_done(struct iwn_softc *sc, struct iwn_rx_desc *desc,
2348     struct iwn_rx_data *data)
2349 {
2350         struct iwn5000_tx_stat *stat = (struct iwn5000_tx_stat *)(desc + 1);
2351         struct iwn_tx_ring *ring = &sc->txq[desc->qid & 0xf];
2352
2353         DPRINTF(sc, IWN_DEBUG_XMIT, "%s: "
2354             "qid %d idx %d retries %d nkill %d rate %x duration %d status %x\n",
2355             __func__, desc->qid, desc->idx, stat->ackfailcnt,
2356             stat->btkillcnt, stat->rate, le16toh(stat->duration),
2357             le32toh(stat->status));
2358
2359 #ifdef notyet
2360         /* Reset TX scheduler slot. */
2361         iwn5000_reset_sched(sc, desc->qid & 0xf, desc->idx);
2362 #endif
2363
2364         bus_dmamap_sync(ring->data_dmat, data->map, BUS_DMASYNC_POSTREAD);
2365         iwn_tx_done(sc, desc, stat->ackfailcnt, le16toh(stat->status) & 0xff);
2366 }
2367
2368 /*
2369  * Adapter-independent backend for TX_DONE firmware notifications.
2370  */
2371 static void
2372 iwn_tx_done(struct iwn_softc *sc, struct iwn_rx_desc *desc, int ackfailcnt,
2373     uint8_t status)
2374 {
2375         struct ifnet *ifp = sc->sc_ifp;
2376         struct iwn_tx_ring *ring = &sc->txq[desc->qid & 0xf];
2377         struct iwn_tx_data *data = &ring->data[desc->idx];
2378         struct mbuf *m;
2379         struct ieee80211_node *ni;
2380         struct ieee80211vap *vap;
2381
2382         KASSERT(data->ni != NULL, ("no node"));
2383
2384         /* Unmap and free mbuf. */
2385         bus_dmamap_sync(ring->data_dmat, data->map, BUS_DMASYNC_POSTWRITE);
2386         bus_dmamap_unload(ring->data_dmat, data->map);
2387         m = data->m, data->m = NULL;
2388         ni = data->ni, data->ni = NULL;
2389         vap = ni->ni_vap;
2390
2391         if (m->m_flags & M_TXCB) {
2392                 /*
2393                  * Channels marked for "radar" require traffic to be received
2394                  * to unlock before we can transmit.  Until traffic is seen
2395                  * any attempt to transmit is returned immediately with status
2396                  * set to IWN_TX_FAIL_TX_LOCKED.  Unfortunately this can easily
2397                  * happen on first authenticate after scanning.  To workaround
2398                  * this we ignore a failure of this sort in AUTH state so the
2399                  * 802.11 layer will fall back to using a timeout to wait for
2400                  * the AUTH reply.  This allows the firmware time to see
2401                  * traffic so a subsequent retry of AUTH succeeds.  It's
2402                  * unclear why the firmware does not maintain state for
2403                  * channels recently visited as this would allow immediate
2404                  * use of the channel after a scan (where we see traffic).
2405                  */
2406                 if (status == IWN_TX_FAIL_TX_LOCKED &&
2407                     ni->ni_vap->iv_state == IEEE80211_S_AUTH)
2408                         ieee80211_process_callback(ni, m, 0);
2409                 else
2410                         ieee80211_process_callback(ni, m,
2411                             (status & IWN_TX_FAIL) != 0);
2412         }
2413
2414         /*
2415          * Update rate control statistics for the node.
2416          */
2417         if (status & 0x80) {
2418                 ifp->if_oerrors++;
2419                 ieee80211_ratectl_tx_complete(vap, ni,
2420                     IEEE80211_RATECTL_TX_FAILURE, &ackfailcnt, NULL);
2421         } else {
2422                 ieee80211_ratectl_tx_complete(vap, ni,
2423                     IEEE80211_RATECTL_TX_SUCCESS, &ackfailcnt, NULL);
2424         }
2425         m_freem(m);
2426         ieee80211_free_node(ni);
2427
2428         sc->sc_tx_timer = 0;
2429         if (--ring->queued < IWN_TX_RING_LOMARK) {
2430                 sc->qfullmsk &= ~(1 << ring->qid);
2431                 if (sc->qfullmsk == 0 &&
2432                     (ifp->if_flags & IFF_OACTIVE)) {
2433                         ifp->if_flags &= ~IFF_OACTIVE;
2434                         iwn_start_locked(ifp);
2435                 }
2436         }
2437 }
2438
2439 /*
2440  * Process a "command done" firmware notification.  This is where we wakeup
2441  * processes waiting for a synchronous command completion.
2442  */
2443 static void
2444 iwn_cmd_done(struct iwn_softc *sc, struct iwn_rx_desc *desc)
2445 {
2446         struct iwn_tx_ring *ring = &sc->txq[4];
2447         struct iwn_tx_data *data;
2448
2449         if ((desc->qid & 0xf) != 4)
2450                 return; /* Not a command ack. */
2451
2452         data = &ring->data[desc->idx];
2453
2454         /* If the command was mapped in an mbuf, free it. */
2455         if (data->m != NULL) {
2456                 bus_dmamap_unload(ring->data_dmat, data->map);
2457                 m_freem(data->m);
2458                 data->m = NULL;
2459         }
2460         wakeup(&ring->desc[desc->idx]);
2461 }
2462
2463 /*
2464  * Process an INT_FH_RX or INT_SW_RX interrupt.
2465  */
2466 static void
2467 iwn_notif_intr(struct iwn_softc *sc)
2468 {
2469         struct ifnet *ifp = sc->sc_ifp;
2470         struct ieee80211com *ic = ifp->if_l2com;
2471         struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps);
2472         uint16_t hw;
2473
2474         bus_dmamap_sync(sc->rxq.stat_dma.tag, sc->rxq.stat_dma.map,
2475             BUS_DMASYNC_POSTREAD);
2476
2477         hw = le16toh(sc->rxq.stat->closed_count) & 0xfff;
2478         while (sc->rxq.cur != hw) {
2479                 struct iwn_rx_data *data = &sc->rxq.data[sc->rxq.cur];
2480                 struct iwn_rx_desc *desc;
2481
2482                 bus_dmamap_sync(sc->rxq.data_dmat, data->map,
2483                     BUS_DMASYNC_POSTREAD);
2484                 desc = mtod(data->m, struct iwn_rx_desc *);
2485
2486                 DPRINTF(sc, IWN_DEBUG_RECV,
2487                     "%s: qid %x idx %d flags %x type %d(%s) len %d\n",
2488                     __func__, desc->qid & 0xf, desc->idx, desc->flags,
2489                     desc->type, iwn_intr_str(desc->type),
2490                     le16toh(desc->len));
2491
2492                 if (!(desc->qid & 0x80))        /* Reply to a command. */
2493                         iwn_cmd_done(sc, desc);
2494
2495                 switch (desc->type) {
2496                 case IWN_RX_PHY:
2497                         iwn_rx_phy(sc, desc, data);
2498                         break;
2499
2500                 case IWN_RX_DONE:               /* 4965AGN only. */
2501                 case IWN_MPDU_RX_DONE:
2502                         /* An 802.11 frame has been received. */
2503                         iwn_rx_done(sc, desc, data);
2504                         break;
2505
2506 #if 0   /* HT */
2507                 case IWN_RX_COMPRESSED_BA:
2508                         /* A Compressed BlockAck has been received. */
2509                         iwn_rx_compressed_ba(sc, desc, data);
2510                         break;
2511 #endif
2512
2513                 case IWN_TX_DONE:
2514                         /* An 802.11 frame has been transmitted. */
2515                         sc->sc_hal->tx_done(sc, desc, data);
2516                         break;
2517
2518                 case IWN_RX_STATISTICS:
2519                 case IWN_BEACON_STATISTICS:
2520                         iwn_rx_statistics(sc, desc, data);
2521                         break;
2522
2523                 case IWN_BEACON_MISSED:
2524                 {
2525                         struct iwn_beacon_missed *miss =
2526                             (struct iwn_beacon_missed *)(desc + 1);
2527                         int misses;
2528
2529                         bus_dmamap_sync(sc->rxq.data_dmat, data->map,
2530                             BUS_DMASYNC_POSTREAD);
2531                         misses = le32toh(miss->consecutive);
2532
2533                         /* XXX not sure why we're notified w/ zero */
2534                         if (misses == 0)
2535                                 break;
2536                         DPRINTF(sc, IWN_DEBUG_STATE,
2537                             "%s: beacons missed %d/%d\n", __func__,
2538                             misses, le32toh(miss->total));
2539
2540                         /*
2541                          * If more than 5 consecutive beacons are missed,
2542                          * reinitialize the sensitivity state machine.
2543                          */
2544                         if (vap->iv_state == IEEE80211_S_RUN && misses > 5)
2545                                 (void) iwn_init_sensitivity(sc);
2546                         if (misses >= vap->iv_bmissthreshold)
2547                                 ieee80211_beacon_miss(ic);
2548                         break;
2549                 }
2550                 case IWN_UC_READY:
2551                 {
2552                         struct iwn_ucode_info *uc =
2553                             (struct iwn_ucode_info *)(desc + 1);
2554
2555                         /* The microcontroller is ready. */
2556                         bus_dmamap_sync(sc->rxq.data_dmat, data->map,
2557                             BUS_DMASYNC_POSTREAD);
2558                         DPRINTF(sc, IWN_DEBUG_RESET,
2559                             "microcode alive notification version=%d.%d "
2560                             "subtype=%x alive=%x\n", uc->major, uc->minor,
2561                             uc->subtype, le32toh(uc->valid));
2562
2563                         if (le32toh(uc->valid) != 1) {
2564                                 device_printf(sc->sc_dev,
2565                                     "microcontroller initialization failed");
2566                                 break;
2567                         }
2568                         if (uc->subtype == IWN_UCODE_INIT) {
2569                                 /* Save microcontroller report. */
2570                                 memcpy(&sc->ucode_info, uc, sizeof (*uc));
2571                         }
2572                         /* Save the address of the error log in SRAM. */
2573                         sc->errptr = le32toh(uc->errptr);
2574                         break;
2575                 }
2576                 case IWN_STATE_CHANGED:
2577                 {
2578                         uint32_t *status = (uint32_t *)(desc + 1);
2579
2580                         /*
2581                          * State change allows hardware switch change to be
2582                          * noted. However, we handle this in iwn_intr as we
2583                          * get both the enable/disble intr.
2584                          */
2585                         bus_dmamap_sync(sc->rxq.data_dmat, data->map,
2586                             BUS_DMASYNC_POSTREAD);
2587                         DPRINTF(sc, IWN_DEBUG_INTR, "state changed to %x\n",
2588                             le32toh(*status));
2589                         break;
2590                 }
2591                 case IWN_START_SCAN:
2592                 {
2593                         struct iwn_start_scan *scan =
2594                             (struct iwn_start_scan *)(desc + 1);
2595
2596                         bus_dmamap_sync(sc->rxq.data_dmat, data->map,
2597                             BUS_DMASYNC_POSTREAD);
2598                         DPRINTF(sc, IWN_DEBUG_ANY,
2599                             "%s: scanning channel %d status %x\n",
2600                             __func__, scan->chan, le32toh(scan->status));
2601                         break;
2602                 }
2603                 case IWN_STOP_SCAN:
2604                 {
2605                         struct iwn_stop_scan *scan =
2606                             (struct iwn_stop_scan *)(desc + 1);
2607
2608                         bus_dmamap_sync(sc->rxq.data_dmat, data->map,
2609                             BUS_DMASYNC_POSTREAD);
2610                         DPRINTF(sc, IWN_DEBUG_STATE,
2611                             "scan finished nchan=%d status=%d chan=%d\n",
2612                             scan->nchan, scan->status, scan->chan);
2613
2614                         ieee80211_scan_next(vap);
2615                         break;
2616                 }
2617                 case IWN5000_CALIBRATION_RESULT:
2618                         iwn5000_rx_calib_results(sc, desc, data);
2619                         break;
2620
2621                 case IWN5000_CALIBRATION_DONE:
2622                         sc->sc_flags |= IWN_FLAG_CALIB_DONE;
2623                         wakeup(sc);
2624                         break;
2625                 }
2626
2627                 sc->rxq.cur = (sc->rxq.cur + 1) % IWN_RX_RING_COUNT;
2628         }
2629
2630         /* Tell the firmware what we have processed. */
2631         hw = (hw == 0) ? IWN_RX_RING_COUNT - 1 : hw - 1;
2632         IWN_WRITE(sc, IWN_FH_RX_WPTR, hw & ~7);
2633 }
2634
2635 /*
2636  * Process an INT_WAKEUP interrupt raised when the microcontroller wakes up
2637  * from power-down sleep mode.
2638  */
2639 static void
2640 iwn_wakeup_intr(struct iwn_softc *sc)
2641 {
2642         int qid;
2643
2644         DPRINTF(sc, IWN_DEBUG_RESET, "%s: ucode wakeup from power-down sleep\n",
2645             __func__);
2646
2647         /* Wakeup RX and TX rings. */
2648         IWN_WRITE(sc, IWN_FH_RX_WPTR, sc->rxq.cur & ~7);
2649         for (qid = 0; qid < sc->sc_hal->ntxqs; qid++) {
2650                 struct iwn_tx_ring *ring = &sc->txq[qid];
2651                 IWN_WRITE(sc, IWN_HBUS_TARG_WRPTR, qid << 8 | ring->cur);
2652         }
2653 }
2654
2655 static void
2656 iwn_rftoggle_intr(struct iwn_softc *sc)
2657 {
2658         struct ifnet *ifp = sc->sc_ifp;
2659         struct ieee80211com *ic = ifp->if_l2com;
2660         uint32_t tmp = IWN_READ(sc, IWN_GP_CNTRL);
2661
2662         device_printf(sc->sc_dev, "RF switch: radio %s\n",
2663             (tmp & IWN_GP_CNTRL_RFKILL) ? "enabled" : "disabled");
2664         if (tmp & IWN_GP_CNTRL_RFKILL)
2665                 ieee80211_runtask(ic, &sc->sc_radioon_task);
2666         else
2667                 ieee80211_runtask(ic, &sc->sc_radiooff_task);
2668 }
2669
2670 /*
2671  * Dump the error log of the firmware when a firmware panic occurs.  Although
2672  * we can't debug the firmware because it is neither open source nor free, it
2673  * can help us to identify certain classes of problems.
2674  */
2675 static void
2676 iwn_fatal_intr(struct iwn_softc *sc)
2677 {
2678         const struct iwn_hal *hal = sc->sc_hal;
2679         struct iwn_fw_dump dump;
2680         int i;
2681
2682         /* Force a complete recalibration on next init. */
2683         sc->sc_flags &= ~IWN_FLAG_CALIB_DONE;
2684
2685         /* Check that the error log address is valid. */
2686         if (sc->errptr < IWN_FW_DATA_BASE ||
2687             sc->errptr + sizeof (dump) >
2688             IWN_FW_DATA_BASE + hal->fw_data_maxsz) {
2689                 kprintf("%s: bad firmware error log address 0x%08x\n",
2690                     __func__, sc->errptr);
2691                 return;
2692         }
2693         if (iwn_nic_lock(sc) != 0) {
2694                 kprintf("%s: could not read firmware error log\n",
2695                     __func__);
2696                 return;
2697         }
2698         /* Read firmware error log from SRAM. */
2699         iwn_mem_read_region_4(sc, sc->errptr, (uint32_t *)&dump,
2700             sizeof (dump) / sizeof (uint32_t));
2701         iwn_nic_unlock(sc);
2702
2703         if (dump.valid == 0) {
2704                 kprintf("%s: firmware error log is empty\n",
2705                     __func__);
2706                 return;
2707         }
2708         kprintf("firmware error log:\n");
2709         kprintf("  error type      = \"%s\" (0x%08X)\n",
2710             (dump.id < NELEM(iwn_fw_errmsg)) ?
2711                 iwn_fw_errmsg[dump.id] : "UNKNOWN",
2712             dump.id);
2713         kprintf("  program counter = 0x%08X\n", dump.pc);
2714         kprintf("  source line     = 0x%08X\n", dump.src_line);
2715         kprintf("  error data      = 0x%08X%08X\n",
2716             dump.error_data[0], dump.error_data[1]);
2717         kprintf("  branch link     = 0x%08X%08X\n",
2718             dump.branch_link[0], dump.branch_link[1]);
2719         kprintf("  interrupt link  = 0x%08X%08X\n",
2720             dump.interrupt_link[0], dump.interrupt_link[1]);
2721         kprintf("  time            = %u\n", dump.time[0]);
2722
2723         /* Dump driver status (TX and RX rings) while we're here. */
2724         kprintf("driver status:\n");
2725         for (i = 0; i < hal->ntxqs; i++) {
2726                 struct iwn_tx_ring *ring = &sc->txq[i];
2727                 kprintf("  tx ring %2d: qid=%-2d cur=%-3d queued=%-3d\n",
2728                     i, ring->qid, ring->cur, ring->queued);
2729         }
2730         kprintf("  rx ring: cur=%d\n", sc->rxq.cur);
2731 }
2732
2733 static void
2734 iwn_intr(void *arg)
2735 {
2736         struct iwn_softc *sc = arg;
2737         struct ifnet *ifp = sc->sc_ifp;
2738         uint32_t r1, r2, tmp;
2739
2740         /* Disable interrupts. */
2741         IWN_WRITE(sc, IWN_INT_MASK, 0);
2742
2743         /* Read interrupts from ICT (fast) or from registers (slow). */
2744         if (sc->sc_flags & IWN_FLAG_USE_ICT) {
2745                 tmp = 0;
2746                 while (sc->ict[sc->ict_cur] != 0) {
2747                         tmp |= sc->ict[sc->ict_cur];
2748                         sc->ict[sc->ict_cur] = 0;       /* Acknowledge. */
2749                         sc->ict_cur = (sc->ict_cur + 1) % IWN_ICT_COUNT;
2750                 }
2751                 tmp = le32toh(tmp);
2752                 if (tmp == 0xffffffff)  /* Shouldn't happen. */
2753                         tmp = 0;
2754                 else if (tmp & 0xc0000) /* Workaround a HW bug. */
2755                         tmp |= 0x8000;
2756                 r1 = (tmp & 0xff00) << 16 | (tmp & 0xff);
2757                 r2 = 0; /* Unused. */
2758         } else {
2759                 r1 = IWN_READ(sc, IWN_INT);
2760                 if (r1 == 0xffffffff || (r1 & 0xfffffff0) == 0xa5a5a5a0)
2761                         return; /* Hardware gone! */
2762                 r2 = IWN_READ(sc, IWN_FH_INT);
2763         }
2764
2765         DPRINTF(sc, IWN_DEBUG_INTR, "interrupt reg1=%x reg2=%x\n", r1, r2);
2766
2767         if (r1 == 0 && r2 == 0)
2768                 goto done;      /* Interrupt not for us. */
2769
2770         /* Acknowledge interrupts. */
2771         IWN_WRITE(sc, IWN_INT, r1);
2772         if (!(sc->sc_flags & IWN_FLAG_USE_ICT))
2773                 IWN_WRITE(sc, IWN_FH_INT, r2);
2774
2775         if (r1 & IWN_INT_RF_TOGGLED) {
2776                 iwn_rftoggle_intr(sc);
2777                 goto done;
2778         }
2779         if (r1 & IWN_INT_CT_REACHED) {
2780                 device_printf(sc->sc_dev, "%s: critical temperature reached!\n",
2781                     __func__);
2782         }
2783         if (r1 & (IWN_INT_SW_ERR | IWN_INT_HW_ERR)) {
2784                 iwn_fatal_intr(sc);
2785                 ifp->if_flags &= ~IFF_UP;
2786                 iwn_stop_locked(sc);
2787                 goto done;
2788         }
2789         if ((r1 & (IWN_INT_FH_RX | IWN_INT_SW_RX | IWN_INT_RX_PERIODIC)) ||
2790             (r2 & IWN_FH_INT_RX)) {
2791                 if (sc->sc_flags & IWN_FLAG_USE_ICT) {
2792                         if (r1 & (IWN_INT_FH_RX | IWN_INT_SW_RX))
2793                                 IWN_WRITE(sc, IWN_FH_INT, IWN_FH_INT_RX);
2794                         IWN_WRITE_1(sc, IWN_INT_PERIODIC,
2795                             IWN_INT_PERIODIC_DIS);
2796                         iwn_notif_intr(sc);
2797                         if (r1 & (IWN_INT_FH_RX | IWN_INT_SW_RX)) {
2798                                 IWN_WRITE_1(sc, IWN_INT_PERIODIC,
2799                                     IWN_INT_PERIODIC_ENA);
2800                         }
2801                 } else
2802                         iwn_notif_intr(sc);
2803         }
2804
2805         if ((r1 & IWN_INT_FH_TX) || (r2 & IWN_FH_INT_TX)) {
2806                 if (sc->sc_flags & IWN_FLAG_USE_ICT)
2807                         IWN_WRITE(sc, IWN_FH_INT, IWN_FH_INT_TX);
2808                 wakeup(sc);     /* FH DMA transfer completed. */
2809         }
2810
2811         if (r1 & IWN_INT_ALIVE)
2812                 wakeup(sc);     /* Firmware is alive. */
2813
2814         if (r1 & IWN_INT_WAKEUP)
2815                 iwn_wakeup_intr(sc);
2816
2817 done:
2818         /* Re-enable interrupts. */
2819         if (ifp->if_flags & IFF_UP)
2820                 IWN_WRITE(sc, IWN_INT_MASK, sc->int_mask);
2821 }
2822
2823 /*
2824  * Update TX scheduler ring when transmitting an 802.11 frame (4965AGN and
2825  * 5000 adapters use a slightly different format.)
2826  */
2827 static void
2828 iwn4965_update_sched(struct iwn_softc *sc, int qid, int idx, uint8_t id,
2829     uint16_t len)
2830 {
2831         uint16_t *w = &sc->sched[qid * IWN4965_SCHED_COUNT + idx];
2832
2833         *w = htole16(len + 8);
2834         bus_dmamap_sync(sc->sched_dma.tag, sc->sched_dma.map,
2835             BUS_DMASYNC_PREWRITE);
2836         if (idx < IWN_SCHED_WINSZ) {
2837                 *(w + IWN_TX_RING_COUNT) = *w;
2838                 bus_dmamap_sync(sc->sched_dma.tag, sc->sched_dma.map,
2839                     BUS_DMASYNC_PREWRITE);
2840         }
2841 }
2842
2843 static void
2844 iwn5000_update_sched(struct iwn_softc *sc, int qid, int idx, uint8_t id,
2845     uint16_t len)
2846 {
2847         uint16_t *w = &sc->sched[qid * IWN5000_SCHED_COUNT + idx];
2848
2849         *w = htole16(id << 12 | (len + 8));
2850
2851         bus_dmamap_sync(sc->sched_dma.tag, sc->sched_dma.map,
2852             BUS_DMASYNC_PREWRITE);
2853         if (idx < IWN_SCHED_WINSZ) {
2854                 *(w + IWN_TX_RING_COUNT) = *w;
2855                 bus_dmamap_sync(sc->sched_dma.tag, sc->sched_dma.map,
2856                     BUS_DMASYNC_PREWRITE);
2857         }
2858 }
2859
2860 #ifdef notyet
2861 static void
2862 iwn5000_reset_sched(struct iwn_softc *sc, int qid, int idx)
2863 {
2864         uint16_t *w = &sc->sched[qid * IWN5000_SCHED_COUNT + idx];
2865
2866         *w = (*w & htole16(0xf000)) | htole16(1);
2867         bus_dmamap_sync(sc->sched_dma.tag, sc->sched_dma.map,
2868             BUS_DMASYNC_PREWRITE);
2869         if (idx < IWN_SCHED_WINSZ) {
2870                 *(w + IWN_TX_RING_COUNT) = *w;
2871                 bus_dmamap_sync(sc->sched_dma.tag, sc->sched_dma.map,
2872                     BUS_DMASYNC_PREWRITE);
2873         }
2874 }
2875 #endif
2876
2877 static uint8_t
2878 iwn_plcp_signal(int rate) {
2879         int i;
2880
2881         for (i = 0; i < IWN_RIDX_MAX + 1; i++) {
2882                 if (rate == iwn_rates[i].rate)
2883                         return i;
2884         }
2885
2886         return 0;
2887 }
2888
2889 static int
2890 iwn_tx_data(struct iwn_softc *sc, struct mbuf *m, struct ieee80211_node *ni,
2891     struct iwn_tx_ring *ring)
2892 {
2893         const struct iwn_hal *hal = sc->sc_hal;
2894         const struct ieee80211_txparam *tp;
2895         const struct iwn_rate *rinfo;
2896         struct ieee80211vap *vap = ni->ni_vap;
2897         struct ieee80211com *ic = ni->ni_ic;
2898         struct iwn_node *wn = (void *)ni;
2899         struct iwn_tx_desc *desc;
2900         struct iwn_tx_data *data;
2901         struct iwn_tx_cmd *cmd;
2902         struct iwn_cmd_data *tx;
2903         struct ieee80211_frame *wh;
2904         struct ieee80211_key *k = NULL;
2905         struct mbuf *mnew;
2906         bus_dma_segment_t segs[IWN_MAX_SCATTER];
2907         uint32_t flags;
2908         u_int hdrlen;
2909         int totlen, error, pad, nsegs = 0, i, rate;
2910         uint8_t ridx, type, txant;
2911
2912         wh = mtod(m, struct ieee80211_frame *);
2913         hdrlen = ieee80211_anyhdrsize(wh);
2914         type = wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK;
2915
2916         desc = &ring->desc[ring->cur];
2917         data = &ring->data[ring->cur];
2918
2919         /* Choose a TX rate index. */
2920         tp = &vap->iv_txparms[ieee80211_chan2mode(ni->ni_chan)];
2921         if (type == IEEE80211_FC0_TYPE_MGT)
2922                 rate = tp->mgmtrate;
2923         else if (IEEE80211_IS_MULTICAST(wh->i_addr1))
2924                 rate = tp->mcastrate;
2925         else if (tp->ucastrate != IEEE80211_FIXED_RATE_NONE)
2926                 rate = tp->ucastrate;
2927         else {
2928                 /* XXX pass pktlen */
2929                 ieee80211_ratectl_rate(ni, NULL, 0);
2930
2931                 rate = ni->ni_txrate;
2932         }
2933         ridx = iwn_plcp_signal(rate);
2934         rinfo = &iwn_rates[ridx];
2935
2936         /* Encrypt the frame if need be. */
2937         if (wh->i_fc[1] & IEEE80211_FC1_WEP) {
2938                 k = ieee80211_crypto_encap(ni, m);
2939                 if (k == NULL) {
2940                         m_freem(m);
2941                         return ENOBUFS;
2942                 }
2943                 /* Packet header may have moved, reset our local pointer. */
2944                 wh = mtod(m, struct ieee80211_frame *);
2945         }
2946         totlen = m->m_pkthdr.len;
2947
2948         if (ieee80211_radiotap_active_vap(vap)) {
2949                 struct iwn_tx_radiotap_header *tap = &sc->sc_txtap;
2950
2951                 tap->wt_flags = 0;
2952                 tap->wt_rate = rinfo->rate;
2953                 if (k != NULL)
2954                         tap->wt_flags |= IEEE80211_RADIOTAP_F_WEP;
2955
2956                 ieee80211_radiotap_tx(vap, m);
2957         }
2958
2959         /* Prepare TX firmware command. */
2960         cmd = &ring->cmd[ring->cur];
2961         cmd->code = IWN_CMD_TX_DATA;
2962         cmd->flags = 0;
2963         cmd->qid = ring->qid;
2964         cmd->idx = ring->cur;
2965
2966         tx = (struct iwn_cmd_data *)cmd->data;
2967         /* NB: No need to clear tx, all fields are reinitialized here. */
2968         tx->scratch = 0;        /* clear "scratch" area */
2969
2970         flags = 0;
2971         if (!IEEE80211_IS_MULTICAST(wh->i_addr1))
2972                 flags |= IWN_TX_NEED_ACK;
2973         if ((wh->i_fc[0] &
2974             (IEEE80211_FC0_TYPE_MASK | IEEE80211_FC0_SUBTYPE_MASK)) ==
2975             (IEEE80211_FC0_TYPE_CTL | IEEE80211_FC0_SUBTYPE_BAR))
2976                 flags |= IWN_TX_IMM_BA;         /* Cannot happen yet. */
2977
2978         if (wh->i_fc[1] & IEEE80211_FC1_MORE_FRAG)
2979                 flags |= IWN_TX_MORE_FRAG;      /* Cannot happen yet. */
2980
2981         /* Check if frame must be protected using RTS/CTS or CTS-to-self. */
2982         if (!IEEE80211_IS_MULTICAST(wh->i_addr1)) {
2983                 /* NB: Group frames are sent using CCK in 802.11b/g. */
2984                 if (totlen + IEEE80211_CRC_LEN > vap->iv_rtsthreshold) {
2985                         flags |= IWN_TX_NEED_RTS;
2986                 } else if ((ic->ic_flags & IEEE80211_F_USEPROT) &&
2987                     ridx >= IWN_RIDX_OFDM6) {
2988                         if (ic->ic_protmode == IEEE80211_PROT_CTSONLY)
2989                                 flags |= IWN_TX_NEED_CTS;
2990                         else if (ic->ic_protmode == IEEE80211_PROT_RTSCTS)
2991                                 flags |= IWN_TX_NEED_RTS;
2992                 }
2993                 if (flags & (IWN_TX_NEED_RTS | IWN_TX_NEED_CTS)) {
2994                         if (sc->hw_type != IWN_HW_REV_TYPE_4965) {
2995                                 /* 5000 autoselects RTS/CTS or CTS-to-self. */
2996                                 flags &= ~(IWN_TX_NEED_RTS | IWN_TX_NEED_CTS);
2997                                 flags |= IWN_TX_NEED_PROTECTION;
2998                         } else
2999                                 flags |= IWN_TX_FULL_TXOP;
3000                 }
3001         }
3002
3003         if (IEEE80211_IS_MULTICAST(wh->i_addr1) ||
3004             type != IEEE80211_FC0_TYPE_DATA)
3005                 tx->id = hal->broadcast_id;
3006         else
3007                 tx->id = wn->id;
3008
3009         if (type == IEEE80211_FC0_TYPE_MGT) {
3010                 uint8_t subtype = wh->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK;
3011
3012                 /* Tell HW to set timestamp in probe responses. */
3013                 if (subtype == IEEE80211_FC0_SUBTYPE_PROBE_RESP)
3014                         flags |= IWN_TX_INSERT_TSTAMP;
3015
3016                 if (subtype == IEEE80211_FC0_SUBTYPE_ASSOC_REQ ||
3017                     subtype == IEEE80211_FC0_SUBTYPE_REASSOC_REQ)
3018                         tx->timeout = htole16(3);
3019                 else
3020                         tx->timeout = htole16(2);
3021         } else
3022                 tx->timeout = htole16(0);
3023
3024         if (hdrlen & 3) {
3025                 /* First segment length must be a multiple of 4. */
3026                 flags |= IWN_TX_NEED_PADDING;
3027                 pad = 4 - (hdrlen & 3);
3028         } else
3029                 pad = 0;
3030
3031         tx->len = htole16(totlen);
3032         tx->tid = 0;
3033         tx->rts_ntries = 60;
3034         tx->data_ntries = 15;
3035         tx->lifetime = htole32(IWN_LIFETIME_INFINITE);
3036         tx->plcp = rinfo->plcp;
3037         tx->rflags = rinfo->flags;
3038         if (tx->id == hal->broadcast_id) {
3039                 /* Group or management frame. */
3040                 tx->linkq = 0;
3041                 /* XXX Alternate between antenna A and B? */
3042                 txant = IWN_LSB(sc->txchainmask);
3043                 tx->rflags |= IWN_RFLAG_ANT(txant);
3044         } else {
3045                 tx->linkq = IWN_RIDX_OFDM54 - ridx;
3046                 flags |= IWN_TX_LINKQ;  /* enable MRR */
3047         }
3048
3049         /* Set physical address of "scratch area". */
3050         tx->loaddr = htole32(IWN_LOADDR(data->scratch_paddr));
3051         tx->hiaddr = IWN_HIADDR(data->scratch_paddr);
3052
3053         /* Copy 802.11 header in TX command. */
3054         memcpy((uint8_t *)(tx + 1), wh, hdrlen);
3055
3056         /* Trim 802.11 header. */
3057         m_adj(m, hdrlen);
3058         tx->security = 0;
3059         tx->flags = htole32(flags);
3060
3061         if (m->m_len > 0) {
3062                 error = bus_dmamap_load_mbuf_segment(ring->data_dmat, data->map,
3063                     m, segs, IWN_MAX_SCATTER - 1, &nsegs, BUS_DMA_NOWAIT);
3064                 if (error == EFBIG) {
3065                         /* too many fragments, linearize */
3066                         mnew = m_defrag(m, MB_DONTWAIT);
3067                         if (mnew == NULL) {
3068                                 device_printf(sc->sc_dev,
3069                                     "%s: could not defrag mbuf\n", __func__);
3070                                 m_freem(m);
3071                                 return ENOBUFS;
3072                         }
3073                         m = mnew;
3074                         error = bus_dmamap_load_mbuf_segment(ring->data_dmat,
3075                             data->map, m, segs, IWN_MAX_SCATTER - 1, &nsegs, BUS_DMA_NOWAIT);
3076                 }
3077                 if (error != 0) {
3078                         device_printf(sc->sc_dev,
3079                             "%s: bus_dmamap_load_mbuf_segment failed, error %d\n",
3080                             __func__, error);
3081                         m_freem(m);
3082                         return error;
3083                 }
3084         }
3085
3086         data->m = m;
3087         data->ni = ni;
3088
3089         DPRINTF(sc, IWN_DEBUG_XMIT, "%s: qid %d idx %d len %d nsegs %d\n",
3090             __func__, ring->qid, ring->cur, m->m_pkthdr.len, nsegs);
3091
3092         /* Fill TX descriptor. */
3093         desc->nsegs = 1 + nsegs;
3094         /* First DMA segment is used by the TX command. */
3095         desc->segs[0].addr = htole32(IWN_LOADDR(data->cmd_paddr));
3096         desc->segs[0].len  = htole16(IWN_HIADDR(data->cmd_paddr) |
3097             (4 + sizeof (*tx) + hdrlen + pad) << 4);
3098         /* Other DMA segments are for data payload. */
3099         for (i = 1; i <= nsegs; i++) {
3100                 desc->segs[i].addr = htole32(IWN_LOADDR(segs[i - 1].ds_addr));
3101                 desc->segs[i].len  = htole16(IWN_HIADDR(segs[i - 1].ds_addr) |
3102                     segs[i - 1].ds_len << 4);
3103         }
3104
3105         bus_dmamap_sync(ring->data_dmat, data->map, BUS_DMASYNC_PREWRITE);
3106         bus_dmamap_sync(ring->data_dmat, ring->cmd_dma.map,
3107             BUS_DMASYNC_PREWRITE);
3108         bus_dmamap_sync(ring->desc_dma.tag, ring->desc_dma.map,
3109             BUS_DMASYNC_PREWRITE);
3110
3111 #ifdef notyet
3112         /* Update TX scheduler. */
3113         hal->update_sched(sc, ring->qid, ring->cur, tx->id, totlen);
3114 #endif
3115
3116         /* Kick TX ring. */
3117         ring->cur = (ring->cur + 1) % IWN_TX_RING_COUNT;
3118         IWN_WRITE(sc, IWN_HBUS_TARG_WRPTR, ring->qid << 8 | ring->cur);
3119
3120         /* Mark TX ring as full if we reach a certain threshold. */
3121         if (++ring->queued > IWN_TX_RING_HIMARK)
3122                 sc->qfullmsk |= 1 << ring->qid;
3123
3124         return 0;
3125 }
3126
3127 static int
3128 iwn_tx_data_raw(struct iwn_softc *sc, struct mbuf *m,
3129     struct ieee80211_node *ni, struct iwn_tx_ring *ring,
3130     const struct ieee80211_bpf_params *params)
3131 {
3132         const struct iwn_hal *hal = sc->sc_hal;
3133         const struct iwn_rate *rinfo;
3134         struct ifnet *ifp = sc->sc_ifp;
3135         struct ieee80211vap *vap = ni->ni_vap;
3136         struct ieee80211com *ic = ifp->if_l2com;
3137         struct iwn_tx_cmd *cmd;
3138         struct iwn_cmd_data *tx;
3139         struct ieee80211_frame *wh;
3140         struct iwn_tx_desc *desc;
3141         struct iwn_tx_data *data;
3142         struct mbuf *mnew;
3143         bus_addr_t paddr;
3144         bus_dma_segment_t segs[IWN_MAX_SCATTER];
3145         uint32_t flags;
3146         u_int hdrlen;
3147         int totlen, error, pad, nsegs = 0, i, rate;
3148         uint8_t ridx, type, txant;
3149
3150         wh = mtod(m, struct ieee80211_frame *);
3151         hdrlen = ieee80211_anyhdrsize(wh);
3152         type = wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK;
3153
3154         desc = &ring->desc[ring->cur];
3155         data = &ring->data[ring->cur];
3156
3157         /* Choose a TX rate index. */
3158         rate = params->ibp_rate0;
3159         if (!ieee80211_isratevalid(ic->ic_rt, rate)) {
3160                 /* XXX fall back to mcast/mgmt rate? */
3161                 m_freem(m);
3162                 return EINVAL;
3163         }
3164         ridx = iwn_plcp_signal(rate);
3165         rinfo = &iwn_rates[ridx];
3166
3167         totlen = m->m_pkthdr.len;
3168
3169         /* Prepare TX firmware command. */
3170         cmd = &ring->cmd[ring->cur];
3171         cmd->code = IWN_CMD_TX_DATA;
3172         cmd->flags = 0;
3173         cmd->qid = ring->qid;
3174         cmd->idx = ring->cur;
3175
3176         tx = (struct iwn_cmd_data *)cmd->data;
3177         /* NB: No need to clear tx, all fields are reinitialized here. */
3178         tx->scratch = 0;        /* clear "scratch" area */
3179
3180         flags = 0;
3181         if ((params->ibp_flags & IEEE80211_BPF_NOACK) == 0)
3182                 flags |= IWN_TX_NEED_ACK;
3183         if (params->ibp_flags & IEEE80211_BPF_RTS) {
3184                 if (sc->hw_type != IWN_HW_REV_TYPE_4965) {
3185                         /* 5000 autoselects RTS/CTS or CTS-to-self. */
3186                         flags &= ~IWN_TX_NEED_RTS;
3187                         flags |= IWN_TX_NEED_PROTECTION;
3188                 } else
3189                         flags |= IWN_TX_NEED_RTS | IWN_TX_FULL_TXOP;
3190         }
3191         if (params->ibp_flags & IEEE80211_BPF_CTS) {
3192                 if (sc->hw_type != IWN_HW_REV_TYPE_4965) {
3193                         /* 5000 autoselects RTS/CTS or CTS-to-self. */
3194                         flags &= ~IWN_TX_NEED_CTS;
3195                         flags |= IWN_TX_NEED_PROTECTION;
3196                 } else
3197                         flags |= IWN_TX_NEED_CTS | IWN_TX_FULL_TXOP;
3198         }
3199         if (type == IEEE80211_FC0_TYPE_MGT) {
3200                 uint8_t subtype = wh->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK;
3201
3202                 if (subtype == IEEE80211_FC0_SUBTYPE_PROBE_RESP)
3203                         flags |= IWN_TX_INSERT_TSTAMP;
3204
3205                 if (subtype == IEEE80211_FC0_SUBTYPE_ASSOC_REQ ||
3206                     subtype == IEEE80211_FC0_SUBTYPE_REASSOC_REQ)
3207                         tx->timeout = htole16(3);
3208                 else
3209                         tx->timeout = htole16(2);
3210         } else
3211                 tx->timeout = htole16(0);
3212
3213         if (hdrlen & 3) {
3214                 /* First segment length must be a multiple of 4. */
3215                 flags |= IWN_TX_NEED_PADDING;
3216                 pad = 4 - (hdrlen & 3);
3217         } else
3218                 pad = 0;
3219
3220         if (ieee80211_radiotap_active_vap(vap)) {
3221                 struct iwn_tx_radiotap_header *tap = &sc->sc_txtap;
3222
3223                 tap->wt_flags = 0;
3224                 tap->wt_rate = rate;
3225
3226                 ieee80211_radiotap_tx(vap, m);
3227         }
3228
3229         tx->len = htole16(totlen);
3230         tx->tid = 0;
3231         tx->id = hal->broadcast_id;
3232         tx->rts_ntries = params->ibp_try1;
3233         tx->data_ntries = params->ibp_try0;
3234         tx->lifetime = htole32(IWN_LIFETIME_INFINITE);
3235         tx->plcp = rinfo->plcp;
3236         tx->rflags = rinfo->flags;
3237         /* Group or management frame. */
3238         tx->linkq = 0;
3239         txant = IWN_LSB(sc->txchainmask);
3240         tx->rflags |= IWN_RFLAG_ANT(txant);
3241         /* Set physical address of "scratch area". */
3242         paddr = ring->cmd_dma.paddr + ring->cur * sizeof (struct iwn_tx_cmd);
3243         tx->loaddr = htole32(IWN_LOADDR(paddr));
3244         tx->hiaddr = IWN_HIADDR(paddr);
3245
3246         /* Copy 802.11 header in TX command. */
3247         memcpy((uint8_t *)(tx + 1), wh, hdrlen);
3248
3249         /* Trim 802.11 header. */
3250         m_adj(m, hdrlen);
3251         tx->security = 0;
3252         tx->flags = htole32(flags);
3253
3254         if (m->m_len > 0) {
3255                 error = bus_dmamap_load_mbuf_segment(ring->data_dmat, data->map,
3256                     m, segs, IWN_MAX_SCATTER - 1, &nsegs, BUS_DMA_NOWAIT);
3257                 if (error == EFBIG) {
3258                         /* Too many fragments, linearize. */
3259                         mnew = m_defrag(m, MB_DONTWAIT);
3260                         if (mnew == NULL) {
3261                                 device_printf(sc->sc_dev,
3262                                     "%s: could not defrag mbuf\n", __func__);
3263                                 m_freem(m);
3264                                 return ENOBUFS;
3265                         }
3266                         m = mnew;
3267                         error = bus_dmamap_load_mbuf_segment(ring->data_dmat,
3268                             data->map, m, segs, IWN_MAX_SCATTER - 1, &nsegs, BUS_DMA_NOWAIT);
3269                 }
3270                 if (error != 0) {
3271                         device_printf(sc->sc_dev,
3272                             "%s: bus_dmamap_load_mbuf_segment failed, error %d\n",
3273                             __func__, error);
3274                         m_freem(m);
3275                         return error;
3276                 }
3277         }
3278
3279         data->m = m;
3280         data->ni = ni;
3281
3282         DPRINTF(sc, IWN_DEBUG_XMIT, "%s: qid %d idx %d len %d nsegs %d\n",
3283             __func__, ring->qid, ring->cur, m->m_pkthdr.len, nsegs);
3284
3285         /* Fill TX descriptor. */
3286         desc->nsegs = 1 + nsegs;
3287         /* First DMA segment is used by the TX command. */
3288         desc->segs[0].addr = htole32(IWN_LOADDR(data->cmd_paddr));
3289         desc->segs[0].len  = htole16(IWN_HIADDR(data->cmd_paddr) |
3290             (4 + sizeof (*tx) + hdrlen + pad) << 4);
3291         /* Other DMA segments are for data payload. */
3292         for (i = 1; i <= nsegs; i++) {
3293                 desc->segs[i].addr = htole32(IWN_LOADDR(segs[i - 1].ds_addr));
3294                 desc->segs[i].len  = htole16(IWN_HIADDR(segs[i - 1].ds_addr) |
3295                     segs[i - 1].ds_len << 4);
3296         }
3297
3298         bus_dmamap_sync(ring->data_dmat, data->map, BUS_DMASYNC_PREWRITE);
3299         bus_dmamap_sync(ring->data_dmat, ring->cmd_dma.map,
3300             BUS_DMASYNC_PREWRITE);
3301         bus_dmamap_sync(ring->desc_dma.tag, ring->desc_dma.map,
3302             BUS_DMASYNC_PREWRITE);
3303
3304 #ifdef notyet
3305         /* Update TX scheduler. */
3306         hal->update_sched(sc, ring->qid, ring->cur, tx->id, totlen);
3307 #endif
3308
3309         /* Kick TX ring. */
3310         ring->cur = (ring->cur + 1) % IWN_TX_RING_COUNT;
3311         IWN_WRITE(sc, IWN_HBUS_TARG_WRPTR, ring->qid << 8 | ring->cur);
3312
3313         /* Mark TX ring as full if we reach a certain threshold. */
3314         if (++ring->queued > IWN_TX_RING_HIMARK)
3315                 sc->qfullmsk |= 1 << ring->qid;
3316
3317         return 0;
3318 }
3319
3320 static int
3321 iwn_raw_xmit(struct ieee80211_node *ni, struct mbuf *m,
3322         const struct ieee80211_bpf_params *params)
3323 {
3324         struct ieee80211com *ic = ni->ni_ic;
3325         struct ifnet *ifp = ic->ic_ifp;
3326         struct iwn_softc *sc = ifp->if_softc;
3327         struct iwn_tx_ring *txq;
3328         int error = 0;
3329
3330         if ((ifp->if_flags & IFF_RUNNING) == 0) {
3331                 ieee80211_free_node(ni);
3332                 m_freem(m);
3333                 return ENETDOWN;
3334         }
3335
3336         if (params == NULL)
3337                 txq = &sc->txq[M_WME_GETAC(m)];
3338         else
3339                 txq = &sc->txq[params->ibp_pri & 3];
3340
3341         if (params == NULL) {
3342                 /*
3343                  * Legacy path; interpret frame contents to decide
3344                  * precisely how to send the frame.
3345                  */
3346                 error = iwn_tx_data(sc, m, ni, txq);
3347         } else {
3348                 /*
3349                  * Caller supplied explicit parameters to use in
3350                  * sending the frame.
3351                  */
3352                 error = iwn_tx_data_raw(sc, m, ni, txq, params);
3353         }
3354         if (error != 0) {
3355                 /* NB: m is reclaimed on tx failure */
3356                 ieee80211_free_node(ni);
3357                 ifp->if_oerrors++;
3358         }
3359         return error;
3360 }
3361
3362 static void
3363 iwn_start(struct ifnet *ifp)
3364 {
3365         iwn_start_locked(ifp);
3366 }
3367
3368 static void
3369 iwn_start_locked(struct ifnet *ifp)
3370 {
3371         struct iwn_softc *sc = ifp->if_softc;
3372         struct ieee80211_node *ni;
3373         struct iwn_tx_ring *txq;
3374         struct mbuf *m;
3375         int pri;
3376
3377         wlan_assert_serialized();
3378
3379         for (;;) {
3380                 if (sc->qfullmsk != 0) {
3381                         ifp->if_flags |= IFF_OACTIVE;
3382                         break;
3383                 }
3384                 m = ifq_dequeue(&ifp->if_snd, NULL);
3385                 if (m == NULL)
3386                         break;
3387                 KKASSERT(M_TRAILINGSPACE(m) >= 0);
3388                 ni = (struct ieee80211_node *)m->m_pkthdr.rcvif;
3389                 pri = M_WME_GETAC(m);
3390                 txq = &sc->txq[pri];
3391                 if (iwn_tx_data(sc, m, ni, txq) != 0) {
3392                         ifp->if_oerrors++;
3393                         ieee80211_free_node(ni);
3394                         break;
3395                 }
3396                 sc->sc_tx_timer = 5;
3397         }
3398 }
3399
3400 static void
3401 iwn_watchdog(struct iwn_softc *sc)
3402 {
3403         if (sc->sc_tx_timer > 0 && --sc->sc_tx_timer == 0) {
3404                 struct ifnet *ifp = sc->sc_ifp;
3405                 struct ieee80211com *ic = ifp->if_l2com;
3406
3407                 if_printf(ifp, "device timeout\n");
3408                 ieee80211_runtask(ic, &sc->sc_reinit_task);
3409         }
3410 }
3411
3412 static int
3413 iwn_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data, struct ucred *ucred)
3414 {
3415         struct iwn_softc *sc = ifp->if_softc;
3416         struct ieee80211com *ic = ifp->if_l2com;
3417         struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps);
3418         struct ifreq *ifr = (struct ifreq *) data;
3419         int error = 0, startall = 0, stop = 0;
3420
3421         wlan_assert_serialized();
3422
3423         switch (cmd) {
3424         case SIOCSIFFLAGS:
3425                 if (ifp->if_flags & IFF_UP) {
3426                         if (!(ifp->if_flags & IFF_RUNNING)) {
3427                                 iwn_init_locked(sc);
3428                                 if (IWN_READ(sc, IWN_GP_CNTRL) & IWN_GP_CNTRL_RFKILL)
3429                                         startall = 1;
3430                                 else
3431                                         stop = 1;
3432                         }
3433                 } else {
3434                         if (ifp->if_flags & IFF_RUNNING)
3435                                 iwn_stop_locked(sc);
3436                 }
3437                 if (startall)
3438                         ieee80211_start_all(ic);
3439                 else if (vap != NULL && stop)
3440                         ieee80211_stop(vap);
3441                 break;
3442         case SIOCGIFMEDIA:
3443                 error = ifmedia_ioctl(ifp, ifr, &ic->ic_media, cmd);
3444                 break;
3445         case SIOCGIFADDR:
3446                 error = ether_ioctl(ifp, cmd, data);
3447                 break;
3448         default:
3449                 error = EINVAL;
3450                 break;
3451         }
3452         return error;
3453 }
3454
3455 /*
3456  * Send a command to the firmware.
3457  */
3458 static int
3459 iwn_cmd(struct iwn_softc *sc, int code, const void *buf, int size, int async)
3460 {
3461         struct iwn_tx_ring *ring = &sc->txq[4];
3462         struct iwn_tx_desc *desc;
3463         struct iwn_tx_data *data;
3464         struct iwn_tx_cmd *cmd;
3465         struct mbuf *m;
3466         bus_addr_t paddr;
3467         int totlen, error;
3468
3469         desc = &ring->desc[ring->cur];
3470         data = &ring->data[ring->cur];
3471         totlen = 4 + size;
3472
3473         if (size > sizeof cmd->data) {
3474                 /* Command is too large to fit in a descriptor. */
3475                 if (totlen > MJUMPAGESIZE)
3476                         return EINVAL;
3477                 m = m_getjcl(MB_DONTWAIT, MT_DATA, M_PKTHDR, MJUMPAGESIZE);
3478                 if (m == NULL)
3479                         return ENOMEM;
3480                 cmd = mtod(m, struct iwn_tx_cmd *);
3481                 error = bus_dmamap_load(ring->data_dmat, data->map, cmd,
3482                     totlen, iwn_dma_map_addr, &paddr, BUS_DMA_NOWAIT);
3483                 if (error != 0) {
3484                         m_freem(m);
3485                         return error;
3486                 }
3487                 data->m = m;
3488         } else {
3489                 cmd = &ring->cmd[ring->cur];
3490                 paddr = data->cmd_paddr;
3491         }
3492
3493         cmd->code = code;
3494         cmd->flags = 0;
3495         cmd->qid = ring->qid;
3496         cmd->idx = ring->cur;
3497         memcpy(cmd->data, buf, size);
3498
3499         desc->nsegs = 1;
3500         desc->segs[0].addr = htole32(IWN_LOADDR(paddr));
3501         desc->segs[0].len  = htole16(IWN_HIADDR(paddr) | totlen << 4);
3502
3503         DPRINTF(sc, IWN_DEBUG_CMD, "%s: %s (0x%x) flags %d qid %d idx %d\n",
3504             __func__, iwn_intr_str(cmd->code), cmd->code,
3505             cmd->flags, cmd->qid, cmd->idx);
3506
3507         if (size > sizeof cmd->data) {
3508                 bus_dmamap_sync(ring->data_dmat, data->map,
3509                     BUS_DMASYNC_PREWRITE);
3510         } else {
3511                 bus_dmamap_sync(ring->data_dmat, ring->cmd_dma.map,
3512                     BUS_DMASYNC_PREWRITE);
3513         }
3514         bus_dmamap_sync(ring->desc_dma.tag, ring->desc_dma.map,
3515             BUS_DMASYNC_PREWRITE);
3516
3517 #ifdef notyet
3518         /* Update TX scheduler. */
3519         sc->sc_hal->update_sched(sc, ring->qid, ring->cur, 0, 0);
3520 #endif
3521
3522         /* Kick command ring. */
3523         ring->cur = (ring->cur + 1) % IWN_TX_RING_COUNT;
3524         IWN_WRITE(sc, IWN_HBUS_TARG_WRPTR, ring->qid << 8 | ring->cur);
3525
3526         if (async)
3527                 error = 0;
3528         else
3529                 error = zsleep(desc, &wlan_global_serializer, 0, "iwncmd", hz);
3530         return error;
3531 }
3532
3533 static int
3534 iwn4965_add_node(struct iwn_softc *sc, struct iwn_node_info *node, int async)
3535 {
3536         struct iwn4965_node_info hnode;
3537         caddr_t src, dst;
3538
3539         /*
3540          * We use the node structure for 5000 Series internally (it is
3541          * a superset of the one for 4965AGN). We thus copy the common
3542          * fields before sending the command.
3543          */
3544         src = (caddr_t)node;
3545         dst = (caddr_t)&hnode;
3546         memcpy(dst, src, 48);
3547         /* Skip TSC, RX MIC and TX MIC fields from ``src''. */
3548         memcpy(dst + 48, src + 72, 20);
3549         return iwn_cmd(sc, IWN_CMD_ADD_NODE, &hnode, sizeof hnode, async);
3550 }
3551
3552 static int
3553 iwn5000_add_node(struct iwn_softc *sc, struct iwn_node_info *node, int async)
3554 {
3555         /* Direct mapping. */
3556         return iwn_cmd(sc, IWN_CMD_ADD_NODE, node, sizeof (*node), async);
3557 }
3558
3559 #if 0   /* HT */
3560 static const uint8_t iwn_ridx_to_plcp[] = {
3561         10, 20, 55, 110, /* CCK */
3562         0xd, 0xf, 0x5, 0x7, 0x9, 0xb, 0x1, 0x3, 0x3 /* OFDM R1-R4 */
3563 };
3564 static const uint8_t iwn_siso_mcs_to_plcp[] = {
3565         0, 0, 0, 0,                     /* CCK */
3566         0, 0, 1, 2, 3, 4, 5, 6, 7       /* HT */
3567 };
3568 static const uint8_t iwn_mimo_mcs_to_plcp[] = {
3569         0, 0, 0, 0,                     /* CCK */
3570         8, 8, 9, 10, 11, 12, 13, 14, 15 /* HT */
3571 };
3572 #endif
3573 static const uint8_t iwn_prev_ridx[] = {
3574         /* NB: allow fallback from CCK11 to OFDM9 and from OFDM6 to CCK5 */
3575         0, 0, 1, 5,                     /* CCK */
3576         2, 4, 3, 6, 7, 8, 9, 10, 10     /* OFDM */
3577 };
3578
3579 /*
3580  * Configure hardware link parameters for the specified
3581  * node operating on the specified channel.
3582  */
3583 static int
3584 iwn_set_link_quality(struct iwn_softc *sc, uint8_t id, int async)
3585 {
3586         struct ifnet *ifp = sc->sc_ifp;
3587         struct ieee80211com *ic = ifp->if_l2com;
3588         struct iwn_cmd_link_quality linkq;
3589         const struct iwn_rate *rinfo;
3590         int i;
3591         uint8_t txant, ridx;
3592
3593         /* Use the first valid TX antenna. */
3594         txant = IWN_LSB(sc->txchainmask);
3595
3596         memset(&linkq, 0, sizeof linkq);
3597         linkq.id = id;
3598         linkq.antmsk_1stream = txant;
3599         linkq.antmsk_2stream = IWN_ANT_AB;
3600         linkq.ampdu_max = 31;
3601         linkq.ampdu_threshold = 3;
3602         linkq.ampdu_limit = htole16(4000);      /* 4ms */
3603
3604 #if 0   /* HT */
3605         if (IEEE80211_IS_CHAN_HT(c))
3606                 linkq.mimo = 1;
3607 #endif
3608
3609         if (id == IWN_ID_BSS)
3610                 ridx = IWN_RIDX_OFDM54;
3611         else if (IEEE80211_IS_CHAN_A(ic->ic_curchan))
3612                 ridx = IWN_RIDX_OFDM6;
3613         else
3614                 ridx = IWN_RIDX_CCK1;
3615
3616         for (i = 0; i < IWN_MAX_TX_RETRIES; i++) {
3617                 rinfo = &iwn_rates[ridx];
3618 #if 0   /* HT */
3619                 if (IEEE80211_IS_CHAN_HT40(c)) {
3620                         linkq.retry[i].plcp = iwn_mimo_mcs_to_plcp[ridx]
3621                                          | IWN_RIDX_MCS;
3622                         linkq.retry[i].rflags = IWN_RFLAG_HT
3623                                          | IWN_RFLAG_HT40;
3624                         /* XXX shortGI */
3625                 } else if (IEEE80211_IS_CHAN_HT(c)) {
3626                         linkq.retry[i].plcp = iwn_siso_mcs_to_plcp[ridx]
3627                                          | IWN_RIDX_MCS;
3628                         linkq.retry[i].rflags = IWN_RFLAG_HT;
3629                         /* XXX shortGI */
3630                 } else
3631 #endif
3632                 {
3633                         linkq.retry[i].plcp = rinfo->plcp;
3634                         linkq.retry[i].rflags = rinfo->flags;
3635                 }
3636                 linkq.retry[i].rflags |= IWN_RFLAG_ANT(txant);
3637                 ridx = iwn_prev_ridx[ridx];
3638         }
3639 #ifdef IWN_DEBUG
3640         if (sc->sc_debug & IWN_DEBUG_STATE) {
3641                 kprintf("%s: set link quality for node %d, mimo %d ssmask %d\n",
3642                     __func__, id, linkq.mimo, linkq.antmsk_1stream);
3643                 kprintf("%s:", __func__);
3644                 for (i = 0; i < IWN_MAX_TX_RETRIES; i++)
3645                         kprintf(" %d:%x", linkq.retry[i].plcp,
3646                             linkq.retry[i].rflags);
3647                 kprintf("\n");
3648         }
3649 #endif
3650         return iwn_cmd(sc, IWN_CMD_LINK_QUALITY, &linkq, sizeof linkq, async);
3651 }
3652
3653 /*
3654  * Broadcast node is used to send group-addressed and management frames.
3655  */
3656 static int
3657 iwn_add_broadcast_node(struct iwn_softc *sc, int async)
3658 {
3659         const struct iwn_hal *hal = sc->sc_hal;
3660         struct ifnet *ifp = sc->sc_ifp;
3661         struct iwn_node_info node;
3662         int error;
3663
3664         memset(&node, 0, sizeof node);
3665         IEEE80211_ADDR_COPY(node.macaddr, ifp->if_broadcastaddr);
3666         node.id = hal->broadcast_id;
3667         DPRINTF(sc, IWN_DEBUG_RESET, "%s: adding broadcast node\n", __func__);
3668         error = hal->add_node(sc, &node, async);
3669         if (error != 0)
3670                 return error;
3671
3672         error = iwn_set_link_quality(sc, hal->broadcast_id, async);
3673         return error;
3674 }
3675
3676 static int
3677 iwn_wme_update(struct ieee80211com *ic)
3678 {
3679 #define IWN_EXP2(x)     ((1 << (x)) - 1)        /* CWmin = 2^ECWmin - 1 */
3680 #define IWN_TXOP_TO_US(v)               (v<<5)
3681         struct iwn_softc *sc = ic->ic_ifp->if_softc;
3682         struct iwn_edca_params cmd;
3683         int i;
3684
3685         memset(&cmd, 0, sizeof cmd);
3686         cmd.flags = htole32(IWN_EDCA_UPDATE);
3687         for (i = 0; i < WME_NUM_AC; i++) {
3688                 const struct wmeParams *wmep =
3689                     &ic->ic_wme.wme_chanParams.cap_wmeParams[i];
3690                 cmd.ac[i].aifsn = wmep->wmep_aifsn;
3691                 cmd.ac[i].cwmin = htole16(IWN_EXP2(wmep->wmep_logcwmin));
3692                 cmd.ac[i].cwmax = htole16(IWN_EXP2(wmep->wmep_logcwmax));
3693                 cmd.ac[i].txoplimit =
3694                     htole16(IWN_TXOP_TO_US(wmep->wmep_txopLimit));
3695         }
3696         (void) iwn_cmd(sc, IWN_CMD_EDCA_PARAMS, &cmd, sizeof cmd, 1 /*async*/);
3697         return 0;
3698 #undef IWN_TXOP_TO_US
3699 #undef IWN_EXP2
3700 }
3701
3702 static void
3703 iwn_update_mcast(struct ifnet *ifp)
3704 {
3705         /* Ignore */
3706 }
3707
3708 static void
3709 iwn_set_led(struct iwn_softc *sc, uint8_t which, uint8_t off, uint8_t on)
3710 {
3711         struct iwn_cmd_led led;
3712
3713         /* Clear microcode LED ownership. */
3714         IWN_CLRBITS(sc, IWN_LED, IWN_LED_BSM_CTRL);
3715
3716         led.which = which;
3717         led.unit = htole32(10000);      /* on/off in unit of 100ms */
3718         led.off = off;
3719         led.on = on;
3720         (void)iwn_cmd(sc, IWN_CMD_SET_LED, &led, sizeof led, 1);
3721 }
3722
3723 /*
3724  * Set the critical temperature at which the firmware will stop the radio
3725  * and notify us.
3726  */
3727 static int
3728 iwn_set_critical_temp(struct iwn_softc *sc)
3729 {
3730         struct iwn_critical_temp crit;
3731         int32_t temp;
3732
3733         IWN_WRITE(sc, IWN_UCODE_GP1_CLR, IWN_UCODE_GP1_CTEMP_STOP_RF);
3734
3735         if (sc->hw_type == IWN_HW_REV_TYPE_5150)
3736                 temp = (IWN_CTOK(110) - sc->temp_off) * -5;
3737         else if (sc->hw_type == IWN_HW_REV_TYPE_4965)
3738                 temp = IWN_CTOK(110);
3739         else
3740                 temp = 110;
3741         memset(&crit, 0, sizeof crit);
3742         crit.tempR = htole32(temp);
3743         DPRINTF(sc, IWN_DEBUG_RESET, "setting critical temp to %d\n",
3744             temp);
3745         return iwn_cmd(sc, IWN_CMD_SET_CRITICAL_TEMP, &crit, sizeof crit, 0);
3746 }
3747
3748 static int
3749 iwn_set_timing(struct iwn_softc *sc, struct ieee80211_node *ni)
3750 {
3751         struct iwn_cmd_timing cmd;
3752         uint64_t val, mod;
3753
3754         memset(&cmd, 0, sizeof cmd);
3755         memcpy(&cmd.tstamp, ni->ni_tstamp.data, sizeof (uint64_t));
3756         cmd.bintval = htole16(ni->ni_intval);
3757         cmd.lintval = htole16(10);
3758
3759         /* Compute remaining time until next beacon. */
3760         val = (uint64_t)ni->ni_intval * 1024;   /* msecs -> usecs */
3761         mod = le64toh(cmd.tstamp) % val;
3762         cmd.binitval = htole32((uint32_t)(val - mod));
3763
3764         DPRINTF(sc, IWN_DEBUG_RESET, "timing bintval=%u tstamp=%ju, init=%u\n",
3765             ni->ni_intval, le64toh(cmd.tstamp), (uint32_t)(val - mod));
3766
3767         return iwn_cmd(sc, IWN_CMD_TIMING, &cmd, sizeof cmd, 1);
3768 }
3769
3770 static void
3771 iwn4965_power_calibration(struct iwn_softc *sc, int temp)
3772 {
3773         struct ifnet *ifp = sc->sc_ifp;
3774         struct ieee80211com *ic = ifp->if_l2com;
3775
3776         /* Adjust TX power if need be (delta >= 3 degC.) */
3777         DPRINTF(sc, IWN_DEBUG_CALIBRATE, "%s: temperature %d->%d\n",
3778             __func__, sc->temp, temp);
3779         if (abs(temp - sc->temp) >= 3) {
3780                 /* Record temperature of last calibration. */
3781                 sc->temp = temp;
3782                 (void)iwn4965_set_txpower(sc, ic->ic_bsschan, 1);
3783         }
3784 }
3785
3786 /*
3787  * Set TX power for current channel (each rate has its own power settings).
3788  * This function takes into account the regulatory information from EEPROM,
3789  * the current temperature and the current voltage.
3790  */
3791 static int
3792 iwn4965_set_txpower(struct iwn_softc *sc, struct ieee80211_channel *ch,
3793     int async)
3794 {
3795 /* Fixed-point arithmetic division using a n-bit fractional part. */
3796 #define fdivround(a, b, n)      \
3797         ((((1 << n) * (a)) / (b) + (1 << n) / 2) / (1 << n))
3798 /* Linear interpolation. */
3799 #define interpolate(x, x1, y1, x2, y2, n)       \
3800         ((y1) + fdivround(((int)(x) - (x1)) * ((y2) - (y1)), (x2) - (x1), n))
3801
3802         static const int tdiv[IWN_NATTEN_GROUPS] = { 9, 8, 8, 8, 6 };
3803         struct ifnet *ifp = sc->sc_ifp;
3804         struct ieee80211com *ic = ifp->if_l2com;
3805         struct iwn_ucode_info *uc = &sc->ucode_info;
3806         struct iwn4965_cmd_txpower cmd;
3807         struct iwn4965_eeprom_chan_samples *chans;
3808         int32_t vdiff, tdiff;
3809         int i, c, grp, maxpwr;
3810         const uint8_t *rf_gain, *dsp_gain;
3811         uint8_t chan;
3812
3813         /* Retrieve channel number. */
3814         chan = ieee80211_chan2ieee(ic, ch);
3815         DPRINTF(sc, IWN_DEBUG_RESET, "setting TX power for channel %d\n",
3816             chan);
3817
3818         memset(&cmd, 0, sizeof cmd);
3819         cmd.band = IEEE80211_IS_CHAN_5GHZ(ch) ? 0 : 1;
3820         cmd.chan = chan;
3821
3822         if (IEEE80211_IS_CHAN_5GHZ(ch)) {
3823                 maxpwr   = sc->maxpwr5GHz;
3824                 rf_gain  = iwn4965_rf_gain_5ghz;
3825                 dsp_gain = iwn4965_dsp_gain_5ghz;
3826         } else {
3827                 maxpwr   = sc->maxpwr2GHz;
3828                 rf_gain  = iwn4965_rf_gain_2ghz;
3829                 dsp_gain = iwn4965_dsp_gain_2ghz;
3830         }
3831
3832         /* Compute voltage compensation. */
3833         vdiff = ((int32_t)le32toh(uc->volt) - sc->eeprom_voltage) / 7;
3834         if (vdiff > 0)
3835                 vdiff *= 2;
3836         if (abs(vdiff) > 2)
3837                 vdiff = 0;
3838         DPRINTF(sc, IWN_DEBUG_CALIBRATE | IWN_DEBUG_TXPOW,
3839             "%s: voltage compensation=%d (UCODE=%d, EEPROM=%d)\n",
3840             __func__, vdiff, le32toh(uc->volt), sc->eeprom_voltage);
3841
3842         /* Get channel attenuation group. */
3843         if (chan <= 20)         /* 1-20 */
3844                 grp = 4;
3845         else if (chan <= 43)    /* 34-43 */
3846                 grp = 0;
3847         else if (chan <= 70)    /* 44-70 */
3848                 grp = 1;
3849         else if (chan <= 124)   /* 71-124 */
3850                 grp = 2;
3851         else                    /* 125-200 */
3852                 grp = 3;
3853         DPRINTF(sc, IWN_DEBUG_CALIBRATE | IWN_DEBUG_TXPOW,
3854             "%s: chan %d, attenuation group=%d\n", __func__, chan, grp);
3855
3856         /* Get channel sub-band. */
3857         for (i = 0; i < IWN_NBANDS; i++)
3858                 if (sc->bands[i].lo != 0 &&
3859                     sc->bands[i].lo <= chan && chan <= sc->bands[i].hi)
3860                         break;
3861         if (i == IWN_NBANDS)    /* Can't happen in real-life. */
3862                 return EINVAL;
3863         chans = sc->bands[i].chans;
3864         DPRINTF(sc, IWN_DEBUG_CALIBRATE | IWN_DEBUG_TXPOW,