xref: /netbsd-src/sys/dev/ic/atw.c (revision 23c8222edbfb0f0932d88a8351d3a0cf817dfb9e)
1 /*	$NetBSD: atw.c,v 1.80 2004/10/30 18:08:36 thorpej Exp $	*/
2 
3 /*-
4  * Copyright (c) 1998, 1999, 2000, 2002, 2003, 2004 The NetBSD Foundation, Inc.
5  * All rights reserved.
6  *
7  * This code is derived from software contributed to The NetBSD Foundation
8  * by David Young, by Jason R. Thorpe, and by Charles M. Hannum.
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  * 1. Redistributions of source code must retain the above copyright
14  *    notice, this list of conditions and the following disclaimer.
15  * 2. Redistributions in binary form must reproduce the above copyright
16  *    notice, this list of conditions and the following disclaimer in the
17  *    documentation and/or other materials provided with the distribution.
18  * 3. All advertising materials mentioning features or use of this software
19  *    must display the following acknowledgement:
20  *	This product includes software developed by the NetBSD
21  *	Foundation, Inc. and its contributors.
22  * 4. Neither the name of The NetBSD Foundation nor the names of its
23  *    contributors may be used to endorse or promote products derived
24  *    from this software without specific prior written permission.
25  *
26  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
27  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
28  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
29  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
30  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
31  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
32  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
33  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
34  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
35  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
36  * POSSIBILITY OF SUCH DAMAGE.
37  */
38 
39 /*
40  * Device driver for the ADMtek ADM8211 802.11 MAC/BBP.
41  */
42 
43 #include <sys/cdefs.h>
44 __KERNEL_RCSID(0, "$NetBSD: atw.c,v 1.80 2004/10/30 18:08:36 thorpej Exp $");
45 
46 #include "bpfilter.h"
47 
48 #include <sys/param.h>
49 #include <sys/systm.h>
50 #include <sys/callout.h>
51 #include <sys/mbuf.h>
52 #include <sys/malloc.h>
53 #include <sys/kernel.h>
54 #include <sys/socket.h>
55 #include <sys/ioctl.h>
56 #include <sys/errno.h>
57 #include <sys/device.h>
58 #include <sys/time.h>
59 
60 #include <machine/endian.h>
61 
62 #include <uvm/uvm_extern.h>
63 
64 #include <net/if.h>
65 #include <net/if_dl.h>
66 #include <net/if_media.h>
67 #include <net/if_ether.h>
68 
69 #include <net80211/ieee80211_var.h>
70 #include <net80211/ieee80211_compat.h>
71 #include <net80211/ieee80211_radiotap.h>
72 
73 #if NBPFILTER > 0
74 #include <net/bpf.h>
75 #endif
76 
77 #include <machine/bus.h>
78 #include <machine/intr.h>
79 
80 #include <dev/ic/atwreg.h>
81 #include <dev/ic/rf3000reg.h>
82 #include <dev/ic/si4136reg.h>
83 #include <dev/ic/atwvar.h>
84 #include <dev/ic/smc93cx6var.h>
85 
86 /* XXX TBD open questions
87  *
88  *
89  * When should I set DSSS PAD in reg 0x15 of RF3000? In 1-2Mbps
90  * modes only, or all modes (5.5-11 Mbps CCK modes, too?) Does the MAC
91  * handle this for me?
92  *
93  */
94 /* device attachment
95  *
96  *    print TOFS[012]
97  *
98  * device initialization
99  *
100  *    clear ATW_FRCTL_MAXPSP to disable max power saving
101  *    set ATW_TXBR_ALCUPDATE to enable ALC
102  *    set TOFS[012]? (hope not)
103  *    disable rx/tx
104  *    set ATW_PAR_SWR (software reset)
105  *    wait for ATW_PAR_SWR clear
106  *    disable interrupts
107  *    ack status register
108  *    enable interrupts
109  *
110  * rx/tx initialization
111  *
112  *    disable rx/tx w/ ATW_NAR_SR, ATW_NAR_ST
113  *    allocate and init descriptor rings
114  *    write ATW_PAR_DSL (descriptor skip length)
115  *    write descriptor base addrs: ATW_TDBD, ATW_TDBP, write ATW_RDB
116  *    write ATW_NAR_SQ for one/both transmit descriptor rings
117  *    write ATW_NAR_SQ for one/both transmit descriptor rings
118  *    enable rx/tx w/ ATW_NAR_SR, ATW_NAR_ST
119  *
120  * rx/tx end
121  *
122  *    stop DMA
123  *    disable rx/tx w/ ATW_NAR_SR, ATW_NAR_ST
124  *    flush tx w/ ATW_NAR_HF
125  *
126  * scan
127  *
128  *    initialize rx/tx
129  *
130  * BSS join: (re)association response
131  *
132  *    set ATW_FRCTL_AID
133  *
134  * optimizations ???
135  *
136  */
137 
138 #define ATW_REFSLAVE	/* slavishly do what the reference driver does */
139 
140 #define	VOODOO_DUR_11_ROUNDING		0x01 /* necessary */
141 #define	VOODOO_DUR_2_4_SPECIALCASE	0x02 /* NOT necessary */
142 int atw_voodoo = VOODOO_DUR_11_ROUNDING;
143 
144 int atw_pseudo_milli = 1;
145 int atw_magic_delay1 = 100 * 1000;
146 int atw_magic_delay2 = 100 * 1000;
147 /* more magic multi-millisecond delays (units: microseconds) */
148 int atw_nar_delay = 20 * 1000;
149 int atw_magic_delay4 = 10 * 1000;
150 int atw_rf_delay1 = 10 * 1000;
151 int atw_rf_delay2 = 5 * 1000;
152 int atw_plcphd_delay = 2 * 1000;
153 int atw_bbp_io_enable_delay = 20 * 1000;
154 int atw_bbp_io_disable_delay = 2 * 1000;
155 int atw_writewep_delay = 1000;
156 int atw_beacon_len_adjust = 4;
157 int atw_dwelltime = 200;
158 int atw_xindiv2 = 0;
159 
160 #ifdef ATW_DEBUG
161 int atw_debug = 0;
162 
163 #define ATW_DPRINTF(x)	if (atw_debug > 0) printf x
164 #define ATW_DPRINTF2(x)	if (atw_debug > 1) printf x
165 #define ATW_DPRINTF3(x)	if (atw_debug > 2) printf x
166 #define	DPRINTF(sc, x)	if ((sc)->sc_ic.ic_if.if_flags & IFF_DEBUG) printf x
167 #define	DPRINTF2(sc, x)	if ((sc)->sc_ic.ic_if.if_flags & IFF_DEBUG) ATW_DPRINTF2(x)
168 #define	DPRINTF3(sc, x)	if ((sc)->sc_ic.ic_if.if_flags & IFF_DEBUG) ATW_DPRINTF3(x)
169 
170 static void	atw_dump_pkt(struct ifnet *, struct mbuf *);
171 static void	atw_print_regs(struct atw_softc *, const char *);
172 
173 /* Note well: I never got atw_rf3000_read or atw_si4126_read to work. */
174 #	ifdef ATW_BBPDEBUG
175 static void	atw_rf3000_print(struct atw_softc *);
176 static int	atw_rf3000_read(struct atw_softc *sc, u_int, u_int *);
177 #	endif /* ATW_BBPDEBUG */
178 
179 #	ifdef ATW_SYNDEBUG
180 static void	atw_si4126_print(struct atw_softc *);
181 static int	atw_si4126_read(struct atw_softc *, u_int, u_int *);
182 #	endif /* ATW_SYNDEBUG */
183 
184 #else
185 #define ATW_DPRINTF(x)
186 #define ATW_DPRINTF2(x)
187 #define ATW_DPRINTF3(x)
188 #define	DPRINTF(sc, x)	/* nothing */
189 #define	DPRINTF2(sc, x)	/* nothing */
190 #define	DPRINTF3(sc, x)	/* nothing */
191 #endif
192 
193 /* ifnet methods */
194 int	atw_init(struct ifnet *);
195 int	atw_ioctl(struct ifnet *, u_long, caddr_t);
196 void	atw_start(struct ifnet *);
197 void	atw_stop(struct ifnet *, int);
198 void	atw_watchdog(struct ifnet *);
199 
200 /* Device attachment */
201 void	atw_attach(struct atw_softc *);
202 int	atw_detach(struct atw_softc *);
203 
204 /* Rx/Tx process */
205 int	atw_add_rxbuf(struct atw_softc *, int);
206 void	atw_idle(struct atw_softc *, u_int32_t);
207 void	atw_rxdrain(struct atw_softc *);
208 void	atw_txdrain(struct atw_softc *);
209 
210 /* Device (de)activation and power state */
211 void	atw_disable(struct atw_softc *);
212 int	atw_enable(struct atw_softc *);
213 void	atw_power(int, void *);
214 void	atw_reset(struct atw_softc *);
215 void	atw_shutdown(void *);
216 
217 /* Interrupt handlers */
218 void	atw_linkintr(struct atw_softc *, u_int32_t);
219 void	atw_rxintr(struct atw_softc *);
220 void	atw_txintr(struct atw_softc *);
221 
222 /* 802.11 state machine */
223 static int	atw_newstate(struct ieee80211com *, enum ieee80211_state, int);
224 static void	atw_next_scan(void *);
225 static void	atw_recv_mgmt(struct ieee80211com *, struct mbuf *,
226 		              struct ieee80211_node *, int, int, u_int32_t);
227 static int	atw_tune(struct atw_softc *);
228 
229 /* Device initialization */
230 static void	atw_bbp_io_init(struct atw_softc *);
231 static void	atw_cfp_init(struct atw_softc *);
232 static void	atw_cmdr_init(struct atw_softc *);
233 static void	atw_ifs_init(struct atw_softc *);
234 static void	atw_nar_init(struct atw_softc *);
235 static void	atw_response_times_init(struct atw_softc *);
236 static void	atw_rf_reset(struct atw_softc *);
237 static void	atw_test1_init(struct atw_softc *);
238 static void	atw_tofs0_init(struct atw_softc *);
239 static void	atw_tofs2_init(struct atw_softc *);
240 static void	atw_txlmt_init(struct atw_softc *);
241 static void	atw_wcsr_init(struct atw_softc *);
242 
243 /* RAM/ROM utilities */
244 static void	atw_clear_sram(struct atw_softc *);
245 static void	atw_write_sram(struct atw_softc *, u_int, u_int8_t *, u_int);
246 static int	atw_read_srom(struct atw_softc *);
247 
248 /* BSS setup */
249 static void	atw_predict_beacon(struct atw_softc *);
250 static void	atw_start_beacon(struct atw_softc *, int);
251 static void	atw_write_bssid(struct atw_softc *);
252 static void	atw_write_ssid(struct atw_softc *);
253 static void	atw_write_sup_rates(struct atw_softc *);
254 static void	atw_write_wep(struct atw_softc *);
255 
256 /* Media */
257 static int	atw_media_change(struct ifnet *);
258 static void	atw_media_status(struct ifnet *, struct ifmediareq *);
259 
260 static void	atw_filter_setup(struct atw_softc *);
261 
262 /* 802.11 utilities */
263 static void			atw_frame_setdurs(struct atw_softc *,
264 				                  struct atw_frame *, int, int);
265 static uint64_t			atw_get_tsft(struct atw_softc *);
266 static __inline uint32_t	atw_last_even_tsft(uint32_t, uint32_t,
267 				                   uint32_t);
268 static struct ieee80211_node	*atw_node_alloc(struct ieee80211com *);
269 static void			atw_node_free(struct ieee80211com *,
270 				              struct ieee80211_node *);
271 static void			atw_change_ibss(struct atw_softc *);
272 
273 /*
274  * Tuner/transceiver/modem
275  */
276 static void	atw_bbp_io_enable(struct atw_softc *, int);
277 
278 /* RFMD RF3000 Baseband Processor */
279 static int	atw_rf3000_init(struct atw_softc *);
280 static int	atw_rf3000_tune(struct atw_softc *, u_int);
281 static int	atw_rf3000_write(struct atw_softc *, u_int, u_int);
282 
283 /* Silicon Laboratories Si4126 RF/IF Synthesizer */
284 static void	atw_si4126_tune(struct atw_softc *, u_int);
285 static void	atw_si4126_write(struct atw_softc *, u_int, u_int);
286 
287 const struct atw_txthresh_tab atw_txthresh_tab_lo[] = ATW_TXTHRESH_TAB_LO_RATE;
288 const struct atw_txthresh_tab atw_txthresh_tab_hi[] = ATW_TXTHRESH_TAB_HI_RATE;
289 
290 const char *atw_tx_state[] = {
291 	"STOPPED",
292 	"RUNNING - read descriptor",
293 	"RUNNING - transmitting",
294 	"RUNNING - filling fifo",	/* XXX */
295 	"SUSPENDED",
296 	"RUNNING -- write descriptor",
297 	"RUNNING -- write last descriptor",
298 	"RUNNING - fifo full"
299 };
300 
301 const char *atw_rx_state[] = {
302 	"STOPPED",
303 	"RUNNING - read descriptor",
304 	"RUNNING - check this packet, pre-fetch next",
305 	"RUNNING - wait for reception",
306 	"SUSPENDED",
307 	"RUNNING - write descriptor",
308 	"RUNNING - flush fifo",
309 	"RUNNING - fifo drain"
310 };
311 
312 int
313 atw_activate(struct device *self, enum devact act)
314 {
315 	struct atw_softc *sc = (struct atw_softc *)self;
316 	int rv = 0, s;
317 
318 	s = splnet();
319 	switch (act) {
320 	case DVACT_ACTIVATE:
321 		rv = EOPNOTSUPP;
322 		break;
323 
324 	case DVACT_DEACTIVATE:
325 		if_deactivate(&sc->sc_ic.ic_if);
326 		break;
327 	}
328 	splx(s);
329 	return rv;
330 }
331 
332 /*
333  * atw_enable:
334  *
335  *	Enable the ADM8211 chip.
336  */
337 int
338 atw_enable(struct atw_softc *sc)
339 {
340 
341 	if (ATW_IS_ENABLED(sc) == 0) {
342 		if (sc->sc_enable != NULL && (*sc->sc_enable)(sc) != 0) {
343 			printf("%s: device enable failed\n",
344 			    sc->sc_dev.dv_xname);
345 			return (EIO);
346 		}
347 		sc->sc_flags |= ATWF_ENABLED;
348 	}
349 	return (0);
350 }
351 
352 /*
353  * atw_disable:
354  *
355  *	Disable the ADM8211 chip.
356  */
357 void
358 atw_disable(struct atw_softc *sc)
359 {
360 	if (!ATW_IS_ENABLED(sc))
361 		return;
362 	if (sc->sc_disable != NULL)
363 		(*sc->sc_disable)(sc);
364 	sc->sc_flags &= ~ATWF_ENABLED;
365 }
366 
367 /* Returns -1 on failure. */
368 static int
369 atw_read_srom(struct atw_softc *sc)
370 {
371 	struct seeprom_descriptor sd;
372 	uint32_t test0, fail_bits;
373 
374 	(void)memset(&sd, 0, sizeof(sd));
375 
376 	test0 = ATW_READ(sc, ATW_TEST0);
377 
378 	switch (sc->sc_rev) {
379 	case ATW_REVISION_BA:
380 	case ATW_REVISION_CA:
381 		fail_bits = ATW_TEST0_EPNE;
382 		break;
383 	default:
384 		fail_bits = ATW_TEST0_EPNE|ATW_TEST0_EPSNM;
385 		break;
386 	}
387 	if ((test0 & fail_bits) != 0) {
388 		printf("%s: bad or missing/bad SROM\n", sc->sc_dev.dv_xname);
389 		return -1;
390 	}
391 
392 	switch (test0 & ATW_TEST0_EPTYP_MASK) {
393 	case ATW_TEST0_EPTYP_93c66:
394 		ATW_DPRINTF(("%s: 93c66 SROM\n", sc->sc_dev.dv_xname));
395 		sc->sc_sromsz = 512;
396 		sd.sd_chip = C56_66;
397 		break;
398 	case ATW_TEST0_EPTYP_93c46:
399 		ATW_DPRINTF(("%s: 93c46 SROM\n", sc->sc_dev.dv_xname));
400 		sc->sc_sromsz = 128;
401 		sd.sd_chip = C46;
402 		break;
403 	default:
404 		printf("%s: unknown SROM type %d\n", sc->sc_dev.dv_xname,
405 		    MASK_AND_RSHIFT(test0, ATW_TEST0_EPTYP_MASK));
406 		return -1;
407 	}
408 
409 	sc->sc_srom = malloc(sc->sc_sromsz, M_DEVBUF, M_NOWAIT);
410 
411 	if (sc->sc_srom == NULL) {
412 		printf("%s: unable to allocate SROM buffer\n",
413 		    sc->sc_dev.dv_xname);
414 		return -1;
415 	}
416 
417 	(void)memset(sc->sc_srom, 0, sc->sc_sromsz);
418 
419 	/* ADM8211 has a single 32-bit register for controlling the
420 	 * 93cx6 SROM.  Bit SRS enables the serial port. There is no
421 	 * "ready" bit. The ADM8211 input/output sense is the reverse
422 	 * of read_seeprom's.
423 	 */
424 	sd.sd_tag = sc->sc_st;
425 	sd.sd_bsh = sc->sc_sh;
426 	sd.sd_regsize = 4;
427 	sd.sd_control_offset = ATW_SPR;
428 	sd.sd_status_offset = ATW_SPR;
429 	sd.sd_dataout_offset = ATW_SPR;
430 	sd.sd_CK = ATW_SPR_SCLK;
431 	sd.sd_CS = ATW_SPR_SCS;
432 	sd.sd_DI = ATW_SPR_SDO;
433 	sd.sd_DO = ATW_SPR_SDI;
434 	sd.sd_MS = ATW_SPR_SRS;
435 	sd.sd_RDY = 0;
436 
437 	if (!read_seeprom(&sd, sc->sc_srom, 0, sc->sc_sromsz/2)) {
438 		printf("%s: could not read SROM\n", sc->sc_dev.dv_xname);
439 		free(sc->sc_srom, M_DEVBUF);
440 		return -1;
441 	}
442 #ifdef ATW_DEBUG
443 	{
444 		int i;
445 		ATW_DPRINTF(("\nSerial EEPROM:\n\t"));
446 		for (i = 0; i < sc->sc_sromsz/2; i = i + 1) {
447 			if (((i % 8) == 0) && (i != 0)) {
448 				ATW_DPRINTF(("\n\t"));
449 			}
450 			ATW_DPRINTF((" 0x%x", sc->sc_srom[i]));
451 		}
452 		ATW_DPRINTF(("\n"));
453 	}
454 #endif /* ATW_DEBUG */
455 	return 0;
456 }
457 
458 #ifdef ATW_DEBUG
459 static void
460 atw_print_regs(struct atw_softc *sc, const char *where)
461 {
462 #define PRINTREG(sc, reg) \
463 	ATW_DPRINTF2(("%s: reg[ " #reg " / %03x ] = %08x\n", \
464 	    sc->sc_dev.dv_xname, reg, ATW_READ(sc, reg)))
465 
466 	ATW_DPRINTF2(("%s: %s\n", sc->sc_dev.dv_xname, where));
467 
468 	PRINTREG(sc, ATW_PAR);
469 	PRINTREG(sc, ATW_FRCTL);
470 	PRINTREG(sc, ATW_TDR);
471 	PRINTREG(sc, ATW_WTDP);
472 	PRINTREG(sc, ATW_RDR);
473 	PRINTREG(sc, ATW_WRDP);
474 	PRINTREG(sc, ATW_RDB);
475 	PRINTREG(sc, ATW_CSR3A);
476 	PRINTREG(sc, ATW_TDBD);
477 	PRINTREG(sc, ATW_TDBP);
478 	PRINTREG(sc, ATW_STSR);
479 	PRINTREG(sc, ATW_CSR5A);
480 	PRINTREG(sc, ATW_NAR);
481 	PRINTREG(sc, ATW_CSR6A);
482 	PRINTREG(sc, ATW_IER);
483 	PRINTREG(sc, ATW_CSR7A);
484 	PRINTREG(sc, ATW_LPC);
485 	PRINTREG(sc, ATW_TEST1);
486 	PRINTREG(sc, ATW_SPR);
487 	PRINTREG(sc, ATW_TEST0);
488 	PRINTREG(sc, ATW_WCSR);
489 	PRINTREG(sc, ATW_WPDR);
490 	PRINTREG(sc, ATW_GPTMR);
491 	PRINTREG(sc, ATW_GPIO);
492 	PRINTREG(sc, ATW_BBPCTL);
493 	PRINTREG(sc, ATW_SYNCTL);
494 	PRINTREG(sc, ATW_PLCPHD);
495 	PRINTREG(sc, ATW_MMIWADDR);
496 	PRINTREG(sc, ATW_MMIRADDR1);
497 	PRINTREG(sc, ATW_MMIRADDR2);
498 	PRINTREG(sc, ATW_TXBR);
499 	PRINTREG(sc, ATW_CSR15A);
500 	PRINTREG(sc, ATW_ALCSTAT);
501 	PRINTREG(sc, ATW_TOFS2);
502 	PRINTREG(sc, ATW_CMDR);
503 	PRINTREG(sc, ATW_PCIC);
504 	PRINTREG(sc, ATW_PMCSR);
505 	PRINTREG(sc, ATW_PAR0);
506 	PRINTREG(sc, ATW_PAR1);
507 	PRINTREG(sc, ATW_MAR0);
508 	PRINTREG(sc, ATW_MAR1);
509 	PRINTREG(sc, ATW_ATIMDA0);
510 	PRINTREG(sc, ATW_ABDA1);
511 	PRINTREG(sc, ATW_BSSID0);
512 	PRINTREG(sc, ATW_TXLMT);
513 	PRINTREG(sc, ATW_MIBCNT);
514 	PRINTREG(sc, ATW_BCNT);
515 	PRINTREG(sc, ATW_TSFTH);
516 	PRINTREG(sc, ATW_TSC);
517 	PRINTREG(sc, ATW_SYNRF);
518 	PRINTREG(sc, ATW_BPLI);
519 	PRINTREG(sc, ATW_CAP0);
520 	PRINTREG(sc, ATW_CAP1);
521 	PRINTREG(sc, ATW_RMD);
522 	PRINTREG(sc, ATW_CFPP);
523 	PRINTREG(sc, ATW_TOFS0);
524 	PRINTREG(sc, ATW_TOFS1);
525 	PRINTREG(sc, ATW_IFST);
526 	PRINTREG(sc, ATW_RSPT);
527 	PRINTREG(sc, ATW_TSFTL);
528 	PRINTREG(sc, ATW_WEPCTL);
529 	PRINTREG(sc, ATW_WESK);
530 	PRINTREG(sc, ATW_WEPCNT);
531 	PRINTREG(sc, ATW_MACTEST);
532 	PRINTREG(sc, ATW_FER);
533 	PRINTREG(sc, ATW_FEMR);
534 	PRINTREG(sc, ATW_FPSR);
535 	PRINTREG(sc, ATW_FFER);
536 #undef PRINTREG
537 }
538 #endif /* ATW_DEBUG */
539 
540 /*
541  * Finish attaching an ADMtek ADM8211 MAC.  Called by bus-specific front-end.
542  */
543 void
544 atw_attach(struct atw_softc *sc)
545 {
546 	static const u_int8_t empty_macaddr[IEEE80211_ADDR_LEN] = {
547 		0x00, 0x00, 0x00, 0x00, 0x00, 0x00
548 	};
549 	struct ieee80211com *ic = &sc->sc_ic;
550 	struct ifnet *ifp = &ic->ic_if;
551 	int country_code, error, i, nrate, srom_major;
552 	u_int32_t reg;
553 	static const char *type_strings[] = {"Intersil (not supported)",
554 	    "RFMD", "Marvel (not supported)"};
555 
556 	sc->sc_txth = atw_txthresh_tab_lo;
557 
558 	SIMPLEQ_INIT(&sc->sc_txfreeq);
559 	SIMPLEQ_INIT(&sc->sc_txdirtyq);
560 
561 #ifdef ATW_DEBUG
562 	atw_print_regs(sc, "atw_attach");
563 #endif /* ATW_DEBUG */
564 
565 	/*
566 	 * Allocate the control data structures, and create and load the
567 	 * DMA map for it.
568 	 */
569 	if ((error = bus_dmamem_alloc(sc->sc_dmat,
570 	    sizeof(struct atw_control_data), PAGE_SIZE, 0, &sc->sc_cdseg,
571 	    1, &sc->sc_cdnseg, 0)) != 0) {
572 		printf("%s: unable to allocate control data, error = %d\n",
573 		    sc->sc_dev.dv_xname, error);
574 		goto fail_0;
575 	}
576 
577 	if ((error = bus_dmamem_map(sc->sc_dmat, &sc->sc_cdseg, sc->sc_cdnseg,
578 	    sizeof(struct atw_control_data), (caddr_t *)&sc->sc_control_data,
579 	    BUS_DMA_COHERENT)) != 0) {
580 		printf("%s: unable to map control data, error = %d\n",
581 		    sc->sc_dev.dv_xname, error);
582 		goto fail_1;
583 	}
584 
585 	if ((error = bus_dmamap_create(sc->sc_dmat,
586 	    sizeof(struct atw_control_data), 1,
587 	    sizeof(struct atw_control_data), 0, 0, &sc->sc_cddmamap)) != 0) {
588 		printf("%s: unable to create control data DMA map, "
589 		    "error = %d\n", sc->sc_dev.dv_xname, error);
590 		goto fail_2;
591 	}
592 
593 	if ((error = bus_dmamap_load(sc->sc_dmat, sc->sc_cddmamap,
594 	    sc->sc_control_data, sizeof(struct atw_control_data), NULL,
595 	    0)) != 0) {
596 		printf("%s: unable to load control data DMA map, error = %d\n",
597 		    sc->sc_dev.dv_xname, error);
598 		goto fail_3;
599 	}
600 
601 	/*
602 	 * Create the transmit buffer DMA maps.
603 	 */
604 	sc->sc_ntxsegs = ATW_NTXSEGS;
605 	for (i = 0; i < ATW_TXQUEUELEN; i++) {
606 		if ((error = bus_dmamap_create(sc->sc_dmat, MCLBYTES,
607 		    sc->sc_ntxsegs, MCLBYTES, 0, 0,
608 		    &sc->sc_txsoft[i].txs_dmamap)) != 0) {
609 			printf("%s: unable to create tx DMA map %d, "
610 			    "error = %d\n", sc->sc_dev.dv_xname, i, error);
611 			goto fail_4;
612 		}
613 	}
614 
615 	/*
616 	 * Create the receive buffer DMA maps.
617 	 */
618 	for (i = 0; i < ATW_NRXDESC; i++) {
619 		if ((error = bus_dmamap_create(sc->sc_dmat, MCLBYTES, 1,
620 		    MCLBYTES, 0, 0, &sc->sc_rxsoft[i].rxs_dmamap)) != 0) {
621 			printf("%s: unable to create rx DMA map %d, "
622 			    "error = %d\n", sc->sc_dev.dv_xname, i, error);
623 			goto fail_5;
624 		}
625 	}
626 	for (i = 0; i < ATW_NRXDESC; i++) {
627 		sc->sc_rxsoft[i].rxs_mbuf = NULL;
628 	}
629 
630 	switch (sc->sc_rev) {
631 	case ATW_REVISION_AB:
632 	case ATW_REVISION_AF:
633 		sc->sc_sramlen = ATW_SRAM_A_SIZE;
634 		break;
635 	case ATW_REVISION_BA:
636 	case ATW_REVISION_CA:
637 		sc->sc_sramlen = ATW_SRAM_B_SIZE;
638 		break;
639 	}
640 
641 	/* Reset the chip to a known state. */
642 	atw_reset(sc);
643 
644 	if (atw_read_srom(sc) == -1)
645 		return;
646 
647 	sc->sc_rftype = MASK_AND_RSHIFT(sc->sc_srom[ATW_SR_CSR20],
648 	    ATW_SR_RFTYPE_MASK);
649 
650 	sc->sc_bbptype = MASK_AND_RSHIFT(sc->sc_srom[ATW_SR_CSR20],
651 	    ATW_SR_BBPTYPE_MASK);
652 
653 	if (sc->sc_rftype > sizeof(type_strings)/sizeof(type_strings[0])) {
654 		printf("%s: unknown RF\n", sc->sc_dev.dv_xname);
655 		return;
656 	}
657 	if (sc->sc_bbptype > sizeof(type_strings)/sizeof(type_strings[0])) {
658 		printf("%s: unknown BBP\n", sc->sc_dev.dv_xname);
659 		return;
660 	}
661 
662 	printf("%s: %s RF, %s BBP", sc->sc_dev.dv_xname,
663 	    type_strings[sc->sc_rftype], type_strings[sc->sc_bbptype]);
664 
665 	/* XXX There exists a Linux driver which seems to use RFType = 0 for
666 	 * MARVEL. My bug, or theirs?
667 	 */
668 
669 	reg = LSHIFT(sc->sc_rftype, ATW_SYNCTL_RFTYPE_MASK);
670 
671 	switch (sc->sc_rftype) {
672 	case ATW_RFTYPE_INTERSIL:
673 		reg |= ATW_SYNCTL_CS1;
674 		break;
675 	case ATW_RFTYPE_RFMD:
676 		reg |= ATW_SYNCTL_CS0;
677 		break;
678 	case ATW_RFTYPE_MARVEL:
679 		break;
680 	}
681 
682 	sc->sc_synctl_rd = reg | ATW_SYNCTL_RD;
683 	sc->sc_synctl_wr = reg | ATW_SYNCTL_WR;
684 
685 	reg = LSHIFT(sc->sc_bbptype, ATW_BBPCTL_TYPE_MASK);
686 
687 	switch (sc->sc_bbptype) {
688 	case ATW_BBPTYPE_INTERSIL:
689 		reg |= ATW_BBPCTL_TWI;
690 		break;
691 	case ATW_BBPTYPE_RFMD:
692 		reg |= ATW_BBPCTL_RF3KADDR_ADDR | ATW_BBPCTL_NEGEDGE_DO |
693 		    ATW_BBPCTL_CCA_ACTLO;
694 		break;
695 	case ATW_BBPTYPE_MARVEL:
696 		break;
697 	case ATW_C_BBPTYPE_RFMD:
698 		printf("%s: ADM8211C MAC/RFMD BBP not supported yet.\n",
699 		    sc->sc_dev.dv_xname);
700 		break;
701 	}
702 
703 	sc->sc_bbpctl_wr = reg | ATW_BBPCTL_WR;
704 	sc->sc_bbpctl_rd = reg | ATW_BBPCTL_RD;
705 
706 	/*
707 	 * From this point forward, the attachment cannot fail.  A failure
708 	 * before this point releases all resources that may have been
709 	 * allocated.
710 	 */
711 	sc->sc_flags |= ATWF_ATTACHED /* | ATWF_RTSCTS */;
712 
713 	ATW_DPRINTF((" SROM MAC %04x%04x%04x",
714 	    htole16(sc->sc_srom[ATW_SR_MAC00]),
715 	    htole16(sc->sc_srom[ATW_SR_MAC01]),
716 	    htole16(sc->sc_srom[ATW_SR_MAC10])));
717 
718 	srom_major = MASK_AND_RSHIFT(sc->sc_srom[ATW_SR_FORMAT_VERSION],
719 	    ATW_SR_MAJOR_MASK);
720 
721 	if (srom_major < 2)
722 		sc->sc_rf3000_options1 = 0;
723 	else if (sc->sc_rev == ATW_REVISION_BA) {
724 		sc->sc_rf3000_options1 =
725 		    MASK_AND_RSHIFT(sc->sc_srom[ATW_SR_CR28_CR03],
726 		    ATW_SR_CR28_MASK);
727 	} else
728 		sc->sc_rf3000_options1 = 0;
729 
730 	sc->sc_rf3000_options2 = MASK_AND_RSHIFT(sc->sc_srom[ATW_SR_CTRY_CR29],
731 	    ATW_SR_CR29_MASK);
732 
733 	country_code = MASK_AND_RSHIFT(sc->sc_srom[ATW_SR_CTRY_CR29],
734 	    ATW_SR_CTRY_MASK);
735 
736 #define ADD_CHANNEL(_ic, _chan) do {					\
737 	_ic->ic_channels[_chan].ic_flags = IEEE80211_CHAN_B;		\
738 	_ic->ic_channels[_chan].ic_freq =				\
739 	    ieee80211_ieee2mhz(_chan, _ic->ic_channels[_chan].ic_flags);\
740 } while (0)
741 
742 	/* Find available channels */
743 	switch (country_code) {
744 	case COUNTRY_MMK2:	/* 1-14 */
745 		ADD_CHANNEL(ic, 14);
746 		/*FALLTHROUGH*/
747 	case COUNTRY_ETSI:	/* 1-13 */
748 		for (i = 1; i <= 13; i++)
749 			ADD_CHANNEL(ic, i);
750 		break;
751 	case COUNTRY_FCC:	/* 1-11 */
752 	case COUNTRY_IC:	/* 1-11 */
753 		for (i = 1; i <= 11; i++)
754 			ADD_CHANNEL(ic, i);
755 		break;
756 	case COUNTRY_MMK:	/* 14 */
757 		ADD_CHANNEL(ic, 14);
758 		break;
759 	case COUNTRY_FRANCE:	/* 10-13 */
760 		for (i = 10; i <= 13; i++)
761 			ADD_CHANNEL(ic, i);
762 		break;
763 	default:	/* assume channels 10-11 */
764 	case COUNTRY_SPAIN:	/* 10-11 */
765 		for (i = 10; i <= 11; i++)
766 			ADD_CHANNEL(ic, i);
767 		break;
768 	}
769 
770 	/* Read the MAC address. */
771 	reg = ATW_READ(sc, ATW_PAR0);
772 	ic->ic_myaddr[0] = MASK_AND_RSHIFT(reg, ATW_PAR0_PAB0_MASK);
773 	ic->ic_myaddr[1] = MASK_AND_RSHIFT(reg, ATW_PAR0_PAB1_MASK);
774 	ic->ic_myaddr[2] = MASK_AND_RSHIFT(reg, ATW_PAR0_PAB2_MASK);
775 	ic->ic_myaddr[3] = MASK_AND_RSHIFT(reg, ATW_PAR0_PAB3_MASK);
776 	reg = ATW_READ(sc, ATW_PAR1);
777 	ic->ic_myaddr[4] = MASK_AND_RSHIFT(reg, ATW_PAR1_PAB4_MASK);
778 	ic->ic_myaddr[5] = MASK_AND_RSHIFT(reg, ATW_PAR1_PAB5_MASK);
779 
780 	if (IEEE80211_ADDR_EQ(ic->ic_myaddr, empty_macaddr)) {
781 		printf(" could not get mac address, attach failed\n");
782 		return;
783 	}
784 
785 	printf(" 802.11 address %s\n", ether_sprintf(ic->ic_myaddr));
786 
787 	memcpy(ifp->if_xname, sc->sc_dev.dv_xname, IFNAMSIZ);
788 	ifp->if_softc = sc;
789 	ifp->if_flags = IFF_SIMPLEX | IFF_BROADCAST | IFF_MULTICAST |
790 	    IFF_NOTRAILERS;
791 	ifp->if_ioctl = atw_ioctl;
792 	ifp->if_start = atw_start;
793 	ifp->if_watchdog = atw_watchdog;
794 	ifp->if_init = atw_init;
795 	ifp->if_stop = atw_stop;
796 	IFQ_SET_READY(&ifp->if_snd);
797 
798 	ic->ic_phytype = IEEE80211_T_DS;
799 	ic->ic_opmode = IEEE80211_M_STA;
800 	ic->ic_caps = IEEE80211_C_PMGT | IEEE80211_C_IBSS |
801 	    IEEE80211_C_HOSTAP | IEEE80211_C_MONITOR | IEEE80211_C_WEP;
802 
803 	nrate = 0;
804 	ic->ic_sup_rates[IEEE80211_MODE_11B].rs_rates[nrate++] = 2;
805 	ic->ic_sup_rates[IEEE80211_MODE_11B].rs_rates[nrate++] = 4;
806 	ic->ic_sup_rates[IEEE80211_MODE_11B].rs_rates[nrate++] = 11;
807 	ic->ic_sup_rates[IEEE80211_MODE_11B].rs_rates[nrate++] = 22;
808 	ic->ic_sup_rates[IEEE80211_MODE_11B].rs_nrates = nrate;
809 
810 	/*
811 	 * Call MI attach routines.
812 	 */
813 
814 	if_attach(ifp);
815 	ieee80211_ifattach(ifp);
816 
817 	sc->sc_newstate = ic->ic_newstate;
818 	ic->ic_newstate = atw_newstate;
819 
820 	sc->sc_recv_mgmt = ic->ic_recv_mgmt;
821 	ic->ic_recv_mgmt = atw_recv_mgmt;
822 
823 	sc->sc_node_free = ic->ic_node_free;
824 	ic->ic_node_free = atw_node_free;
825 
826 	sc->sc_node_alloc = ic->ic_node_alloc;
827 	ic->ic_node_alloc = atw_node_alloc;
828 
829 	/* possibly we should fill in our own sc_send_prresp, since
830 	 * the ADM8211 is probably sending probe responses in ad hoc
831 	 * mode.
832 	 */
833 
834 	/* complete initialization */
835 	ieee80211_media_init(ifp, atw_media_change, atw_media_status);
836 	callout_init(&sc->sc_scan_ch);
837 
838 #if NBPFILTER > 0
839 	bpfattach2(ifp, DLT_IEEE802_11_RADIO,
840 	    sizeof(struct ieee80211_frame) + 64, &sc->sc_radiobpf);
841 #endif
842 
843 	/*
844 	 * Make sure the interface is shutdown during reboot.
845 	 */
846 	sc->sc_sdhook = shutdownhook_establish(atw_shutdown, sc);
847 	if (sc->sc_sdhook == NULL)
848 		printf("%s: WARNING: unable to establish shutdown hook\n",
849 		    sc->sc_dev.dv_xname);
850 
851 	/*
852 	 * Add a suspend hook to make sure we come back up after a
853 	 * resume.
854 	 */
855 	sc->sc_powerhook = powerhook_establish(atw_power, sc);
856 	if (sc->sc_powerhook == NULL)
857 		printf("%s: WARNING: unable to establish power hook\n",
858 		    sc->sc_dev.dv_xname);
859 
860 	memset(&sc->sc_rxtapu, 0, sizeof(sc->sc_rxtapu));
861 	sc->sc_rxtap.ar_ihdr.it_len = sizeof(sc->sc_rxtapu);
862 	sc->sc_rxtap.ar_ihdr.it_present = ATW_RX_RADIOTAP_PRESENT;
863 
864 	memset(&sc->sc_txtapu, 0, sizeof(sc->sc_txtapu));
865 	sc->sc_txtap.at_ihdr.it_len = sizeof(sc->sc_txtapu);
866 	sc->sc_txtap.at_ihdr.it_present = ATW_TX_RADIOTAP_PRESENT;
867 
868 	return;
869 
870 	/*
871 	 * Free any resources we've allocated during the failed attach
872 	 * attempt.  Do this in reverse order and fall through.
873 	 */
874  fail_5:
875 	for (i = 0; i < ATW_NRXDESC; i++) {
876 		if (sc->sc_rxsoft[i].rxs_dmamap == NULL)
877 			continue;
878 		bus_dmamap_destroy(sc->sc_dmat, sc->sc_rxsoft[i].rxs_dmamap);
879 	}
880  fail_4:
881 	for (i = 0; i < ATW_TXQUEUELEN; i++) {
882 		if (sc->sc_txsoft[i].txs_dmamap == NULL)
883 			continue;
884 		bus_dmamap_destroy(sc->sc_dmat, sc->sc_txsoft[i].txs_dmamap);
885 	}
886 	bus_dmamap_unload(sc->sc_dmat, sc->sc_cddmamap);
887  fail_3:
888 	bus_dmamap_destroy(sc->sc_dmat, sc->sc_cddmamap);
889  fail_2:
890 	bus_dmamem_unmap(sc->sc_dmat, (caddr_t)sc->sc_control_data,
891 	    sizeof(struct atw_control_data));
892  fail_1:
893 	bus_dmamem_free(sc->sc_dmat, &sc->sc_cdseg, sc->sc_cdnseg);
894  fail_0:
895 	return;
896 }
897 
898 static struct ieee80211_node *
899 atw_node_alloc(struct ieee80211com *ic)
900 {
901 	struct atw_softc *sc = (struct atw_softc *)ic->ic_if.if_softc;
902 	struct ieee80211_node *ni = (*sc->sc_node_alloc)(ic);
903 
904 	DPRINTF(sc, ("%s: alloc node %p\n", sc->sc_dev.dv_xname, ni));
905 	return ni;
906 }
907 
908 static void
909 atw_node_free(struct ieee80211com *ic, struct ieee80211_node *ni)
910 {
911 	struct atw_softc *sc = (struct atw_softc *)ic->ic_if.if_softc;
912 
913 	DPRINTF(sc, ("%s: freeing node %p %s\n", sc->sc_dev.dv_xname, ni,
914 	    ether_sprintf(ni->ni_bssid)));
915 	(*sc->sc_node_free)(ic, ni);
916 }
917 
918 
919 static void
920 atw_test1_reset(struct atw_softc *sc)
921 {
922 	switch (sc->sc_rev) {
923 	case ATW_REVISION_BA:
924 		if (1 /* XXX condition on transceiver type */) {
925 			ATW_SET(sc, ATW_TEST1, ATW_TEST1_TESTMODE_MONITOR);
926 		}
927 		break;
928 	case ATW_REVISION_CA:
929 		ATW_CLR(sc, ATW_TEST1, ATW_TEST1_TESTMODE_MASK);
930 		break;
931 	default:
932 		break;
933 	}
934 }
935 
936 /*
937  * atw_reset:
938  *
939  *	Perform a soft reset on the ADM8211.
940  */
941 void
942 atw_reset(struct atw_softc *sc)
943 {
944 	int i;
945 	uint32_t lpc;
946 
947 	ATW_WRITE(sc, ATW_NAR, 0x0);
948 	DELAY(atw_nar_delay);
949 
950 	/* Reference driver has a cryptic remark indicating that this might
951 	 * power-on the chip.  I know that it turns off power-saving....
952 	 */
953 	ATW_WRITE(sc, ATW_FRCTL, 0x0);
954 
955 	ATW_WRITE(sc, ATW_PAR, ATW_PAR_SWR);
956 
957 	for (i = 0; i < 50000 / atw_pseudo_milli; i++) {
958 		if (ATW_READ(sc, ATW_PAR) == 0)
959 			break;
960 		DELAY(atw_pseudo_milli);
961 	}
962 
963 	/* ... and then pause 100ms longer for good measure. */
964 	DELAY(atw_magic_delay1);
965 
966 	DPRINTF2(sc, ("%s: atw_reset %d iterations\n", sc->sc_dev.dv_xname, i));
967 
968 	if (ATW_ISSET(sc, ATW_PAR, ATW_PAR_SWR))
969 		printf("%s: reset failed to complete\n", sc->sc_dev.dv_xname);
970 
971 	atw_test1_reset(sc);
972 	/*
973 	 * Initialize the PCI Access Register.
974 	 */
975 	sc->sc_busmode = ATW_PAR_PBL_8DW;
976 
977 	ATW_WRITE(sc, ATW_PAR, sc->sc_busmode);
978 	DPRINTF(sc, ("%s: ATW_PAR %08x busmode %08x\n", sc->sc_dev.dv_xname,
979 	    ATW_READ(sc, ATW_PAR), sc->sc_busmode));
980 
981 	/* Turn off maximum power saving, etc.
982 	 *
983 	 * XXX Following example of reference driver, should I set
984 	 * an AID of 1?  It didn't seem to help....
985 	 */
986 	ATW_WRITE(sc, ATW_FRCTL, 0x0);
987 
988 	DELAY(atw_magic_delay2);
989 
990 	/* Recall EEPROM. */
991 	ATW_SET(sc, ATW_TEST0, ATW_TEST0_EPRLD);
992 
993 	DELAY(atw_magic_delay4);
994 
995 	lpc = ATW_READ(sc, ATW_LPC);
996 
997 	DPRINTF(sc, ("%s: ATW_LPC %#08x\n", __func__, lpc));
998 
999 	/* A reset seems to affect the SRAM contents, so put them into
1000 	 * a known state.
1001 	 */
1002 	atw_clear_sram(sc);
1003 
1004 	memset(sc->sc_bssid, 0xff, sizeof(sc->sc_bssid));
1005 }
1006 
1007 static void
1008 atw_clear_sram(struct atw_softc *sc)
1009 {
1010 	memset(sc->sc_sram, 0, sizeof(sc->sc_sram));
1011 	/* XXX not for revision 0x20. */
1012 	atw_write_sram(sc, 0, sc->sc_sram, sc->sc_sramlen);
1013 }
1014 
1015 /* TBD atw_init
1016  *
1017  * set MAC based on ic->ic_bss->myaddr
1018  * write WEP keys
1019  * set TX rate
1020  */
1021 
1022 /* Tell the ADM8211 to raise ATW_INTR_LINKOFF if 7 beacon intervals pass
1023  * without receiving a beacon with the preferred BSSID & SSID.
1024  * atw_write_bssid & atw_write_ssid set the BSSID & SSID.
1025  */
1026 static void
1027 atw_wcsr_init(struct atw_softc *sc)
1028 {
1029 	uint32_t wcsr;
1030 
1031 	wcsr = ATW_READ(sc, ATW_WCSR);
1032 	wcsr &= ~(ATW_WCSR_BLN_MASK|ATW_WCSR_LSOE|ATW_WCSR_MPRE|ATW_WCSR_LSOE);
1033 	wcsr |= LSHIFT(7, ATW_WCSR_BLN_MASK);
1034 	ATW_WRITE(sc, ATW_WCSR, wcsr);	/* XXX resets wake-up status bits */
1035 
1036 	DPRINTF(sc, ("%s: %s reg[WCSR] = %08x\n",
1037 	    sc->sc_dev.dv_xname, __func__, ATW_READ(sc, ATW_WCSR)));
1038 }
1039 
1040 /* Turn off power management.  Set Rx store-and-forward mode. */
1041 static void
1042 atw_cmdr_init(struct atw_softc *sc)
1043 {
1044 	uint32_t cmdr;
1045 	cmdr = ATW_READ(sc, ATW_CMDR);
1046 	cmdr &= ~ATW_CMDR_APM;
1047 	cmdr |= ATW_CMDR_RTE;
1048 	cmdr &= ~ATW_CMDR_DRT_MASK;
1049 	cmdr |= ATW_CMDR_DRT_SF;
1050 
1051 	ATW_WRITE(sc, ATW_CMDR, cmdr);
1052 }
1053 
1054 static void
1055 atw_tofs2_init(struct atw_softc *sc)
1056 {
1057 	uint32_t tofs2;
1058 	/* XXX this magic can probably be figured out from the RFMD docs */
1059 #ifndef ATW_REFSLAVE
1060 	tofs2 = LSHIFT(4, ATW_TOFS2_PWR1UP_MASK)    | /* 8 ms = 4 * 2 ms */
1061 	      LSHIFT(13, ATW_TOFS2_PWR0PAPE_MASK) | /* 13 us */
1062 	      LSHIFT(8, ATW_TOFS2_PWR1PAPE_MASK)  | /* 8 us */
1063 	      LSHIFT(5, ATW_TOFS2_PWR0TRSW_MASK)  | /* 5 us */
1064 	      LSHIFT(12, ATW_TOFS2_PWR1TRSW_MASK) | /* 12 us */
1065 	      LSHIFT(13, ATW_TOFS2_PWR0PE2_MASK)  | /* 13 us */
1066 	      LSHIFT(4, ATW_TOFS2_PWR1PE2_MASK)   | /* 4 us */
1067 	      LSHIFT(5, ATW_TOFS2_PWR0TXPE_MASK);  /* 5 us */
1068 #else
1069 	/* XXX new magic from reference driver source */
1070 	tofs2 = LSHIFT(8, ATW_TOFS2_PWR1UP_MASK)    | /* 8 ms = 4 * 2 ms */
1071 	      LSHIFT(8, ATW_TOFS2_PWR0PAPE_MASK) | /* 13 us */
1072 	      LSHIFT(1, ATW_TOFS2_PWR1PAPE_MASK)  | /* 8 us */
1073 	      LSHIFT(5, ATW_TOFS2_PWR0TRSW_MASK)  | /* 5 us */
1074 	      LSHIFT(12, ATW_TOFS2_PWR1TRSW_MASK) | /* 12 us */
1075 	      LSHIFT(13, ATW_TOFS2_PWR0PE2_MASK)  | /* 13 us */
1076 	      LSHIFT(1, ATW_TOFS2_PWR1PE2_MASK)   | /* 4 us */
1077 	      LSHIFT(8, ATW_TOFS2_PWR0TXPE_MASK);  /* 5 us */
1078 #endif
1079 	ATW_WRITE(sc, ATW_TOFS2, tofs2);
1080 }
1081 
1082 static void
1083 atw_nar_init(struct atw_softc *sc)
1084 {
1085 	ATW_WRITE(sc, ATW_NAR, ATW_NAR_SF|ATW_NAR_PB);
1086 }
1087 
1088 static void
1089 atw_txlmt_init(struct atw_softc *sc)
1090 {
1091 	ATW_WRITE(sc, ATW_TXLMT, LSHIFT(512, ATW_TXLMT_MTMLT_MASK) |
1092 	                         LSHIFT(1, ATW_TXLMT_SRTYLIM_MASK));
1093 }
1094 
1095 static void
1096 atw_test1_init(struct atw_softc *sc)
1097 {
1098 	uint32_t test1;
1099 
1100 	test1 = ATW_READ(sc, ATW_TEST1);
1101 	test1 &= ~(ATW_TEST1_DBGREAD_MASK|ATW_TEST1_CONTROL);
1102 	/* XXX magic 0x1 */
1103 	test1 |= LSHIFT(0x1, ATW_TEST1_DBGREAD_MASK) | ATW_TEST1_CONTROL;
1104 	ATW_WRITE(sc, ATW_TEST1, test1);
1105 }
1106 
1107 static void
1108 atw_rf_reset(struct atw_softc *sc)
1109 {
1110 	/* XXX this resets an Intersil RF front-end? */
1111 	/* TBD condition on Intersil RFType? */
1112 	ATW_WRITE(sc, ATW_SYNRF, ATW_SYNRF_INTERSIL_EN);
1113 	DELAY(atw_rf_delay1);
1114 	ATW_WRITE(sc, ATW_SYNRF, 0);
1115 	DELAY(atw_rf_delay2);
1116 }
1117 
1118 /* Set 16 TU max duration for the contention-free period (CFP). */
1119 static void
1120 atw_cfp_init(struct atw_softc *sc)
1121 {
1122 	uint32_t cfpp;
1123 
1124 	cfpp = ATW_READ(sc, ATW_CFPP);
1125 	cfpp &= ~ATW_CFPP_CFPMD;
1126 	cfpp |= LSHIFT(16, ATW_CFPP_CFPMD);
1127 	ATW_WRITE(sc, ATW_CFPP, cfpp);
1128 }
1129 
1130 static void
1131 atw_tofs0_init(struct atw_softc *sc)
1132 {
1133 	/* XXX I guess that the Cardbus clock is 22MHz?
1134 	 * I am assuming that the role of ATW_TOFS0_USCNT is
1135 	 * to divide the bus clock to get a 1MHz clock---the datasheet is not
1136 	 * very clear on this point. It says in the datasheet that it is
1137 	 * possible for the ADM8211 to accomodate bus speeds between 22MHz
1138 	 * and 33MHz; maybe this is the way? I see a binary-only driver write
1139 	 * these values. These values are also the power-on default.
1140 	 */
1141 	ATW_WRITE(sc, ATW_TOFS0,
1142 	    LSHIFT(22, ATW_TOFS0_USCNT_MASK) |
1143 	    ATW_TOFS0_TUCNT_MASK /* set all bits in TUCNT */);
1144 }
1145 
1146 /* Initialize interframe spacing: 802.11b slot time, SIFS, DIFS, EIFS. */
1147 static void
1148 atw_ifs_init(struct atw_softc *sc)
1149 {
1150 	uint32_t ifst;
1151 	/* XXX EIFS=0x64, SIFS=110 are used by the reference driver.
1152 	 * Go figure.
1153 	 */
1154 	ifst = LSHIFT(IEEE80211_DUR_DS_SLOT, ATW_IFST_SLOT_MASK) |
1155 	      LSHIFT(22 * 5 /* IEEE80211_DUR_DS_SIFS */ /* # of 22MHz cycles */,
1156 	             ATW_IFST_SIFS_MASK) |
1157 	      LSHIFT(IEEE80211_DUR_DS_DIFS, ATW_IFST_DIFS_MASK) |
1158 	      LSHIFT(0x64 /* IEEE80211_DUR_DS_EIFS */, ATW_IFST_EIFS_MASK);
1159 
1160 	ATW_WRITE(sc, ATW_IFST, ifst);
1161 }
1162 
1163 static void
1164 atw_response_times_init(struct atw_softc *sc)
1165 {
1166 	/* XXX More magic. Relates to ACK timing?  The datasheet seems to
1167 	 * indicate that the MAC expects at least SIFS + MIRT microseconds
1168 	 * to pass after it transmits a frame that requires a response;
1169 	 * it waits at most SIFS + MART microseconds for the response.
1170 	 * Surely this is not the ACK timeout?
1171 	 */
1172 	ATW_WRITE(sc, ATW_RSPT, LSHIFT(0xffff, ATW_RSPT_MART_MASK) |
1173 	    LSHIFT(0xff, ATW_RSPT_MIRT_MASK));
1174 }
1175 
1176 /* Set up the MMI read/write addresses for the baseband. The Tx/Rx
1177  * engines read and write baseband registers after Rx and before
1178  * Tx, respectively.
1179  */
1180 static void
1181 atw_bbp_io_init(struct atw_softc *sc)
1182 {
1183 	uint32_t mmiraddr2;
1184 
1185 	/* XXX The reference driver does this, but is it *really*
1186 	 * necessary?
1187 	 */
1188 	switch (sc->sc_rev) {
1189 	case ATW_REVISION_AB:
1190 	case ATW_REVISION_AF:
1191 		mmiraddr2 = 0x0;
1192 		break;
1193 	default:
1194 		mmiraddr2 = ATW_READ(sc, ATW_MMIRADDR2);
1195 		mmiraddr2 &=
1196 		    ~(ATW_MMIRADDR2_PROREXT|ATW_MMIRADDR2_PRORLEN_MASK);
1197 		break;
1198 	}
1199 
1200 	switch (sc->sc_bbptype) {
1201 	case ATW_BBPTYPE_INTERSIL:
1202 		ATW_WRITE(sc, ATW_MMIWADDR, ATW_MMIWADDR_INTERSIL);
1203 		ATW_WRITE(sc, ATW_MMIRADDR1, ATW_MMIRADDR1_INTERSIL);
1204 		mmiraddr2 |= ATW_MMIRADDR2_INTERSIL;
1205 		break;
1206 	case ATW_BBPTYPE_MARVEL:
1207 		/* TBD find out the Marvel settings. */
1208 		break;
1209 	case ATW_BBPTYPE_RFMD:
1210 	default:
1211 		ATW_WRITE(sc, ATW_MMIWADDR, ATW_MMIWADDR_RFMD);
1212 		ATW_WRITE(sc, ATW_MMIRADDR1, ATW_MMIRADDR1_RFMD);
1213 		mmiraddr2 |= ATW_MMIRADDR2_RFMD;
1214 		break;
1215 	}
1216 	ATW_WRITE(sc, ATW_MMIRADDR2, mmiraddr2);
1217 	ATW_WRITE(sc, ATW_MACTEST, ATW_MACTEST_MMI_USETXCLK);
1218 }
1219 
1220 /*
1221  * atw_init:		[ ifnet interface function ]
1222  *
1223  *	Initialize the interface.  Must be called at splnet().
1224  */
1225 int
1226 atw_init(struct ifnet *ifp)
1227 {
1228 	struct atw_softc *sc = ifp->if_softc;
1229 	struct ieee80211com *ic = &sc->sc_ic;
1230 	struct atw_txsoft *txs;
1231 	struct atw_rxsoft *rxs;
1232 	int i, error = 0;
1233 
1234 	if ((error = atw_enable(sc)) != 0)
1235 		goto out;
1236 
1237 	/*
1238 	 * Cancel any pending I/O. This also resets.
1239 	 */
1240 	atw_stop(ifp, 0);
1241 
1242 	ic->ic_bss->ni_chan = ic->ic_ibss_chan;
1243 	DPRINTF(sc, ("%s: channel %d freq %d flags 0x%04x\n",
1244 	    __func__, ieee80211_chan2ieee(ic, ic->ic_bss->ni_chan),
1245 	    ic->ic_bss->ni_chan->ic_freq, ic->ic_bss->ni_chan->ic_flags));
1246 
1247 	atw_wcsr_init(sc);
1248 
1249 	atw_cmdr_init(sc);
1250 
1251 	/* Set data rate for PLCP Signal field, 1Mbps = 10 x 100Kb/s.
1252 	 *
1253 	 * XXX Set transmit power for ATIM, RTS, Beacon.
1254 	 */
1255 	ATW_WRITE(sc, ATW_PLCPHD, LSHIFT(10, ATW_PLCPHD_SIGNAL_MASK) |
1256 	    LSHIFT(0xb0, ATW_PLCPHD_SERVICE_MASK));
1257 
1258 	atw_tofs2_init(sc);
1259 
1260 	atw_nar_init(sc);
1261 
1262 	atw_txlmt_init(sc);
1263 
1264 	atw_test1_init(sc);
1265 
1266 	atw_rf_reset(sc);
1267 
1268 	atw_cfp_init(sc);
1269 
1270 	atw_tofs0_init(sc);
1271 
1272 	atw_ifs_init(sc);
1273 
1274 	/* XXX Fall asleep after one second of inactivity.
1275 	 * XXX A frame may only dribble in for 65536us.
1276 	 */
1277 	ATW_WRITE(sc, ATW_RMD,
1278 	    LSHIFT(1, ATW_RMD_PCNT) | LSHIFT(0xffff, ATW_RMD_RMRD_MASK));
1279 
1280 	atw_response_times_init(sc);
1281 
1282 	atw_bbp_io_init(sc);
1283 
1284 	ATW_WRITE(sc, ATW_STSR, 0xffffffff);
1285 
1286 	if ((error = atw_rf3000_init(sc)) != 0)
1287 		goto out;
1288 
1289 	ATW_WRITE(sc, ATW_PAR, sc->sc_busmode);
1290 	DPRINTF(sc, ("%s: ATW_PAR %08x busmode %08x\n", sc->sc_dev.dv_xname,
1291 	    ATW_READ(sc, ATW_PAR), sc->sc_busmode));
1292 
1293 	/*
1294 	 * Initialize the transmit descriptor ring.
1295 	 */
1296 	memset(sc->sc_txdescs, 0, sizeof(sc->sc_txdescs));
1297 	for (i = 0; i < ATW_NTXDESC; i++) {
1298 		sc->sc_txdescs[i].at_ctl = 0;
1299 		/* no transmit chaining */
1300 		sc->sc_txdescs[i].at_flags = 0 /* ATW_TXFLAG_TCH */;
1301 		sc->sc_txdescs[i].at_buf2 =
1302 		    htole32(ATW_CDTXADDR(sc, ATW_NEXTTX(i)));
1303 	}
1304 	/* use ring mode */
1305 	sc->sc_txdescs[ATW_NTXDESC - 1].at_flags |= htole32(ATW_TXFLAG_TER);
1306 	ATW_CDTXSYNC(sc, 0, ATW_NTXDESC,
1307 	    BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE);
1308 	sc->sc_txfree = ATW_NTXDESC;
1309 	sc->sc_txnext = 0;
1310 
1311 	/*
1312 	 * Initialize the transmit job descriptors.
1313 	 */
1314 	SIMPLEQ_INIT(&sc->sc_txfreeq);
1315 	SIMPLEQ_INIT(&sc->sc_txdirtyq);
1316 	for (i = 0; i < ATW_TXQUEUELEN; i++) {
1317 		txs = &sc->sc_txsoft[i];
1318 		txs->txs_mbuf = NULL;
1319 		SIMPLEQ_INSERT_TAIL(&sc->sc_txfreeq, txs, txs_q);
1320 	}
1321 
1322 	/*
1323 	 * Initialize the receive descriptor and receive job
1324 	 * descriptor rings.
1325 	 */
1326 	for (i = 0; i < ATW_NRXDESC; i++) {
1327 		rxs = &sc->sc_rxsoft[i];
1328 		if (rxs->rxs_mbuf == NULL) {
1329 			if ((error = atw_add_rxbuf(sc, i)) != 0) {
1330 				printf("%s: unable to allocate or map rx "
1331 				    "buffer %d, error = %d\n",
1332 				    sc->sc_dev.dv_xname, i, error);
1333 				/*
1334 				 * XXX Should attempt to run with fewer receive
1335 				 * XXX buffers instead of just failing.
1336 				 */
1337 				atw_rxdrain(sc);
1338 				goto out;
1339 			}
1340 		} else
1341 			ATW_INIT_RXDESC(sc, i);
1342 	}
1343 	sc->sc_rxptr = 0;
1344 
1345 	/*
1346 	 * Initialize the interrupt mask and enable interrupts.
1347 	 */
1348 	/* normal interrupts */
1349 	sc->sc_inten =  ATW_INTR_TCI | ATW_INTR_TDU | ATW_INTR_RCI |
1350 	    ATW_INTR_NISS | ATW_INTR_LINKON | ATW_INTR_BCNTC;
1351 
1352 	/* abnormal interrupts */
1353 	sc->sc_inten |= ATW_INTR_TPS | ATW_INTR_TLT | ATW_INTR_TRT |
1354 	    ATW_INTR_TUF | ATW_INTR_RDU | ATW_INTR_RPS | ATW_INTR_AISS |
1355 	    ATW_INTR_FBE | ATW_INTR_LINKOFF | ATW_INTR_TSFTF | ATW_INTR_TSCZ;
1356 
1357 	sc->sc_linkint_mask = ATW_INTR_LINKON | ATW_INTR_LINKOFF |
1358 	    ATW_INTR_BCNTC | ATW_INTR_TSFTF | ATW_INTR_TSCZ;
1359 	sc->sc_rxint_mask = ATW_INTR_RCI | ATW_INTR_RDU;
1360 	sc->sc_txint_mask = ATW_INTR_TCI | ATW_INTR_TUF | ATW_INTR_TLT |
1361 	    ATW_INTR_TRT;
1362 
1363 	sc->sc_linkint_mask &= sc->sc_inten;
1364 	sc->sc_rxint_mask &= sc->sc_inten;
1365 	sc->sc_txint_mask &= sc->sc_inten;
1366 
1367 	ATW_WRITE(sc, ATW_IER, sc->sc_inten);
1368 	ATW_WRITE(sc, ATW_STSR, 0xffffffff);
1369 
1370 	DPRINTF(sc, ("%s: ATW_IER %08x, inten %08x\n",
1371 	    sc->sc_dev.dv_xname, ATW_READ(sc, ATW_IER), sc->sc_inten));
1372 
1373 	/*
1374 	 * Give the transmit and receive rings to the ADM8211.
1375 	 */
1376 	ATW_WRITE(sc, ATW_RDB, ATW_CDRXADDR(sc, sc->sc_rxptr));
1377 	ATW_WRITE(sc, ATW_TDBD, ATW_CDTXADDR(sc, sc->sc_txnext));
1378 
1379 	sc->sc_txthresh = 0;
1380 	sc->sc_opmode = ATW_NAR_SR | ATW_NAR_ST |
1381 	    sc->sc_txth[sc->sc_txthresh].txth_opmode;
1382 
1383 	/* common 802.11 configuration */
1384 	ic->ic_flags &= ~IEEE80211_F_IBSSON;
1385 	switch (ic->ic_opmode) {
1386 	case IEEE80211_M_STA:
1387 		break;
1388 	case IEEE80211_M_AHDEMO: /* XXX */
1389 	case IEEE80211_M_IBSS:
1390 		ic->ic_flags |= IEEE80211_F_IBSSON;
1391 		/*FALLTHROUGH*/
1392 	case IEEE80211_M_HOSTAP: /* XXX */
1393 		break;
1394 	case IEEE80211_M_MONITOR: /* XXX */
1395 		break;
1396 	}
1397 
1398 	switch (ic->ic_opmode) {
1399 	case IEEE80211_M_AHDEMO:
1400 	case IEEE80211_M_HOSTAP:
1401 		ic->ic_bss->ni_intval = ic->ic_lintval;
1402 		ic->ic_bss->ni_rssi = 0;
1403 		ic->ic_bss->ni_rstamp = 0;
1404 		break;
1405 	default:					/* XXX */
1406 		break;
1407 	}
1408 
1409 	sc->sc_wepctl = 0;
1410 
1411 	atw_write_ssid(sc);
1412 	atw_write_sup_rates(sc);
1413 	if (ic->ic_caps & IEEE80211_C_WEP)
1414 		atw_write_wep(sc);
1415 
1416 	ic->ic_state = IEEE80211_S_INIT;
1417 
1418 	/*
1419 	 * Set the receive filter.  This will start the transmit and
1420 	 * receive processes.
1421 	 */
1422 	atw_filter_setup(sc);
1423 
1424 	/*
1425 	 * Start the receive process.
1426 	 */
1427 	ATW_WRITE(sc, ATW_RDR, 0x1);
1428 
1429 	/*
1430 	 * Note that the interface is now running.
1431 	 */
1432 	ifp->if_flags |= IFF_RUNNING;
1433 	ifp->if_flags &= ~IFF_OACTIVE;
1434 
1435 	/* send no beacons, yet. */
1436 	atw_start_beacon(sc, 0);
1437 
1438 	if (ic->ic_opmode == IEEE80211_M_MONITOR)
1439 		error = ieee80211_new_state(ic, IEEE80211_S_RUN, -1);
1440 	else
1441 		error = ieee80211_new_state(ic, IEEE80211_S_SCAN, -1);
1442  out:
1443 	if (error) {
1444 		ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE);
1445 		ifp->if_timer = 0;
1446 		printf("%s: interface not running\n", sc->sc_dev.dv_xname);
1447 	}
1448 #ifdef ATW_DEBUG
1449 	atw_print_regs(sc, "end of init");
1450 #endif /* ATW_DEBUG */
1451 
1452 	return (error);
1453 }
1454 
1455 /* enable == 1: host control of RF3000/Si4126 through ATW_SYNCTL.
1456  *           0: MAC control of RF3000/Si4126.
1457  *
1458  * Applies power, or selects RF front-end? Sets reset condition.
1459  *
1460  * TBD support non-RFMD BBP, non-SiLabs synth.
1461  */
1462 static void
1463 atw_bbp_io_enable(struct atw_softc *sc, int enable)
1464 {
1465 	if (enable) {
1466 		ATW_WRITE(sc, ATW_SYNRF,
1467 		    ATW_SYNRF_SELRF|ATW_SYNRF_PE1|ATW_SYNRF_PHYRST);
1468 		DELAY(atw_bbp_io_enable_delay);
1469 	} else {
1470 		ATW_WRITE(sc, ATW_SYNRF, 0);
1471 		DELAY(atw_bbp_io_disable_delay); /* shorter for some reason */
1472 	}
1473 }
1474 
1475 static int
1476 atw_tune(struct atw_softc *sc)
1477 {
1478 	int rc;
1479 	u_int chan;
1480 	struct ieee80211com *ic = &sc->sc_ic;
1481 
1482 	chan = ieee80211_chan2ieee(ic, ic->ic_bss->ni_chan);
1483 	if (chan == IEEE80211_CHAN_ANY)
1484 		panic("%s: chan == IEEE80211_CHAN_ANY\n", __func__);
1485 
1486 	if (chan == sc->sc_cur_chan)
1487 		return 0;
1488 
1489 	DPRINTF(sc, ("%s: chan %d -> %d\n", sc->sc_dev.dv_xname,
1490 	    sc->sc_cur_chan, chan));
1491 
1492 	atw_idle(sc, ATW_NAR_SR|ATW_NAR_ST);
1493 
1494 	atw_si4126_tune(sc, chan);
1495 	if ((rc = atw_rf3000_tune(sc, chan)) != 0)
1496 		printf("%s: failed to tune channel %d\n", sc->sc_dev.dv_xname,
1497 		    chan);
1498 
1499 	ATW_WRITE(sc, ATW_NAR, sc->sc_opmode);
1500 	DELAY(atw_nar_delay);
1501 	ATW_WRITE(sc, ATW_RDR, 0x1);
1502 
1503 	if (rc == 0)
1504 		sc->sc_cur_chan = chan;
1505 
1506 	return rc;
1507 }
1508 
1509 #ifdef ATW_SYNDEBUG
1510 static void
1511 atw_si4126_print(struct atw_softc *sc)
1512 {
1513 	struct ifnet *ifp = &sc->sc_ic.ic_if;
1514 	u_int addr, val;
1515 
1516 	if (atw_debug < 3 || (ifp->if_flags & IFF_DEBUG) == 0)
1517 		return;
1518 
1519 	for (addr = 0; addr <= 8; addr++) {
1520 		printf("%s: synth[%d] = ", sc->sc_dev.dv_xname, addr);
1521 		if (atw_si4126_read(sc, addr, &val) == 0) {
1522 			printf("<unknown> (quitting print-out)\n");
1523 			break;
1524 		}
1525 		printf("%05x\n", val);
1526 	}
1527 }
1528 #endif /* ATW_SYNDEBUG */
1529 
1530 /* Tune to channel chan by adjusting the Si4126 RF/IF synthesizer.
1531  *
1532  * The RF/IF synthesizer produces two reference frequencies for
1533  * the RF2948B transceiver.  The first frequency the RF2948B requires
1534  * is two times the so-called "intermediate frequency" (IF). Since
1535  * a SAW filter on the radio fixes the IF at 374MHz, I program the
1536  * Si4126 to generate IF LO = 374MHz x 2 = 748MHz.  The second
1537  * frequency required by the transceiver is the radio frequency
1538  * (RF). This is a superheterodyne transceiver; for f(chan) the
1539  * center frequency of the channel we are tuning, RF = f(chan) -
1540  * IF.
1541  *
1542  * XXX I am told by SiLabs that the Si4126 will accept a broader range
1543  * of XIN than the 2-25MHz mentioned by the datasheet, even *without*
1544  * XINDIV2 = 1.  I've tried this (it is necessary to double R) and it
1545  * works, but I have still programmed for XINDIV2 = 1 to be safe.
1546  */
1547 static void
1548 atw_si4126_tune(struct atw_softc *sc, u_int chan)
1549 {
1550 	u_int mhz;
1551 	u_int R;
1552 	u_int32_t gpio;
1553 	u_int16_t gain;
1554 
1555 #ifdef ATW_SYNDEBUG
1556 	atw_si4126_print(sc);
1557 #endif /* ATW_SYNDEBUG */
1558 
1559 	if (chan == 14)
1560 		mhz = 2484;
1561 	else
1562 		mhz = 2412 + 5 * (chan - 1);
1563 
1564 	/* Tune IF to 748MHz to suit the IF LO input of the
1565 	 * RF2494B, which is 2 x IF. No need to set an IF divider
1566          * because an IF in 526MHz - 952MHz is allowed.
1567 	 *
1568 	 * XIN is 44.000MHz, so divide it by two to get allowable
1569 	 * range of 2-25MHz. SiLabs tells me that this is not
1570 	 * strictly necessary.
1571 	 */
1572 
1573 	if (atw_xindiv2)
1574 		R = 44;
1575 	else
1576 		R = 88;
1577 
1578 	/* Power-up RF, IF synthesizers. */
1579 	atw_si4126_write(sc, SI4126_POWER,
1580 	    SI4126_POWER_PDIB|SI4126_POWER_PDRB);
1581 
1582 	/* set LPWR, too? */
1583 	atw_si4126_write(sc, SI4126_MAIN,
1584 	    (atw_xindiv2) ? SI4126_MAIN_XINDIV2 : 0);
1585 
1586 	/* Set the phase-locked loop gain.  If RF2 N > 2047, then
1587 	 * set KP2 to 1.
1588 	 *
1589 	 * REFDIF This is different from the reference driver, which
1590 	 * always sets SI4126_GAIN to 0.
1591 	 */
1592 	gain = LSHIFT(((mhz - 374) > 2047) ? 1 : 0, SI4126_GAIN_KP2_MASK);
1593 
1594 	atw_si4126_write(sc, SI4126_GAIN, gain);
1595 
1596 	/* XIN = 44MHz.
1597 	 *
1598 	 * If XINDIV2 = 1, IF = N/(2 * R) * XIN.  I choose N = 1496,
1599 	 * R = 44 so that 1496/(2 * 44) * 44MHz = 748MHz.
1600 	 *
1601 	 * If XINDIV2 = 0, IF = N/R * XIN.  I choose N = 1496, R = 88
1602 	 * so that 1496/88 * 44MHz = 748MHz.
1603 	 */
1604 	atw_si4126_write(sc, SI4126_IFN, 1496);
1605 
1606 	atw_si4126_write(sc, SI4126_IFR, R);
1607 
1608 #ifndef ATW_REFSLAVE
1609 	/* Set RF1 arbitrarily. DO NOT configure RF1 after RF2, because
1610 	 * then RF1 becomes the active RF synthesizer, even on the Si4126,
1611 	 * which has no RF1!
1612 	 */
1613 	atw_si4126_write(sc, SI4126_RF1R, R);
1614 
1615 	atw_si4126_write(sc, SI4126_RF1N, mhz - 374);
1616 #endif
1617 
1618 	/* N/R * XIN = RF. XIN = 44MHz. We desire RF = mhz - IF,
1619 	 * where IF = 374MHz.  Let's divide XIN to 1MHz. So R = 44.
1620 	 * Now let's multiply it to mhz. So mhz - IF = N.
1621 	 */
1622 	atw_si4126_write(sc, SI4126_RF2R, R);
1623 
1624 	atw_si4126_write(sc, SI4126_RF2N, mhz - 374);
1625 
1626 	/* wait 100us from power-up for RF, IF to settle */
1627 	DELAY(100);
1628 
1629 	gpio = ATW_READ(sc, ATW_GPIO);
1630 	gpio &= ~(ATW_GPIO_EN_MASK|ATW_GPIO_O_MASK|ATW_GPIO_I_MASK);
1631 	gpio |= LSHIFT(1, ATW_GPIO_EN_MASK);
1632 
1633 	if ((sc->sc_if.if_flags & IFF_LINK1) != 0 && chan != 14) {
1634 		/* Set a Prism RF front-end to a special mode for channel 14?
1635 		 *
1636 		 * Apparently the SMC2635W needs this, although I don't think
1637 		 * it has a Prism RF.
1638 		 */
1639 		gpio |= LSHIFT(1, ATW_GPIO_O_MASK);
1640 	}
1641 	ATW_WRITE(sc, ATW_GPIO, gpio);
1642 
1643 #ifdef ATW_SYNDEBUG
1644 	atw_si4126_print(sc);
1645 #endif /* ATW_SYNDEBUG */
1646 }
1647 
1648 /* Baseline initialization of RF3000 BBP: set CCA mode and enable antenna
1649  * diversity.
1650  *
1651  * !!!
1652  * !!! Call this w/ Tx/Rx suspended, atw_idle(, ATW_NAR_ST|ATW_NAR_SR).
1653  * !!!
1654  */
1655 static int
1656 atw_rf3000_init(struct atw_softc *sc)
1657 {
1658 	int rc = 0;
1659 
1660 	atw_bbp_io_enable(sc, 1);
1661 
1662 	/* CCA is acquisition sensitive */
1663 	rc = atw_rf3000_write(sc, RF3000_CCACTL,
1664 	    LSHIFT(RF3000_CCACTL_MODE_BOTH, RF3000_CCACTL_MODE_MASK));
1665 
1666 	if (rc != 0)
1667 		goto out;
1668 
1669 	/* enable diversity */
1670 	rc = atw_rf3000_write(sc, RF3000_DIVCTL, RF3000_DIVCTL_ENABLE);
1671 
1672 	if (rc != 0)
1673 		goto out;
1674 
1675 	/* sensible setting from a binary-only driver */
1676 	rc = atw_rf3000_write(sc, RF3000_GAINCTL,
1677 	    LSHIFT(0x1d, RF3000_GAINCTL_TXVGC_MASK));
1678 
1679 	if (rc != 0)
1680 		goto out;
1681 
1682 	/* magic from a binary-only driver */
1683 	rc = atw_rf3000_write(sc, RF3000_LOGAINCAL,
1684 	    LSHIFT(0x38, RF3000_LOGAINCAL_CAL_MASK));
1685 
1686 	if (rc != 0)
1687 		goto out;
1688 
1689 	rc = atw_rf3000_write(sc, RF3000_HIGAINCAL, RF3000_HIGAINCAL_DSSSPAD);
1690 
1691 	if (rc != 0)
1692 		goto out;
1693 
1694 	/* XXX Reference driver remarks that Abocom sets this to 50.
1695 	 * Meaning 0x50, I think....  50 = 0x32, which would set a bit
1696 	 * in the "reserved" area of register RF3000_OPTIONS1.
1697 	 */
1698 	rc = atw_rf3000_write(sc, RF3000_OPTIONS1, sc->sc_rf3000_options1);
1699 
1700 	if (rc != 0)
1701 		goto out;
1702 
1703 	rc = atw_rf3000_write(sc, RF3000_OPTIONS2, sc->sc_rf3000_options2);
1704 
1705 	if (rc != 0)
1706 		goto out;
1707 
1708 out:
1709 	atw_bbp_io_enable(sc, 0);
1710 	return rc;
1711 }
1712 
1713 #ifdef ATW_BBPDEBUG
1714 static void
1715 atw_rf3000_print(struct atw_softc *sc)
1716 {
1717 	struct ifnet *ifp = &sc->sc_ic.ic_if;
1718 	u_int addr, val;
1719 
1720 	if (atw_debug < 3 || (ifp->if_flags & IFF_DEBUG) == 0)
1721 		return;
1722 
1723 	for (addr = 0x01; addr <= 0x15; addr++) {
1724 		printf("%s: bbp[%d] = \n", sc->sc_dev.dv_xname, addr);
1725 		if (atw_rf3000_read(sc, addr, &val) != 0) {
1726 			printf("<unknown> (quitting print-out)\n");
1727 			break;
1728 		}
1729 		printf("%08x\n", val);
1730 	}
1731 }
1732 #endif /* ATW_BBPDEBUG */
1733 
1734 /* Set the power settings on the BBP for channel `chan'. */
1735 static int
1736 atw_rf3000_tune(struct atw_softc *sc, u_int chan)
1737 {
1738 	int rc = 0;
1739 	u_int32_t reg;
1740 	u_int16_t txpower, lpf_cutoff, lna_gs_thresh;
1741 
1742 	txpower = sc->sc_srom[ATW_SR_TXPOWER(chan)];
1743 	lpf_cutoff = sc->sc_srom[ATW_SR_LPF_CUTOFF(chan)];
1744 	lna_gs_thresh = sc->sc_srom[ATW_SR_LNA_GS_THRESH(chan)];
1745 
1746 	/* odd channels: LSB, even channels: MSB */
1747 	if (chan % 2 == 1) {
1748 		txpower &= 0xFF;
1749 		lpf_cutoff &= 0xFF;
1750 		lna_gs_thresh &= 0xFF;
1751 	} else {
1752 		txpower >>= 8;
1753 		lpf_cutoff >>= 8;
1754 		lna_gs_thresh >>= 8;
1755 	}
1756 
1757 #ifdef ATW_BBPDEBUG
1758 	atw_rf3000_print(sc);
1759 #endif /* ATW_BBPDEBUG */
1760 
1761 	DPRINTF(sc, ("%s: chan %d txpower %02x, lpf_cutoff %02x, "
1762 	    "lna_gs_thresh %02x\n",
1763 	    sc->sc_dev.dv_xname, chan, txpower, lpf_cutoff, lna_gs_thresh));
1764 
1765 	atw_bbp_io_enable(sc, 1);
1766 
1767 	if ((rc = atw_rf3000_write(sc, RF3000_GAINCTL,
1768 	    LSHIFT(txpower, RF3000_GAINCTL_TXVGC_MASK))) != 0)
1769 		goto out;
1770 
1771 	if ((rc = atw_rf3000_write(sc, RF3000_LOGAINCAL, lpf_cutoff)) != 0)
1772 		goto out;
1773 
1774 	if ((rc = atw_rf3000_write(sc, RF3000_HIGAINCAL, lna_gs_thresh)) != 0)
1775 		goto out;
1776 
1777 	rc = atw_rf3000_write(sc, RF3000_OPTIONS1, 0x0);
1778 
1779 	if (rc != 0)
1780 		goto out;
1781 
1782 	rc = atw_rf3000_write(sc, RF3000_OPTIONS2, RF3000_OPTIONS2_LNAGS_DELAY);
1783 
1784 	if (rc != 0)
1785 		goto out;
1786 
1787 #ifdef ATW_BBPDEBUG
1788 	atw_rf3000_print(sc);
1789 #endif /* ATW_BBPDEBUG */
1790 
1791 out:
1792 	atw_bbp_io_enable(sc, 0);
1793 
1794 	/* set beacon, rts, atim transmit power */
1795 	reg = ATW_READ(sc, ATW_PLCPHD);
1796 	reg &= ~ATW_PLCPHD_SERVICE_MASK;
1797 	reg |= LSHIFT(LSHIFT(txpower, RF3000_GAINCTL_TXVGC_MASK),
1798 	    ATW_PLCPHD_SERVICE_MASK);
1799 	ATW_WRITE(sc, ATW_PLCPHD, reg);
1800 	DELAY(atw_plcphd_delay);
1801 
1802 	return rc;
1803 }
1804 
1805 /* Write a register on the RF3000 baseband processor using the
1806  * registers provided by the ADM8211 for this purpose.
1807  *
1808  * Return 0 on success.
1809  */
1810 static int
1811 atw_rf3000_write(struct atw_softc *sc, u_int addr, u_int val)
1812 {
1813 	u_int32_t reg;
1814 	int i;
1815 
1816 	reg = sc->sc_bbpctl_wr |
1817 	     LSHIFT(val & 0xff, ATW_BBPCTL_DATA_MASK) |
1818 	     LSHIFT(addr & 0x7f, ATW_BBPCTL_ADDR_MASK);
1819 
1820 	for (i = 20000 / atw_pseudo_milli; --i >= 0; ) {
1821 		ATW_WRITE(sc, ATW_BBPCTL, reg);
1822 		DELAY(2 * atw_pseudo_milli);
1823 		if (ATW_ISSET(sc, ATW_BBPCTL, ATW_BBPCTL_WR) == 0)
1824 			break;
1825 	}
1826 
1827 	if (i < 0) {
1828 		printf("%s: BBPCTL still busy\n", sc->sc_dev.dv_xname);
1829 		return ETIMEDOUT;
1830 	}
1831 	return 0;
1832 }
1833 
1834 /* Read a register on the RF3000 baseband processor using the registers
1835  * the ADM8211 provides for this purpose.
1836  *
1837  * The 7-bit register address is addr.  Record the 8-bit data in the register
1838  * in *val.
1839  *
1840  * Return 0 on success.
1841  *
1842  * XXX This does not seem to work. The ADM8211 must require more or
1843  * different magic to read the chip than to write it. Possibly some
1844  * of the magic I have derived from a binary-only driver concerns
1845  * the "chip address" (see the RF3000 manual).
1846  */
1847 #ifdef ATW_BBPDEBUG
1848 static int
1849 atw_rf3000_read(struct atw_softc *sc, u_int addr, u_int *val)
1850 {
1851 	u_int32_t reg;
1852 	int i;
1853 
1854 	for (i = 1000; --i >= 0; ) {
1855 		if (ATW_ISSET(sc, ATW_BBPCTL, ATW_BBPCTL_RD|ATW_BBPCTL_WR) == 0)
1856 			break;
1857 		DELAY(100);
1858 	}
1859 
1860 	if (i < 0) {
1861 		printf("%s: start atw_rf3000_read, BBPCTL busy\n",
1862 		    sc->sc_dev.dv_xname);
1863 		return ETIMEDOUT;
1864 	}
1865 
1866 	reg = sc->sc_bbpctl_rd | LSHIFT(addr & 0x7f, ATW_BBPCTL_ADDR_MASK);
1867 
1868 	ATW_WRITE(sc, ATW_BBPCTL, reg);
1869 
1870 	for (i = 1000; --i >= 0; ) {
1871 		DELAY(100);
1872 		if (ATW_ISSET(sc, ATW_BBPCTL, ATW_BBPCTL_RD) == 0)
1873 			break;
1874 	}
1875 
1876 	ATW_CLR(sc, ATW_BBPCTL, ATW_BBPCTL_RD);
1877 
1878 	if (i < 0) {
1879 		printf("%s: atw_rf3000_read wrote %08x; BBPCTL still busy\n",
1880 		    sc->sc_dev.dv_xname, reg);
1881 		return ETIMEDOUT;
1882 	}
1883 	if (val != NULL)
1884 		*val = MASK_AND_RSHIFT(reg, ATW_BBPCTL_DATA_MASK);
1885 	return 0;
1886 }
1887 #endif /* ATW_BBPDEBUG */
1888 
1889 /* Write a register on the Si4126 RF/IF synthesizer using the registers
1890  * provided by the ADM8211 for that purpose.
1891  *
1892  * val is 18 bits of data, and val is the 4-bit address of the register.
1893  *
1894  * Return 0 on success.
1895  */
1896 static void
1897 atw_si4126_write(struct atw_softc *sc, u_int addr, u_int val)
1898 {
1899 	uint32_t bits, mask, reg;
1900 	const int nbits = 22;
1901 
1902 	KASSERT((addr & ~PRESHIFT(SI4126_TWI_ADDR_MASK)) == 0);
1903 	KASSERT((val & ~PRESHIFT(SI4126_TWI_DATA_MASK)) == 0);
1904 
1905 	bits = LSHIFT(val, SI4126_TWI_DATA_MASK) |
1906 	       LSHIFT(addr, SI4126_TWI_ADDR_MASK);
1907 
1908 	reg = ATW_SYNRF_SELSYN;
1909 	/* reference driver: reset Si4126 serial bus to initial
1910 	 * conditions?
1911 	 */
1912 	ATW_WRITE(sc, ATW_SYNRF, reg | ATW_SYNRF_LEIF);
1913 	ATW_WRITE(sc, ATW_SYNRF, reg);
1914 
1915 	for (mask = BIT(nbits - 1); mask != 0; mask >>= 1) {
1916 		if ((bits & mask) != 0)
1917 			reg |= ATW_SYNRF_SYNDATA;
1918 		else
1919 			reg &= ~ATW_SYNRF_SYNDATA;
1920 		ATW_WRITE(sc, ATW_SYNRF, reg);
1921 		ATW_WRITE(sc, ATW_SYNRF, reg | ATW_SYNRF_SYNCLK);
1922 		ATW_WRITE(sc, ATW_SYNRF, reg);
1923 	}
1924 	ATW_WRITE(sc, ATW_SYNRF, reg | ATW_SYNRF_LEIF);
1925 	ATW_WRITE(sc, ATW_SYNRF, 0x0);
1926 }
1927 
1928 /* Read 18-bit data from the 4-bit address addr in Si4126
1929  * RF synthesizer and write the data to *val. Return 0 on success.
1930  *
1931  * XXX This does not seem to work. The ADM8211 must require more or
1932  * different magic to read the chip than to write it.
1933  */
1934 #ifdef ATW_SYNDEBUG
1935 static int
1936 atw_si4126_read(struct atw_softc *sc, u_int addr, u_int *val)
1937 {
1938 	u_int32_t reg;
1939 	int i;
1940 
1941 	KASSERT((addr & ~PRESHIFT(SI4126_TWI_ADDR_MASK)) == 0);
1942 
1943 	for (i = 1000; --i >= 0; ) {
1944 		if (ATW_ISSET(sc, ATW_SYNCTL, ATW_SYNCTL_RD|ATW_SYNCTL_WR) == 0)
1945 			break;
1946 		DELAY(100);
1947 	}
1948 
1949 	if (i < 0) {
1950 		printf("%s: start atw_si4126_read, SYNCTL busy\n",
1951 		    sc->sc_dev.dv_xname);
1952 		return ETIMEDOUT;
1953 	}
1954 
1955 	reg = sc->sc_synctl_rd | LSHIFT(addr, ATW_SYNCTL_DATA_MASK);
1956 
1957 	ATW_WRITE(sc, ATW_SYNCTL, reg);
1958 
1959 	for (i = 1000; --i >= 0; ) {
1960 		DELAY(100);
1961 		if (ATW_ISSET(sc, ATW_SYNCTL, ATW_SYNCTL_RD) == 0)
1962 			break;
1963 	}
1964 
1965 	ATW_CLR(sc, ATW_SYNCTL, ATW_SYNCTL_RD);
1966 
1967 	if (i < 0) {
1968 		printf("%s: atw_si4126_read wrote %#08x, SYNCTL still busy\n",
1969 		    sc->sc_dev.dv_xname, reg);
1970 		return ETIMEDOUT;
1971 	}
1972 	if (val != NULL)
1973 		*val = MASK_AND_RSHIFT(ATW_READ(sc, ATW_SYNCTL),
1974 		                       ATW_SYNCTL_DATA_MASK);
1975 	return 0;
1976 }
1977 #endif /* ATW_SYNDEBUG */
1978 
1979 /* XXX is the endianness correct? test. */
1980 #define	atw_calchash(addr) \
1981 	(ether_crc32_le((addr), IEEE80211_ADDR_LEN) & BITS(5, 0))
1982 
1983 /*
1984  * atw_filter_setup:
1985  *
1986  *	Set the ADM8211's receive filter.
1987  */
1988 static void
1989 atw_filter_setup(struct atw_softc *sc)
1990 {
1991 	struct ieee80211com *ic = &sc->sc_ic;
1992 	struct ethercom *ec = &ic->ic_ec;
1993 	struct ifnet *ifp = &sc->sc_ic.ic_if;
1994 	int hash;
1995 	u_int32_t hashes[2];
1996 	struct ether_multi *enm;
1997 	struct ether_multistep step;
1998 
1999 	/* According to comments in tlp_al981_filter_setup
2000 	 * (dev/ic/tulip.c) the ADMtek AL981 does not like for its
2001 	 * multicast filter to be set while it is running.  Hopefully
2002 	 * the ADM8211 is not the same!
2003 	 */
2004 	if ((ifp->if_flags & IFF_RUNNING) != 0)
2005 		atw_idle(sc, ATW_NAR_SR);
2006 
2007 	sc->sc_opmode &= ~(ATW_NAR_PR|ATW_NAR_MM);
2008 
2009 	/* XXX in scan mode, do not filter packets.  Maybe this is
2010 	 * unnecessary.
2011 	 */
2012 	if (ic->ic_state == IEEE80211_S_SCAN ||
2013 	    (ifp->if_flags & IFF_PROMISC) != 0) {
2014 		sc->sc_opmode |= ATW_NAR_PR;
2015 		goto allmulti;
2016 	}
2017 
2018 	hashes[0] = hashes[1] = 0x0;
2019 
2020 	/*
2021 	 * Program the 64-bit multicast hash filter.
2022 	 */
2023 	ETHER_FIRST_MULTI(step, ec, enm);
2024 	while (enm != NULL) {
2025 		if (memcmp(enm->enm_addrlo, enm->enm_addrhi,
2026 		    ETHER_ADDR_LEN) != 0)
2027 			goto allmulti;
2028 
2029 		hash = atw_calchash(enm->enm_addrlo);
2030 		hashes[hash >> 5] |= 1 << (hash & 0x1f);
2031 		ETHER_NEXT_MULTI(step, enm);
2032 		sc->sc_opmode |= ATW_NAR_MM;
2033 	}
2034 	ifp->if_flags &= ~IFF_ALLMULTI;
2035 	goto setit;
2036 
2037 allmulti:
2038 	sc->sc_opmode |= ATW_NAR_MM;
2039 	ifp->if_flags |= IFF_ALLMULTI;
2040 	hashes[0] = hashes[1] = 0xffffffff;
2041 
2042 setit:
2043 	ATW_WRITE(sc, ATW_MAR0, hashes[0]);
2044 	ATW_WRITE(sc, ATW_MAR1, hashes[1]);
2045 	ATW_WRITE(sc, ATW_NAR, sc->sc_opmode);
2046 	DELAY(atw_nar_delay);
2047 
2048 	DPRINTF(sc, ("%s: ATW_NAR %08x opmode %08x\n", sc->sc_dev.dv_xname,
2049 	    ATW_READ(sc, ATW_NAR), sc->sc_opmode));
2050 }
2051 
2052 /* Tell the ADM8211 our preferred BSSID. The ADM8211 must match
2053  * a beacon's BSSID and SSID against the preferred BSSID and SSID
2054  * before it will raise ATW_INTR_LINKON. When the ADM8211 receives
2055  * no beacon with the preferred BSSID and SSID in the number of
2056  * beacon intervals given in ATW_BPLI, then it raises ATW_INTR_LINKOFF.
2057  */
2058 static void
2059 atw_write_bssid(struct atw_softc *sc)
2060 {
2061 	struct ieee80211com *ic = &sc->sc_ic;
2062 	u_int8_t *bssid;
2063 
2064 	bssid = ic->ic_bss->ni_bssid;
2065 
2066 	ATW_WRITE(sc, ATW_BSSID0,
2067 	    LSHIFT(bssid[0], ATW_BSSID0_BSSIDB0_MASK) |
2068 	    LSHIFT(bssid[1], ATW_BSSID0_BSSIDB1_MASK) |
2069 	    LSHIFT(bssid[2], ATW_BSSID0_BSSIDB2_MASK) |
2070 	    LSHIFT(bssid[3], ATW_BSSID0_BSSIDB3_MASK));
2071 
2072 	ATW_WRITE(sc, ATW_ABDA1,
2073 	    (ATW_READ(sc, ATW_ABDA1) &
2074 	    ~(ATW_ABDA1_BSSIDB4_MASK|ATW_ABDA1_BSSIDB5_MASK)) |
2075 	    LSHIFT(bssid[4], ATW_ABDA1_BSSIDB4_MASK) |
2076 	    LSHIFT(bssid[5], ATW_ABDA1_BSSIDB5_MASK));
2077 
2078 	DPRINTF(sc, ("%s: BSSID %s -> ", sc->sc_dev.dv_xname,
2079 	    ether_sprintf(sc->sc_bssid)));
2080 	DPRINTF(sc, ("%s\n", ether_sprintf(bssid)));
2081 
2082 	memcpy(sc->sc_bssid, bssid, sizeof(sc->sc_bssid));
2083 }
2084 
2085 /* Write buflen bytes from buf to SRAM starting at the SRAM's ofs'th
2086  * 16-bit word.
2087  */
2088 static void
2089 atw_write_sram(struct atw_softc *sc, u_int ofs, u_int8_t *buf, u_int buflen)
2090 {
2091 	u_int i;
2092 	u_int8_t *ptr;
2093 
2094 	memcpy(&sc->sc_sram[ofs], buf, buflen);
2095 
2096 	KASSERT(ofs % 2 == 0 && buflen % 2 == 0);
2097 
2098 	KASSERT(buflen + ofs <= sc->sc_sramlen);
2099 
2100 	ptr = &sc->sc_sram[ofs];
2101 
2102 	for (i = 0; i < buflen; i += 2) {
2103 		ATW_WRITE(sc, ATW_WEPCTL, ATW_WEPCTL_WR |
2104 		    LSHIFT((ofs + i) / 2, ATW_WEPCTL_TBLADD_MASK));
2105 		DELAY(atw_writewep_delay);
2106 
2107 		ATW_WRITE(sc, ATW_WESK,
2108 		    LSHIFT((ptr[i + 1] << 8) | ptr[i], ATW_WESK_DATA_MASK));
2109 		DELAY(atw_writewep_delay);
2110 	}
2111 	ATW_WRITE(sc, ATW_WEPCTL, sc->sc_wepctl); /* restore WEP condition */
2112 
2113 	if (sc->sc_if.if_flags & IFF_DEBUG) {
2114 		int n_octets = 0;
2115 		printf("%s: wrote %d bytes at 0x%x wepctl 0x%08x\n",
2116 		    sc->sc_dev.dv_xname, buflen, ofs, sc->sc_wepctl);
2117 		for (i = 0; i < buflen; i++) {
2118 			printf(" %02x", ptr[i]);
2119 			if (++n_octets % 24 == 0)
2120 				printf("\n");
2121 		}
2122 		if (n_octets % 24 != 0)
2123 			printf("\n");
2124 	}
2125 }
2126 
2127 /* Write WEP keys from the ieee80211com to the ADM8211's SRAM. */
2128 static void
2129 atw_write_wep(struct atw_softc *sc)
2130 {
2131 	struct ieee80211com *ic = &sc->sc_ic;
2132 	/* SRAM shared-key record format: key0 flags key1 ... key12 */
2133 	u_int8_t buf[IEEE80211_WEP_NKID]
2134 	            [1 /* key[0] */ + 1 /* flags */ + 12 /* key[1 .. 12] */];
2135 	u_int32_t reg;
2136 	int i;
2137 
2138 	sc->sc_wepctl = 0;
2139 	ATW_WRITE(sc, ATW_WEPCTL, sc->sc_wepctl);
2140 
2141 	if ((ic->ic_flags & IEEE80211_F_PRIVACY) == 0)
2142 		return;
2143 
2144 	memset(&buf[0][0], 0, sizeof(buf));
2145 
2146 	for (i = 0; i < IEEE80211_WEP_NKID; i++) {
2147 		if (ic->ic_nw_keys[i].wk_len > 5) {
2148 			buf[i][1] = ATW_WEP_ENABLED | ATW_WEP_104BIT;
2149 		} else if (ic->ic_nw_keys[i].wk_len != 0) {
2150 			buf[i][1] = ATW_WEP_ENABLED;
2151 		} else {
2152 			buf[i][1] = 0;
2153 			continue;
2154 		}
2155 		buf[i][0] = ic->ic_nw_keys[i].wk_key[0];
2156 		memcpy(&buf[i][2], &ic->ic_nw_keys[i].wk_key[1],
2157 		    ic->ic_nw_keys[i].wk_len - 1);
2158 	}
2159 
2160 	reg = ATW_READ(sc, ATW_MACTEST);
2161 	reg |= ATW_MACTEST_MMI_USETXCLK | ATW_MACTEST_FORCE_KEYID;
2162 	reg &= ~ATW_MACTEST_KEYID_MASK;
2163 	reg |= LSHIFT(ic->ic_wep_txkey, ATW_MACTEST_KEYID_MASK);
2164 	ATW_WRITE(sc, ATW_MACTEST, reg);
2165 
2166 	sc->sc_wepctl = ATW_WEPCTL_WEPENABLE;
2167 
2168 	switch (sc->sc_rev) {
2169 	case ATW_REVISION_AB:
2170 	case ATW_REVISION_AF:
2171 		/* Bypass WEP on Rx. */
2172 		sc->sc_wepctl |= ATW_WEPCTL_WEPRXBYP;
2173 		break;
2174 	default:
2175 		break;
2176 	}
2177 
2178 	atw_write_sram(sc, ATW_SRAM_ADDR_SHARED_KEY, (u_int8_t*)&buf[0][0],
2179 	    sizeof(buf));
2180 }
2181 
2182 static void
2183 atw_change_ibss(struct atw_softc *sc)
2184 {
2185 	atw_predict_beacon(sc);
2186 	atw_write_bssid(sc);
2187 	atw_start_beacon(sc, 1);
2188 }
2189 
2190 static void
2191 atw_recv_mgmt(struct ieee80211com *ic, struct mbuf *m,
2192     struct ieee80211_node *ni, int subtype, int rssi, u_int32_t rstamp)
2193 {
2194 	struct atw_softc *sc = (struct atw_softc*)ic->ic_softc;
2195 
2196 	/* The ADM8211A answers probe requests. TBD ADM8211B/C. */
2197 	if (subtype == IEEE80211_FC0_SUBTYPE_PROBE_REQ)
2198 		return;
2199 
2200 	(*sc->sc_recv_mgmt)(ic, m, ni, subtype, rssi, rstamp);
2201 
2202 	switch (subtype) {
2203 	case IEEE80211_FC0_SUBTYPE_PROBE_RESP:
2204 	case IEEE80211_FC0_SUBTYPE_BEACON:
2205 		if (ic->ic_opmode != IEEE80211_M_IBSS ||
2206 		    ic->ic_state != IEEE80211_S_RUN)
2207 			break;
2208 		if (ieee80211_ibss_merge(ic, ni, atw_get_tsft(sc)) == ENETRESET)
2209 			atw_change_ibss(sc);
2210 		break;
2211 	default:
2212 		break;
2213 	}
2214 	return;
2215 }
2216 
2217 /* Write the SSID in the ieee80211com to the SRAM on the ADM8211.
2218  * In ad hoc mode, the SSID is written to the beacons sent by the
2219  * ADM8211. In both ad hoc and infrastructure mode, beacons received
2220  * with matching SSID affect ATW_INTR_LINKON/ATW_INTR_LINKOFF
2221  * indications.
2222  */
2223 static void
2224 atw_write_ssid(struct atw_softc *sc)
2225 {
2226 	struct ieee80211com *ic = &sc->sc_ic;
2227 	/* 34 bytes are reserved in ADM8211 SRAM for the SSID, but
2228 	 * it only expects the element length, not its ID.
2229 	 */
2230 	u_int8_t buf[roundup(1 /* length */ + IEEE80211_NWID_LEN, 2)];
2231 
2232 	memset(buf, 0, sizeof(buf));
2233 	buf[0] = ic->ic_bss->ni_esslen;
2234 	memcpy(&buf[1], ic->ic_bss->ni_essid, ic->ic_bss->ni_esslen);
2235 
2236 	atw_write_sram(sc, ATW_SRAM_ADDR_SSID, buf,
2237 	    roundup(1 + ic->ic_bss->ni_esslen, 2));
2238 }
2239 
2240 /* Write the supported rates in the ieee80211com to the SRAM of the ADM8211.
2241  * In ad hoc mode, the supported rates are written to beacons sent by the
2242  * ADM8211.
2243  */
2244 static void
2245 atw_write_sup_rates(struct atw_softc *sc)
2246 {
2247 	struct ieee80211com *ic = &sc->sc_ic;
2248 	/* 14 bytes are probably (XXX) reserved in the ADM8211 SRAM for
2249 	 * supported rates
2250 	 */
2251 	u_int8_t buf[roundup(1 /* length */ + IEEE80211_RATE_SIZE, 2)];
2252 
2253 	memset(buf, 0, sizeof(buf));
2254 
2255 	buf[0] = ic->ic_bss->ni_rates.rs_nrates;
2256 
2257 	memcpy(&buf[1], ic->ic_bss->ni_rates.rs_rates,
2258 	    ic->ic_bss->ni_rates.rs_nrates);
2259 
2260 	atw_write_sram(sc, ATW_SRAM_ADDR_SUPRATES, buf, sizeof(buf));
2261 }
2262 
2263 /* Start/stop sending beacons. */
2264 void
2265 atw_start_beacon(struct atw_softc *sc, int start)
2266 {
2267 	struct ieee80211com *ic = &sc->sc_ic;
2268 	uint16_t chan;
2269 	uint32_t bcnt, bpli, cap0, cap1, capinfo;
2270 	size_t len;
2271 
2272 	if (ATW_IS_ENABLED(sc) == 0)
2273 		return;
2274 
2275 	/* start beacons */
2276 	len = sizeof(struct ieee80211_frame) +
2277 	    8 /* timestamp */ + 2 /* beacon interval */ +
2278 	    2 /* capability info */ +
2279 	    2 + ic->ic_bss->ni_esslen /* SSID element */ +
2280 	    2 + ic->ic_bss->ni_rates.rs_nrates /* rates element */ +
2281 	    3 /* DS parameters */ +
2282 	    IEEE80211_CRC_LEN;
2283 
2284 	bcnt = ATW_READ(sc, ATW_BCNT) & ~ATW_BCNT_BCNT_MASK;
2285 	cap0 = ATW_READ(sc, ATW_CAP0) & ~ATW_CAP0_CHN_MASK;
2286 	cap1 = ATW_READ(sc, ATW_CAP1) & ~ATW_CAP1_CAPI_MASK;
2287 
2288 	ATW_WRITE(sc, ATW_BCNT, bcnt);
2289 	ATW_WRITE(sc, ATW_CAP1, cap1);
2290 
2291 	if (!start)
2292 		return;
2293 
2294 	/* TBD use ni_capinfo */
2295 
2296 	capinfo = 0;
2297 	if (sc->sc_flags & ATWF_SHORT_PREAMBLE)
2298 		capinfo |= IEEE80211_CAPINFO_SHORT_PREAMBLE;
2299 	if (ic->ic_flags & IEEE80211_F_PRIVACY)
2300 		capinfo |= IEEE80211_CAPINFO_PRIVACY;
2301 
2302 	switch (ic->ic_opmode) {
2303 	case IEEE80211_M_IBSS:
2304 		len += 4; /* IBSS parameters */
2305 		capinfo |= IEEE80211_CAPINFO_IBSS;
2306 		break;
2307 	case IEEE80211_M_HOSTAP:
2308 		/* XXX 6-byte minimum TIM */
2309 		len += atw_beacon_len_adjust;
2310 		capinfo |= IEEE80211_CAPINFO_ESS;
2311 		break;
2312 	default:
2313 		return;
2314 	}
2315 
2316 	/* set listen interval
2317 	 * XXX do software units agree w/ hardware?
2318 	 */
2319 	bpli = LSHIFT(ic->ic_bss->ni_intval, ATW_BPLI_BP_MASK) |
2320 	    LSHIFT(ic->ic_lintval / ic->ic_bss->ni_intval, ATW_BPLI_LI_MASK);
2321 
2322 	chan = ieee80211_chan2ieee(ic, ic->ic_bss->ni_chan);
2323 
2324 	bcnt |= LSHIFT(len, ATW_BCNT_BCNT_MASK);
2325 	cap0 |= LSHIFT(chan, ATW_CAP0_CHN_MASK);
2326 	cap1 |= LSHIFT(capinfo, ATW_CAP1_CAPI_MASK);
2327 
2328 	ATW_WRITE(sc, ATW_BCNT, bcnt);
2329 	ATW_WRITE(sc, ATW_BPLI, bpli);
2330 	ATW_WRITE(sc, ATW_CAP0, cap0);
2331 	ATW_WRITE(sc, ATW_CAP1, cap1);
2332 
2333 	DPRINTF(sc, ("%s: atw_start_beacon reg[ATW_BCNT] = %08x\n",
2334 	    sc->sc_dev.dv_xname, bcnt));
2335 
2336 	DPRINTF(sc, ("%s: atw_start_beacon reg[ATW_CAP1] = %08x\n",
2337 	    sc->sc_dev.dv_xname, cap1));
2338 }
2339 
2340 /* Return the 32 lsb of the last TSFT divisible by ival. */
2341 static __inline uint32_t
2342 atw_last_even_tsft(uint32_t tsfth, uint32_t tsftl, uint32_t ival)
2343 {
2344 	/* Following the reference driver's lead, I compute
2345 	 *
2346 	 *   (uint32_t)((((uint64_t)tsfth << 32) | tsftl) % ival)
2347 	 *
2348 	 * without using 64-bit arithmetic, using the following
2349 	 * relationship:
2350 	 *
2351 	 *     (0x100000000 * H + L) % m
2352 	 *   = ((0x100000000 % m) * H + L) % m
2353 	 *   = (((0xffffffff + 1) % m) * H + L) % m
2354 	 *   = ((0xffffffff % m + 1 % m) * H + L) % m
2355 	 *   = ((0xffffffff % m + 1) * H + L) % m
2356 	 */
2357 	return ((0xFFFFFFFF % ival + 1) * tsfth + tsftl) % ival;
2358 }
2359 
2360 static uint64_t
2361 atw_get_tsft(struct atw_softc *sc)
2362 {
2363 	int i;
2364 	uint32_t tsfth, tsftl;
2365 	for (i = 0; i < 2; i++) {
2366 		tsfth = ATW_READ(sc, ATW_TSFTH);
2367 		tsftl = ATW_READ(sc, ATW_TSFTL);
2368 		if (ATW_READ(sc, ATW_TSFTH) == tsfth)
2369 			break;
2370 	}
2371 	return ((uint64_t)tsfth << 32) | tsftl;
2372 }
2373 
2374 /* If we've created an IBSS, write the TSF time in the ADM8211 to
2375  * the ieee80211com.
2376  *
2377  * Predict the next target beacon transmission time (TBTT) and
2378  * write it to the ADM8211.
2379  */
2380 static void
2381 atw_predict_beacon(struct atw_softc *sc)
2382 {
2383 #define TBTTOFS 20 /* TU */
2384 
2385 	struct ieee80211com *ic = &sc->sc_ic;
2386 	uint64_t tsft;
2387 	uint32_t ival, past_even, tbtt, tsfth, tsftl;
2388 	union {
2389 		uint64_t	word;
2390 		uint8_t		tstamp[8];
2391 	} u;
2392 
2393 	if ((ic->ic_opmode == IEEE80211_M_HOSTAP) ||
2394 	    ((ic->ic_opmode == IEEE80211_M_IBSS) &&
2395 	     (ic->ic_flags & IEEE80211_F_SIBSS))) {
2396 		tsft = atw_get_tsft(sc);
2397 		u.word = htole64(tsft);
2398 		(void)memcpy(&ic->ic_bss->ni_tstamp[0], &u.tstamp[0],
2399 		    sizeof(ic->ic_bss->ni_tstamp));
2400 	} else {
2401 		(void)memcpy(&u, &ic->ic_bss->ni_tstamp[0], sizeof(u));
2402 		tsft = le64toh(u.word);
2403 	}
2404 
2405 	ival = ic->ic_bss->ni_intval * IEEE80211_DUR_TU;
2406 
2407 	tsftl = tsft & 0xFFFFFFFF;
2408 	tsfth = tsft >> 32;
2409 
2410 	/* We sent/received the last beacon `past' microseconds
2411 	 * after the interval divided the TSF timer.
2412 	 */
2413 	past_even = tsftl - atw_last_even_tsft(tsfth, tsftl, ival);
2414 
2415 	/* Skip ten beacons so that the TBTT cannot pass before
2416 	 * we've programmed it.  Ten is an arbitrary number.
2417 	 */
2418 	tbtt = past_even + ival * 10;
2419 
2420 	ATW_WRITE(sc, ATW_TOFS1,
2421 	    LSHIFT(1, ATW_TOFS1_TSFTOFSR_MASK) |
2422 	    LSHIFT(TBTTOFS, ATW_TOFS1_TBTTOFS_MASK) |
2423 	    LSHIFT(MASK_AND_RSHIFT(tbtt - TBTTOFS * IEEE80211_DUR_TU,
2424 	        ATW_TBTTPRE_MASK), ATW_TOFS1_TBTTPRE_MASK));
2425 #undef TBTTOFS
2426 }
2427 
2428 static void
2429 atw_next_scan(void *arg)
2430 {
2431 	struct atw_softc *sc = arg;
2432 	struct ieee80211com *ic = &sc->sc_ic;
2433 	int s;
2434 
2435 	/* don't call atw_start w/o network interrupts blocked */
2436 	s = splnet();
2437 	if (ic->ic_state == IEEE80211_S_SCAN)
2438 		ieee80211_next_scan(ic);
2439 	splx(s);
2440 }
2441 
2442 /* Synchronize the hardware state with the software state. */
2443 static int
2444 atw_newstate(struct ieee80211com *ic, enum ieee80211_state nstate, int arg)
2445 {
2446 	struct ifnet *ifp = &ic->ic_if;
2447 	struct atw_softc *sc = ifp->if_softc;
2448 	enum ieee80211_state ostate;
2449 	int error;
2450 
2451 	ostate = ic->ic_state;
2452 
2453 	if (nstate == IEEE80211_S_INIT) {
2454 		callout_stop(&sc->sc_scan_ch);
2455 		sc->sc_cur_chan = IEEE80211_CHAN_ANY;
2456 		atw_start_beacon(sc, 0);
2457 		return (*sc->sc_newstate)(ic, nstate, arg);
2458 	}
2459 
2460 	if ((error = atw_tune(sc)) != 0)
2461 		return error;
2462 
2463 	switch (nstate) {
2464 	case IEEE80211_S_ASSOC:
2465 		break;
2466 	case IEEE80211_S_INIT:
2467 		panic("%s: unexpected state IEEE80211_S_INIT\n", __func__);
2468 		break;
2469 	case IEEE80211_S_SCAN:
2470 		callout_reset(&sc->sc_scan_ch, atw_dwelltime * hz / 1000,
2471 		    atw_next_scan, sc);
2472 
2473 		break;
2474 	case IEEE80211_S_RUN:
2475 		if (ic->ic_opmode == IEEE80211_M_STA)
2476 			break;
2477 		/*FALLTHROUGH*/
2478 	case IEEE80211_S_AUTH:
2479 		atw_write_bssid(sc);
2480 		atw_write_ssid(sc);
2481 		atw_write_sup_rates(sc);
2482 
2483 		if (ic->ic_opmode == IEEE80211_M_AHDEMO ||
2484 		    ic->ic_opmode == IEEE80211_M_MONITOR)
2485 			break;
2486 
2487 		/* set listen interval
2488 		 * XXX do software units agree w/ hardware?
2489 		 */
2490 		ATW_WRITE(sc, ATW_BPLI,
2491 		    LSHIFT(ic->ic_bss->ni_intval, ATW_BPLI_BP_MASK) |
2492 		    LSHIFT(ic->ic_lintval / ic->ic_bss->ni_intval,
2493 			   ATW_BPLI_LI_MASK));
2494 
2495 		DPRINTF(sc, ("%s: reg[ATW_BPLI] = %08x\n",
2496 		    sc->sc_dev.dv_xname, ATW_READ(sc, ATW_BPLI)));
2497 
2498 		atw_predict_beacon(sc);
2499 		break;
2500 	}
2501 
2502 	if (nstate != IEEE80211_S_SCAN)
2503 		callout_stop(&sc->sc_scan_ch);
2504 
2505 	if (nstate == IEEE80211_S_RUN &&
2506 	    (ic->ic_opmode == IEEE80211_M_HOSTAP ||
2507 	     ic->ic_opmode == IEEE80211_M_IBSS))
2508 		atw_start_beacon(sc, 1);
2509 	else
2510 		atw_start_beacon(sc, 0);
2511 
2512 	error = (*sc->sc_newstate)(ic, nstate, arg);
2513 
2514 	if (ostate == IEEE80211_S_INIT && nstate == IEEE80211_S_SCAN)
2515 		atw_write_bssid(sc);
2516 
2517 	return error;
2518 }
2519 
2520 /*
2521  * atw_add_rxbuf:
2522  *
2523  *	Add a receive buffer to the indicated descriptor.
2524  */
2525 int
2526 atw_add_rxbuf(struct atw_softc *sc, int idx)
2527 {
2528 	struct atw_rxsoft *rxs = &sc->sc_rxsoft[idx];
2529 	struct mbuf *m;
2530 	int error;
2531 
2532 	MGETHDR(m, M_DONTWAIT, MT_DATA);
2533 	if (m == NULL)
2534 		return (ENOBUFS);
2535 
2536 	MCLGET(m, M_DONTWAIT);
2537 	if ((m->m_flags & M_EXT) == 0) {
2538 		m_freem(m);
2539 		return (ENOBUFS);
2540 	}
2541 
2542 	if (rxs->rxs_mbuf != NULL)
2543 		bus_dmamap_unload(sc->sc_dmat, rxs->rxs_dmamap);
2544 
2545 	rxs->rxs_mbuf = m;
2546 
2547 	error = bus_dmamap_load(sc->sc_dmat, rxs->rxs_dmamap,
2548 	    m->m_ext.ext_buf, m->m_ext.ext_size, NULL,
2549 	    BUS_DMA_READ|BUS_DMA_NOWAIT);
2550 	if (error) {
2551 		printf("%s: can't load rx DMA map %d, error = %d\n",
2552 		    sc->sc_dev.dv_xname, idx, error);
2553 		panic("atw_add_rxbuf");	/* XXX */
2554 	}
2555 
2556 	bus_dmamap_sync(sc->sc_dmat, rxs->rxs_dmamap, 0,
2557 	    rxs->rxs_dmamap->dm_mapsize, BUS_DMASYNC_PREREAD);
2558 
2559 	ATW_INIT_RXDESC(sc, idx);
2560 
2561 	return (0);
2562 }
2563 
2564 /*
2565  * Release any queued transmit buffers.
2566  */
2567 void
2568 atw_txdrain(struct atw_softc *sc)
2569 {
2570 	struct atw_txsoft *txs;
2571 
2572 	while ((txs = SIMPLEQ_FIRST(&sc->sc_txdirtyq)) != NULL) {
2573 		SIMPLEQ_REMOVE_HEAD(&sc->sc_txdirtyq, txs_q);
2574 		if (txs->txs_mbuf != NULL) {
2575 			bus_dmamap_unload(sc->sc_dmat, txs->txs_dmamap);
2576 			m_freem(txs->txs_mbuf);
2577 			txs->txs_mbuf = NULL;
2578 		}
2579 		SIMPLEQ_INSERT_TAIL(&sc->sc_txfreeq, txs, txs_q);
2580 	}
2581 	sc->sc_tx_timer = 0;
2582 }
2583 
2584 /*
2585  * atw_stop:		[ ifnet interface function ]
2586  *
2587  *	Stop transmission on the interface.
2588  */
2589 void
2590 atw_stop(struct ifnet *ifp, int disable)
2591 {
2592 	struct atw_softc *sc = ifp->if_softc;
2593 	struct ieee80211com *ic = &sc->sc_ic;
2594 
2595 	ieee80211_new_state(ic, IEEE80211_S_INIT, -1);
2596 
2597 	/* Disable interrupts. */
2598 	ATW_WRITE(sc, ATW_IER, 0);
2599 
2600 	/* Stop the transmit and receive processes. */
2601 	sc->sc_opmode = 0;
2602 	ATW_WRITE(sc, ATW_NAR, 0);
2603 	DELAY(atw_nar_delay);
2604 	ATW_WRITE(sc, ATW_TDBD, 0);
2605 	ATW_WRITE(sc, ATW_TDBP, 0);
2606 	ATW_WRITE(sc, ATW_RDB, 0);
2607 
2608 	atw_txdrain(sc);
2609 
2610 	if (disable) {
2611 		atw_rxdrain(sc);
2612 		atw_disable(sc);
2613 	}
2614 
2615 	/*
2616 	 * Mark the interface down and cancel the watchdog timer.
2617 	 */
2618 	ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE);
2619 	ifp->if_timer = 0;
2620 
2621 	if (!disable)
2622 		atw_reset(sc);
2623 }
2624 
2625 /*
2626  * atw_rxdrain:
2627  *
2628  *	Drain the receive queue.
2629  */
2630 void
2631 atw_rxdrain(struct atw_softc *sc)
2632 {
2633 	struct atw_rxsoft *rxs;
2634 	int i;
2635 
2636 	for (i = 0; i < ATW_NRXDESC; i++) {
2637 		rxs = &sc->sc_rxsoft[i];
2638 		if (rxs->rxs_mbuf == NULL)
2639 			continue;
2640 		bus_dmamap_unload(sc->sc_dmat, rxs->rxs_dmamap);
2641 		m_freem(rxs->rxs_mbuf);
2642 		rxs->rxs_mbuf = NULL;
2643 	}
2644 }
2645 
2646 /*
2647  * atw_detach:
2648  *
2649  *	Detach an ADM8211 interface.
2650  */
2651 int
2652 atw_detach(struct atw_softc *sc)
2653 {
2654 	struct ifnet *ifp = &sc->sc_ic.ic_if;
2655 	struct atw_rxsoft *rxs;
2656 	struct atw_txsoft *txs;
2657 	int i;
2658 
2659 	/*
2660 	 * Succeed now if there isn't any work to do.
2661 	 */
2662 	if ((sc->sc_flags & ATWF_ATTACHED) == 0)
2663 		return (0);
2664 
2665 	callout_stop(&sc->sc_scan_ch);
2666 
2667 	ieee80211_ifdetach(ifp);
2668 	if_detach(ifp);
2669 
2670 	for (i = 0; i < ATW_NRXDESC; i++) {
2671 		rxs = &sc->sc_rxsoft[i];
2672 		if (rxs->rxs_mbuf != NULL) {
2673 			bus_dmamap_unload(sc->sc_dmat, rxs->rxs_dmamap);
2674 			m_freem(rxs->rxs_mbuf);
2675 			rxs->rxs_mbuf = NULL;
2676 		}
2677 		bus_dmamap_destroy(sc->sc_dmat, rxs->rxs_dmamap);
2678 	}
2679 	for (i = 0; i < ATW_TXQUEUELEN; i++) {
2680 		txs = &sc->sc_txsoft[i];
2681 		if (txs->txs_mbuf != NULL) {
2682 			bus_dmamap_unload(sc->sc_dmat, txs->txs_dmamap);
2683 			m_freem(txs->txs_mbuf);
2684 			txs->txs_mbuf = NULL;
2685 		}
2686 		bus_dmamap_destroy(sc->sc_dmat, txs->txs_dmamap);
2687 	}
2688 	bus_dmamap_unload(sc->sc_dmat, sc->sc_cddmamap);
2689 	bus_dmamap_destroy(sc->sc_dmat, sc->sc_cddmamap);
2690 	bus_dmamem_unmap(sc->sc_dmat, (caddr_t)sc->sc_control_data,
2691 	    sizeof(struct atw_control_data));
2692 	bus_dmamem_free(sc->sc_dmat, &sc->sc_cdseg, sc->sc_cdnseg);
2693 
2694 	shutdownhook_disestablish(sc->sc_sdhook);
2695 	powerhook_disestablish(sc->sc_powerhook);
2696 
2697 	if (sc->sc_srom)
2698 		free(sc->sc_srom, M_DEVBUF);
2699 
2700 	return (0);
2701 }
2702 
2703 /* atw_shutdown: make sure the interface is stopped at reboot time. */
2704 void
2705 atw_shutdown(void *arg)
2706 {
2707 	struct atw_softc *sc = arg;
2708 
2709 	atw_stop(&sc->sc_ic.ic_if, 1);
2710 }
2711 
2712 int
2713 atw_intr(void *arg)
2714 {
2715 	struct atw_softc *sc = arg;
2716 	struct ifnet *ifp = &sc->sc_ic.ic_if;
2717 	u_int32_t status, rxstatus, txstatus, linkstatus;
2718 	int handled = 0, txthresh;
2719 
2720 #ifdef DEBUG
2721 	if (ATW_IS_ENABLED(sc) == 0)
2722 		panic("%s: atw_intr: not enabled", sc->sc_dev.dv_xname);
2723 #endif
2724 
2725 	/*
2726 	 * If the interface isn't running, the interrupt couldn't
2727 	 * possibly have come from us.
2728 	 */
2729 	if ((ifp->if_flags & IFF_RUNNING) == 0 ||
2730 	    (sc->sc_dev.dv_flags & DVF_ACTIVE) == 0)
2731 		return (0);
2732 
2733 	for (;;) {
2734 		status = ATW_READ(sc, ATW_STSR);
2735 
2736 		if (status)
2737 			ATW_WRITE(sc, ATW_STSR, status);
2738 
2739 #ifdef ATW_DEBUG
2740 #define PRINTINTR(flag) do { \
2741 	if ((status & flag) != 0) { \
2742 		printf("%s" #flag, delim); \
2743 		delim = ","; \
2744 	} \
2745 } while (0)
2746 
2747 		if (atw_debug > 1 && status) {
2748 			const char *delim = "<";
2749 
2750 			printf("%s: reg[STSR] = %x",
2751 			    sc->sc_dev.dv_xname, status);
2752 
2753 			PRINTINTR(ATW_INTR_FBE);
2754 			PRINTINTR(ATW_INTR_LINKOFF);
2755 			PRINTINTR(ATW_INTR_LINKON);
2756 			PRINTINTR(ATW_INTR_RCI);
2757 			PRINTINTR(ATW_INTR_RDU);
2758 			PRINTINTR(ATW_INTR_REIS);
2759 			PRINTINTR(ATW_INTR_RPS);
2760 			PRINTINTR(ATW_INTR_TCI);
2761 			PRINTINTR(ATW_INTR_TDU);
2762 			PRINTINTR(ATW_INTR_TLT);
2763 			PRINTINTR(ATW_INTR_TPS);
2764 			PRINTINTR(ATW_INTR_TRT);
2765 			PRINTINTR(ATW_INTR_TUF);
2766 			PRINTINTR(ATW_INTR_BCNTC);
2767 			PRINTINTR(ATW_INTR_ATIME);
2768 			PRINTINTR(ATW_INTR_TBTT);
2769 			PRINTINTR(ATW_INTR_TSCZ);
2770 			PRINTINTR(ATW_INTR_TSFTF);
2771 			printf(">\n");
2772 		}
2773 #undef PRINTINTR
2774 #endif /* ATW_DEBUG */
2775 
2776 		if ((status & sc->sc_inten) == 0)
2777 			break;
2778 
2779 		handled = 1;
2780 
2781 		rxstatus = status & sc->sc_rxint_mask;
2782 		txstatus = status & sc->sc_txint_mask;
2783 		linkstatus = status & sc->sc_linkint_mask;
2784 
2785 		if (linkstatus) {
2786 			atw_linkintr(sc, linkstatus);
2787 		}
2788 
2789 		if (rxstatus) {
2790 			/* Grab any new packets. */
2791 			atw_rxintr(sc);
2792 
2793 			if (rxstatus & ATW_INTR_RDU) {
2794 				printf("%s: receive ring overrun\n",
2795 				    sc->sc_dev.dv_xname);
2796 				/* Get the receive process going again. */
2797 				ATW_WRITE(sc, ATW_RDR, 0x1);
2798 				break;
2799 			}
2800 		}
2801 
2802 		if (txstatus) {
2803 			/* Sweep up transmit descriptors. */
2804 			atw_txintr(sc);
2805 
2806 			if (txstatus & ATW_INTR_TLT)
2807 				DPRINTF(sc, ("%s: tx lifetime exceeded\n",
2808 				    sc->sc_dev.dv_xname));
2809 
2810 			if (txstatus & ATW_INTR_TRT)
2811 				DPRINTF(sc, ("%s: tx retry limit exceeded\n",
2812 				    sc->sc_dev.dv_xname));
2813 
2814 			/* If Tx under-run, increase our transmit threshold
2815 			 * if another is available.
2816 			 */
2817 			txthresh = sc->sc_txthresh + 1;
2818 			if ((txstatus & ATW_INTR_TUF) &&
2819 			    sc->sc_txth[txthresh].txth_name != NULL) {
2820 				/* Idle the transmit process. */
2821 				atw_idle(sc, ATW_NAR_ST);
2822 
2823 				sc->sc_txthresh = txthresh;
2824 				sc->sc_opmode &= ~(ATW_NAR_TR_MASK|ATW_NAR_SF);
2825 				sc->sc_opmode |=
2826 				    sc->sc_txth[txthresh].txth_opmode;
2827 				printf("%s: transmit underrun; new "
2828 				    "threshold: %s\n", sc->sc_dev.dv_xname,
2829 				    sc->sc_txth[txthresh].txth_name);
2830 
2831 				/* Set the new threshold and restart
2832 				 * the transmit process.
2833 				 */
2834 				ATW_WRITE(sc, ATW_NAR, sc->sc_opmode);
2835 				DELAY(atw_nar_delay);
2836 				ATW_WRITE(sc, ATW_RDR, 0x1);
2837 				/* XXX Log every Nth underrun from
2838 				 * XXX now on?
2839 				 */
2840 			}
2841 		}
2842 
2843 		if (status & (ATW_INTR_TPS|ATW_INTR_RPS)) {
2844 			if (status & ATW_INTR_TPS)
2845 				printf("%s: transmit process stopped\n",
2846 				    sc->sc_dev.dv_xname);
2847 			if (status & ATW_INTR_RPS)
2848 				printf("%s: receive process stopped\n",
2849 				    sc->sc_dev.dv_xname);
2850 			(void)atw_init(ifp);
2851 			break;
2852 		}
2853 
2854 		if (status & ATW_INTR_FBE) {
2855 			printf("%s: fatal bus error\n", sc->sc_dev.dv_xname);
2856 			(void)atw_init(ifp);
2857 			break;
2858 		}
2859 
2860 		/*
2861 		 * Not handled:
2862 		 *
2863 		 *	Transmit buffer unavailable -- normal
2864 		 *	condition, nothing to do, really.
2865 		 *
2866 		 *	Early receive interrupt -- not available on
2867 		 *	all chips, we just use RI.  We also only
2868 		 *	use single-segment receive DMA, so this
2869 		 *	is mostly useless.
2870 		 *
2871 		 *      TBD others
2872 		 */
2873 	}
2874 
2875 	/* Try to get more packets going. */
2876 	atw_start(ifp);
2877 
2878 	return (handled);
2879 }
2880 
2881 /*
2882  * atw_idle:
2883  *
2884  *	Cause the transmit and/or receive processes to go idle.
2885  *
2886  *      XXX It seems that the ADM8211 will not signal the end of the Rx/Tx
2887  *	process in STSR if I clear SR or ST after the process has already
2888  *	ceased. Fair enough. But the Rx process status bits in ATW_TEST0
2889  *      do not seem to be too reliable. Perhaps I have the sense of the
2890  *	Rx bits switched with the Tx bits?
2891  */
2892 void
2893 atw_idle(struct atw_softc *sc, u_int32_t bits)
2894 {
2895 	u_int32_t ackmask = 0, opmode, stsr, test0;
2896 	int i, s;
2897 
2898 	s = splnet();
2899 
2900 	opmode = sc->sc_opmode & ~bits;
2901 
2902 	if (bits & ATW_NAR_SR)
2903 		ackmask |= ATW_INTR_RPS;
2904 
2905 	if (bits & ATW_NAR_ST) {
2906 		ackmask |= ATW_INTR_TPS;
2907 		/* set ATW_NAR_HF to flush TX FIFO. */
2908 		opmode |= ATW_NAR_HF;
2909 	}
2910 
2911 	ATW_WRITE(sc, ATW_NAR, opmode);
2912 	DELAY(atw_nar_delay);
2913 
2914 	for (i = 0; i < 1000; i++) {
2915 		stsr = ATW_READ(sc, ATW_STSR);
2916 		if ((stsr & ackmask) == ackmask)
2917 			break;
2918 		DELAY(10);
2919 	}
2920 
2921 	ATW_WRITE(sc, ATW_STSR, stsr & ackmask);
2922 
2923 	if ((stsr & ackmask) == ackmask)
2924 		goto out;
2925 
2926 	test0 = ATW_READ(sc, ATW_TEST0);
2927 
2928 	if ((bits & ATW_NAR_ST) != 0 && (stsr & ATW_INTR_TPS) == 0 &&
2929 	    (test0 & ATW_TEST0_TS_MASK) != ATW_TEST0_TS_STOPPED) {
2930 		printf("%s: transmit process not idle [%s]\n",
2931 		    sc->sc_dev.dv_xname,
2932 		    atw_tx_state[MASK_AND_RSHIFT(test0, ATW_TEST0_TS_MASK)]);
2933 		printf("%s: bits %08x test0 %08x stsr %08x\n",
2934 		    sc->sc_dev.dv_xname, bits, test0, stsr);
2935 	}
2936 
2937 	if ((bits & ATW_NAR_SR) != 0 && (stsr & ATW_INTR_RPS) == 0 &&
2938 	    (test0 & ATW_TEST0_RS_MASK) != ATW_TEST0_RS_STOPPED) {
2939 		DPRINTF2(sc, ("%s: receive process not idle [%s]\n",
2940 		    sc->sc_dev.dv_xname,
2941 		    atw_rx_state[MASK_AND_RSHIFT(test0, ATW_TEST0_RS_MASK)]));
2942 		DPRINTF2(sc, ("%s: bits %08x test0 %08x stsr %08x\n",
2943 		    sc->sc_dev.dv_xname, bits, test0, stsr));
2944 	}
2945 out:
2946 	if ((bits & ATW_NAR_ST) != 0)
2947 		atw_txdrain(sc);
2948 	splx(s);
2949 	return;
2950 }
2951 
2952 /*
2953  * atw_linkintr:
2954  *
2955  *	Helper; handle link-status interrupts.
2956  */
2957 void
2958 atw_linkintr(struct atw_softc *sc, u_int32_t linkstatus)
2959 {
2960 	struct ieee80211com *ic = &sc->sc_ic;
2961 
2962 	if (ic->ic_state != IEEE80211_S_RUN)
2963 		return;
2964 
2965 	if (linkstatus & ATW_INTR_LINKON) {
2966 		DPRINTF(sc, ("%s: link on\n", sc->sc_dev.dv_xname));
2967 		sc->sc_rescan_timer = 0;
2968 	} else if (linkstatus & ATW_INTR_LINKOFF) {
2969 		DPRINTF(sc, ("%s: link off\n", sc->sc_dev.dv_xname));
2970 		if (ic->ic_opmode != IEEE80211_M_STA)
2971 			return;
2972 		sc->sc_rescan_timer = 3;
2973 		ic->ic_if.if_timer = 1;
2974 	}
2975 }
2976 
2977 static __inline int
2978 atw_hw_decrypted(struct atw_softc *sc, struct ieee80211_frame *wh)
2979 {
2980 	if ((sc->sc_ic.ic_flags & IEEE80211_F_PRIVACY) == 0)
2981 		return 0;
2982 	if ((wh->i_fc[1] & IEEE80211_FC1_WEP) == 0)
2983 		return 0;
2984 	return (sc->sc_wepctl & ATW_WEPCTL_WEPRXBYP) == 0;
2985 }
2986 
2987 /*
2988  * atw_rxintr:
2989  *
2990  *	Helper; handle receive interrupts.
2991  */
2992 void
2993 atw_rxintr(struct atw_softc *sc)
2994 {
2995 	static int rate_tbl[] = {2, 4, 11, 22, 44};
2996 	struct ieee80211com *ic = &sc->sc_ic;
2997 	struct ieee80211_node *ni;
2998 	struct ieee80211_frame *wh;
2999 	struct ifnet *ifp = &ic->ic_if;
3000 	struct atw_rxsoft *rxs;
3001 	struct mbuf *m;
3002 	u_int32_t rxstat;
3003 	int i, len, rate, rate0;
3004 	u_int32_t rssi, rssi0;
3005 
3006 	for (i = sc->sc_rxptr;; i = ATW_NEXTRX(i)) {
3007 		rxs = &sc->sc_rxsoft[i];
3008 
3009 		ATW_CDRXSYNC(sc, i, BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE);
3010 
3011 		rxstat = le32toh(sc->sc_rxdescs[i].ar_stat);
3012 		rssi0 = le32toh(sc->sc_rxdescs[i].ar_rssi);
3013 		rate0 = MASK_AND_RSHIFT(rxstat, ATW_RXSTAT_RXDR_MASK);
3014 
3015 		if (rxstat & ATW_RXSTAT_OWN)
3016 			break; /* We have processed all receive buffers. */
3017 
3018 		DPRINTF3(sc,
3019 		    ("%s: rx stat %08x rssi0 %08x buf1 %08x buf2 %08x\n",
3020 		    sc->sc_dev.dv_xname,
3021 		    rxstat, rssi0,
3022 		    le32toh(sc->sc_rxdescs[i].ar_buf1),
3023 		    le32toh(sc->sc_rxdescs[i].ar_buf2)));
3024 
3025 		/*
3026 		 * Make sure the packet fits in one buffer.  This should
3027 		 * always be the case.
3028 		 */
3029 		if ((rxstat & (ATW_RXSTAT_FS|ATW_RXSTAT_LS)) !=
3030 		    (ATW_RXSTAT_FS|ATW_RXSTAT_LS)) {
3031 			printf("%s: incoming packet spilled, resetting\n",
3032 			    sc->sc_dev.dv_xname);
3033 			(void)atw_init(ifp);
3034 			return;
3035 		}
3036 
3037 		/*
3038 		 * If an error occurred, update stats, clear the status
3039 		 * word, and leave the packet buffer in place.  It will
3040 		 * simply be reused the next time the ring comes around.
3041 	 	 * If 802.1Q VLAN MTU is enabled, ignore the Frame Too Long
3042 		 * error.
3043 		 */
3044 
3045 		if ((rxstat & ATW_RXSTAT_ES) != 0 &&
3046 		    ((sc->sc_ic.ic_ec.ec_capenable & ETHERCAP_VLAN_MTU) == 0 ||
3047 		     (rxstat & (ATW_RXSTAT_DE | ATW_RXSTAT_SFDE |
3048 		                ATW_RXSTAT_SIGE | ATW_RXSTAT_CRC16E |
3049 				ATW_RXSTAT_RXTOE | ATW_RXSTAT_CRC32E |
3050 				ATW_RXSTAT_ICVE)) != 0)) {
3051 #define	PRINTERR(bit, str)						\
3052 			if (rxstat & (bit))				\
3053 				printf("%s: receive error: %s\n",	\
3054 				    sc->sc_dev.dv_xname, str)
3055 			ifp->if_ierrors++;
3056 			PRINTERR(ATW_RXSTAT_DE, "descriptor error");
3057 			PRINTERR(ATW_RXSTAT_SFDE, "PLCP SFD error");
3058 			PRINTERR(ATW_RXSTAT_SIGE, "PLCP signal error");
3059 			PRINTERR(ATW_RXSTAT_CRC16E, "PLCP CRC16 error");
3060 			PRINTERR(ATW_RXSTAT_RXTOE, "time-out");
3061 			PRINTERR(ATW_RXSTAT_CRC32E, "FCS error");
3062 			PRINTERR(ATW_RXSTAT_ICVE, "WEP ICV error");
3063 #undef PRINTERR
3064 			ATW_INIT_RXDESC(sc, i);
3065 			continue;
3066 		}
3067 
3068 		bus_dmamap_sync(sc->sc_dmat, rxs->rxs_dmamap, 0,
3069 		    rxs->rxs_dmamap->dm_mapsize, BUS_DMASYNC_POSTREAD);
3070 
3071 		/*
3072 		 * No errors; receive the packet.  Note the ADM8211
3073 		 * includes the CRC in promiscuous mode.
3074 		 */
3075 		len = MASK_AND_RSHIFT(rxstat, ATW_RXSTAT_FL_MASK);
3076 
3077 		/*
3078 		 * Allocate a new mbuf cluster.  If that fails, we are
3079 		 * out of memory, and must drop the packet and recycle
3080 		 * the buffer that's already attached to this descriptor.
3081 		 */
3082 		m = rxs->rxs_mbuf;
3083 		if (atw_add_rxbuf(sc, i) != 0) {
3084 			ifp->if_ierrors++;
3085 			ATW_INIT_RXDESC(sc, i);
3086 			bus_dmamap_sync(sc->sc_dmat, rxs->rxs_dmamap, 0,
3087 			    rxs->rxs_dmamap->dm_mapsize, BUS_DMASYNC_PREREAD);
3088 			continue;
3089 		}
3090 
3091 		ifp->if_ipackets++;
3092 		if (sc->sc_opmode & ATW_NAR_PR)
3093 			m->m_flags |= M_HASFCS;
3094 		m->m_pkthdr.rcvif = ifp;
3095 		m->m_pkthdr.len = m->m_len = MIN(m->m_ext.ext_size, len);
3096 
3097 		if (rate0 >= sizeof(rate_tbl) / sizeof(rate_tbl[0]))
3098 			rate = 0;
3099 		else
3100 			rate = rate_tbl[rate0];
3101 
3102 		/* The RSSI comes straight from a register in the
3103 		 * baseband processor.  I know that for the RF3000,
3104 		 * the RSSI register also contains the antenna-selection
3105 		 * bits.  Mask those off.
3106 		 *
3107 		 * TBD Treat other basebands.
3108 		 */
3109 		if (sc->sc_bbptype == ATW_BBPTYPE_RFMD)
3110 			rssi = rssi0 & RF3000_RSSI_MASK;
3111 		else
3112 			rssi = rssi0;
3113 
3114  #if NBPFILTER > 0
3115 		/* Pass this up to any BPF listeners. */
3116 		if (sc->sc_radiobpf != NULL) {
3117 			struct atw_rx_radiotap_header *tap = &sc->sc_rxtap;
3118 
3119 			tap->ar_rate = rate;
3120 			tap->ar_chan_freq = ic->ic_bss->ni_chan->ic_freq;
3121 			tap->ar_chan_flags = ic->ic_bss->ni_chan->ic_flags;
3122 
3123 			/* TBD verify units are dB */
3124 			tap->ar_antsignal = (int)rssi;
3125 			/* TBD tap->ar_flags */
3126 
3127 			bpf_mtap2(sc->sc_radiobpf, (caddr_t)tap,
3128 			    tap->ar_ihdr.it_len, m);
3129  		}
3130  #endif /* NPBFILTER > 0 */
3131 
3132 		wh = mtod(m, struct ieee80211_frame *);
3133 		ni = ieee80211_find_rxnode(ic, wh);
3134 		if (atw_hw_decrypted(sc, wh))
3135 			wh->i_fc[1] &= ~IEEE80211_FC1_WEP;
3136 		ieee80211_input(ifp, m, ni, (int)rssi, 0);
3137 		/*
3138 		 * The frame may have caused the node to be marked for
3139 		 * reclamation (e.g. in response to a DEAUTH message)
3140 		 * so use release_node here instead of unref_node.
3141 		 */
3142 		ieee80211_release_node(ic, ni);
3143 	}
3144 
3145 	/* Update the receive pointer. */
3146 	sc->sc_rxptr = i;
3147 }
3148 
3149 /*
3150  * atw_txintr:
3151  *
3152  *	Helper; handle transmit interrupts.
3153  */
3154 void
3155 atw_txintr(struct atw_softc *sc)
3156 {
3157 #define TXSTAT_ERRMASK (ATW_TXSTAT_TUF | ATW_TXSTAT_TLT | ATW_TXSTAT_TRT | \
3158     ATW_TXSTAT_TRO | ATW_TXSTAT_SOFBR)
3159 #define TXSTAT_FMT "\20\31ATW_TXSTAT_SOFBR\32ATW_TXSTAT_TRO\33ATW_TXSTAT_TUF" \
3160     "\34ATW_TXSTAT_TRT\35ATW_TXSTAT_TLT"
3161 
3162 	static char txstat_buf[sizeof("ffffffff<>" TXSTAT_FMT)];
3163 	struct ifnet *ifp = &sc->sc_ic.ic_if;
3164 	struct atw_txsoft *txs;
3165 	u_int32_t txstat;
3166 
3167 	DPRINTF3(sc, ("%s: atw_txintr: sc_flags 0x%08x\n",
3168 	    sc->sc_dev.dv_xname, sc->sc_flags));
3169 
3170 	ifp->if_flags &= ~IFF_OACTIVE;
3171 
3172 	/*
3173 	 * Go through our Tx list and free mbufs for those
3174 	 * frames that have been transmitted.
3175 	 */
3176 	while ((txs = SIMPLEQ_FIRST(&sc->sc_txdirtyq)) != NULL) {
3177 		ATW_CDTXSYNC(sc, txs->txs_lastdesc, 1,
3178 		    BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE);
3179 
3180 #ifdef ATW_DEBUG
3181 		if ((ifp->if_flags & IFF_DEBUG) != 0 && atw_debug > 2) {
3182 			int i;
3183 			printf("    txsoft %p transmit chain:\n", txs);
3184 			ATW_CDTXSYNC(sc, txs->txs_firstdesc,
3185 			    txs->txs_ndescs - 1,
3186 			    BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE);
3187 			for (i = txs->txs_firstdesc;; i = ATW_NEXTTX(i)) {
3188 				printf("     descriptor %d:\n", i);
3189 				printf("       at_status:   0x%08x\n",
3190 				    le32toh(sc->sc_txdescs[i].at_stat));
3191 				printf("       at_flags:      0x%08x\n",
3192 				    le32toh(sc->sc_txdescs[i].at_flags));
3193 				printf("       at_buf1: 0x%08x\n",
3194 				    le32toh(sc->sc_txdescs[i].at_buf1));
3195 				printf("       at_buf2: 0x%08x\n",
3196 				    le32toh(sc->sc_txdescs[i].at_buf2));
3197 				if (i == txs->txs_lastdesc)
3198 					break;
3199 			}
3200 		}
3201 #endif
3202 
3203 		txstat = le32toh(sc->sc_txdescs[txs->txs_lastdesc].at_stat);
3204 		if (txstat & ATW_TXSTAT_OWN)
3205 			break;
3206 
3207 		SIMPLEQ_REMOVE_HEAD(&sc->sc_txdirtyq, txs_q);
3208 
3209 		sc->sc_txfree += txs->txs_ndescs;
3210 
3211 		bus_dmamap_sync(sc->sc_dmat, txs->txs_dmamap,
3212 		    0, txs->txs_dmamap->dm_mapsize,
3213 		    BUS_DMASYNC_POSTWRITE);
3214 		bus_dmamap_unload(sc->sc_dmat, txs->txs_dmamap);
3215 		m_freem(txs->txs_mbuf);
3216 		txs->txs_mbuf = NULL;
3217 
3218 		SIMPLEQ_INSERT_TAIL(&sc->sc_txfreeq, txs, txs_q);
3219 
3220 		if ((ifp->if_flags & IFF_DEBUG) != 0 &&
3221 		    (txstat & TXSTAT_ERRMASK) != 0) {
3222 			bitmask_snprintf(txstat & TXSTAT_ERRMASK, TXSTAT_FMT,
3223 			    txstat_buf, sizeof(txstat_buf));
3224 			printf("%s: txstat %s %d\n", sc->sc_dev.dv_xname,
3225 			    txstat_buf,
3226 			    MASK_AND_RSHIFT(txstat, ATW_TXSTAT_ARC_MASK));
3227 		}
3228 
3229 		/*
3230 		 * Check for errors and collisions.
3231 		 */
3232 		if (txstat & ATW_TXSTAT_TUF)
3233 			sc->sc_stats.ts_tx_tuf++;
3234 		if (txstat & ATW_TXSTAT_TLT)
3235 			sc->sc_stats.ts_tx_tlt++;
3236 		if (txstat & ATW_TXSTAT_TRT)
3237 			sc->sc_stats.ts_tx_trt++;
3238 		if (txstat & ATW_TXSTAT_TRO)
3239 			sc->sc_stats.ts_tx_tro++;
3240 		if (txstat & ATW_TXSTAT_SOFBR) {
3241 			sc->sc_stats.ts_tx_sofbr++;
3242 		}
3243 
3244 		if ((txstat & ATW_TXSTAT_ES) == 0)
3245 			ifp->if_collisions +=
3246 			    MASK_AND_RSHIFT(txstat, ATW_TXSTAT_ARC_MASK);
3247 		else
3248 			ifp->if_oerrors++;
3249 
3250 		ifp->if_opackets++;
3251 	}
3252 
3253 	/*
3254 	 * If there are no more pending transmissions, cancel the watchdog
3255 	 * timer.
3256 	 */
3257 	if (txs == NULL)
3258 		sc->sc_tx_timer = 0;
3259 #undef TXSTAT_ERRMASK
3260 #undef TXSTAT_FMT
3261 }
3262 
3263 /*
3264  * atw_watchdog:	[ifnet interface function]
3265  *
3266  *	Watchdog timer handler.
3267  */
3268 void
3269 atw_watchdog(struct ifnet *ifp)
3270 {
3271 	struct atw_softc *sc = ifp->if_softc;
3272 	struct ieee80211com *ic = &sc->sc_ic;
3273 
3274 	ifp->if_timer = 0;
3275 	if (ATW_IS_ENABLED(sc) == 0)
3276 		return;
3277 
3278 	if (sc->sc_rescan_timer) {
3279 		if (--sc->sc_rescan_timer == 0)
3280 			(void)ieee80211_new_state(ic, IEEE80211_S_SCAN, -1);
3281 	}
3282 	if (sc->sc_tx_timer) {
3283 		if (--sc->sc_tx_timer == 0 &&
3284 		    !SIMPLEQ_EMPTY(&sc->sc_txdirtyq)) {
3285 			printf("%s: transmit timeout\n", ifp->if_xname);
3286 			ifp->if_oerrors++;
3287 			(void)atw_init(ifp);
3288 			atw_start(ifp);
3289 		}
3290 	}
3291 	if (sc->sc_tx_timer != 0 || sc->sc_rescan_timer != 0)
3292 		ifp->if_timer = 1;
3293 	ieee80211_watchdog(ifp);
3294 }
3295 
3296 /* Compute the 802.11 Duration field and the PLCP Length fields for
3297  * a len-byte frame (HEADER + PAYLOAD + FCS) sent at rate * 500Kbps.
3298  * Write the fields to the ADM8211 Tx header, frm.
3299  *
3300  * TBD use the fragmentation threshold to find the right duration for
3301  * the first & last fragments.
3302  *
3303  * TBD make certain of the duration fields applied by the ADM8211 to each
3304  * fragment. I think that the ADM8211 knows how to subtract the CTS
3305  * duration when ATW_HDRCTL_RTSCTS is clear; that is why I add it regardless.
3306  * I also think that the ADM8211 does *some* arithmetic for us, because
3307  * otherwise I think we would have to set a first duration for CTS/first
3308  * fragment, a second duration for fragments between the first and the
3309  * last, and a third duration for the last fragment.
3310  *
3311  * TBD make certain that duration fields reflect addition of FCS/WEP
3312  * and correct duration arithmetic as necessary.
3313  */
3314 static void
3315 atw_frame_setdurs(struct atw_softc *sc, struct atw_frame *frm, int rate,
3316     int len)
3317 {
3318 	int remainder;
3319 
3320 	/* deal also with encrypted fragments */
3321 	if (frm->atw_hdrctl & htole16(ATW_HDRCTL_WEP)) {
3322 		DPRINTF2(sc, ("%s: atw_frame_setdurs len += 8\n",
3323 		    sc->sc_dev.dv_xname));
3324 		len += IEEE80211_WEP_IVLEN + IEEE80211_WEP_KIDLEN +
3325 		       IEEE80211_WEP_CRCLEN;
3326 	}
3327 
3328 	/* 802.11 Duration Field for CTS/Data/ACK sequence minus FCS & WEP
3329 	 * duration (XXX added by MAC?).
3330 	 */
3331 	frm->atw_head_dur = (16 * (len - IEEE80211_CRC_LEN)) / rate;
3332 	remainder = (16 * (len - IEEE80211_CRC_LEN)) % rate;
3333 
3334 	if (rate <= 4)
3335 		/* 1-2Mbps WLAN: send ACK/CTS at 1Mbps */
3336 		frm->atw_head_dur += 3 * (IEEE80211_DUR_DS_SIFS +
3337 		    IEEE80211_DUR_DS_SHORT_PREAMBLE +
3338 		    IEEE80211_DUR_DS_FAST_PLCPHDR) +
3339 		    IEEE80211_DUR_DS_SLOW_CTS + IEEE80211_DUR_DS_SLOW_ACK;
3340 	else
3341 		/* 5-11Mbps WLAN: send ACK/CTS at 2Mbps */
3342 		frm->atw_head_dur += 3 * (IEEE80211_DUR_DS_SIFS +
3343 		    IEEE80211_DUR_DS_SHORT_PREAMBLE +
3344 		    IEEE80211_DUR_DS_FAST_PLCPHDR) +
3345 		    IEEE80211_DUR_DS_FAST_CTS + IEEE80211_DUR_DS_FAST_ACK;
3346 
3347 	/* lengthen duration if long preamble */
3348 	if ((sc->sc_flags & ATWF_SHORT_PREAMBLE) == 0)
3349 		frm->atw_head_dur +=
3350 		    3 * (IEEE80211_DUR_DS_LONG_PREAMBLE -
3351 		         IEEE80211_DUR_DS_SHORT_PREAMBLE) +
3352 		    3 * (IEEE80211_DUR_DS_SLOW_PLCPHDR -
3353 		         IEEE80211_DUR_DS_FAST_PLCPHDR);
3354 
3355 	if (remainder != 0)
3356 		frm->atw_head_dur++;
3357 
3358 	if ((atw_voodoo & VOODOO_DUR_2_4_SPECIALCASE) &&
3359 	    (rate == 2 || rate == 4)) {
3360 		/* derived from Linux: how could this be right? */
3361 		frm->atw_head_plcplen = frm->atw_head_dur;
3362 	} else {
3363 		frm->atw_head_plcplen = (16 * len) / rate;
3364 		remainder = (80 * len) % (rate * 5);
3365 
3366 		if (remainder != 0) {
3367 			frm->atw_head_plcplen++;
3368 
3369 			/* XXX magic */
3370 			if ((atw_voodoo & VOODOO_DUR_11_ROUNDING) &&
3371 			    rate == 22 && remainder <= 30)
3372 				frm->atw_head_plcplen |= 0x8000;
3373 		}
3374 	}
3375 	frm->atw_tail_plcplen = frm->atw_head_plcplen =
3376 	    htole16(frm->atw_head_plcplen);
3377 	frm->atw_tail_dur = frm->atw_head_dur = htole16(frm->atw_head_dur);
3378 }
3379 
3380 #ifdef ATW_DEBUG
3381 static void
3382 atw_dump_pkt(struct ifnet *ifp, struct mbuf *m0)
3383 {
3384 	struct atw_softc *sc = ifp->if_softc;
3385 	struct mbuf *m;
3386 	int i, noctets = 0;
3387 
3388 	printf("%s: %d-byte packet\n", sc->sc_dev.dv_xname,
3389 	    m0->m_pkthdr.len);
3390 
3391 	for (m = m0; m; m = m->m_next) {
3392 		if (m->m_len == 0)
3393 			continue;
3394 		for (i = 0; i < m->m_len; i++) {
3395 			printf(" %02x", ((u_int8_t*)m->m_data)[i]);
3396 			if (++noctets % 24 == 0)
3397 				printf("\n");
3398 		}
3399 	}
3400 	printf("%s%s: %d bytes emitted\n",
3401 	    (noctets % 24 != 0) ? "\n" : "", sc->sc_dev.dv_xname, noctets);
3402 }
3403 #endif /* ATW_DEBUG */
3404 
3405 /*
3406  * atw_start:		[ifnet interface function]
3407  *
3408  *	Start packet transmission on the interface.
3409  */
3410 void
3411 atw_start(struct ifnet *ifp)
3412 {
3413 	struct atw_softc *sc = ifp->if_softc;
3414 	struct ieee80211com *ic = &sc->sc_ic;
3415 	struct ieee80211_node *ni;
3416 	struct ieee80211_frame *wh;
3417 	struct atw_frame *hh;
3418 	struct mbuf *m0, *m;
3419 	struct atw_txsoft *txs, *last_txs;
3420 	struct atw_txdesc *txd;
3421 	int do_encrypt, rate;
3422 	bus_dmamap_t dmamap;
3423 	int ctl, error, firsttx, nexttx, lasttx = -1, first, ofree, seg;
3424 
3425 	DPRINTF2(sc, ("%s: atw_start: sc_flags 0x%08x, if_flags 0x%08x\n",
3426 	    sc->sc_dev.dv_xname, sc->sc_flags, ifp->if_flags));
3427 
3428 	if ((ifp->if_flags & (IFF_RUNNING|IFF_OACTIVE)) != IFF_RUNNING)
3429 		return;
3430 
3431 	/*
3432 	 * Remember the previous number of free descriptors and
3433 	 * the first descriptor we'll use.
3434 	 */
3435 	ofree = sc->sc_txfree;
3436 	firsttx = sc->sc_txnext;
3437 
3438 	DPRINTF2(sc, ("%s: atw_start: txfree %d, txnext %d\n",
3439 	    sc->sc_dev.dv_xname, ofree, firsttx));
3440 
3441 	/*
3442 	 * Loop through the send queue, setting up transmit descriptors
3443 	 * until we drain the queue, or use up all available transmit
3444 	 * descriptors.
3445 	 */
3446 	while ((txs = SIMPLEQ_FIRST(&sc->sc_txfreeq)) != NULL &&
3447 	       sc->sc_txfree != 0) {
3448 
3449 		/*
3450 		 * Grab a packet off the management queue, if it
3451 		 * is not empty. Otherwise, from the data queue.
3452 		 */
3453 		IF_DEQUEUE(&ic->ic_mgtq, m0);
3454 		if (m0 != NULL) {
3455 			ni = (struct ieee80211_node *)m0->m_pkthdr.rcvif;
3456 			m0->m_pkthdr.rcvif = NULL;
3457 		} else {
3458 			/* send no data packets until we are associated */
3459 			if (ic->ic_state != IEEE80211_S_RUN)
3460 				break;
3461 			IFQ_DEQUEUE(&ifp->if_snd, m0);
3462 			if (m0 == NULL)
3463 				break;
3464 #if NBPFILTER > 0
3465 			if (ifp->if_bpf != NULL)
3466 				bpf_mtap(ifp->if_bpf, m0);
3467 #endif /* NBPFILTER > 0 */
3468 			if ((m0 = ieee80211_encap(ifp, m0, &ni)) == NULL) {
3469 				ifp->if_oerrors++;
3470 				break;
3471 			}
3472 		}
3473 
3474 		rate = MAX(ieee80211_get_rate(ic), 2);
3475 
3476 #if NBPFILTER > 0
3477 		/*
3478 		 * Pass the packet to any BPF listeners.
3479 		 */
3480 		if (ic->ic_rawbpf != NULL)
3481 			bpf_mtap((caddr_t)ic->ic_rawbpf, m0);
3482 
3483 		if (sc->sc_radiobpf != NULL) {
3484 			struct atw_tx_radiotap_header *tap = &sc->sc_txtap;
3485 
3486 			tap->at_rate = rate;
3487 			tap->at_chan_freq = ic->ic_bss->ni_chan->ic_freq;
3488 			tap->at_chan_flags = ic->ic_bss->ni_chan->ic_flags;
3489 
3490 			/* TBD tap->at_flags */
3491 
3492 			bpf_mtap2(sc->sc_radiobpf, (caddr_t)tap,
3493 			    tap->at_ihdr.it_len, m0);
3494 		}
3495 #endif /* NBPFILTER > 0 */
3496 
3497 		M_PREPEND(m0, offsetof(struct atw_frame, atw_ihdr), M_DONTWAIT);
3498 
3499 		if (ni != NULL)
3500 			ieee80211_release_node(ic, ni);
3501 
3502 		if (m0 == NULL) {
3503 			ifp->if_oerrors++;
3504 			break;
3505 		}
3506 
3507 		/* just to make sure. */
3508 		m0 = m_pullup(m0, sizeof(struct atw_frame));
3509 
3510 		if (m0 == NULL) {
3511 			ifp->if_oerrors++;
3512 			break;
3513 		}
3514 
3515 		hh = mtod(m0, struct atw_frame *);
3516 		wh = &hh->atw_ihdr;
3517 
3518 		do_encrypt = ((wh->i_fc[1] & IEEE80211_FC1_WEP) != 0) ? 1 : 0;
3519 
3520 		/* Copy everything we need from the 802.11 header:
3521 		 * Frame Control; address 1, address 3, or addresses
3522 		 * 3 and 4. NIC fills in BSSID, SA.
3523 		 */
3524 		if (wh->i_fc[1] & IEEE80211_FC1_DIR_TODS) {
3525 			if (wh->i_fc[1] & IEEE80211_FC1_DIR_FROMDS)
3526 				panic("%s: illegal WDS frame",
3527 				    sc->sc_dev.dv_xname);
3528 			memcpy(hh->atw_dst, wh->i_addr3, IEEE80211_ADDR_LEN);
3529 		} else
3530 			memcpy(hh->atw_dst, wh->i_addr1, IEEE80211_ADDR_LEN);
3531 
3532 		*(u_int16_t*)hh->atw_fc = *(u_int16_t*)wh->i_fc;
3533 
3534 		/* initialize remaining Tx parameters */
3535 		memset(&hh->u, 0, sizeof(hh->u));
3536 
3537 		hh->atw_rate = rate * 5;
3538 		/* XXX this could be incorrect if M_FCS. _encap should
3539 		 * probably strip FCS just in case it sticks around in
3540 		 * bridged packets.
3541 		 */
3542 		hh->atw_service = IEEE80211_PLCP_SERVICE; /* XXX guess */
3543 		hh->atw_paylen = htole16(m0->m_pkthdr.len -
3544 		    sizeof(struct atw_frame));
3545 
3546 		hh->atw_fragthr = htole16(ATW_FRAGTHR_FRAGTHR_MASK);
3547 		hh->atw_rtylmt = 3;
3548 		hh->atw_hdrctl = htole16(ATW_HDRCTL_UNKNOWN1);
3549 		if (do_encrypt) {
3550 			hh->atw_hdrctl |= htole16(ATW_HDRCTL_WEP);
3551 			hh->atw_keyid = ic->ic_wep_txkey;
3552 		}
3553 
3554 		/* TBD 4-addr frames */
3555 		atw_frame_setdurs(sc, hh, rate,
3556 		    m0->m_pkthdr.len - sizeof(struct atw_frame) +
3557 		    sizeof(struct ieee80211_frame) + IEEE80211_CRC_LEN);
3558 
3559 		/* never fragment multicast frames */
3560 		if (IEEE80211_IS_MULTICAST(hh->atw_dst)) {
3561 			hh->atw_fragthr = htole16(ATW_FRAGTHR_FRAGTHR_MASK);
3562 		} else if (sc->sc_flags & ATWF_RTSCTS) {
3563 			hh->atw_hdrctl |= htole16(ATW_HDRCTL_RTSCTS);
3564 		}
3565 
3566 #ifdef ATW_DEBUG
3567 		hh->atw_fragnum = 0;
3568 
3569 		if ((ifp->if_flags & IFF_DEBUG) != 0 && atw_debug > 2) {
3570 			printf("%s: dst = %s, rate = 0x%02x, "
3571 			    "service = 0x%02x, paylen = 0x%04x\n",
3572 			    sc->sc_dev.dv_xname, ether_sprintf(hh->atw_dst),
3573 			    hh->atw_rate, hh->atw_service, hh->atw_paylen);
3574 
3575 			printf("%s: fc[0] = 0x%02x, fc[1] = 0x%02x, "
3576 			    "dur1 = 0x%04x, dur2 = 0x%04x, "
3577 			    "dur3 = 0x%04x, rts_dur = 0x%04x\n",
3578 			    sc->sc_dev.dv_xname, hh->atw_fc[0], hh->atw_fc[1],
3579 			    hh->atw_tail_plcplen, hh->atw_head_plcplen,
3580 			    hh->atw_tail_dur, hh->atw_head_dur);
3581 
3582 			printf("%s: hdrctl = 0x%04x, fragthr = 0x%04x, "
3583 			    "fragnum = 0x%02x, rtylmt = 0x%04x\n",
3584 			    sc->sc_dev.dv_xname, hh->atw_hdrctl,
3585 			    hh->atw_fragthr, hh->atw_fragnum, hh->atw_rtylmt);
3586 
3587 			printf("%s: keyid = %d\n",
3588 			    sc->sc_dev.dv_xname, hh->atw_keyid);
3589 
3590 			atw_dump_pkt(ifp, m0);
3591 		}
3592 #endif /* ATW_DEBUG */
3593 
3594 		dmamap = txs->txs_dmamap;
3595 
3596 		/*
3597 		 * Load the DMA map.  Copy and try (once) again if the packet
3598 		 * didn't fit in the alloted number of segments.
3599 		 */
3600 		for (first = 1;
3601 		     (error = bus_dmamap_load_mbuf(sc->sc_dmat, dmamap, m0,
3602 		                  BUS_DMA_WRITE|BUS_DMA_NOWAIT)) != 0 && first;
3603 		     first = 0) {
3604 			MGETHDR(m, M_DONTWAIT, MT_DATA);
3605 			if (m == NULL) {
3606 				printf("%s: unable to allocate Tx mbuf\n",
3607 				    sc->sc_dev.dv_xname);
3608 				break;
3609 			}
3610 			if (m0->m_pkthdr.len > MHLEN) {
3611 				MCLGET(m, M_DONTWAIT);
3612 				if ((m->m_flags & M_EXT) == 0) {
3613 					printf("%s: unable to allocate Tx "
3614 					    "cluster\n", sc->sc_dev.dv_xname);
3615 					m_freem(m);
3616 					break;
3617 				}
3618 			}
3619 			m_copydata(m0, 0, m0->m_pkthdr.len, mtod(m, caddr_t));
3620 			m->m_pkthdr.len = m->m_len = m0->m_pkthdr.len;
3621 			m_freem(m0);
3622 			m0 = m;
3623 			m = NULL;
3624 		}
3625 		if (error != 0) {
3626 			printf("%s: unable to load Tx buffer, "
3627 			    "error = %d\n", sc->sc_dev.dv_xname, error);
3628 			m_freem(m0);
3629 			break;
3630 		}
3631 
3632 		/*
3633 		 * Ensure we have enough descriptors free to describe
3634 		 * the packet.
3635 		 */
3636 		if (dmamap->dm_nsegs > sc->sc_txfree) {
3637 			/*
3638 			 * Not enough free descriptors to transmit
3639 			 * this packet.  Unload the DMA map and
3640 			 * drop the packet.  Notify the upper layer
3641 			 * that there are no more slots left.
3642 			 *
3643 			 * XXX We could allocate an mbuf and copy, but
3644 			 * XXX it is worth it?
3645 			 */
3646 			ifp->if_flags |= IFF_OACTIVE;
3647 			bus_dmamap_unload(sc->sc_dmat, dmamap);
3648 			m_freem(m0);
3649 			break;
3650 		}
3651 
3652 		/*
3653 		 * WE ARE NOW COMMITTED TO TRANSMITTING THE PACKET.
3654 		 */
3655 
3656 		/* Sync the DMA map. */
3657 		bus_dmamap_sync(sc->sc_dmat, dmamap, 0, dmamap->dm_mapsize,
3658 		    BUS_DMASYNC_PREWRITE);
3659 
3660 		/* XXX arbitrary retry limit; 8 because I have seen it in
3661 		 * use already and maybe 0 means "no tries" !
3662 		 */
3663 		ctl = htole32(LSHIFT(8, ATW_TXCTL_TL_MASK));
3664 
3665 		DPRINTF2(sc, ("%s: TXDR <- max(10, %d)\n",
3666 		    sc->sc_dev.dv_xname, rate * 5));
3667 		ctl |= htole32(LSHIFT(MAX(10, rate * 5), ATW_TXCTL_TXDR_MASK));
3668 
3669 		/*
3670 		 * Initialize the transmit descriptors.
3671 		 */
3672 		for (nexttx = sc->sc_txnext, seg = 0;
3673 		     seg < dmamap->dm_nsegs;
3674 		     seg++, nexttx = ATW_NEXTTX(nexttx)) {
3675 			/*
3676 			 * If this is the first descriptor we're
3677 			 * enqueueing, don't set the OWN bit just
3678 			 * yet.  That could cause a race condition.
3679 			 * We'll do it below.
3680 			 */
3681 			txd = &sc->sc_txdescs[nexttx];
3682 			txd->at_ctl = ctl |
3683 			    ((nexttx == firsttx) ? 0 : htole32(ATW_TXCTL_OWN));
3684 
3685 			txd->at_buf1 = htole32(dmamap->dm_segs[seg].ds_addr);
3686 			txd->at_flags =
3687 			    htole32(LSHIFT(dmamap->dm_segs[seg].ds_len,
3688 			                   ATW_TXFLAG_TBS1_MASK)) |
3689 			    ((nexttx == (ATW_NTXDESC - 1))
3690 			        ? htole32(ATW_TXFLAG_TER) : 0);
3691 			lasttx = nexttx;
3692 		}
3693 
3694 		IASSERT(lasttx != -1, ("bad lastx"));
3695 		/* Set `first segment' and `last segment' appropriately. */
3696 		sc->sc_txdescs[sc->sc_txnext].at_flags |=
3697 		    htole32(ATW_TXFLAG_FS);
3698 		sc->sc_txdescs[lasttx].at_flags |= htole32(ATW_TXFLAG_LS);
3699 
3700 #ifdef ATW_DEBUG
3701 		if ((ifp->if_flags & IFF_DEBUG) != 0 && atw_debug > 2) {
3702 			printf("     txsoft %p transmit chain:\n", txs);
3703 			for (seg = sc->sc_txnext;; seg = ATW_NEXTTX(seg)) {
3704 				printf("     descriptor %d:\n", seg);
3705 				printf("       at_ctl:   0x%08x\n",
3706 				    le32toh(sc->sc_txdescs[seg].at_ctl));
3707 				printf("       at_flags:      0x%08x\n",
3708 				    le32toh(sc->sc_txdescs[seg].at_flags));
3709 				printf("       at_buf1: 0x%08x\n",
3710 				    le32toh(sc->sc_txdescs[seg].at_buf1));
3711 				printf("       at_buf2: 0x%08x\n",
3712 				    le32toh(sc->sc_txdescs[seg].at_buf2));
3713 				if (seg == lasttx)
3714 					break;
3715 			}
3716 		}
3717 #endif
3718 
3719 		/* Sync the descriptors we're using. */
3720 		ATW_CDTXSYNC(sc, sc->sc_txnext, dmamap->dm_nsegs,
3721 		    BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE);
3722 
3723 		/*
3724 		 * Store a pointer to the packet so we can free it later,
3725 		 * and remember what txdirty will be once the packet is
3726 		 * done.
3727 		 */
3728 		txs->txs_mbuf = m0;
3729 		txs->txs_firstdesc = sc->sc_txnext;
3730 		txs->txs_lastdesc = lasttx;
3731 		txs->txs_ndescs = dmamap->dm_nsegs;
3732 
3733 		/* Advance the tx pointer. */
3734 		sc->sc_txfree -= dmamap->dm_nsegs;
3735 		sc->sc_txnext = nexttx;
3736 
3737 		SIMPLEQ_REMOVE_HEAD(&sc->sc_txfreeq, txs_q);
3738 		SIMPLEQ_INSERT_TAIL(&sc->sc_txdirtyq, txs, txs_q);
3739 
3740 		last_txs = txs;
3741 	}
3742 
3743 	if (txs == NULL || sc->sc_txfree == 0) {
3744 		/* No more slots left; notify upper layer. */
3745 		ifp->if_flags |= IFF_OACTIVE;
3746 	}
3747 
3748 	if (sc->sc_txfree != ofree) {
3749 		DPRINTF2(sc, ("%s: packets enqueued, IC on %d, OWN on %d\n",
3750 		    sc->sc_dev.dv_xname, lasttx, firsttx));
3751 		/*
3752 		 * Cause a transmit interrupt to happen on the
3753 		 * last packet we enqueued.
3754 		 */
3755 		sc->sc_txdescs[lasttx].at_flags |= htole32(ATW_TXFLAG_IC);
3756 		ATW_CDTXSYNC(sc, lasttx, 1,
3757 		    BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE);
3758 
3759 		/*
3760 		 * The entire packet chain is set up.  Give the
3761 		 * first descriptor to the chip now.
3762 		 */
3763 		sc->sc_txdescs[firsttx].at_ctl |= htole32(ATW_TXCTL_OWN);
3764 		ATW_CDTXSYNC(sc, firsttx, 1,
3765 		    BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE);
3766 
3767 		/* Wake up the transmitter. */
3768 		ATW_WRITE(sc, ATW_TDR, 0x1);
3769 
3770 		/* Set a watchdog timer in case the chip flakes out. */
3771 		sc->sc_tx_timer = 5;
3772 		ifp->if_timer = 1;
3773 	}
3774 }
3775 
3776 /*
3777  * atw_power:
3778  *
3779  *	Power management (suspend/resume) hook.
3780  */
3781 void
3782 atw_power(int why, void *arg)
3783 {
3784 	struct atw_softc *sc = arg;
3785 	struct ifnet *ifp = &sc->sc_ic.ic_if;
3786 	int s;
3787 
3788 	DPRINTF(sc, ("%s: atw_power(%d,)\n", sc->sc_dev.dv_xname, why));
3789 
3790 	s = splnet();
3791 	switch (why) {
3792 	case PWR_STANDBY:
3793 		/* XXX do nothing. */
3794 		break;
3795 	case PWR_SUSPEND:
3796 		atw_stop(ifp, 0);
3797 		if (sc->sc_power != NULL)
3798 			(*sc->sc_power)(sc, why);
3799 		break;
3800 	case PWR_RESUME:
3801 		if (ifp->if_flags & IFF_UP) {
3802 			if (sc->sc_power != NULL)
3803 				(*sc->sc_power)(sc, why);
3804 			atw_init(ifp);
3805 		}
3806 		break;
3807 	case PWR_SOFTSUSPEND:
3808 	case PWR_SOFTSTANDBY:
3809 	case PWR_SOFTRESUME:
3810 		break;
3811 	}
3812 	splx(s);
3813 }
3814 
3815 /*
3816  * atw_ioctl:		[ifnet interface function]
3817  *
3818  *	Handle control requests from the operator.
3819  */
3820 int
3821 atw_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
3822 {
3823 	struct atw_softc *sc = ifp->if_softc;
3824 	struct ifreq *ifr = (struct ifreq *)data;
3825 	int s, error = 0;
3826 
3827 	/* XXX monkey see, monkey do. comes from wi_ioctl. */
3828 	if ((sc->sc_dev.dv_flags & DVF_ACTIVE) == 0)
3829 		return ENXIO;
3830 
3831 	s = splnet();
3832 
3833 	switch (cmd) {
3834 	case SIOCSIFFLAGS:
3835 		if (ifp->if_flags & IFF_UP) {
3836 			if (ATW_IS_ENABLED(sc)) {
3837 				/*
3838 				 * To avoid rescanning another access point,
3839 				 * do not call atw_init() here.  Instead,
3840 				 * only reflect media settings.
3841 				 */
3842 				atw_filter_setup(sc);
3843 			} else
3844 				error = atw_init(ifp);
3845 		} else if (ATW_IS_ENABLED(sc))
3846 			atw_stop(ifp, 1);
3847 		break;
3848 	case SIOCADDMULTI:
3849 	case SIOCDELMULTI:
3850 		error = (cmd == SIOCADDMULTI) ?
3851 		    ether_addmulti(ifr, &sc->sc_ic.ic_ec) :
3852 		    ether_delmulti(ifr, &sc->sc_ic.ic_ec);
3853 		if (error == ENETRESET) {
3854 			if (ifp->if_flags & IFF_RUNNING)
3855 				atw_filter_setup(sc); /* do not rescan */
3856 			error = 0;
3857 		}
3858 		break;
3859 	default:
3860 		error = ieee80211_ioctl(ifp, cmd, data);
3861 		if (error == ENETRESET) {
3862 			if (ATW_IS_ENABLED(sc))
3863 				error = atw_init(ifp);
3864 			else
3865 				error = 0;
3866 		}
3867 		break;
3868 	}
3869 
3870 	/* Try to get more packets going. */
3871 	if (ATW_IS_ENABLED(sc))
3872 		atw_start(ifp);
3873 
3874 	splx(s);
3875 	return (error);
3876 }
3877 
3878 static int
3879 atw_media_change(struct ifnet *ifp)
3880 {
3881 	int error;
3882 
3883 	error = ieee80211_media_change(ifp);
3884 	if (error == ENETRESET) {
3885 		if ((ifp->if_flags & (IFF_RUNNING|IFF_UP)) ==
3886 		    (IFF_RUNNING|IFF_UP))
3887 			atw_init(ifp);		/* XXX lose error */
3888 		error = 0;
3889 	}
3890 	return error;
3891 }
3892 
3893 static void
3894 atw_media_status(struct ifnet *ifp, struct ifmediareq *imr)
3895 {
3896 	struct atw_softc *sc = ifp->if_softc;
3897 
3898 	if (ATW_IS_ENABLED(sc) == 0) {
3899 		imr->ifm_active = IFM_IEEE80211 | IFM_NONE;
3900 		imr->ifm_status = 0;
3901 		return;
3902 	}
3903 	ieee80211_media_status(ifp, imr);
3904 }
3905