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