xref: /netbsd-src/sys/dev/pci/if_iwi.c (revision eb961d0e02b7a46a9acfa877b02df48df6637278)
1 /*	$NetBSD: if_iwi.c,v 1.46 2006/03/09 16:02:55 jmcneill 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.46 2006/03/09 16:02:55 jmcneill 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 	pci_chipset_tag_t pc = sc->sc_pct;
848 	pcitag_t tag = sc->sc_pcitag;
849 	int s;
850 
851 	s = splnet();
852 	switch (why) {
853 	case PWR_SUSPEND:
854 	case PWR_STANDBY:
855 		pci_conf_capture(pc, tag, &sc->sc_pciconf);
856 		break;
857 	case PWR_RESUME:
858 		pci_conf_restore(pc, tag, &sc->sc_pciconf);
859 		break;
860 	case PWR_SOFTSUSPEND:
861 	case PWR_SOFTSTANDBY:
862 		iwi_suspend(sc);
863 		break;
864 	case PWR_SOFTRESUME:
865 		iwi_resume(sc);
866 		break;
867 	}
868 	splx(s);
869 }
870 
871 static struct ieee80211_node *
872 iwi_node_alloc(struct ieee80211_node_table *nt)
873 {
874 	struct iwi_node *in;
875 
876 	in = malloc(sizeof (struct iwi_node), M_80211_NODE, M_NOWAIT | M_ZERO);
877 	if (in == NULL)
878 		return NULL;
879 
880 	in->in_station = -1;
881 
882 	return &in->in_node;
883 }
884 
885 static int
886 iwi_alloc_unr(struct iwi_softc *sc)
887 {
888 	int i;
889 
890 	for (i = 0; i < IWI_MAX_IBSSNODE - 1; i++)
891 		if ((sc->sc_unr & (1 << i)) == 0) {
892 			sc->sc_unr |= 1 << i;
893 			return i;
894 		}
895 
896 	return -1;
897 }
898 
899 static void
900 iwi_free_unr(struct iwi_softc *sc, int r)
901 {
902 
903 	sc->sc_unr &= 1 << r;
904 }
905 
906 static void
907 iwi_node_free(struct ieee80211_node *ni)
908 {
909 	struct ieee80211com *ic = ni->ni_ic;
910 	struct iwi_softc *sc = ic->ic_ifp->if_softc;
911 	struct iwi_node *in = (struct iwi_node *)ni;
912 
913 	if (in->in_station != -1)
914 		iwi_free_unr(sc, in->in_station);
915 
916 	sc->sc_node_free(ni);
917 }
918 
919 static int
920 iwi_media_change(struct ifnet *ifp)
921 {
922 	int error;
923 
924 	error = ieee80211_media_change(ifp);
925 	if (error != ENETRESET)
926 		return error;
927 
928 	if ((ifp->if_flags & (IFF_UP | IFF_RUNNING)) == (IFF_UP | IFF_RUNNING))
929 		iwi_init(ifp);
930 
931 	return 0;
932 }
933 
934 /*
935  * The firmware automatically adapts the transmit speed.  We report its current
936  * value here.
937  */
938 static void
939 iwi_media_status(struct ifnet *ifp, struct ifmediareq *imr)
940 {
941 	struct iwi_softc *sc = ifp->if_softc;
942 	struct ieee80211com *ic = &sc->sc_ic;
943 #define N(a)	(sizeof (a) / sizeof (a[0]))
944 	static const struct {
945 		uint32_t	val;
946 		int		rate;
947 	} rates[] = {
948 		{ IWI_RATE_DS1,      2 },
949 		{ IWI_RATE_DS2,      4 },
950 		{ IWI_RATE_DS5,     11 },
951 		{ IWI_RATE_DS11,    22 },
952 		{ IWI_RATE_OFDM6,   12 },
953 		{ IWI_RATE_OFDM9,   18 },
954 		{ IWI_RATE_OFDM12,  24 },
955 		{ IWI_RATE_OFDM18,  36 },
956 		{ IWI_RATE_OFDM24,  48 },
957 		{ IWI_RATE_OFDM36,  72 },
958 		{ IWI_RATE_OFDM48,  96 },
959 		{ IWI_RATE_OFDM54, 108 },
960 	};
961 	uint32_t val;
962 	int rate, i;
963 
964 	imr->ifm_status = IFM_AVALID;
965 	imr->ifm_active = IFM_IEEE80211;
966 	if (ic->ic_state == IEEE80211_S_RUN)
967 		imr->ifm_status |= IFM_ACTIVE;
968 
969 	/* read current transmission rate from adapter */
970 	val = CSR_READ_4(sc, IWI_CSR_CURRENT_TX_RATE);
971 
972 	/* convert rate to 802.11 rate */
973 	for (i = 0; i < N(rates) && rates[i].val != val; i++);
974 	rate = (i < N(rates)) ? rates[i].rate : 0;
975 
976 	imr->ifm_active |= ieee80211_rate2media(ic, rate, ic->ic_curmode);
977 	switch (ic->ic_opmode) {
978 	case IEEE80211_M_STA:
979 		break;
980 
981 	case IEEE80211_M_IBSS:
982 		imr->ifm_active |= IFM_IEEE80211_ADHOC;
983 		break;
984 
985 	case IEEE80211_M_MONITOR:
986 		imr->ifm_active |= IFM_IEEE80211_MONITOR;
987 		break;
988 
989 	case IEEE80211_M_AHDEMO:
990 	case IEEE80211_M_HOSTAP:
991 		/* should not get there */
992 		break;
993 	}
994 #undef N
995 }
996 
997 static int
998 iwi_newstate(struct ieee80211com *ic, enum ieee80211_state nstate, int arg)
999 {
1000 	struct iwi_softc *sc = ic->ic_ifp->if_softc;
1001 
1002 	switch (nstate) {
1003 	case IEEE80211_S_SCAN:
1004 		if (sc->flags & IWI_FLAG_SCANNING)
1005 			break;
1006 
1007 		ieee80211_node_table_reset(&ic->ic_scan);
1008 		ic->ic_flags |= IEEE80211_F_SCAN | IEEE80211_F_ASCAN;
1009 		sc->flags |= IWI_FLAG_SCANNING;
1010 		/* blink the led while scanning */
1011 		iwi_led_set(sc, IWI_LED_ASSOCIATED, 1);
1012 		iwi_scan(sc);
1013 		break;
1014 
1015 	case IEEE80211_S_AUTH:
1016 		iwi_auth_and_assoc(sc);
1017 		break;
1018 
1019 	case IEEE80211_S_RUN:
1020 		if (ic->ic_opmode == IEEE80211_M_IBSS)
1021 			ieee80211_new_state(ic, IEEE80211_S_AUTH, -1);
1022 		else if (ic->ic_opmode == IEEE80211_M_MONITOR)
1023 			iwi_set_chan(sc, ic->ic_ibss_chan);
1024 
1025 		return (*sc->sc_newstate)(ic, nstate,
1026 		    IEEE80211_FC0_SUBTYPE_ASSOC_RESP);
1027 
1028 	case IEEE80211_S_ASSOC:
1029 		iwi_led_set(sc, IWI_LED_ASSOCIATED, 0);
1030 		break;
1031 
1032 	case IEEE80211_S_INIT:
1033 		sc->flags &= ~IWI_FLAG_SCANNING;
1034 		return (*sc->sc_newstate)(ic, nstate, arg);
1035 	}
1036 
1037 	ic->ic_state = nstate;
1038 	return 0;
1039 }
1040 
1041 /*
1042  * WME parameters coming from IEEE 802.11e specification.  These values are
1043  * already declared in ieee80211_proto.c, but they are static so they can't
1044  * be reused here.
1045  */
1046 static const struct wmeParams iwi_wme_cck_params[WME_NUM_AC] = {
1047 	{ 0, 3, 5,  7,   0 },	/* WME_AC_BE */
1048 	{ 0, 3, 5, 10,   0 },	/* WME_AC_BK */
1049 	{ 0, 2, 4,  5, 188 },	/* WME_AC_VI */
1050 	{ 0, 2, 3,  4, 102 }	/* WME_AC_VO */
1051 };
1052 
1053 static const struct wmeParams iwi_wme_ofdm_params[WME_NUM_AC] = {
1054 	{ 0, 3, 4,  6,   0 },	/* WME_AC_BE */
1055 	{ 0, 3, 4, 10,   0 },	/* WME_AC_BK */
1056 	{ 0, 2, 3,  4,  94 },	/* WME_AC_VI */
1057 	{ 0, 2, 2,  3,  47 }	/* WME_AC_VO */
1058 };
1059 
1060 static int
1061 iwi_wme_update(struct ieee80211com *ic)
1062 {
1063 #define IWI_EXP2(v)	htole16((1 << (v)) - 1)
1064 #define IWI_USEC(v)	htole16(IEEE80211_TXOP_TO_US(v))
1065 	struct iwi_softc *sc = ic->ic_ifp->if_softc;
1066 	struct iwi_wme_params wme[3];
1067 	const struct wmeParams *wmep;
1068 	int ac;
1069 
1070 	/*
1071 	 * We shall not override firmware default WME values if WME is not
1072 	 * actually enabled.
1073 	 */
1074 	if (!(ic->ic_flags & IEEE80211_F_WME))
1075 		return 0;
1076 
1077 	for (ac = 0; ac < WME_NUM_AC; ac++) {
1078 		/* set WME values for current operating mode */
1079 		wmep = &ic->ic_wme.wme_chanParams.cap_wmeParams[ac];
1080 		wme[0].aifsn[ac] = wmep->wmep_aifsn;
1081 		wme[0].cwmin[ac] = IWI_EXP2(wmep->wmep_logcwmin);
1082 		wme[0].cwmax[ac] = IWI_EXP2(wmep->wmep_logcwmax);
1083 		wme[0].burst[ac] = IWI_USEC(wmep->wmep_txopLimit);
1084 		wme[0].acm[ac]   = wmep->wmep_acm;
1085 
1086 		/* set WME values for CCK modulation */
1087 		wmep = &iwi_wme_cck_params[ac];
1088 		wme[1].aifsn[ac] = wmep->wmep_aifsn;
1089 		wme[1].cwmin[ac] = IWI_EXP2(wmep->wmep_logcwmin);
1090 		wme[1].cwmax[ac] = IWI_EXP2(wmep->wmep_logcwmax);
1091 		wme[1].burst[ac] = IWI_USEC(wmep->wmep_txopLimit);
1092 		wme[1].acm[ac]   = wmep->wmep_acm;
1093 
1094 		/* set WME values for OFDM modulation */
1095 		wmep = &iwi_wme_ofdm_params[ac];
1096 		wme[2].aifsn[ac] = wmep->wmep_aifsn;
1097 		wme[2].cwmin[ac] = IWI_EXP2(wmep->wmep_logcwmin);
1098 		wme[2].cwmax[ac] = IWI_EXP2(wmep->wmep_logcwmax);
1099 		wme[2].burst[ac] = IWI_USEC(wmep->wmep_txopLimit);
1100 		wme[2].acm[ac]   = wmep->wmep_acm;
1101 	}
1102 
1103 	DPRINTF(("Setting WME parameters\n"));
1104 	return iwi_cmd(sc, IWI_CMD_SET_WME_PARAMS, wme, sizeof wme, 1);
1105 #undef IWI_USEC
1106 #undef IWI_EXP2
1107 }
1108 
1109 /*
1110  * Read 16 bits at address 'addr' from the serial EEPROM.
1111  */
1112 static uint16_t
1113 iwi_read_prom_word(struct iwi_softc *sc, uint8_t addr)
1114 {
1115 	uint32_t tmp;
1116 	uint16_t val;
1117 	int n;
1118 
1119 	/* Clock C once before the first command */
1120 	IWI_EEPROM_CTL(sc, 0);
1121 	IWI_EEPROM_CTL(sc, IWI_EEPROM_S);
1122 	IWI_EEPROM_CTL(sc, IWI_EEPROM_S | IWI_EEPROM_C);
1123 	IWI_EEPROM_CTL(sc, IWI_EEPROM_S);
1124 
1125 	/* Write start bit (1) */
1126 	IWI_EEPROM_CTL(sc, IWI_EEPROM_S | IWI_EEPROM_D);
1127 	IWI_EEPROM_CTL(sc, IWI_EEPROM_S | IWI_EEPROM_D | IWI_EEPROM_C);
1128 
1129 	/* Write READ opcode (10) */
1130 	IWI_EEPROM_CTL(sc, IWI_EEPROM_S | IWI_EEPROM_D);
1131 	IWI_EEPROM_CTL(sc, IWI_EEPROM_S | IWI_EEPROM_D | IWI_EEPROM_C);
1132 	IWI_EEPROM_CTL(sc, IWI_EEPROM_S);
1133 	IWI_EEPROM_CTL(sc, IWI_EEPROM_S | IWI_EEPROM_C);
1134 
1135 	/* Write address A7-A0 */
1136 	for (n = 7; n >= 0; n--) {
1137 		IWI_EEPROM_CTL(sc, IWI_EEPROM_S |
1138 		    (((addr >> n) & 1) << IWI_EEPROM_SHIFT_D));
1139 		IWI_EEPROM_CTL(sc, IWI_EEPROM_S |
1140 		    (((addr >> n) & 1) << IWI_EEPROM_SHIFT_D) | IWI_EEPROM_C);
1141 	}
1142 
1143 	IWI_EEPROM_CTL(sc, IWI_EEPROM_S);
1144 
1145 	/* Read data Q15-Q0 */
1146 	val = 0;
1147 	for (n = 15; n >= 0; n--) {
1148 		IWI_EEPROM_CTL(sc, IWI_EEPROM_S | IWI_EEPROM_C);
1149 		IWI_EEPROM_CTL(sc, IWI_EEPROM_S);
1150 		tmp = MEM_READ_4(sc, IWI_MEM_EEPROM_CTL);
1151 		val |= ((tmp & IWI_EEPROM_Q) >> IWI_EEPROM_SHIFT_Q) << n;
1152 	}
1153 
1154 	IWI_EEPROM_CTL(sc, 0);
1155 
1156 	/* Clear Chip Select and clock C */
1157 	IWI_EEPROM_CTL(sc, IWI_EEPROM_S);
1158 	IWI_EEPROM_CTL(sc, 0);
1159 	IWI_EEPROM_CTL(sc, IWI_EEPROM_C);
1160 
1161 	return val;
1162 }
1163 
1164 /*
1165  * XXX: Hack to set the current channel to the value advertised in beacons or
1166  * probe responses. Only used during AP detection.
1167  */
1168 static void
1169 iwi_fix_channel(struct ieee80211com *ic, struct mbuf *m)
1170 {
1171 	struct ieee80211_frame *wh;
1172 	uint8_t subtype;
1173 	uint8_t *frm, *efrm;
1174 
1175 	wh = mtod(m, struct ieee80211_frame *);
1176 
1177 	if ((wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK) != IEEE80211_FC0_TYPE_MGT)
1178 		return;
1179 
1180 	subtype = wh->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK;
1181 
1182 	if (subtype != IEEE80211_FC0_SUBTYPE_BEACON &&
1183 	    subtype != IEEE80211_FC0_SUBTYPE_PROBE_RESP)
1184 		return;
1185 
1186 	frm = (uint8_t *)(wh + 1);
1187 	efrm = mtod(m, uint8_t *) + m->m_len;
1188 
1189 	frm += 12;	/* skip tstamp, bintval and capinfo fields */
1190 	while (frm < efrm) {
1191 		if (*frm == IEEE80211_ELEMID_DSPARMS)
1192 #if IEEE80211_CHAN_MAX < 255
1193 		if (frm[2] <= IEEE80211_CHAN_MAX)
1194 #endif
1195 			ic->ic_curchan = &ic->ic_channels[frm[2]];
1196 
1197 		frm += frm[1] + 2;
1198 	}
1199 }
1200 
1201 static struct mbuf *
1202 iwi_alloc_rx_buf(struct iwi_softc *sc)
1203 {
1204 	struct mbuf *m;
1205 
1206 	MGETHDR(m, M_DONTWAIT, MT_DATA);
1207 	if (m == NULL) {
1208 		aprint_error("%s: could not allocate rx mbuf\n",
1209 		    sc->sc_dev.dv_xname);
1210 		return NULL;
1211 	}
1212 
1213 	MCLGET(m, M_DONTWAIT);
1214 	if (!(m->m_flags & M_EXT)) {
1215 		aprint_error("%s: could not allocate rx mbuf cluster\n",
1216 		    sc->sc_dev.dv_xname);
1217 		m_freem(m);
1218 		return NULL;
1219 	}
1220 
1221 	m->m_pkthdr.len = m->m_len = m->m_ext.ext_size;
1222 	return m;
1223 }
1224 
1225 static void
1226 iwi_frame_intr(struct iwi_softc *sc, struct iwi_rx_data *data, int i,
1227     struct iwi_frame *frame)
1228 {
1229 	struct ieee80211com *ic = &sc->sc_ic;
1230 	struct ifnet *ifp = ic->ic_ifp;
1231 	struct mbuf *m, *m_new;
1232 	struct ieee80211_frame *wh;
1233 	struct ieee80211_node *ni;
1234 	int error;
1235 
1236 	DPRINTFN(5, ("received frame len=%u chan=%u rssi=%u\n",
1237 	    le16toh(frame->len), frame->chan, frame->rssi_dbm));
1238 
1239 	if (le16toh(frame->len) < sizeof (struct ieee80211_frame) ||
1240 	    le16toh(frame->len) > MCLBYTES) {
1241 		DPRINTF(("%s: bad frame length\n", sc->sc_dev.dv_xname));
1242 		ifp->if_ierrors++;
1243 		return;
1244 	}
1245 
1246 	/*
1247 	 * Try to allocate a new mbuf for this ring element and
1248 	 * load it before processing the current mbuf. If the ring
1249 	 * element cannot be reloaded, drop the received packet
1250 	 * and reuse the old mbuf. In the unlikely case that
1251 	 * the old mbuf can't be reloaded either, explicitly panic.
1252 	 *
1253 	 * XXX Reorganize buffer by moving elements from the logical
1254 	 * end of the ring to the front instead of dropping.
1255 	 */
1256 	if ((m_new = iwi_alloc_rx_buf(sc)) == NULL) {
1257 		ifp->if_ierrors++;
1258 		return;
1259 	}
1260 
1261 	bus_dmamap_unload(sc->sc_dmat, data->map);
1262 
1263 	error = bus_dmamap_load_mbuf(sc->sc_dmat, data->map, m_new,
1264 	    BUS_DMA_READ | BUS_DMA_NOWAIT);
1265 	if (error != 0) {
1266 		aprint_error("%s: could not load rx buf DMA map\n",
1267 		    sc->sc_dev.dv_xname);
1268 		m_freem(m_new);
1269 		ifp->if_ierrors++;
1270 		error = bus_dmamap_load_mbuf(sc->sc_dmat, data->map,
1271 		    data->m, BUS_DMA_READ | BUS_DMA_NOWAIT);
1272 		if (error)
1273 			panic("%s: unable to remap rx buf",
1274 			    sc->sc_dev.dv_xname);
1275 		return;
1276 	}
1277 
1278 	/*
1279 	 * New mbuf successfully loaded, update RX ring and continue
1280 	 * processing.
1281 	 */
1282 	m = data->m;
1283 	data->m = m_new;
1284 	CSR_WRITE_4(sc, IWI_CSR_RX_BASE + i * 4, data->map->dm_segs[0].ds_addr);
1285 
1286 	/* Finalize mbuf */
1287 	m->m_pkthdr.rcvif = ifp;
1288 	m->m_pkthdr.len = m->m_len = sizeof (struct iwi_hdr) +
1289 	    sizeof (struct iwi_frame) + le16toh(frame->len);
1290 
1291 	m_adj(m, sizeof (struct iwi_hdr) + sizeof (struct iwi_frame));
1292 
1293 	if (ic->ic_state == IEEE80211_S_SCAN)
1294 		iwi_fix_channel(ic, m);
1295 
1296 #if NBPFILTER > 0
1297 	if (sc->sc_drvbpf != NULL) {
1298 		struct iwi_rx_radiotap_header *tap = &sc->sc_rxtap;
1299 
1300 		tap->wr_flags = 0;
1301 		tap->wr_rate = frame->rate;
1302 		tap->wr_chan_freq =
1303 		    htole16(ic->ic_channels[frame->chan].ic_freq);
1304 		tap->wr_chan_flags =
1305 		    htole16(ic->ic_channels[frame->chan].ic_flags);
1306 		tap->wr_antsignal = frame->signal;
1307 		tap->wr_antenna = frame->antenna;
1308 
1309 		bpf_mtap2(sc->sc_drvbpf, tap, sc->sc_rxtap_len, m);
1310 	}
1311 #endif
1312 
1313 	wh = mtod(m, struct ieee80211_frame *);
1314 	ni = ieee80211_find_rxnode(ic, (struct ieee80211_frame_min *)wh);
1315 
1316 	/* Send the frame to the upper layer */
1317 	ieee80211_input(ic, m, ni, frame->rssi_dbm, 0);
1318 
1319 	/* node is no longer needed */
1320 	ieee80211_free_node(ni);
1321 }
1322 
1323 static void
1324 iwi_notification_intr(struct iwi_softc *sc, struct iwi_notif *notif)
1325 {
1326 	struct ieee80211com *ic = &sc->sc_ic;
1327 	struct iwi_notif_scan_channel *chan;
1328 	struct iwi_notif_scan_complete *scan;
1329 	struct iwi_notif_authentication *auth;
1330 	struct iwi_notif_association *assoc;
1331 
1332 	switch (notif->type) {
1333 	case IWI_NOTIF_TYPE_SCAN_CHANNEL:
1334 		chan = (struct iwi_notif_scan_channel *)(notif + 1);
1335 
1336 		DPRINTFN(2, ("Finished scanning channel (%u)\n", chan->nchan));
1337 		break;
1338 
1339 	case IWI_NOTIF_TYPE_SCAN_COMPLETE:
1340 		scan = (struct iwi_notif_scan_complete *)(notif + 1);
1341 
1342 		DPRINTFN(2, ("Scan completed (%u, %u)\n", scan->nchan,
1343 		    scan->status));
1344 
1345 		/* monitor mode uses scan to set the channel ... */
1346 		if (ic->ic_opmode != IEEE80211_M_MONITOR) {
1347 			sc->flags &= ~IWI_FLAG_SCANNING;
1348 			ieee80211_end_scan(ic);
1349 		} else
1350 			iwi_set_chan(sc, ic->ic_ibss_chan);
1351 		break;
1352 
1353 	case IWI_NOTIF_TYPE_AUTHENTICATION:
1354 		auth = (struct iwi_notif_authentication *)(notif + 1);
1355 
1356 		DPRINTFN(2, ("Authentication (%u)\n", auth->state));
1357 
1358 		switch (auth->state) {
1359 		case IWI_AUTHENTICATED:
1360 			ieee80211_node_authorize(ic->ic_bss);
1361 			ieee80211_new_state(ic, IEEE80211_S_ASSOC, -1);
1362 			break;
1363 
1364 		case IWI_DEAUTHENTICATED:
1365 			break;
1366 
1367 		default:
1368 			aprint_error("%s: unknown authentication state %u\n",
1369 			    sc->sc_dev.dv_xname, auth->state);
1370 		}
1371 		break;
1372 
1373 	case IWI_NOTIF_TYPE_ASSOCIATION:
1374 		assoc = (struct iwi_notif_association *)(notif + 1);
1375 
1376 		DPRINTFN(2, ("Association (%u, %u)\n", assoc->state,
1377 		    assoc->status));
1378 
1379 		switch (assoc->state) {
1380 		case IWI_AUTHENTICATED:
1381 			/* re-association, do nothing */
1382 			break;
1383 
1384 		case IWI_ASSOCIATED:
1385 			ieee80211_new_state(ic, IEEE80211_S_RUN, -1);
1386 			break;
1387 
1388 		case IWI_DEASSOCIATED:
1389 			ieee80211_begin_scan(ic, 1);
1390 			break;
1391 
1392 		default:
1393 			aprint_error("%s: unknown association state %u\n",
1394 			    sc->sc_dev.dv_xname, assoc->state);
1395 		}
1396 		break;
1397 
1398 	case IWI_NOTIF_TYPE_CALIBRATION:
1399 	case IWI_NOTIF_TYPE_BEACON:
1400 	case IWI_NOTIF_TYPE_NOISE:
1401 		DPRINTFN(5, ("Notification (%u)\n", notif->type));
1402 		break;
1403 
1404 	default:
1405 		aprint_error("%s: unknown notification type %u\n",
1406 		    sc->sc_dev.dv_xname, notif->type);
1407 	}
1408 }
1409 
1410 static void
1411 iwi_cmd_intr(struct iwi_softc *sc)
1412 {
1413 	uint32_t hw;
1414 
1415 	hw = CSR_READ_4(sc, IWI_CSR_CMD_RIDX);
1416 
1417 	for (; sc->cmdq.next != hw;) {
1418 		bus_dmamap_sync(sc->sc_dmat, sc->cmdq.desc_map,
1419 		    sc->cmdq.next * IWI_CMD_DESC_SIZE, IWI_CMD_DESC_SIZE,
1420 		    BUS_DMASYNC_POSTWRITE);
1421 
1422 		wakeup(&sc->cmdq.desc[sc->cmdq.next]);
1423 		sc->cmdq.next = (sc->cmdq.next + 1) % sc->cmdq.count;
1424 	}
1425 }
1426 
1427 static void
1428 iwi_rx_intr(struct iwi_softc *sc)
1429 {
1430 	struct iwi_rx_data *data;
1431 	struct iwi_hdr *hdr;
1432 	uint32_t hw;
1433 
1434 	hw = CSR_READ_4(sc, IWI_CSR_RX_RIDX);
1435 
1436 	for (; sc->rxq.cur != hw;) {
1437 		data = &sc->rxq.data[sc->rxq.cur];
1438 
1439 		bus_dmamap_sync(sc->sc_dmat, data->map, 0,
1440 		    data->map->dm_mapsize, BUS_DMASYNC_POSTREAD);
1441 
1442 		hdr = mtod(data->m, struct iwi_hdr *);
1443 
1444 		switch (hdr->type) {
1445 		case IWI_HDR_TYPE_FRAME:
1446 			iwi_frame_intr(sc, data, sc->rxq.cur,
1447 			    (struct iwi_frame *)(hdr + 1));
1448 			break;
1449 
1450 		case IWI_HDR_TYPE_NOTIF:
1451 			iwi_notification_intr(sc,
1452 			    (struct iwi_notif *)(hdr + 1));
1453 			break;
1454 
1455 		default:
1456 			aprint_error("%s: unknown hdr type %u\n",
1457 			    sc->sc_dev.dv_xname, hdr->type);
1458 		}
1459 
1460 		bus_dmamap_sync(sc->sc_dmat, data->map, 0,
1461 		    data->map->dm_mapsize, BUS_DMASYNC_PREREAD);
1462 
1463 		DPRINTFN(15, ("rx done idx=%u\n", sc->rxq.cur));
1464 
1465 		sc->rxq.cur = (sc->rxq.cur + 1) % sc->rxq.count;
1466 	}
1467 
1468 
1469 	/* Tell the firmware what we have processed */
1470 	hw = (hw == 0) ? sc->rxq.count - 1 : hw - 1;
1471 	CSR_WRITE_4(sc, IWI_CSR_RX_WIDX, hw);
1472 }
1473 
1474 static void
1475 iwi_tx_intr(struct iwi_softc *sc, struct iwi_tx_ring *txq)
1476 {
1477 	struct ifnet *ifp = &sc->sc_if;
1478 	struct iwi_tx_data *data;
1479 	uint32_t hw;
1480 
1481 	hw = CSR_READ_4(sc, txq->csr_ridx);
1482 
1483 	for (; txq->next != hw;) {
1484 		data = &txq->data[txq->next];
1485 
1486 		bus_dmamap_sync(sc->sc_dmat, data->map, 0,
1487 		    data->map->dm_mapsize, BUS_DMASYNC_POSTWRITE);
1488 		bus_dmamap_unload(sc->sc_dmat, data->map);
1489 		m_freem(data->m);
1490 		data->m = NULL;
1491 		ieee80211_free_node(data->ni);
1492 		data->ni = NULL;
1493 
1494 		DPRINTFN(15, ("tx done idx=%u\n", txq->next));
1495 
1496 		ifp->if_opackets++;
1497 
1498 		txq->queued--;
1499 		txq->next = (txq->next + 1) % txq->count;
1500 	}
1501 
1502 	sc->sc_tx_timer = 0;
1503 	ifp->if_flags &= ~IFF_OACTIVE;
1504 
1505 	/* Call start() since some buffer descriptors have been released */
1506 	(*ifp->if_start)(ifp);
1507 }
1508 
1509 static int
1510 iwi_intr(void *arg)
1511 {
1512 	struct iwi_softc *sc = arg;
1513 	uint32_t r;
1514 
1515 	if ((r = CSR_READ_4(sc, IWI_CSR_INTR)) == 0 || r == 0xffffffff)
1516 		return 0;
1517 
1518 	/* Acknowledge interrupts */
1519 	CSR_WRITE_4(sc, IWI_CSR_INTR, r);
1520 
1521 	if (r & (IWI_INTR_FATAL_ERROR | IWI_INTR_PARITY_ERROR)) {
1522 		aprint_error("%s: fatal error\n", sc->sc_dev.dv_xname);
1523 		if (r & IWI_INTR_FATAL_ERROR)
1524 			iwi_error_log(sc);
1525 		sc->sc_ic.ic_ifp->if_flags &= ~IFF_UP;
1526 		iwi_stop(&sc->sc_if, 1);
1527 		return (1);
1528 	}
1529 
1530 	if (r & IWI_INTR_FW_INITED) {
1531 		if (!(r & (IWI_INTR_FATAL_ERROR | IWI_INTR_PARITY_ERROR)))
1532 			wakeup(sc);
1533 	}
1534 
1535 	if (r & IWI_INTR_RADIO_OFF) {
1536 		DPRINTF(("radio transmitter off\n"));
1537 		sc->sc_ic.ic_ifp->if_flags &= ~IFF_UP;
1538 		iwi_stop(&sc->sc_if, 1);
1539 		return (1);
1540 	}
1541 
1542 	if (r & IWI_INTR_CMD_DONE)
1543 		iwi_cmd_intr(sc);
1544 
1545 	if (r & IWI_INTR_TX1_DONE)
1546 		iwi_tx_intr(sc, &sc->txq[0]);
1547 
1548 	if (r & IWI_INTR_TX2_DONE)
1549 		iwi_tx_intr(sc, &sc->txq[1]);
1550 
1551 	if (r & IWI_INTR_TX3_DONE)
1552 		iwi_tx_intr(sc, &sc->txq[2]);
1553 
1554 	if (r & IWI_INTR_TX4_DONE)
1555 		iwi_tx_intr(sc, &sc->txq[3]);
1556 
1557 	if (r & IWI_INTR_RX_DONE)
1558 		iwi_rx_intr(sc);
1559 
1560 	return 1;
1561 }
1562 
1563 static int
1564 iwi_cmd(struct iwi_softc *sc, uint8_t type, void *data, uint8_t len,
1565     int async)
1566 {
1567 	struct iwi_cmd_desc *desc;
1568 
1569 	desc = &sc->cmdq.desc[sc->cmdq.cur];
1570 
1571 	desc->hdr.type = IWI_HDR_TYPE_COMMAND;
1572 	desc->hdr.flags = IWI_HDR_FLAG_IRQ;
1573 	desc->type = type;
1574 	desc->len = len;
1575 	memcpy(desc->data, data, len);
1576 
1577 	bus_dmamap_sync(sc->sc_dmat, sc->cmdq.desc_map,
1578 	    sc->cmdq.cur * IWI_CMD_DESC_SIZE,
1579 	    IWI_CMD_DESC_SIZE, BUS_DMASYNC_PREWRITE);
1580 
1581 	DPRINTFN(2, ("sending command idx=%u type=%u len=%u\n", sc->cmdq.cur,
1582 	    type, len));
1583 
1584 	sc->cmdq.cur = (sc->cmdq.cur + 1) % sc->cmdq.count;
1585 	CSR_WRITE_4(sc, IWI_CSR_CMD_WIDX, sc->cmdq.cur);
1586 
1587 	return async ? 0 : tsleep(desc, 0, "iwicmd", hz);
1588 }
1589 
1590 static void
1591 iwi_write_ibssnode(struct iwi_softc *sc, const struct iwi_node *in)
1592 {
1593 	struct iwi_ibssnode node;
1594 
1595 	/* write node information into NIC memory */
1596 	memset(&node, 0, sizeof node);
1597 	IEEE80211_ADDR_COPY(node.bssid, in->in_node.ni_macaddr);
1598 
1599 	CSR_WRITE_REGION_1(sc,
1600 	    IWI_CSR_NODE_BASE + in->in_station * sizeof node,
1601 	    (uint8_t *)&node, sizeof node);
1602 }
1603 
1604 static int
1605 iwi_tx_start(struct ifnet *ifp, struct mbuf *m0, struct ieee80211_node *ni,
1606     int ac)
1607 {
1608 	struct iwi_softc *sc = ifp->if_softc;
1609 	struct ieee80211com *ic = &sc->sc_ic;
1610 	struct iwi_node *in = (struct iwi_node *)ni;
1611 	struct ieee80211_frame *wh;
1612 	struct ieee80211_key *k;
1613 	const struct chanAccParams *cap;
1614 	struct iwi_tx_ring *txq = &sc->txq[ac];
1615 	struct iwi_tx_data *data;
1616 	struct iwi_tx_desc *desc;
1617 	struct mbuf *mnew;
1618 	int error, hdrlen, i, noack = 0;
1619 
1620 	wh = mtod(m0, struct ieee80211_frame *);
1621 
1622 	if (wh->i_fc[0] & IEEE80211_FC0_SUBTYPE_QOS) {
1623 		hdrlen = sizeof (struct ieee80211_qosframe);
1624 		cap = &ic->ic_wme.wme_chanParams;
1625 		noack = cap->cap_wmeParams[ac].wmep_noackPolicy;
1626 	} else
1627 		hdrlen = sizeof (struct ieee80211_frame);
1628 
1629 	/*
1630 	 * This is only used in IBSS mode where the firmware expect an index
1631 	 * in a h/w table instead of a destination address.
1632 	 */
1633 	if (ic->ic_opmode == IEEE80211_M_IBSS && in->in_station == -1) {
1634 		in->in_station = iwi_alloc_unr(sc);
1635 
1636 		if (in->in_station == -1) {	/* h/w table is full */
1637 			m_freem(m0);
1638 			ieee80211_free_node(ni);
1639 			ifp->if_oerrors++;
1640 			return 0;
1641 		}
1642 		iwi_write_ibssnode(sc, in);
1643 	}
1644 
1645 	if (wh->i_fc[1] & IEEE80211_FC1_WEP) {
1646 		k = ieee80211_crypto_encap(ic, ni, m0);
1647 		if (k == NULL) {
1648 			m_freem(m0);
1649 			return ENOBUFS;
1650 		}
1651 
1652 		/* packet header may have moved, reset our local pointer */
1653 		wh = mtod(m0, struct ieee80211_frame *);
1654 	}
1655 
1656 #if NBPFILTER > 0
1657 	if (sc->sc_drvbpf != NULL) {
1658 		struct iwi_tx_radiotap_header *tap = &sc->sc_txtap;
1659 
1660 		tap->wt_flags = 0;
1661 		tap->wt_chan_freq = htole16(ic->ic_ibss_chan->ic_freq);
1662 		tap->wt_chan_flags = htole16(ic->ic_ibss_chan->ic_flags);
1663 
1664 		bpf_mtap2(sc->sc_drvbpf, tap, sc->sc_txtap_len, m0);
1665 	}
1666 #endif
1667 
1668 	data = &txq->data[txq->cur];
1669 	desc = &txq->desc[txq->cur];
1670 
1671 	/* save and trim IEEE802.11 header */
1672 	m_copydata(m0, 0, hdrlen, (caddr_t)&desc->wh);
1673 	m_adj(m0, hdrlen);
1674 
1675 	error = bus_dmamap_load_mbuf(sc->sc_dmat, data->map, m0,
1676 	    BUS_DMA_WRITE | BUS_DMA_NOWAIT);
1677 	if (error != 0 && error != EFBIG) {
1678 		aprint_error("%s: could not map mbuf (error %d)\n",
1679 		    sc->sc_dev.dv_xname, error);
1680 		m_freem(m0);
1681 		return error;
1682 	}
1683 	if (error != 0) {
1684 		/* too many fragments, linearize */
1685 
1686 		MGETHDR(mnew, M_DONTWAIT, MT_DATA);
1687 		if (mnew == NULL) {
1688 			m_freem(m0);
1689 			return ENOMEM;
1690 		}
1691 
1692 		M_COPY_PKTHDR(mnew, m0);
1693 
1694 		/* If the data won't fit in the header, get a cluster */
1695 		if (m0->m_pkthdr.len > MHLEN) {
1696 			MCLGET(mnew, M_DONTWAIT);
1697 			if (!(mnew->m_flags & M_EXT)) {
1698 				m_freem(m0);
1699 				m_freem(mnew);
1700 				return ENOMEM;
1701 			}
1702 		}
1703 		m_copydata(m0, 0, m0->m_pkthdr.len, mtod(mnew, caddr_t));
1704 		m_freem(m0);
1705 		mnew->m_len = mnew->m_pkthdr.len;
1706 		m0 = mnew;
1707 
1708 		error = bus_dmamap_load_mbuf(sc->sc_dmat, data->map, m0,
1709 		    BUS_DMA_WRITE | BUS_DMA_NOWAIT);
1710 		if (error != 0) {
1711 			aprint_error("%s: could not map mbuf (error %d)\n",
1712 			    sc->sc_dev.dv_xname, error);
1713 			m_freem(m0);
1714 			return error;
1715 		}
1716 	}
1717 
1718 	data->m = m0;
1719 	data->ni = ni;
1720 
1721 	desc->hdr.type = IWI_HDR_TYPE_DATA;
1722 	desc->hdr.flags = IWI_HDR_FLAG_IRQ;
1723 	desc->station =
1724 	    (ic->ic_opmode == IEEE80211_M_IBSS) ? in->in_station : 0;
1725 	desc->cmd = IWI_DATA_CMD_TX;
1726 	desc->len = htole16(m0->m_pkthdr.len);
1727 	desc->flags = 0;
1728 	desc->xflags = 0;
1729 
1730 	if (!noack && !IEEE80211_IS_MULTICAST(desc->wh.i_addr1))
1731 		desc->flags |= IWI_DATA_FLAG_NEED_ACK;
1732 
1733 #if 0
1734 	if (ic->ic_flags & IEEE80211_F_PRIVACY) {
1735 		desc->wh.i_fc[1] |= IEEE80211_FC1_WEP;
1736 		desc->wep_txkey = ic->ic_crypto.cs_def_txkey;
1737 	} else
1738 #endif
1739 		desc->flags |= IWI_DATA_FLAG_NO_WEP;
1740 
1741 	if (ic->ic_flags & IEEE80211_F_SHPREAMBLE)
1742 		desc->flags |= IWI_DATA_FLAG_SHPREAMBLE;
1743 
1744 	if (desc->wh.i_fc[0] & IEEE80211_FC0_SUBTYPE_QOS)
1745 		desc->xflags |= IWI_DATA_XFLAG_QOS;
1746 
1747 	desc->nseg = htole32(data->map->dm_nsegs);
1748 	for (i = 0; i < data->map->dm_nsegs; i++) {
1749 		desc->seg_addr[i] = htole32(data->map->dm_segs[i].ds_addr);
1750 		desc->seg_len[i]  = htole16(data->map->dm_segs[i].ds_len);
1751 	}
1752 
1753 	bus_dmamap_sync(sc->sc_dmat, txq->desc_map,
1754 	    txq->cur * IWI_TX_DESC_SIZE,
1755 	    IWI_TX_DESC_SIZE, BUS_DMASYNC_PREWRITE);
1756 
1757 	bus_dmamap_sync(sc->sc_dmat, data->map, 0, data->map->dm_mapsize,
1758 	    BUS_DMASYNC_PREWRITE);
1759 
1760 	DPRINTFN(5, ("sending data frame txq=%u idx=%u len=%u nseg=%u\n",
1761 	    ac, txq->cur, le16toh(desc->len), le32toh(desc->nseg)));
1762 
1763 	/* Inform firmware about this new packet */
1764 	txq->queued++;
1765 	txq->cur = (txq->cur + 1) % txq->count;
1766 	CSR_WRITE_4(sc, txq->csr_widx, txq->cur);
1767 
1768 	return 0;
1769 }
1770 
1771 static void
1772 iwi_start(struct ifnet *ifp)
1773 {
1774 	struct iwi_softc *sc = ifp->if_softc;
1775 	struct ieee80211com *ic = &sc->sc_ic;
1776 	struct mbuf *m0;
1777 	struct ether_header *eh;
1778 	struct ieee80211_node *ni;
1779 	int ac;
1780 
1781 	if (ic->ic_state != IEEE80211_S_RUN)
1782 		return;
1783 
1784 	for (;;) {
1785 		IF_DEQUEUE(&ifp->if_snd, m0);
1786 		if (m0 == NULL)
1787 			break;
1788 
1789 		if (m0->m_len < sizeof (struct ether_header) &&
1790 		    (m0 = m_pullup(m0, sizeof (struct ether_header))) == NULL) {
1791 			ifp->if_oerrors++;
1792 			continue;
1793 		}
1794 
1795 		eh = mtod(m0, struct ether_header *);
1796 		ni = ieee80211_find_txnode(ic, eh->ether_dhost);
1797 		if (ni == NULL) {
1798 			m_freem(m0);
1799 			ifp->if_oerrors++;
1800 			continue;
1801 		}
1802 
1803 		/* classify mbuf so we can find which tx ring to use */
1804 		if (ieee80211_classify(ic, m0, ni) != 0) {
1805 			m_freem(m0);
1806 			ieee80211_free_node(ni);
1807 			ifp->if_oerrors++;
1808 			continue;
1809 		}
1810 
1811 		/* no QoS encapsulation for EAPOL frames */
1812 		ac = (eh->ether_type != htons(ETHERTYPE_PAE)) ?
1813 		    M_WME_GETAC(m0) : WME_AC_BE;
1814 
1815 		if (sc->txq[ac].queued > sc->txq[ac].count - 8) {
1816 			/* there is no place left in this ring */
1817 			IF_PREPEND(&ifp->if_snd, m0);
1818 			ifp->if_flags |= IFF_OACTIVE;
1819 			break;
1820 		}
1821 
1822 #if NBPFILTER > 0
1823 		if (ifp->if_bpf != NULL)
1824 			bpf_mtap(ifp->if_bpf, m0);
1825 #endif
1826 
1827 		m0 = ieee80211_encap(ic, m0, ni);
1828 		if (m0 == NULL) {
1829 			ieee80211_free_node(ni);
1830 			ifp->if_oerrors++;
1831 			continue;
1832 		}
1833 
1834 #if NBPFILTER > 0
1835 		if (ic->ic_rawbpf != NULL)
1836 			bpf_mtap(ic->ic_rawbpf, m0);
1837 #endif
1838 
1839 		if (iwi_tx_start(ifp, m0, ni, ac) != 0) {
1840 			ieee80211_free_node(ni);
1841 			ifp->if_oerrors++;
1842 			break;
1843 		}
1844 
1845 		/* start watchdog timer */
1846 		sc->sc_tx_timer = 5;
1847 		ifp->if_timer = 1;
1848 	}
1849 }
1850 
1851 static void
1852 iwi_watchdog(struct ifnet *ifp)
1853 {
1854 	struct iwi_softc *sc = ifp->if_softc;
1855 
1856 	ifp->if_timer = 0;
1857 
1858 	if (sc->sc_tx_timer > 0) {
1859 		if (--sc->sc_tx_timer == 0) {
1860 			aprint_error("%s: device timeout\n",
1861 			    sc->sc_dev.dv_xname);
1862 			ifp->if_oerrors++;
1863 			ifp->if_flags &= ~IFF_UP;
1864 			iwi_stop(ifp, 1);
1865 			return;
1866 		}
1867 		ifp->if_timer = 1;
1868 	}
1869 
1870 	ieee80211_watchdog(&sc->sc_ic);
1871 }
1872 
1873 static int
1874 iwi_get_table0(struct iwi_softc *sc, uint32_t *tbl)
1875 {
1876 	uint32_t size, buf[128];
1877 
1878 	if (!(sc->flags & IWI_FLAG_FW_INITED)) {
1879 		memset(buf, 0, sizeof buf);
1880 		return copyout(buf, tbl, sizeof buf);
1881 	}
1882 
1883 	size = min(CSR_READ_4(sc, IWI_CSR_TABLE0_SIZE), 128 - 1);
1884 	CSR_READ_REGION_4(sc, IWI_CSR_TABLE0_BASE, &buf[1], size);
1885 
1886 	return copyout(buf, tbl, sizeof buf);
1887 }
1888 
1889 static int
1890 iwi_get_radio(struct iwi_softc *sc, int *ret)
1891 {
1892 	int val;
1893 
1894 	val = (CSR_READ_4(sc, IWI_CSR_IO) & IWI_IO_RADIO_ENABLED) ? 1 : 0;
1895 	return copyout(&val, ret, sizeof val);
1896 }
1897 
1898 static int
1899 iwi_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
1900 {
1901 #define	IS_RUNNING(ifp) \
1902 	((ifp->if_flags & IFF_UP) && (ifp->if_flags & IFF_RUNNING))
1903 
1904 	struct iwi_softc *sc = ifp->if_softc;
1905 	struct ieee80211com *ic = &sc->sc_ic;
1906 	struct ifreq *ifr = (struct ifreq *)data;
1907 	int s, error = 0;
1908 
1909 	s = splnet();
1910 
1911 	switch (cmd) {
1912 	case SIOCSIFFLAGS:
1913 		if (ifp->if_flags & IFF_UP) {
1914 			if (!(ifp->if_flags & IFF_RUNNING))
1915 				iwi_init(ifp);
1916 		} else {
1917 			if (ifp->if_flags & IFF_RUNNING)
1918 				iwi_stop(ifp, 1);
1919 		}
1920 		break;
1921 
1922 	case SIOCADDMULTI:
1923 	case SIOCDELMULTI:
1924 		error = (cmd == SIOCADDMULTI) ?
1925 		    ether_addmulti(ifr, &sc->sc_ec) :
1926 		    ether_delmulti(ifr, &sc->sc_ec);
1927 		if (error == ENETRESET) {
1928 			/* setup multicast filter, etc */
1929 			error = 0;
1930 		}
1931 		break;
1932 
1933 	case SIOCGTABLE0:
1934 		error = iwi_get_table0(sc, (uint32_t *)ifr->ifr_data);
1935 		break;
1936 
1937 	case SIOCGRADIO:
1938 		error = iwi_get_radio(sc, (int *)ifr->ifr_data);
1939 		break;
1940 
1941 	case SIOCSLOADFW:
1942 		/* only super-user can do that! */
1943 		if ((error = suser(curproc->p_ucred, &curproc->p_acflag)) != 0)
1944 			break;
1945 
1946 		error = iwi_cache_firmware(sc, ifr->ifr_data);
1947 		break;
1948 
1949 	case SIOCSKILLFW:
1950 		/* only super-user can do that! */
1951 		if ((error = suser(curproc->p_ucred, &curproc->p_acflag)) != 0)
1952 			break;
1953 
1954 		ifp->if_flags &= ~IFF_UP;
1955 		iwi_stop(ifp, 1);
1956 		iwi_free_firmware(sc);
1957 		break;
1958 
1959 	default:
1960 		error = ieee80211_ioctl(&sc->sc_ic, cmd, data);
1961 
1962 		if (error == ENETRESET) {
1963 			if (IS_RUNNING(ifp) &&
1964 			    (ic->ic_roaming != IEEE80211_ROAMING_MANUAL))
1965 				iwi_init(ifp);
1966 			error = 0;
1967 		}
1968 	}
1969 
1970 	splx(s);
1971 	return error;
1972 #undef IS_RUNNING
1973 }
1974 
1975 static void
1976 iwi_stop_master(struct iwi_softc *sc)
1977 {
1978 	int ntries;
1979 
1980 	/* Disable interrupts */
1981 	CSR_WRITE_4(sc, IWI_CSR_INTR_MASK, 0);
1982 
1983 	CSR_WRITE_4(sc, IWI_CSR_RST, IWI_RST_STOP_MASTER);
1984 	for (ntries = 0; ntries < 5; ntries++) {
1985 		if (CSR_READ_4(sc, IWI_CSR_RST) & IWI_RST_MASTER_DISABLED)
1986 			break;
1987 		DELAY(10);
1988 	}
1989 	if (ntries == 5)
1990 		aprint_error("%s: timeout waiting for master\n",
1991 		    sc->sc_dev.dv_xname);
1992 
1993 	CSR_WRITE_4(sc, IWI_CSR_RST, CSR_READ_4(sc, IWI_CSR_RST) |
1994 	    IWI_RST_PRINCETON_RESET);
1995 
1996 	sc->flags &= ~IWI_FLAG_FW_INITED;
1997 }
1998 
1999 static int
2000 iwi_reset(struct iwi_softc *sc)
2001 {
2002 	int i, ntries;
2003 
2004 	iwi_stop_master(sc);
2005 
2006 	/* Move adapter to D0 state */
2007 	CSR_WRITE_4(sc, IWI_CSR_CTL, CSR_READ_4(sc, IWI_CSR_CTL) |
2008 	    IWI_CTL_INIT);
2009 
2010 	/* Initialize Phase-Locked Level  (PLL) */
2011 	CSR_WRITE_4(sc, IWI_CSR_READ_INT, IWI_READ_INT_INIT_HOST);
2012 
2013 	/* Wait for clock stabilization */
2014 	for (ntries = 0; ntries < 1000; ntries++) {
2015 		if (CSR_READ_4(sc, IWI_CSR_CTL) & IWI_CTL_CLOCK_READY)
2016 			break;
2017 		DELAY(200);
2018 	}
2019 	if (ntries == 1000) {
2020 		aprint_error("%s: timeout waiting for clock stabilization\n",
2021 		    sc->sc_dev.dv_xname);
2022 		return EIO;
2023 	}
2024 
2025 	CSR_WRITE_4(sc, IWI_CSR_RST, CSR_READ_4(sc, IWI_CSR_RST) |
2026 	    IWI_RST_SW_RESET);
2027 
2028 	DELAY(10);
2029 
2030 	CSR_WRITE_4(sc, IWI_CSR_CTL, CSR_READ_4(sc, IWI_CSR_CTL) |
2031 	    IWI_CTL_INIT);
2032 
2033 	/* Clear NIC memory */
2034 	CSR_WRITE_4(sc, IWI_CSR_AUTOINC_ADDR, 0);
2035 	for (i = 0; i < 0xc000; i++)
2036 		CSR_WRITE_4(sc, IWI_CSR_AUTOINC_DATA, 0);
2037 
2038 	return 0;
2039 }
2040 
2041 static int
2042 iwi_load_ucode(struct iwi_softc *sc, void *uc, int size)
2043 {
2044 	uint16_t *w;
2045 	int ntries, i;
2046 
2047 	CSR_WRITE_4(sc, IWI_CSR_RST, CSR_READ_4(sc, IWI_CSR_RST) |
2048 	    IWI_RST_STOP_MASTER);
2049 	for (ntries = 0; ntries < 5; ntries++) {
2050 		if (CSR_READ_4(sc, IWI_CSR_RST) & IWI_RST_MASTER_DISABLED)
2051 			break;
2052 		DELAY(10);
2053 	}
2054 	if (ntries == 5) {
2055 		aprint_error("%s: timeout waiting for master\n",
2056 		    sc->sc_dev.dv_xname);
2057 		return EIO;
2058 	}
2059 
2060 	MEM_WRITE_4(sc, 0x3000e0, 0x80000000);
2061 	DELAY(5000);
2062 	CSR_WRITE_4(sc, IWI_CSR_RST, CSR_READ_4(sc, IWI_CSR_RST) &
2063 	    ~IWI_RST_PRINCETON_RESET);
2064 	DELAY(5000);
2065 	MEM_WRITE_4(sc, 0x3000e0, 0);
2066 	DELAY(1000);
2067 	MEM_WRITE_4(sc, 0x300004, 1);
2068 	DELAY(1000);
2069 	MEM_WRITE_4(sc, 0x300004, 0);
2070 	DELAY(1000);
2071 	MEM_WRITE_1(sc, 0x200000, 0x00);
2072 	MEM_WRITE_1(sc, 0x200000, 0x40);
2073 	DELAY(1000);
2074 
2075 	/* Adapter is buggy, we must set the address for each word */
2076 	for (w = uc; size > 0; w++, size -= 2)
2077 		MEM_WRITE_2(sc, 0x200010, htole16(*w));
2078 
2079 	MEM_WRITE_1(sc, 0x200000, 0x00);
2080 	MEM_WRITE_1(sc, 0x200000, 0x80);
2081 
2082 	/* Wait until we get a response in the uc queue */
2083 	for (ntries = 0; ntries < 100; ntries++) {
2084 		if (MEM_READ_1(sc, 0x200000) & 1)
2085 			break;
2086 		DELAY(100);
2087 	}
2088 	if (ntries == 100) {
2089 		aprint_error("%s: timeout waiting for ucode to initialize\n",
2090 		    sc->sc_dev.dv_xname);
2091 		return EIO;
2092 	}
2093 
2094 	/* Empty the uc queue or the firmware will not initialize properly */
2095 	for (i = 0; i < 7; i++)
2096 		MEM_READ_4(sc, 0x200004);
2097 
2098 	MEM_WRITE_1(sc, 0x200000, 0x00);
2099 
2100 	return 0;
2101 }
2102 
2103 /* macro to handle unaligned little endian data in firmware image */
2104 #define GETLE32(p) ((p)[0] | (p)[1] << 8 | (p)[2] << 16 | (p)[3] << 24)
2105 static int
2106 iwi_load_firmware(struct iwi_softc *sc, void *fw, int size)
2107 {
2108 	bus_dmamap_t map;
2109 	u_char *p, *end;
2110 	uint32_t sentinel, ctl, sum;
2111 	uint32_t cs, sl, cd, cl;
2112 	int ntries, nsegs, error;
2113 	int sn;
2114 
2115 	nsegs = (size + PAGE_SIZE - 1) / PAGE_SIZE;
2116 
2117 	/* Create a DMA map for the firmware image */
2118 	error = bus_dmamap_create(sc->sc_dmat, size, nsegs, size, 0,
2119 	    BUS_DMA_NOWAIT, &map);
2120 	if (error != 0) {
2121 		aprint_error("%s: could not create firmware DMA map\n",
2122 		    sc->sc_dev.dv_xname);
2123 		goto fail1;
2124 	}
2125 
2126 	error = bus_dmamap_load(sc->sc_dmat, map, fw, size, NULL,
2127 	    BUS_DMA_NOWAIT | BUS_DMA_WRITE);
2128 	if (error != 0) {
2129 		aprint_error("%s: could not load fw dma map(%d)\n",
2130 		    sc->sc_dev.dv_xname, error);
2131 		goto fail2;
2132 	}
2133 
2134 	/* Make sure the adapter will get up-to-date values */
2135 	bus_dmamap_sync(sc->sc_dmat, map, 0, size, BUS_DMASYNC_PREWRITE);
2136 
2137 	/* Tell the adapter where the command blocks are stored */
2138 	MEM_WRITE_4(sc, 0x3000a0, 0x27000);
2139 
2140 	/*
2141 	 * Store command blocks into adapter's internal memory using register
2142 	 * indirections. The adapter will read the firmware image through DMA
2143 	 * using information stored in command blocks.
2144 	 */
2145 	p = fw;
2146 	end = p + size;
2147 	CSR_WRITE_4(sc, IWI_CSR_AUTOINC_ADDR, 0x27000);
2148 
2149 	sn = 0;
2150 	sl = cl = 0;
2151 	cs = cd = 0;
2152 	while (p < end) {
2153 		if (sl == 0) {
2154 			cs = map->dm_segs[sn].ds_addr;
2155 			sl = map->dm_segs[sn].ds_len;
2156 			sn++;
2157 		}
2158 		if (cl == 0) {
2159 			cd = GETLE32(p); p += 4; cs += 4; sl -= 4;
2160 			cl = GETLE32(p); p += 4; cs += 4; sl -= 4;
2161 		}
2162 		while (sl > 0 && cl > 0) {
2163 			int len = min(cl, sl);
2164 
2165 			sl -= len;
2166 			cl -= len;
2167 			p += len;
2168 
2169 			while (len > 0) {
2170 				int mlen = min(len, IWI_CB_MAXDATALEN);
2171 
2172 				ctl = IWI_CB_DEFAULT_CTL | mlen;
2173 				sum = ctl ^ cs ^ cd;
2174 
2175 				/* Write a command block */
2176 				CSR_WRITE_4(sc, IWI_CSR_AUTOINC_DATA, ctl);
2177 				CSR_WRITE_4(sc, IWI_CSR_AUTOINC_DATA, cs);
2178 				CSR_WRITE_4(sc, IWI_CSR_AUTOINC_DATA, cd);
2179 				CSR_WRITE_4(sc, IWI_CSR_AUTOINC_DATA, sum);
2180 
2181 				cs += mlen;
2182 				cd += mlen;
2183 				len -= mlen;
2184 			}
2185 		}
2186 	}
2187 
2188 	/* Write a fictive final command block (sentinel) */
2189 	sentinel = CSR_READ_4(sc, IWI_CSR_AUTOINC_ADDR);
2190 	CSR_WRITE_4(sc, IWI_CSR_AUTOINC_DATA, 0);
2191 
2192 	CSR_WRITE_4(sc, IWI_CSR_RST, CSR_READ_4(sc, IWI_CSR_RST) &
2193 	    ~(IWI_RST_MASTER_DISABLED | IWI_RST_STOP_MASTER));
2194 
2195 	/* Tell the adapter to start processing command blocks */
2196 	MEM_WRITE_4(sc, 0x3000a4, 0x540100);
2197 
2198 	/* Wait until the adapter has processed all command blocks */
2199 	for (ntries = 0; ntries < 400; ntries++) {
2200 		if (MEM_READ_4(sc, 0x3000d0) >= sentinel)
2201 			break;
2202 		DELAY(100);
2203 	}
2204 	if (ntries == 400) {
2205 		aprint_error("%s: timeout processing cb\n",
2206 		    sc->sc_dev.dv_xname);
2207 		error = EIO;
2208 		goto fail3;
2209 	}
2210 
2211 	/* We're done with command blocks processing */
2212 	MEM_WRITE_4(sc, 0x3000a4, 0x540c00);
2213 
2214 	/* Allow interrupts so we know when the firmware is inited */
2215 	CSR_WRITE_4(sc, IWI_CSR_INTR_MASK, IWI_INTR_MASK);
2216 
2217 	/* Tell the adapter to initialize the firmware */
2218 	CSR_WRITE_4(sc, IWI_CSR_RST, 0);
2219 	CSR_WRITE_4(sc, IWI_CSR_CTL, CSR_READ_4(sc, IWI_CSR_CTL) |
2220 	    IWI_CTL_ALLOW_STANDBY);
2221 
2222 	/* Wait at most one second for firmware initialization to complete */
2223 	if ((error = tsleep(sc, 0, "iwiinit", hz)) != 0) {
2224 		aprint_error("%s: timeout waiting for firmware initialization "
2225 		    "to complete\n", sc->sc_dev.dv_xname);
2226 		goto fail3;
2227 	}
2228 
2229 fail3:
2230 	bus_dmamap_sync(sc->sc_dmat, map, 0, size, BUS_DMASYNC_POSTWRITE);
2231 	bus_dmamap_unload(sc->sc_dmat, map);
2232 fail2:
2233 	bus_dmamap_destroy(sc->sc_dmat, map);
2234 
2235 fail1:
2236 	return error;
2237 }
2238 
2239 /*
2240  * Store firmware into kernel memory so we can download it when we need to,
2241  * e.g when the adapter wakes up from suspend mode.
2242  */
2243 static int
2244 iwi_cache_firmware(struct iwi_softc *sc, void *data)
2245 {
2246 	struct iwi_firmware *kfw = &sc->fw;
2247 	struct iwi_firmware ufw;
2248 	int error;
2249 
2250 	iwi_free_firmware(sc);
2251 
2252 	if ((error = copyin(data, &ufw, sizeof ufw)) != 0)
2253 		goto fail1;
2254 
2255 	kfw->boot_size  = ufw.boot_size;
2256 	kfw->ucode_size = ufw.ucode_size;
2257 	kfw->main_size  = ufw.main_size;
2258 
2259 	kfw->boot = malloc(kfw->boot_size, M_DEVBUF, M_NOWAIT);
2260 	if (kfw->boot == NULL) {
2261 		error = ENOMEM;
2262 		goto fail1;
2263 	}
2264 
2265 	kfw->ucode = malloc(kfw->ucode_size, M_DEVBUF, M_NOWAIT);
2266 	if (kfw->ucode == NULL) {
2267 		error = ENOMEM;
2268 		goto fail2;
2269 	}
2270 
2271 	kfw->main = malloc(kfw->main_size, M_DEVBUF, M_NOWAIT);
2272 	if (kfw->main == NULL) {
2273 		error = ENOMEM;
2274 		goto fail3;
2275 	}
2276 
2277 	if ((error = copyin(ufw.boot, kfw->boot, kfw->boot_size)) != 0)
2278 		goto fail4;
2279 
2280 	if ((error = copyin(ufw.ucode, kfw->ucode, kfw->ucode_size)) != 0)
2281 		goto fail4;
2282 
2283 	if ((error = copyin(ufw.main, kfw->main, kfw->main_size)) != 0)
2284 		goto fail4;
2285 
2286 	DPRINTF(("Firmware cached: boot %u, ucode %u, main %u\n",
2287 	    kfw->boot_size, kfw->ucode_size, kfw->main_size));
2288 
2289 	sc->flags |= IWI_FLAG_FW_CACHED;
2290 
2291 	return 0;
2292 
2293 fail4:	free(kfw->boot, M_DEVBUF);
2294 fail3:	free(kfw->ucode, M_DEVBUF);
2295 fail2:	free(kfw->main, M_DEVBUF);
2296 fail1:
2297 	return error;
2298 }
2299 
2300 static void
2301 iwi_free_firmware(struct iwi_softc *sc)
2302 {
2303 	if (!(sc->flags & IWI_FLAG_FW_CACHED))
2304 		return;
2305 
2306 	free(sc->fw.boot, M_DEVBUF);
2307 	free(sc->fw.ucode, M_DEVBUF);
2308 	free(sc->fw.main, M_DEVBUF);
2309 
2310 	sc->flags &= ~IWI_FLAG_FW_CACHED;
2311 }
2312 
2313 static int
2314 iwi_config(struct iwi_softc *sc)
2315 {
2316 	struct ieee80211com *ic = &sc->sc_ic;
2317 	struct ifnet *ifp = &sc->sc_if;
2318 	struct iwi_configuration config;
2319 	struct iwi_rateset rs;
2320 	struct iwi_txpower power;
2321 	struct ieee80211_key *wk;
2322 	struct iwi_wep_key wepkey;
2323 	uint32_t data;
2324 	int error, i;
2325 
2326 	IEEE80211_ADDR_COPY(ic->ic_myaddr, LLADDR(ifp->if_sadl));
2327 	DPRINTF(("Setting MAC address to %s\n", ether_sprintf(ic->ic_myaddr)));
2328 	error = iwi_cmd(sc, IWI_CMD_SET_MAC_ADDRESS, ic->ic_myaddr,
2329 	    IEEE80211_ADDR_LEN, 0);
2330 	if (error != 0)
2331 		return error;
2332 
2333 	memset(&config, 0, sizeof config);
2334 	config.bluetooth_coexistence = sc->bluetooth;
2335 	config.antenna = sc->antenna;
2336 	config.multicast_enabled = 1;
2337 	config.answer_pbreq = (ic->ic_opmode == IEEE80211_M_IBSS) ? 1 : 0;
2338 	config.disable_unicast_decryption = 1;
2339 	config.disable_multicast_decryption = 1;
2340 	DPRINTF(("Configuring adapter\n"));
2341 	error = iwi_cmd(sc, IWI_CMD_SET_CONFIGURATION, &config, sizeof config,
2342 	    0);
2343 	if (error != 0)
2344 		return error;
2345 
2346 	data = htole32(IWI_POWER_MODE_CAM);
2347 	DPRINTF(("Setting power mode to %u\n", le32toh(data)));
2348 	error = iwi_cmd(sc, IWI_CMD_SET_POWER_MODE, &data, sizeof data, 0);
2349 	if (error != 0)
2350 		return error;
2351 
2352 	data = htole32(ic->ic_rtsthreshold);
2353 	DPRINTF(("Setting RTS threshold to %u\n", le32toh(data)));
2354 	error = iwi_cmd(sc, IWI_CMD_SET_RTS_THRESHOLD, &data, sizeof data, 0);
2355 	if (error != 0)
2356 		return error;
2357 
2358 	data = htole32(ic->ic_fragthreshold);
2359 	DPRINTF(("Setting fragmentation threshold to %u\n", le32toh(data)));
2360 	error = iwi_cmd(sc, IWI_CMD_SET_FRAG_THRESHOLD, &data, sizeof data, 0);
2361 	if (error != 0)
2362 		return error;
2363 
2364 	if (ic->ic_opmode == IEEE80211_M_IBSS) {
2365 		power.mode = IWI_MODE_11B;
2366 		power.nchan = 11;
2367 		for (i = 0; i < 11; i++) {
2368 			power.chan[i].chan = i + 1;
2369 			power.chan[i].power = IWI_TXPOWER_MAX;
2370 		}
2371 		DPRINTF(("Setting .11b channels tx power\n"));
2372 		error = iwi_cmd(sc, IWI_CMD_SET_TX_POWER, &power, sizeof power,
2373 		    0);
2374 		if (error != 0)
2375 			return error;
2376 
2377 		power.mode = IWI_MODE_11G;
2378 		DPRINTF(("Setting .11g channels tx power\n"));
2379 		error = iwi_cmd(sc, IWI_CMD_SET_TX_POWER, &power, sizeof power,
2380 		    0);
2381 		if (error != 0)
2382 			return error;
2383 	}
2384 
2385 	rs.mode = IWI_MODE_11G;
2386 	rs.type = IWI_RATESET_TYPE_SUPPORTED;
2387 	rs.nrates = ic->ic_sup_rates[IEEE80211_MODE_11G].rs_nrates;
2388 	memcpy(rs.rates, ic->ic_sup_rates[IEEE80211_MODE_11G].rs_rates,
2389 	    rs.nrates);
2390 	DPRINTF(("Setting .11bg supported rates (%u)\n", rs.nrates));
2391 	error = iwi_cmd(sc, IWI_CMD_SET_RATES, &rs, sizeof rs, 0);
2392 	if (error != 0)
2393 		return error;
2394 
2395 	rs.mode = IWI_MODE_11A;
2396 	rs.type = IWI_RATESET_TYPE_SUPPORTED;
2397 	rs.nrates = ic->ic_sup_rates[IEEE80211_MODE_11A].rs_nrates;
2398 	memcpy(rs.rates, ic->ic_sup_rates[IEEE80211_MODE_11A].rs_rates,
2399 	    rs.nrates);
2400 	DPRINTF(("Setting .11a supported rates (%u)\n", rs.nrates));
2401 	error = iwi_cmd(sc, IWI_CMD_SET_RATES, &rs, sizeof rs, 0);
2402 	if (error != 0)
2403 		return error;
2404 
2405 	/* if we have a desired ESSID, set it now */
2406 	if (ic->ic_des_esslen != 0) {
2407 #ifdef IWI_DEBUG
2408 		if (iwi_debug > 0) {
2409 			printf("Setting desired ESSID to ");
2410 			ieee80211_print_essid(ic->ic_des_essid,
2411 			    ic->ic_des_esslen);
2412 			printf("\n");
2413 		}
2414 #endif
2415 		error = iwi_cmd(sc, IWI_CMD_SET_ESSID, ic->ic_des_essid,
2416 		    ic->ic_des_esslen, 0);
2417 		if (error != 0)
2418 			return error;
2419 	}
2420 
2421 	data = htole32(arc4random());
2422 	DPRINTF(("Setting initialization vector to %u\n", le32toh(data)));
2423 	error = iwi_cmd(sc, IWI_CMD_SET_IV, &data, sizeof data, 0);
2424 	if (error != 0)
2425 		return error;
2426 
2427 	for (i = 0; i < IEEE80211_WEP_NKID; i++) {
2428 		wk = &ic->ic_crypto.cs_nw_keys[i];
2429 
2430 		wepkey.cmd = IWI_WEP_KEY_CMD_SETKEY;
2431 		wepkey.idx = i;
2432 		wepkey.len = wk->wk_keylen;
2433 		memset(wepkey.key, 0, sizeof wepkey.key);
2434 		memcpy(wepkey.key, wk->wk_key, wk->wk_keylen);
2435 		DPRINTF(("Setting wep key index %u len %u\n",
2436 		    wepkey.idx, wepkey.len));
2437 		error = iwi_cmd(sc, IWI_CMD_SET_WEP_KEY, &wepkey,
2438 		    sizeof wepkey, 0);
2439 		if (error != 0)
2440 			return error;
2441 	}
2442 
2443 	/* Enable adapter */
2444 	DPRINTF(("Enabling adapter\n"));
2445 	return iwi_cmd(sc, IWI_CMD_ENABLE, NULL, 0, 0);
2446 }
2447 
2448 static int
2449 iwi_set_chan(struct iwi_softc *sc, struct ieee80211_channel *chan)
2450 {
2451 	struct ieee80211com *ic = &sc->sc_ic;
2452 	struct iwi_scan_v2 scan;
2453 
2454 	(void)memset(&scan, 0, sizeof scan);
2455 
2456 	scan.dwelltime[IWI_SCAN_TYPE_PASSIVE] = htole16(2000);
2457 	scan.channels[0] = 1 |
2458 	    (IEEE80211_IS_CHAN_5GHZ(chan) ? IWI_CHAN_5GHZ : IWI_CHAN_2GHZ);
2459 	scan.channels[1] = ieee80211_chan2ieee(ic, chan);
2460 	iwi_scan_type_set(scan, 1, IWI_SCAN_TYPE_PASSIVE);
2461 
2462 	DPRINTF(("Setting channel to %u\n", ieee80211_chan2ieee(ic, chan)));
2463 	return iwi_cmd(sc, IWI_CMD_SCAN_V2, &scan, sizeof scan, 1);
2464 }
2465 
2466 static int
2467 iwi_scan(struct iwi_softc *sc)
2468 {
2469 	struct ieee80211com *ic = &sc->sc_ic;
2470 	struct iwi_scan_v2 scan;
2471 	uint32_t type;
2472 	uint8_t *p;
2473 	int i, count, idx;
2474 
2475 	(void)memset(&scan, 0, sizeof scan);
2476 	scan.dwelltime[IWI_SCAN_TYPE_ACTIVE_BROADCAST] =
2477 	    htole16(sc->dwelltime);
2478 	scan.dwelltime[IWI_SCAN_TYPE_ACTIVE_BDIRECT] =
2479 	    htole16(sc->dwelltime);
2480 
2481 	/* tell the firmware about the desired essid */
2482 	if (ic->ic_des_esslen) {
2483 		int error;
2484 
2485 		DPRINTF(("%s: Setting adapter desired ESSID to %s\n",
2486 		    __func__, ic->ic_des_essid));
2487 
2488 		error = iwi_cmd(sc, IWI_CMD_SET_ESSID,
2489 		    ic->ic_des_essid, ic->ic_des_esslen, 1);
2490 		if (error)
2491 			return error;
2492 
2493 		type = IWI_SCAN_TYPE_ACTIVE_BDIRECT;
2494 	} else {
2495 		type = IWI_SCAN_TYPE_ACTIVE_BROADCAST;
2496 	}
2497 
2498 	p = &scan.channels[0];
2499 	count = idx = 0;
2500 	for (i = 0; i <= IEEE80211_CHAN_MAX; i++) {
2501 		if (IEEE80211_IS_CHAN_5GHZ(&ic->ic_channels[i]) &&
2502 		    isset(ic->ic_chan_active, i)) {
2503 			*++p = i;
2504 			count++;
2505 			idx++;
2506  			iwi_scan_type_set(scan, idx, type);
2507 		}
2508 	}
2509 	if (count) {
2510 		*(p - count) = IWI_CHAN_5GHZ | count;
2511 		p++;
2512 	}
2513 
2514 	count = 0;
2515 	for (i = 0; i <= IEEE80211_CHAN_MAX; i++) {
2516 		if (IEEE80211_IS_CHAN_2GHZ(&ic->ic_channels[i]) &&
2517 		    isset(ic->ic_chan_active, i)) {
2518 			*++p = i;
2519 			count++;
2520 			idx++;
2521 			iwi_scan_type_set(scan, idx, type);
2522 		}
2523 	}
2524 	*(p - count) = IWI_CHAN_2GHZ | count;
2525 
2526 	DPRINTF(("Start scanning\n"));
2527 	return iwi_cmd(sc, IWI_CMD_SCAN_V2, &scan, sizeof scan, 1);
2528 }
2529 
2530 static int
2531 iwi_auth_and_assoc(struct iwi_softc *sc)
2532 {
2533 	struct ieee80211com *ic = &sc->sc_ic;
2534 	struct ieee80211_node *ni = ic->ic_bss;
2535 	struct ifnet *ifp = &sc->sc_if;
2536 	struct ieee80211_wme_info wme;
2537 	struct iwi_configuration config;
2538 	struct iwi_associate assoc;
2539 	struct iwi_rateset rs;
2540 	uint16_t capinfo;
2541 	uint32_t data;
2542 	int error;
2543 
2544 	if (IEEE80211_IS_CHAN_2GHZ(ni->ni_chan)) {
2545 		memset(&config, 0, sizeof config);
2546 		config.bluetooth_coexistence = sc->bluetooth;
2547 		config.antenna = sc->antenna;
2548 		config.multicast_enabled = 1;
2549 		config.use_protection = 1;
2550 		config.answer_pbreq =
2551 		    (ic->ic_opmode == IEEE80211_M_IBSS) ? 1 : 0;
2552 		config.disable_unicast_decryption = 1;
2553 		config.disable_multicast_decryption = 1;
2554 		DPRINTF(("Configuring adapter\n"));
2555 		error = iwi_cmd(sc, IWI_CMD_SET_CONFIGURATION, &config,
2556 		    sizeof config, 1);
2557 		if (error != 0)
2558 			return error;
2559 	}
2560 
2561 #ifdef IWI_DEBUG
2562 	if (iwi_debug > 0) {
2563 		printf("Setting ESSID to ");
2564 		ieee80211_print_essid(ni->ni_essid, ni->ni_esslen);
2565 		printf("\n");
2566 	}
2567 #endif
2568 	error = iwi_cmd(sc, IWI_CMD_SET_ESSID, ni->ni_essid, ni->ni_esslen, 1);
2569 	if (error != 0)
2570 		return error;
2571 
2572 	/* the rate set has already been "negotiated" */
2573 	rs.mode = IEEE80211_IS_CHAN_5GHZ(ni->ni_chan) ? IWI_MODE_11A :
2574 	    IWI_MODE_11G;
2575 	rs.type = IWI_RATESET_TYPE_NEGOTIATED;
2576 	rs.nrates = ni->ni_rates.rs_nrates;
2577 	memcpy(rs.rates, ni->ni_rates.rs_rates, rs.nrates);
2578 	DPRINTF(("Setting negotiated rates (%u)\n", rs.nrates));
2579 	error = iwi_cmd(sc, IWI_CMD_SET_RATES, &rs, sizeof rs, 1);
2580 	if (error != 0)
2581 		return error;
2582 
2583 	if ((ic->ic_flags & IEEE80211_F_WME) && ni->ni_wme_ie != NULL) {
2584 		wme.wme_id = IEEE80211_ELEMID_VENDOR;
2585 		wme.wme_len = sizeof (struct ieee80211_wme_info) - 2;
2586 		wme.wme_oui[0] = 0x00;
2587 		wme.wme_oui[1] = 0x50;
2588 		wme.wme_oui[2] = 0xf2;
2589 		wme.wme_type = WME_OUI_TYPE;
2590 		wme.wme_subtype = WME_INFO_OUI_SUBTYPE;
2591 		wme.wme_version = WME_VERSION;
2592 		wme.wme_info = 0;
2593 
2594 		DPRINTF(("Setting WME IE (len=%u)\n", wme.wme_len));
2595 		error = iwi_cmd(sc, IWI_CMD_SET_WMEIE, &wme, sizeof wme, 1);
2596 		if (error != 0)
2597 			return error;
2598 	}
2599 
2600 	if (ic->ic_opt_ie != NULL) {
2601 		DPRINTF(("Setting optional IE (len=%u)\n", ic->ic_opt_ie_len));
2602 		error = iwi_cmd(sc, IWI_CMD_SET_OPTIE, ic->ic_opt_ie,
2603 		    ic->ic_opt_ie_len, 1);
2604 		if (error != 0)
2605 			return error;
2606 	}
2607 	data = htole32(ni->ni_rssi);
2608 	DPRINTF(("Setting sensitivity to %d\n", (int8_t)ni->ni_rssi));
2609 	error = iwi_cmd(sc, IWI_CMD_SET_SENSITIVITY, &data, sizeof data, 1);
2610 	if (error != 0)
2611 		return error;
2612 
2613 	memset(&assoc, 0, sizeof assoc);
2614 	assoc.mode = IEEE80211_IS_CHAN_5GHZ(ni->ni_chan) ? IWI_MODE_11A :
2615 	    IWI_MODE_11G;
2616 	assoc.chan = ieee80211_chan2ieee(ic, ni->ni_chan);
2617 	if (ni->ni_authmode == IEEE80211_AUTH_SHARED)
2618 		assoc.auth = (ic->ic_crypto.cs_def_txkey << 4) | IWI_AUTH_SHARED;
2619 	if ((ic->ic_flags & IEEE80211_F_WME) && ni->ni_wme_ie != NULL)
2620 		assoc.policy |= htole16(IWI_POLICY_WME);
2621 	if (ic->ic_flags & IEEE80211_F_WPA)
2622 		assoc.policy |= htole16(IWI_POLICY_WPA);
2623 	memcpy(assoc.tstamp, ni->ni_tstamp.data, 8);
2624 
2625 	if (ic->ic_opmode == IEEE80211_M_IBSS)
2626 		capinfo = IEEE80211_CAPINFO_IBSS;
2627 	else
2628 		capinfo = IEEE80211_CAPINFO_ESS;
2629 	if (ic->ic_flags & IEEE80211_F_PRIVACY)
2630 		capinfo |= IEEE80211_CAPINFO_PRIVACY;
2631 	if ((ic->ic_flags & IEEE80211_F_SHPREAMBLE) &&
2632 	    IEEE80211_IS_CHAN_2GHZ(ni->ni_chan))
2633 		capinfo |= IEEE80211_CAPINFO_SHORT_PREAMBLE;
2634 	if (ic->ic_flags & IEEE80211_F_SHSLOT)
2635 		capinfo |= IEEE80211_CAPINFO_SHORT_SLOTTIME;
2636 	assoc.capinfo = htole16(capinfo);
2637 
2638 	assoc.lintval = htole16(ic->ic_lintval);
2639 	assoc.intval = htole16(ni->ni_intval);
2640 	IEEE80211_ADDR_COPY(assoc.bssid, ni->ni_bssid);
2641 	if (ic->ic_opmode == IEEE80211_M_IBSS)
2642 		IEEE80211_ADDR_COPY(assoc.dst, ifp->if_broadcastaddr);
2643 	else
2644 		IEEE80211_ADDR_COPY(assoc.dst, ni->ni_bssid);
2645 	DPRINTF(("Trying to associate to %s channel %u auth %u\n",
2646 	    ether_sprintf(assoc.bssid), assoc.chan, assoc.auth));
2647 	return iwi_cmd(sc, IWI_CMD_ASSOCIATE, &assoc, sizeof assoc, 1);
2648 }
2649 
2650 static int
2651 iwi_init(struct ifnet *ifp)
2652 {
2653 	struct iwi_softc *sc = ifp->if_softc;
2654 	struct ieee80211com *ic = &sc->sc_ic;
2655 	struct iwi_firmware *fw = &sc->fw;
2656 	int i, error;
2657 
2658 	/* exit immediately if firmware has not been ioctl'd */
2659 	if (!(sc->flags & IWI_FLAG_FW_CACHED)) {
2660 		if (!(sc->flags & IWI_FLAG_FW_WARNED))
2661 			aprint_error("%s: Firmware not loaded\n",
2662 			    sc->sc_dev.dv_xname);
2663 		sc->flags |= IWI_FLAG_FW_WARNED;
2664 		ifp->if_flags &= ~IFF_UP;
2665 		return EIO;
2666 	}
2667 
2668 	iwi_stop(ifp, 0);
2669 
2670 	if ((error = iwi_reset(sc)) != 0) {
2671 		aprint_error("%s: could not reset adapter\n",
2672 		    sc->sc_dev.dv_xname);
2673 		goto fail;
2674 	}
2675 
2676 	if ((error = iwi_load_firmware(sc, fw->boot, fw->boot_size)) != 0) {
2677 		aprint_error("%s: could not load boot firmware\n",
2678 		    sc->sc_dev.dv_xname);
2679 		goto fail;
2680 	}
2681 
2682 	if ((error = iwi_load_ucode(sc, fw->ucode, fw->ucode_size)) != 0) {
2683 		aprint_error("%s: could not load microcode\n",
2684 		    sc->sc_dev.dv_xname);
2685 		goto fail;
2686 	}
2687 
2688 	iwi_stop_master(sc);
2689 
2690 	CSR_WRITE_4(sc, IWI_CSR_CMD_BASE, sc->cmdq.desc_map->dm_segs[0].ds_addr);
2691 	CSR_WRITE_4(sc, IWI_CSR_CMD_SIZE, sc->cmdq.count);
2692 	CSR_WRITE_4(sc, IWI_CSR_CMD_WIDX, sc->cmdq.cur);
2693 
2694 	CSR_WRITE_4(sc, IWI_CSR_TX1_BASE, sc->txq[0].desc_map->dm_segs[0].ds_addr);
2695 	CSR_WRITE_4(sc, IWI_CSR_TX1_SIZE, sc->txq[0].count);
2696 	CSR_WRITE_4(sc, IWI_CSR_TX1_WIDX, sc->txq[0].cur);
2697 
2698 	CSR_WRITE_4(sc, IWI_CSR_TX2_BASE, sc->txq[1].desc_map->dm_segs[0].ds_addr);
2699 	CSR_WRITE_4(sc, IWI_CSR_TX2_SIZE, sc->txq[1].count);
2700 	CSR_WRITE_4(sc, IWI_CSR_TX2_WIDX, sc->txq[1].cur);
2701 
2702 	CSR_WRITE_4(sc, IWI_CSR_TX3_BASE, sc->txq[2].desc_map->dm_segs[0].ds_addr);
2703 	CSR_WRITE_4(sc, IWI_CSR_TX3_SIZE, sc->txq[2].count);
2704 	CSR_WRITE_4(sc, IWI_CSR_TX3_WIDX, sc->txq[2].cur);
2705 
2706 	CSR_WRITE_4(sc, IWI_CSR_TX4_BASE, sc->txq[3].desc_map->dm_segs[0].ds_addr);
2707 	CSR_WRITE_4(sc, IWI_CSR_TX4_SIZE, sc->txq[3].count);
2708 	CSR_WRITE_4(sc, IWI_CSR_TX4_WIDX, sc->txq[3].cur);
2709 
2710 	for (i = 0; i < sc->rxq.count; i++)
2711 		CSR_WRITE_4(sc, IWI_CSR_RX_BASE + i * 4,
2712 		    sc->rxq.data[i].map->dm_segs[0].ds_addr);
2713 
2714 	CSR_WRITE_4(sc, IWI_CSR_RX_WIDX, sc->rxq.count -1);
2715 
2716 	if ((error = iwi_load_firmware(sc, fw->main, fw->main_size)) != 0) {
2717 		aprint_error("%s: could not load main firmware\n",
2718 		    sc->sc_dev.dv_xname);
2719 		goto fail;
2720 	}
2721 
2722 	sc->flags |= IWI_FLAG_FW_INITED;
2723 
2724 	if ((error = iwi_config(sc)) != 0) {
2725 		aprint_error("%s: device configuration failed\n",
2726 		    sc->sc_dev.dv_xname);
2727 		goto fail;
2728 	}
2729 
2730 	ic->ic_state = IEEE80211_S_INIT;
2731 
2732 	ifp->if_flags &= ~IFF_OACTIVE;
2733 	ifp->if_flags |= IFF_RUNNING;
2734 
2735 	if (ic->ic_opmode != IEEE80211_M_MONITOR) {
2736 		if (ic->ic_roaming != IEEE80211_ROAMING_MANUAL)
2737 			ieee80211_new_state(ic, IEEE80211_S_SCAN, -1);
2738 	} else
2739 		ieee80211_new_state(ic, IEEE80211_S_RUN, -1);
2740 
2741 	return 0;
2742 
2743 fail:	ifp->if_flags &= ~IFF_UP;
2744 	iwi_stop(ifp, 0);
2745 
2746 	return error;
2747 }
2748 
2749 static void
2750 iwi_stop(struct ifnet *ifp, int disable)
2751 {
2752 	struct iwi_softc *sc = ifp->if_softc;
2753 	struct ieee80211com *ic = &sc->sc_ic;
2754 
2755 	IWI_LED_OFF(sc);
2756 
2757 	iwi_stop_master(sc);
2758 	CSR_WRITE_4(sc, IWI_CSR_RST, IWI_RST_SW_RESET);
2759 
2760 	/* reset rings */
2761 	iwi_reset_cmd_ring(sc, &sc->cmdq);
2762 	iwi_reset_tx_ring(sc, &sc->txq[0]);
2763 	iwi_reset_tx_ring(sc, &sc->txq[1]);
2764 	iwi_reset_tx_ring(sc, &sc->txq[2]);
2765 	iwi_reset_tx_ring(sc, &sc->txq[3]);
2766 	iwi_reset_rx_ring(sc, &sc->rxq);
2767 
2768 	ifp->if_timer = 0;
2769 	ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE);
2770 
2771 	ieee80211_new_state(ic, IEEE80211_S_INIT, -1);
2772 }
2773 
2774 static void
2775 iwi_led_set(struct iwi_softc *sc, uint32_t state, int toggle)
2776 {
2777 	uint32_t val;
2778 
2779 	val = MEM_READ_4(sc, IWI_MEM_EVENT_CTL);
2780 
2781 	switch (sc->nictype) {
2782 	case 1:
2783 		/* special NIC type: reversed leds */
2784 		if (state == IWI_LED_ACTIVITY) {
2785 			state &= ~IWI_LED_ACTIVITY;
2786 			state |= IWI_LED_ASSOCIATED;
2787 		} else if (state == IWI_LED_ASSOCIATED) {
2788 			state &= ~IWI_LED_ASSOCIATED;
2789 			state |= IWI_LED_ACTIVITY;
2790 		}
2791 		/* and ignore toggle effect */
2792 		val |= state;
2793 		break;
2794 	case 0:
2795 	case 2:
2796 	case 3:
2797 	case 4:
2798 		val = (toggle && (val & state)) ? val & ~state : val | state;
2799 		break;
2800 	default:
2801 		aprint_normal("%s: unknown NIC type %d\n",
2802 		    sc->sc_dev.dv_xname, sc->nictype);
2803 		return;
2804 		break;
2805 	}
2806 
2807 	MEM_WRITE_4(sc, IWI_MEM_EVENT_CTL, val);
2808 
2809 	return;
2810 }
2811 
2812 static void
2813 iwi_error_log(struct iwi_softc *sc)
2814 {
2815 	uint32_t b, n;
2816 	int i;
2817 
2818 	static const char *const msg[] = {
2819 		"no error",
2820 		"failed",
2821 		"memory range low",
2822 		"memory range high",
2823 		"bad parameter",
2824 		"checksum",
2825 		"NMI",
2826 		"bad database",
2827 		"allocation failed",
2828 		"DMA underrun",
2829 		"DMA status",
2830 		"DINO",
2831 		"EEPROM",
2832 		"device assert",
2833 		"fatal"
2834 	};
2835 
2836 	b = CSR_READ_4(sc, IWI_CSR_ERRORLOG);
2837 	n = MEM_READ_4(sc, b);
2838 
2839 	b += 4;
2840 
2841 	for (i = 0; i < n ; i++) {
2842 		struct iwi_error fw_error;
2843 
2844 		MEM_CPY(sc, &fw_error, b, sizeof(fw_error));
2845 
2846 		printf("%s: %s\n", sc->sc_dev.dv_xname,
2847 		    msg[fw_error.type]);
2848 
2849 		b += sizeof(fw_error);
2850 	}
2851 }
2852