xref: /dragonfly/sys/dev/netif/iwi/if_iwi.c (revision ad7a2457)
1 /*
2  * Copyright (c) 2004-2006
3  *      Damien Bergamini <damien.bergamini@free.fr>.
4  * Copyright (c) 2004, 2005
5  *      Andrew Atrens <atrens@nortelnetworks.com>.
6  *
7  * All rights reserved.
8  *
9  * Redistribution and use in source and binary forms, with or without
10  * modification, are permitted provided that the following conditions
11  * are met:
12  * 1. Redistributions of source code must retain the above copyright
13  *    notice unmodified, this list of conditions, and the following
14  *    disclaimer.
15  * 2. Redistributions in binary form must reproduce the above copyright
16  *    notice, this list of conditions and the following disclaimer in the
17  *    documentation and/or other materials provided with the distribution.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
20  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
23  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29  * SUCH DAMAGE.
30  *
31  * $FreeBSD: src/sys/dev/iwi/if_iwi.c,v 1.8.2.6 2006/02/23 02:06:46 sam Exp $
32  * $DragonFly: src/sys/dev/netif/iwi/if_iwi.c,v 1.21 2008/05/14 11:59:20 sephe Exp $
33  */
34 
35 /*-
36  * Intel(R) PRO/Wireless 2200BG/2225BG/2915ABG driver
37  * http://www.intel.com/network/connectivity/products/wireless/prowireless_mobile.htm
38  */
39 
40 #include <sys/param.h>
41 #include <sys/sysctl.h>
42 #include <sys/sockio.h>
43 #include <sys/mbuf.h>
44 #include <sys/kernel.h>
45 #include <sys/kthread.h>
46 #include <sys/interrupt.h>
47 #include <sys/socket.h>
48 #include <sys/systm.h>
49 #include <sys/malloc.h>
50 #include <sys/module.h>
51 #include <sys/endian.h>
52 #include <sys/proc.h>
53 #include <sys/priv.h>
54 #include <sys/ucred.h>
55 #include <sys/bus.h>
56 #include <sys/rman.h>
57 #include <sys/serialize.h>
58 
59 #include <bus/pci/pcidevs.h>
60 #include <bus/pci/pcireg.h>
61 #include <bus/pci/pcivar.h>
62 
63 #include <net/bpf.h>
64 #include <net/if.h>
65 #include <net/if_arp.h>
66 #include <net/ethernet.h>
67 #include <net/if_dl.h>
68 #include <net/if_media.h>
69 #include <net/if_types.h>
70 #include <net/ifq_var.h>
71 
72 #include <netproto/802_11/ieee80211_var.h>
73 #include <netproto/802_11/ieee80211_radiotap.h>
74 
75 #include <netinet/in.h>
76 #include <netinet/in_systm.h>
77 #include <netinet/in_var.h>
78 #include <netinet/ip.h>
79 #include <netinet/if_ether.h>
80 
81 #include <dev/netif/iwi/if_iwireg.h>
82 #include <dev/netif/iwi/if_iwivar.h>
83 
84 #ifdef IWI_DEBUG
85 #define DPRINTF(x)	do { if (iwi_debug > 0) kprintf x; } while (0)
86 #define DPRINTFN(n, x)	do { if (iwi_debug >= (n)) kprintf x; } while (0)
87 int iwi_debug = 0;
88 SYSCTL_INT(_debug, OID_AUTO, iwi, CTLFLAG_RW, &iwi_debug, 0, "iwi debug level");
89 #else
90 #define DPRINTF(x)
91 #define DPRINTFN(n, x)
92 #endif
93 
94 static struct iwi_ident {
95 	uint16_t	vendor;
96 	uint16_t	device;
97 	const char	*name;
98 } iwi_ident_table[] = {
99 	{ PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_PRO_WL_2200BG,
100 		"Intel(R) PRO/Wireless 2200BG" },
101 	{ PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_PRO_WL_2225BG,
102 		"Intel(R) PRO/Wireless 2225BG" },
103 	{ PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_PRO_WL_2915ABG_1,
104 		"Intel(R) PRO/Wireless 2915ABG" },
105 	{ PCI_VENDOR_INTEL, PCI_PRODUCT_INTEL_PRO_WL_2915ABG_2,
106 		"Intel(R) PRO/Wireless 2915ABG" },
107 	{ 0, 0, NULL }
108 };
109 
110 static void	iwi_fw_monitor(void *);
111 static void	iwi_dma_map_addr(void *, bus_dma_segment_t *, int, int);
112 static void	iwi_dma_map_mbuf(void *, bus_dma_segment_t *, int, bus_size_t,
113 				 int);
114 static int	iwi_alloc_cmd_ring(struct iwi_softc *, struct iwi_cmd_ring *,
115 		    int);
116 static void	iwi_reset_cmd_ring(struct iwi_softc *, struct iwi_cmd_ring *);
117 static void	iwi_free_cmd_ring(struct iwi_softc *, struct iwi_cmd_ring *);
118 static int	iwi_alloc_tx_ring(struct iwi_softc *, struct iwi_tx_ring *,
119 		    int, bus_addr_t, bus_addr_t);
120 static void	iwi_reset_tx_ring(struct iwi_softc *, struct iwi_tx_ring *);
121 static void	iwi_free_tx_ring(struct iwi_softc *, struct iwi_tx_ring *);
122 static int	iwi_alloc_rx_ring(struct iwi_softc *, struct iwi_rx_ring *,
123 		    int);
124 static void	iwi_reset_rx_ring(struct iwi_softc *, struct iwi_rx_ring *);
125 static void	iwi_free_rx_ring(struct iwi_softc *, struct iwi_rx_ring *);
126 static struct	ieee80211_node *iwi_node_alloc(struct ieee80211_node_table *);
127 static void	iwi_node_free(struct ieee80211_node *);
128 static int	iwi_media_change(struct ifnet *);
129 static void	iwi_media_status(struct ifnet *, struct ifmediareq *);
130 static int	iwi_newstate(struct ieee80211com *, enum ieee80211_state, int);
131 static int	iwi_wme_update(struct ieee80211com *);
132 static uint16_t	iwi_read_prom_word(struct iwi_softc *, uint8_t);
133 static void	iwi_fix_channel(struct ieee80211com *, struct mbuf *);
134 static void	iwi_frame_intr(struct iwi_softc *, struct iwi_rx_data *, int,
135 		    struct iwi_frame *);
136 static void	iwi_notification_intr(struct iwi_softc *, struct iwi_notif *);
137 static void	iwi_rx_intr(struct iwi_softc *);
138 static void	iwi_tx_intr(struct iwi_softc *, struct iwi_tx_ring *);
139 static void	iwi_intr(void *);
140 static int	iwi_cmd(struct iwi_softc *, uint8_t, void *, uint8_t, int);
141 static void	iwi_write_ibssnode(struct iwi_softc *, const struct iwi_node *);
142 static int	iwi_tx_start(struct ifnet *, struct mbuf *,
143 		    struct ieee80211_node *, int);
144 static void	iwi_start(struct ifnet *);
145 static void	iwi_watchdog(struct ifnet *);
146 static int	iwi_ioctl(struct ifnet *, u_long, caddr_t, struct ucred *);
147 static void	iwi_stop_master(struct iwi_softc *);
148 static int	iwi_reset(struct iwi_softc *);
149 static int	iwi_load_ucode(struct iwi_softc *, void *, int);
150 static int	iwi_load_firmware(struct iwi_softc *, void *, int);
151 static int	iwi_cache_firmware(struct iwi_softc *, void *);
152 static void	iwi_free_firmware(struct iwi_softc *);
153 static int	iwi_config(struct iwi_softc *);
154 static int	iwi_set_chan(struct iwi_softc *, struct ieee80211_channel *);
155 static int	iwi_scan(struct iwi_softc *);
156 static int	iwi_auth_and_assoc(struct iwi_softc *);
157 static void	iwi_init(void *);
158 static void	iwi_stop(void *);
159 static int	iwi_sysctl_stats(SYSCTL_HANDLER_ARGS);
160 static int	iwi_sysctl_radio(SYSCTL_HANDLER_ARGS);
161 
162 static int 	iwi_probe(device_t);
163 static int 	iwi_attach(device_t);
164 static int 	iwi_detach(device_t);
165 static int 	iwi_shutdown(device_t);
166 static int 	iwi_suspend(device_t);
167 static int 	iwi_resume(device_t);
168 
169 static int	iwi_alloc_ibss_node(struct iwi_softc *);
170 static void	iwi_free_ibss_node(struct iwi_softc *, int);
171 
172 static device_method_t iwi_methods[] = {
173 	/* Device interface */
174 	DEVMETHOD(device_probe,		iwi_probe),
175 	DEVMETHOD(device_attach,	iwi_attach),
176 	DEVMETHOD(device_detach,	iwi_detach),
177 	DEVMETHOD(device_shutdown,	iwi_shutdown),
178 	DEVMETHOD(device_suspend,	iwi_suspend),
179 	DEVMETHOD(device_resume,	iwi_resume),
180 
181 	{ 0, 0 }
182 };
183 
184 static driver_t iwi_driver = {
185 	"iwi",
186 	iwi_methods,
187 	sizeof (struct iwi_softc)
188 };
189 
190 static devclass_t iwi_devclass;
191 
192 DRIVER_MODULE(iwi, pci, iwi_driver, iwi_devclass, 0, 0);
193 
194 MODULE_DEPEND(iwi, pci,  1, 1, 1);
195 MODULE_DEPEND(iwi, wlan, 1, 1, 1);
196 
197 /*
198  * Supported rates for 802.11a/b/g modes (in 500Kbps unit).
199  */
200 static const struct ieee80211_rateset iwi_rateset_11a =
201 	{ 8, { 12, 18, 24, 36, 48, 72, 96, 108 } };
202 
203 static const struct ieee80211_rateset iwi_rateset_11b =
204 	{ 4, { 2, 4, 11, 22 } };
205 
206 static const struct ieee80211_rateset iwi_rateset_11g =
207 	{ 12, { 2, 4, 11, 22, 12, 18, 24, 36, 48, 72, 96, 108 } };
208 
209 static void
210 iwi_fw_monitor(void *arg)
211 {
212 	struct iwi_softc *sc = arg;
213 	struct ifnet *ifp = &sc->sc_ic.ic_if;
214 
215 	lwkt_serialize_enter(ifp->if_serializer);
216 	for (;;) {
217 		int error = 0;
218 
219 		/*
220 		 * Test to see whether we are detaching,
221 		 * this is used to avoid race condition
222 		 * especially when attaching fails.
223 		 */
224 		if ((sc->flags & IWI_FLAG_EXIT) == 0) {
225 			crit_enter();
226 			tsleep_interlock(IWI_FW_WAKE_MONITOR(sc));
227 			lwkt_serialize_exit(ifp->if_serializer);
228 			error = tsleep(IWI_FW_WAKE_MONITOR(sc),
229 				       0, "iwifwm", 0);
230 			crit_exit();
231 			lwkt_serialize_enter(ifp->if_serializer);
232 		}
233 
234 		if (error == 0) {
235 			int boff;
236 
237 			if (sc->flags & IWI_FLAG_EXIT)
238 				break;
239 			else if ((sc->flags & IWI_FLAG_RESET) == 0)
240 				continue;
241 
242 			if_printf(ifp, "reset firmware\n");
243 			for (boff = 1; sc->flags & IWI_FLAG_RESET; boff++) {
244 				iwi_init(sc);
245 				if (sc->flags & IWI_FLAG_FW_INITED) {
246 					sc->flags &= ~IWI_FLAG_RESET;
247 				} else if (boff > 10) {	/* XXX */
248 					if_printf(ifp, "fw reset failed.  "
249 						  "retrying...\n");
250 
251 					/* XXX avoid to sleep to long */
252 					boff = 1;
253 				}
254 
255 				/*
256 				 * Since this would be infinite loop,
257 				 * if reseting firmware never succeeded,
258 				 * we test to see whether we are detaching.
259 				 */
260 				if (sc->flags & IWI_FLAG_EXIT)
261 					break;
262 
263 				crit_enter();
264 				tsleep_interlock(IWI_FW_CMD_ACKED(sc));
265 				lwkt_serialize_exit(ifp->if_serializer);
266 				error = tsleep(IWI_FW_CMD_ACKED(sc), 0,
267 					       "iwirun", boff * hz);
268 				crit_exit();
269 				lwkt_serialize_enter(ifp->if_serializer);
270 			}
271 		}
272 	}
273 	lwkt_serialize_exit(ifp->if_serializer);
274 
275 	if_printf(ifp, "fw monitor exiting\n");
276 	wakeup(IWI_FW_EXIT_MONITOR(sc));
277 	kthread_exit();
278 }
279 
280 static int
281 iwi_probe(device_t dev)
282 {
283 	const struct iwi_ident *ident;
284 	uint16_t vid, did;
285 
286 	vid = pci_get_vendor(dev);
287 	did = pci_get_device(dev);
288 	for (ident = iwi_ident_table; ident->name != NULL; ident++) {
289 		if (vid == ident->vendor && did == ident->device) {
290 			device_set_desc(dev, ident->name);
291 			return 0;
292 		}
293 	}
294 	return ENXIO;
295 }
296 
297 /* Base Address Register */
298 #define IWI_PCI_BAR0	0x10
299 
300 static int
301 iwi_attach(device_t dev)
302 {
303 	struct iwi_softc *sc = device_get_softc(dev);
304 	struct ieee80211com *ic = &sc->sc_ic;
305 	struct ifnet *ifp = &ic->ic_if;
306 	uint16_t val;
307 	int error, i;
308 
309 	sc->sc_dev = dev;
310 	if_initname(ifp, device_get_name(dev), device_get_unit(dev));
311 
312 	if (pci_get_powerstate(dev) != PCI_POWERSTATE_D0) {
313 		device_printf(dev, "chip is in D%d power mode "
314 		    "-- setting to D0\n", pci_get_powerstate(dev));
315 		pci_set_powerstate(dev, PCI_POWERSTATE_D0);
316 	}
317 
318 	pci_write_config(dev, 0x41, 0, 1);
319 
320 	/* enable bus-mastering */
321 	pci_enable_busmaster(dev);
322 
323 	sc->mem_rid = IWI_PCI_BAR0;
324 	sc->mem = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &sc->mem_rid,
325 					 RF_ACTIVE);
326 	if (sc->mem == NULL) {
327 		device_printf(dev, "could not allocate memory resource\n");
328 		return ENXIO;
329 	}
330 	sc->sc_st = rman_get_bustag(sc->mem);
331 	sc->sc_sh = rman_get_bushandle(sc->mem);
332 
333 	sc->irq_rid = 0;
334 	sc->irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, &sc->irq_rid,
335 					 RF_ACTIVE | RF_SHAREABLE);
336 	if (sc->irq == NULL) {
337 		device_printf(dev, "could not allocate interrupt resource\n");
338 		goto fail;
339 	}
340 
341 	if (iwi_reset(sc) != 0) {
342 		device_printf(dev, "could not reset adapter\n");
343 		goto fail;
344 	}
345 
346 	/*
347 	 * Allocate rings.
348 	 */
349 	error = iwi_alloc_cmd_ring(sc, &sc->cmdq, IWI_CMD_RING_COUNT);
350 	if (error != 0) {
351 		device_printf(dev, "could not allocate Cmd ring\n");
352 		goto fail;
353 	}
354 
355 	error = iwi_alloc_tx_ring(sc, &sc->txq[0], IWI_TX_RING_COUNT,
356 				  IWI_CSR_TX1_RIDX, IWI_CSR_TX1_WIDX);
357 	if (error != 0) {
358 		device_printf(dev, "could not allocate Tx ring 1\n");
359 		goto fail;
360 	}
361 
362 	error = iwi_alloc_tx_ring(sc, &sc->txq[1], IWI_TX_RING_COUNT,
363 				  IWI_CSR_TX2_RIDX, IWI_CSR_TX2_WIDX);
364 	if (error != 0) {
365 		device_printf(dev, "could not allocate Tx ring 2\n");
366 		goto fail;
367 	}
368 
369 	error = iwi_alloc_tx_ring(sc, &sc->txq[2], IWI_TX_RING_COUNT,
370 				  IWI_CSR_TX3_RIDX, IWI_CSR_TX3_WIDX);
371 	if (error != 0) {
372 		device_printf(dev, "could not allocate Tx ring 3\n");
373 		goto fail;
374 	}
375 
376 	error = iwi_alloc_tx_ring(sc, &sc->txq[3], IWI_TX_RING_COUNT,
377 				  IWI_CSR_TX4_RIDX, IWI_CSR_TX4_WIDX);
378 	if (error != 0) {
379 		device_printf(dev, "could not allocate Tx ring 4\n");
380 		goto fail;
381 	}
382 
383 	error = iwi_alloc_rx_ring(sc, &sc->rxq, IWI_RX_RING_COUNT);
384 	if (error != 0) {
385 		device_printf(dev, "could not allocate Rx ring\n");
386 		goto fail;
387 	}
388 
389 	sysctl_ctx_init(&sc->sysctl_ctx);
390 	sc->sysctl_tree = SYSCTL_ADD_NODE(&sc->sysctl_ctx,
391 				SYSCTL_STATIC_CHILDREN(_hw),
392 				OID_AUTO,
393 				device_get_nameunit(dev),
394 				CTLFLAG_RD,
395 				0, "");
396 	if (sc->sysctl_tree == NULL) {
397 		device_printf(dev, "sysctl add node failed\n");
398 		error = EIO;
399 		goto fail;
400 	}
401 
402 	ifp->if_softc = sc;
403 	ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
404 	ifp->if_init = iwi_init;
405 	ifp->if_ioctl = iwi_ioctl;
406 	ifp->if_start = iwi_start;
407 	ifp->if_watchdog = iwi_watchdog;
408 	ifq_set_maxlen(&ifp->if_snd, IFQ_MAXLEN);
409 	ifq_set_ready(&ifp->if_snd);
410 
411 	ic->ic_wme.wme_update = iwi_wme_update;
412 	ic->ic_phytype = IEEE80211_T_OFDM; /* not only, but not used */
413 	ic->ic_opmode = IEEE80211_M_STA; /* default to BSS mode */
414 	ic->ic_state = IEEE80211_S_INIT;
415 
416 	/* set device capabilities */
417 	ic->ic_caps =
418 	    IEEE80211_C_IBSS |		/* IBSS mode supported */
419 	    IEEE80211_C_MONITOR |	/* monitor mode supported */
420 	    IEEE80211_C_TXPMGT |	/* tx power management */
421 	    IEEE80211_C_SHPREAMBLE |	/* short preamble supported */
422 	    IEEE80211_C_WPA |		/* 802.11i */
423 	    IEEE80211_C_WME;		/* 802.11e */
424 
425 	/* read MAC address from EEPROM */
426 	val = iwi_read_prom_word(sc, IWI_EEPROM_MAC + 0);
427 	ic->ic_myaddr[0] = val & 0xff;
428 	ic->ic_myaddr[1] = val >> 8;
429 	val = iwi_read_prom_word(sc, IWI_EEPROM_MAC + 1);
430 	ic->ic_myaddr[2] = val & 0xff;
431 	ic->ic_myaddr[3] = val >> 8;
432 	val = iwi_read_prom_word(sc, IWI_EEPROM_MAC + 2);
433 	ic->ic_myaddr[4] = val & 0xff;
434 	ic->ic_myaddr[5] = val >> 8;
435 
436 	if (pci_get_device(dev) >= 0x4223) {
437 		/* set supported .11a rates (2915ABG only) */
438 		ic->ic_sup_rates[IEEE80211_MODE_11A] = iwi_rateset_11a;
439 
440 		/* set supported .11a channels */
441 		for (i = 36; i <= 64; i += 4) {
442 			ic->ic_channels[i].ic_freq =
443 			    ieee80211_ieee2mhz(i, IEEE80211_CHAN_5GHZ);
444 			ic->ic_channels[i].ic_flags = IEEE80211_CHAN_A;
445 		}
446 		for (i = 149; i <= 165; i += 4) {
447 			ic->ic_channels[i].ic_freq =
448 			    ieee80211_ieee2mhz(i, IEEE80211_CHAN_5GHZ);
449 			ic->ic_channels[i].ic_flags = IEEE80211_CHAN_A;
450 		}
451 	}
452 
453 	/* set supported .11b and .11g rates */
454 	ic->ic_sup_rates[IEEE80211_MODE_11B] = iwi_rateset_11b;
455 	ic->ic_sup_rates[IEEE80211_MODE_11G] = iwi_rateset_11g;
456 
457 	/* set supported .11b and .11g channels (1 through 14) */
458 	for (i = 1; i <= 14; i++) {
459 		ic->ic_channels[i].ic_freq =
460 		    ieee80211_ieee2mhz(i, IEEE80211_CHAN_2GHZ);
461 		ic->ic_channels[i].ic_flags =
462 		    IEEE80211_CHAN_CCK | IEEE80211_CHAN_OFDM |
463 		    IEEE80211_CHAN_DYN | IEEE80211_CHAN_2GHZ;
464 	}
465 
466 	ieee80211_ifattach(ic);
467 	/* override default methods */
468 	ic->ic_node_alloc = iwi_node_alloc;
469 	sc->sc_node_free = ic->ic_node_free;
470 	ic->ic_node_free = iwi_node_free;
471 	/* override state transition machine */
472 	sc->sc_newstate = ic->ic_newstate;
473 	ic->ic_newstate = iwi_newstate;
474 	ieee80211_media_init(ic, iwi_media_change, iwi_media_status);
475 
476 	bpfattach_dlt(ifp, DLT_IEEE802_11_RADIO,
477 	    sizeof (struct ieee80211_frame) + 64, &sc->sc_drvbpf);
478 
479 	sc->sc_rxtap_len = sizeof sc->sc_rxtapu;
480 	sc->sc_rxtap.wr_ihdr.it_len = htole16(sc->sc_rxtap_len);
481 	sc->sc_rxtap.wr_ihdr.it_present = htole32(IWI_RX_RADIOTAP_PRESENT);
482 
483 	sc->sc_txtap_len = sizeof sc->sc_txtapu;
484 	sc->sc_txtap.wt_ihdr.it_len = htole16(sc->sc_txtap_len);
485 	sc->sc_txtap.wt_ihdr.it_present = htole32(IWI_TX_RADIOTAP_PRESENT);
486 
487 	/*
488 	 * Add a few sysctl knobs.
489 	 */
490 	sc->dwelltime = 100;
491 	sc->bluetooth = 1;
492 	sc->antenna = 0;
493 
494 	SYSCTL_ADD_PROC(&sc->sysctl_ctx,
495 	    SYSCTL_CHILDREN(sc->sysctl_tree), OID_AUTO, "radio",
496 	    CTLTYPE_INT | CTLFLAG_RD, sc, 0, iwi_sysctl_radio, "I",
497 	    "radio transmitter switch state (0=off, 1=on)");
498 
499 	SYSCTL_ADD_PROC(&sc->sysctl_ctx,
500 	    SYSCTL_CHILDREN(sc->sysctl_tree), OID_AUTO, "stats",
501 	    CTLTYPE_OPAQUE | CTLFLAG_RD, sc, 0, iwi_sysctl_stats, "S",
502 	    "statistics");
503 
504 	SYSCTL_ADD_INT(&sc->sysctl_ctx,
505 	    SYSCTL_CHILDREN(sc->sysctl_tree), OID_AUTO, "dwell",
506 	    CTLFLAG_RW, &sc->dwelltime, 0,
507 	    "channel dwell time (ms) for AP/station scanning");
508 
509 	SYSCTL_ADD_INT(&sc->sysctl_ctx,
510 	    SYSCTL_CHILDREN(sc->sysctl_tree), OID_AUTO, "bluetooth",
511 	    CTLFLAG_RW, &sc->bluetooth, 0, "bluetooth coexistence");
512 
513 	SYSCTL_ADD_INT(&sc->sysctl_ctx,
514 	    SYSCTL_CHILDREN(sc->sysctl_tree), OID_AUTO, "antenna",
515 	    CTLFLAG_RW, &sc->antenna, 0, "antenna (0=auto)");
516 
517 	/*
518 	 * Start firmware monitoring thread
519 	 *
520 	 * NOTE:
521 	 * This should be done only after serializer is initialized,
522 	 * i.e. after ieee80211_ifattach(), because serializer will be
523 	 * held once iwi_fw_monitor() is entered.
524 	 */
525 	error = kthread_create(iwi_fw_monitor, sc, &sc->sc_fw_monitor,
526 			       "%s:fw-monitor", device_get_nameunit(dev));
527 	if (error) {
528 		device_printf(dev, "could not create fw monitor\n");
529 		goto fail1;
530 	}
531 	sc->flags |= IWI_FLAG_MONITOR;
532 
533 	/*
534 	 * Hook our interrupt after all initialization is complete.
535 	 */
536 	error = bus_setup_intr(dev, sc->irq, INTR_MPSAFE, iwi_intr, sc,
537 			       &sc->sc_ih, ifp->if_serializer);
538 	if (error != 0) {
539 		device_printf(dev, "could not set up interrupt\n");
540 		goto fail1;
541 	}
542 
543 	ifp->if_cpuid = ithread_cpuid(rman_get_start(sc->irq));
544 	KKASSERT(ifp->if_cpuid >= 0 && ifp->if_cpuid < ncpus);
545 
546 	if (bootverbose)
547 		ieee80211_announce(ic);
548 
549 	return 0;
550 
551 fail1:
552 	bpfdetach(ifp);
553 	ieee80211_ifdetach(ic);
554 fail:
555 	iwi_detach(dev);
556 	return ENXIO;
557 }
558 
559 static int
560 iwi_detach(device_t dev)
561 {
562 	struct iwi_softc *sc = device_get_softc(dev);
563 	struct ieee80211com *ic = &sc->sc_ic;
564 	struct ifnet *ifp = ic->ic_ifp;
565 
566 	if (sc->flags & IWI_FLAG_MONITOR) {
567 		lwkt_serialize_enter(ifp->if_serializer);
568 		sc->flags |= IWI_FLAG_EXIT;
569 		wakeup(IWI_FW_WAKE_MONITOR(sc));
570 
571 		crit_enter();
572 		tsleep_interlock(IWI_FW_EXIT_MONITOR(sc));
573 		lwkt_serialize_exit(ifp->if_serializer);
574 		tsleep(IWI_FW_EXIT_MONITOR(sc), 0, "iwiexi", 0);
575 		crit_exit();
576 		/* No need to hold serializer again */
577 
578 		if_printf(ifp, "fw monitor exited\n");
579 	}
580 
581 	if (device_is_attached(dev)) {
582 		lwkt_serialize_enter(ifp->if_serializer);
583 
584 		iwi_stop(sc);
585 		bus_teardown_intr(dev, sc->irq, sc->sc_ih);
586 		iwi_free_firmware(sc);
587 
588 		lwkt_serialize_exit(ifp->if_serializer);
589 
590 		bpfdetach(ifp);
591 		ieee80211_ifdetach(ic);
592 	}
593 
594 	iwi_free_cmd_ring(sc, &sc->cmdq);
595 	iwi_free_tx_ring(sc, &sc->txq[0]);
596 	iwi_free_tx_ring(sc, &sc->txq[1]);
597 	iwi_free_tx_ring(sc, &sc->txq[2]);
598 	iwi_free_tx_ring(sc, &sc->txq[3]);
599 	iwi_free_rx_ring(sc, &sc->rxq);
600 
601 	if (sc->irq != NULL)
602 		bus_release_resource(dev, SYS_RES_IRQ, sc->irq_rid, sc->irq);
603 
604 	if (sc->mem != NULL)
605 		bus_release_resource(dev, SYS_RES_MEMORY, sc->mem_rid, sc->mem);
606 
607 	if (sc->sysctl_tree != NULL)
608 		sysctl_ctx_free(&sc->sysctl_ctx);
609 
610 	return 0;
611 }
612 
613 static void
614 iwi_dma_map_addr(void *arg, bus_dma_segment_t *segs, int nseg, int error)
615 {
616 	if (error != 0)
617 		return;
618 
619 	KASSERT(nseg == 1, ("too many DMA segments, %d should be 1", nseg));
620 
621 	*(bus_addr_t *)arg = segs[0].ds_addr;
622 }
623 
624 static int
625 iwi_alloc_cmd_ring(struct iwi_softc *sc, struct iwi_cmd_ring *ring, int count)
626 {
627 	int error;
628 
629 	ring->count = count;
630 	ring->queued = 0;
631 	ring->cur = ring->next = 0;
632 
633 	error = bus_dma_tag_create(NULL, 4, 0, BUS_SPACE_MAXADDR_32BIT,
634 	    BUS_SPACE_MAXADDR, NULL, NULL, count * IWI_CMD_DESC_SIZE, 1,
635 	    count * IWI_CMD_DESC_SIZE, 0, &ring->desc_dmat);
636 	if (error != 0) {
637 		device_printf(sc->sc_dev, "could not create desc DMA tag\n");
638 		goto fail;
639 	}
640 
641 	error = bus_dmamem_alloc(ring->desc_dmat, (void **)&ring->desc,
642 	    BUS_DMA_WAITOK | BUS_DMA_ZERO, &ring->desc_map);
643 	if (error != 0) {
644 		device_printf(sc->sc_dev, "could not allocate DMA memory\n");
645 		goto fail;
646 	}
647 
648 	error = bus_dmamap_load(ring->desc_dmat, ring->desc_map, ring->desc,
649 	    count * IWI_CMD_DESC_SIZE, iwi_dma_map_addr, &ring->physaddr, 0);
650 	if (error != 0) {
651 		device_printf(sc->sc_dev, "could not load desc DMA map\n");
652 		bus_dmamem_free(ring->desc_dmat, ring->desc, ring->desc_map);
653 		ring->desc = NULL;
654 		return error;
655 	}
656 
657 	return 0;
658 
659 fail:	iwi_free_cmd_ring(sc, ring);
660 	return error;
661 }
662 
663 static void
664 iwi_reset_cmd_ring(struct iwi_softc *sc, struct iwi_cmd_ring *ring)
665 {
666 	ring->queued = 0;
667 	ring->cur = ring->next = 0;
668 }
669 
670 static void
671 iwi_free_cmd_ring(struct iwi_softc *sc, struct iwi_cmd_ring *ring)
672 {
673 	if (ring->desc != NULL) {
674 		bus_dmamap_sync(ring->desc_dmat, ring->desc_map,
675 		    BUS_DMASYNC_POSTWRITE);
676 		bus_dmamap_unload(ring->desc_dmat, ring->desc_map);
677 		bus_dmamem_free(ring->desc_dmat, ring->desc, ring->desc_map);
678 		ring->desc = NULL;
679 	}
680 
681 	if (ring->desc_dmat != NULL) {
682 		bus_dma_tag_destroy(ring->desc_dmat);
683 		ring->desc_dmat = NULL;
684 	}
685 }
686 
687 static int
688 iwi_alloc_tx_ring(struct iwi_softc *sc, struct iwi_tx_ring *ring, int count,
689     bus_addr_t csr_ridx, bus_addr_t csr_widx)
690 {
691 	int i, error;
692 
693 	ring->count = count;
694 	ring->queued = 0;
695 	ring->cur = ring->next = 0;
696 	ring->csr_ridx = csr_ridx;
697 	ring->csr_widx = csr_widx;
698 
699 	error = bus_dma_tag_create(NULL, 4, 0, BUS_SPACE_MAXADDR_32BIT,
700 	    BUS_SPACE_MAXADDR, NULL, NULL, count * IWI_TX_DESC_SIZE, 1,
701 	    count * IWI_TX_DESC_SIZE, 0, &ring->desc_dmat);
702 	if (error != 0) {
703 		device_printf(sc->sc_dev, "could not create desc DMA tag\n");
704 		goto fail;
705 	}
706 
707 	error = bus_dmamem_alloc(ring->desc_dmat, (void **)&ring->desc,
708 	    BUS_DMA_WAITOK | BUS_DMA_ZERO, &ring->desc_map);
709 	if (error != 0) {
710 		device_printf(sc->sc_dev, "could not allocate DMA memory\n");
711 		goto fail;
712 	}
713 
714 	error = bus_dmamap_load(ring->desc_dmat, ring->desc_map, ring->desc,
715 	    count * IWI_TX_DESC_SIZE, iwi_dma_map_addr, &ring->physaddr, 0);
716 	if (error != 0) {
717 		device_printf(sc->sc_dev, "could not load desc DMA map\n");
718 
719 		bus_dmamem_free(ring->desc_dmat, ring->desc, ring->desc_map);
720 		ring->desc = NULL;
721 		goto fail;
722 	}
723 
724 	ring->data = kmalloc(count * sizeof (struct iwi_tx_data), M_DEVBUF,
725 	    M_WAITOK | M_ZERO);
726 
727 	error = bus_dma_tag_create(NULL, 1, 0, BUS_SPACE_MAXADDR_32BIT,
728 	    BUS_SPACE_MAXADDR, NULL, NULL, MCLBYTES, IWI_MAX_NSEG - 2,
729 	    MCLBYTES, 0, &ring->data_dmat);
730 	if (error != 0) {
731 		device_printf(sc->sc_dev, "could not create data DMA tag\n");
732 		goto fail;
733 	}
734 
735 	for (i = 0; i < count; i++) {
736 		error = bus_dmamap_create(ring->data_dmat, 0,
737 		    &ring->data[i].map);
738 		if (error != 0) {
739 			device_printf(sc->sc_dev, "could not create DMA map\n");
740 			goto fail;
741 		}
742 	}
743 
744 	return 0;
745 
746 fail:	iwi_free_tx_ring(sc, ring);
747 	return error;
748 }
749 
750 static void
751 iwi_reset_tx_ring(struct iwi_softc *sc, struct iwi_tx_ring *ring)
752 {
753 	struct iwi_tx_data *data;
754 	int i;
755 
756 	for (i = 0; i < ring->count; i++) {
757 		data = &ring->data[i];
758 
759 		if (data->m != NULL) {
760 			bus_dmamap_sync(ring->data_dmat, data->map,
761 			    BUS_DMASYNC_POSTWRITE);
762 			bus_dmamap_unload(ring->data_dmat, data->map);
763 			m_freem(data->m);
764 			data->m = NULL;
765 		}
766 
767 		if (data->ni != NULL) {
768 			ieee80211_free_node(data->ni);
769 			data->ni = NULL;
770 		}
771 	}
772 
773 	ring->queued = 0;
774 	ring->cur = ring->next = 0;
775 }
776 
777 static void
778 iwi_free_tx_ring(struct iwi_softc *sc, struct iwi_tx_ring *ring)
779 {
780 	struct iwi_tx_data *data;
781 	int i;
782 
783 	if (ring->desc != NULL) {
784 		bus_dmamap_sync(ring->desc_dmat, ring->desc_map,
785 		    BUS_DMASYNC_POSTWRITE);
786 		bus_dmamap_unload(ring->desc_dmat, ring->desc_map);
787 		bus_dmamem_free(ring->desc_dmat, ring->desc, ring->desc_map);
788 		ring->desc = NULL;
789 	}
790 
791 	if (ring->desc_dmat != NULL) {
792 		bus_dma_tag_destroy(ring->desc_dmat);
793 		ring->desc_dmat = NULL;
794 	}
795 
796 	if (ring->data != NULL) {
797 		for (i = 0; i < ring->count; i++) {
798 			data = &ring->data[i];
799 
800 			if (data->m != NULL) {
801 				bus_dmamap_sync(ring->data_dmat, data->map,
802 				    BUS_DMASYNC_POSTWRITE);
803 				bus_dmamap_unload(ring->data_dmat, data->map);
804 				m_freem(data->m);
805 				data->m = NULL;
806 			}
807 
808 			if (data->ni != NULL) {
809 				ieee80211_free_node(data->ni);
810 				data->ni = NULL;
811 			}
812 
813 			if (data->map != NULL) {
814 				bus_dmamap_destroy(ring->data_dmat, data->map);
815 				data->map = NULL;
816 			}
817 		}
818 
819 		kfree(ring->data, M_DEVBUF);
820 		ring->data = NULL;
821 	}
822 
823 	if (ring->data_dmat != NULL) {
824 		bus_dma_tag_destroy(ring->data_dmat);
825 		ring->data_dmat = NULL;
826 	}
827 }
828 
829 static int
830 iwi_alloc_rx_ring(struct iwi_softc *sc, struct iwi_rx_ring *ring, int count)
831 {
832 	struct iwi_rx_data *data;
833 	int i, error;
834 
835 	ring->count = count;
836 	ring->cur = 0;
837 
838 	ring->data = kmalloc(count * sizeof (struct iwi_rx_data), M_DEVBUF,
839 	    M_WAITOK | M_ZERO);
840 
841 	error = bus_dma_tag_create(NULL, 1, 0, BUS_SPACE_MAXADDR_32BIT,
842 	    BUS_SPACE_MAXADDR, NULL, NULL, MCLBYTES, 1, MCLBYTES, 0,
843 	    &ring->data_dmat);
844 	if (error != 0) {
845 		device_printf(sc->sc_dev, "could not create data DMA tag\n");
846 		goto fail;
847 	}
848 
849 	for (i = 0; i < count; i++) {
850 		data = &ring->data[i];
851 
852 		error = bus_dmamap_create(ring->data_dmat, 0, &data->map);
853 		if (error != 0) {
854 			device_printf(sc->sc_dev, "could not create DMA map\n");
855 			goto fail;
856 		}
857 
858 		data->m = m_getcl(MB_WAIT, MT_DATA, M_PKTHDR);
859 		if (data->m == NULL) {
860 			device_printf(sc->sc_dev,
861 			    "could not allocate rx mbuf\n");
862 			error = ENOMEM;
863 			goto fail;
864 		}
865 
866 		error = bus_dmamap_load(ring->data_dmat, data->map,
867 		    mtod(data->m, void *), MCLBYTES, iwi_dma_map_addr,
868 		    &data->physaddr, 0);
869 		if (error != 0) {
870 			device_printf(sc->sc_dev,
871 			    "could not load rx buf DMA map");
872 
873 			m_freem(data->m);
874 			data->m = NULL;
875 			goto fail;
876 		}
877 
878 		data->reg = IWI_CSR_RX_BASE + i * 4;
879 	}
880 
881 	return 0;
882 
883 fail:	iwi_free_rx_ring(sc, ring);
884 	return error;
885 }
886 
887 static void
888 iwi_reset_rx_ring(struct iwi_softc *sc, struct iwi_rx_ring *ring)
889 {
890 	ring->cur = 0;
891 }
892 
893 static void
894 iwi_free_rx_ring(struct iwi_softc *sc, struct iwi_rx_ring *ring)
895 {
896 	struct iwi_rx_data *data;
897 	int i;
898 
899 	if (ring->data != NULL) {
900 		for (i = 0; i < ring->count; i++) {
901 			data = &ring->data[i];
902 
903 			if (data->m != NULL) {
904 				bus_dmamap_sync(ring->data_dmat, data->map,
905 				    BUS_DMASYNC_POSTREAD);
906 				bus_dmamap_unload(ring->data_dmat, data->map);
907 				m_freem(data->m);
908 				data->m = NULL;
909 			}
910 
911 			if (data->map != NULL) {
912 				bus_dmamap_destroy(ring->data_dmat, data->map);
913 				data->map = NULL;
914 			}
915 		}
916 
917 		kfree(ring->data, M_DEVBUF);
918 		ring->data = NULL;
919 	}
920 
921 	if (ring->data_dmat != NULL) {
922 		bus_dma_tag_destroy(ring->data_dmat);
923 		ring->data_dmat = NULL;
924 	}
925 }
926 
927 static int
928 iwi_shutdown(device_t dev)
929 {
930 	struct iwi_softc *sc = device_get_softc(dev);
931 	struct ifnet *ifp = &sc->sc_ic.ic_if;
932 
933 	lwkt_serialize_enter(ifp->if_serializer);
934 	iwi_stop(sc);
935 	lwkt_serialize_exit(ifp->if_serializer);
936 
937 	return 0;
938 }
939 
940 static int
941 iwi_suspend(device_t dev)
942 {
943 	struct iwi_softc *sc = device_get_softc(dev);
944 	struct ifnet *ifp = &sc->sc_ic.ic_if;
945 
946 	lwkt_serialize_enter(ifp->if_serializer);
947 	iwi_stop(sc);
948 	lwkt_serialize_exit(ifp->if_serializer);
949 
950 	return 0;
951 }
952 
953 static int
954 iwi_resume(device_t dev)
955 {
956 	struct iwi_softc *sc = device_get_softc(dev);
957 	struct ifnet *ifp = sc->sc_ic.ic_ifp;
958 
959 	lwkt_serialize_enter(ifp->if_serializer);
960 
961 	pci_write_config(dev, 0x41, 0, 1);
962 
963 	if (ifp->if_flags & IFF_UP) {
964 		ifp->if_init(ifp->if_softc);
965 		if (ifp->if_flags & IFF_RUNNING)
966 			if_devstart(ifp);
967 	}
968 
969 	lwkt_serialize_exit(ifp->if_serializer);
970 
971 	return 0;
972 }
973 
974 static struct ieee80211_node *
975 iwi_node_alloc(struct ieee80211_node_table *nt)
976 {
977 	struct iwi_node *in;
978 
979 	in = kmalloc(sizeof (struct iwi_node), M_80211_NODE, M_NOWAIT | M_ZERO);
980 	if (in == NULL)
981 		return NULL;
982 
983 	in->in_station = -1;
984 
985 	return &in->in_node;
986 }
987 
988 static void
989 iwi_node_free(struct ieee80211_node *ni)
990 {
991 	struct ieee80211com *ic = ni->ni_ic;
992 	struct iwi_softc *sc = ic->ic_ifp->if_softc;
993 	struct iwi_node *in = (struct iwi_node *)ni;
994 
995 	if (in->in_station != -1)
996 		iwi_free_ibss_node(sc, in->in_station);
997 
998 	sc->sc_node_free(ni);
999 }
1000 
1001 static int
1002 iwi_media_change(struct ifnet *ifp)
1003 {
1004 	struct iwi_softc *sc = ifp->if_softc;
1005 	int error;
1006 
1007 	ASSERT_SERIALIZED(ifp->if_serializer);
1008 
1009 	error = ieee80211_media_change(ifp);
1010 	if (error != ENETRESET)
1011 		return error;
1012 
1013 	if ((ifp->if_flags & (IFF_UP | IFF_RUNNING)) == (IFF_UP | IFF_RUNNING))
1014 		iwi_init(sc);
1015 	return 0;
1016 }
1017 
1018 /*
1019  * The firmware automatically adapts the transmit speed.  We report its current
1020  * value here.
1021  */
1022 static void
1023 iwi_media_status(struct ifnet *ifp, struct ifmediareq *imr)
1024 {
1025 	struct iwi_softc *sc = ifp->if_softc;
1026 	struct ieee80211com *ic = &sc->sc_ic;
1027 #define N(a)	(sizeof (a) / sizeof (a[0]))
1028 	static const struct {
1029 		uint32_t	val;
1030 		int		rate;
1031 	} rates[] = {
1032 		{ IWI_RATE_DS1,      2 },
1033 		{ IWI_RATE_DS2,      4 },
1034 		{ IWI_RATE_DS5,     11 },
1035 		{ IWI_RATE_DS11,    22 },
1036 		{ IWI_RATE_OFDM6,   12 },
1037 		{ IWI_RATE_OFDM9,   18 },
1038 		{ IWI_RATE_OFDM12,  24 },
1039 		{ IWI_RATE_OFDM18,  36 },
1040 		{ IWI_RATE_OFDM24,  48 },
1041 		{ IWI_RATE_OFDM36,  72 },
1042 		{ IWI_RATE_OFDM48,  96 },
1043 		{ IWI_RATE_OFDM54, 108 },
1044 	};
1045 	uint32_t val;
1046 	int rate, i;
1047 
1048 	imr->ifm_status = IFM_AVALID;
1049 	imr->ifm_active = IFM_IEEE80211;
1050 	if (ic->ic_state == IEEE80211_S_RUN)
1051 		imr->ifm_status |= IFM_ACTIVE;
1052 
1053 	/* read current transmission rate from adapter */
1054 	val = CSR_READ_4(sc, IWI_CSR_CURRENT_TX_RATE);
1055 
1056 	/* convert rate to 802.11 rate */
1057 	for (i = 0; i < N(rates) && rates[i].val != val; i++);
1058 	rate = (i < N(rates)) ? rates[i].rate : 0;
1059 
1060 	imr->ifm_active |= ieee80211_rate2media(ic, rate, ic->ic_curmode);
1061 	switch (ic->ic_opmode) {
1062 	case IEEE80211_M_STA:
1063 		break;
1064 
1065 	case IEEE80211_M_IBSS:
1066 		imr->ifm_active |= IFM_IEEE80211_ADHOC;
1067 		break;
1068 
1069 	case IEEE80211_M_MONITOR:
1070 		imr->ifm_active |= IFM_IEEE80211_MONITOR;
1071 		break;
1072 
1073 	case IEEE80211_M_AHDEMO:
1074 	case IEEE80211_M_HOSTAP:
1075 		/* should not get there */
1076 		break;
1077 	}
1078 #undef N
1079 }
1080 
1081 static int
1082 iwi_newstate(struct ieee80211com *ic, enum ieee80211_state nstate, int arg)
1083 {
1084 	struct ifnet *ifp = ic->ic_ifp;
1085 	struct iwi_softc *sc = ifp->if_softc;
1086 	enum ieee80211_state ostate;
1087 	uint32_t tmp;
1088 
1089 	ostate = ic->ic_state;
1090 
1091 	switch (nstate) {
1092 	case IEEE80211_S_SCAN:
1093 		if (sc->flags & IWI_FLAG_SCANNING)
1094 			break;
1095 
1096 		ieee80211_node_table_reset(&ic->ic_scan);
1097 		ic->ic_flags |= IEEE80211_F_SCAN | IEEE80211_F_ASCAN;
1098 		sc->flags |= IWI_FLAG_SCANNING;
1099 		iwi_scan(sc);
1100 		break;
1101 
1102 	case IEEE80211_S_AUTH:
1103 		iwi_auth_and_assoc(sc);
1104 		break;
1105 
1106 	case IEEE80211_S_RUN:
1107 		if (ic->ic_opmode == IEEE80211_M_IBSS)
1108 			iwi_auth_and_assoc(sc);
1109 		else if (ic->ic_opmode == IEEE80211_M_MONITOR)
1110 			iwi_set_chan(sc, ic->ic_ibss_chan);
1111 
1112 		/* assoc led on */
1113 		tmp = MEM_READ_4(sc, IWI_MEM_EVENT_CTL) & IWI_LED_MASK;
1114 		MEM_WRITE_4(sc, IWI_MEM_EVENT_CTL, tmp | IWI_LED_ASSOC);
1115 
1116 		return sc->sc_newstate(ic, nstate,
1117 		    IEEE80211_FC0_SUBTYPE_ASSOC_RESP);
1118 
1119 	case IEEE80211_S_ASSOC:
1120 		break;
1121 
1122 	case IEEE80211_S_INIT:
1123 		sc->flags &= ~IWI_FLAG_SCANNING;
1124 
1125 		if (ostate != IEEE80211_S_RUN)
1126 			break;
1127 
1128 		/* assoc led off */
1129 		tmp = MEM_READ_4(sc, IWI_MEM_EVENT_CTL) & IWI_LED_MASK;
1130 		MEM_WRITE_4(sc, IWI_MEM_EVENT_CTL, tmp & ~IWI_LED_ASSOC);
1131 		break;
1132 	}
1133 
1134 	ic->ic_state = nstate;
1135 
1136 	return 0;
1137 }
1138 
1139 /*
1140  * WME parameters coming from IEEE 802.11e specification.  These values are
1141  * already declared in ieee80211_proto.c, but they are static so they can't
1142  * be reused here.
1143  */
1144 static const struct wmeParams iwi_wme_cck_params[WME_NUM_AC] = {
1145 	{ 0, 3, 5,  7,   0 },	/* WME_AC_BE */
1146 	{ 0, 3, 5, 10,   0 },	/* WME_AC_BK */
1147 	{ 0, 2, 4,  5, 188 },	/* WME_AC_VI */
1148 	{ 0, 2, 3,  4, 102 }	/* WME_AC_VO */
1149 };
1150 
1151 static const struct wmeParams iwi_wme_ofdm_params[WME_NUM_AC] = {
1152 	{ 0, 3, 4,  6,   0 },	/* WME_AC_BE */
1153 	{ 0, 3, 4, 10,   0 },	/* WME_AC_BK */
1154 	{ 0, 2, 3,  4,  94 },	/* WME_AC_VI */
1155 	{ 0, 2, 2,  3,  47 }	/* WME_AC_VO */
1156 };
1157 
1158 static int
1159 iwi_wme_update(struct ieee80211com *ic)
1160 {
1161 #define IWI_EXP2(v)	htole16((1 << (v)) - 1)
1162 #define IWI_USEC(v)	htole16(IEEE80211_TXOP_TO_US(v))
1163 	struct iwi_softc *sc = ic->ic_ifp->if_softc;
1164 	struct iwi_wme_params wme[3];
1165 	const struct wmeParams *wmep;
1166 	int ac;
1167 
1168 	/*
1169 	 * We shall not override firmware default WME values if WME is not
1170 	 * actually enabled.
1171 	 */
1172 	if (!(ic->ic_flags & IEEE80211_F_WME))
1173 		return 0;
1174 
1175 	for (ac = 0; ac < WME_NUM_AC; ac++) {
1176 		/* set WME values for current operating mode */
1177 		wmep = &ic->ic_wme.wme_chanParams.cap_wmeParams[ac];
1178 		wme[0].aifsn[ac] = wmep->wmep_aifsn;
1179 		wme[0].cwmin[ac] = IWI_EXP2(wmep->wmep_logcwmin);
1180 		wme[0].cwmax[ac] = IWI_EXP2(wmep->wmep_logcwmax);
1181 		wme[0].burst[ac] = IWI_USEC(wmep->wmep_txopLimit);
1182 		wme[0].acm[ac]   = wmep->wmep_acm;
1183 
1184 		/* set WME values for CCK modulation */
1185 		wmep = &iwi_wme_cck_params[ac];
1186 		wme[1].aifsn[ac] = wmep->wmep_aifsn;
1187 		wme[1].cwmin[ac] = IWI_EXP2(wmep->wmep_logcwmin);
1188 		wme[1].cwmax[ac] = IWI_EXP2(wmep->wmep_logcwmax);
1189 		wme[1].burst[ac] = IWI_USEC(wmep->wmep_txopLimit);
1190 		wme[1].acm[ac]   = wmep->wmep_acm;
1191 
1192 		/* set WME values for OFDM modulation */
1193 		wmep = &iwi_wme_ofdm_params[ac];
1194 		wme[2].aifsn[ac] = wmep->wmep_aifsn;
1195 		wme[2].cwmin[ac] = IWI_EXP2(wmep->wmep_logcwmin);
1196 		wme[2].cwmax[ac] = IWI_EXP2(wmep->wmep_logcwmax);
1197 		wme[2].burst[ac] = IWI_USEC(wmep->wmep_txopLimit);
1198 		wme[2].acm[ac]   = wmep->wmep_acm;
1199 	}
1200 
1201 	DPRINTF(("Setting WME parameters\n"));
1202 	return iwi_cmd(sc, IWI_CMD_SET_WME_PARAMS, wme, sizeof wme, 1);
1203 #undef IWI_USEC
1204 #undef IWI_EXP2
1205 }
1206 
1207 /*
1208  * Read 16 bits at address 'addr' from the serial EEPROM.
1209  */
1210 static uint16_t
1211 iwi_read_prom_word(struct iwi_softc *sc, uint8_t addr)
1212 {
1213 	uint32_t tmp;
1214 	uint16_t val;
1215 	int n;
1216 
1217 	/* Clock C once before the first command */
1218 	IWI_EEPROM_CTL(sc, 0);
1219 	IWI_EEPROM_CTL(sc, IWI_EEPROM_S);
1220 	IWI_EEPROM_CTL(sc, IWI_EEPROM_S | IWI_EEPROM_C);
1221 	IWI_EEPROM_CTL(sc, IWI_EEPROM_S);
1222 
1223 	/* Write start bit (1) */
1224 	IWI_EEPROM_CTL(sc, IWI_EEPROM_S | IWI_EEPROM_D);
1225 	IWI_EEPROM_CTL(sc, IWI_EEPROM_S | IWI_EEPROM_D | IWI_EEPROM_C);
1226 
1227 	/* Write READ opcode (10) */
1228 	IWI_EEPROM_CTL(sc, IWI_EEPROM_S | IWI_EEPROM_D);
1229 	IWI_EEPROM_CTL(sc, IWI_EEPROM_S | IWI_EEPROM_D | IWI_EEPROM_C);
1230 	IWI_EEPROM_CTL(sc, IWI_EEPROM_S);
1231 	IWI_EEPROM_CTL(sc, IWI_EEPROM_S | IWI_EEPROM_C);
1232 
1233 	/* Write address A7-A0 */
1234 	for (n = 7; n >= 0; n--) {
1235 		IWI_EEPROM_CTL(sc, IWI_EEPROM_S |
1236 		    (((addr >> n) & 1) << IWI_EEPROM_SHIFT_D));
1237 		IWI_EEPROM_CTL(sc, IWI_EEPROM_S |
1238 		    (((addr >> n) & 1) << IWI_EEPROM_SHIFT_D) | IWI_EEPROM_C);
1239 	}
1240 
1241 	IWI_EEPROM_CTL(sc, IWI_EEPROM_S);
1242 
1243 	/* Read data Q15-Q0 */
1244 	val = 0;
1245 	for (n = 15; n >= 0; n--) {
1246 		IWI_EEPROM_CTL(sc, IWI_EEPROM_S | IWI_EEPROM_C);
1247 		IWI_EEPROM_CTL(sc, IWI_EEPROM_S);
1248 		tmp = MEM_READ_4(sc, IWI_MEM_EEPROM_CTL);
1249 		val |= ((tmp & IWI_EEPROM_Q) >> IWI_EEPROM_SHIFT_Q) << n;
1250 	}
1251 
1252 	IWI_EEPROM_CTL(sc, 0);
1253 
1254 	/* Clear Chip Select and clock C */
1255 	IWI_EEPROM_CTL(sc, IWI_EEPROM_S);
1256 	IWI_EEPROM_CTL(sc, 0);
1257 	IWI_EEPROM_CTL(sc, IWI_EEPROM_C);
1258 
1259 	return val;
1260 }
1261 
1262 /*
1263  * XXX: Hack to set the current channel to the value advertised in beacons or
1264  * probe responses. Only used during AP detection.
1265  */
1266 static void
1267 iwi_fix_channel(struct ieee80211com *ic, struct mbuf *m)
1268 {
1269 	struct ieee80211_frame *wh;
1270 	uint8_t subtype;
1271 	uint8_t *frm, *efrm;
1272 
1273 	wh = mtod(m, struct ieee80211_frame *);
1274 
1275 	if ((wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK) != IEEE80211_FC0_TYPE_MGT)
1276 		return;
1277 
1278 	subtype = wh->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK;
1279 
1280 	if (subtype != IEEE80211_FC0_SUBTYPE_BEACON &&
1281 	    subtype != IEEE80211_FC0_SUBTYPE_PROBE_RESP)
1282 		return;
1283 
1284 	frm = (uint8_t *)(wh + 1);
1285 	efrm = mtod(m, uint8_t *) + m->m_len;
1286 
1287 	frm += 12;	/* skip tstamp, bintval and capinfo fields */
1288 	while (frm < efrm) {
1289 		if (*frm == IEEE80211_ELEMID_DSPARMS)
1290 #if IEEE80211_CHAN_MAX < 255
1291 		if (frm[2] <= IEEE80211_CHAN_MAX)
1292 #endif
1293 			ic->ic_curchan = &ic->ic_channels[frm[2]];
1294 
1295 		frm += frm[1] + 2;
1296 	}
1297 }
1298 
1299 static void
1300 iwi_frame_intr(struct iwi_softc *sc, struct iwi_rx_data *data, int i,
1301     struct iwi_frame *frame)
1302 {
1303 	struct ieee80211com *ic = &sc->sc_ic;
1304 	struct ifnet *ifp = ic->ic_ifp;
1305 	struct mbuf *mnew, *m;
1306 	struct ieee80211_frame *wh;
1307 	struct ieee80211_node *ni;
1308 	int error;
1309 
1310 	DPRINTFN(5, ("received frame len=%u chan=%u rssi=%u\n",
1311 	    le16toh(frame->len), frame->chan, frame->rssi_dbm));
1312 
1313 	if (le16toh(frame->len) < sizeof (struct ieee80211_frame))
1314 		return;
1315 
1316 	/*
1317 	 * Try to allocate a new mbuf for this ring element and load it before
1318 	 * processing the current mbuf. If the ring element cannot be loaded,
1319 	 * drop the received packet and reuse the old mbuf. In the unlikely
1320 	 * case that the old mbuf can't be reloaded either, explicitly panic.
1321 	 */
1322 	mnew = m_getcl(MB_DONTWAIT, MT_DATA, M_PKTHDR);
1323 	if (mnew == NULL) {
1324 		ifp->if_ierrors++;
1325 		return;
1326 	}
1327 
1328 	bus_dmamap_unload(sc->rxq.data_dmat, data->map);
1329 
1330 	error = bus_dmamap_load(sc->rxq.data_dmat, data->map,
1331 	    mtod(mnew, void *), MCLBYTES, iwi_dma_map_addr, &data->physaddr,
1332 	    0);
1333 	if (error != 0) {
1334 		m_freem(mnew);
1335 
1336 		/* try to reload the old mbuf */
1337 		error = bus_dmamap_load(sc->rxq.data_dmat, data->map,
1338 		    mtod(data->m, void *), MCLBYTES, iwi_dma_map_addr,
1339 		    &data->physaddr, 0);
1340 		if (error != 0) {
1341 			/* very unlikely that it will fail... */
1342 			panic("%s: could not load old rx mbuf",
1343 			    device_get_name(sc->sc_dev));
1344 		}
1345 		ifp->if_ierrors++;
1346 		return;
1347 	}
1348 
1349 	/*
1350 	 * New mbuf successfully loaded, update Rx ring and continue
1351 	 * processing.
1352 	 */
1353 	m = data->m;
1354 	data->m = mnew;
1355 	CSR_WRITE_4(sc, data->reg, data->physaddr);
1356 
1357 	/* Finalize mbuf */
1358 	m->m_pkthdr.rcvif = ifp;
1359 	m->m_pkthdr.len = m->m_len = sizeof (struct iwi_hdr) +
1360 	    sizeof (struct iwi_frame) + le16toh(frame->len);
1361 
1362 	m_adj(m, sizeof (struct iwi_hdr) + sizeof (struct iwi_frame));
1363 
1364 	if (ic->ic_state == IEEE80211_S_SCAN)
1365 		iwi_fix_channel(ic, m);
1366 
1367 	if (sc->sc_drvbpf != NULL) {
1368 		struct iwi_rx_radiotap_header *tap = &sc->sc_rxtap;
1369 
1370 		tap->wr_flags = 0;
1371 		tap->wr_rate = frame->rate;
1372 		tap->wr_chan_freq =
1373 		    htole16(ic->ic_channels[frame->chan].ic_freq);
1374 		tap->wr_chan_flags =
1375 		    htole16(ic->ic_channels[frame->chan].ic_flags);
1376 		tap->wr_antsignal = frame->signal;
1377 		tap->wr_antenna = frame->antenna;
1378 
1379 		bpf_ptap(sc->sc_drvbpf, m, tap, sc->sc_rxtap_len);
1380 	}
1381 
1382 	wh = mtod(m, struct ieee80211_frame *);
1383 	ni = ieee80211_find_rxnode(ic, (struct ieee80211_frame_min *)wh);
1384 
1385 	/* send the frame to the 802.11 layer */
1386 	ieee80211_input(ic, m, ni, frame->rssi_dbm, 0);
1387 
1388 	/* node is no longer needed */
1389 	ieee80211_free_node(ni);
1390 }
1391 
1392 static void
1393 iwi_notification_intr(struct iwi_softc *sc, struct iwi_notif *notif)
1394 {
1395 	struct ieee80211com *ic = &sc->sc_ic;
1396 	struct iwi_notif_scan_channel *chan;
1397 	struct iwi_notif_scan_complete *scan;
1398 	struct iwi_notif_authentication *auth;
1399 	struct iwi_notif_association *assoc;
1400 
1401 	switch (notif->type) {
1402 	case IWI_NOTIF_TYPE_SCAN_CHANNEL:
1403 		chan = (struct iwi_notif_scan_channel *)(notif + 1);
1404 
1405 		DPRINTFN(2, ("Scanning channel (%u)\n", chan->nchan));
1406 		break;
1407 
1408 	case IWI_NOTIF_TYPE_SCAN_COMPLETE:
1409 		scan = (struct iwi_notif_scan_complete *)(notif + 1);
1410 
1411 		DPRINTFN(2, ("Scan completed (%u, %u)\n", scan->nchan,
1412 		    scan->status));
1413 
1414 		/* monitor mode uses scan to set the channel ... */
1415 		if (ic->ic_opmode != IEEE80211_M_MONITOR) {
1416 			sc->flags &= ~IWI_FLAG_SCANNING;
1417 			ieee80211_end_scan(ic);
1418 		} else
1419 			iwi_set_chan(sc, ic->ic_ibss_chan);
1420 		break;
1421 
1422 	case IWI_NOTIF_TYPE_AUTHENTICATION:
1423 		auth = (struct iwi_notif_authentication *)(notif + 1);
1424 
1425 		DPRINTFN(2, ("Authentication (%u)\n", auth->state));
1426 
1427 		switch (auth->state) {
1428 		case IWI_AUTHENTICATED:
1429 			ieee80211_node_authorize(ic->ic_bss);
1430 			ieee80211_new_state(ic, IEEE80211_S_ASSOC, -1);
1431 			break;
1432 
1433 		case IWI_DEAUTHENTICATED:
1434 			break;
1435 
1436 		default:
1437 			device_printf(sc->sc_dev,
1438 			    "unknown authentication state %u\n", auth->state);
1439 		}
1440 		break;
1441 
1442 	case IWI_NOTIF_TYPE_ASSOCIATION:
1443 		assoc = (struct iwi_notif_association *)(notif + 1);
1444 
1445 		DPRINTFN(2, ("Association (%u, %u)\n", assoc->state,
1446 		    assoc->status));
1447 
1448 		switch (assoc->state) {
1449 		case IWI_AUTHENTICATED:
1450 			/* re-association, do nothing */
1451 			break;
1452 
1453 		case IWI_ASSOCIATED:
1454 			ieee80211_new_state(ic, IEEE80211_S_RUN, -1);
1455 			break;
1456 
1457 		case IWI_DEASSOCIATED:
1458 			ieee80211_begin_scan(ic, 1);
1459 			break;
1460 
1461 		default:
1462 			device_printf(sc->sc_dev,
1463 			    "unknown association state %u\n", assoc->state);
1464 		}
1465 		break;
1466 
1467 	default:
1468 		DPRINTFN(5, ("Notification (%u)\n", notif->type));
1469 	}
1470 }
1471 
1472 static void
1473 iwi_rx_intr(struct iwi_softc *sc)
1474 {
1475 	struct iwi_rx_data *data;
1476 	struct iwi_hdr *hdr;
1477 	uint32_t hw;
1478 
1479 	hw = CSR_READ_4(sc, IWI_CSR_RX_RIDX);
1480 
1481 	for (; sc->rxq.cur != hw;) {
1482 		data = &sc->rxq.data[sc->rxq.cur];
1483 
1484 		bus_dmamap_sync(sc->rxq.data_dmat, data->map,
1485 		    BUS_DMASYNC_POSTREAD);
1486 
1487 		hdr = mtod(data->m, struct iwi_hdr *);
1488 
1489 		switch (hdr->type) {
1490 		case IWI_HDR_TYPE_FRAME:
1491 			iwi_frame_intr(sc, data, sc->rxq.cur,
1492 			    (struct iwi_frame *)(hdr + 1));
1493 			break;
1494 
1495 		case IWI_HDR_TYPE_NOTIF:
1496 			iwi_notification_intr(sc,
1497 			    (struct iwi_notif *)(hdr + 1));
1498 			break;
1499 
1500 		default:
1501 			device_printf(sc->sc_dev, "unknown hdr type %u\n",
1502 			    hdr->type);
1503 		}
1504 
1505 		DPRINTFN(15, ("rx done idx=%u\n", sc->rxq.cur));
1506 
1507 		sc->rxq.cur = (sc->rxq.cur + 1) % IWI_RX_RING_COUNT;
1508 	}
1509 
1510 	/* Tell the firmware what we have processed */
1511 	hw = (hw == 0) ? IWI_RX_RING_COUNT - 1 : hw - 1;
1512 	CSR_WRITE_4(sc, IWI_CSR_RX_WIDX, hw);
1513 }
1514 
1515 static void
1516 iwi_tx_intr(struct iwi_softc *sc, struct iwi_tx_ring *txq)
1517 {
1518 	struct ieee80211com *ic = &sc->sc_ic;
1519 	struct ifnet *ifp = ic->ic_ifp;
1520 	struct iwi_tx_data *data;
1521 	uint32_t hw;
1522 
1523 	hw = CSR_READ_4(sc, txq->csr_ridx);
1524 
1525 	for (; txq->next != hw;) {
1526 		data = &txq->data[txq->next];
1527 
1528 		bus_dmamap_sync(txq->data_dmat, data->map,
1529 		    BUS_DMASYNC_POSTWRITE);
1530 		bus_dmamap_unload(txq->data_dmat, data->map);
1531 		m_freem(data->m);
1532 		data->m = NULL;
1533 		ieee80211_free_node(data->ni);
1534 		data->ni = NULL;
1535 
1536 		DPRINTFN(15, ("tx done idx=%u\n", txq->next));
1537 
1538 		ifp->if_opackets++;
1539 
1540 		txq->queued--;
1541 		txq->next = (txq->next + 1) % IWI_TX_RING_COUNT;
1542 	}
1543 
1544 	sc->sc_tx_timer = 0;
1545 	ifp->if_flags &= ~IFF_OACTIVE;
1546 	if_devstart(ifp);
1547 }
1548 
1549 static void
1550 iwi_intr(void *arg)
1551 {
1552 	struct iwi_softc *sc = arg;
1553 	uint32_t r;
1554 
1555 	r = CSR_READ_4(sc, IWI_CSR_INTR);
1556 	if (r == 0 || r == 0xffffffff)
1557 		return;
1558 
1559 	/* disable interrupts */
1560 	CSR_WRITE_4(sc, IWI_CSR_INTR_MASK, 0);
1561 
1562 	if (r & IWI_INTR_FATAL_ERROR) {
1563 		device_printf(sc->sc_dev, "fatal error\n");
1564 
1565 		if ((sc->flags & (IWI_FLAG_EXIT | IWI_FLAG_RESET)) == 0) {
1566 			sc->flags |= IWI_FLAG_RESET;
1567 			device_printf(sc->sc_dev, "wake firmware monitor\n");
1568 			wakeup(IWI_FW_WAKE_MONITOR(sc));
1569 		}
1570 	}
1571 
1572 	if (r & IWI_INTR_PARITY_ERROR) {
1573 		device_printf(sc->sc_dev, "parity error\n");
1574 		sc->sc_ic.ic_ifp->if_flags &= ~IFF_UP;
1575 		iwi_stop(sc);
1576 	}
1577 
1578 	if (r & IWI_INTR_FW_INITED) {
1579 		if (!(r & (IWI_INTR_FATAL_ERROR | IWI_INTR_PARITY_ERROR)))
1580 			wakeup(IWI_FW_INITIALIZED(sc));
1581 	}
1582 
1583 	if (r & IWI_INTR_RADIO_OFF) {
1584 		DPRINTF(("radio transmitter turned off\n"));
1585 		sc->sc_ic.ic_ifp->if_flags &= ~IFF_UP;
1586 		iwi_stop(sc);
1587 	}
1588 
1589 	if (r & IWI_INTR_CMD_DONE)
1590 		wakeup(IWI_FW_CMD_ACKED(sc));
1591 
1592 	if (r & IWI_INTR_TX1_DONE)
1593 		iwi_tx_intr(sc, &sc->txq[0]);
1594 
1595 	if (r & IWI_INTR_TX2_DONE)
1596 		iwi_tx_intr(sc, &sc->txq[1]);
1597 
1598 	if (r & IWI_INTR_TX3_DONE)
1599 		iwi_tx_intr(sc, &sc->txq[2]);
1600 
1601 	if (r & IWI_INTR_TX4_DONE)
1602 		iwi_tx_intr(sc, &sc->txq[3]);
1603 
1604 	if (r & IWI_INTR_RX_DONE)
1605 		iwi_rx_intr(sc);
1606 
1607 	/* acknowledge interrupts */
1608 	CSR_WRITE_4(sc, IWI_CSR_INTR, r);
1609 
1610 	/* re-enable interrupts */
1611 	CSR_WRITE_4(sc, IWI_CSR_INTR_MASK, IWI_INTR_MASK);
1612 }
1613 
1614 static int
1615 iwi_cmd(struct iwi_softc *sc, uint8_t type, void *data, uint8_t len, int async)
1616 {
1617 	struct iwi_cmd_desc *desc;
1618 	struct ifnet *ifp = &sc->sc_ic.ic_if;
1619 	int ret;
1620 
1621 	desc = &sc->cmdq.desc[sc->cmdq.cur];
1622 
1623 	desc->hdr.type = IWI_HDR_TYPE_COMMAND;
1624 	desc->hdr.flags = IWI_HDR_FLAG_IRQ;
1625 	desc->type = type;
1626 	desc->len = len;
1627 	memcpy(desc->data, data, len);
1628 
1629 	bus_dmamap_sync(sc->cmdq.desc_dmat, sc->cmdq.desc_map,
1630 	    BUS_DMASYNC_PREWRITE);
1631 
1632 	DPRINTFN(2, ("sending command idx=%u type=%u len=%u\n", sc->cmdq.cur,
1633 	    type, len));
1634 
1635 	sc->cmdq.cur = (sc->cmdq.cur + 1) % IWI_CMD_RING_COUNT;
1636 	CSR_WRITE_4(sc, IWI_CSR_CMD_WIDX, sc->cmdq.cur);
1637 
1638 	if (!async) {
1639 		ASSERT_SERIALIZED(ifp->if_serializer);
1640 
1641 		crit_enter();
1642 		tsleep_interlock(IWI_FW_CMD_ACKED(sc));
1643 		lwkt_serialize_exit(ifp->if_serializer);
1644 		ret = tsleep(IWI_FW_CMD_ACKED(sc), 0, "iwicmd", hz);
1645 		crit_exit();
1646 		lwkt_serialize_enter(ifp->if_serializer);
1647 	} else {
1648 		ret = 0;
1649 	}
1650 
1651 	return ret;
1652 }
1653 
1654 static void
1655 iwi_write_ibssnode(struct iwi_softc *sc, const struct iwi_node *in)
1656 {
1657 	struct iwi_ibssnode node;
1658 
1659 	/* write node information into NIC memory */
1660 	memset(&node, 0, sizeof node);
1661 	IEEE80211_ADDR_COPY(node.bssid, in->in_node.ni_macaddr);
1662 
1663 	CSR_WRITE_REGION_1(sc,
1664 	    IWI_CSR_NODE_BASE + in->in_station * sizeof node,
1665 	    (uint8_t *)&node, sizeof node);
1666 }
1667 
1668 struct iwi_dma_mapping {
1669 	bus_dma_segment_t segs[IWI_MAX_NSEG];
1670 	int nseg;
1671 	bus_size_t mapsize;
1672 };
1673 
1674 static void
1675 iwi_dma_map_mbuf(void *arg, bus_dma_segment_t *segs, int nseg,
1676 		 bus_size_t mapsize, int error)
1677 {
1678 	struct iwi_dma_mapping *map = arg;
1679 
1680 	if (error != 0)
1681 		return;
1682 
1683 	KASSERT(nseg <= IWI_MAX_NSEG, ("too many DMA segments %d", nseg));
1684 
1685 	bcopy(segs, map->segs, nseg * sizeof(bus_dma_segment_t));
1686 	map->nseg = nseg;
1687 	map->mapsize = mapsize;
1688 }
1689 
1690 static int
1691 iwi_tx_start(struct ifnet *ifp, struct mbuf *m0, struct ieee80211_node *ni,
1692     int ac)
1693 {
1694 	struct iwi_softc *sc = ifp->if_softc;
1695 	struct ieee80211com *ic = &sc->sc_ic;
1696 	struct iwi_node *in = (struct iwi_node *)ni;
1697 	struct ieee80211_frame *wh;
1698 	struct ieee80211_key *k;
1699 	const struct chanAccParams *cap;
1700 	struct iwi_tx_ring *txq = &sc->txq[ac];
1701 	struct iwi_tx_data *data;
1702 	struct iwi_tx_desc *desc;
1703 	struct mbuf *mnew;
1704 	struct iwi_dma_mapping map;
1705 	int error, hdrlen, i, noack = 0;
1706 
1707 	wh = mtod(m0, struct ieee80211_frame *);
1708 
1709 	if (wh->i_fc[0] & IEEE80211_FC0_SUBTYPE_QOS) {
1710 		hdrlen = sizeof (struct ieee80211_qosframe);
1711 		cap = &ic->ic_wme.wme_chanParams;
1712 		noack = cap->cap_wmeParams[ac].wmep_noackPolicy;
1713 	} else
1714 		hdrlen = sizeof (struct ieee80211_frame);
1715 
1716 	/*
1717 	 * This is only used in IBSS mode where the firmware expect an index
1718 	 * in a h/w table instead of a destination address.
1719 	 */
1720 	if (ic->ic_opmode == IEEE80211_M_IBSS && in->in_station == -1) {
1721 		in->in_station = iwi_alloc_ibss_node(sc);
1722 		if (in->in_station == -1) {	/* h/w table is full */
1723 			m_freem(m0);
1724 			ieee80211_free_node(ni);
1725 			ifp->if_oerrors++;
1726 			if_printf(ifp, "ibss table is full\n");
1727 			return 0;
1728 		}
1729 		iwi_write_ibssnode(sc, in);
1730 	}
1731 
1732 	if (wh->i_fc[1] & IEEE80211_FC1_WEP) {
1733 		k = ieee80211_crypto_encap(ic, ni, m0);
1734 		if (k == NULL) {
1735 			m_freem(m0);
1736 			return ENOBUFS;
1737 		}
1738 
1739 		/* packet header may have moved, reset our local pointer */
1740 		wh = mtod(m0, struct ieee80211_frame *);
1741 	}
1742 
1743 	if (sc->sc_drvbpf != NULL) {
1744 		struct iwi_tx_radiotap_header *tap = &sc->sc_txtap;
1745 
1746 		tap->wt_flags = 0;
1747 		tap->wt_chan_freq = htole16(ic->ic_ibss_chan->ic_freq);
1748 		tap->wt_chan_flags = htole16(ic->ic_ibss_chan->ic_flags);
1749 
1750 		bpf_ptap(sc->sc_drvbpf, m0, tap, sc->sc_txtap_len);
1751 	}
1752 
1753 	data = &txq->data[txq->cur];
1754 	desc = &txq->desc[txq->cur];
1755 
1756 	/* save and trim IEEE802.11 header */
1757 	m_copydata(m0, 0, hdrlen, (caddr_t)&desc->wh);
1758 	m_adj(m0, hdrlen);
1759 
1760 	error = bus_dmamap_load_mbuf(txq->data_dmat, data->map, m0,
1761 				     iwi_dma_map_mbuf, &map, BUS_DMA_NOWAIT);
1762 	if (error != 0 && error != EFBIG) {
1763 		device_printf(sc->sc_dev, "could not map mbuf (error %d)\n",
1764 		    error);
1765 		m_freem(m0);
1766 		return error;
1767 	}
1768 	if (error != 0) {
1769 		mnew = m_defrag(m0, MB_DONTWAIT);
1770 		if (mnew == NULL) {
1771 			device_printf(sc->sc_dev,
1772 			    "could not defragment mbuf\n");
1773 			m_freem(m0);
1774 			return ENOBUFS;
1775 		}
1776 		m0 = mnew;
1777 
1778 		error = bus_dmamap_load_mbuf(txq->data_dmat, data->map, m0,
1779 					     iwi_dma_map_mbuf, &map,
1780 					     BUS_DMA_NOWAIT);
1781 		if (error != 0) {
1782 			device_printf(sc->sc_dev,
1783 			    "could not map mbuf (error %d)\n", error);
1784 			m_freem(m0);
1785 			return error;
1786 		}
1787 	}
1788 
1789 	data->m = m0;
1790 	data->ni = ni;
1791 
1792 	desc->hdr.type = IWI_HDR_TYPE_DATA;
1793 	desc->hdr.flags = IWI_HDR_FLAG_IRQ;
1794 	desc->station =
1795 	    (ic->ic_opmode == IEEE80211_M_IBSS) ? in->in_station : 0;
1796 	desc->cmd = IWI_DATA_CMD_TX;
1797 	desc->len = htole16(m0->m_pkthdr.len);
1798 	desc->flags = 0;
1799 	desc->xflags = 0;
1800 
1801 	if (!noack && !IEEE80211_IS_MULTICAST(desc->wh.i_addr1))
1802 		desc->flags |= IWI_DATA_FLAG_NEED_ACK;
1803 
1804 #if 0
1805 	if (ic->ic_flags & IEEE80211_F_PRIVACY) {
1806 		desc->wh.i_fc[1] |= IEEE80211_FC1_WEP;
1807 		desc->weptxkey = ic->ic_crypto.cs_def_txkey;
1808 	} else
1809 #endif
1810 		desc->flags |= IWI_DATA_FLAG_NO_WEP;
1811 
1812 	if (ic->ic_flags & IEEE80211_F_SHPREAMBLE)
1813 		desc->flags |= IWI_DATA_FLAG_SHPREAMBLE;
1814 
1815 	if (desc->wh.i_fc[0] & IEEE80211_FC0_SUBTYPE_QOS)
1816 		desc->xflags |= IWI_DATA_XFLAG_QOS;
1817 
1818 	desc->nseg = htole32(map.nseg);
1819 	for (i = 0; i < map.nseg; i++) {
1820 		desc->seg_addr[i] = htole32(map.segs[i].ds_addr);
1821 		desc->seg_len[i]  = htole16(map.segs[i].ds_len);
1822 	}
1823 
1824 	bus_dmamap_sync(txq->data_dmat, data->map, BUS_DMASYNC_PREWRITE);
1825 	bus_dmamap_sync(txq->desc_dmat, txq->desc_map, BUS_DMASYNC_PREWRITE);
1826 
1827 	DPRINTFN(5, ("sending data frame txq=%u idx=%u len=%u nseg=%u\n",
1828 	    ac, txq->cur, le16toh(desc->len), map.nseg));
1829 
1830 	txq->queued++;
1831 	txq->cur = (txq->cur + 1) % IWI_TX_RING_COUNT;
1832 	CSR_WRITE_4(sc, txq->csr_widx, txq->cur);
1833 
1834 	return 0;
1835 }
1836 
1837 static void
1838 iwi_start(struct ifnet *ifp)
1839 {
1840 	struct iwi_softc *sc = ifp->if_softc;
1841 	struct ieee80211com *ic = &sc->sc_ic;
1842 	struct mbuf *m0;
1843 	struct ether_header *eh;
1844 	struct ieee80211_node *ni;
1845 	int ac;
1846 
1847 	ieee80211_drain_mgtq(&ic->ic_mgtq);
1848 	if (ic->ic_state != IEEE80211_S_RUN) {
1849 		ifq_purge(&ifp->if_snd);
1850 		return;
1851 	}
1852 
1853 	for (;;) {
1854 		m0 = ifq_dequeue(&ifp->if_snd, NULL);
1855 		if (m0 == NULL)
1856 			break;
1857 
1858 		if (m0->m_len < sizeof (struct ether_header) &&
1859 		    (m0 = m_pullup(m0, sizeof (struct ether_header))) == NULL) {
1860 			ifp->if_oerrors++;
1861 			continue;
1862 		}
1863 		eh = mtod(m0, struct ether_header *);
1864 		ni = ieee80211_find_txnode(ic, eh->ether_dhost);
1865 		if (ni == NULL) {
1866 			m_freem(m0);
1867 			ifp->if_oerrors++;
1868 			continue;
1869 		}
1870 
1871 		/* classify mbuf so we can find which tx ring to use */
1872 		if (ieee80211_classify(ic, m0, ni) != 0) {
1873 			m_freem(m0);
1874 			ieee80211_free_node(ni);
1875 			ifp->if_oerrors++;
1876 			continue;
1877 		}
1878 
1879 		/* no QoS encapsulation for EAPOL frames */
1880 		ac = (eh->ether_type != htons(ETHERTYPE_PAE)) ?
1881 		    M_WME_GETAC(m0) : WME_AC_BE;
1882 
1883 		if (sc->txq[ac].queued > IWI_TX_RING_COUNT - 8) {
1884 			/* there is no place left in this ring */
1885 			m_freem(m0);
1886 			ieee80211_free_node(ni);
1887 			ifp->if_flags |= IFF_OACTIVE;
1888 			break;
1889 		}
1890 
1891 		BPF_MTAP(ifp, m0);
1892 
1893 		m0 = ieee80211_encap(ic, m0, ni);
1894 		if (m0 == NULL) {
1895 			ieee80211_free_node(ni);
1896 			ifp->if_oerrors++;
1897 			continue;
1898 		}
1899 
1900 		if (ic->ic_rawbpf != NULL)
1901 			bpf_mtap(ic->ic_rawbpf, m0);
1902 
1903 		if (iwi_tx_start(ifp, m0, ni, ac) != 0) {
1904 			ieee80211_free_node(ni);
1905 			ifp->if_oerrors++;
1906 			break;
1907 		}
1908 
1909 		sc->sc_tx_timer = 5;
1910 		ifp->if_timer = 1;
1911 	}
1912 }
1913 
1914 static void
1915 iwi_watchdog(struct ifnet *ifp)
1916 {
1917 	struct iwi_softc *sc = ifp->if_softc;
1918 	struct ieee80211com *ic = &sc->sc_ic;
1919 
1920 	ifp->if_timer = 0;
1921 
1922 	if (sc->sc_tx_timer > 0) {
1923 		if (--sc->sc_tx_timer == 0) {
1924 			if_printf(ifp, "device timeout\n");
1925 			ifp->if_oerrors++;
1926 			sc->flags |= IWI_FLAG_RESET;
1927 			wakeup(IWI_FW_WAKE_MONITOR(sc));
1928 			return;
1929 		}
1930 		ifp->if_timer = 1;
1931 	}
1932 
1933 	ieee80211_watchdog(ic);
1934 }
1935 
1936 static int
1937 iwi_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data, struct ucred *cr)
1938 {
1939 	struct iwi_softc *sc = ifp->if_softc;
1940 	struct ieee80211com *ic = &sc->sc_ic;
1941 	struct ifreq *ifr;
1942 	int error = 0;
1943 
1944 	switch (cmd) {
1945 	case SIOCSIFFLAGS:
1946 		if (ifp->if_flags & IFF_UP) {
1947 			if (!(ifp->if_flags & IFF_RUNNING))
1948 				iwi_init(sc);
1949 		} else {
1950 			if (ifp->if_flags & IFF_RUNNING)
1951 				iwi_stop(sc);
1952 		}
1953 		break;
1954 
1955 	case SIOCSLOADFW:
1956 		/* only super-user can do that! */
1957 		error = priv_check_cred(cr, PRIV_ROOT, NULL_CRED_OKAY);
1958 		if (error != 0)
1959 			break;
1960 
1961 		ifr = (struct ifreq *)data;
1962 		error = iwi_cache_firmware(sc, ifr->ifr_data);
1963 		break;
1964 
1965 	case SIOCSKILLFW:
1966 		/* only super-user can do that! */
1967 		error = priv_check_cred(cr, PRIV_ROOT, NULL_CRED_OKAY);
1968 		if (error != 0)
1969 			break;
1970 
1971 		ifp->if_flags &= ~IFF_UP;
1972 		iwi_stop(sc);
1973 		iwi_free_firmware(sc);
1974 		break;
1975 
1976 	default:
1977 		error = ieee80211_ioctl(ic, cmd, data, cr);
1978 	}
1979 
1980 	if (error == ENETRESET) {
1981 		if ((ifp->if_flags & (IFF_UP | IFF_RUNNING)) ==
1982 		    (IFF_UP | IFF_RUNNING) &&
1983 		    (ic->ic_roaming != IEEE80211_ROAMING_MANUAL))
1984 			iwi_init(sc);
1985 		error = 0;
1986 	}
1987 
1988 	return error;
1989 }
1990 
1991 static void
1992 iwi_stop_master(struct iwi_softc *sc)
1993 {
1994 	uint32_t tmp;
1995 	int ntries;
1996 
1997 	/* disable interrupts */
1998 	CSR_WRITE_4(sc, IWI_CSR_INTR_MASK, 0);
1999 
2000 	CSR_WRITE_4(sc, IWI_CSR_RST, IWI_RST_STOP_MASTER);
2001 	for (ntries = 0; ntries < 5; ntries++) {
2002 		if (CSR_READ_4(sc, IWI_CSR_RST) & IWI_RST_MASTER_DISABLED)
2003 			break;
2004 		DELAY(10);
2005 	}
2006 	if (ntries == 5)
2007 		if_printf(&sc->sc_ic.ic_if, "timeout waiting for master\n");
2008 
2009 	tmp = CSR_READ_4(sc, IWI_CSR_RST);
2010 	CSR_WRITE_4(sc, IWI_CSR_RST, tmp | IWI_RST_PRINCETON_RESET);
2011 
2012 	sc->flags &= ~IWI_FLAG_FW_INITED;
2013 }
2014 
2015 static int
2016 iwi_reset(struct iwi_softc *sc)
2017 {
2018 	uint32_t tmp;
2019 	int i, ntries;
2020 
2021 	iwi_stop_master(sc);
2022 
2023 	tmp = CSR_READ_4(sc, IWI_CSR_CTL);
2024 	CSR_WRITE_4(sc, IWI_CSR_CTL, tmp | IWI_CTL_INIT);
2025 
2026 	CSR_WRITE_4(sc, IWI_CSR_READ_INT, IWI_READ_INT_INIT_HOST);
2027 
2028 	/* Wait for clock stabilization */
2029 	for (ntries = 0; ntries < 1000; ntries++) {
2030 		if (CSR_READ_4(sc, IWI_CSR_CTL) & IWI_CTL_CLOCK_READY)
2031 			break;
2032 		DELAY(200);
2033 	}
2034 	if (ntries == 1000) {
2035 		if_printf(&sc->sc_ic.ic_if,
2036 			  "timeout waiting for clock stabilization\n");
2037 		return EIO;
2038 	}
2039 
2040 	tmp = CSR_READ_4(sc, IWI_CSR_RST);
2041 	CSR_WRITE_4(sc, IWI_CSR_RST, tmp | IWI_RST_SOFT_RESET);
2042 
2043 	DELAY(10);
2044 
2045 	tmp = CSR_READ_4(sc, IWI_CSR_CTL);
2046 	CSR_WRITE_4(sc, IWI_CSR_CTL, tmp | IWI_CTL_INIT);
2047 
2048 	/* Clear NIC memory */
2049 	CSR_WRITE_4(sc, IWI_CSR_AUTOINC_ADDR, 0);
2050 	for (i = 0; i < 0xc000; i++)
2051 		CSR_WRITE_4(sc, IWI_CSR_AUTOINC_DATA, 0);
2052 
2053 	return 0;
2054 }
2055 
2056 static int
2057 iwi_load_ucode(struct iwi_softc *sc, void *uc, int size)
2058 {
2059 	uint32_t tmp;
2060 	uint16_t *w;
2061 	int ntries, i;
2062 
2063 	CSR_WRITE_4(sc, IWI_CSR_RST, CSR_READ_4(sc, IWI_CSR_RST) |
2064 	    IWI_RST_STOP_MASTER);
2065 	for (ntries = 0; ntries < 5; ntries++) {
2066 		if (CSR_READ_4(sc, IWI_CSR_RST) & IWI_RST_MASTER_DISABLED)
2067 			break;
2068 		DELAY(10);
2069 	}
2070 	if (ntries == 5) {
2071 		device_printf(sc->sc_dev, "timeout waiting for master\n");
2072 		return EIO;
2073 	}
2074 
2075 	MEM_WRITE_4(sc, 0x3000e0, 0x80000000);
2076 	DELAY(5000);
2077 
2078 	tmp = CSR_READ_4(sc, IWI_CSR_RST);
2079 	tmp &= ~IWI_RST_PRINCETON_RESET;
2080 	CSR_WRITE_4(sc, IWI_CSR_RST, tmp);
2081 
2082 	DELAY(5000);
2083 	MEM_WRITE_4(sc, 0x3000e0, 0);
2084 	DELAY(1000);
2085 	MEM_WRITE_4(sc, IWI_MEM_EVENT_CTL, 1);
2086 	DELAY(1000);
2087 	MEM_WRITE_4(sc, IWI_MEM_EVENT_CTL, 0);
2088 	DELAY(1000);
2089 	MEM_WRITE_1(sc, 0x200000, 0x00);
2090 	MEM_WRITE_1(sc, 0x200000, 0x40);
2091 	DELAY(1000);
2092 
2093 	/* write microcode into adapter memory */
2094 	for (w = uc; size > 0; w++, size -= 2)
2095 		MEM_WRITE_2(sc, 0x200010, htole16(*w));
2096 
2097 	MEM_WRITE_1(sc, 0x200000, 0x00);
2098 	MEM_WRITE_1(sc, 0x200000, 0x80);
2099 
2100 	/* wait until we get an answer */
2101 	for (ntries = 0; ntries < 100; ntries++) {
2102 		if (MEM_READ_1(sc, 0x200000) & 1)
2103 			break;
2104 		DELAY(100);
2105 	}
2106 	if (ntries == 100) {
2107 		device_printf(sc->sc_dev,
2108 		    "timeout waiting for ucode to initialize\n");
2109 		return EIO;
2110 	}
2111 
2112 	/* read the answer or the firmware will not initialize properly */
2113 	for (i = 0; i < 7; i++)
2114 		MEM_READ_4(sc, 0x200004);
2115 
2116 	MEM_WRITE_1(sc, 0x200000, 0x00);
2117 
2118 	return 0;
2119 }
2120 
2121 /* macro to handle unaligned little endian data in firmware image */
2122 #define GETLE32(p) ((p)[0] | (p)[1] << 8 | (p)[2] << 16 | (p)[3] << 24)
2123 
2124 static int
2125 iwi_load_firmware(struct iwi_softc *sc, void *fw, int size)
2126 {
2127 	bus_dma_tag_t dmat;
2128 	bus_dmamap_t map;
2129 	bus_addr_t physaddr;
2130 	void *virtaddr;
2131 	u_char *p, *end;
2132 	uint32_t sentinel, ctl, src, dst, sum, len, mlen, tmp;
2133 	int ntries, error = 0;
2134 	struct ifnet *ifp = &sc->sc_ic.ic_if;
2135 
2136 	ASSERT_SERIALIZED(ifp->if_serializer);
2137 
2138 	/* Allocate DMA memory for mapping firmware image */
2139 	error = bus_dma_tag_create(NULL, 4, 0, BUS_SPACE_MAXADDR_32BIT,
2140 	    BUS_SPACE_MAXADDR, NULL, NULL, size, 1, size, 0, &dmat);
2141 	if (error != 0) {
2142 		device_printf(sc->sc_dev,
2143 		    "could not create firmware DMA tag\n");
2144 		goto fail1;
2145 	}
2146 
2147 	error = bus_dmamem_alloc(dmat, &virtaddr, BUS_DMA_WAITOK, &map);
2148 	if (error != 0) {
2149 		device_printf(sc->sc_dev,
2150 		    "could not allocate firmware DMA memory\n");
2151 		goto fail2;
2152 	}
2153 
2154 	error = bus_dmamap_load(dmat, map, virtaddr, size, iwi_dma_map_addr,
2155 	    &physaddr, 0);
2156 	if (error != 0) {
2157 		device_printf(sc->sc_dev, "could not load firmware DMA map\n");
2158 		goto fail3;
2159 	}
2160 
2161 	/* Copy firmware image to DMA memory */
2162 	memcpy(virtaddr, fw, size);
2163 
2164 	/* Make sure the adapter will get up-to-date values */
2165 	bus_dmamap_sync(dmat, map, BUS_DMASYNC_PREWRITE);
2166 
2167 	/* Tell the adapter where the command blocks are stored */
2168 	MEM_WRITE_4(sc, 0x3000a0, 0x27000);
2169 
2170 	/*
2171 	 * Store command blocks into adapter's internal memory using register
2172 	 * indirections. The adapter will read the firmware image through DMA
2173 	 * using information stored in command blocks.
2174 	 */
2175 	src = physaddr;
2176 	p = virtaddr;
2177 	end = p + size;
2178 	CSR_WRITE_4(sc, IWI_CSR_AUTOINC_ADDR, 0x27000);
2179 
2180 	while (p < end) {
2181 		dst = GETLE32(p); p += 4; src += 4;
2182 		len = GETLE32(p); p += 4; src += 4;
2183 		p += len;
2184 
2185 		while (len > 0) {
2186 			mlen = min(len, IWI_CB_MAXDATALEN);
2187 
2188 			ctl = IWI_CB_DEFAULT_CTL | mlen;
2189 			sum = ctl ^ src ^ dst;
2190 
2191 			/* Write a command block */
2192 			CSR_WRITE_4(sc, IWI_CSR_AUTOINC_DATA, ctl);
2193 			CSR_WRITE_4(sc, IWI_CSR_AUTOINC_DATA, src);
2194 			CSR_WRITE_4(sc, IWI_CSR_AUTOINC_DATA, dst);
2195 			CSR_WRITE_4(sc, IWI_CSR_AUTOINC_DATA, sum);
2196 
2197 			src += mlen;
2198 			dst += mlen;
2199 			len -= mlen;
2200 		}
2201 	}
2202 
2203 	/* Write a fictive final command block (sentinel) */
2204 	sentinel = CSR_READ_4(sc, IWI_CSR_AUTOINC_ADDR);
2205 	CSR_WRITE_4(sc, IWI_CSR_AUTOINC_DATA, 0);
2206 
2207 	tmp = CSR_READ_4(sc, IWI_CSR_RST);
2208 	tmp &= ~(IWI_RST_MASTER_DISABLED | IWI_RST_STOP_MASTER);
2209 	CSR_WRITE_4(sc, IWI_CSR_RST, tmp);
2210 
2211 	/* Tell the adapter to start processing command blocks */
2212 	MEM_WRITE_4(sc, 0x3000a4, 0x540100);
2213 
2214 	/* Wait until the adapter reaches the sentinel */
2215 	for (ntries = 0; ntries < 400; ntries++) {
2216 		if (MEM_READ_4(sc, 0x3000d0) >= sentinel)
2217 			break;
2218 		DELAY(100);
2219 	}
2220 	if (ntries == 400) {
2221 		device_printf(sc->sc_dev,
2222 		    "timeout processing command blocks\n");
2223 		error = EIO;
2224 		goto fail4;
2225 	}
2226 
2227 	/* We're done with command blocks processing */
2228 	MEM_WRITE_4(sc, 0x3000a4, 0x540c00);
2229 
2230 	/* Allow interrupts so we know when the firmware is ready */
2231 	CSR_WRITE_4(sc, IWI_CSR_INTR_MASK, IWI_INTR_MASK);
2232 
2233 	/* Tell the adapter to initialize the firmware */
2234 	CSR_WRITE_4(sc, IWI_CSR_RST, 0);
2235 
2236 	tmp = CSR_READ_4(sc, IWI_CSR_CTL);
2237 	CSR_WRITE_4(sc, IWI_CSR_CTL, tmp | IWI_CTL_ALLOW_STANDBY);
2238 
2239 	/* wait at most one second for firmware initialization to complete */
2240 	crit_enter();
2241 	tsleep_interlock(IWI_FW_INITIALIZED(sc));
2242 	lwkt_serialize_exit(ifp->if_serializer);
2243 	error = tsleep(IWI_FW_INITIALIZED(sc), 0, "iwiinit", hz);
2244 	crit_exit();
2245 	lwkt_serialize_enter(ifp->if_serializer);
2246 	if (error != 0) {
2247 		device_printf(sc->sc_dev, "timeout waiting for firmware "
2248 		    "initialization to complete\n");
2249 		goto fail4;
2250 	}
2251 
2252 fail4:	bus_dmamap_sync(dmat, map, BUS_DMASYNC_POSTWRITE);
2253 	bus_dmamap_unload(dmat, map);
2254 fail3:	bus_dmamem_free(dmat, virtaddr, map);
2255 fail2:	bus_dma_tag_destroy(dmat);
2256 fail1:
2257 	return error;
2258 }
2259 
2260 /*
2261  * Store firmware into kernel memory so we can download it when we need to,
2262  * e.g when the adapter wakes up from suspend mode.
2263  */
2264 static int
2265 iwi_cache_firmware(struct iwi_softc *sc, void *data)
2266 {
2267 	struct iwi_firmware *kfw = &sc->fw;
2268 	struct iwi_firmware ufw;
2269 	int error;
2270 
2271 	iwi_free_firmware(sc);
2272 
2273 	if ((error = copyin(data, &ufw, sizeof ufw)) != 0)
2274 		return error;
2275 
2276 	kfw->boot_size  = ufw.boot_size;
2277 	kfw->ucode_size = ufw.ucode_size;
2278 	kfw->main_size  = ufw.main_size;
2279 
2280 	kfw->boot = kmalloc(kfw->boot_size, M_DEVBUF, M_WAITOK);
2281 	kfw->ucode = kmalloc(kfw->ucode_size, M_DEVBUF, M_WAITOK);
2282 	kfw->main = kmalloc(kfw->main_size, M_DEVBUF, M_WAITOK);
2283 
2284 	if ((error = copyin(ufw.boot, kfw->boot, kfw->boot_size)) != 0)
2285 		goto fail;
2286 
2287 	if ((error = copyin(ufw.ucode, kfw->ucode, kfw->ucode_size)) != 0)
2288 		goto fail;
2289 
2290 	if ((error = copyin(ufw.main, kfw->main, kfw->main_size)) != 0)
2291 		goto fail;
2292 
2293 	DPRINTF(("Firmware cached: boot %u, ucode %u, main %u\n",
2294 	    kfw->boot_size, kfw->ucode_size, kfw->main_size));
2295 
2296 	sc->flags |= IWI_FLAG_FW_CACHED;
2297 
2298 	return 0;
2299 
2300 fail:
2301 	kfree(kfw->boot, M_DEVBUF);
2302 	kfree(kfw->ucode, M_DEVBUF);
2303 	kfree(kfw->main, M_DEVBUF);
2304 
2305 	return error;
2306 }
2307 
2308 static void
2309 iwi_free_firmware(struct iwi_softc *sc)
2310 {
2311 	if (!(sc->flags & IWI_FLAG_FW_CACHED))
2312 		return;
2313 
2314 	kfree(sc->fw.boot, M_DEVBUF);
2315 	kfree(sc->fw.ucode, M_DEVBUF);
2316 	kfree(sc->fw.main, M_DEVBUF);
2317 
2318 	sc->flags &= ~IWI_FLAG_FW_CACHED;
2319 }
2320 
2321 static int
2322 iwi_config(struct iwi_softc *sc)
2323 {
2324 	struct ieee80211com *ic = &sc->sc_ic;
2325 	struct ifnet *ifp = ic->ic_ifp;
2326 	struct iwi_configuration config;
2327 	struct iwi_rateset rs;
2328 	struct iwi_txpower power;
2329 	struct ieee80211_key *wk;
2330 	struct iwi_wep_key wepkey;
2331 	uint32_t data;
2332 	int error, i;
2333 
2334 	IEEE80211_ADDR_COPY(ic->ic_myaddr, IF_LLADDR(ifp));
2335 	DPRINTF(("Setting MAC address to %6D\n", ic->ic_myaddr, ":"));
2336 	error = iwi_cmd(sc, IWI_CMD_SET_MAC_ADDRESS, ic->ic_myaddr,
2337 	    IEEE80211_ADDR_LEN, 0);
2338 	if (error != 0)
2339 		return error;
2340 
2341 	memset(&config, 0, sizeof config);
2342 	config.bluetooth_coexistence = sc->bluetooth;
2343 	config.antenna = sc->antenna;
2344 	config.multicast_enabled = 1;
2345 	config.answer_pbreq = (ic->ic_opmode == IEEE80211_M_IBSS) ? 1 : 0;
2346 	config.disable_unicast_decryption = 1;
2347 	config.disable_multicast_decryption = 1;
2348 	DPRINTF(("Configuring adapter\n"));
2349 	error = iwi_cmd(sc, IWI_CMD_SET_CONFIG, &config, sizeof config, 0);
2350 	if (error != 0)
2351 		return error;
2352 
2353 	data = htole32(IWI_POWER_MODE_CAM);
2354 	DPRINTF(("Setting power mode to %u\n", le32toh(data)));
2355 	error = iwi_cmd(sc, IWI_CMD_SET_POWER_MODE, &data, sizeof data, 0);
2356 	if (error != 0)
2357 		return error;
2358 
2359 	data = htole32(ic->ic_rtsthreshold);
2360 	DPRINTF(("Setting RTS threshold to %u\n", le32toh(data)));
2361 	error = iwi_cmd(sc, IWI_CMD_SET_RTS_THRESHOLD, &data, sizeof data, 0);
2362 	if (error != 0)
2363 		return error;
2364 
2365 	data = htole32(ic->ic_fragthreshold);
2366 	DPRINTF(("Setting fragmentation threshold to %u\n", le32toh(data)));
2367 	error = iwi_cmd(sc, IWI_CMD_SET_FRAG_THRESHOLD, &data, sizeof data, 0);
2368 	if (error != 0)
2369 		return error;
2370 
2371 	if (ic->ic_opmode == IEEE80211_M_IBSS) {
2372 		power.mode = IWI_MODE_11B;
2373 		power.nchan = 11;
2374 		for (i = 0; i < 11; i++) {
2375 			power.chan[i].chan = i + 1;
2376 			power.chan[i].power = IWI_TXPOWER_MAX;
2377 		}
2378 		DPRINTF(("Setting .11b channels tx power\n"));
2379 		error = iwi_cmd(sc, IWI_CMD_SET_TX_POWER, &power, sizeof power,
2380 		    0);
2381 		if (error != 0)
2382 			return error;
2383 
2384 		power.mode = IWI_MODE_11G;
2385 		DPRINTF(("Setting .11g channels tx power\n"));
2386 		error = iwi_cmd(sc, IWI_CMD_SET_TX_POWER, &power, sizeof power,
2387 		    0);
2388 		if (error != 0)
2389 			return error;
2390 	}
2391 
2392 	rs.mode = IWI_MODE_11G;
2393 	rs.type = IWI_RATESET_TYPE_SUPPORTED;
2394 	rs.nrates = ic->ic_sup_rates[IEEE80211_MODE_11G].rs_nrates;
2395 	memcpy(rs.rates, ic->ic_sup_rates[IEEE80211_MODE_11G].rs_rates,
2396 	    rs.nrates);
2397 	DPRINTF(("Setting .11bg supported rates (%u)\n", rs.nrates));
2398 	error = iwi_cmd(sc, IWI_CMD_SET_RATES, &rs, sizeof rs, 0);
2399 	if (error != 0)
2400 		return error;
2401 
2402 	rs.mode = IWI_MODE_11A;
2403 	rs.type = IWI_RATESET_TYPE_SUPPORTED;
2404 	rs.nrates = ic->ic_sup_rates[IEEE80211_MODE_11A].rs_nrates;
2405 	memcpy(rs.rates, ic->ic_sup_rates[IEEE80211_MODE_11A].rs_rates,
2406 	    rs.nrates);
2407 	DPRINTF(("Setting .11a supported rates (%u)\n", rs.nrates));
2408 	error = iwi_cmd(sc, IWI_CMD_SET_RATES, &rs, sizeof rs, 0);
2409 	if (error != 0)
2410 		return error;
2411 
2412 	/* if we have a desired ESSID, set it now */
2413 	if (ic->ic_des_esslen != 0) {
2414 #ifdef IWI_DEBUG
2415 		if (iwi_debug > 0) {
2416 			kprintf("Setting desired ESSID to ");
2417 			ieee80211_print_essid(ic->ic_des_essid,
2418 			    ic->ic_des_esslen);
2419 			kprintf("\n");
2420 		}
2421 #endif
2422 		error = iwi_cmd(sc, IWI_CMD_SET_ESSID, ic->ic_des_essid,
2423 		    ic->ic_des_esslen, 0);
2424 		if (error != 0)
2425 			return error;
2426 	}
2427 
2428 	data = htole32(karc4random());
2429 	DPRINTF(("Setting initialization vector to %u\n", le32toh(data)));
2430 	error = iwi_cmd(sc, IWI_CMD_SET_IV, &data, sizeof data, 0);
2431 	if (error != 0)
2432 		return error;
2433 
2434 	for (i = 0; i < IEEE80211_WEP_NKID; i++) {
2435 		wk = &ic->ic_crypto.cs_nw_keys[i];
2436 
2437 		wepkey.cmd = IWI_WEP_KEY_CMD_SETKEY;
2438 		wepkey.idx = i;
2439 		wepkey.len = wk->wk_keylen;
2440 		memset(wepkey.key, 0, sizeof wepkey.key);
2441 		memcpy(wepkey.key, wk->wk_key, wk->wk_keylen);
2442 		DPRINTF(("Setting wep key index %u len %u\n", wepkey.idx,
2443 		    wepkey.len));
2444 		error = iwi_cmd(sc, IWI_CMD_SET_WEP_KEY, &wepkey,
2445 		    sizeof wepkey, 0);
2446 		if (error != 0)
2447 			return error;
2448 	}
2449 
2450 	/* Enable adapter */
2451 	DPRINTF(("Enabling adapter\n"));
2452 	return iwi_cmd(sc, IWI_CMD_ENABLE, NULL, 0, 0);
2453 }
2454 
2455 static int
2456 iwi_set_chan(struct iwi_softc *sc, struct ieee80211_channel *chan)
2457 {
2458 	struct ieee80211com *ic = &sc->sc_ic;
2459 	struct iwi_scan scan;
2460 
2461 	memset(&scan, 0, sizeof scan);
2462 	memset(scan.type, IWI_SCAN_TYPE_PASSIVE, sizeof scan.type);
2463 	scan.passive = htole16(2000);
2464 	scan.channels[0] = 1 |
2465 	    (IEEE80211_IS_CHAN_5GHZ(chan) ? IWI_CHAN_5GHZ : IWI_CHAN_2GHZ);
2466 	scan.channels[1] = ieee80211_chan2ieee(ic, chan);
2467 
2468 	DPRINTF(("Setting channel to %u\n", ieee80211_chan2ieee(ic, chan)));
2469 	return iwi_cmd(sc, IWI_CMD_SCAN, &scan, sizeof scan, 1);
2470 }
2471 
2472 static int
2473 iwi_scan(struct iwi_softc *sc)
2474 {
2475 	struct ieee80211com *ic = &sc->sc_ic;
2476 	struct iwi_scan scan;
2477 	uint8_t *p;
2478 	int i, count;
2479 
2480 	memset(&scan, 0, sizeof scan);
2481 
2482 	if (ic->ic_des_esslen != 0) {
2483 		scan.bdirected = htole16(sc->dwelltime);
2484 		memset(scan.type, IWI_SCAN_TYPE_BDIRECTED, sizeof scan.type);
2485 	} else {
2486 		scan.broadcast = htole16(sc->dwelltime);
2487 		memset(scan.type, IWI_SCAN_TYPE_BROADCAST, sizeof scan.type);
2488 	}
2489 
2490 	p = scan.channels;
2491 	count = 0;
2492 	for (i = 0; i <= IEEE80211_CHAN_MAX; i++) {
2493 		if (IEEE80211_IS_CHAN_5GHZ(&ic->ic_channels[i]) &&
2494 		    isset(ic->ic_chan_active, i)) {
2495 			*++p = i;
2496 			count++;
2497 		}
2498 	}
2499 	*(p - count) = IWI_CHAN_5GHZ | count;
2500 
2501 	p = (count > 0) ? p + 1 : scan.channels;
2502 	count = 0;
2503 	for (i = 0; i <= IEEE80211_CHAN_MAX; i++) {
2504 		if (IEEE80211_IS_CHAN_2GHZ(&ic->ic_channels[i]) &&
2505 		    isset(ic->ic_chan_active, i)) {
2506 			*++p = i;
2507 			count++;
2508 		}
2509 	}
2510 	*(p - count) = IWI_CHAN_2GHZ | count;
2511 
2512 	DPRINTF(("Start scanning\n"));
2513 	return iwi_cmd(sc, IWI_CMD_SCAN, &scan, sizeof scan, 1);
2514 }
2515 
2516 static int
2517 iwi_auth_and_assoc(struct iwi_softc *sc)
2518 {
2519 	struct ieee80211com *ic = &sc->sc_ic;
2520 	struct ifnet *ifp = ic->ic_ifp;
2521 	struct ieee80211_node *ni = ic->ic_bss;
2522 	struct ieee80211_wme_info wme;
2523 	struct iwi_configuration config;
2524 	struct iwi_associate assoc;
2525 	struct iwi_rateset rs;
2526 	uint16_t capinfo;
2527 	uint32_t data;
2528 	int error;
2529 
2530 	if (IEEE80211_IS_CHAN_2GHZ(ni->ni_chan)) {
2531 		memset(&config, 0, sizeof config);
2532 		config.bluetooth_coexistence = sc->bluetooth;
2533 		config.antenna = sc->antenna;
2534 		config.multicast_enabled = 1;
2535 		config.use_protection = 1;
2536 		config.answer_pbreq =
2537 		    (ic->ic_opmode == IEEE80211_M_IBSS) ? 1 : 0;
2538 		config.disable_unicast_decryption = 1;
2539 		config.disable_multicast_decryption = 1;
2540 		DPRINTF(("Configuring adapter\n"));
2541 		error = iwi_cmd(sc, IWI_CMD_SET_CONFIG, &config, sizeof config,
2542 		    1);
2543 		if (error != 0)
2544 			return error;
2545 	}
2546 
2547 #ifdef IWI_DEBUG
2548 	if (iwi_debug > 0) {
2549 		kprintf("Setting ESSID to ");
2550 		ieee80211_print_essid(ni->ni_essid, ni->ni_esslen);
2551 		kprintf("\n");
2552 	}
2553 #endif
2554 	error = iwi_cmd(sc, IWI_CMD_SET_ESSID, ni->ni_essid, ni->ni_esslen, 1);
2555 	if (error != 0)
2556 		return error;
2557 
2558 	/* the rate set has already been "negotiated" */
2559 	rs.mode = IEEE80211_IS_CHAN_5GHZ(ni->ni_chan) ? IWI_MODE_11A :
2560 	    IWI_MODE_11G;
2561 	rs.type = IWI_RATESET_TYPE_NEGOTIATED;
2562 	rs.nrates = ni->ni_rates.rs_nrates;
2563 	KKASSERT(rs.nrates <= IWI_RATESET_MAXSIZE);
2564 	memcpy(rs.rates, ni->ni_rates.rs_rates, rs.nrates);
2565 	DPRINTF(("Setting negociated rates (%u)\n", rs.nrates));
2566 	error = iwi_cmd(sc, IWI_CMD_SET_RATES, &rs, sizeof rs, 1);
2567 	if (error != 0)
2568 		return error;
2569 
2570 	if ((ic->ic_flags & IEEE80211_F_WME) && ni->ni_wme_ie != NULL) {
2571 		wme.wme_id = IEEE80211_ELEMID_VENDOR;
2572 		wme.wme_len = sizeof (struct ieee80211_wme_info) - 2;
2573 		wme.wme_oui[0] = 0x00;
2574 		wme.wme_oui[1] = 0x50;
2575 		wme.wme_oui[2] = 0xf2;
2576 		wme.wme_type = WME_OUI_TYPE;
2577 		wme.wme_subtype = WME_INFO_OUI_SUBTYPE;
2578 		wme.wme_version = WME_VERSION;
2579 		wme.wme_info = 0;
2580 
2581 		DPRINTF(("Setting WME IE (len=%u)\n", wme.wme_len));
2582 		error = iwi_cmd(sc, IWI_CMD_SET_WMEIE, &wme, sizeof wme, 1);
2583 		if (error != 0)
2584 			return error;
2585 	}
2586 
2587 	if (ic->ic_opt_ie != NULL) {
2588 		DPRINTF(("Setting optional IE (len=%u)\n", ic->ic_opt_ie_len));
2589 		error = iwi_cmd(sc, IWI_CMD_SET_OPTIE, ic->ic_opt_ie,
2590 		    ic->ic_opt_ie_len, 1);
2591 		if (error != 0)
2592 			return error;
2593 	}
2594 
2595 	data = htole32(ni->ni_rssi);
2596 	DPRINTF(("Setting sensitivity to %d\n", (int8_t)ni->ni_rssi));
2597 	error = iwi_cmd(sc, IWI_CMD_SET_SENSITIVITY, &data, sizeof data, 1);
2598 	if (error != 0)
2599 		return error;
2600 
2601 	memset(&assoc, 0, sizeof assoc);
2602 	assoc.mode = IEEE80211_IS_CHAN_5GHZ(ni->ni_chan) ? IWI_MODE_11A :
2603 	    IWI_MODE_11G;
2604 	assoc.chan = ieee80211_chan2ieee(ic, ni->ni_chan);
2605 	if (ni->ni_authmode == IEEE80211_AUTH_SHARED)
2606 		assoc.auth = ic->ic_crypto.cs_def_txkey << 4 | IWI_AUTH_SHARED;
2607 	if ((ic->ic_flags & IEEE80211_F_WME) && ni->ni_wme_ie != NULL)
2608 		assoc.policy |= htole16(IWI_POLICY_WME);
2609 	if (ic->ic_flags & IEEE80211_F_WPA)
2610 		assoc.policy |= htole16(IWI_POLICY_WPA);
2611 	memcpy(assoc.tstamp, ni->ni_tstamp.data, 8);
2612 
2613 	if (ic->ic_opmode == IEEE80211_M_IBSS)
2614 		capinfo = IEEE80211_CAPINFO_IBSS;
2615 	else
2616 		capinfo = IEEE80211_CAPINFO_ESS;
2617 	if (ic->ic_flags & IEEE80211_F_PRIVACY)
2618 		capinfo |= IEEE80211_CAPINFO_PRIVACY;
2619 	if ((ic->ic_flags & IEEE80211_F_SHPREAMBLE) &&
2620 	    IEEE80211_IS_CHAN_2GHZ(ni->ni_chan))
2621 		capinfo |= IEEE80211_CAPINFO_SHORT_PREAMBLE;
2622 	if (ic->ic_flags & IEEE80211_F_SHSLOT)
2623 		capinfo |= IEEE80211_CAPINFO_SHORT_SLOTTIME;
2624 	assoc.capinfo = htole16(capinfo);
2625 
2626 	assoc.lintval = htole16(ic->ic_lintval);
2627 	assoc.intval = htole16(ni->ni_intval);
2628 	IEEE80211_ADDR_COPY(assoc.bssid, ni->ni_bssid);
2629 	if (ic->ic_opmode == IEEE80211_M_IBSS)
2630 		IEEE80211_ADDR_COPY(assoc.dst, ifp->if_broadcastaddr);
2631 	else
2632 		IEEE80211_ADDR_COPY(assoc.dst, ni->ni_bssid);
2633 
2634 	DPRINTF(("Trying to associate to %6D channel %u auth %u\n",
2635 	    assoc.bssid, ":", assoc.chan, assoc.auth));
2636 	return iwi_cmd(sc, IWI_CMD_ASSOCIATE, &assoc, sizeof assoc, 1);
2637 }
2638 
2639 static void
2640 iwi_init(void *priv)
2641 {
2642 	struct iwi_softc *sc = priv;
2643 	struct ieee80211com *ic = &sc->sc_ic;
2644 	struct ifnet *ifp = ic->ic_ifp;
2645 	struct iwi_firmware *fw = &sc->fw;
2646 	struct iwi_rx_data *data;
2647 	int i;
2648 
2649 	/* exit immediately if firmware has not been ioctl'd */
2650 	if (!(sc->flags & IWI_FLAG_FW_CACHED)) {
2651 		if (!(sc->flags & IWI_FLAG_FW_WARNED))
2652 			device_printf(sc->sc_dev, "Please load firmware\n");
2653 		sc->flags |= IWI_FLAG_FW_WARNED;
2654 		ifp->if_flags &= ~IFF_UP;
2655 		return;
2656 	}
2657 
2658 	iwi_stop(sc);
2659 
2660 	if (iwi_reset(sc) != 0) {
2661 		device_printf(sc->sc_dev, "could not reset adapter\n");
2662 		goto fail;
2663 	}
2664 
2665 	if (iwi_load_firmware(sc, fw->boot, fw->boot_size) != 0) {
2666 		device_printf(sc->sc_dev, "could not load boot firmware\n");
2667 		goto fail;
2668 	}
2669 
2670 	if (iwi_load_ucode(sc, fw->ucode, fw->ucode_size) != 0) {
2671 		device_printf(sc->sc_dev, "could not load microcode\n");
2672 		goto fail;
2673 	}
2674 
2675 	iwi_stop_master(sc);
2676 
2677 	CSR_WRITE_4(sc, IWI_CSR_CMD_BASE, sc->cmdq.physaddr);
2678 	CSR_WRITE_4(sc, IWI_CSR_CMD_SIZE, sc->cmdq.count);
2679 	CSR_WRITE_4(sc, IWI_CSR_CMD_WIDX, sc->cmdq.cur);
2680 
2681 	CSR_WRITE_4(sc, IWI_CSR_TX1_BASE, sc->txq[0].physaddr);
2682 	CSR_WRITE_4(sc, IWI_CSR_TX1_SIZE, sc->txq[0].count);
2683 	CSR_WRITE_4(sc, IWI_CSR_TX1_WIDX, sc->txq[0].cur);
2684 
2685 	CSR_WRITE_4(sc, IWI_CSR_TX2_BASE, sc->txq[1].physaddr);
2686 	CSR_WRITE_4(sc, IWI_CSR_TX2_SIZE, sc->txq[1].count);
2687 	CSR_WRITE_4(sc, IWI_CSR_TX2_WIDX, sc->txq[1].cur);
2688 
2689 	CSR_WRITE_4(sc, IWI_CSR_TX3_BASE, sc->txq[2].physaddr);
2690 	CSR_WRITE_4(sc, IWI_CSR_TX3_SIZE, sc->txq[2].count);
2691 	CSR_WRITE_4(sc, IWI_CSR_TX3_WIDX, sc->txq[2].cur);
2692 
2693 	CSR_WRITE_4(sc, IWI_CSR_TX4_BASE, sc->txq[3].physaddr);
2694 	CSR_WRITE_4(sc, IWI_CSR_TX4_SIZE, sc->txq[3].count);
2695 	CSR_WRITE_4(sc, IWI_CSR_TX4_WIDX, sc->txq[3].cur);
2696 
2697 	for (i = 0; i < sc->rxq.count; i++) {
2698 		data = &sc->rxq.data[i];
2699 		CSR_WRITE_4(sc, data->reg, data->physaddr);
2700 	}
2701 
2702 	CSR_WRITE_4(sc, IWI_CSR_RX_WIDX, sc->rxq.count - 1);
2703 
2704 	if (iwi_load_firmware(sc, fw->main, fw->main_size) != 0) {
2705 		device_printf(sc->sc_dev, "could not load main firmware\n");
2706 		goto fail;
2707 	}
2708 
2709 	sc->flags |= IWI_FLAG_FW_INITED;
2710 
2711 	if (iwi_config(sc) != 0) {
2712 		device_printf(sc->sc_dev, "device configuration failed\n");
2713 		goto fail;
2714 	}
2715 
2716 	if (ic->ic_opmode != IEEE80211_M_MONITOR) {
2717 		if (ic->ic_roaming != IEEE80211_ROAMING_MANUAL)
2718 			ieee80211_new_state(ic, IEEE80211_S_SCAN, -1);
2719 	} else
2720 		ieee80211_new_state(ic, IEEE80211_S_RUN, -1);
2721 
2722 	ifp->if_flags &= ~IFF_OACTIVE;
2723 	ifp->if_flags |= IFF_RUNNING;
2724 
2725 	return;
2726 
2727 fail:	ifp->if_flags &= ~IFF_UP;
2728 	iwi_stop(sc);
2729 }
2730 
2731 static void
2732 iwi_stop(void *priv)
2733 {
2734 	struct iwi_softc *sc = priv;
2735 	struct ieee80211com *ic = &sc->sc_ic;
2736 	struct ifnet *ifp = ic->ic_ifp;
2737 
2738 	ieee80211_new_state(ic, IEEE80211_S_INIT, -1);
2739 
2740 	iwi_stop_master(sc);
2741 
2742 	CSR_WRITE_4(sc, IWI_CSR_RST, IWI_RST_SOFT_RESET);
2743 
2744 	/* reset rings */
2745 	iwi_reset_cmd_ring(sc, &sc->cmdq);
2746 	iwi_reset_tx_ring(sc, &sc->txq[0]);
2747 	iwi_reset_tx_ring(sc, &sc->txq[1]);
2748 	iwi_reset_tx_ring(sc, &sc->txq[2]);
2749 	iwi_reset_tx_ring(sc, &sc->txq[3]);
2750 	iwi_reset_rx_ring(sc, &sc->rxq);
2751 
2752 	sc->sc_tx_timer = 0;
2753 	ifp->if_timer = 0;
2754 	ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE);
2755 }
2756 
2757 static int
2758 iwi_sysctl_stats(SYSCTL_HANDLER_ARGS)
2759 {
2760 	struct iwi_softc *sc = arg1;
2761 	struct ifnet *ifp = &sc->sc_ic.ic_if;
2762 	uint32_t size, buf[128];
2763 
2764 	lwkt_serialize_enter(ifp->if_serializer);
2765 
2766 	if (!(sc->flags & IWI_FLAG_FW_INITED)) {
2767 		memset(buf, 0, sizeof buf);
2768 		goto back;
2769 	}
2770 
2771 	size = min(CSR_READ_4(sc, IWI_CSR_TABLE0_SIZE), 128 - 1);
2772 	CSR_READ_REGION_4(sc, IWI_CSR_TABLE0_BASE, &buf[1], size);
2773 back:
2774 	lwkt_serialize_exit(ifp->if_serializer);
2775 	return SYSCTL_OUT(req, buf, sizeof buf);
2776 }
2777 
2778 static int
2779 iwi_sysctl_radio(SYSCTL_HANDLER_ARGS)
2780 {
2781 	struct iwi_softc *sc = arg1;
2782 	struct ifnet *ifp = &sc->sc_ic.ic_if;
2783 	int val;
2784 
2785 	lwkt_serialize_enter(ifp->if_serializer);
2786 	val = (CSR_READ_4(sc, IWI_CSR_IO) & IWI_IO_RADIO_ENABLED) ? 1 : 0;
2787 	lwkt_serialize_exit(ifp->if_serializer);
2788 
2789 	return SYSCTL_OUT(req, &val, sizeof val);
2790 }
2791 
2792 static const int8_t	iwi_bitmap[256] = {
2793 	0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4,
2794 	0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 5,
2795 	0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4,
2796 	0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 6,
2797 	0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4,
2798 	0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 5,
2799 	0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4,
2800 	0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 7,
2801 	0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4,
2802 	0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 5,
2803 	0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4,
2804 	0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 6,
2805 	0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4,
2806 	0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 5,
2807 	0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4,
2808 	0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, -1
2809 };
2810 
2811 static int
2812 iwi_alloc_ibss_node(struct iwi_softc *sc)
2813 {
2814 	int i;
2815 
2816 	ASSERT_SERIALIZED(sc->sc_ic.ic_if.if_serializer);
2817 
2818 	for (i = 0; i < IWI_MAX_IBSSNODE_NBYTE; ++i) {
2819 		int ret;
2820 
2821 		ret = iwi_bitmap[sc->sc_ibss_node[i]];
2822 		if (ret != -1) {
2823 			sc->sc_ibss_node[i] |= (1 << ret);
2824 			ret += (i * NBBY);
2825 			return ret;
2826 		}
2827 	}
2828 	return -1;
2829 }
2830 
2831 static void
2832 iwi_free_ibss_node(struct iwi_softc *sc, int ibss_node)
2833 {
2834 	int i, b;
2835 
2836 	ASSERT_SERIALIZED(sc->sc_ic.ic_if.if_serializer);
2837 	KASSERT(ibss_node < IWI_MAX_IBSSNODE, ("free ibss node, out of range"));
2838 
2839 	i = ibss_node / NBBY;
2840 	b = ibss_node % NBBY;
2841 
2842 	sc->sc_ibss_node[i] &= ~(1 << b);
2843 }
2844