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