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,
3865             "%s: chan %d sub-band=%d\n", __func__, chan, i);
3866
3867         for (c = 0; c < 2; c++) {
3868                 uint8_t power, gain, temp;
3869                 int maxchpwr, pwr, ridx, idx;
3870
3871                 power = interpolate(chan,
3872                     chans[0].num, chans[0].samples[c][1].power,
3873                     chans[1].num, chans[1].samples[c][1].power, 1);
3874                 gain  = interpolate(chan,
3875                     chans[0].num, chans[0].samples[c][1].gain,
3876                     chans[1].num, chans[1].samples[c][1].gain, 1);
3877                 temp  = interpolate(chan,
3878                     chans[0].num, chans[0].samples[c][1].temp,
3879                     chans[1].num, chans[1].samples[c][1].temp, 1);
3880                 DPRINTF(sc, IWN_DEBUG_CALIBRATE | IWN_DEBUG_TXPOW,
3881                     "%s: Tx chain %d: power=%d gain=%d temp=%d\n",
3882                     __func__, c, power, gain, temp);
3883
3884                 /* Compute temperature compensation. */
3885                 tdiff = ((sc->temp - temp) * 2) / tdiv[grp];
3886                 DPRINTF(sc, IWN_DEBUG_CALIBRATE | IWN_DEBUG_TXPOW,
3887                     "%s: temperature compensation=%d (current=%d, EEPROM=%d)\n",
3888                     __func__, tdiff, sc->temp, temp);
3889
3890                 for (ridx = 0; ridx <= IWN_RIDX_MAX; ridx++) {
3891                         /* Convert dBm to half-dBm. */
3892                         maxchpwr = sc->maxpwr[chan] * 2;
3893                         if ((ridx / 8) & 1)
3894                                 maxchpwr -= 6;  /* MIMO 2T: -3dB */
3895
3896                         pwr = maxpwr;
3897
3898                         /* Adjust TX power based on rate. */
3899                         if ((ridx % 8) == 5)
3900                                 pwr -= 15;      /* OFDM48: -7.5dB */
3901                         else if ((ridx % 8) == 6)
3902                                 pwr -= 17;      /* OFDM54: -8.5dB */
3903                         else if ((ridx % 8) == 7)
3904                                 pwr -= 20;      /* OFDM60: -10dB */
3905                         else
3906                                 pwr -= 10;      /* Others: -5dB */
3907
3908                         /* Do not exceed channel max TX power. */
3909                         if (pwr > maxchpwr)
3910                                 pwr = maxchpwr;
3911
3912                         idx = gain - (pwr - power) - tdiff - vdiff;
3913                         if ((ridx / 8) & 1)     /* MIMO */
3914                                 idx += (int32_t)le32toh(uc->atten[grp][c]);
3915
3916                         if (cmd.band == 0)
3917                                 idx += 9;       /* 5GHz */
3918                         if (ridx == IWN_RIDX_MAX)
3919                                 idx += 5;       /* CCK */
3920
3921                         /* Make sure idx stays in a valid range. */
3922                         if (idx < 0)
3923                                 idx = 0;
3924                         else if (idx > IWN4965_MAX_PWR_INDEX)
3925                                 idx = IWN4965_MAX_PWR_INDEX;
3926
3927                         DPRINTF(sc, IWN_DEBUG_CALIBRATE | IWN_DEBUG_TXPOW,
3928                             "%s: Tx chain %d, rate idx %d: power=%d\n",
3929                             __func__, c, ridx, idx);
3930                         cmd.power[ridx].rf_gain[c] = rf_gain[idx];
3931                         cmd.power[ridx].dsp_gain[c] = dsp_gain[idx];
3932                 }
3933         }
3934
3935         DPRINTF(sc, IWN_DEBUG_CALIBRATE | IWN_DEBUG_TXPOW,
3936             "%s: set tx power for chan %d\n", __func__, chan);
3937         return iwn_cmd(sc, IWN_CMD_TXPOWER, &cmd, sizeof cmd, async);
3938
3939 #undef interpolate
3940 #undef fdivround
3941 }
3942
3943 static int
3944 iwn5000_set_txpower(struct iwn_softc *sc, struct ieee80211_channel *ch,
3945     int async)
3946 {
3947         struct iwn5000_cmd_txpower cmd;
3948
3949         /*
3950          * TX power calibration is handled automatically by the firmware
3951          * for 5000 Series.
3952          */
3953         memset(&cmd, 0, sizeof cmd);
3954         cmd.global_limit = 2 * IWN5000_TXPOWER_MAX_DBM; /* 16 dBm */
3955         cmd.flags = IWN5000_TXPOWER_NO_CLOSED;
3956         cmd.srv_limit = IWN5000_TXPOWER_AUTO;
3957         DPRINTF(sc, IWN_DEBUG_CALIBRATE, "%s: setting TX power\n", __func__);
3958         return iwn_cmd(sc, IWN_CMD_TXPOWER_DBM, &cmd, sizeof cmd, async);
3959 }
3960
3961 /*
3962  * Retrieve the maximum RSSI (in dBm) among receivers.
3963  */
3964 static int
3965 iwn4965_get_rssi(struct iwn_softc *sc, struct iwn_rx_stat *stat)
3966 {
3967         struct iwn4965_rx_phystat *phy = (void *)stat->phybuf;
3968         uint8_t mask, agc;
3969         int rssi;
3970
3971         mask = (le16toh(phy->antenna) >> 4) & IWN_ANT_ABC;
3972         agc  = (le16toh(phy->agc) >> 7) & 0x7f;
3973
3974         rssi = 0;
3975 #if 0
3976         if (mask & IWN_ANT_A)   /* Ant A */
3977                 rssi = max(rssi, phy->rssi[0]);
3978         if (mask & IWN_ATH_B)   /* Ant B */
3979                 rssi = max(rssi, phy->rssi[2]);
3980         if (mask & IWN_ANT_C)   /* Ant C */
3981                 rssi = max(rssi, phy->rssi[4]);
3982 #else
3983         rssi = max(rssi, phy->rssi[0]);
3984         rssi = max(rssi, phy->rssi[2]);
3985         rssi = max(rssi, phy->rssi[4]);
3986 #endif
3987
3988         DPRINTF(sc, IWN_DEBUG_RECV, "%s: agc %d mask 0x%x rssi %d %d %d "
3989             "result %d\n", __func__, agc, mask,
3990             phy->rssi[0], phy->rssi[2], phy->rssi[4],
3991             rssi - agc - IWN_RSSI_TO_DBM);
3992         return rssi - agc - IWN_RSSI_TO_DBM;
3993 }
3994
3995 static int
3996 iwn5000_get_rssi(struct iwn_softc *sc, struct iwn_rx_stat *stat)
3997 {
3998         struct iwn5000_rx_phystat *phy = (void *)stat->phybuf;
3999         int rssi;
4000         uint8_t agc;
4001
4002         agc = (le32toh(phy->agc) >> 9) & 0x7f;
4003
4004         rssi = MAX(le16toh(phy->rssi[0]) & 0xff,
4005                    le16toh(phy->rssi[1]) & 0xff);
4006         rssi = MAX(le16toh(phy->rssi[2]) & 0xff, rssi);
4007
4008         DPRINTF(sc, IWN_DEBUG_RECV, "%s: agc %d rssi %d %d %d "
4009             "result %d\n", __func__, agc,
4010             phy->rssi[0], phy->rssi[1], phy->rssi[2],
4011             rssi - agc - IWN_RSSI_TO_DBM);
4012         return rssi - agc - IWN_RSSI_TO_DBM;
4013 }
4014
4015 /*
4016  * Retrieve the average noise (in dBm) among receivers.
4017  */
4018 static int
4019 iwn_get_noise(const struct iwn_rx_general_stats *stats)
4020 {
4021         int i, total, nbant, noise;
4022
4023         total = nbant = 0;
4024         for (i = 0; i < 3; i++) {
4025                 if ((noise = le32toh(stats->noise[i]) & 0xff) == 0)
4026                         continue;
4027                 total += noise;
4028                 nbant++;
4029         }
4030         /* There should be at least one antenna but check anyway. */
4031         return (nbant == 0) ? -127 : (total / nbant) - 107;
4032 }
4033
4034 /*
4035  * Compute temperature (in degC) from last received statistics.
4036  */
4037 static int
4038 iwn4965_get_temperature(struct iwn_softc *sc)
4039 {
4040         struct iwn_ucode_info *uc = &sc->ucode_info;
4041         int32_t r1, r2, r3, r4, temp;
4042
4043         r1 = le32toh(uc->temp[0].chan20MHz);
4044         r2 = le32toh(uc->temp[1].chan20MHz);
4045         r3 = le32toh(uc->temp[2].chan20MHz);
4046         r4 = le32toh(sc->rawtemp);
4047
4048         if (r1 == r3)   /* Prevents division by 0 (should not happen.) */
4049                 return 0;
4050
4051         /* Sign-extend 23-bit R4 value to 32-bit. */
4052         r4 = (r4 << 8) >> 8;
4053         /* Compute temperature in Kelvin. */
4054         temp = (259 * (r4 - r2)) / (r3 - r1);
4055         temp = (temp * 97) / 100 + 8;
4056
4057         DPRINTF(sc, IWN_DEBUG_ANY, "temperature %dK/%dC\n", temp,
4058             IWN_KTOC(temp));
4059         return IWN_KTOC(temp);
4060 }
4061
4062 static int
4063 iwn5000_get_temperature(struct iwn_softc *sc)
4064 {
4065         int32_t temp;
4066
4067         /*
4068          * Temperature is not used by the driver for 5000 Series because
4069          * TX power calibration is handled by firmware.  We export it to
4070          * users through the sensor framework though.
4071          */
4072         temp = le32toh(sc->rawtemp);
4073         if (sc->hw_type == IWN_HW_REV_TYPE_5150) {
4074                 temp = (temp / -5) + sc->temp_off;
4075                 temp = IWN_KTOC(temp);
4076         }
4077         return temp;
4078 }
4079
4080 /*
4081  * Initialize sensitivity calibration state machine.
4082  */
4083 static int
4084 iwn_init_sensitivity(struct iwn_softc *sc)
4085 {
4086         const struct iwn_hal *hal = sc->sc_hal;
4087         struct iwn_calib_state *calib = &sc->calib;
4088         uint32_t flags;
4089         int error;
4090
4091         /* Reset calibration state machine. */
4092         memset(calib, 0, sizeof (*calib));
4093         calib->state = IWN_CALIB_STATE_INIT;
4094         calib->cck_state = IWN_CCK_STATE_HIFA;
4095         /* Set initial correlation values. */
4096         calib->ofdm_x1     = sc->limits->min_ofdm_x1;
4097         calib->ofdm_mrc_x1 = sc->limits->min_ofdm_mrc_x1;
4098         calib->ofdm_x4     = sc->limits->min_ofdm_x4;
4099         calib->ofdm_mrc_x4 = sc->limits->min_ofdm_mrc_x4;
4100         calib->cck_x4      = 125;
4101         calib->cck_mrc_x4  = sc->limits->min_cck_mrc_x4;
4102         calib->energy_cck  = sc->limits->energy_cck;
4103
4104         /* Write initial sensitivity. */
4105         error = iwn_send_sensitivity(sc);
4106         if (error != 0)
4107                 return error;
4108
4109         /* Write initial gains. */
4110         error = hal->init_gains(sc);
4111         if (error != 0)
4112                 return error;
4113
4114         /* Request statistics at each beacon interval. */
4115         flags = 0;
4116         DPRINTF(sc, IWN_DEBUG_CALIBRATE, "%s: calibrate phy\n", __func__);
4117         return iwn_cmd(sc, IWN_CMD_GET_STATISTICS, &flags, sizeof flags, 1);
4118 }
4119
4120 /*
4121  * Collect noise and RSSI statistics for the first 20 beacons received
4122  * after association and use them to determine connected antennas and
4123  * to set differential gains.
4124  */
4125 static void
4126 iwn_collect_noise(struct iwn_softc *sc,
4127     const struct iwn_rx_general_stats *stats)
4128 {
4129         const struct iwn_hal *hal = sc->sc_hal;
4130         struct iwn_calib_state *calib = &sc->calib;
4131         uint32_t val;
4132         int i;
4133
4134         /* Accumulate RSSI and noise for all 3 antennas. */
4135         for (i = 0; i < 3; i++) {
4136                 calib->rssi[i] += le32toh(stats->rssi[i]) & 0xff;
4137                 calib->noise[i] += le32toh(stats->noise[i]) & 0xff;
4138         }
4139         /* NB: We update differential gains only once after 20 beacons. */
4140         if (++calib->nbeacons < 20)
4141                 return;
4142
4143         /* Determine highest average RSSI. */
4144         val = MAX(calib->rssi[0], calib->rssi[1]);
4145         val = MAX(calib->rssi[2], val);
4146
4147         /* Determine which antennas are connected. */
4148         sc->chainmask = sc->rxchainmask;
4149         for (i = 0; i < 3; i++)
4150                 if (val - calib->rssi[i] > 15 * 20)
4151                         sc->chainmask &= ~(1 << i);
4152
4153         /* If none of the TX antennas are connected, keep at least one. */
4154         if ((sc->chainmask & sc->txchainmask) == 0)
4155                 sc->chainmask |= IWN_LSB(sc->txchainmask);
4156
4157         (void)hal->set_gains(sc);
4158         calib->state = IWN_CALIB_STATE_RUN;
4159
4160 #ifdef notyet
4161         /* XXX Disable RX chains with no antennas connected. */
4162         sc->rxon.rxchain = htole16(IWN_RXCHAIN_SEL(sc->chainmask));
4163         (void)iwn_cmd(sc, IWN_CMD_RXON, &sc->rxon, hal->rxonsz, 1);
4164 #endif
4165
4166 #if 0
4167         /* XXX: not yet */
4168         /* Enable power-saving mode if requested by user. */
4169         if (sc->sc_ic.ic_flags & IEEE80211_F_PMGTON)
4170                 (void)iwn_set_pslevel(sc, 0, 3, 1);
4171 #endif
4172 }
4173
4174 static int
4175 iwn4965_init_gains(struct iwn_softc *sc)
4176 {
4177         struct iwn_phy_calib_gain cmd;
4178
4179         memset(&cmd, 0, sizeof cmd);
4180         cmd.code = IWN4965_PHY_CALIB_DIFF_GAIN;
4181         /* Differential gains initially set to 0 for all 3 antennas. */
4182         DPRINTF(sc, IWN_DEBUG_CALIBRATE,
4183             "%s: setting initial differential gains\n", __func__);
4184         return iwn_cmd(sc, IWN_CMD_PHY_CALIB, &cmd, sizeof cmd, 1);
4185 }
4186
4187 static int
4188 iwn5000_init_gains(struct iwn_softc *sc)
4189 {
4190         struct iwn_phy_calib cmd;
4191
4192         memset(&cmd, 0, sizeof cmd);
4193         cmd.code = IWN5000_PHY_CALIB_RESET_NOISE_GAIN;
4194         cmd.ngroups = 1;
4195         cmd.isvalid = 1;
4196         DPRINTF(sc, IWN_DEBUG_CALIBRATE,
4197             "%s: setting initial differential gains\n", __func__);
4198         return iwn_cmd(sc, IWN_CMD_PHY_CALIB, &cmd, sizeof cmd, 1);
4199 }
4200
4201 static int
4202 iwn4965_set_gains(struct iwn_softc *sc)
4203 {
4204         struct iwn_calib_state *calib = &sc->calib;
4205         struct iwn_phy_calib_gain cmd;
4206         int i, delta, noise;
4207
4208         /* Get minimal noise among connected antennas. */
4209         noise = INT_MAX;        /* NB: There's at least one antenna. */
4210         for (i = 0; i < 3; i++)
4211                 if (sc->chainmask & (1 << i))
4212                         noise = MIN(calib->noise[i], noise);
4213
4214         memset(&cmd, 0, sizeof cmd);
4215         cmd.code = IWN4965_PHY_CALIB_DIFF_GAIN;
4216         /* Set differential gains for connected antennas. */
4217         for (i = 0; i < 3; i++) {
4218                 if (sc->chainmask & (1 << i)) {
4219                         /* Compute attenuation (in unit of 1.5dB). */
4220                         delta = (noise - (int32_t)calib->noise[i]) / 30;
4221                         /* NB: delta <= 0 */
4222                         /* Limit to [-4.5dB,0]. */
4223                         cmd.gain[i] = MIN(abs(delta), 3);
4224                         if (delta < 0)
4225                                 cmd.gain[i] |= 1 << 2;  /* sign bit */
4226                 }
4227         }
4228         DPRINTF(sc, IWN_DEBUG_CALIBRATE,
4229             "setting differential gains Ant A/B/C: %x/%x/%x (%x)\n",
4230             cmd.gain[0], cmd.gain[1], cmd.gain[2], sc->chainmask);
4231         return iwn_cmd(sc, IWN_CMD_PHY_CALIB, &cmd, sizeof cmd, 1);
4232 }
4233
4234 static int
4235 iwn5000_set_gains(struct iwn_softc *sc)
4236 {
4237         struct iwn_calib_state *calib = &sc->calib;
4238         struct iwn_phy_calib_gain cmd;
4239         int i, ant, delta, div;
4240
4241         /* We collected 20 beacons and !=6050 need a 1.5 factor. */
4242         div = (sc->hw_type == IWN_HW_REV_TYPE_6050) ? 20 : 30;
4243
4244         memset(&cmd, 0, sizeof cmd);
4245         cmd.code = IWN5000_PHY_CALIB_NOISE_GAIN;
4246         cmd.ngroups = 1;
4247         cmd.isvalid = 1;
4248         /* Get first available RX antenna as referential. */
4249         ant = IWN_LSB(sc->rxchainmask);
4250         /* Set differential gains for other antennas. */
4251         for (i = ant + 1; i < 3; i++) {
4252                 if (sc->chainmask & (1 << i)) {
4253                         /* The delta is relative to antenna "ant". */
4254                         delta = ((int32_t)calib->noise[ant] -
4255                             (int32_t)calib->noise[i]) / div;
4256                         /* Limit to [-4.5dB,+4.5dB]. */
4257                         cmd.gain[i - 1] = MIN(abs(delta), 3);
4258                         if (delta < 0)
4259                                 cmd.gain[i - 1] |= 1 << 2;      /* sign bit */
4260                 }
4261         }
4262         DPRINTF(sc, IWN_DEBUG_CALIBRATE,
4263             "setting differential gains Ant B/C: %x/%x (%x)\n",
4264             cmd.gain[0], cmd.gain[1], sc->chainmask);
4265         return iwn_cmd(sc, IWN_CMD_PHY_CALIB, &cmd, sizeof cmd, 1);
4266 }
4267
4268 /*
4269  * Tune RF RX sensitivity based on the number of false alarms detected
4270  * during the last beacon period.
4271  */
4272 static void
4273 iwn_tune_sensitivity(struct iwn_softc *sc, const struct iwn_rx_stats *stats)
4274 {
4275 #define inc(val, inc, max)                      \
4276         if ((val) < (max)) {                    \
4277                 if ((val) < (max) - (inc))      \
4278                         (val) += (inc);         \
4279                 else                            \
4280                         (val) = (max);          \
4281                 needs_update = 1;               \
4282         }
4283 #define dec(val, dec, min)                      \
4284         if ((val) > (min)) {                    \
4285                 if ((val) > (min) + (dec))      \
4286                         (val) -= (dec);         \
4287                 else                            \
4288                         (val) = (min);          \
4289                 needs_update = 1;               \
4290         }
4291
4292         const struct iwn_sensitivity_limits *limits = sc->limits;
4293         struct iwn_calib_state *calib = &sc->calib;
4294         uint32_t val, rxena, fa;
4295         uint32_t energy[3], energy_min;
4296         uint8_t noise[3], noise_ref;
4297         int i, needs_update = 0;
4298
4299         /* Check that we've been enabled long enough. */
4300         rxena = le32toh(stats->general.load);
4301         if (rxena == 0)
4302                 return;
4303
4304         /* Compute number of false alarms since last call for OFDM. */
4305         fa  = le32toh(stats->ofdm.bad_plcp) - calib->bad_plcp_ofdm;
4306         fa += le32toh(stats->ofdm.fa) - calib->fa_ofdm;
4307         fa *= 200 * 1024;       /* 200TU */
4308
4309         /* Save counters values for next call. */
4310         calib->bad_plcp_ofdm = le32toh(stats->ofdm.bad_plcp);
4311         calib->fa_ofdm = le32toh(stats->ofdm.fa);
4312
4313         if (fa > 50 * rxena) {
4314                 /* High false alarm count, decrease sensitivity. */
4315                 DPRINTF(sc, IWN_DEBUG_CALIBRATE,
4316                     "%s: OFDM high false alarm count: %u\n", __func__, fa);
4317                 inc(calib->ofdm_x1,     1, limits->max_ofdm_x1);
4318                 inc(calib->ofdm_mrc_x1, 1, limits->max_ofdm_mrc_x1);
4319                 inc(calib->ofdm_x4,     1, limits->max_ofdm_x4);
4320                 inc(calib->ofdm_mrc_x4, 1, limits->max_ofdm_mrc_x4);
4321
4322         } else if (fa < 5 * rxena) {
4323                 /* Low false alarm count, increase sensitivity. */
4324                 DPRINTF(sc, IWN_DEBUG_CALIBRATE,
4325                     "%s: OFDM low false alarm count: %u\n", __func__, fa);
4326                 dec(calib->ofdm_x1,     1, limits->min_ofdm_x1);
4327                 dec(calib->ofdm_mrc_x1, 1, limits->min_ofdm_mrc_x1);
4328                 dec(calib->ofdm_x4,     1, limits->min_ofdm_x4);
4329                 dec(calib->ofdm_mrc_x4, 1, limits->min_ofdm_mrc_x4);
4330         }
4331
4332         /* Compute maximum noise among 3 receivers. */
4333         for (i = 0; i < 3; i++)
4334                 noise[i] = (le32toh(stats->general.noise[i]) >> 8) & 0xff;
4335         val = MAX(noise[0], noise[1]);
4336         val = MAX(noise[2], val);
4337         /* Insert it into our samples table. */
4338         calib->noise_samples[calib->cur_noise_sample] = val;
4339         calib->cur_noise_sample = (calib->cur_noise_sample + 1) % 20;
4340
4341         /* Compute maximum noise among last 20 samples. */
4342         noise_ref = calib->noise_samples[0];
4343         for (i = 1; i < 20; i++)
4344                 noise_ref = MAX(noise_ref, calib->noise_samples[i]);
4345
4346         /* Compute maximum energy among 3 receivers. */
4347         for (i = 0; i < 3; i++)
4348                 energy[i] = le32toh(stats->general.energy[i]);
4349         val = MIN(energy[0], energy[1]);
4350         val = MIN(energy[2], val);
4351         /* Insert it into our samples table. */
4352         calib->energy_samples[calib->cur_energy_sample] = val;
4353         calib->cur_energy_sample = (calib->cur_energy_sample + 1) % 10;
4354
4355         /* Compute minimum energy among last 10 samples. */
4356         energy_min = calib->energy_samples[0];
4357         for (i = 1; i < 10; i++)
4358                 energy_min = MAX(energy_min, calib->energy_samples[i]);
4359         energy_min += 6;
4360
4361         /* Compute number of false alarms since last call for CCK. */
4362         fa  = le32toh(stats->cck.bad_plcp) - calib->bad_plcp_cck;
4363         fa += le32toh(stats->cck.fa) - calib->fa_cck;
4364         fa *= 200 * 1024;       /* 200TU */
4365
4366         /* Save counters values for next call. */
4367         calib->bad_plcp_cck = le32toh(stats->cck.bad_plcp);
4368         calib->fa_cck = le32toh(stats->cck.fa);
4369
4370         if (fa > 50 * rxena) {
4371                 /* High false alarm count, decrease sensitivity. */
4372                 DPRINTF(sc, IWN_DEBUG_CALIBRATE,
4373                     "%s: CCK high false alarm count: %u\n", __func__, fa);
4374                 calib->cck_state = IWN_CCK_STATE_HIFA;
4375                 calib->low_fa = 0;
4376
4377                 if (calib->cck_x4 > 160) {
4378                         calib->noise_ref = noise_ref;
4379                         if (calib->energy_cck > 2)
4380                                 dec(calib->energy_cck, 2, energy_min);
4381                 }
4382                 if (calib->cck_x4 < 160) {
4383                         calib->cck_x4 = 161;
4384                         needs_update = 1;
4385                 } else
4386                         inc(calib->cck_x4, 3, limits->max_cck_x4);
4387
4388                 inc(calib->cck_mrc_x4, 3, limits->max_cck_mrc_x4);
4389
4390         } else if (fa < 5 * rxena) {
4391                 /* Low false alarm count, increase sensitivity. */
4392                 DPRINTF(sc, IWN_DEBUG_CALIBRATE,
4393                     "%s: CCK low false alarm count: %u\n", __func__, fa);
4394                 calib->cck_state = IWN_CCK_STATE_LOFA;
4395                 calib->low_fa++;
4396
4397                 if (calib->cck_state != IWN_CCK_STATE_INIT &&
4398                     (((int32_t)calib->noise_ref - (int32_t)noise_ref) > 2 ||
4399                     calib->low_fa > 100)) {
4400                         inc(calib->energy_cck, 2, limits->min_energy_cck);
4401                         dec(calib->cck_x4,     3, limits->min_cck_x4);
4402                         dec(calib->cck_mrc_x4, 3, limits->min_cck_mrc_x4);
4403                 }
4404         } else {
4405                 /* Not worth to increase or decrease sensitivity. */
4406                 DPRINTF(sc, IWN_DEBUG_CALIBRATE,
4407                     "%s: CCK normal false alarm count: %u\n", __func__, fa);
4408                 calib->low_fa = 0;
4409                 calib->noise_ref = noise_ref;
4410
4411                 if (calib->cck_state == IWN_CCK_STATE_HIFA) {
4412                         /* Previous interval had many false alarms. */
4413                         dec(calib->energy_cck, 8, energy_min);
4414                 }
4415                 calib->cck_state = IWN_CCK_STATE_INIT;
4416         }
4417
4418         if (needs_update)
4419                 (void)iwn_send_sensitivity(sc);
4420 #undef dec
4421 #undef inc
4422 }
4423
4424 static int
4425 iwn_send_sensitivity(struct iwn_softc *sc)
4426 {
4427         struct iwn_calib_state *calib = &sc->calib;
4428         struct iwn_sensitivity_cmd cmd;
4429
4430         memset(&cmd, 0, sizeof cmd);
4431         cmd.which = IWN_SENSITIVITY_WORKTBL;
4432         /* OFDM modulation. */
4433         cmd.corr_ofdm_x1     = htole16(calib->ofdm_x1);
4434         cmd.corr_ofdm_mrc_x1 = htole16(calib->ofdm_mrc_x1);
4435         cmd.corr_ofdm_x4     = htole16(calib->ofdm_x4);
4436         cmd.corr_ofdm_mrc_x4 = htole16(calib->ofdm_mrc_x4);
4437         cmd.energy_ofdm      = htole16(sc->limits->energy_ofdm);
4438         cmd.energy_ofdm_th   = htole16(62);
4439         /* CCK modulation. */
4440         cmd.corr_cck_x4      = htole16(calib->cck_x4);
4441         cmd.corr_cck_mrc_x4  = htole16(calib->cck_mrc_x4);
4442         cmd.energy_cck       = htole16(calib->energy_cck);
4443         /* Barker modulation: use default values. */
4444         cmd.corr_barker      = htole16(190);
4445         cmd.corr_barker_mrc  = htole16(390);
4446
4447         DPRINTF(sc, IWN_DEBUG_CALIBRATE,
4448             "%s: set sensitivity %d/%d/%d/%d/%d/%d/%d\n", __func__,
4449             calib->ofdm_x1, calib->ofdm_mrc_x1, calib->ofdm_x4,
4450             calib->ofdm_mrc_x4, calib->cck_x4,
4451             calib->cck_mrc_x4, calib->energy_cck);
4452         return iwn_cmd(sc, IWN_CMD_SET_SENSITIVITY, &cmd, sizeof cmd, 1);
4453 }
4454
4455 /*
4456  * Set STA mode power saving level (between 0 and 5).
4457  * Level 0 is CAM (Continuously Aware Mode), 5 is for maximum power saving.
4458  */
4459 static int
4460 iwn_set_pslevel(struct iwn_softc *sc, int dtim, int level, int async)
4461 {
4462         const struct iwn_pmgt *pmgt;
4463         struct iwn_pmgt_cmd cmd;
4464         uint32_t max, skip_dtim;
4465         uint32_t tmp;
4466         int i;
4467
4468         /* Select which PS parameters to use. */
4469         if (dtim <= 2)
4470                 pmgt = &iwn_pmgt[0][level];
4471         else if (dtim <= 10)
4472                 pmgt = &iwn_pmgt[1][level];
4473         else
4474                 pmgt = &iwn_pmgt[2][level];
4475
4476         memset(&cmd, 0, sizeof cmd);
4477         if (level != 0) /* not CAM */
4478                 cmd.flags |= htole16(IWN_PS_ALLOW_SLEEP);
4479         if (level == 5)
4480                 cmd.flags |= htole16(IWN_PS_FAST_PD);
4481         /* Retrieve PCIe Active State Power Management (ASPM). */
4482         tmp = pci_read_config(sc->sc_dev, sc->sc_cap_off + 0x10, 1);
4483         if (!(tmp & 0x1))       /* L0s Entry disabled. */
4484                 cmd.flags |= htole16(IWN_PS_PCI_PMGT);
4485         cmd.rxtimeout = htole32(pmgt->rxtimeout * 1024);
4486         cmd.txtimeout = htole32(pmgt->txtimeout * 1024);
4487
4488         if (dtim == 0) {
4489                 dtim = 1;
4490                 skip_dtim = 0;
4491         } else
4492                 skip_dtim = pmgt->skip_dtim;
4493         if (skip_dtim != 0) {
4494                 cmd.flags |= htole16(IWN_PS_SLEEP_OVER_DTIM);
4495                 max = pmgt->intval[4];
4496                 if (max == (uint32_t)-1)
4497                         max = dtim * (skip_dtim + 1);
4498                 else if (max > dtim)
4499                         max = (max / dtim) * dtim;
4500         } else
4501                 max = dtim;
4502         for (i = 0; i < 5; i++)
4503                 cmd.intval[i] = htole32(MIN(max, pmgt->intval[i]));
4504
4505         DPRINTF(sc, IWN_DEBUG_RESET, "setting power saving level to %d\n",
4506             level);
4507         return iwn_cmd(sc, IWN_CMD_SET_POWER_MODE, &cmd, sizeof cmd, async);
4508 }
4509
4510 static int
4511 iwn_config(struct iwn_softc *sc)
4512 {
4513         const struct iwn_hal *hal = sc->sc_hal;
4514         struct ifnet *ifp = sc->sc_ifp;
4515         struct ieee80211com *ic = ifp->if_l2com;
4516         struct iwn_bluetooth bluetooth;
4517         uint32_t txmask;
4518         int error;
4519         uint16_t rxchain;
4520
4521         /* Configure valid TX chains for 5000 Series. */
4522         if (sc->hw_type != IWN_HW_REV_TYPE_4965) {
4523                 txmask = htole32(sc->txchainmask);
4524                 DPRINTF(sc, IWN_DEBUG_RESET,
4525                     "%s: configuring valid TX chains 0x%x\n", __func__, txmask);
4526                 error = iwn_cmd(sc, IWN5000_CMD_TX_ANT_CONFIG, &txmask,
4527                     sizeof txmask, 0);
4528                 if (error != 0) {
4529                         device_printf(sc->sc_dev,
4530                             "%s: could not configure valid TX chains, "
4531                             "error %d\n", __func__, error);
4532                         return error;
4533                 }
4534         }
4535
4536         /* Configure bluetooth coexistence. */
4537         memset(&bluetooth, 0, sizeof bluetooth);
4538         bluetooth.flags = IWN_BT_COEX_CHAN_ANN | IWN_BT_COEX_BT_PRIO;
4539         bluetooth.lead_time = IWN_BT_LEAD_TIME_DEF;
4540         bluetooth.max_kill = IWN_BT_MAX_KILL_DEF;
4541         DPRINTF(sc, IWN_DEBUG_RESET, "%s: config bluetooth coexistence\n",
4542             __func__);
4543         error = iwn_cmd(sc, IWN_CMD_BT_COEX, &bluetooth, sizeof bluetooth, 0);
4544         if (error != 0) {
4545                 device_printf(sc->sc_dev,
4546                     "%s: could not configure bluetooth coexistence, error %d\n",
4547                     __func__, error);
4548                 return error;
4549         }
4550
4551         /* Set mode, channel, RX filter and enable RX. */
4552         memset(&sc->rxon, 0, sizeof (struct iwn_rxon));
4553         IEEE80211_ADDR_COPY(sc->rxon.myaddr, IF_LLADDR(ifp));
4554         IEEE80211_ADDR_COPY(sc->rxon.wlap, IF_LLADDR(ifp));
4555         sc->rxon.chan = ieee80211_chan2ieee(ic, ic->ic_curchan);
4556         sc->rxon.flags = htole32(IWN_RXON_TSF | IWN_RXON_CTS_TO_SELF);
4557         if (IEEE80211_IS_CHAN_2GHZ(ic->ic_curchan))
4558                 sc->rxon.flags |= htole32(IWN_RXON_AUTO | IWN_RXON_24GHZ);
4559         switch (ic->ic_opmode) {
4560         case IEEE80211_M_STA:
4561                 sc->rxon.mode = IWN_MODE_STA;
4562                 sc->rxon.filter = htole32(IWN_FILTER_MULTICAST);
4563                 break;
4564         case IEEE80211_M_MONITOR:
4565                 sc->rxon.mode = IWN_MODE_MONITOR;
4566                 sc->rxon.filter = htole32(IWN_FILTER_MULTICAST |
4567                     IWN_FILTER_CTL | IWN_FILTER_PROMISC);
4568                 break;
4569         default:
4570                 /* Should not get there. */
4571                 break;
4572         }
4573         sc->rxon.cck_mask  = 0x0f;      /* not yet negotiated */
4574         sc->rxon.ofdm_mask = 0xff;      /* not yet negotiated */
4575         sc->rxon.ht_single_mask = 0xff;
4576         sc->rxon.ht_dual_mask = 0xff;
4577         sc->rxon.ht_triple_mask = 0xff;
4578         rxchain =
4579             IWN_RXCHAIN_VALID(sc->rxchainmask) |
4580             IWN_RXCHAIN_MIMO_COUNT(2) |
4581             IWN_RXCHAIN_IDLE_COUNT(2);
4582         sc->rxon.rxchain = htole16(rxchain);
4583         DPRINTF(sc, IWN_DEBUG_RESET, "%s: setting configuration\n", __func__);
4584         error = iwn_cmd(sc, IWN_CMD_RXON, &sc->rxon, hal->rxonsz, 0);
4585         if (error != 0) {
4586                 device_printf(sc->sc_dev,
4587                     "%s: RXON command failed\n", __func__);
4588                 return error;
4589         }
4590
4591         error = iwn_add_broadcast_node(sc, 0);
4592         if (error != 0) {
4593                 device_printf(sc->sc_dev,
4594                     "%s: could not add broadcast node\n", __func__);
4595                 return error;
4596         }
4597
4598         /* Configuration has changed, set TX power accordingly. */
4599         error = hal->set_txpower(sc, ic->ic_curchan, 0);
4600         if (error != 0) {
4601                 device_printf(sc->sc_dev,
4602                     "%s: could not set TX power\n", __func__);
4603                 return error;
4604         }
4605
4606         error = iwn_set_critical_temp(sc);
4607         if (error != 0) {
4608                 device_printf(sc->sc_dev,
4609                     "%s: ccould not set critical temperature\n", __func__);
4610                 return error;
4611         }
4612
4613         /* Set power saving level to CAM during initialization. */
4614         error = iwn_set_pslevel(sc, 0, 0, 0);
4615         if (error != 0) {
4616                 device_printf(sc->sc_dev,
4617                     "%s: could not set power saving level\n", __func__);
4618                 return error;
4619         }
4620         return 0;
4621 }
4622
4623 static int
4624 iwn_scan(struct iwn_softc *sc)
4625 {
4626         struct ifnet *ifp = sc->sc_ifp;
4627         struct ieee80211com *ic = ifp->if_l2com;
4628         struct ieee80211_scan_state *ss = ic->ic_scan;  /*XXX*/
4629         struct iwn_scan_hdr *hdr;
4630         struct iwn_cmd_data *tx;
4631         struct iwn_scan_essid *essid;
4632         struct iwn_scan_chan *chan;
4633         struct ieee80211_frame *wh;
4634         struct ieee80211_rateset *rs;
4635         struct ieee80211_channel *c;
4636         int buflen, error, nrates;
4637         uint16_t rxchain;
4638         uint8_t *buf, *frm, txant;
4639
4640         buf = kmalloc(IWN_SCAN_MAXSZ, M_DEVBUF, M_INTWAIT | M_ZERO);
4641         if (buf == NULL) {
4642                 device_printf(sc->sc_dev,
4643                     "%s: could not allocate buffer for scan command\n",
4644                     __func__);
4645                 return ENOMEM;
4646         }
4647         hdr = (struct iwn_scan_hdr *)buf;
4648
4649         /*
4650          * Move to the next channel if no frames are received within 10ms
4651          * after sending the probe request.
4652          */
4653         hdr->quiet_time = htole16(10);          /* timeout in milliseconds */
4654         hdr->quiet_threshold = htole16(1);      /* min # of packets */
4655
4656         /* Select antennas for scanning. */
4657         rxchain =
4658             IWN_RXCHAIN_VALID(sc->rxchainmask) |
4659             IWN_RXCHAIN_FORCE_MIMO_SEL(sc->rxchainmask) |
4660             IWN_RXCHAIN_DRIVER_FORCE;
4661         if (IEEE80211_IS_CHAN_A(ic->ic_curchan) &&
4662             sc->hw_type == IWN_HW_REV_TYPE_4965) {
4663                 /* Ant A must be avoided in 5GHz because of an HW bug. */
4664                 rxchain |= IWN_RXCHAIN_FORCE_SEL(IWN_ANT_BC);
4665         } else  /* Use all available RX antennas. */
4666                 rxchain |= IWN_RXCHAIN_FORCE_SEL(sc->rxchainmask);
4667         hdr->rxchain = htole16(rxchain);
4668         hdr->filter = htole32(IWN_FILTER_MULTICAST | IWN_FILTER_BEACON);
4669
4670         tx = (struct iwn_cmd_data *)(hdr + 1);
4671         tx->flags = htole32(IWN_TX_AUTO_SEQ);
4672         tx->id = sc->sc_hal->broadcast_id;
4673         tx->lifetime = htole32(IWN_LIFETIME_INFINITE);
4674
4675         if (IEEE80211_IS_CHAN_A(ic->ic_curchan)) {
4676                 /* Send probe requests at 6Mbps. */
4677                 tx->plcp = iwn_rates[IWN_RIDX_OFDM6].plcp;
4678                 rs = &ic->ic_sup_rates[IEEE80211_MODE_11A];
4679         } else {
4680                 hdr->flags = htole32(IWN_RXON_24GHZ | IWN_RXON_AUTO);
4681                 /* Send probe requests at 1Mbps. */
4682                 tx->plcp = iwn_rates[IWN_RIDX_CCK1].plcp;
4683                 tx->rflags = IWN_RFLAG_CCK;
4684                 rs = &ic->ic_sup_rates[IEEE80211_MODE_11G];
4685         }
4686         /* Use the first valid TX antenna. */
4687         txant = IWN_LSB(sc->txchainmask);
4688         tx->rflags |= IWN_RFLAG_ANT(txant);
4689
4690         essid = (struct iwn_scan_essid *)(tx + 1);
4691         if (ss->ss_ssid[0].len != 0) {
4692                 essid[0].id = IEEE80211_ELEMID_SSID;
4693                 essid[0].len = ss->ss_ssid[0].len;
4694                 memcpy(essid[0].data, ss->ss_ssid[0].ssid, ss->ss_ssid[0].len);
4695         }
4696
4697         /*
4698          * Build a probe request frame.  Most of the following code is a
4699          * copy & paste of what is done in net80211.
4700          */
4701         wh = (struct ieee80211_frame *)(essid + 20);
4702         wh->i_fc[0] = IEEE80211_FC0_VERSION_0 | IEEE80211_FC0_TYPE_MGT |
4703             IEEE80211_FC0_SUBTYPE_PROBE_REQ;
4704         wh->i_fc[1] = IEEE80211_FC1_DIR_NODS;
4705         IEEE80211_ADDR_COPY(wh->i_addr1, ifp->if_broadcastaddr);
4706         IEEE80211_ADDR_COPY(wh->i_addr2, IF_LLADDR(ifp));
4707         IEEE80211_ADDR_COPY(wh->i_addr3, ifp->if_broadcastaddr);
4708         *(uint16_t *)&wh->i_dur[0] = 0; /* filled by HW */
4709         *(uint16_t *)&wh->i_seq[0] = 0; /* filled by HW */
4710
4711         frm = (uint8_t *)(wh + 1);
4712
4713         /* Add SSID IE. */
4714         *frm++ = IEEE80211_ELEMID_SSID;
4715         *frm++ = ss->ss_ssid[0].len;
4716         memcpy(frm, ss->ss_ssid[0].ssid, ss->ss_ssid[0].len);
4717         frm += ss->ss_ssid[0].len;
4718
4719         /* Add supported rates IE. */
4720         *frm++ = IEEE80211_ELEMID_RATES;
4721         nrates = rs->rs_nrates;
4722         if (nrates > IEEE80211_RATE_SIZE)
4723                 nrates = IEEE80211_RATE_SIZE;
4724         *frm++ = nrates;
4725         memcpy(frm, rs->rs_rates, nrates);
4726         frm += nrates;
4727
4728         /* Add supported xrates IE. */
4729         if (rs->rs_nrates > IEEE80211_RATE_SIZE) {
4730                 nrates = rs->rs_nrates - IEEE80211_RATE_SIZE;
4731                 *frm++ = IEEE80211_ELEMID_XRATES;
4732                 *frm++ = (uint8_t)nrates;
4733                 memcpy(frm, rs->rs_rates + IEEE80211_RATE_SIZE, nrates);
4734                 frm += nrates;
4735         }
4736
4737         /* Set length of probe request. */
4738         tx->len = htole16(frm - (uint8_t *)wh);
4739
4740         c = ic->ic_curchan;
4741         chan = (struct iwn_scan_chan *)frm;
4742         chan->chan = htole16(ieee80211_chan2ieee(ic, c));
4743         chan->flags = 0;
4744         if (ss->ss_nssid > 0)
4745                 chan->flags |= htole32(IWN_CHAN_NPBREQS(1));
4746         chan->dsp_gain = 0x6e;
4747         if (IEEE80211_IS_CHAN_5GHZ(c) &&
4748             !(c->ic_flags & IEEE80211_CHAN_PASSIVE)) {
4749                 chan->rf_gain = 0x3b;
4750                 chan->active  = htole16(24);
4751                 chan->passive = htole16(110);
4752                 chan->flags |= htole32(IWN_CHAN_ACTIVE);
4753         } else if (IEEE80211_IS_CHAN_5GHZ(c)) {
4754                 chan->rf_gain = 0x3b;
4755                 chan->active  = htole16(24);
4756                 if (sc->rxon.associd)
4757                         chan->passive = htole16(78);
4758                 else
4759                         chan->passive = htole16(110);
4760                 hdr->crc_threshold = 0xffff;
4761         } else if (!(c->ic_flags & IEEE80211_CHAN_PASSIVE)) {
4762                 chan->rf_gain = 0x28;
4763                 chan->active  = htole16(36);
4764                 chan->passive = htole16(120);
4765                 chan->flags |= htole32(IWN_CHAN_ACTIVE);
4766         } else {
4767                 chan->rf_gain = 0x28;
4768                 chan->active  = htole16(36);
4769                 if (sc->rxon.associd)
4770                         chan->passive = htole16(88);
4771                 else
4772                         chan->passive = htole16(120);
4773                 hdr->crc_threshold = 0xffff;
4774         }
4775
4776         DPRINTF(sc, IWN_DEBUG_STATE,
4777             "%s: chan %u flags 0x%x rf_gain 0x%x "
4778             "dsp_gain 0x%x active 0x%x passive 0x%x\n", __func__,
4779             chan->chan, chan->flags, chan->rf_gain, chan->dsp_gain,
4780             chan->active, chan->passive);
4781
4782         hdr->nchan++;
4783         chan++;
4784         buflen = (uint8_t *)chan - buf;
4785         hdr->len = htole16(buflen);
4786
4787         DPRINTF(sc, IWN_DEBUG_STATE, "sending scan command nchan=%d\n",
4788             hdr->nchan);
4789         error = iwn_cmd(sc, IWN_CMD_SCAN, buf, buflen, 1);
4790         kfree(buf, M_DEVBUF);
4791         return error;
4792 }
4793
4794 static int
4795 iwn_auth(struct iwn_softc *sc, struct ieee80211vap *vap)
4796 {
4797         const struct iwn_hal *hal = sc->sc_hal;
4798         struct ifnet *ifp = sc->sc_ifp;
4799         struct ieee80211com *ic = ifp->if_l2com;
4800         struct ieee80211_node *ni = vap->iv_bss;
4801         int error;
4802
4803         sc->calib.state = IWN_CALIB_STATE_INIT;
4804
4805         /* Update adapter configuration. */
4806         IEEE80211_ADDR_COPY(sc->rxon.bssid, ni->ni_bssid);
4807         sc->rxon.chan = htole16(ieee80211_chan2ieee(ic, ni->ni_chan));
4808         sc->rxon.flags = htole32(IWN_RXON_TSF | IWN_RXON_CTS_TO_SELF);
4809         if (IEEE80211_IS_CHAN_2GHZ(ni->ni_chan))
4810                 sc->rxon.flags |= htole32(IWN_RXON_AUTO | IWN_RXON_24GHZ);
4811         if (ic->ic_flags & IEEE80211_F_SHSLOT)
4812                 sc->rxon.flags |= htole32(IWN_RXON_SHSLOT);
4813         if (ic->ic_flags & IEEE80211_F_SHPREAMBLE)
4814                 sc->rxon.flags |= htole32(IWN_RXON_SHPREAMBLE);
4815         if (IEEE80211_IS_CHAN_A(ni->ni_chan)) {
4816                 sc->rxon.cck_mask  = 0;
4817                 sc->rxon.ofdm_mask = 0x15;
4818         } else if (IEEE80211_IS_CHAN_B(ni->ni_chan)) {
4819                 sc->rxon.cck_mask  = 0x03;
4820                 sc->rxon.ofdm_mask = 0;
4821         } else {
4822                 /* XXX assume 802.11b/g */
4823                 sc->rxon.cck_mask  = 0x0f;
4824                 sc->rxon.ofdm_mask = 0x15;
4825         }
4826         DPRINTF(sc, IWN_DEBUG_STATE,
4827             "%s: config chan %d mode %d flags 0x%x cck 0x%x ofdm 0x%x "
4828             "ht_single 0x%x ht_dual 0x%x rxchain 0x%x "
4829             "myaddr %6D wlap %6D bssid %6D associd %d filter 0x%x\n",
4830             __func__,
4831             le16toh(sc->rxon.chan), sc->rxon.mode, le32toh(sc->rxon.flags),
4832             sc->rxon.cck_mask, sc->rxon.ofdm_mask,
4833             sc->rxon.ht_single_mask, sc->rxon.ht_dual_mask,
4834             le16toh(sc->rxon.rxchain),
4835             sc->rxon.myaddr, ":", sc->rxon.wlap, ":", sc->rxon.bssid, ":",
4836             le16toh(sc->rxon.associd), le32toh(sc->rxon.filter));
4837         error = iwn_cmd(sc, IWN_CMD_RXON, &sc->rxon, hal->rxonsz, 1);
4838         if (error != 0) {
4839                 device_printf(sc->sc_dev,
4840                     "%s: RXON command failed, error %d\n", __func__, error);
4841                 return error;
4842         }
4843
4844         /* Configuration has changed, set TX power accordingly. */
4845         error = hal->set_txpower(sc, ni->ni_chan, 1);
4846         if (error != 0) {
4847                 device_printf(sc->sc_dev,
4848                     "%s: could not set Tx power, error %d\n", __func__, error);
4849                 return error;
4850         }
4851         /*
4852          * Reconfiguring RXON clears the firmware nodes table so we must
4853          * add the broadcast node again.
4854          */
4855         error = iwn_add_broadcast_node(sc, 1);
4856         if (error != 0) {
4857                 device_printf(sc->sc_dev,
4858                     "%s: could not add broadcast node, error %d\n",
4859                     __func__, error);
4860                 return error;
4861         }
4862         return 0;
4863 }
4864
4865 /*
4866  * Configure the adapter for associated state.
4867  */
4868 static int
4869 iwn_run(struct iwn_softc *sc, struct ieee80211vap *vap)
4870 {
4871 #define MS(v,x) (((v) & x) >> x##_S)
4872         const struct iwn_hal *hal = sc->sc_hal;
4873         struct ifnet *ifp = sc->sc_ifp;
4874         struct ieee80211com *ic = ifp->if_l2com;
4875         struct ieee80211_node *ni = vap->iv_bss;
4876         struct iwn_node_info node;
4877         int error;
4878
4879         sc->calib.state = IWN_CALIB_STATE_INIT;
4880
4881         if (ic->ic_opmode == IEEE80211_M_MONITOR) {
4882                 /* Link LED blinks while monitoring. */
4883                 iwn_set_led(sc, IWN_LED_LINK, 5, 5);
4884                 return 0;
4885         }
4886         error = iwn_set_timing(sc, ni);
4887         if (error != 0) {
4888                 device_printf(sc->sc_dev,
4889                     "%s: could not set timing, error %d\n", __func__, error);
4890                 return error;
4891         }
4892
4893         /* Update adapter configuration. */
4894         IEEE80211_ADDR_COPY(sc->rxon.bssid, ni->ni_bssid);
4895         sc->rxon.chan = htole16(ieee80211_chan2ieee(ic, ni->ni_chan));
4896         sc->rxon.associd = htole16(IEEE80211_AID(ni->ni_associd));
4897         /* Short preamble and slot time are negotiated when associating. */
4898         sc->rxon.flags &= ~htole32(IWN_RXON_SHPREAMBLE | IWN_RXON_SHSLOT);
4899         sc->rxon.flags |= htole32(IWN_RXON_TSF | IWN_RXON_CTS_TO_SELF);
4900         if (IEEE80211_IS_CHAN_2GHZ(ni->ni_chan))
4901                 sc->rxon.flags |= htole32(IWN_RXON_AUTO | IWN_RXON_24GHZ);
4902         else
4903                 sc->rxon.flags &= ~htole32(IWN_RXON_AUTO | IWN_RXON_24GHZ);
4904         if (ic->ic_flags & IEEE80211_F_SHSLOT)
4905                 sc->rxon.flags |= htole32(IWN_RXON_SHSLOT);
4906         if (ic->ic_flags & IEEE80211_F_SHPREAMBLE)
4907                 sc->rxon.flags |= htole32(IWN_RXON_SHPREAMBLE);
4908         if (IEEE80211_IS_CHAN_A(ni->ni_chan)) {
4909                 sc->rxon.cck_mask  = 0;
4910                 sc->rxon.ofdm_mask = 0x15;
4911         } else if (IEEE80211_IS_CHAN_B(ni->ni_chan)) {
4912                 sc->rxon.cck_mask  = 0x03;
4913                 sc->rxon.ofdm_mask = 0;
4914         } else {
4915                 /* XXX assume 802.11b/g */
4916                 sc->rxon.cck_mask  = 0x0f;
4917                 sc->rxon.ofdm_mask = 0x15;
4918         }
4919 #if 0   /* HT */
4920         if (IEEE80211_IS_CHAN_HT(ni->ni_chan)) {
4921                 sc->rxon.flags &= ~htole32(IWN_RXON_HT);
4922                 if (IEEE80211_IS_CHAN_HT40U(ni->ni_chan))
4923                         sc->rxon.flags |= htole32(IWN_RXON_HT40U);
4924                 else if (IEEE80211_IS_CHAN_HT40D(ni->ni_chan))
4925                         sc->rxon.flags |= htole32(IWN_RXON_HT40D);
4926                 else
4927                         sc->rxon.flags |= htole32(IWN_RXON_HT20);
4928                 sc->rxon.rxchain = htole16(
4929                           IWN_RXCHAIN_VALID(3)
4930                         | IWN_RXCHAIN_MIMO_COUNT(3)
4931                         | IWN_RXCHAIN_IDLE_COUNT(1)
4932                         | IWN_RXCHAIN_MIMO_FORCE);
4933
4934                 maxrxampdu = MS(ni->ni_htparam, IEEE80211_HTCAP_MAXRXAMPDU);
4935                 ampdudensity = MS(ni->ni_htparam, IEEE80211_HTCAP_MPDUDENSITY);
4936         } else
4937                 maxrxampdu = ampdudensity = 0;
4938 #endif
4939         sc->rxon.filter |= htole32(IWN_FILTER_BSS);
4940
4941         DPRINTF(sc, IWN_DEBUG_STATE,
4942             "%s: config chan %d mode %d flags 0x%x cck 0x%x ofdm 0x%x "
4943             "ht_single 0x%x ht_dual 0x%x rxchain 0x%x "
4944             "myaddr %6D wlap %6D bssid %6D associd %d filter 0x%x\n",
4945             __func__,
4946             le16toh(sc->rxon.chan), sc->rxon.mode, le32toh(sc->rxon.flags),
4947             sc->rxon.cck_mask, sc->rxon.ofdm_mask,
4948             sc->rxon.ht_single_mask, sc->rxon.ht_dual_mask,
4949             le16toh(sc->rxon.rxchain),
4950             sc->rxon.myaddr, ":", sc->rxon.wlap, ":", sc->rxon.bssid, ":",
4951             le16toh(sc->rxon.associd), le32toh(sc->rxon.filter));
4952         error = iwn_cmd(sc, IWN_CMD_RXON, &sc->rxon, hal->rxonsz, 1);
4953         if (error != 0) {
4954                 device_printf(sc->sc_dev,
4955                     "%s: could not update configuration, error %d\n",
4956                     __func__, error);
4957                 return error;
4958         }
4959
4960         /* Configuration has changed, set TX power accordingly. */
4961         error = hal->set_txpower(sc, ni->ni_chan, 1);
4962         if (error != 0) {
4963                 device_printf(sc->sc_dev,
4964                     "%s: could not set Tx power, error %d\n", __func__, error);
4965                 return error;
4966         }
4967
4968         /* Add BSS node. */
4969         memset(&node, 0, sizeof node);
4970         IEEE80211_ADDR_COPY(node.macaddr, ni->ni_macaddr);
4971         node.id = IWN_ID_BSS;
4972 #ifdef notyet
4973         node.htflags = htole32(IWN_AMDPU_SIZE_FACTOR(3) |
4974             IWN_AMDPU_DENSITY(5));      /* 2us */
4975 #endif
4976         DPRINTF(sc, IWN_DEBUG_STATE, "%s: add BSS node, id %d htflags 0x%x\n",
4977             __func__, node.id, le32toh(node.htflags));
4978         error = hal->add_node(sc, &node, 1);
4979         if (error != 0) {
4980                 device_printf(sc->sc_dev, "could not add BSS node\n");
4981                 return error;
4982         }
4983         DPRINTF(sc, IWN_DEBUG_STATE, "setting link quality for node %d\n",
4984             node.id);
4985         error = iwn_set_link_quality(sc, node.id, 1);
4986         if (error != 0) {
4987                 device_printf(sc->sc_dev,
4988                     "%s: could not setup MRR for node %d, error %d\n",
4989                     __func__, node.id, error);
4990                 return error;
4991         }
4992
4993         error = iwn_init_sensitivity(sc);
4994         if (error != 0) {
4995                 device_printf(sc->sc_dev,
4996                     "%s: could not set sensitivity, error %d\n",
4997                     __func__, error);
4998                 return error;
4999         }
5000
5001         /* Start periodic calibration timer. */
5002         sc->calib.state = IWN_CALIB_STATE_ASSOC;
5003         iwn_calib_reset(sc);
5004
5005         /* Link LED always on while associated. */
5006         iwn_set_led(sc, IWN_LED_LINK, 0, 1);
5007
5008         return 0;
5009 #undef MS
5010 }
5011
5012 #if 0   /* HT */
5013 /*
5014  * This function is called by upper layer when an ADDBA request is received
5015  * from another STA and before the ADDBA response is sent.
5016  */
5017 static int
5018 iwn_ampdu_rx_start(struct ieee80211com *ic, struct ieee80211_node *ni,
5019     uint8_t tid)
5020 {
5021         struct ieee80211_rx_ba *ba = &ni->ni_rx_ba[tid];
5022         struct iwn_softc *sc = ic->ic_softc;
5023         struct iwn_node *wn = (void *)ni;
5024         struct iwn_node_info node;
5025
5026         memset(&node, 0, sizeof node);
5027         node.id = wn->id;
5028         node.control = IWN_NODE_UPDATE;
5029         node.flags = IWN_FLAG_SET_ADDBA;
5030         node.addba_tid = tid;
5031         node.addba_ssn = htole16(ba->ba_winstart);
5032         DPRINTF(sc, IWN_DEBUG_RECV, "ADDBA RA=%d TID=%d SSN=%d\n",
5033             wn->id, tid, ba->ba_winstart));
5034         return sc->sc_hal->add_node(sc, &node, 1);
5035 }
5036
5037 /*
5038  * This function is called by upper layer on teardown of an HT-immediate
5039  * Block Ack agreement (eg. uppon receipt of a DELBA frame.)
5040  */
5041 static void
5042 iwn_ampdu_rx_stop(struct ieee80211com *ic, struct ieee80211_node *ni,
5043     uint8_t tid)
5044 {
5045         struct iwn_softc *sc = ic->ic_softc;
5046         struct iwn_node *wn = (void *)ni;
5047         struct iwn_node_info node;
5048
5049         memset(&node, 0, sizeof node);
5050         node.id = wn->id;
5051         node.control = IWN_NODE_UPDATE;
5052         node.flags = IWN_FLAG_SET_DELBA;
5053         node.delba_tid = tid;
5054         DPRINTF(sc, IWN_DEBUG_RECV, "DELBA RA=%d TID=%d\n", wn->id, tid);
5055         (void)sc->sc_hal->add_node(sc, &node, 1);
5056 }
5057
5058 /*
5059  * This function is called by upper layer when an ADDBA response is received
5060  * from another STA.
5061  */
5062 static int
5063 iwn_ampdu_tx_start(struct ieee80211com *ic, struct ieee80211_node *ni,
5064     uint8_t tid)
5065 {
5066         struct ieee80211_tx_ba *ba = &ni->ni_tx_ba[tid];
5067         struct iwn_softc *sc = ic->ic_softc;
5068         const struct iwn_hal *hal = sc->sc_hal;
5069         struct iwn_node *wn = (void *)ni;
5070         struct iwn_node_info node;
5071         int error;
5072
5073         /* Enable TX for the specified RA/TID. */
5074         wn->disable_tid &= ~(1 << tid);
5075         memset(&node, 0, sizeof node);
5076         node.id = wn->id;
5077         node.control = IWN_NODE_UPDATE;
5078         node.flags = IWN_FLAG_SET_DISABLE_TID;
5079         node.disable_tid = htole16(wn->disable_tid);
5080         error = hal->add_node(sc, &node, 1);
5081         if (error != 0)
5082                 return error;
5083
5084         if ((error = iwn_nic_lock(sc)) != 0)
5085                 return error;
5086         hal->ampdu_tx_start(sc, ni, tid, ba->ba_winstart);
5087         iwn_nic_unlock(sc);
5088         return 0;
5089 }
5090
5091 static void
5092 iwn_ampdu_tx_stop(struct ieee80211com *ic, struct ieee80211_node *ni,
5093     uint8_t tid)
5094 {
5095         struct ieee80211_tx_ba *ba = &ni->ni_tx_ba[tid];
5096         struct iwn_softc *sc = ic->ic_softc;
5097         int error;
5098
5099         error = iwn_nic_lock(sc);
5100         if (error != 0)
5101                 return;
5102         sc->sc_hal->ampdu_tx_stop(sc, tid, ba->ba_winstart);
5103         iwn_nic_unlock(sc);
5104 }
5105
5106 static void
5107 iwn4965_ampdu_tx_start(struct iwn_softc *sc, struct ieee80211_node *ni,
5108     uint8_t tid, uint16_t ssn)
5109 {
5110         struct iwn_node *wn = (void *)ni;
5111         int qid = 7 + tid;
5112
5113         /* Stop TX scheduler while we're changing its configuration. */
5114         iwn_prph_write(sc, IWN4965_SCHED_QUEUE_STATUS(qid),
5115             IWN4965_TXQ_STATUS_CHGACT);
5116
5117         /* Assign RA/TID translation to the queue. */
5118         iwn_mem_write_2(sc, sc->sched_base + IWN4965_SCHED_TRANS_TBL(qid),
5119             wn->id << 4 | tid);
5120
5121         /* Enable chain-building mode for the queue. */
5122         iwn_prph_setbits(sc, IWN4965_SCHED_QCHAIN_SEL, 1 << qid);
5123
5124         /* Set starting sequence number from the ADDBA request. */
5125         IWN_WRITE(sc, IWN_HBUS_TARG_WRPTR, qid << 8 | (ssn & 0xff));
5126         iwn_prph_write(sc, IWN4965_SCHED_QUEUE_RDPTR(qid), ssn);
5127
5128         /* Set scheduler window size. */
5129         iwn_mem_write(sc, sc->sched_base + IWN4965_SCHED_QUEUE_OFFSET(qid),
5130             IWN_SCHED_WINSZ);
5131         /* Set scheduler frame limit. */
5132         iwn_mem_write(sc, sc->sched_base + IWN4965_SCHED_QUEUE_OFFSET(qid) + 4,
5133             IWN_SCHED_LIMIT << 16);
5134
5135         /* Enable interrupts for the queue. */
5136         iwn_prph_setbits(sc, IWN4965_SCHED_INTR_MASK, 1 << qid);
5137
5138         /* Mark the queue as active. */
5139         iwn_prph_write(sc, IWN4965_SCHED_QUEUE_STATUS(qid),
5140             IWN4965_TXQ_STATUS_ACTIVE | IWN4965_TXQ_STATUS_AGGR_ENA |
5141             iwn_tid2fifo[tid] << 1);
5142 }
5143
5144 static void
5145 iwn4965_ampdu_tx_stop(struct iwn_softc *sc, uint8_t tid, uint16_t ssn)
5146 {
5147         int qid = 7 + tid;
5148
5149         /* Stop TX scheduler while we're changing its configuration. */
5150         iwn_prph_write(sc, IWN4965_SCHED_QUEUE_STATUS(qid),
5151             IWN4965_TXQ_STATUS_CHGACT);
5152
5153         /* Set starting sequence number from the ADDBA request. */
5154         IWN_WRITE(sc, IWN_HBUS_TARG_WRPTR, qid << 8 | (ssn & 0xff));
5155         iwn_prph_write(sc, IWN4965_SCHED_QUEUE_RDPTR(qid), ssn);
5156
5157         /* Disable interrupts for the queue. */
5158         iwn_prph_clrbits(sc, IWN4965_SCHED_INTR_MASK, 1 << qid);
5159
5160         /* Mark the queue as inactive. */
5161         iwn_prph_write(sc, IWN4965_SCHED_QUEUE_STATUS(qid),
5162             IWN4965_TXQ_STATUS_INACTIVE | iwn_tid2fifo[tid] << 1);
5163 }
5164
5165 static void
5166 iwn5000_ampdu_tx_start(struct iwn_softc *sc, struct ieee80211_node *ni,
5167     uint8_t tid, uint16_t ssn)
5168 {
5169         struct iwn_node *wn = (void *)ni;
5170         int qid = 10 + tid;
5171
5172         /* Stop TX scheduler while we're changing its configuration. */
5173         iwn_prph_write(sc, IWN5000_SCHED_QUEUE_STATUS(qid),
5174             IWN5000_TXQ_STATUS_CHGACT);
5175
5176         /* Assign RA/TID translation to the queue. */
5177         iwn_mem_write_2(sc, sc->sched_base + IWN5000_SCHED_TRANS_TBL(qid),
5178             wn->id << 4 | tid);
5179
5180         /* Enable chain-building mode for the queue. */
5181         iwn_prph_setbits(sc, IWN5000_SCHED_QCHAIN_SEL, 1 << qid);
5182
5183         /* Enable aggregation for the queue. */
5184         iwn_prph_setbits(sc, IWN5000_SCHED_AGGR_SEL, 1 << qid);
5185
5186         /* Set starting sequence number from the ADDBA request. */
5187         IWN_WRITE(sc, IWN_HBUS_TARG_WRPTR, qid << 8 | (ssn & 0xff));
5188         iwn_prph_write(sc, IWN5000_SCHED_QUEUE_RDPTR(qid), ssn);
5189
5190         /* Set scheduler window size and frame limit. */
5191         iwn_mem_write(sc, sc->sched_base + IWN5000_SCHED_QUEUE_OFFSET(qid) + 4,
5192             IWN_SCHED_LIMIT << 16 | IWN_SCHED_WINSZ);
5193
5194         /* Enable interrupts for the queue. */
5195         iwn_prph_setbits(sc, IWN5000_SCHED_INTR_MASK, 1 << qid);
5196
5197         /* Mark the queue as active. */
5198         iwn_prph_write(sc, IWN5000_SCHED_QUEUE_STATUS(qid),
5199             IWN5000_TXQ_STATUS_ACTIVE | iwn_tid2fifo[tid]);
5200 }
5201
5202 static void
5203 iwn5000_ampdu_tx_stop(struct iwn_softc *sc, uint8_t tid, uint16_t ssn)
5204 {
5205         int qid = 10 + tid;
5206
5207         /* Stop TX scheduler while we're changing its configuration. */
5208         iwn_prph_write(sc, IWN5000_SCHED_QUEUE_STATUS(qid),
5209             IWN5000_TXQ_STATUS_CHGACT);
5210
5211         /* Disable aggregation for the queue. */
5212         iwn_prph_clrbits(sc, IWN5000_SCHED_AGGR_SEL, 1 << qid);
5213
5214         /* Set starting sequence number from the ADDBA request. */
5215         IWN_WRITE(sc, IWN_HBUS_TARG_WRPTR, qid << 8 | (ssn & 0xff));
5216         iwn_prph_write(sc, IWN5000_SCHED_QUEUE_RDPTR(qid), ssn);
5217
5218         /* Disable interrupts for the queue. */
5219         iwn_prph_clrbits(sc, IWN5000_SCHED_INTR_MASK, 1 << qid);
5220
5221         /* Mark the queue as inactive. */
5222         iwn_prph_write(sc, IWN5000_SCHED_QUEUE_STATUS(qid),
5223             IWN5000_TXQ_STATUS_INACTIVE | iwn_tid2fifo[tid]);
5224 }
5225 #endif
5226
5227 /*
5228  * Query calibration tables from the initialization firmware.  We do this
5229  * only once at first boot.  Called from a process context.
5230  */
5231 static int
5232 iwn5000_query_calibration(struct iwn_softc *sc)
5233 {
5234         struct iwn5000_calib_config cmd;
5235         int error;
5236
5237         memset(&cmd, 0, sizeof cmd);
5238         cmd.ucode.once.enable = 0xffffffff;
5239         cmd.ucode.once.start  = 0xffffffff;
5240         cmd.ucode.once.send   = 0xffffffff;
5241         cmd.ucode.flags       = 0xffffffff;
5242         DPRINTF(sc, IWN_DEBUG_CALIBRATE, "%s: sending calibration query\n",
5243             __func__);
5244         error = iwn_cmd(sc, IWN5000_CMD_CALIB_CONFIG, &cmd, sizeof cmd, 0);
5245         if (error != 0)
5246                 return error;
5247
5248         /* Wait at most two seconds for calibration to complete. */
5249         if (!(sc->sc_flags & IWN_FLAG_CALIB_DONE)) {
5250                 error = zsleep(sc, &wlan_global_serializer,
5251                                0, "iwninit", 2 * hz);
5252         }
5253         return error;
5254 }
5255
5256 /*
5257  * Send calibration results to the runtime firmware.  These results were
5258  * obtained on first boot from the initialization firmware.
5259  */
5260 static int
5261 iwn5000_send_calibration(struct iwn_softc *sc)
5262 {
5263         int idx, error;
5264
5265         for (idx = 0; idx < 5; idx++) {
5266                 if (sc->calibcmd[idx].buf == NULL)
5267                         continue;       /* No results available. */
5268                 DPRINTF(sc, IWN_DEBUG_CALIBRATE,
5269                     "send calibration result idx=%d len=%d\n",
5270                     idx, sc->calibcmd[idx].len);
5271                 error = iwn_cmd(sc, IWN_CMD_PHY_CALIB, sc->calibcmd[idx].buf,
5272                     sc->calibcmd[idx].len, 0);
5273                 if (error != 0) {
5274                         device_printf(sc->sc_dev,
5275                             "%s: could not send calibration result, error %d\n",
5276                             __func__, error);
5277                         return error;
5278                 }
5279         }
5280         return 0;
5281 }
5282
5283 static int
5284 iwn5000_send_wimax_coex(struct iwn_softc *sc)
5285 {
5286         struct iwn5000_wimax_coex wimax;
5287
5288 #ifdef notyet
5289         if (sc->hw_type == IWN_HW_REV_TYPE_6050) {
5290                 /* Enable WiMAX coexistence for combo adapters. */
5291                 wimax.flags =
5292                     IWN_WIMAX_COEX_ASSOC_WA_UNMASK |
5293                     IWN_WIMAX_COEX_UNASSOC_WA_UNMASK |
5294                     IWN_WIMAX_COEX_STA_TABLE_VALID |
5295                     IWN_WIMAX_COEX_ENABLE;
5296                 memcpy(wimax.events, iwn6050_wimax_events,
5297                     sizeof iwn6050_wimax_events);
5298         } else
5299 #endif
5300         {
5301                 /* Disable WiMAX coexistence. */
5302                 wimax.flags = 0;
5303                 memset(wimax.events, 0, sizeof wimax.events);
5304         }
5305         DPRINTF(sc, IWN_DEBUG_RESET, "%s: Configuring WiMAX coexistence\n",
5306             __func__);
5307         return iwn_cmd(sc, IWN5000_CMD_WIMAX_COEX, &wimax, sizeof wimax, 0);
5308 }
5309
5310 /*
5311  * This function is called after the runtime firmware notifies us of its
5312  * readiness (called in a process context.)
5313  */
5314 static int
5315 iwn4965_post_alive(struct iwn_softc *sc)
5316 {
5317         int error, qid;
5318
5319         if ((error = iwn_nic_lock(sc)) != 0)
5320                 return error;
5321
5322         /* Clear TX scheduler state in SRAM. */
5323         sc->sched_base = iwn_prph_read(sc, IWN_SCHED_SRAM_ADDR);
5324         iwn_mem_set_region_4(sc, sc->sched_base + IWN4965_SCHED_CTX_OFF, 0,
5325             IWN4965_SCHED_CTX_LEN / sizeof (uint32_t));
5326
5327         /* Set physical address of TX scheduler rings (1KB aligned.) */
5328         iwn_prph_write(sc, IWN4965_SCHED_DRAM_ADDR, sc->sched_dma.paddr >> 10);
5329
5330         IWN_SETBITS(sc, IWN_FH_TX_CHICKEN, IWN_FH_TX_CHICKEN_SCHED_RETRY);
5331
5332         /* Disable chain mode for all our 16 queues. */
5333         iwn_prph_write(sc, IWN4965_SCHED_QCHAIN_SEL, 0);
5334
5335         for (qid = 0; qid < IWN4965_NTXQUEUES; qid++) {
5336                 iwn_prph_write(sc, IWN4965_SCHED_QUEUE_RDPTR(qid), 0);
5337                 IWN_WRITE(sc, IWN_HBUS_TARG_WRPTR, qid << 8 | 0);
5338
5339                 /* Set scheduler window size. */
5340                 iwn_mem_write(sc, sc->sched_base +
5341                     IWN4965_SCHED_QUEUE_OFFSET(qid), IWN_SCHED_WINSZ);
5342                 /* Set scheduler frame limit. */
5343                 iwn_mem_write(sc, sc->sched_base +
5344                     IWN4965_SCHED_QUEUE_OFFSET(qid) + 4,
5345                     IWN_SCHED_LIMIT << 16);
5346         }
5347
5348         /* Enable interrupts for all our 16 queues. */
5349         iwn_prph_write(sc, IWN4965_SCHED_INTR_MASK, 0xffff);
5350         /* Identify TX FIFO rings (0-7). */
5351         iwn_prph_write(sc, IWN4965_SCHED_TXFACT, 0xff);
5352
5353         /* Mark TX rings (4 EDCA + cmd + 2 HCCA) as active. */
5354         for (qid = 0; qid < 7; qid++) {
5355                 static uint8_t qid2fifo[] = { 3, 2, 1, 0, 4, 5, 6 };
5356                 iwn_prph_write(sc, IWN4965_SCHED_QUEUE_STATUS(qid),
5357                     IWN4965_TXQ_STATUS_ACTIVE | qid2fifo[qid] << 1);
5358         }
5359         iwn_nic_unlock(sc);
5360         return 0;
5361 }
5362
5363 /*
5364  * This function is called after the initialization or runtime firmware
5365  * notifies us of its readiness (called in a process context.)
5366  */
5367 static int
5368 iwn5000_post_alive(struct iwn_softc *sc)
5369 {
5370         int error, qid;
5371
5372         /* Switch to using ICT interrupt mode. */
5373         iwn5000_ict_reset(sc);
5374
5375         error = iwn_nic_lock(sc);
5376         if (error != 0)
5377                 return error;
5378
5379         /* Clear TX scheduler state in SRAM. */
5380         sc->sched_base = iwn_prph_read(sc, IWN_SCHED_SRAM_ADDR);
5381         iwn_mem_set_region_4(sc, sc->sched_base + IWN5000_SCHED_CTX_OFF, 0,
5382             IWN5000_SCHED_CTX_LEN / sizeof (uint32_t));
5383
5384         /* Set physical address of TX scheduler rings (1KB aligned.) */
5385         iwn_prph_write(sc, IWN5000_SCHED_DRAM_ADDR, sc->sched_dma.paddr >> 10);
5386
5387         IWN_SETBITS(sc, IWN_FH_TX_CHICKEN, IWN_FH_TX_CHICKEN_SCHED_RETRY);
5388
5389         /* Enable chain mode for all queues, except command queue. */
5390         iwn_prph_write(sc, IWN5000_SCHED_QCHAIN_SEL, 0xfffef);
5391         iwn_prph_write(sc, IWN5000_SCHED_AGGR_SEL, 0);
5392
5393         for (qid = 0; qid < IWN5000_NTXQUEUES; qid++) {
5394                 iwn_prph_write(sc, IWN5000_SCHED_QUEUE_RDPTR(qid), 0);
5395                 IWN_WRITE(sc, IWN_HBUS_TARG_WRPTR, qid << 8 | 0);
5396
5397                 iwn_mem_write(sc, sc->sched_base +
5398                     IWN5000_SCHED_QUEUE_OFFSET(qid), 0);
5399                 /* Set scheduler window size and frame limit. */
5400                 iwn_mem_write(sc, sc->sched_base +
5401                     IWN5000_SCHED_QUEUE_OFFSET(qid) + 4,
5402                     IWN_SCHED_LIMIT << 16 | IWN_SCHED_WINSZ);
5403         }
5404
5405         /* Enable interrupts for all our 20 queues. */
5406         iwn_prph_write(sc, IWN5000_SCHED_INTR_MASK, 0xfffff);
5407         /* Identify TX FIFO rings (0-7). */
5408         iwn_prph_write(sc, IWN5000_SCHED_TXFACT, 0xff);
5409
5410         /* Mark TX rings (4 EDCA + cmd + 2 HCCA) as active. */
5411         for (qid = 0; qid < 7; qid++) {
5412                 static uint8_t qid2fifo[] = { 3, 2, 1, 0, 7, 5, 6 };
5413                 iwn_prph_write(sc, IWN5000_SCHED_QUEUE_STATUS(qid),
5414                     IWN5000_TXQ_STATUS_ACTIVE | qid2fifo[qid]);
5415         }
5416         iwn_nic_unlock(sc);
5417
5418         /* Configure WiMAX coexistence for combo adapters. */
5419         error = iwn5000_send_wimax_coex(sc);
5420         if (error != 0) {
5421                 device_printf(sc->sc_dev,
5422                     "%s: could not configure WiMAX coexistence, error %d\n",
5423                     __func__, error);
5424                 return error;
5425         }
5426         if (sc->hw_type != IWN_HW_REV_TYPE_5150) {
5427                 struct iwn5000_phy_calib_crystal cmd;
5428
5429                 /* Perform crystal calibration. */
5430                 memset(&cmd, 0, sizeof cmd);
5431                 cmd.code = IWN5000_PHY_CALIB_CRYSTAL;
5432                 cmd.ngroups = 1;
5433                 cmd.isvalid = 1;
5434                 cmd.cap_pin[0] = le32toh(sc->eeprom_crystal) & 0xff;
5435                 cmd.cap_pin[1] = (le32toh(sc->eeprom_crystal) >> 16) & 0xff;
5436                 DPRINTF(sc, IWN_DEBUG_CALIBRATE,
5437                     "sending crystal calibration %d, %d\n",
5438                     cmd.cap_pin[0], cmd.cap_pin[1]);
5439                 error = iwn_cmd(sc, IWN_CMD_PHY_CALIB, &cmd, sizeof cmd, 0);
5440                 if (error != 0) {
5441                         device_printf(sc->sc_dev,
5442                             "%s: crystal calibration failed, error %d\n",
5443                             __func__, error);
5444                         return error;
5445                 }
5446         }
5447         if (!(sc->sc_flags & IWN_FLAG_CALIB_DONE)) {
5448                 /* Query calibration from the initialization firmware. */
5449                 error = iwn5000_query_calibration(sc);
5450                 if (error != 0) {
5451                         device_printf(sc->sc_dev,
5452                             "%s: could not query calibration, error %d\n",
5453                             __func__, error);
5454                         return error;
5455                 }
5456                 /*
5457                  * We have the calibration results now, reboot with the
5458                  * runtime firmware (call ourselves recursively!)
5459                  */
5460                 iwn_hw_stop(sc);
5461                 error = iwn_hw_init(sc);
5462         } else {
5463                 /* Send calibration results to runtime firmware. */
5464                 error = iwn5000_send_calibration(sc);
5465         }
5466         return error;
5467 }
5468
5469 /*
5470  * The firmware boot code is small and is intended to be copied directly into
5471  * the NIC internal memory (no DMA transfer.)
5472  */
5473 static int
5474 iwn4965_load_bootcode(struct iwn_softc *sc, const uint8_t *ucode, int size)
5475 {
5476         int error, ntries;
5477
5478         size /= sizeof (uint32_t);
5479
5480         error = iwn_nic_lock(sc);
5481         if (error != 0)
5482                 return error;
5483
5484         /* Copy microcode image into NIC memory. */
5485         iwn_prph_write_region_4(sc, IWN_BSM_SRAM_BASE,
5486             (const uint32_t *)ucode, size);
5487
5488         iwn_prph_write(sc, IWN_BSM_WR_MEM_SRC, 0);
5489         iwn_prph_write(sc, IWN_BSM_WR_MEM_DST, IWN_FW_TEXT_BASE);
5490         iwn_prph_write(sc, IWN_BSM_WR_DWCOUNT, size);
5491
5492         /* Start boot load now. */
5493         iwn_prph_write(sc, IWN_BSM_WR_CTRL, IWN_BSM_WR_CTRL_START);
5494
5495         /* Wait for transfer to complete. */
5496         for (ntries = 0; ntries < 1000; ntries++) {
5497                 if (!(iwn_prph_read(sc, IWN_BSM_WR_CTRL) &
5498                     IWN_BSM_WR_CTRL_START))
5499                         break;
5500                 DELAY(10);
5501         }
5502         if (ntries == 1000) {
5503                 device_printf(sc->sc_dev, "%s: could not load boot firmware\n",
5504                     __func__);
5505                 iwn_nic_unlock(sc);
5506                 return ETIMEDOUT;
5507         }
5508
5509         /* Enable boot after power up. */
5510         iwn_prph_write(sc, IWN_BSM_WR_CTRL, IWN_BSM_WR_CTRL_START_EN);
5511
5512         iwn_nic_unlock(sc);
5513         return 0;
5514 }
5515
5516 static int
5517 iwn4965_load_firmware(struct iwn_softc *sc)
5518 {
5519         struct iwn_fw_info *fw = &sc->fw;
5520         struct iwn_dma_info *dma = &sc->fw_dma;
5521         int error;
5522
5523         /* Copy initialization sections into pre-allocated DMA-safe memory. */
5524         memcpy(dma->vaddr, fw->init.data, fw->init.datasz);
5525         bus_dmamap_sync(sc->fw_dma.tag, dma->map, BUS_DMASYNC_PREWRITE);
5526         memcpy(dma->vaddr + IWN4965_FW_DATA_MAXSZ,
5527             fw->init.text, fw->init.textsz);
5528         bus_dmamap_sync(sc->fw_dma.tag, dma->map, BUS_DMASYNC_PREWRITE);
5529
5530         /* Tell adapter where to find initialization sections. */
5531         error = iwn_nic_lock(sc);
5532         if (error != 0)
5533                 return error;
5534         iwn_prph_write(sc, IWN_BSM_DRAM_DATA_ADDR, dma->paddr >> 4);
5535         iwn_prph_write(sc, IWN_BSM_DRAM_DATA_SIZE, fw->init.datasz);
5536         iwn_prph_write(sc, IWN_BSM_DRAM_TEXT_ADDR,
5537             (dma->paddr + IWN4965_FW_DATA_MAXSZ) >> 4);
5538         iwn_prph_write(sc, IWN_BSM_DRAM_TEXT_SIZE, fw->init.textsz);
5539         iwn_nic_unlock(sc);
5540
5541         /* Load firmware boot code. */
5542         error = iwn4965_load_bootcode(sc, fw->boot.text, fw->boot.textsz);
5543         if (error != 0) {
5544                 device_printf(sc->sc_dev, "%s: could not load boot firmware\n",
5545                     __func__);
5546                 return error;
5547         }
5548         /* Now press "execute". */
5549         IWN_WRITE(sc, IWN_RESET, 0);
5550
5551         /* Wait at most one second for first alive notification. */
5552         error = zsleep(sc, &wlan_global_serializer, 0, "iwninit", hz);
5553         if (error) {
5554                 device_printf(sc->sc_dev,
5555                     "%s: timeout waiting for adapter to initialize, error %d\n",
5556                     __func__, error);
5557                 return error;
5558         }
5559
5560         /* Retrieve current temperature for initial TX power calibration. */
5561         sc->rawtemp = sc->ucode_info.temp[3].chan20MHz;
5562         sc->temp = iwn4965_get_temperature(sc);
5563
5564         /* Copy runtime sections into pre-allocated DMA-safe memory. */
5565         memcpy(dma->vaddr, fw->main.data, fw->main.datasz);
5566         bus_dmamap_sync(sc->fw_dma.tag, dma->map, BUS_DMASYNC_PREWRITE);
5567         memcpy(dma->vaddr + IWN4965_FW_DATA_MAXSZ,
5568             fw->main.text, fw->main.textsz);
5569         bus_dmamap_sync(sc->fw_dma.tag, dma->map, BUS_DMASYNC_PREWRITE);
5570
5571         /* Tell adapter where to find runtime sections. */
5572         error = iwn_nic_lock(sc);
5573         if (error != 0)
5574                 return error;
5575
5576         iwn_prph_write(sc, IWN_BSM_DRAM_DATA_ADDR, dma->paddr >> 4);
5577         iwn_prph_write(sc, IWN_BSM_DRAM_DATA_SIZE, fw->main.datasz);
5578         iwn_prph_write(sc, IWN_BSM_DRAM_TEXT_ADDR,
5579             (dma->paddr + IWN4965_FW_DATA_MAXSZ) >> 4);
5580         iwn_prph_write(sc, IWN_BSM_DRAM_TEXT_SIZE,
5581             IWN_FW_UPDATED | fw->main.textsz);
5582         iwn_nic_unlock(sc);
5583
5584         return 0;
5585 }
5586
5587 static int
5588 iwn5000_load_firmware_section(struct iwn_softc *sc, uint32_t dst,
5589     const uint8_t *section, int size)
5590 {
5591         struct iwn_dma_info *dma = &sc->fw_dma;
5592         int error;
5593
5594         /* Copy firmware section into pre-allocated DMA-safe memory. */
5595         memcpy(dma->vaddr, section, size);
5596         bus_dmamap_sync(sc->fw_dma.tag, dma->map, BUS_DMASYNC_PREWRITE);
5597
5598         error = iwn_nic_lock(sc);
5599         if (error != 0)
5600                 return error;
5601
5602         IWN_WRITE(sc, IWN_FH_TX_CONFIG(IWN_SRVC_DMACHNL),
5603             IWN_FH_TX_CONFIG_DMA_PAUSE);
5604
5605         IWN_WRITE(sc, IWN_FH_SRAM_ADDR(IWN_SRVC_DMACHNL), dst);
5606         IWN_WRITE(sc, IWN_FH_TFBD_CTRL0(IWN_SRVC_DMACHNL),
5607             IWN_LOADDR(dma->paddr));
5608         IWN_WRITE(sc, IWN_FH_TFBD_CTRL1(IWN_SRVC_DMACHNL),
5609             IWN_HIADDR(dma->paddr) << 28 | size);
5610         IWN_WRITE(sc, IWN_FH_TXBUF_STATUS(IWN_SRVC_DMACHNL),
5611             IWN_FH_TXBUF_STATUS_TBNUM(1) |
5612             IWN_FH_TXBUF_STATUS_TBIDX(1) |
5613             IWN_FH_TXBUF_STATUS_TFBD_VALID);
5614
5615         /* Kick Flow Handler to start DMA transfer. */
5616         IWN_WRITE(sc, IWN_FH_TX_CONFIG(IWN_SRVC_DMACHNL),
5617             IWN_FH_TX_CONFIG_DMA_ENA | IWN_FH_TX_CONFIG_CIRQ_HOST_ENDTFD);
5618
5619         iwn_nic_unlock(sc);
5620
5621         /*
5622          * Wait at most five seconds for FH DMA transfer to complete.
5623          */
5624         error = zsleep(sc, &wlan_global_serializer, 0, "iwninit", hz);
5625         return (error);
5626 }
5627
5628 static int
5629 iwn5000_load_firmware(struct iwn_softc *sc)
5630 {
5631         struct iwn_fw_part *fw;
5632         int error;
5633
5634         /* Load the initialization firmware on first boot only. */
5635         fw = (sc->sc_flags & IWN_FLAG_CALIB_DONE) ?
5636             &sc->fw.main : &sc->fw.init;
5637
5638         error = iwn5000_load_firmware_section(sc, IWN_FW_TEXT_BASE,
5639             fw->text, fw->textsz);
5640         if (error != 0) {
5641                 device_printf(sc->sc_dev,
5642                     "%s: could not load firmware %s section, error %d\n",
5643                     __func__, ".text", error);
5644                 return error;
5645         }
5646         error = iwn5000_load_firmware_section(sc, IWN_FW_DATA_BASE,
5647             fw->data, fw->datasz);
5648         if (error != 0) {
5649                 device_printf(sc->sc_dev,
5650                     "%s: could not load firmware %s section, error %d\n",
5651                     __func__, ".data", error);
5652                 return error;
5653         }
5654
5655         /* Now press "execute". */
5656         IWN_WRITE(sc, IWN_RESET, 0);
5657         return 0;
5658 }
5659
5660 static int
5661 iwn_read_firmware(struct iwn_softc *sc)
5662 {
5663         const struct iwn_hal *hal = sc->sc_hal;
5664         struct iwn_fw_info *fw = &sc->fw;
5665         const uint32_t *ptr;
5666         uint32_t rev;
5667         size_t size;
5668         int wlan_serialized;
5669
5670         /*
5671          * Read firmware image from filesystem.  The firmware can block
5672          * in a taskq and deadlock against our serializer so unlock
5673          * while we do tihs.
5674          */
5675         wlan_serialized = IS_SERIALIZED(&wlan_global_serializer);
5676         if (wlan_serialized)
5677                 wlan_serialize_exit();
5678         sc->fw_fp = firmware_get(sc->fwname);
5679         if (wlan_serialized)
5680                 wlan_serialize_enter();
5681         if (sc->fw_fp == NULL) {
5682                 device_printf(sc->sc_dev,
5683                     "%s: could not load firmare image \"%s\"\n", __func__,
5684                     sc->fwname);
5685                 return EINVAL;
5686         }
5687
5688         size = sc->fw_fp->datasize;
5689         if (size < 28) {
5690                 device_printf(sc->sc_dev,
5691                     "%s: truncated firmware header: %zu bytes\n",
5692                     __func__, size);
5693                 return EINVAL;
5694         }
5695
5696         /* Process firmware header. */
5697         ptr = (const uint32_t *)sc->fw_fp->data;
5698         rev = le32toh(*ptr++);
5699         /* Check firmware API version. */
5700         if (IWN_FW_API(rev) <= 1) {
5701                 device_printf(sc->sc_dev,
5702                     "%s: bad firmware, need API version >=2\n", __func__);
5703                 return EINVAL;
5704         }
5705         if (IWN_FW_API(rev) >= 3) {
5706                 /* Skip build number (version 2 header). */
5707                 size -= 4;
5708                 ptr++;
5709         }
5710         fw->main.textsz = le32toh(*ptr++);
5711         fw->main.datasz = le32toh(*ptr++);
5712         fw->init.textsz = le32toh(*ptr++);
5713         fw->init.datasz = le32toh(*ptr++);
5714         fw->boot.textsz = le32toh(*ptr++);
5715         size -= 24;
5716
5717         /* Sanity-check firmware header. */
5718         if (fw->main.textsz > hal->fw_text_maxsz ||
5719             fw->main.datasz > hal->fw_data_maxsz ||
5720             fw->init.textsz > hal->fw_text_maxsz ||
5721             fw->init.datasz > hal->fw_data_maxsz ||
5722             fw->boot.textsz > IWN_FW_BOOT_TEXT_MAXSZ ||
5723             (fw->boot.textsz & 3) != 0) {
5724                 device_printf(sc->sc_dev, "%s: invalid firmware header\n",
5725                     __func__);
5726                 return EINVAL;
5727         }
5728
5729         /* Check that all firmware sections fit. */
5730         if (fw->main.textsz + fw->main.datasz + fw->init.textsz +
5731             fw->init.datasz + fw->boot.textsz > size) {
5732                 device_printf(sc->sc_dev,
5733                     "%s: firmware file too short: %zu bytes\n",
5734                     __func__, size);
5735                 return EINVAL;
5736         }
5737
5738         /* Get pointers to firmware sections. */
5739         fw->main.text = (const uint8_t *)ptr;
5740         fw->main.data = fw->main.text + fw->main.textsz;
5741         fw->init.text = fw->main.data + fw->main.datasz;
5742         fw->init.data = fw->init.text + fw->init.textsz;
5743         fw->boot.text = fw->init.data + fw->init.datasz;
5744
5745         return 0;
5746 }
5747
5748 static int
5749 iwn_clock_wait(struct iwn_softc *sc)
5750 {
5751         int ntries;
5752
5753         /* Set "initialization complete" bit. */
5754         IWN_SETBITS(sc, IWN_GP_CNTRL, IWN_GP_CNTRL_INIT_DONE);
5755
5756         /* Wait for clock stabilization. */
5757         for (ntries = 0; ntries < 2500; ntries++) {
5758                 if (IWN_READ(sc, IWN_GP_CNTRL) & IWN_GP_CNTRL_MAC_CLOCK_READY)
5759                         return 0;
5760                 DELAY(10);
5761         }
5762         device_printf(sc->sc_dev,
5763             "%s: timeout waiting for clock stabilization\n", __func__);
5764         return ETIMEDOUT;
5765 }
5766
5767 static int
5768 iwn_apm_init(struct iwn_softc *sc)
5769 {
5770         uint32_t tmp;
5771         int error;
5772
5773         /* Disable L0s exit timer (NMI bug workaround.) */
5774         IWN_SETBITS(sc, IWN_GIO_CHICKEN, IWN_GIO_CHICKEN_DIS_L0S_TIMER);
5775         /* Don't wait for ICH L0s (ICH bug workaround.) */
5776         IWN_SETBITS(sc, IWN_GIO_CHICKEN, IWN_GIO_CHICKEN_L1A_NO_L0S_RX);
5777
5778         /* Set FH wait threshold to max (HW bug under stress workaround.) */
5779         IWN_SETBITS(sc, IWN_DBG_HPET_MEM, 0xffff0000);
5780
5781         /* Enable HAP INTA to move adapter from L1a to L0s. */
5782         IWN_SETBITS(sc, IWN_HW_IF_CONFIG, IWN_HW_IF_CONFIG_HAP_WAKE_L1A);
5783
5784         /* Retrieve PCIe Active State Power Management (ASPM). */
5785         tmp = pci_read_config(sc->sc_dev, sc->sc_cap_off + 0x10, 1);
5786         /* Workaround for HW instability in PCIe L0->L0s->L1 transition. */
5787         if (tmp & 0x02) /* L1 Entry enabled. */
5788                 IWN_SETBITS(sc, IWN_GIO, IWN_GIO_L0S_ENA);
5789         else
5790                 IWN_CLRBITS(sc, IWN_GIO, IWN_GIO_L0S_ENA);
5791
5792         if (sc->hw_type != IWN_HW_REV_TYPE_4965 &&
5793             sc->hw_type != IWN_HW_REV_TYPE_6000 &&
5794             sc->hw_type != IWN_HW_REV_TYPE_6050)
5795                 IWN_SETBITS(sc, IWN_ANA_PLL, IWN_ANA_PLL_INIT);
5796
5797         /* Wait for clock stabilization before accessing prph. */
5798         error = iwn_clock_wait(sc);
5799         if (error != 0)
5800                 return error;
5801
5802         error = iwn_nic_lock(sc);
5803         if (error != 0)
5804                 return error;
5805
5806         if (sc->hw_type == IWN_HW_REV_TYPE_4965) {
5807                 /* Enable DMA and BSM (Bootstrap State Machine.) */
5808                 iwn_prph_write(sc, IWN_APMG_CLK_EN,
5809                     IWN_APMG_CLK_CTRL_DMA_CLK_RQT |
5810                     IWN_APMG_CLK_CTRL_BSM_CLK_RQT);
5811         } else {
5812                 /* Enable DMA. */
5813                 iwn_prph_write(sc, IWN_APMG_CLK_EN,
5814                     IWN_APMG_CLK_CTRL_DMA_CLK_RQT);
5815         }
5816         DELAY(20);
5817
5818         /* Disable L1-Active. */
5819         iwn_prph_setbits(sc, IWN_APMG_PCI_STT, IWN_APMG_PCI_STT_L1A_DIS);
5820         iwn_nic_unlock(sc);
5821
5822         return 0;
5823 }
5824
5825 static void
5826 iwn_apm_stop_master(struct iwn_softc *sc)
5827 {
5828         int ntries;
5829
5830         /* Stop busmaster DMA activity. */
5831         IWN_SETBITS(sc, IWN_RESET, IWN_RESET_STOP_MASTER);
5832         for (ntries = 0; ntries < 100; ntries++) {
5833                 if (IWN_READ(sc, IWN_RESET) & IWN_RESET_MASTER_DISABLED)
5834                         return;
5835                 DELAY(10);
5836         }
5837         device_printf(sc->sc_dev, "%s: timeout waiting for master\n",
5838             __func__);
5839 }
5840
5841 static void
5842 iwn_apm_stop(struct iwn_softc *sc)
5843 {
5844         iwn_apm_stop_master(sc);
5845
5846         /* Reset the entire device. */
5847         IWN_SETBITS(sc, IWN_RESET, IWN_RESET_SW);
5848         DELAY(10);
5849         /* Clear "initialization complete" bit. */
5850         IWN_CLRBITS(sc, IWN_GP_CNTRL, IWN_GP_CNTRL_INIT_DONE);
5851 }
5852
5853 static int
5854 iwn4965_nic_config(struct iwn_softc *sc)
5855 {
5856         if (IWN_RFCFG_TYPE(sc->rfcfg) == 1) {
5857                 /*
5858                  * I don't believe this to be correct but this is what the
5859                  * vendor driver is doing. Probably the bits should not be
5860                  * shifted in IWN_RFCFG_*.
5861                  */
5862                 IWN_SETBITS(sc, IWN_HW_IF_CONFIG,
5863                     IWN_RFCFG_TYPE(sc->rfcfg) |
5864                     IWN_RFCFG_STEP(sc->rfcfg) |
5865                     IWN_RFCFG_DASH(sc->rfcfg));
5866         }
5867         IWN_SETBITS(sc, IWN_HW_IF_CONFIG,
5868             IWN_HW_IF_CONFIG_RADIO_SI | IWN_HW_IF_CONFIG_MAC_SI);
5869         return 0;
5870 }
5871
5872 static int
5873 iwn5000_nic_config(struct iwn_softc *sc)
5874 {
5875         uint32_t tmp;
5876         int error;
5877
5878         if (IWN_RFCFG_TYPE(sc->rfcfg) < 3) {
5879                 IWN_SETBITS(sc, IWN_HW_IF_CONFIG,
5880                     IWN_RFCFG_TYPE(sc->rfcfg) |
5881                     IWN_RFCFG_STEP(sc->rfcfg) |
5882                     IWN_RFCFG_DASH(sc->rfcfg));
5883         }
5884         IWN_SETBITS(sc, IWN_HW_IF_CONFIG,
5885             IWN_HW_IF_CONFIG_RADIO_SI | IWN_HW_IF_CONFIG_MAC_SI);
5886
5887         error = iwn_nic_lock(sc);
5888         if (error != 0)
5889                 return error;
5890         iwn_prph_setbits(sc, IWN_APMG_PS, IWN_APMG_PS_EARLY_PWROFF_DIS);
5891
5892         if (sc->hw_type == IWN_HW_REV_TYPE_1000) {
5893                 /*
5894                  * Select first Switching Voltage Regulator (1.32V) to
5895                  * solve a stability issue related to noisy DC2DC line
5896                  * in the silicon of 1000 Series.
5897                  */
5898                 tmp = iwn_prph_read(sc, IWN_APMG_DIGITAL_SVR);
5899                 tmp &= ~IWN_APMG_DIGITAL_SVR_VOLTAGE_MASK;
5900                 tmp |= IWN_APMG_DIGITAL_SVR_VOLTAGE_1_32;
5901                 iwn_prph_write(sc, IWN_APMG_DIGITAL_SVR, tmp);
5902         }
5903         iwn_nic_unlock(sc);
5904
5905         if (sc->sc_flags & IWN_FLAG_INTERNAL_PA) {
5906                 /* Use internal power amplifier only. */
5907                 IWN_WRITE(sc, IWN_GP_DRIVER, IWN_GP_DRIVER_RADIO_2X2_IPA);
5908         }
5909          if (sc->hw_type == IWN_HW_REV_TYPE_6050 && sc->calib_ver >= 6) {
5910                  /* Indicate that ROM calibration version is >=6. */
5911                  IWN_SETBITS(sc, IWN_GP_DRIVER, IWN_GP_DRIVER_CALIB_VER6);
5912         }
5913         return 0;
5914 }
5915
5916 /*
5917  * Take NIC ownership over Intel Active Management Technology (AMT).
5918  */
5919 static int
5920 iwn_hw_prepare(struct iwn_softc *sc)
5921 {
5922         int ntries;
5923
5924         /* Check if hardware is ready. */
5925         IWN_SETBITS(sc, IWN_HW_IF_CONFIG, IWN_HW_IF_CONFIG_NIC_READY);
5926         for (ntries = 0; ntries < 5; ntries++) {
5927                 if (IWN_READ(sc, IWN_HW_IF_CONFIG) &
5928                     IWN_HW_IF_CONFIG_NIC_READY)
5929                         return 0;
5930                 DELAY(10);
5931         }
5932
5933         /* Hardware not ready, force into ready state. */
5934         IWN_SETBITS(sc, IWN_HW_IF_CONFIG, IWN_HW_IF_CONFIG_PREPARE);
5935         for (ntries = 0; ntries < 15000; ntries++) {
5936                 if (!(IWN_READ(sc, IWN_HW_IF_CONFIG) &
5937                     IWN_HW_IF_CONFIG_PREPARE_DONE))
5938                         break;
5939                 DELAY(10);
5940         }
5941         if (ntries == 15000)
5942                 return ETIMEDOUT;
5943
5944         /* Hardware should be ready now. */
5945         IWN_SETBITS(sc, IWN_HW_IF_CONFIG, IWN_HW_IF_CONFIG_NIC_READY);
5946         for (ntries = 0; ntries < 5; ntries++) {
5947                 if (IWN_READ(sc, IWN_HW_IF_CONFIG) &
5948                     IWN_HW_IF_CONFIG_NIC_READY)
5949                         return 0;
5950                 DELAY(10);
5951         }
5952         return ETIMEDOUT;
5953 }
5954
5955 static int
5956 iwn_hw_init(struct iwn_softc *sc)
5957 {
5958         const struct iwn_hal *hal = sc->sc_hal;
5959         int error, chnl, qid;
5960
5961         /* Clear pending interrupts. */
5962         IWN_WRITE(sc, IWN_INT, 0xffffffff);
5963
5964         error = iwn_apm_init(sc);
5965         if (error != 0) {
5966                 device_printf(sc->sc_dev,
5967                     "%s: could not power ON adapter, error %d\n",
5968                     __func__, error);
5969                 goto done;
5970         }
5971
5972         /* Select VMAIN power source. */
5973         error = iwn_nic_lock(sc);
5974         if (error != 0)
5975                 goto done;
5976         iwn_prph_clrbits(sc, IWN_APMG_PS, IWN_APMG_PS_PWR_SRC_MASK);
5977         iwn_nic_unlock(sc);
5978
5979         /* Perform adapter-specific initialization. */
5980         error = hal->nic_config(sc);
5981         if (error != 0)
5982                 goto done;
5983
5984         /* Initialize RX ring. */
5985         error = iwn_nic_lock(sc);
5986         if (error != 0)
5987                 goto done;
5988         IWN_WRITE(sc, IWN_FH_RX_CONFIG, 0);
5989         IWN_WRITE(sc, IWN_FH_RX_WPTR, 0);
5990         /* Set physical address of RX ring (256-byte aligned.) */
5991         IWN_WRITE(sc, IWN_FH_RX_BASE, sc->rxq.desc_dma.paddr >> 8);
5992         /* Set physical address of RX status (16-byte aligned.) */
5993         IWN_WRITE(sc, IWN_FH_STATUS_WPTR, sc->rxq.stat_dma.paddr >> 4);
5994         /* Enable RX. */
5995         IWN_WRITE(sc, IWN_FH_RX_CONFIG,
5996             IWN_FH_RX_CONFIG_ENA           |
5997             IWN_FH_RX_CONFIG_IGN_RXF_EMPTY |    /* HW bug workaround */
5998             IWN_FH_RX_CONFIG_IRQ_DST_HOST  |
5999             IWN_FH_RX_CONFIG_SINGLE_FRAME  |
6000             IWN_FH_RX_CONFIG_RB_TIMEOUT(0) |
6001             IWN_FH_RX_CONFIG_NRBD(IWN_RX_RING_COUNT_LOG));
6002         iwn_nic_unlock(sc);
6003         IWN_WRITE(sc, IWN_FH_RX_WPTR, (IWN_RX_RING_COUNT - 1) & ~7);
6004
6005         error = iwn_nic_lock(sc);
6006         if (error != 0)
6007                 goto done;
6008
6009         /* Initialize TX scheduler. */
6010         iwn_prph_write(sc, hal->sched_txfact_addr, 0);
6011
6012         /* Set physical address of "keep warm" page (16-byte aligned.) */
6013         IWN_WRITE(sc, IWN_FH_KW_ADDR, sc->kw_dma.paddr >> 4);
6014
6015         /* Initialize TX rings. */
6016         for (qid = 0; qid < hal->ntxqs; qid++) {
6017                 struct iwn_tx_ring *txq = &sc->txq[qid];
6018
6019                 /* Set physical address of TX ring (256-byte aligned.) */
6020                 IWN_WRITE(sc, IWN_FH_CBBC_QUEUE(qid),
6021                     txq->desc_dma.paddr >> 8);
6022         }
6023         iwn_nic_unlock(sc);
6024
6025         /* Enable DMA channels. */
6026         for (chnl = 0; chnl < hal->ndmachnls; chnl++) {
6027                 IWN_WRITE(sc, IWN_FH_TX_CONFIG(chnl),
6028                     IWN_FH_TX_CONFIG_DMA_ENA |
6029                     IWN_FH_TX_CONFIG_DMA_CREDIT_ENA);
6030         }
6031
6032         /* Clear "radio off" and "commands blocked" bits. */
6033         IWN_WRITE(sc, IWN_UCODE_GP1_CLR, IWN_UCODE_GP1_RFKILL);
6034         IWN_WRITE(sc, IWN_UCODE_GP1_CLR, IWN_UCODE_GP1_CMD_BLOCKED);
6035
6036         /* Clear pending interrupts. */
6037         IWN_WRITE(sc, IWN_INT, 0xffffffff);
6038         /* Enable interrupt coalescing. */
6039         IWN_WRITE(sc, IWN_INT_COALESCING, 512 / 8);
6040         /* Enable interrupts. */
6041         IWN_WRITE(sc, IWN_INT_MASK, sc->int_mask);
6042
6043         /* _Really_ make sure "radio off" bit is cleared! */
6044         IWN_WRITE(sc, IWN_UCODE_GP1_CLR, IWN_UCODE_GP1_RFKILL);
6045         IWN_WRITE(sc, IWN_UCODE_GP1_CLR, IWN_UCODE_GP1_RFKILL);
6046
6047         error = hal->load_firmware(sc);
6048         if (error != 0) {
6049                 device_printf(sc->sc_dev,
6050                     "%s: could not load firmware, error %d\n",
6051                     __func__, error);
6052                 goto done;
6053         }
6054         /* Wait at most one second for firmware alive notification. */
6055         error = zsleep(sc, &wlan_global_serializer, 0, "iwninit", hz);
6056         if (error != 0) {
6057                 device_printf(sc->sc_dev,
6058                     "%s: timeout waiting for adapter to initialize, error %d\n",
6059                     __func__, error);
6060                 goto done;
6061         }
6062         /* Do post-firmware initialization. */
6063         error = hal->post_alive(sc);
6064 done:
6065         return error;
6066 }
6067
6068 static void
6069 iwn_hw_stop(struct iwn_softc *sc)
6070 {
6071         const struct iwn_hal *hal = sc->sc_hal;
6072         uint32_t tmp;
6073         int chnl, qid, ntries;
6074
6075         IWN_WRITE(sc, IWN_RESET, IWN_RESET_NEVO);
6076
6077         /* Disable interrupts. */
6078         IWN_WRITE(sc, IWN_INT_MASK, 0);
6079         IWN_WRITE(sc, IWN_INT, 0xffffffff);
6080         IWN_WRITE(sc, IWN_FH_INT, 0xffffffff);
6081         sc->sc_flags &= ~IWN_FLAG_USE_ICT;
6082
6083         /* Make sure we no longer hold the NIC lock. */
6084         iwn_nic_unlock(sc);
6085
6086         /* Stop TX scheduler. */
6087         iwn_prph_write(sc, hal->sched_txfact_addr, 0);
6088
6089         /* Stop all DMA channels. */
6090         if (iwn_nic_lock(sc) == 0) {
6091                 for (chnl = 0; chnl < hal->ndmachnls; chnl++) {
6092                         IWN_WRITE(sc, IWN_FH_TX_CONFIG(chnl), 0);
6093                         for (ntries = 0; ntries < 200; ntries++) {
6094                                 tmp = IWN_READ(sc, IWN_FH_TX_STATUS);
6095                                 if ((tmp & IWN_FH_TX_STATUS_IDLE(chnl)) ==
6096                                     IWN_FH_TX_STATUS_IDLE(chnl))
6097                                         break;
6098                                 DELAY(10);
6099                         }
6100                 }
6101                 iwn_nic_unlock(sc);
6102         }
6103
6104         /* Stop RX ring. */
6105         iwn_reset_rx_ring(sc, &sc->rxq);
6106
6107         /* Reset all TX rings. */
6108         for (qid = 0; qid < hal->ntxqs; qid++)
6109                 iwn_reset_tx_ring(sc, &sc->txq[qid]);
6110
6111         if (iwn_nic_lock(sc) == 0) {
6112                 iwn_prph_write(sc, IWN_APMG_CLK_DIS,
6113                     IWN_APMG_CLK_CTRL_DMA_CLK_RQT);
6114                 iwn_nic_unlock(sc);
6115         }
6116         DELAY(5);
6117
6118         /* Power OFF adapter. */
6119         iwn_apm_stop(sc);
6120 }
6121
6122 static void
6123 iwn_init_locked(struct iwn_softc *sc)
6124 {
6125         struct ifnet *ifp = sc->sc_ifp;
6126         int error;
6127         int wlan_serializer_needed;
6128
6129         /*
6130          * The kernel generic firmware loader can wind up calling this
6131          * without the wlan serializer, while the wlan subsystem will
6132          * call it with the serializer.
6133          *
6134          * Make sure we hold the serializer or we will have timing issues
6135          * with the wlan subsystem.
6136          */
6137         wlan_serializer_needed = !IS_SERIALIZED(&wlan_global_serializer);
6138         if (wlan_serializer_needed)
6139                 wlan_serialize_enter();
6140
6141         error = iwn_hw_prepare(sc);
6142         if (error != 0) {
6143                 device_printf(sc->sc_dev, "%s: hardware not ready, eror %d\n",
6144                     __func__, error);
6145                 goto fail;
6146         }
6147
6148         /* Initialize interrupt mask to default value. */
6149         sc->int_mask = IWN_INT_MASK_DEF;
6150         sc->sc_flags &= ~IWN_FLAG_USE_ICT;
6151
6152         /* Check that the radio is not disabled by hardware switch. */
6153         if (!(IWN_READ(sc, IWN_GP_CNTRL) & IWN_GP_CNTRL_RFKILL)) {
6154                 device_printf(sc->sc_dev,
6155                     "radio is disabled by hardware switch\n");
6156
6157                 /* Enable interrupts to get RF toggle notifications. */
6158                 IWN_WRITE(sc, IWN_INT, 0xffffffff);
6159                 IWN_WRITE(sc, IWN_INT_MASK, sc->int_mask);
6160                 if (wlan_serializer_needed)
6161                         wlan_serialize_exit();
6162                 return;
6163         }
6164
6165         /* Read firmware images from the filesystem. */
6166         error = iwn_read_firmware(sc);
6167         if (error != 0) {
6168                 device_printf(sc->sc_dev,
6169                     "%s: could not read firmware, error %d\n",
6170                     __func__, error);
6171                 goto fail;
6172         }
6173
6174         /* Initialize hardware and upload firmware. */
6175         error = iwn_hw_init(sc);
6176         firmware_put(sc->fw_fp, FIRMWARE_UNLOAD);
6177         sc->fw_fp = NULL;
6178         if (error != 0) {
6179                 device_printf(sc->sc_dev,
6180                     "%s: could not initialize hardware, error %d\n",
6181                     __func__, error);
6182                 goto fail;
6183         }
6184
6185         /* Configure adapter now that it is ready. */
6186         error = iwn_config(sc);
6187         if (error != 0) {
6188                 device_printf(sc->sc_dev,
6189                     "%s: could not configure device, error %d\n",
6190                     __func__, error);
6191                 goto fail;
6192         }
6193
6194         ifp->if_flags &= ~IFF_OACTIVE;
6195         ifp->if_flags |= IFF_RUNNING;
6196         if (wlan_serializer_needed)
6197                 wlan_serialize_exit();
6198         return;
6199
6200 fail:
6201         iwn_stop_locked(sc);
6202         if (wlan_serializer_needed)
6203                 wlan_serialize_exit();
6204 }
6205
6206 static void
6207 iwn_init(void *arg)
6208 {
6209         struct iwn_softc *sc = arg;
6210         struct ifnet *ifp = sc->sc_ifp;
6211         struct ieee80211com *ic = ifp->if_l2com;
6212
6213         wlan_assert_serialized();
6214
6215         iwn_init_locked(sc);
6216
6217         if (ifp->if_flags & IFF_RUNNING)
6218                 ieee80211_start_all(ic);
6219 }
6220
6221 static void
6222 iwn_stop_locked(struct iwn_softc *sc)
6223 {
6224         struct ifnet *ifp = sc->sc_ifp;
6225
6226         sc->sc_tx_timer = 0;
6227         callout_stop(&sc->sc_timer_to);
6228         ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE);
6229
6230         /* Power OFF hardware. */
6231         iwn_hw_stop(sc);
6232 }
6233
6234 static void
6235 iwn_stop(struct iwn_softc *sc)
6236 {
6237         wlan_serialize_enter();
6238         iwn_stop_locked(sc);
6239         wlan_serialize_exit();
6240 }
6241
6242 /*
6243  * Callback from net80211 to start a scan.
6244  */
6245 static void
6246 iwn_scan_start(struct ieee80211com *ic)
6247 {
6248         struct ifnet *ifp = ic->ic_ifp;
6249         struct iwn_softc *sc = ifp->if_softc;
6250
6251         /* make the link LED blink while we're scanning */
6252         iwn_set_led(sc, IWN_LED_LINK, 20, 2);
6253 }
6254
6255 /*
6256  * Callback from net80211 to terminate a scan.
6257  */
6258 static void
6259 iwn_scan_end(struct ieee80211com *ic)
6260 {
6261         struct ifnet *ifp = ic->ic_ifp;
6262         struct iwn_softc *sc = ifp->if_softc;
6263         struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps);
6264
6265         if (vap->iv_state == IEEE80211_S_RUN) {
6266                 /* Set link LED to ON status if we are associated */
6267                 iwn_set_led(sc, IWN_LED_LINK, 0, 1);
6268         }
6269 }
6270
6271 /*
6272  * Callback from net80211 to force a channel change.
6273  */
6274 static void
6275 iwn_set_channel(struct ieee80211com *ic)
6276 {
6277         const struct ieee80211_channel *c = ic->ic_curchan;
6278         struct ifnet *ifp = ic->ic_ifp;
6279         struct iwn_softc *sc = ifp->if_softc;
6280
6281         sc->sc_rxtap.wr_chan_freq = htole16(c->ic_freq);
6282         sc->sc_rxtap.wr_chan_flags = htole16(c->ic_flags);
6283         sc->sc_txtap.wt_chan_freq = htole16(c->ic_freq);
6284         sc->sc_txtap.wt_chan_flags = htole16(c->ic_flags);
6285 }
6286
6287 /*
6288  * Callback from net80211 to start scanning of the current channel.
6289  */
6290 static void
6291 iwn_scan_curchan(struct ieee80211_scan_state *ss, unsigned long maxdwell)
6292 {
6293         struct ieee80211vap *vap = ss->ss_vap;
6294         struct iwn_softc *sc = vap->iv_ic->ic_ifp->if_softc;
6295         int error;
6296
6297         error = iwn_scan(sc);
6298         if (error != 0)
6299                 ieee80211_cancel_scan(vap);
6300 }
6301
6302 /*
6303  * Callback from net80211 to handle the minimum dwell time being met.
6304  * The intent is to terminate the scan but we just let the firmware
6305  * notify us when it's finished as we have no safe way to abort it.
6306  */
6307 static void
6308 iwn_scan_mindwell(struct ieee80211_scan_state *ss)
6309 {
6310         /* NB: don't try to abort scan; wait for firmware to finish */
6311 }
6312
6313 static struct iwn_eeprom_chan *
6314 iwn_find_eeprom_channel(struct iwn_softc *sc, struct ieee80211_channel *c)
6315 {
6316         int i, j;
6317
6318         for (j = 0; j < 7; j++) {
6319                 for (i = 0; i < iwn_bands[j].nchan; i++) {
6320                         if (iwn_bands[j].chan[i] == c->ic_ieee)
6321                                 return &sc->eeprom_channels[j][i];
6322                 }
6323         }
6324
6325         return NULL;
6326 }
6327
6328 /*
6329  * Enforce flags read from EEPROM.
6330  */
6331 static int
6332 iwn_setregdomain(struct ieee80211com *ic, struct ieee80211_regdomain *rd,
6333     int nchan, struct ieee80211_channel chans[])
6334 {
6335         struct iwn_softc *sc = ic->ic_ifp->if_softc;
6336         int i;
6337
6338         for (i = 0; i < nchan; i++) {
6339                 struct ieee80211_channel *c = &chans[i];
6340                 struct iwn_eeprom_chan *channel;
6341
6342                 channel = iwn_find_eeprom_channel(sc, c);
6343                 if (channel == NULL) {
6344                         if_printf(ic->ic_ifp,
6345                             "%s: invalid channel %u freq %u/0x%x\n",
6346                             __func__, c->ic_ieee, c->ic_freq, c->ic_flags);
6347                         return EINVAL;
6348                 }
6349                 c->ic_flags |= iwn_eeprom_channel_flags(channel);
6350         }
6351
6352         return 0;
6353 }
6354
6355 static void
6356 iwn_hw_reset_task(void *arg0, int pending)
6357 {
6358         struct iwn_softc *sc = arg0;
6359         struct ifnet *ifp;
6360         struct ieee80211com *ic;
6361
6362         wlan_serialize_enter();
6363         ifp = sc->sc_ifp;
6364         ic = ifp->if_l2com;
6365         iwn_stop_locked(sc);
6366         iwn_init_locked(sc);
6367         ieee80211_notify_radio(ic, 1);
6368         wlan_serialize_exit();
6369 }
6370
6371 static void
6372 iwn_radio_on_task(void *arg0, int pending)
6373 {
6374         struct iwn_softc *sc = arg0;
6375         struct ifnet *ifp;
6376         struct ieee80211com *ic;
6377         struct ieee80211vap *vap;
6378
6379         wlan_serialize_enter();
6380         ifp = sc->sc_ifp;
6381         ic = ifp->if_l2com;
6382         vap = TAILQ_FIRST(&ic->ic_vaps);
6383         if (vap != NULL) {
6384                 iwn_init_locked(sc);
6385                 ieee80211_init(vap);
6386         }
6387         wlan_serialize_exit();
6388 }
6389
6390 static void
6391 iwn_radio_off_task(void *arg0, int pending)
6392 {
6393         struct iwn_softc *sc = arg0;
6394         struct ifnet *ifp;
6395         struct ieee80211com *ic;
6396         struct ieee80211vap *vap;
6397
6398         wlan_serialize_enter();
6399         ifp = sc->sc_ifp;
6400         ic = ifp->if_l2com;
6401         vap = TAILQ_FIRST(&ic->ic_vaps);
6402         iwn_stop_locked(sc);
6403         if (vap != NULL)
6404                 ieee80211_stop(vap);
6405
6406         /* Enable interrupts to get RF toggle notification. */
6407         IWN_WRITE(sc, IWN_INT, 0xffffffff);
6408         IWN_WRITE(sc, IWN_INT_MASK, sc->int_mask);
6409         wlan_serialize_exit();
6410 }
6411
6412 static void
6413 iwn_sysctlattach(struct iwn_softc *sc)
6414 {
6415         struct sysctl_ctx_list *ctx;
6416         struct sysctl_oid *tree;
6417
6418         ctx = &sc->sc_sysctl_ctx;
6419         tree = sc->sc_sysctl_tree;
6420         if (tree == NULL) {
6421                 device_printf(sc->sc_dev, "can't add sysctl node\n");
6422                 return;
6423         }
6424
6425 #ifdef IWN_DEBUG
6426         sc->sc_debug = 0;
6427         SYSCTL_ADD_INT(ctx, SYSCTL_CHILDREN(tree), OID_AUTO,
6428             "debug", CTLFLAG_RW, &sc->sc_debug, 0, "control debugging printfs");
6429 #endif
6430 }
6431
6432 static int
6433 iwn_pci_shutdown(device_t dev)
6434 {
6435         struct iwn_softc *sc = device_get_softc(dev);
6436
6437         wlan_serialize_enter();
6438         iwn_stop_locked(sc);
6439         wlan_serialize_exit();
6440
6441         return 0;
6442 }
6443
6444 static int
6445 iwn_pci_suspend(device_t dev)
6446 {
6447         struct iwn_softc *sc = device_get_softc(dev);
6448         struct ifnet *ifp = sc->sc_ifp;
6449         struct ieee80211com *ic = ifp->if_l2com;
6450         struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps);
6451
6452         wlan_serialize_enter();
6453         iwn_stop_locked(sc);
6454         if (vap != NULL)
6455                 ieee80211_stop(vap);
6456         wlan_serialize_exit();
6457
6458         return 0;
6459 }
6460
6461 static int
6462 iwn_pci_resume(device_t dev)
6463 {
6464         struct iwn_softc *sc = device_get_softc(dev);
6465         struct ifnet *ifp;
6466         struct ieee80211com *ic;
6467         struct ieee80211vap *vap;
6468
6469         wlan_serialize_enter();
6470         ifp = sc->sc_ifp;
6471         ic = ifp->if_l2com;
6472         vap = TAILQ_FIRST(&ic->ic_vaps);
6473         /* Clear device-specific "PCI retry timeout" register (41h). */
6474         pci_write_config(dev, 0x41, 0, 1);
6475
6476         if (ifp->if_flags & IFF_UP) {
6477                 iwn_init_locked(sc);
6478                 if (vap != NULL)
6479                         ieee80211_init(vap);
6480                 if (ifp->if_flags & IFF_RUNNING)
6481                         iwn_start_locked(ifp);
6482         }
6483         wlan_serialize_exit();
6484
6485         return 0;
6486 }
6487
6488 #ifdef IWN_DEBUG
6489 static const char *
6490 iwn_intr_str(uint8_t cmd)
6491 {
6492         switch (cmd) {
6493         /* Notifications */
6494         case IWN_UC_READY:              return "UC_READY";
6495         case IWN_ADD_NODE_DONE:         return "ADD_NODE_DONE";
6496         case IWN_TX_DONE:               return "TX_DONE";
6497         case IWN_START_SCAN:            return "START_SCAN";
6498         case IWN_STOP_SCAN:             return "STOP_SCAN";
6499         case IWN_RX_STATISTICS:         return "RX_STATS";
6500         case IWN_BEACON_STATISTICS:     return "BEACON_STATS";
6501         case IWN_STATE_CHANGED:         return "STATE_CHANGED";
6502         case IWN_BEACON_MISSED:         return "BEACON_MISSED";
6503         case IWN_RX_PHY:                return "RX_PHY";
6504         case IWN_MPDU_RX_DONE:          return "MPDU_RX_DONE";
6505         case IWN_RX_DONE:               return "RX_DONE";
6506
6507         /* Command Notifications */
6508         case IWN_CMD_RXON:              return "IWN_CMD_RXON";
6509         case IWN_CMD_RXON_ASSOC:        return "IWN_CMD_RXON_ASSOC";
6510         case IWN_CMD_EDCA_PARAMS:       return "IWN_CMD_EDCA_PARAMS";
6511         case IWN_CMD_TIMING:            return "IWN_CMD_TIMING";
6512         case IWN_CMD_LINK_QUALITY:      return "IWN_CMD_LINK_QUALITY";
6513         case IWN_CMD_SET_LED:           return "IWN_CMD_SET_LED";
6514         case IWN5000_CMD_WIMAX_COEX:    return "IWN5000_CMD_WIMAX_COEX";
6515         case IWN5000_CMD_CALIB_CONFIG:  return "IWN5000_CMD_CALIB_CONFIG";
6516         case IWN5000_CMD_CALIB_RESULT:  return "IWN5000_CMD_CALIB_RESULT";
6517         case IWN5000_CMD_CALIB_COMPLETE: return "IWN5000_CMD_CALIB_COMPLETE";
6518         case IWN_CMD_SET_POWER_MODE:    return "IWN_CMD_SET_POWER_MODE";
6519         case IWN_CMD_SCAN:              return "IWN_CMD_SCAN";
6520         case IWN_CMD_SCAN_RESULTS:      return "IWN_CMD_SCAN_RESULTS";
6521         case IWN_CMD_TXPOWER:           return "IWN_CMD_TXPOWER";
6522         case IWN_CMD_TXPOWER_DBM:       return "IWN_CMD_TXPOWER_DBM";
6523         case IWN5000_CMD_TX_ANT_CONFIG: return "IWN5000_CMD_TX_ANT_CONFIG";
6524         case IWN_CMD_BT_COEX:           return "IWN_CMD_BT_COEX";
6525         case IWN_CMD_SET_CRITICAL_TEMP: return "IWN_CMD_SET_CRITICAL_TEMP";
6526         case IWN_CMD_SET_SENSITIVITY:   return "IWN_CMD_SET_SENSITIVITY";
6527         case IWN_CMD_PHY_CALIB:         return "IWN_CMD_PHY_CALIB";
6528         }
6529         return "UNKNOWN INTR NOTIF/CMD";
6530 }
6531 #endif /* IWN_DEBUG */
6532
6533 static device_method_t iwn_methods[] = {
6534         /* Device interface */
6535         DEVMETHOD(device_probe,         iwn_pci_probe),
6536         DEVMETHOD(device_attach,        iwn_pci_attach),
6537         DEVMETHOD(device_detach,        iwn_pci_detach),
6538         DEVMETHOD(device_shutdown,      iwn_pci_shutdown),
6539         DEVMETHOD(device_suspend,       iwn_pci_suspend),
6540         DEVMETHOD(device_resume,        iwn_pci_resume),
6541         { 0, 0 }
6542 };
6543
6544 static driver_t iwn_driver = {
6545         "iwn",
6546         iwn_methods,
6547         sizeof (struct iwn_softc)
6548 };
6549 static devclass_t iwn_devclass;
6550
6551 DRIVER_MODULE(iwn, pci, iwn_driver, iwn_devclass, NULL, NULL);
6552 MODULE_DEPEND(iwn, pci, 1, 1, 1);
6553 MODULE_DEPEND(iwn, firmware, 1, 1, 1);
6554 MODULE_DEPEND(iwn, wlan, 1, 1, 1);
6555 MODULE_DEPEND(iwn, wlan_amrr, 1, 1, 1);