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