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