1 /* 2 * Copyright (c) 2002-2005 Sam Leffler, Errno Consulting 3 * Copyright (c) 2004-2005 Atheros Communications, Inc. 4 * Copyright (c) 2006 Devicescape Software, Inc. 5 * Copyright (c) 2007 Jiri Slaby <jirislaby (at) gmail.com> 6 * Copyright (c) 2007 Luis R. Rodriguez <mcgrof (at) winlab.rutgers.edu> 7 * 8 * Modified for gPXE, July 2009, by Joshua Oreman <oremanj (at) rwcr.net> 9 * Original from Linux kernel 2.6.30. 10 * 11 * All rights reserved. 12 * 13 * Redistribution and use in source and binary forms, with or without 14 * modification, are permitted provided that the following conditions 15 * are met: 16 * 1. Redistributions of source code must retain the above copyright 17 * notice, this list of conditions and the following disclaimer, 18 * without modification. 19 * 2. Redistributions in binary form must reproduce at minimum a disclaimer 20 * similar to the "NO WARRANTY" disclaimer below ("Disclaimer") and any 21 * redistribution must be conditioned upon including a substantially 22 * similar Disclaimer requirement for further binary redistribution. 23 * 3. Neither the names of the above-listed copyright holders nor the names 24 * of any contributors may be used to endorse or promote products derived 25 * from this software without specific prior written permission. 26 * 27 * Alternatively, this software may be distributed under the terms of the 28 * GNU General Public License ("GPL") version 2 as published by the Free 29 * Software Foundation. 30 * 31 * NO WARRANTY 32 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 33 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 34 * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT, MERCHANTIBILITY 35 * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL 36 * THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, 37 * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 38 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 39 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER 40 * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 41 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 42 * THE POSSIBILITY OF SUCH DAMAGES. 43 * 44 */ 45 46 FILE_LICENCE ( BSD3 ); 47 48 #include <stdlib.h> 49 #include <gpxe/malloc.h> 50 #include <gpxe/timer.h> 51 #include <gpxe/netdevice.h> 52 #include <gpxe/pci.h> 53 #include <gpxe/pci_io.h> 54 55 #include "base.h" 56 #include "reg.h" 57 58 #define ATH5K_CALIB_INTERVAL 10 /* Calibrate PHY every 10 seconds */ 59 #define ATH5K_RETRIES 4 /* Number of times to retry packet sends */ 60 #define ATH5K_DESC_ALIGN 16 /* Alignment for TX/RX descriptors */ 61 62 /******************\ 63 * Internal defines * 64 \******************/ 65 66 /* Known PCI ids */ 67 static struct pci_device_id ath5k_nics[] = { 68 PCI_ROM(0x168c, 0x0207, "ath5210e", "Atheros 5210 early", AR5K_AR5210), 69 PCI_ROM(0x168c, 0x0007, "ath5210", "Atheros 5210", AR5K_AR5210), 70 PCI_ROM(0x168c, 0x0011, "ath5311", "Atheros 5311 (AHB)", AR5K_AR5211), 71 PCI_ROM(0x168c, 0x0012, "ath5211", "Atheros 5211", AR5K_AR5211), 72 PCI_ROM(0x168c, 0x0013, "ath5212", "Atheros 5212", AR5K_AR5212), 73 PCI_ROM(0xa727, 0x0013, "ath5212c","3com Ath 5212", AR5K_AR5212), 74 PCI_ROM(0x10b7, 0x0013, "rdag675", "3com 3CRDAG675", AR5K_AR5212), 75 PCI_ROM(0x168c, 0x1014, "ath5212m", "Ath 5212 miniPCI", AR5K_AR5212), 76 PCI_ROM(0x168c, 0x0014, "ath5212x14", "Atheros 5212 x14", AR5K_AR5212), 77 PCI_ROM(0x168c, 0x0015, "ath5212x15", "Atheros 5212 x15", AR5K_AR5212), 78 PCI_ROM(0x168c, 0x0016, "ath5212x16", "Atheros 5212 x16", AR5K_AR5212), 79 PCI_ROM(0x168c, 0x0017, "ath5212x17", "Atheros 5212 x17", AR5K_AR5212), 80 PCI_ROM(0x168c, 0x0018, "ath5212x18", "Atheros 5212 x18", AR5K_AR5212), 81 PCI_ROM(0x168c, 0x0019, "ath5212x19", "Atheros 5212 x19", AR5K_AR5212), 82 PCI_ROM(0x168c, 0x001a, "ath2413", "Atheros 2413 Griffin", AR5K_AR5212), 83 PCI_ROM(0x168c, 0x001b, "ath5413", "Atheros 5413 Eagle", AR5K_AR5212), 84 PCI_ROM(0x168c, 0x001c, "ath5212e", "Atheros 5212 PCI-E", AR5K_AR5212), 85 PCI_ROM(0x168c, 0x001d, "ath2417", "Atheros 2417 Nala", AR5K_AR5212), 86 }; 87 88 /* Known SREVs */ 89 static const struct ath5k_srev_name srev_names[] = { 90 { "5210", AR5K_VERSION_MAC, AR5K_SREV_AR5210 }, 91 { "5311", AR5K_VERSION_MAC, AR5K_SREV_AR5311 }, 92 { "5311A", AR5K_VERSION_MAC, AR5K_SREV_AR5311A }, 93 { "5311B", AR5K_VERSION_MAC, AR5K_SREV_AR5311B }, 94 { "5211", AR5K_VERSION_MAC, AR5K_SREV_AR5211 }, 95 { "5212", AR5K_VERSION_MAC, AR5K_SREV_AR5212 }, 96 { "5213", AR5K_VERSION_MAC, AR5K_SREV_AR5213 }, 97 { "5213A", AR5K_VERSION_MAC, AR5K_SREV_AR5213A }, 98 { "2413", AR5K_VERSION_MAC, AR5K_SREV_AR2413 }, 99 { "2414", AR5K_VERSION_MAC, AR5K_SREV_AR2414 }, 100 { "5424", AR5K_VERSION_MAC, AR5K_SREV_AR5424 }, 101 { "5413", AR5K_VERSION_MAC, AR5K_SREV_AR5413 }, 102 { "5414", AR5K_VERSION_MAC, AR5K_SREV_AR5414 }, 103 { "2415", AR5K_VERSION_MAC, AR5K_SREV_AR2415 }, 104 { "5416", AR5K_VERSION_MAC, AR5K_SREV_AR5416 }, 105 { "5418", AR5K_VERSION_MAC, AR5K_SREV_AR5418 }, 106 { "2425", AR5K_VERSION_MAC, AR5K_SREV_AR2425 }, 107 { "2417", AR5K_VERSION_MAC, AR5K_SREV_AR2417 }, 108 { "xxxxx", AR5K_VERSION_MAC, AR5K_SREV_UNKNOWN }, 109 { "5110", AR5K_VERSION_RAD, AR5K_SREV_RAD_5110 }, 110 { "5111", AR5K_VERSION_RAD, AR5K_SREV_RAD_5111 }, 111 { "5111A", AR5K_VERSION_RAD, AR5K_SREV_RAD_5111A }, 112 { "2111", AR5K_VERSION_RAD, AR5K_SREV_RAD_2111 }, 113 { "5112", AR5K_VERSION_RAD, AR5K_SREV_RAD_5112 }, 114 { "5112A", AR5K_VERSION_RAD, AR5K_SREV_RAD_5112A }, 115 { "5112B", AR5K_VERSION_RAD, AR5K_SREV_RAD_5112B }, 116 { "2112", AR5K_VERSION_RAD, AR5K_SREV_RAD_2112 }, 117 { "2112A", AR5K_VERSION_RAD, AR5K_SREV_RAD_2112A }, 118 { "2112B", AR5K_VERSION_RAD, AR5K_SREV_RAD_2112B }, 119 { "2413", AR5K_VERSION_RAD, AR5K_SREV_RAD_2413 }, 120 { "5413", AR5K_VERSION_RAD, AR5K_SREV_RAD_5413 }, 121 { "2316", AR5K_VERSION_RAD, AR5K_SREV_RAD_2316 }, 122 { "2317", AR5K_VERSION_RAD, AR5K_SREV_RAD_2317 }, 123 { "5424", AR5K_VERSION_RAD, AR5K_SREV_RAD_5424 }, 124 { "5133", AR5K_VERSION_RAD, AR5K_SREV_RAD_5133 }, 125 { "xxxxx", AR5K_VERSION_RAD, AR5K_SREV_UNKNOWN }, 126 }; 127 128 #define ATH5K_SPMBL_NO 1 129 #define ATH5K_SPMBL_YES 2 130 #define ATH5K_SPMBL_BOTH 3 131 132 static const struct { 133 u16 bitrate; 134 u8 short_pmbl; 135 u8 hw_code; 136 } ath5k_rates[] = { 137 { 10, ATH5K_SPMBL_BOTH, ATH5K_RATE_CODE_1M }, 138 { 20, ATH5K_SPMBL_NO, ATH5K_RATE_CODE_2M }, 139 { 55, ATH5K_SPMBL_NO, ATH5K_RATE_CODE_5_5M }, 140 { 110, ATH5K_SPMBL_NO, ATH5K_RATE_CODE_11M }, 141 { 60, ATH5K_SPMBL_BOTH, ATH5K_RATE_CODE_6M }, 142 { 90, ATH5K_SPMBL_BOTH, ATH5K_RATE_CODE_9M }, 143 { 120, ATH5K_SPMBL_BOTH, ATH5K_RATE_CODE_12M }, 144 { 180, ATH5K_SPMBL_BOTH, ATH5K_RATE_CODE_18M }, 145 { 240, ATH5K_SPMBL_BOTH, ATH5K_RATE_CODE_24M }, 146 { 360, ATH5K_SPMBL_BOTH, ATH5K_RATE_CODE_36M }, 147 { 480, ATH5K_SPMBL_BOTH, ATH5K_RATE_CODE_48M }, 148 { 540, ATH5K_SPMBL_BOTH, ATH5K_RATE_CODE_54M }, 149 { 20, ATH5K_SPMBL_YES, ATH5K_RATE_CODE_2M | AR5K_SET_SHORT_PREAMBLE }, 150 { 55, ATH5K_SPMBL_YES, ATH5K_RATE_CODE_5_5M | AR5K_SET_SHORT_PREAMBLE }, 151 { 110, ATH5K_SPMBL_YES, ATH5K_RATE_CODE_11M | AR5K_SET_SHORT_PREAMBLE }, 152 { 0, 0, 0 }, 153 }; 154 155 #define ATH5K_NR_RATES 15 156 157 /* 158 * Prototypes - PCI stack related functions 159 */ 160 static int ath5k_probe(struct pci_device *pdev, 161 const struct pci_device_id *id); 162 static void ath5k_remove(struct pci_device *pdev); 163 164 struct pci_driver ath5k_pci_driver __pci_driver = { 165 .ids = ath5k_nics, 166 .id_count = sizeof(ath5k_nics) / sizeof(ath5k_nics[0]), 167 .probe = ath5k_probe, 168 .remove = ath5k_remove, 169 }; 170 171 172 173 /* 174 * Prototypes - MAC 802.11 stack related functions 175 */ 176 static int ath5k_tx(struct net80211_device *dev, struct io_buffer *skb); 177 static int ath5k_reset(struct ath5k_softc *sc, struct net80211_channel *chan); 178 static int ath5k_reset_wake(struct ath5k_softc *sc); 179 static int ath5k_start(struct net80211_device *dev); 180 static void ath5k_stop(struct net80211_device *dev); 181 static int ath5k_config(struct net80211_device *dev, int changed); 182 static void ath5k_poll(struct net80211_device *dev); 183 static void ath5k_irq(struct net80211_device *dev, int enable); 184 185 static struct net80211_device_operations ath5k_ops = { 186 .open = ath5k_start, 187 .close = ath5k_stop, 188 .transmit = ath5k_tx, 189 .poll = ath5k_poll, 190 .irq = ath5k_irq, 191 .config = ath5k_config, 192 }; 193 194 /* 195 * Prototypes - Internal functions 196 */ 197 /* Attach detach */ 198 static int ath5k_attach(struct net80211_device *dev); 199 static void ath5k_detach(struct net80211_device *dev); 200 /* Channel/mode setup */ 201 static unsigned int ath5k_copy_channels(struct ath5k_hw *ah, 202 struct net80211_channel *channels, 203 unsigned int mode, 204 unsigned int max); 205 static int ath5k_setup_bands(struct net80211_device *dev); 206 static int ath5k_chan_set(struct ath5k_softc *sc, 207 struct net80211_channel *chan); 208 static void ath5k_setcurmode(struct ath5k_softc *sc, 209 unsigned int mode); 210 static void ath5k_mode_setup(struct ath5k_softc *sc); 211 212 /* Descriptor setup */ 213 static int ath5k_desc_alloc(struct ath5k_softc *sc); 214 static void ath5k_desc_free(struct ath5k_softc *sc); 215 /* Buffers setup */ 216 static int ath5k_rxbuf_setup(struct ath5k_softc *sc, struct ath5k_buf *bf); 217 static int ath5k_txbuf_setup(struct ath5k_softc *sc, struct ath5k_buf *bf); 218 219 static inline void ath5k_txbuf_free(struct ath5k_softc *sc, 220 struct ath5k_buf *bf) 221 { 222 if (!bf->iob) 223 return; 224 225 net80211_tx_complete(sc->dev, bf->iob, 0, ECANCELED); 226 bf->iob = NULL; 227 } 228 229 static inline void ath5k_rxbuf_free(struct ath5k_softc *sc __unused, 230 struct ath5k_buf *bf) 231 { 232 free_iob(bf->iob); 233 bf->iob = NULL; 234 } 235 236 /* Queues setup */ 237 static int ath5k_txq_setup(struct ath5k_softc *sc, 238 int qtype, int subtype); 239 static void ath5k_txq_drainq(struct ath5k_softc *sc, 240 struct ath5k_txq *txq); 241 static void ath5k_txq_cleanup(struct ath5k_softc *sc); 242 static void ath5k_txq_release(struct ath5k_softc *sc); 243 /* Rx handling */ 244 static int ath5k_rx_start(struct ath5k_softc *sc); 245 static void ath5k_rx_stop(struct ath5k_softc *sc); 246 /* Tx handling */ 247 static void ath5k_tx_processq(struct ath5k_softc *sc, 248 struct ath5k_txq *txq); 249 250 /* Interrupt handling */ 251 static int ath5k_init(struct ath5k_softc *sc); 252 static int ath5k_stop_hw(struct ath5k_softc *sc); 253 254 static void ath5k_calibrate(struct ath5k_softc *sc); 255 256 /* Filter */ 257 static void ath5k_configure_filter(struct ath5k_softc *sc); 258 259 /********************\ 260 * PCI Initialization * 261 \********************/ 262 263 #if DBGLVL_MAX 264 static const char * 265 ath5k_chip_name(enum ath5k_srev_type type, u16 val) 266 { 267 const char *name = "xxxxx"; 268 unsigned int i; 269 270 for (i = 0; i < ARRAY_SIZE(srev_names); i++) { 271 if (srev_names[i].sr_type != type) 272 continue; 273 274 if ((val & 0xf0) == srev_names[i].sr_val) 275 name = srev_names[i].sr_name; 276 277 if ((val & 0xff) == srev_names[i].sr_val) { 278 name = srev_names[i].sr_name; 279 break; 280 } 281 } 282 283 return name; 284 } 285 #endif 286 287 static int ath5k_probe(struct pci_device *pdev, 288 const struct pci_device_id *id) 289 { 290 void *mem; 291 struct ath5k_softc *sc; 292 struct net80211_device *dev; 293 int ret; 294 u8 csz; 295 296 adjust_pci_device(pdev); 297 298 /* 299 * Cache line size is used to size and align various 300 * structures used to communicate with the hardware. 301 */ 302 pci_read_config_byte(pdev, PCI_CACHE_LINE_SIZE, &csz); 303 if (csz == 0) { 304 /* 305 * We must have this setup properly for rx buffer 306 * DMA to work so force a reasonable value here if it 307 * comes up zero. 308 */ 309 csz = 16; 310 pci_write_config_byte(pdev, PCI_CACHE_LINE_SIZE, csz); 311 } 312 /* 313 * The default setting of latency timer yields poor results, 314 * set it to the value used by other systems. It may be worth 315 * tweaking this setting more. 316 */ 317 pci_write_config_byte(pdev, PCI_LATENCY_TIMER, 0xa8); 318 319 /* 320 * Disable the RETRY_TIMEOUT register (0x41) to keep 321 * PCI Tx retries from interfering with C3 CPU state. 322 */ 323 pci_write_config_byte(pdev, 0x41, 0); 324 325 mem = ioremap(pdev->membase, 0x10000); 326 if (!mem) { 327 DBG("ath5k: cannot remap PCI memory region\n"); 328 ret = -EIO; 329 goto err; 330 } 331 332 /* 333 * Allocate dev (net80211 main struct) 334 * and dev->priv (driver private data) 335 */ 336 dev = net80211_alloc(sizeof(*sc)); 337 if (!dev) { 338 DBG("ath5k: cannot allocate 802.11 device\n"); 339 ret = -ENOMEM; 340 goto err_map; 341 } 342 343 /* Initialize driver private data */ 344 sc = dev->priv; 345 sc->dev = dev; 346 sc->pdev = pdev; 347 348 sc->hwinfo = zalloc(sizeof(*sc->hwinfo)); 349 if (!sc->hwinfo) { 350 DBG("ath5k: cannot allocate 802.11 hardware info structure\n"); 351 ret = -ENOMEM; 352 goto err_free; 353 } 354 355 sc->hwinfo->flags = NET80211_HW_RX_HAS_FCS; 356 sc->hwinfo->signal_type = NET80211_SIGNAL_DB; 357 sc->hwinfo->signal_max = 40; /* 35dB should give perfect 54Mbps */ 358 sc->hwinfo->channel_change_time = 5000; 359 360 /* Avoid working with the device until setup is complete */ 361 sc->status |= ATH_STAT_INVALID; 362 363 sc->iobase = mem; 364 sc->cachelsz = csz * 4; /* convert to bytes */ 365 366 DBG("ath5k: register base at %p (%08lx)\n", sc->iobase, pdev->membase); 367 DBG("ath5k: cache line size %d\n", sc->cachelsz); 368 369 /* Set private data */ 370 pci_set_drvdata(pdev, dev); 371 dev->netdev->dev = (struct device *)pdev; 372 373 /* Initialize device */ 374 ret = ath5k_hw_attach(sc, id->driver_data, &sc->ah); 375 if (ret) 376 goto err_free_hwinfo; 377 378 /* Finish private driver data initialization */ 379 ret = ath5k_attach(dev); 380 if (ret) 381 goto err_ah; 382 383 #if DBGLVL_MAX 384 DBG("Atheros AR%s chip found (MAC: 0x%x, PHY: 0x%x)\n", 385 ath5k_chip_name(AR5K_VERSION_MAC, sc->ah->ah_mac_srev), 386 sc->ah->ah_mac_srev, sc->ah->ah_phy_revision); 387 388 if (!sc->ah->ah_single_chip) { 389 /* Single chip radio (!RF5111) */ 390 if (sc->ah->ah_radio_5ghz_revision && 391 !sc->ah->ah_radio_2ghz_revision) { 392 /* No 5GHz support -> report 2GHz radio */ 393 if (!(sc->ah->ah_capabilities.cap_mode & AR5K_MODE_BIT_11A)) { 394 DBG("RF%s 2GHz radio found (0x%x)\n", 395 ath5k_chip_name(AR5K_VERSION_RAD, 396 sc->ah->ah_radio_5ghz_revision), 397 sc->ah->ah_radio_5ghz_revision); 398 /* No 2GHz support (5110 and some 399 * 5Ghz only cards) -> report 5Ghz radio */ 400 } else if (!(sc->ah->ah_capabilities.cap_mode & AR5K_MODE_BIT_11B)) { 401 DBG("RF%s 5GHz radio found (0x%x)\n", 402 ath5k_chip_name(AR5K_VERSION_RAD, 403 sc->ah->ah_radio_5ghz_revision), 404 sc->ah->ah_radio_5ghz_revision); 405 /* Multiband radio */ 406 } else { 407 DBG("RF%s multiband radio found (0x%x)\n", 408 ath5k_chip_name(AR5K_VERSION_RAD, 409 sc->ah->ah_radio_5ghz_revision), 410 sc->ah->ah_radio_5ghz_revision); 411 } 412 } 413 /* Multi chip radio (RF5111 - RF2111) -> 414 * report both 2GHz/5GHz radios */ 415 else if (sc->ah->ah_radio_5ghz_revision && 416 sc->ah->ah_radio_2ghz_revision) { 417 DBG("RF%s 5GHz radio found (0x%x)\n", 418 ath5k_chip_name(AR5K_VERSION_RAD, 419 sc->ah->ah_radio_5ghz_revision), 420 sc->ah->ah_radio_5ghz_revision); 421 DBG("RF%s 2GHz radio found (0x%x)\n", 422 ath5k_chip_name(AR5K_VERSION_RAD, 423 sc->ah->ah_radio_2ghz_revision), 424 sc->ah->ah_radio_2ghz_revision); 425 } 426 } 427 #endif 428 429 /* Ready to go */ 430 sc->status &= ~ATH_STAT_INVALID; 431 432 return 0; 433 err_ah: 434 ath5k_hw_detach(sc->ah); 435 err_free_hwinfo: 436 free(sc->hwinfo); 437 err_free: 438 net80211_free(dev); 439 err_map: 440 iounmap(mem); 441 err: 442 return ret; 443 } 444 445 static void ath5k_remove(struct pci_device *pdev) 446 { 447 struct net80211_device *dev = pci_get_drvdata(pdev); 448 struct ath5k_softc *sc = dev->priv; 449 450 ath5k_detach(dev); 451 ath5k_hw_detach(sc->ah); 452 iounmap(sc->iobase); 453 free(sc->hwinfo); 454 net80211_free(dev); 455 } 456 457 458 /***********************\ 459 * Driver Initialization * 460 \***********************/ 461 462 static int 463 ath5k_attach(struct net80211_device *dev) 464 { 465 struct ath5k_softc *sc = dev->priv; 466 struct ath5k_hw *ah = sc->ah; 467 int ret; 468 469 /* 470 * Collect the channel list. The 802.11 layer 471 * is resposible for filtering this list based 472 * on settings like the phy mode and regulatory 473 * domain restrictions. 474 */ 475 ret = ath5k_setup_bands(dev); 476 if (ret) { 477 DBG("ath5k: can't get channels\n"); 478 goto err; 479 } 480 481 /* NB: setup here so ath5k_rate_update is happy */ 482 if (ah->ah_modes & AR5K_MODE_BIT_11A) 483 ath5k_setcurmode(sc, AR5K_MODE_11A); 484 else 485 ath5k_setcurmode(sc, AR5K_MODE_11B); 486 487 /* 488 * Allocate tx+rx descriptors and populate the lists. 489 */ 490 ret = ath5k_desc_alloc(sc); 491 if (ret) { 492 DBG("ath5k: can't allocate descriptors\n"); 493 goto err; 494 } 495 496 /* 497 * Allocate hardware transmit queues. Note that hw functions 498 * handle reseting these queues at the needed time. 499 */ 500 ret = ath5k_txq_setup(sc, AR5K_TX_QUEUE_DATA, AR5K_WME_AC_BE); 501 if (ret) { 502 DBG("ath5k: can't setup xmit queue\n"); 503 goto err_desc; 504 } 505 506 sc->last_calib_ticks = currticks(); 507 508 ret = ath5k_eeprom_read_mac(ah, sc->hwinfo->hwaddr); 509 if (ret) { 510 DBG("ath5k: unable to read address from EEPROM: 0x%04x\n", 511 sc->pdev->device); 512 goto err_queues; 513 } 514 515 memset(sc->bssidmask, 0xff, ETH_ALEN); 516 ath5k_hw_set_bssid_mask(sc->ah, sc->bssidmask); 517 518 ret = net80211_register(sc->dev, &ath5k_ops, sc->hwinfo); 519 if (ret) { 520 DBG("ath5k: can't register ieee80211 hw\n"); 521 goto err_queues; 522 } 523 524 return 0; 525 err_queues: 526 ath5k_txq_release(sc); 527 err_desc: 528 ath5k_desc_free(sc); 529 err: 530 return ret; 531 } 532 533 static void 534 ath5k_detach(struct net80211_device *dev) 535 { 536 struct ath5k_softc *sc = dev->priv; 537 538 net80211_unregister(dev); 539 ath5k_desc_free(sc); 540 ath5k_txq_release(sc); 541 } 542 543 544 545 546 /********************\ 547 * Channel/mode setup * 548 \********************/ 549 550 /* 551 * Convert IEEE channel number to MHz frequency. 552 */ 553 static inline short 554 ath5k_ieee2mhz(short chan) 555 { 556 if (chan < 14) 557 return 2407 + 5 * chan; 558 if (chan == 14) 559 return 2484; 560 if (chan < 27) 561 return 2212 + 20 * chan; 562 return 5000 + 5 * chan; 563 } 564 565 static unsigned int 566 ath5k_copy_channels(struct ath5k_hw *ah, 567 struct net80211_channel *channels, 568 unsigned int mode, unsigned int max) 569 { 570 unsigned int i, count, size, chfreq, freq, ch; 571 572 if (!(ah->ah_modes & (1 << mode))) 573 return 0; 574 575 switch (mode) { 576 case AR5K_MODE_11A: 577 case AR5K_MODE_11A_TURBO: 578 /* 1..220, but 2GHz frequencies are filtered by check_channel */ 579 size = 220; 580 chfreq = CHANNEL_5GHZ; 581 break; 582 case AR5K_MODE_11B: 583 case AR5K_MODE_11G: 584 case AR5K_MODE_11G_TURBO: 585 size = 26; 586 chfreq = CHANNEL_2GHZ; 587 break; 588 default: 589 return 0; 590 } 591 592 for (i = 0, count = 0; i < size && max > 0; i++) { 593 ch = i + 1 ; 594 freq = ath5k_ieee2mhz(ch); 595 596 /* Check if channel is supported by the chipset */ 597 if (!ath5k_channel_ok(ah, freq, chfreq)) 598 continue; 599 600 /* Write channel info and increment counter */ 601 channels[count].center_freq = freq; 602 channels[count].maxpower = 0; /* use regulatory */ 603 channels[count].band = (chfreq == CHANNEL_2GHZ) ? 604 NET80211_BAND_2GHZ : NET80211_BAND_5GHZ; 605 switch (mode) { 606 case AR5K_MODE_11A: 607 case AR5K_MODE_11G: 608 channels[count].hw_value = chfreq | CHANNEL_OFDM; 609 break; 610 case AR5K_MODE_11A_TURBO: 611 case AR5K_MODE_11G_TURBO: 612 channels[count].hw_value = chfreq | 613 CHANNEL_OFDM | CHANNEL_TURBO; 614 break; 615 case AR5K_MODE_11B: 616 channels[count].hw_value = CHANNEL_B; 617 } 618 619 count++; 620 max--; 621 } 622 623 return count; 624 } 625 626 static int 627 ath5k_setup_bands(struct net80211_device *dev) 628 { 629 struct ath5k_softc *sc = dev->priv; 630 struct ath5k_hw *ah = sc->ah; 631 int max_c, count_c = 0; 632 int i; 633 int band; 634 635 max_c = sizeof(sc->hwinfo->channels) / sizeof(sc->hwinfo->channels[0]); 636 637 /* 2GHz band */ 638 if (sc->ah->ah_capabilities.cap_mode & AR5K_MODE_BIT_11G) { 639 /* G mode */ 640 band = NET80211_BAND_2GHZ; 641 sc->hwinfo->bands = NET80211_BAND_BIT_2GHZ; 642 sc->hwinfo->modes = (NET80211_MODE_G | NET80211_MODE_B); 643 644 for (i = 0; i < 12; i++) 645 sc->hwinfo->rates[band][i] = ath5k_rates[i].bitrate; 646 sc->hwinfo->nr_rates[band] = 12; 647 648 sc->hwinfo->nr_channels = 649 ath5k_copy_channels(ah, sc->hwinfo->channels, 650 AR5K_MODE_11G, max_c); 651 count_c = sc->hwinfo->nr_channels; 652 max_c -= count_c; 653 } else if (sc->ah->ah_capabilities.cap_mode & AR5K_MODE_BIT_11B) { 654 /* B mode */ 655 band = NET80211_BAND_2GHZ; 656 sc->hwinfo->bands = NET80211_BAND_BIT_2GHZ; 657 sc->hwinfo->modes = NET80211_MODE_B; 658 659 for (i = 0; i < 4; i++) 660 sc->hwinfo->rates[band][i] = ath5k_rates[i].bitrate; 661 sc->hwinfo->nr_rates[band] = 4; 662 663 sc->hwinfo->nr_channels = 664 ath5k_copy_channels(ah, sc->hwinfo->channels, 665 AR5K_MODE_11B, max_c); 666 count_c = sc->hwinfo->nr_channels; 667 max_c -= count_c; 668 } 669 670 /* 5GHz band, A mode */ 671 if (sc->ah->ah_capabilities.cap_mode & AR5K_MODE_BIT_11A) { 672 band = NET80211_BAND_5GHZ; 673 sc->hwinfo->bands |= NET80211_BAND_BIT_5GHZ; 674 sc->hwinfo->modes |= NET80211_MODE_A; 675 676 for (i = 0; i < 8; i++) 677 sc->hwinfo->rates[band][i] = ath5k_rates[i+4].bitrate; 678 sc->hwinfo->nr_rates[band] = 8; 679 680 sc->hwinfo->nr_channels = 681 ath5k_copy_channels(ah, sc->hwinfo->channels, 682 AR5K_MODE_11B, max_c); 683 count_c = sc->hwinfo->nr_channels; 684 max_c -= count_c; 685 } 686 687 return 0; 688 } 689 690 /* 691 * Set/change channels. If the channel is really being changed, 692 * it's done by reseting the chip. To accomplish this we must 693 * first cleanup any pending DMA, then restart stuff after a la 694 * ath5k_init. 695 */ 696 static int 697 ath5k_chan_set(struct ath5k_softc *sc, struct net80211_channel *chan) 698 { 699 if (chan->center_freq != sc->curchan->center_freq || 700 chan->hw_value != sc->curchan->hw_value) { 701 /* 702 * To switch channels clear any pending DMA operations; 703 * wait long enough for the RX fifo to drain, reset the 704 * hardware at the new frequency, and then re-enable 705 * the relevant bits of the h/w. 706 */ 707 DBG2("ath5k: resetting for channel change (%d -> %d MHz)\n", 708 sc->curchan->center_freq, chan->center_freq); 709 return ath5k_reset(sc, chan); 710 } 711 712 return 0; 713 } 714 715 static void 716 ath5k_setcurmode(struct ath5k_softc *sc, unsigned int mode) 717 { 718 sc->curmode = mode; 719 720 if (mode == AR5K_MODE_11A) { 721 sc->curband = NET80211_BAND_5GHZ; 722 } else { 723 sc->curband = NET80211_BAND_2GHZ; 724 } 725 } 726 727 static void 728 ath5k_mode_setup(struct ath5k_softc *sc) 729 { 730 struct ath5k_hw *ah = sc->ah; 731 u32 rfilt; 732 733 /* configure rx filter */ 734 rfilt = sc->filter_flags; 735 ath5k_hw_set_rx_filter(ah, rfilt); 736 737 if (ath5k_hw_hasbssidmask(ah)) 738 ath5k_hw_set_bssid_mask(ah, sc->bssidmask); 739 740 /* configure operational mode */ 741 ath5k_hw_set_opmode(ah); 742 743 ath5k_hw_set_mcast_filter(ah, 0, 0); 744 } 745 746 static inline int 747 ath5k_hw_rix_to_bitrate(int hw_rix) 748 { 749 int i; 750 751 for (i = 0; i < ATH5K_NR_RATES; i++) { 752 if (ath5k_rates[i].hw_code == hw_rix) 753 return ath5k_rates[i].bitrate; 754 } 755 756 DBG("ath5k: invalid rix %02x\n", hw_rix); 757 return 10; /* use lowest rate */ 758 } 759 760 int ath5k_bitrate_to_hw_rix(int bitrate) 761 { 762 int i; 763 764 for (i = 0; i < ATH5K_NR_RATES; i++) { 765 if (ath5k_rates[i].bitrate == bitrate) 766 return ath5k_rates[i].hw_code; 767 } 768 769 DBG("ath5k: invalid bitrate %d\n", bitrate); 770 return ATH5K_RATE_CODE_1M; /* use lowest rate */ 771 } 772 773 /***************\ 774 * Buffers setup * 775 \***************/ 776 777 static struct io_buffer * 778 ath5k_rx_iob_alloc(struct ath5k_softc *sc, u32 *iob_addr) 779 { 780 struct io_buffer *iob; 781 unsigned int off; 782 783 /* 784 * Allocate buffer with headroom_needed space for the 785 * fake physical layer header at the start. 786 */ 787 iob = alloc_iob(sc->rxbufsize + sc->cachelsz - 1); 788 789 if (!iob) { 790 DBG("ath5k: can't alloc iobuf of size %d\n", 791 sc->rxbufsize + sc->cachelsz - 1); 792 return NULL; 793 } 794 795 *iob_addr = virt_to_bus(iob->data); 796 797 /* 798 * Cache-line-align. This is important (for the 799 * 5210 at least) as not doing so causes bogus data 800 * in rx'd frames. 801 */ 802 off = *iob_addr % sc->cachelsz; 803 if (off != 0) { 804 iob_reserve(iob, sc->cachelsz - off); 805 *iob_addr += sc->cachelsz - off; 806 } 807 808 return iob; 809 } 810 811 static int 812 ath5k_rxbuf_setup(struct ath5k_softc *sc, struct ath5k_buf *bf) 813 { 814 struct ath5k_hw *ah = sc->ah; 815 struct io_buffer *iob = bf->iob; 816 struct ath5k_desc *ds; 817 818 if (!iob) { 819 iob = ath5k_rx_iob_alloc(sc, &bf->iobaddr); 820 if (!iob) 821 return -ENOMEM; 822 bf->iob = iob; 823 } 824 825 /* 826 * Setup descriptors. For receive we always terminate 827 * the descriptor list with a self-linked entry so we'll 828 * not get overrun under high load (as can happen with a 829 * 5212 when ANI processing enables PHY error frames). 830 * 831 * To insure the last descriptor is self-linked we create 832 * each descriptor as self-linked and add it to the end. As 833 * each additional descriptor is added the previous self-linked 834 * entry is ``fixed'' naturally. This should be safe even 835 * if DMA is happening. When processing RX interrupts we 836 * never remove/process the last, self-linked, entry on the 837 * descriptor list. This insures the hardware always has 838 * someplace to write a new frame. 839 */ 840 ds = bf->desc; 841 ds->ds_link = bf->daddr; /* link to self */ 842 ds->ds_data = bf->iobaddr; 843 if (ah->ah_setup_rx_desc(ah, ds, 844 iob_tailroom(iob), /* buffer size */ 845 0) != 0) { 846 DBG("ath5k: error setting up RX descriptor for %d bytes\n", iob_tailroom(iob)); 847 return -EINVAL; 848 } 849 850 if (sc->rxlink != NULL) 851 *sc->rxlink = bf->daddr; 852 sc->rxlink = &ds->ds_link; 853 return 0; 854 } 855 856 static int 857 ath5k_txbuf_setup(struct ath5k_softc *sc, struct ath5k_buf *bf) 858 { 859 struct ath5k_hw *ah = sc->ah; 860 struct ath5k_txq *txq = &sc->txq; 861 struct ath5k_desc *ds = bf->desc; 862 struct io_buffer *iob = bf->iob; 863 unsigned int pktlen, flags; 864 int ret; 865 u16 duration = 0; 866 u16 cts_rate = 0; 867 868 flags = AR5K_TXDESC_INTREQ | AR5K_TXDESC_CLRDMASK; 869 bf->iobaddr = virt_to_bus(iob->data); 870 pktlen = iob_len(iob); 871 872 /* FIXME: If we are in g mode and rate is a CCK rate 873 * subtract ah->ah_txpower.txp_cck_ofdm_pwr_delta 874 * from tx power (value is in dB units already) */ 875 if (sc->dev->phy_flags & NET80211_PHY_USE_PROTECTION) { 876 struct net80211_device *dev = sc->dev; 877 878 flags |= AR5K_TXDESC_CTSENA; 879 cts_rate = sc->hw_rtscts_rate; 880 duration = net80211_cts_duration(dev, pktlen); 881 } 882 ret = ah->ah_setup_tx_desc(ah, ds, pktlen, 883 IEEE80211_TYP_FRAME_HEADER_LEN, 884 AR5K_PKT_TYPE_NORMAL, sc->power_level * 2, 885 sc->hw_rate, ATH5K_RETRIES, 886 AR5K_TXKEYIX_INVALID, 0, flags, 887 cts_rate, duration); 888 if (ret) 889 return ret; 890 891 ds->ds_link = 0; 892 ds->ds_data = bf->iobaddr; 893 894 list_add_tail(&bf->list, &txq->q); 895 if (txq->link == NULL) /* is this first packet? */ 896 ath5k_hw_set_txdp(ah, txq->qnum, bf->daddr); 897 else /* no, so only link it */ 898 *txq->link = bf->daddr; 899 900 txq->link = &ds->ds_link; 901 ath5k_hw_start_tx_dma(ah, txq->qnum); 902 mb(); 903 904 return 0; 905 } 906 907 /*******************\ 908 * Descriptors setup * 909 \*******************/ 910 911 static int 912 ath5k_desc_alloc(struct ath5k_softc *sc) 913 { 914 struct ath5k_desc *ds; 915 struct ath5k_buf *bf; 916 u32 da; 917 unsigned int i; 918 int ret; 919 920 /* allocate descriptors */ 921 sc->desc_len = sizeof(struct ath5k_desc) * (ATH_TXBUF + ATH_RXBUF + 1); 922 sc->desc = malloc_dma(sc->desc_len, ATH5K_DESC_ALIGN); 923 if (sc->desc == NULL) { 924 DBG("ath5k: can't allocate descriptors\n"); 925 ret = -ENOMEM; 926 goto err; 927 } 928 memset(sc->desc, 0, sc->desc_len); 929 sc->desc_daddr = virt_to_bus(sc->desc); 930 931 ds = sc->desc; 932 da = sc->desc_daddr; 933 934 bf = calloc(ATH_TXBUF + ATH_RXBUF + 1, sizeof(struct ath5k_buf)); 935 if (bf == NULL) { 936 DBG("ath5k: can't allocate buffer pointers\n"); 937 ret = -ENOMEM; 938 goto err_free; 939 } 940 sc->bufptr = bf; 941 942 INIT_LIST_HEAD(&sc->rxbuf); 943 for (i = 0; i < ATH_RXBUF; i++, bf++, ds++, da += sizeof(*ds)) { 944 bf->desc = ds; 945 bf->daddr = da; 946 list_add_tail(&bf->list, &sc->rxbuf); 947 } 948 949 INIT_LIST_HEAD(&sc->txbuf); 950 sc->txbuf_len = ATH_TXBUF; 951 for (i = 0; i < ATH_TXBUF; i++, bf++, ds++, da += sizeof(*ds)) { 952 bf->desc = ds; 953 bf->daddr = da; 954 list_add_tail(&bf->list, &sc->txbuf); 955 } 956 957 return 0; 958 959 err_free: 960 free_dma(sc->desc, sc->desc_len); 961 err: 962 sc->desc = NULL; 963 return ret; 964 } 965 966 static void 967 ath5k_desc_free(struct ath5k_softc *sc) 968 { 969 struct ath5k_buf *bf; 970 971 list_for_each_entry(bf, &sc->txbuf, list) 972 ath5k_txbuf_free(sc, bf); 973 list_for_each_entry(bf, &sc->rxbuf, list) 974 ath5k_rxbuf_free(sc, bf); 975 976 /* Free memory associated with all descriptors */ 977 free_dma(sc->desc, sc->desc_len); 978 979 free(sc->bufptr); 980 sc->bufptr = NULL; 981 } 982 983 984 985 986 987 /**************\ 988 * Queues setup * 989 \**************/ 990 991 static int 992 ath5k_txq_setup(struct ath5k_softc *sc, int qtype, int subtype) 993 { 994 struct ath5k_hw *ah = sc->ah; 995 struct ath5k_txq *txq; 996 struct ath5k_txq_info qi = { 997 .tqi_subtype = subtype, 998 .tqi_aifs = AR5K_TXQ_USEDEFAULT, 999 .tqi_cw_min = AR5K_TXQ_USEDEFAULT, 1000 .tqi_cw_max = AR5K_TXQ_USEDEFAULT 1001 }; 1002 int qnum; 1003 1004 /* 1005 * Enable interrupts only for EOL and DESC conditions. 1006 * We mark tx descriptors to receive a DESC interrupt 1007 * when a tx queue gets deep; otherwise waiting for the 1008 * EOL to reap descriptors. Note that this is done to 1009 * reduce interrupt load and this only defers reaping 1010 * descriptors, never transmitting frames. Aside from 1011 * reducing interrupts this also permits more concurrency. 1012 * The only potential downside is if the tx queue backs 1013 * up in which case the top half of the kernel may backup 1014 * due to a lack of tx descriptors. 1015 */ 1016 qi.tqi_flags = AR5K_TXQ_FLAG_TXEOLINT_ENABLE | 1017 AR5K_TXQ_FLAG_TXDESCINT_ENABLE; 1018 qnum = ath5k_hw_setup_tx_queue(ah, qtype, &qi); 1019 if (qnum < 0) { 1020 DBG("ath5k: can't set up a TX queue\n"); 1021 return -EIO; 1022 } 1023 1024 txq = &sc->txq; 1025 if (!txq->setup) { 1026 txq->qnum = qnum; 1027 txq->link = NULL; 1028 INIT_LIST_HEAD(&txq->q); 1029 txq->setup = 1; 1030 } 1031 return 0; 1032 } 1033 1034 static void 1035 ath5k_txq_drainq(struct ath5k_softc *sc, struct ath5k_txq *txq) 1036 { 1037 struct ath5k_buf *bf, *bf0; 1038 1039 list_for_each_entry_safe(bf, bf0, &txq->q, list) { 1040 ath5k_txbuf_free(sc, bf); 1041 1042 list_del(&bf->list); 1043 list_add_tail(&bf->list, &sc->txbuf); 1044 sc->txbuf_len++; 1045 } 1046 txq->link = NULL; 1047 } 1048 1049 /* 1050 * Drain the transmit queues and reclaim resources. 1051 */ 1052 static void 1053 ath5k_txq_cleanup(struct ath5k_softc *sc) 1054 { 1055 struct ath5k_hw *ah = sc->ah; 1056 1057 if (!(sc->status & ATH_STAT_INVALID)) { 1058 /* don't touch the hardware if marked invalid */ 1059 if (sc->txq.setup) { 1060 ath5k_hw_stop_tx_dma(ah, sc->txq.qnum); 1061 DBG("ath5k: txq [%d] %x, link %p\n", 1062 sc->txq.qnum, 1063 ath5k_hw_get_txdp(ah, sc->txq.qnum), 1064 sc->txq.link); 1065 } 1066 } 1067 1068 if (sc->txq.setup) 1069 ath5k_txq_drainq(sc, &sc->txq); 1070 } 1071 1072 static void 1073 ath5k_txq_release(struct ath5k_softc *sc) 1074 { 1075 if (sc->txq.setup) { 1076 ath5k_hw_release_tx_queue(sc->ah); 1077 sc->txq.setup = 0; 1078 } 1079 } 1080 1081 1082 1083 1084 /*************\ 1085 * RX Handling * 1086 \*************/ 1087 1088 /* 1089 * Enable the receive h/w following a reset. 1090 */ 1091 static int 1092 ath5k_rx_start(struct ath5k_softc *sc) 1093 { 1094 struct ath5k_hw *ah = sc->ah; 1095 struct ath5k_buf *bf; 1096 int ret; 1097 1098 sc->rxbufsize = IEEE80211_MAX_LEN; 1099 if (sc->rxbufsize % sc->cachelsz != 0) 1100 sc->rxbufsize += sc->cachelsz - (sc->rxbufsize % sc->cachelsz); 1101 1102 sc->rxlink = NULL; 1103 1104 list_for_each_entry(bf, &sc->rxbuf, list) { 1105 ret = ath5k_rxbuf_setup(sc, bf); 1106 if (ret != 0) 1107 return ret; 1108 } 1109 1110 bf = list_entry(sc->rxbuf.next, struct ath5k_buf, list); 1111 1112 ath5k_hw_set_rxdp(ah, bf->daddr); 1113 ath5k_hw_start_rx_dma(ah); /* enable recv descriptors */ 1114 ath5k_mode_setup(sc); /* set filters, etc. */ 1115 ath5k_hw_start_rx_pcu(ah); /* re-enable PCU/DMA engine */ 1116 1117 return 0; 1118 } 1119 1120 /* 1121 * Disable the receive h/w in preparation for a reset. 1122 */ 1123 static void 1124 ath5k_rx_stop(struct ath5k_softc *sc) 1125 { 1126 struct ath5k_hw *ah = sc->ah; 1127 1128 ath5k_hw_stop_rx_pcu(ah); /* disable PCU */ 1129 ath5k_hw_set_rx_filter(ah, 0); /* clear recv filter */ 1130 ath5k_hw_stop_rx_dma(ah); /* disable DMA engine */ 1131 1132 sc->rxlink = NULL; /* just in case */ 1133 } 1134 1135 static void 1136 ath5k_handle_rx(struct ath5k_softc *sc) 1137 { 1138 struct ath5k_rx_status rs; 1139 struct io_buffer *iob, *next_iob; 1140 u32 next_iob_addr; 1141 struct ath5k_buf *bf, *bf_last; 1142 struct ath5k_desc *ds; 1143 int ret; 1144 1145 memset(&rs, 0, sizeof(rs)); 1146 1147 if (list_empty(&sc->rxbuf)) { 1148 DBG("ath5k: empty rx buf pool\n"); 1149 return; 1150 } 1151 1152 bf_last = list_entry(sc->rxbuf.prev, struct ath5k_buf, list); 1153 1154 do { 1155 bf = list_entry(sc->rxbuf.next, struct ath5k_buf, list); 1156 assert(bf->iob != NULL); 1157 iob = bf->iob; 1158 ds = bf->desc; 1159 1160 /* 1161 * last buffer must not be freed to ensure proper hardware 1162 * function. When the hardware finishes also a packet next to 1163 * it, we are sure, it doesn't use it anymore and we can go on. 1164 */ 1165 if (bf_last == bf) 1166 bf->flags |= 1; 1167 if (bf->flags) { 1168 struct ath5k_buf *bf_next = list_entry(bf->list.next, 1169 struct ath5k_buf, list); 1170 ret = sc->ah->ah_proc_rx_desc(sc->ah, bf_next->desc, 1171 &rs); 1172 if (ret) 1173 break; 1174 bf->flags &= ~1; 1175 /* skip the overwritten one (even status is martian) */ 1176 goto next; 1177 } 1178 1179 ret = sc->ah->ah_proc_rx_desc(sc->ah, ds, &rs); 1180 if (ret) { 1181 if (ret != -EINPROGRESS) { 1182 DBG("ath5k: error in processing rx desc: %s\n", 1183 strerror(ret)); 1184 net80211_rx_err(sc->dev, NULL, -ret); 1185 } else { 1186 /* normal return, reached end of 1187 available descriptors */ 1188 } 1189 return; 1190 } 1191 1192 if (rs.rs_more) { 1193 DBG("ath5k: unsupported fragmented rx\n"); 1194 goto next; 1195 } 1196 1197 if (rs.rs_status) { 1198 if (rs.rs_status & AR5K_RXERR_PHY) { 1199 /* These are uncommon, and may indicate a real problem. */ 1200 net80211_rx_err(sc->dev, NULL, EIO); 1201 goto next; 1202 } 1203 if (rs.rs_status & AR5K_RXERR_CRC) { 1204 /* These occur *all the time*. */ 1205 goto next; 1206 } 1207 if (rs.rs_status & AR5K_RXERR_DECRYPT) { 1208 /* 1209 * Decrypt error. If the error occurred 1210 * because there was no hardware key, then 1211 * let the frame through so the upper layers 1212 * can process it. This is necessary for 5210 1213 * parts which have no way to setup a ``clear'' 1214 * key cache entry. 1215 * 1216 * XXX do key cache faulting 1217 */ 1218 if (rs.rs_keyix == AR5K_RXKEYIX_INVALID && 1219 !(rs.rs_status & AR5K_RXERR_CRC)) 1220 goto accept; 1221 } 1222 1223 /* any other error, unhandled */ 1224 DBG("ath5k: packet rx status %x\n", rs.rs_status); 1225 goto next; 1226 } 1227 accept: 1228 next_iob = ath5k_rx_iob_alloc(sc, &next_iob_addr); 1229 1230 /* 1231 * If we can't replace bf->iob with a new iob under memory 1232 * pressure, just skip this packet 1233 */ 1234 if (!next_iob) { 1235 DBG("ath5k: dropping packet under memory pressure\n"); 1236 goto next; 1237 } 1238 1239 iob_put(iob, rs.rs_datalen); 1240 1241 /* The MAC header is padded to have 32-bit boundary if the 1242 * packet payload is non-zero. However, gPXE only 1243 * supports standard 802.11 packets with 24-byte 1244 * header, so no padding correction should be needed. 1245 */ 1246 1247 DBG2("ath5k: rx %d bytes, signal %d\n", rs.rs_datalen, 1248 rs.rs_rssi); 1249 1250 net80211_rx(sc->dev, iob, rs.rs_rssi, 1251 ath5k_hw_rix_to_bitrate(rs.rs_rate)); 1252 1253 bf->iob = next_iob; 1254 bf->iobaddr = next_iob_addr; 1255 next: 1256 list_del(&bf->list); 1257 list_add_tail(&bf->list, &sc->rxbuf); 1258 } while (ath5k_rxbuf_setup(sc, bf) == 0); 1259 } 1260 1261 1262 1263 1264 /*************\ 1265 * TX Handling * 1266 \*************/ 1267 1268 static void 1269 ath5k_tx_processq(struct ath5k_softc *sc, struct ath5k_txq *txq) 1270 { 1271 struct ath5k_tx_status ts; 1272 struct ath5k_buf *bf, *bf0; 1273 struct ath5k_desc *ds; 1274 struct io_buffer *iob; 1275 int ret; 1276 1277 memset(&ts, 0, sizeof(ts)); 1278 1279 list_for_each_entry_safe(bf, bf0, &txq->q, list) { 1280 ds = bf->desc; 1281 1282 ret = sc->ah->ah_proc_tx_desc(sc->ah, ds, &ts); 1283 if (ret) { 1284 if (ret != -EINPROGRESS) { 1285 DBG("ath5k: error in processing tx desc: %s\n", 1286 strerror(ret)); 1287 } else { 1288 /* normal return, reached end of tx completions */ 1289 } 1290 break; 1291 } 1292 1293 iob = bf->iob; 1294 bf->iob = NULL; 1295 1296 DBG2("ath5k: tx %d bytes complete, %d retries\n", 1297 iob_len(iob), ts.ts_retry[0]); 1298 1299 net80211_tx_complete(sc->dev, iob, ts.ts_retry[0], 1300 ts.ts_status ? EIO : 0); 1301 1302 list_del(&bf->list); 1303 list_add_tail(&bf->list, &sc->txbuf); 1304 sc->txbuf_len++; 1305 } 1306 1307 if (list_empty(&txq->q)) 1308 txq->link = NULL; 1309 } 1310 1311 static void 1312 ath5k_handle_tx(struct ath5k_softc *sc) 1313 { 1314 ath5k_tx_processq(sc, &sc->txq); 1315 } 1316 1317 1318 /********************\ 1319 * Interrupt handling * 1320 \********************/ 1321 1322 static void 1323 ath5k_irq(struct net80211_device *dev, int enable) 1324 { 1325 struct ath5k_softc *sc = dev->priv; 1326 struct ath5k_hw *ah = sc->ah; 1327 1328 sc->irq_ena = enable; 1329 ah->ah_ier = enable ? AR5K_IER_ENABLE : AR5K_IER_DISABLE; 1330 1331 ath5k_hw_reg_write(ah, ah->ah_ier, AR5K_IER); 1332 ath5k_hw_set_imr(ah, sc->imask); 1333 } 1334 1335 static int 1336 ath5k_init(struct ath5k_softc *sc) 1337 { 1338 struct ath5k_hw *ah = sc->ah; 1339 int ret, i; 1340 1341 /* 1342 * Stop anything previously setup. This is safe 1343 * no matter this is the first time through or not. 1344 */ 1345 ath5k_stop_hw(sc); 1346 1347 /* 1348 * The basic interface to setting the hardware in a good 1349 * state is ``reset''. On return the hardware is known to 1350 * be powered up and with interrupts disabled. This must 1351 * be followed by initialization of the appropriate bits 1352 * and then setup of the interrupt mask. 1353 */ 1354 sc->curchan = sc->dev->channels + sc->dev->channel; 1355 sc->curband = sc->curchan->band; 1356 sc->imask = AR5K_INT_RXOK | AR5K_INT_RXERR | AR5K_INT_RXEOL | 1357 AR5K_INT_RXORN | AR5K_INT_TXDESC | AR5K_INT_TXEOL | 1358 AR5K_INT_FATAL | AR5K_INT_GLOBAL; 1359 ret = ath5k_reset(sc, NULL); 1360 if (ret) 1361 goto done; 1362 1363 ath5k_rfkill_hw_start(ah); 1364 1365 /* 1366 * Reset the key cache since some parts do not reset the 1367 * contents on initial power up or resume from suspend. 1368 */ 1369 for (i = 0; i < AR5K_KEYTABLE_SIZE; i++) 1370 ath5k_hw_reset_key(ah, i); 1371 1372 /* Set ack to be sent at low bit-rates */ 1373 ath5k_hw_set_ack_bitrate_high(ah, 0); 1374 1375 ret = 0; 1376 done: 1377 mb(); 1378 return ret; 1379 } 1380 1381 static int 1382 ath5k_stop_hw(struct ath5k_softc *sc) 1383 { 1384 struct ath5k_hw *ah = sc->ah; 1385 1386 /* 1387 * Shutdown the hardware and driver: 1388 * stop output from above 1389 * disable interrupts 1390 * turn off timers 1391 * turn off the radio 1392 * clear transmit machinery 1393 * clear receive machinery 1394 * drain and release tx queues 1395 * reclaim beacon resources 1396 * power down hardware 1397 * 1398 * Note that some of this work is not possible if the 1399 * hardware is gone (invalid). 1400 */ 1401 1402 if (!(sc->status & ATH_STAT_INVALID)) { 1403 ath5k_hw_set_imr(ah, 0); 1404 } 1405 ath5k_txq_cleanup(sc); 1406 if (!(sc->status & ATH_STAT_INVALID)) { 1407 ath5k_rx_stop(sc); 1408 ath5k_hw_phy_disable(ah); 1409 } else 1410 sc->rxlink = NULL; 1411 1412 ath5k_rfkill_hw_stop(sc->ah); 1413 1414 return 0; 1415 } 1416 1417 static void 1418 ath5k_poll(struct net80211_device *dev) 1419 { 1420 struct ath5k_softc *sc = dev->priv; 1421 struct ath5k_hw *ah = sc->ah; 1422 enum ath5k_int status; 1423 unsigned int counter = 1000; 1424 1425 if (currticks() - sc->last_calib_ticks > 1426 ATH5K_CALIB_INTERVAL * ticks_per_sec()) { 1427 ath5k_calibrate(sc); 1428 sc->last_calib_ticks = currticks(); 1429 } 1430 1431 if ((sc->status & ATH_STAT_INVALID) || 1432 (sc->irq_ena && !ath5k_hw_is_intr_pending(ah))) 1433 return; 1434 1435 do { 1436 ath5k_hw_get_isr(ah, &status); /* NB: clears IRQ too */ 1437 DBGP("ath5k: status %#x/%#x\n", status, sc->imask); 1438 if (status & AR5K_INT_FATAL) { 1439 /* 1440 * Fatal errors are unrecoverable. 1441 * Typically these are caused by DMA errors. 1442 */ 1443 DBG("ath5k: fatal error, resetting\n"); 1444 ath5k_reset_wake(sc); 1445 } else if (status & AR5K_INT_RXORN) { 1446 DBG("ath5k: rx overrun, resetting\n"); 1447 ath5k_reset_wake(sc); 1448 } else { 1449 if (status & AR5K_INT_RXEOL) { 1450 /* 1451 * NB: the hardware should re-read the link when 1452 * RXE bit is written, but it doesn't work at 1453 * least on older hardware revs. 1454 */ 1455 DBG("ath5k: rx EOL\n"); 1456 sc->rxlink = NULL; 1457 } 1458 if (status & AR5K_INT_TXURN) { 1459 /* bump tx trigger level */ 1460 DBG("ath5k: tx underrun\n"); 1461 ath5k_hw_update_tx_triglevel(ah, 1); 1462 } 1463 if (status & (AR5K_INT_RXOK | AR5K_INT_RXERR)) 1464 ath5k_handle_rx(sc); 1465 if (status & (AR5K_INT_TXOK | AR5K_INT_TXDESC 1466 | AR5K_INT_TXERR | AR5K_INT_TXEOL)) 1467 ath5k_handle_tx(sc); 1468 } 1469 } while (ath5k_hw_is_intr_pending(ah) && counter-- > 0); 1470 1471 if (!counter) 1472 DBG("ath5k: too many interrupts, giving up for now\n"); 1473 } 1474 1475 /* 1476 * Periodically recalibrate the PHY to account 1477 * for temperature/environment changes. 1478 */ 1479 static void 1480 ath5k_calibrate(struct ath5k_softc *sc) 1481 { 1482 struct ath5k_hw *ah = sc->ah; 1483 1484 if (ath5k_hw_gainf_calibrate(ah) == AR5K_RFGAIN_NEED_CHANGE) { 1485 /* 1486 * Rfgain is out of bounds, reset the chip 1487 * to load new gain values. 1488 */ 1489 DBG("ath5k: resetting for calibration\n"); 1490 ath5k_reset_wake(sc); 1491 } 1492 if (ath5k_hw_phy_calibrate(ah, sc->curchan)) 1493 DBG("ath5k: calibration of channel %d failed\n", 1494 sc->curchan->channel_nr); 1495 } 1496 1497 1498 /********************\ 1499 * Net80211 functions * 1500 \********************/ 1501 1502 static int 1503 ath5k_tx(struct net80211_device *dev, struct io_buffer *iob) 1504 { 1505 struct ath5k_softc *sc = dev->priv; 1506 struct ath5k_buf *bf; 1507 int rc; 1508 1509 /* 1510 * The hardware expects the header padded to 4 byte boundaries. 1511 * gPXE only ever sends 24-byte headers, so no action necessary. 1512 */ 1513 1514 if (list_empty(&sc->txbuf)) { 1515 DBG("ath5k: dropping packet because no tx bufs available\n"); 1516 return -ENOBUFS; 1517 } 1518 1519 bf = list_entry(sc->txbuf.next, struct ath5k_buf, list); 1520 list_del(&bf->list); 1521 sc->txbuf_len--; 1522 1523 bf->iob = iob; 1524 1525 if ((rc = ath5k_txbuf_setup(sc, bf)) != 0) { 1526 bf->iob = NULL; 1527 list_add_tail(&bf->list, &sc->txbuf); 1528 sc->txbuf_len++; 1529 return rc; 1530 } 1531 return 0; 1532 } 1533 1534 /* 1535 * Reset the hardware. If chan is not NULL, then also pause rx/tx 1536 * and change to the given channel. 1537 */ 1538 static int 1539 ath5k_reset(struct ath5k_softc *sc, struct net80211_channel *chan) 1540 { 1541 struct ath5k_hw *ah = sc->ah; 1542 int ret; 1543 1544 if (chan) { 1545 ath5k_hw_set_imr(ah, 0); 1546 ath5k_txq_cleanup(sc); 1547 ath5k_rx_stop(sc); 1548 1549 sc->curchan = chan; 1550 sc->curband = chan->band; 1551 } 1552 1553 ret = ath5k_hw_reset(ah, sc->curchan, 1); 1554 if (ret) { 1555 DBG("ath5k: can't reset hardware: %s\n", strerror(ret)); 1556 return ret; 1557 } 1558 1559 ret = ath5k_rx_start(sc); 1560 if (ret) { 1561 DBG("ath5k: can't start rx logic: %s\n", strerror(ret)); 1562 return ret; 1563 } 1564 1565 /* 1566 * Change channels and update the h/w rate map if we're switching; 1567 * e.g. 11a to 11b/g. 1568 * 1569 * We may be doing a reset in response to an ioctl that changes the 1570 * channel so update any state that might change as a result. 1571 * 1572 * XXX needed? 1573 */ 1574 /* ath5k_chan_change(sc, c); */ 1575 1576 /* Reenable interrupts if necessary */ 1577 ath5k_irq(sc->dev, sc->irq_ena); 1578 1579 return 0; 1580 } 1581 1582 static int ath5k_reset_wake(struct ath5k_softc *sc) 1583 { 1584 return ath5k_reset(sc, sc->curchan); 1585 } 1586 1587 static int ath5k_start(struct net80211_device *dev) 1588 { 1589 struct ath5k_softc *sc = dev->priv; 1590 int ret; 1591 1592 if ((ret = ath5k_init(sc)) != 0) 1593 return ret; 1594 1595 sc->assoc = 0; 1596 ath5k_configure_filter(sc); 1597 ath5k_hw_set_lladdr(sc->ah, dev->netdev->ll_addr); 1598 1599 return 0; 1600 } 1601 1602 static void ath5k_stop(struct net80211_device *dev) 1603 { 1604 struct ath5k_softc *sc = dev->priv; 1605 u8 mac[ETH_ALEN] = {}; 1606 1607 ath5k_hw_set_lladdr(sc->ah, mac); 1608 1609 ath5k_stop_hw(sc); 1610 } 1611 1612 static int 1613 ath5k_config(struct net80211_device *dev, int changed) 1614 { 1615 struct ath5k_softc *sc = dev->priv; 1616 struct ath5k_hw *ah = sc->ah; 1617 struct net80211_channel *chan = &dev->channels[dev->channel]; 1618 int ret; 1619 1620 if (changed & NET80211_CFG_CHANNEL) { 1621 sc->power_level = chan->maxpower; 1622 if ((ret = ath5k_chan_set(sc, chan)) != 0) 1623 return ret; 1624 } 1625 1626 if ((changed & NET80211_CFG_RATE) || 1627 (changed & NET80211_CFG_PHY_PARAMS)) { 1628 int spmbl = ATH5K_SPMBL_NO; 1629 u16 rate = dev->rates[dev->rate]; 1630 u16 slowrate = dev->rates[dev->rtscts_rate]; 1631 int i; 1632 1633 if (dev->phy_flags & NET80211_PHY_USE_SHORT_PREAMBLE) 1634 spmbl = ATH5K_SPMBL_YES; 1635 1636 for (i = 0; i < ATH5K_NR_RATES; i++) { 1637 if (ath5k_rates[i].bitrate == rate && 1638 (ath5k_rates[i].short_pmbl & spmbl)) 1639 sc->hw_rate = ath5k_rates[i].hw_code; 1640 1641 if (ath5k_rates[i].bitrate == slowrate && 1642 (ath5k_rates[i].short_pmbl & spmbl)) 1643 sc->hw_rtscts_rate = ath5k_rates[i].hw_code; 1644 } 1645 } 1646 1647 if (changed & NET80211_CFG_ASSOC) { 1648 sc->assoc = !!(dev->state & NET80211_ASSOCIATED); 1649 if (sc->assoc) { 1650 memcpy(ah->ah_bssid, dev->bssid, ETH_ALEN); 1651 } else { 1652 memset(ah->ah_bssid, 0xff, ETH_ALEN); 1653 } 1654 ath5k_hw_set_associd(ah, ah->ah_bssid, 0); 1655 } 1656 1657 return 0; 1658 } 1659 1660 /* 1661 * o always accept unicast, broadcast, and multicast traffic 1662 * o multicast traffic for all BSSIDs will be enabled if mac80211 1663 * says it should be 1664 * o maintain current state of phy ofdm or phy cck error reception. 1665 * If the hardware detects any of these type of errors then 1666 * ath5k_hw_get_rx_filter() will pass to us the respective 1667 * hardware filters to be able to receive these type of frames. 1668 * o probe request frames are accepted only when operating in 1669 * hostap, adhoc, or monitor modes 1670 * o enable promiscuous mode according to the interface state 1671 * o accept beacons: 1672 * - when operating in adhoc mode so the 802.11 layer creates 1673 * node table entries for peers, 1674 * - when operating in station mode for collecting rssi data when 1675 * the station is otherwise quiet, or 1676 * - when scanning 1677 */ 1678 static void ath5k_configure_filter(struct ath5k_softc *sc) 1679 { 1680 struct ath5k_hw *ah = sc->ah; 1681 u32 mfilt[2], rfilt; 1682 1683 /* Enable all multicast */ 1684 mfilt[0] = ~0; 1685 mfilt[1] = ~0; 1686 1687 /* Enable data frames and beacons */ 1688 rfilt = (AR5K_RX_FILTER_UCAST | AR5K_RX_FILTER_BCAST | 1689 AR5K_RX_FILTER_MCAST | AR5K_RX_FILTER_BEACON); 1690 1691 /* Set filters */ 1692 ath5k_hw_set_rx_filter(ah, rfilt); 1693 1694 /* Set multicast bits */ 1695 ath5k_hw_set_mcast_filter(ah, mfilt[0], mfilt[1]); 1696 1697 /* Set the cached hw filter flags, this will alter actually 1698 * be set in HW */ 1699 sc->filter_flags = rfilt; 1700 } 1701