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