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