linux/drivers/net/wireless/ath/ath9k/main.c
<<
>>
Prefs
   1/*
   2 * Copyright (c) 2008-2009 Atheros Communications Inc.
   3 *
   4 * Permission to use, copy, modify, and/or distribute this software for any
   5 * purpose with or without fee is hereby granted, provided that the above
   6 * copyright notice and this permission notice appear in all copies.
   7 *
   8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
   9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
  10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
  11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
  12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
  13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
  14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  15 */
  16
  17#include <linux/nl80211.h>
  18#include "ath9k.h"
  19
  20static char *dev_info = "ath9k";
  21
  22MODULE_AUTHOR("Atheros Communications");
  23MODULE_DESCRIPTION("Support for Atheros 802.11n wireless LAN cards.");
  24MODULE_SUPPORTED_DEVICE("Atheros 802.11n WLAN cards");
  25MODULE_LICENSE("Dual BSD/GPL");
  26
  27static int modparam_nohwcrypt;
  28module_param_named(nohwcrypt, modparam_nohwcrypt, int, 0444);
  29MODULE_PARM_DESC(nohwcrypt, "Disable hardware encryption");
  30
  31/* We use the hw_value as an index into our private channel structure */
  32
  33#define CHAN2G(_freq, _idx)  { \
  34        .center_freq = (_freq), \
  35        .hw_value = (_idx), \
  36        .max_power = 20, \
  37}
  38
  39#define CHAN5G(_freq, _idx) { \
  40        .band = IEEE80211_BAND_5GHZ, \
  41        .center_freq = (_freq), \
  42        .hw_value = (_idx), \
  43        .max_power = 20, \
  44}
  45
  46/* Some 2 GHz radios are actually tunable on 2312-2732
  47 * on 5 MHz steps, we support the channels which we know
  48 * we have calibration data for all cards though to make
  49 * this static */
  50static struct ieee80211_channel ath9k_2ghz_chantable[] = {
  51        CHAN2G(2412, 0), /* Channel 1 */
  52        CHAN2G(2417, 1), /* Channel 2 */
  53        CHAN2G(2422, 2), /* Channel 3 */
  54        CHAN2G(2427, 3), /* Channel 4 */
  55        CHAN2G(2432, 4), /* Channel 5 */
  56        CHAN2G(2437, 5), /* Channel 6 */
  57        CHAN2G(2442, 6), /* Channel 7 */
  58        CHAN2G(2447, 7), /* Channel 8 */
  59        CHAN2G(2452, 8), /* Channel 9 */
  60        CHAN2G(2457, 9), /* Channel 10 */
  61        CHAN2G(2462, 10), /* Channel 11 */
  62        CHAN2G(2467, 11), /* Channel 12 */
  63        CHAN2G(2472, 12), /* Channel 13 */
  64        CHAN2G(2484, 13), /* Channel 14 */
  65};
  66
  67/* Some 5 GHz radios are actually tunable on XXXX-YYYY
  68 * on 5 MHz steps, we support the channels which we know
  69 * we have calibration data for all cards though to make
  70 * this static */
  71static struct ieee80211_channel ath9k_5ghz_chantable[] = {
  72        /* _We_ call this UNII 1 */
  73        CHAN5G(5180, 14), /* Channel 36 */
  74        CHAN5G(5200, 15), /* Channel 40 */
  75        CHAN5G(5220, 16), /* Channel 44 */
  76        CHAN5G(5240, 17), /* Channel 48 */
  77        /* _We_ call this UNII 2 */
  78        CHAN5G(5260, 18), /* Channel 52 */
  79        CHAN5G(5280, 19), /* Channel 56 */
  80        CHAN5G(5300, 20), /* Channel 60 */
  81        CHAN5G(5320, 21), /* Channel 64 */
  82        /* _We_ call this "Middle band" */
  83        CHAN5G(5500, 22), /* Channel 100 */
  84        CHAN5G(5520, 23), /* Channel 104 */
  85        CHAN5G(5540, 24), /* Channel 108 */
  86        CHAN5G(5560, 25), /* Channel 112 */
  87        CHAN5G(5580, 26), /* Channel 116 */
  88        CHAN5G(5600, 27), /* Channel 120 */
  89        CHAN5G(5620, 28), /* Channel 124 */
  90        CHAN5G(5640, 29), /* Channel 128 */
  91        CHAN5G(5660, 30), /* Channel 132 */
  92        CHAN5G(5680, 31), /* Channel 136 */
  93        CHAN5G(5700, 32), /* Channel 140 */
  94        /* _We_ call this UNII 3 */
  95        CHAN5G(5745, 33), /* Channel 149 */
  96        CHAN5G(5765, 34), /* Channel 153 */
  97        CHAN5G(5785, 35), /* Channel 157 */
  98        CHAN5G(5805, 36), /* Channel 161 */
  99        CHAN5G(5825, 37), /* Channel 165 */
 100};
 101
 102static void ath_cache_conf_rate(struct ath_softc *sc,
 103                                struct ieee80211_conf *conf)
 104{
 105        switch (conf->channel->band) {
 106        case IEEE80211_BAND_2GHZ:
 107                if (conf_is_ht20(conf))
 108                        sc->cur_rate_table =
 109                          sc->hw_rate_table[ATH9K_MODE_11NG_HT20];
 110                else if (conf_is_ht40_minus(conf))
 111                        sc->cur_rate_table =
 112                          sc->hw_rate_table[ATH9K_MODE_11NG_HT40MINUS];
 113                else if (conf_is_ht40_plus(conf))
 114                        sc->cur_rate_table =
 115                          sc->hw_rate_table[ATH9K_MODE_11NG_HT40PLUS];
 116                else
 117                        sc->cur_rate_table =
 118                          sc->hw_rate_table[ATH9K_MODE_11G];
 119                break;
 120        case IEEE80211_BAND_5GHZ:
 121                if (conf_is_ht20(conf))
 122                        sc->cur_rate_table =
 123                          sc->hw_rate_table[ATH9K_MODE_11NA_HT20];
 124                else if (conf_is_ht40_minus(conf))
 125                        sc->cur_rate_table =
 126                          sc->hw_rate_table[ATH9K_MODE_11NA_HT40MINUS];
 127                else if (conf_is_ht40_plus(conf))
 128                        sc->cur_rate_table =
 129                          sc->hw_rate_table[ATH9K_MODE_11NA_HT40PLUS];
 130                else
 131                        sc->cur_rate_table =
 132                          sc->hw_rate_table[ATH9K_MODE_11A];
 133                break;
 134        default:
 135                BUG_ON(1);
 136                break;
 137        }
 138}
 139
 140static void ath_update_txpow(struct ath_softc *sc)
 141{
 142        struct ath_hw *ah = sc->sc_ah;
 143        u32 txpow;
 144
 145        if (sc->curtxpow != sc->config.txpowlimit) {
 146                ath9k_hw_set_txpowerlimit(ah, sc->config.txpowlimit);
 147                /* read back in case value is clamped */
 148                ath9k_hw_getcapability(ah, ATH9K_CAP_TXPOW, 1, &txpow);
 149                sc->curtxpow = txpow;
 150        }
 151}
 152
 153static u8 parse_mpdudensity(u8 mpdudensity)
 154{
 155        /*
 156         * 802.11n D2.0 defined values for "Minimum MPDU Start Spacing":
 157         *   0 for no restriction
 158         *   1 for 1/4 us
 159         *   2 for 1/2 us
 160         *   3 for 1 us
 161         *   4 for 2 us
 162         *   5 for 4 us
 163         *   6 for 8 us
 164         *   7 for 16 us
 165         */
 166        switch (mpdudensity) {
 167        case 0:
 168                return 0;
 169        case 1:
 170        case 2:
 171        case 3:
 172                /* Our lower layer calculations limit our precision to
 173                   1 microsecond */
 174                return 1;
 175        case 4:
 176                return 2;
 177        case 5:
 178                return 4;
 179        case 6:
 180                return 8;
 181        case 7:
 182                return 16;
 183        default:
 184                return 0;
 185        }
 186}
 187
 188static void ath_setup_rates(struct ath_softc *sc, enum ieee80211_band band)
 189{
 190        const struct ath_rate_table *rate_table = NULL;
 191        struct ieee80211_supported_band *sband;
 192        struct ieee80211_rate *rate;
 193        int i, maxrates;
 194
 195        switch (band) {
 196        case IEEE80211_BAND_2GHZ:
 197                rate_table = sc->hw_rate_table[ATH9K_MODE_11G];
 198                break;
 199        case IEEE80211_BAND_5GHZ:
 200                rate_table = sc->hw_rate_table[ATH9K_MODE_11A];
 201                break;
 202        default:
 203                break;
 204        }
 205
 206        if (rate_table == NULL)
 207                return;
 208
 209        sband = &sc->sbands[band];
 210        rate = sc->rates[band];
 211
 212        if (rate_table->rate_cnt > ATH_RATE_MAX)
 213                maxrates = ATH_RATE_MAX;
 214        else
 215                maxrates = rate_table->rate_cnt;
 216
 217        for (i = 0; i < maxrates; i++) {
 218                rate[i].bitrate = rate_table->info[i].ratekbps / 100;
 219                rate[i].hw_value = rate_table->info[i].ratecode;
 220                if (rate_table->info[i].short_preamble) {
 221                        rate[i].hw_value_short = rate_table->info[i].ratecode |
 222                                rate_table->info[i].short_preamble;
 223                        rate[i].flags = IEEE80211_RATE_SHORT_PREAMBLE;
 224                }
 225                sband->n_bitrates++;
 226
 227                DPRINTF(sc, ATH_DBG_CONFIG, "Rate: %2dMbps, ratecode: %2d\n",
 228                        rate[i].bitrate / 10, rate[i].hw_value);
 229        }
 230}
 231
 232static struct ath9k_channel *ath_get_curchannel(struct ath_softc *sc,
 233                                                struct ieee80211_hw *hw)
 234{
 235        struct ieee80211_channel *curchan = hw->conf.channel;
 236        struct ath9k_channel *channel;
 237        u8 chan_idx;
 238
 239        chan_idx = curchan->hw_value;
 240        channel = &sc->sc_ah->channels[chan_idx];
 241        ath9k_update_ichannel(sc, hw, channel);
 242        return channel;
 243}
 244
 245/*
 246 * Set/change channels.  If the channel is really being changed, it's done
 247 * by reseting the chip.  To accomplish this we must first cleanup any pending
 248 * DMA, then restart stuff.
 249*/
 250int ath_set_channel(struct ath_softc *sc, struct ieee80211_hw *hw,
 251                    struct ath9k_channel *hchan)
 252{
 253        struct ath_hw *ah = sc->sc_ah;
 254        bool fastcc = true, stopped;
 255        struct ieee80211_channel *channel = hw->conf.channel;
 256        int r;
 257
 258        if (sc->sc_flags & SC_OP_INVALID)
 259                return -EIO;
 260
 261        ath9k_ps_wakeup(sc);
 262
 263        /*
 264         * This is only performed if the channel settings have
 265         * actually changed.
 266         *
 267         * To switch channels clear any pending DMA operations;
 268         * wait long enough for the RX fifo to drain, reset the
 269         * hardware at the new frequency, and then re-enable
 270         * the relevant bits of the h/w.
 271         */
 272        ath9k_hw_set_interrupts(ah, 0);
 273        ath_drain_all_txq(sc, false);
 274        stopped = ath_stoprecv(sc);
 275
 276        /* XXX: do not flush receive queue here. We don't want
 277         * to flush data frames already in queue because of
 278         * changing channel. */
 279
 280        if (!stopped || (sc->sc_flags & SC_OP_FULL_RESET))
 281                fastcc = false;
 282
 283        DPRINTF(sc, ATH_DBG_CONFIG,
 284                "(%u MHz) -> (%u MHz), chanwidth: %d\n",
 285                sc->sc_ah->curchan->channel,
 286                channel->center_freq, sc->tx_chan_width);
 287
 288        spin_lock_bh(&sc->sc_resetlock);
 289
 290        r = ath9k_hw_reset(ah, hchan, fastcc);
 291        if (r) {
 292                DPRINTF(sc, ATH_DBG_FATAL,
 293                        "Unable to reset channel (%u Mhz) "
 294                        "reset status %d\n",
 295                        channel->center_freq, r);
 296                spin_unlock_bh(&sc->sc_resetlock);
 297                goto ps_restore;
 298        }
 299        spin_unlock_bh(&sc->sc_resetlock);
 300
 301        sc->sc_flags &= ~SC_OP_FULL_RESET;
 302
 303        if (ath_startrecv(sc) != 0) {
 304                DPRINTF(sc, ATH_DBG_FATAL,
 305                        "Unable to restart recv logic\n");
 306                r = -EIO;
 307                goto ps_restore;
 308        }
 309
 310        ath_cache_conf_rate(sc, &hw->conf);
 311        ath_update_txpow(sc);
 312        ath9k_hw_set_interrupts(ah, sc->imask);
 313
 314 ps_restore:
 315        ath9k_ps_restore(sc);
 316        return r;
 317}
 318
 319/*
 320 *  This routine performs the periodic noise floor calibration function
 321 *  that is used to adjust and optimize the chip performance.  This
 322 *  takes environmental changes (location, temperature) into account.
 323 *  When the task is complete, it reschedules itself depending on the
 324 *  appropriate interval that was calculated.
 325 */
 326static void ath_ani_calibrate(unsigned long data)
 327{
 328        struct ath_softc *sc = (struct ath_softc *)data;
 329        struct ath_hw *ah = sc->sc_ah;
 330        bool longcal = false;
 331        bool shortcal = false;
 332        bool aniflag = false;
 333        unsigned int timestamp = jiffies_to_msecs(jiffies);
 334        u32 cal_interval, short_cal_interval;
 335
 336        short_cal_interval = (ah->opmode == NL80211_IFTYPE_AP) ?
 337                ATH_AP_SHORT_CALINTERVAL : ATH_STA_SHORT_CALINTERVAL;
 338
 339        /*
 340        * don't calibrate when we're scanning.
 341        * we are most likely not on our home channel.
 342        */
 343        spin_lock(&sc->ani_lock);
 344        if (sc->sc_flags & SC_OP_SCANNING)
 345                goto set_timer;
 346
 347        /* Only calibrate if awake */
 348        if (sc->sc_ah->power_mode != ATH9K_PM_AWAKE)
 349                goto set_timer;
 350
 351        ath9k_ps_wakeup(sc);
 352
 353        /* Long calibration runs independently of short calibration. */
 354        if ((timestamp - sc->ani.longcal_timer) >= ATH_LONG_CALINTERVAL) {
 355                longcal = true;
 356                DPRINTF(sc, ATH_DBG_ANI, "longcal @%lu\n", jiffies);
 357                sc->ani.longcal_timer = timestamp;
 358        }
 359
 360        /* Short calibration applies only while caldone is false */
 361        if (!sc->ani.caldone) {
 362                if ((timestamp - sc->ani.shortcal_timer) >= short_cal_interval) {
 363                        shortcal = true;
 364                        DPRINTF(sc, ATH_DBG_ANI, "shortcal @%lu\n", jiffies);
 365                        sc->ani.shortcal_timer = timestamp;
 366                        sc->ani.resetcal_timer = timestamp;
 367                }
 368        } else {
 369                if ((timestamp - sc->ani.resetcal_timer) >=
 370                    ATH_RESTART_CALINTERVAL) {
 371                        sc->ani.caldone = ath9k_hw_reset_calvalid(ah);
 372                        if (sc->ani.caldone)
 373                                sc->ani.resetcal_timer = timestamp;
 374                }
 375        }
 376
 377        /* Verify whether we must check ANI */
 378        if ((timestamp - sc->ani.checkani_timer) >= ATH_ANI_POLLINTERVAL) {
 379                aniflag = true;
 380                sc->ani.checkani_timer = timestamp;
 381        }
 382
 383        /* Skip all processing if there's nothing to do. */
 384        if (longcal || shortcal || aniflag) {
 385                /* Call ANI routine if necessary */
 386                if (aniflag)
 387                        ath9k_hw_ani_monitor(ah, ah->curchan);
 388
 389                /* Perform calibration if necessary */
 390                if (longcal || shortcal) {
 391                        sc->ani.caldone = ath9k_hw_calibrate(ah, ah->curchan,
 392                                                     sc->rx_chainmask, longcal);
 393
 394                        if (longcal)
 395                                sc->ani.noise_floor = ath9k_hw_getchan_noise(ah,
 396                                                                     ah->curchan);
 397
 398                        DPRINTF(sc, ATH_DBG_ANI," calibrate chan %u/%x nf: %d\n",
 399                                ah->curchan->channel, ah->curchan->channelFlags,
 400                                sc->ani.noise_floor);
 401                }
 402        }
 403
 404        ath9k_ps_restore(sc);
 405
 406set_timer:
 407        spin_unlock(&sc->ani_lock);
 408        /*
 409        * Set timer interval based on previous results.
 410        * The interval must be the shortest necessary to satisfy ANI,
 411        * short calibration and long calibration.
 412        */
 413        cal_interval = ATH_LONG_CALINTERVAL;
 414        if (sc->sc_ah->config.enable_ani)
 415                cal_interval = min(cal_interval, (u32)ATH_ANI_POLLINTERVAL);
 416        if (!sc->ani.caldone)
 417                cal_interval = min(cal_interval, (u32)short_cal_interval);
 418
 419        mod_timer(&sc->ani.timer, jiffies + msecs_to_jiffies(cal_interval));
 420}
 421
 422static void ath_start_ani(struct ath_softc *sc)
 423{
 424        unsigned long timestamp = jiffies_to_msecs(jiffies);
 425
 426        sc->ani.longcal_timer = timestamp;
 427        sc->ani.shortcal_timer = timestamp;
 428        sc->ani.checkani_timer = timestamp;
 429
 430        mod_timer(&sc->ani.timer,
 431                  jiffies + msecs_to_jiffies(ATH_ANI_POLLINTERVAL));
 432}
 433
 434/*
 435 * Update tx/rx chainmask. For legacy association,
 436 * hard code chainmask to 1x1, for 11n association, use
 437 * the chainmask configuration, for bt coexistence, use
 438 * the chainmask configuration even in legacy mode.
 439 */
 440void ath_update_chainmask(struct ath_softc *sc, int is_ht)
 441{
 442        if ((sc->sc_flags & SC_OP_SCANNING) || is_ht ||
 443            (sc->btcoex_info.btcoex_scheme != ATH_BTCOEX_CFG_NONE)) {
 444                sc->tx_chainmask = sc->sc_ah->caps.tx_chainmask;
 445                sc->rx_chainmask = sc->sc_ah->caps.rx_chainmask;
 446        } else {
 447                sc->tx_chainmask = 1;
 448                sc->rx_chainmask = 1;
 449        }
 450
 451        DPRINTF(sc, ATH_DBG_CONFIG, "tx chmask: %d, rx chmask: %d\n",
 452                sc->tx_chainmask, sc->rx_chainmask);
 453}
 454
 455static void ath_node_attach(struct ath_softc *sc, struct ieee80211_sta *sta)
 456{
 457        struct ath_node *an;
 458
 459        an = (struct ath_node *)sta->drv_priv;
 460
 461        if (sc->sc_flags & SC_OP_TXAGGR) {
 462                ath_tx_node_init(sc, an);
 463                an->maxampdu = 1 << (IEEE80211_HT_MAX_AMPDU_FACTOR +
 464                                     sta->ht_cap.ampdu_factor);
 465                an->mpdudensity = parse_mpdudensity(sta->ht_cap.ampdu_density);
 466                an->last_rssi = ATH_RSSI_DUMMY_MARKER;
 467        }
 468}
 469
 470static void ath_node_detach(struct ath_softc *sc, struct ieee80211_sta *sta)
 471{
 472        struct ath_node *an = (struct ath_node *)sta->drv_priv;
 473
 474        if (sc->sc_flags & SC_OP_TXAGGR)
 475                ath_tx_node_cleanup(sc, an);
 476}
 477
 478static void ath9k_tasklet(unsigned long data)
 479{
 480        struct ath_softc *sc = (struct ath_softc *)data;
 481        u32 status = sc->intrstatus;
 482
 483        ath9k_ps_wakeup(sc);
 484
 485        if (status & ATH9K_INT_FATAL) {
 486                ath_reset(sc, false);
 487                ath9k_ps_restore(sc);
 488                return;
 489        }
 490
 491        if (status & (ATH9K_INT_RX | ATH9K_INT_RXEOL | ATH9K_INT_RXORN)) {
 492                spin_lock_bh(&sc->rx.rxflushlock);
 493                ath_rx_tasklet(sc, 0);
 494                spin_unlock_bh(&sc->rx.rxflushlock);
 495        }
 496
 497        if (status & ATH9K_INT_TX)
 498                ath_tx_tasklet(sc);
 499
 500        if ((status & ATH9K_INT_TSFOOR) && sc->ps_enabled) {
 501                /*
 502                 * TSF sync does not look correct; remain awake to sync with
 503                 * the next Beacon.
 504                 */
 505                DPRINTF(sc, ATH_DBG_PS, "TSFOOR - Sync with next Beacon\n");
 506                sc->sc_flags |= SC_OP_WAIT_FOR_BEACON | SC_OP_BEACON_SYNC;
 507        }
 508
 509        if (sc->btcoex_info.btcoex_scheme == ATH_BTCOEX_CFG_3WIRE)
 510                if (status & ATH9K_INT_GENTIMER)
 511                        ath_gen_timer_isr(sc->sc_ah);
 512
 513        /* re-enable hardware interrupt */
 514        ath9k_hw_set_interrupts(sc->sc_ah, sc->imask);
 515        ath9k_ps_restore(sc);
 516}
 517
 518irqreturn_t ath_isr(int irq, void *dev)
 519{
 520#define SCHED_INTR (                            \
 521                ATH9K_INT_FATAL |               \
 522                ATH9K_INT_RXORN |               \
 523                ATH9K_INT_RXEOL |               \
 524                ATH9K_INT_RX |                  \
 525                ATH9K_INT_TX |                  \
 526                ATH9K_INT_BMISS |               \
 527                ATH9K_INT_CST |                 \
 528                ATH9K_INT_TSFOOR |              \
 529                ATH9K_INT_GENTIMER)
 530
 531        struct ath_softc *sc = dev;
 532        struct ath_hw *ah = sc->sc_ah;
 533        enum ath9k_int status;
 534        bool sched = false;
 535
 536        /*
 537         * The hardware is not ready/present, don't
 538         * touch anything. Note this can happen early
 539         * on if the IRQ is shared.
 540         */
 541        if (sc->sc_flags & SC_OP_INVALID)
 542                return IRQ_NONE;
 543
 544
 545        /* shared irq, not for us */
 546
 547        if (!ath9k_hw_intrpend(ah))
 548                return IRQ_NONE;
 549
 550        /*
 551         * Figure out the reason(s) for the interrupt.  Note
 552         * that the hal returns a pseudo-ISR that may include
 553         * bits we haven't explicitly enabled so we mask the
 554         * value to insure we only process bits we requested.
 555         */
 556        ath9k_hw_getisr(ah, &status);   /* NB: clears ISR too */
 557        status &= sc->imask;    /* discard unasked-for bits */
 558
 559        /*
 560         * If there are no status bits set, then this interrupt was not
 561         * for me (should have been caught above).
 562         */
 563        if (!status)
 564                return IRQ_NONE;
 565
 566        /* Cache the status */
 567        sc->intrstatus = status;
 568
 569        if (status & SCHED_INTR)
 570                sched = true;
 571
 572        /*
 573         * If a FATAL or RXORN interrupt is received, we have to reset the
 574         * chip immediately.
 575         */
 576        if (status & (ATH9K_INT_FATAL | ATH9K_INT_RXORN))
 577                goto chip_reset;
 578
 579        if (status & ATH9K_INT_SWBA)
 580                tasklet_schedule(&sc->bcon_tasklet);
 581
 582        if (status & ATH9K_INT_TXURN)
 583                ath9k_hw_updatetxtriglevel(ah, true);
 584
 585        if (status & ATH9K_INT_MIB) {
 586                /*
 587                 * Disable interrupts until we service the MIB
 588                 * interrupt; otherwise it will continue to
 589                 * fire.
 590                 */
 591                ath9k_hw_set_interrupts(ah, 0);
 592                /*
 593                 * Let the hal handle the event. We assume
 594                 * it will clear whatever condition caused
 595                 * the interrupt.
 596                 */
 597                ath9k_hw_procmibevent(ah);
 598                ath9k_hw_set_interrupts(ah, sc->imask);
 599        }
 600
 601        if (!(ah->caps.hw_caps & ATH9K_HW_CAP_AUTOSLEEP))
 602                if (status & ATH9K_INT_TIM_TIMER) {
 603                        /* Clear RxAbort bit so that we can
 604                         * receive frames */
 605                        ath9k_hw_setpower(ah, ATH9K_PM_AWAKE);
 606                        ath9k_hw_setrxabort(sc->sc_ah, 0);
 607                        sc->sc_flags |= SC_OP_WAIT_FOR_BEACON;
 608                }
 609
 610chip_reset:
 611
 612        ath_debug_stat_interrupt(sc, status);
 613
 614        if (sched) {
 615                /* turn off every interrupt except SWBA */
 616                ath9k_hw_set_interrupts(ah, (sc->imask & ATH9K_INT_SWBA));
 617                tasklet_schedule(&sc->intr_tq);
 618        }
 619
 620        return IRQ_HANDLED;
 621
 622#undef SCHED_INTR
 623}
 624
 625static u32 ath_get_extchanmode(struct ath_softc *sc,
 626                               struct ieee80211_channel *chan,
 627                               enum nl80211_channel_type channel_type)
 628{
 629        u32 chanmode = 0;
 630
 631        switch (chan->band) {
 632        case IEEE80211_BAND_2GHZ:
 633                switch(channel_type) {
 634                case NL80211_CHAN_NO_HT:
 635                case NL80211_CHAN_HT20:
 636                        chanmode = CHANNEL_G_HT20;
 637                        break;
 638                case NL80211_CHAN_HT40PLUS:
 639                        chanmode = CHANNEL_G_HT40PLUS;
 640                        break;
 641                case NL80211_CHAN_HT40MINUS:
 642                        chanmode = CHANNEL_G_HT40MINUS;
 643                        break;
 644                }
 645                break;
 646        case IEEE80211_BAND_5GHZ:
 647                switch(channel_type) {
 648                case NL80211_CHAN_NO_HT:
 649                case NL80211_CHAN_HT20:
 650                        chanmode = CHANNEL_A_HT20;
 651                        break;
 652                case NL80211_CHAN_HT40PLUS:
 653                        chanmode = CHANNEL_A_HT40PLUS;
 654                        break;
 655                case NL80211_CHAN_HT40MINUS:
 656                        chanmode = CHANNEL_A_HT40MINUS;
 657                        break;
 658                }
 659                break;
 660        default:
 661                break;
 662        }
 663
 664        return chanmode;
 665}
 666
 667static int ath_setkey_tkip(struct ath_softc *sc, u16 keyix, const u8 *key,
 668                           struct ath9k_keyval *hk, const u8 *addr,
 669                           bool authenticator)
 670{
 671        const u8 *key_rxmic;
 672        const u8 *key_txmic;
 673
 674        key_txmic = key + NL80211_TKIP_DATA_OFFSET_TX_MIC_KEY;
 675        key_rxmic = key + NL80211_TKIP_DATA_OFFSET_RX_MIC_KEY;
 676
 677        if (addr == NULL) {
 678                /*
 679                 * Group key installation - only two key cache entries are used
 680                 * regardless of splitmic capability since group key is only
 681                 * used either for TX or RX.
 682                 */
 683                if (authenticator) {
 684                        memcpy(hk->kv_mic, key_txmic, sizeof(hk->kv_mic));
 685                        memcpy(hk->kv_txmic, key_txmic, sizeof(hk->kv_mic));
 686                } else {
 687                        memcpy(hk->kv_mic, key_rxmic, sizeof(hk->kv_mic));
 688                        memcpy(hk->kv_txmic, key_rxmic, sizeof(hk->kv_mic));
 689                }
 690                return ath9k_hw_set_keycache_entry(sc->sc_ah, keyix, hk, addr);
 691        }
 692        if (!sc->splitmic) {
 693                /* TX and RX keys share the same key cache entry. */
 694                memcpy(hk->kv_mic, key_rxmic, sizeof(hk->kv_mic));
 695                memcpy(hk->kv_txmic, key_txmic, sizeof(hk->kv_txmic));
 696                return ath9k_hw_set_keycache_entry(sc->sc_ah, keyix, hk, addr);
 697        }
 698
 699        /* Separate key cache entries for TX and RX */
 700
 701        /* TX key goes at first index, RX key at +32. */
 702        memcpy(hk->kv_mic, key_txmic, sizeof(hk->kv_mic));
 703        if (!ath9k_hw_set_keycache_entry(sc->sc_ah, keyix, hk, NULL)) {
 704                /* TX MIC entry failed. No need to proceed further */
 705                DPRINTF(sc, ATH_DBG_FATAL,
 706                        "Setting TX MIC Key Failed\n");
 707                return 0;
 708        }
 709
 710        memcpy(hk->kv_mic, key_rxmic, sizeof(hk->kv_mic));
 711        /* XXX delete tx key on failure? */
 712        return ath9k_hw_set_keycache_entry(sc->sc_ah, keyix + 32, hk, addr);
 713}
 714
 715static int ath_reserve_key_cache_slot_tkip(struct ath_softc *sc)
 716{
 717        int i;
 718
 719        for (i = IEEE80211_WEP_NKID; i < sc->keymax / 2; i++) {
 720                if (test_bit(i, sc->keymap) ||
 721                    test_bit(i + 64, sc->keymap))
 722                        continue; /* At least one part of TKIP key allocated */
 723                if (sc->splitmic &&
 724                    (test_bit(i + 32, sc->keymap) ||
 725                     test_bit(i + 64 + 32, sc->keymap)))
 726                        continue; /* At least one part of TKIP key allocated */
 727
 728                /* Found a free slot for a TKIP key */
 729                return i;
 730        }
 731        return -1;
 732}
 733
 734static int ath_reserve_key_cache_slot(struct ath_softc *sc)
 735{
 736        int i;
 737
 738        /* First, try to find slots that would not be available for TKIP. */
 739        if (sc->splitmic) {
 740                for (i = IEEE80211_WEP_NKID; i < sc->keymax / 4; i++) {
 741                        if (!test_bit(i, sc->keymap) &&
 742                            (test_bit(i + 32, sc->keymap) ||
 743                             test_bit(i + 64, sc->keymap) ||
 744                             test_bit(i + 64 + 32, sc->keymap)))
 745                                return i;
 746                        if (!test_bit(i + 32, sc->keymap) &&
 747                            (test_bit(i, sc->keymap) ||
 748                             test_bit(i + 64, sc->keymap) ||
 749                             test_bit(i + 64 + 32, sc->keymap)))
 750                                return i + 32;
 751                        if (!test_bit(i + 64, sc->keymap) &&
 752                            (test_bit(i , sc->keymap) ||
 753                             test_bit(i + 32, sc->keymap) ||
 754                             test_bit(i + 64 + 32, sc->keymap)))
 755                                return i + 64;
 756                        if (!test_bit(i + 64 + 32, sc->keymap) &&
 757                            (test_bit(i, sc->keymap) ||
 758                             test_bit(i + 32, sc->keymap) ||
 759                             test_bit(i + 64, sc->keymap)))
 760                                return i + 64 + 32;
 761                }
 762        } else {
 763                for (i = IEEE80211_WEP_NKID; i < sc->keymax / 2; i++) {
 764                        if (!test_bit(i, sc->keymap) &&
 765                            test_bit(i + 64, sc->keymap))
 766                                return i;
 767                        if (test_bit(i, sc->keymap) &&
 768                            !test_bit(i + 64, sc->keymap))
 769                                return i + 64;
 770                }
 771        }
 772
 773        /* No partially used TKIP slots, pick any available slot */
 774        for (i = IEEE80211_WEP_NKID; i < sc->keymax; i++) {
 775                /* Do not allow slots that could be needed for TKIP group keys
 776                 * to be used. This limitation could be removed if we know that
 777                 * TKIP will not be used. */
 778                if (i >= 64 && i < 64 + IEEE80211_WEP_NKID)
 779                        continue;
 780                if (sc->splitmic) {
 781                        if (i >= 32 && i < 32 + IEEE80211_WEP_NKID)
 782                                continue;
 783                        if (i >= 64 + 32 && i < 64 + 32 + IEEE80211_WEP_NKID)
 784                                continue;
 785                }
 786
 787                if (!test_bit(i, sc->keymap))
 788                        return i; /* Found a free slot for a key */
 789        }
 790
 791        /* No free slot found */
 792        return -1;
 793}
 794
 795static int ath_key_config(struct ath_softc *sc,
 796                          struct ieee80211_vif *vif,
 797                          struct ieee80211_sta *sta,
 798                          struct ieee80211_key_conf *key)
 799{
 800        struct ath9k_keyval hk;
 801        const u8 *mac = NULL;
 802        int ret = 0;
 803        int idx;
 804
 805        memset(&hk, 0, sizeof(hk));
 806
 807        switch (key->alg) {
 808        case ALG_WEP:
 809                hk.kv_type = ATH9K_CIPHER_WEP;
 810                break;
 811        case ALG_TKIP:
 812                hk.kv_type = ATH9K_CIPHER_TKIP;
 813                break;
 814        case ALG_CCMP:
 815                hk.kv_type = ATH9K_CIPHER_AES_CCM;
 816                break;
 817        default:
 818                return -EOPNOTSUPP;
 819        }
 820
 821        hk.kv_len = key->keylen;
 822        memcpy(hk.kv_val, key->key, key->keylen);
 823
 824        if (!(key->flags & IEEE80211_KEY_FLAG_PAIRWISE)) {
 825                /* For now, use the default keys for broadcast keys. This may
 826                 * need to change with virtual interfaces. */
 827                idx = key->keyidx;
 828        } else if (key->keyidx) {
 829                if (WARN_ON(!sta))
 830                        return -EOPNOTSUPP;
 831                mac = sta->addr;
 832
 833                if (vif->type != NL80211_IFTYPE_AP) {
 834                        /* Only keyidx 0 should be used with unicast key, but
 835                         * allow this for client mode for now. */
 836                        idx = key->keyidx;
 837                } else
 838                        return -EIO;
 839        } else {
 840                if (WARN_ON(!sta))
 841                        return -EOPNOTSUPP;
 842                mac = sta->addr;
 843
 844                if (key->alg == ALG_TKIP)
 845                        idx = ath_reserve_key_cache_slot_tkip(sc);
 846                else
 847                        idx = ath_reserve_key_cache_slot(sc);
 848                if (idx < 0)
 849                        return -ENOSPC; /* no free key cache entries */
 850        }
 851
 852        if (key->alg == ALG_TKIP)
 853                ret = ath_setkey_tkip(sc, idx, key->key, &hk, mac,
 854                                      vif->type == NL80211_IFTYPE_AP);
 855        else
 856                ret = ath9k_hw_set_keycache_entry(sc->sc_ah, idx, &hk, mac);
 857
 858        if (!ret)
 859                return -EIO;
 860
 861        set_bit(idx, sc->keymap);
 862        if (key->alg == ALG_TKIP) {
 863                set_bit(idx + 64, sc->keymap);
 864                if (sc->splitmic) {
 865                        set_bit(idx + 32, sc->keymap);
 866                        set_bit(idx + 64 + 32, sc->keymap);
 867                }
 868        }
 869
 870        return idx;
 871}
 872
 873static void ath_key_delete(struct ath_softc *sc, struct ieee80211_key_conf *key)
 874{
 875        ath9k_hw_keyreset(sc->sc_ah, key->hw_key_idx);
 876        if (key->hw_key_idx < IEEE80211_WEP_NKID)
 877                return;
 878
 879        clear_bit(key->hw_key_idx, sc->keymap);
 880        if (key->alg != ALG_TKIP)
 881                return;
 882
 883        clear_bit(key->hw_key_idx + 64, sc->keymap);
 884        if (sc->splitmic) {
 885                clear_bit(key->hw_key_idx + 32, sc->keymap);
 886                clear_bit(key->hw_key_idx + 64 + 32, sc->keymap);
 887        }
 888}
 889
 890static void setup_ht_cap(struct ath_softc *sc,
 891                         struct ieee80211_sta_ht_cap *ht_info)
 892{
 893        u8 tx_streams, rx_streams;
 894
 895        ht_info->ht_supported = true;
 896        ht_info->cap = IEEE80211_HT_CAP_SUP_WIDTH_20_40 |
 897                       IEEE80211_HT_CAP_SM_PS |
 898                       IEEE80211_HT_CAP_SGI_40 |
 899                       IEEE80211_HT_CAP_DSSSCCK40;
 900
 901        ht_info->ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K;
 902        ht_info->ampdu_density = IEEE80211_HT_MPDU_DENSITY_8;
 903
 904        /* set up supported mcs set */
 905        memset(&ht_info->mcs, 0, sizeof(ht_info->mcs));
 906        tx_streams = !(sc->tx_chainmask & (sc->tx_chainmask - 1)) ? 1 : 2;
 907        rx_streams = !(sc->rx_chainmask & (sc->rx_chainmask - 1)) ? 1 : 2;
 908
 909        if (tx_streams != rx_streams) {
 910                DPRINTF(sc, ATH_DBG_CONFIG, "TX streams %d, RX streams: %d\n",
 911                        tx_streams, rx_streams);
 912                ht_info->mcs.tx_params |= IEEE80211_HT_MCS_TX_RX_DIFF;
 913                ht_info->mcs.tx_params |= ((tx_streams - 1) <<
 914                                IEEE80211_HT_MCS_TX_MAX_STREAMS_SHIFT);
 915        }
 916
 917        ht_info->mcs.rx_mask[0] = 0xff;
 918        if (rx_streams >= 2)
 919                ht_info->mcs.rx_mask[1] = 0xff;
 920
 921        ht_info->mcs.tx_params |= IEEE80211_HT_MCS_TX_DEFINED;
 922}
 923
 924static void ath9k_bss_assoc_info(struct ath_softc *sc,
 925                                 struct ieee80211_vif *vif,
 926                                 struct ieee80211_bss_conf *bss_conf)
 927{
 928
 929        if (bss_conf->assoc) {
 930                DPRINTF(sc, ATH_DBG_CONFIG, "Bss Info ASSOC %d, bssid: %pM\n",
 931                        bss_conf->aid, sc->curbssid);
 932
 933                /* New association, store aid */
 934                sc->curaid = bss_conf->aid;
 935                ath9k_hw_write_associd(sc);
 936
 937                /*
 938                 * Request a re-configuration of Beacon related timers
 939                 * on the receipt of the first Beacon frame (i.e.,
 940                 * after time sync with the AP).
 941                 */
 942                sc->sc_flags |= SC_OP_BEACON_SYNC;
 943
 944                /* Configure the beacon */
 945                ath_beacon_config(sc, vif);
 946
 947                /* Reset rssi stats */
 948                sc->sc_ah->stats.avgbrssi = ATH_RSSI_DUMMY_MARKER;
 949
 950                ath_start_ani(sc);
 951        } else {
 952                DPRINTF(sc, ATH_DBG_CONFIG, "Bss Info DISASSOC\n");
 953                sc->curaid = 0;
 954                /* Stop ANI */
 955                del_timer_sync(&sc->ani.timer);
 956        }
 957}
 958
 959/********************************/
 960/*       LED functions          */
 961/********************************/
 962
 963static void ath_led_blink_work(struct work_struct *work)
 964{
 965        struct ath_softc *sc = container_of(work, struct ath_softc,
 966                                            ath_led_blink_work.work);
 967
 968        if (!(sc->sc_flags & SC_OP_LED_ASSOCIATED))
 969                return;
 970
 971        if ((sc->led_on_duration == ATH_LED_ON_DURATION_IDLE) ||
 972            (sc->led_off_duration == ATH_LED_OFF_DURATION_IDLE))
 973                ath9k_hw_set_gpio(sc->sc_ah, sc->sc_ah->led_pin, 0);
 974        else
 975                ath9k_hw_set_gpio(sc->sc_ah, sc->sc_ah->led_pin,
 976                                  (sc->sc_flags & SC_OP_LED_ON) ? 1 : 0);
 977
 978        ieee80211_queue_delayed_work(sc->hw,
 979                                     &sc->ath_led_blink_work,
 980                                     (sc->sc_flags & SC_OP_LED_ON) ?
 981                                        msecs_to_jiffies(sc->led_off_duration) :
 982                                        msecs_to_jiffies(sc->led_on_duration));
 983
 984        sc->led_on_duration = sc->led_on_cnt ?
 985                        max((ATH_LED_ON_DURATION_IDLE - sc->led_on_cnt), 25) :
 986                        ATH_LED_ON_DURATION_IDLE;
 987        sc->led_off_duration = sc->led_off_cnt ?
 988                        max((ATH_LED_OFF_DURATION_IDLE - sc->led_off_cnt), 10) :
 989                        ATH_LED_OFF_DURATION_IDLE;
 990        sc->led_on_cnt = sc->led_off_cnt = 0;
 991        if (sc->sc_flags & SC_OP_LED_ON)
 992                sc->sc_flags &= ~SC_OP_LED_ON;
 993        else
 994                sc->sc_flags |= SC_OP_LED_ON;
 995}
 996
 997static void ath_led_brightness(struct led_classdev *led_cdev,
 998                               enum led_brightness brightness)
 999{
1000        struct ath_led *led = container_of(led_cdev, struct ath_led, led_cdev);
1001        struct ath_softc *sc = led->sc;
1002
1003        switch (brightness) {
1004        case LED_OFF:
1005                if (led->led_type == ATH_LED_ASSOC ||
1006                    led->led_type == ATH_LED_RADIO) {
1007                        ath9k_hw_set_gpio(sc->sc_ah, sc->sc_ah->led_pin,
1008                                (led->led_type == ATH_LED_RADIO));
1009                        sc->sc_flags &= ~SC_OP_LED_ASSOCIATED;
1010                        if (led->led_type == ATH_LED_RADIO)
1011                                sc->sc_flags &= ~SC_OP_LED_ON;
1012                } else {
1013                        sc->led_off_cnt++;
1014                }
1015                break;
1016        case LED_FULL:
1017                if (led->led_type == ATH_LED_ASSOC) {
1018                        sc->sc_flags |= SC_OP_LED_ASSOCIATED;
1019                        ieee80211_queue_delayed_work(sc->hw,
1020                                                     &sc->ath_led_blink_work, 0);
1021                } else if (led->led_type == ATH_LED_RADIO) {
1022                        ath9k_hw_set_gpio(sc->sc_ah, sc->sc_ah->led_pin, 0);
1023                        sc->sc_flags |= SC_OP_LED_ON;
1024                } else {
1025                        sc->led_on_cnt++;
1026                }
1027                break;
1028        default:
1029                break;
1030        }
1031}
1032
1033static int ath_register_led(struct ath_softc *sc, struct ath_led *led,
1034                            char *trigger)
1035{
1036        int ret;
1037
1038        led->sc = sc;
1039        led->led_cdev.name = led->name;
1040        led->led_cdev.default_trigger = trigger;
1041        led->led_cdev.brightness_set = ath_led_brightness;
1042
1043        ret = led_classdev_register(wiphy_dev(sc->hw->wiphy), &led->led_cdev);
1044        if (ret)
1045                DPRINTF(sc, ATH_DBG_FATAL,
1046                        "Failed to register led:%s", led->name);
1047        else
1048                led->registered = 1;
1049        return ret;
1050}
1051
1052static void ath_unregister_led(struct ath_led *led)
1053{
1054        if (led->registered) {
1055                led_classdev_unregister(&led->led_cdev);
1056                led->registered = 0;
1057        }
1058}
1059
1060static void ath_deinit_leds(struct ath_softc *sc)
1061{
1062        ath_unregister_led(&sc->assoc_led);
1063        sc->sc_flags &= ~SC_OP_LED_ASSOCIATED;
1064        ath_unregister_led(&sc->tx_led);
1065        ath_unregister_led(&sc->rx_led);
1066        ath_unregister_led(&sc->radio_led);
1067        ath9k_hw_set_gpio(sc->sc_ah, sc->sc_ah->led_pin, 1);
1068}
1069
1070static void ath_init_leds(struct ath_softc *sc)
1071{
1072        char *trigger;
1073        int ret;
1074
1075        if (AR_SREV_9287(sc->sc_ah))
1076                sc->sc_ah->led_pin = ATH_LED_PIN_9287;
1077        else
1078                sc->sc_ah->led_pin = ATH_LED_PIN_DEF;
1079
1080        /* Configure gpio 1 for output */
1081        ath9k_hw_cfg_output(sc->sc_ah, sc->sc_ah->led_pin,
1082                            AR_GPIO_OUTPUT_MUX_AS_OUTPUT);
1083        /* LED off, active low */
1084        ath9k_hw_set_gpio(sc->sc_ah, sc->sc_ah->led_pin, 1);
1085
1086        INIT_DELAYED_WORK(&sc->ath_led_blink_work, ath_led_blink_work);
1087
1088        trigger = ieee80211_get_radio_led_name(sc->hw);
1089        snprintf(sc->radio_led.name, sizeof(sc->radio_led.name),
1090                "ath9k-%s::radio", wiphy_name(sc->hw->wiphy));
1091        ret = ath_register_led(sc, &sc->radio_led, trigger);
1092        sc->radio_led.led_type = ATH_LED_RADIO;
1093        if (ret)
1094                goto fail;
1095
1096        trigger = ieee80211_get_assoc_led_name(sc->hw);
1097        snprintf(sc->assoc_led.name, sizeof(sc->assoc_led.name),
1098                "ath9k-%s::assoc", wiphy_name(sc->hw->wiphy));
1099        ret = ath_register_led(sc, &sc->assoc_led, trigger);
1100        sc->assoc_led.led_type = ATH_LED_ASSOC;
1101        if (ret)
1102                goto fail;
1103
1104        trigger = ieee80211_get_tx_led_name(sc->hw);
1105        snprintf(sc->tx_led.name, sizeof(sc->tx_led.name),
1106                "ath9k-%s::tx", wiphy_name(sc->hw->wiphy));
1107        ret = ath_register_led(sc, &sc->tx_led, trigger);
1108        sc->tx_led.led_type = ATH_LED_TX;
1109        if (ret)
1110                goto fail;
1111
1112        trigger = ieee80211_get_rx_led_name(sc->hw);
1113        snprintf(sc->rx_led.name, sizeof(sc->rx_led.name),
1114                "ath9k-%s::rx", wiphy_name(sc->hw->wiphy));
1115        ret = ath_register_led(sc, &sc->rx_led, trigger);
1116        sc->rx_led.led_type = ATH_LED_RX;
1117        if (ret)
1118                goto fail;
1119
1120        return;
1121
1122fail:
1123        cancel_delayed_work_sync(&sc->ath_led_blink_work);
1124        ath_deinit_leds(sc);
1125}
1126
1127void ath_radio_enable(struct ath_softc *sc)
1128{
1129        struct ath_hw *ah = sc->sc_ah;
1130        struct ieee80211_channel *channel = sc->hw->conf.channel;
1131        int r;
1132
1133        ath9k_ps_wakeup(sc);
1134        ath9k_hw_configpcipowersave(ah, 0, 0);
1135
1136        if (!ah->curchan)
1137                ah->curchan = ath_get_curchannel(sc, sc->hw);
1138
1139        spin_lock_bh(&sc->sc_resetlock);
1140        r = ath9k_hw_reset(ah, ah->curchan, false);
1141        if (r) {
1142                DPRINTF(sc, ATH_DBG_FATAL,
1143                        "Unable to reset channel %u (%uMhz) ",
1144                        "reset status %d\n",
1145                        channel->center_freq, r);
1146        }
1147        spin_unlock_bh(&sc->sc_resetlock);
1148
1149        ath_update_txpow(sc);
1150        if (ath_startrecv(sc) != 0) {
1151                DPRINTF(sc, ATH_DBG_FATAL,
1152                        "Unable to restart recv logic\n");
1153                return;
1154        }
1155
1156        if (sc->sc_flags & SC_OP_BEACONS)
1157                ath_beacon_config(sc, NULL);    /* restart beacons */
1158
1159        /* Re-Enable  interrupts */
1160        ath9k_hw_set_interrupts(ah, sc->imask);
1161
1162        /* Enable LED */
1163        ath9k_hw_cfg_output(ah, ah->led_pin,
1164                            AR_GPIO_OUTPUT_MUX_AS_OUTPUT);
1165        ath9k_hw_set_gpio(ah, ah->led_pin, 0);
1166
1167        ieee80211_wake_queues(sc->hw);
1168        ath9k_ps_restore(sc);
1169}
1170
1171void ath_radio_disable(struct ath_softc *sc)
1172{
1173        struct ath_hw *ah = sc->sc_ah;
1174        struct ieee80211_channel *channel = sc->hw->conf.channel;
1175        int r;
1176
1177        ath9k_ps_wakeup(sc);
1178        ieee80211_stop_queues(sc->hw);
1179
1180        /* Disable LED */
1181        ath9k_hw_set_gpio(ah, ah->led_pin, 1);
1182        ath9k_hw_cfg_gpio_input(ah, ah->led_pin);
1183
1184        /* Disable interrupts */
1185        ath9k_hw_set_interrupts(ah, 0);
1186
1187        ath_drain_all_txq(sc, false);   /* clear pending tx frames */
1188        ath_stoprecv(sc);               /* turn off frame recv */
1189        ath_flushrecv(sc);              /* flush recv queue */
1190
1191        if (!ah->curchan)
1192                ah->curchan = ath_get_curchannel(sc, sc->hw);
1193
1194        spin_lock_bh(&sc->sc_resetlock);
1195        r = ath9k_hw_reset(ah, ah->curchan, false);
1196        if (r) {
1197                DPRINTF(sc, ATH_DBG_FATAL,
1198                        "Unable to reset channel %u (%uMhz) "
1199                        "reset status %d\n",
1200                        channel->center_freq, r);
1201        }
1202        spin_unlock_bh(&sc->sc_resetlock);
1203
1204        ath9k_hw_phy_disable(ah);
1205        ath9k_hw_configpcipowersave(ah, 1, 1);
1206        ath9k_ps_restore(sc);
1207        ath9k_hw_setpower(ah, ATH9K_PM_FULL_SLEEP);
1208}
1209
1210/*******************/
1211/*      Rfkill     */
1212/*******************/
1213
1214static bool ath_is_rfkill_set(struct ath_softc *sc)
1215{
1216        struct ath_hw *ah = sc->sc_ah;
1217
1218        return ath9k_hw_gpio_get(ah, ah->rfkill_gpio) ==
1219                                  ah->rfkill_polarity;
1220}
1221
1222static void ath9k_rfkill_poll_state(struct ieee80211_hw *hw)
1223{
1224        struct ath_wiphy *aphy = hw->priv;
1225        struct ath_softc *sc = aphy->sc;
1226        bool blocked = !!ath_is_rfkill_set(sc);
1227
1228        wiphy_rfkill_set_hw_state(hw->wiphy, blocked);
1229}
1230
1231static void ath_start_rfkill_poll(struct ath_softc *sc)
1232{
1233        struct ath_hw *ah = sc->sc_ah;
1234
1235        if (ah->caps.hw_caps & ATH9K_HW_CAP_RFSILENT)
1236                wiphy_rfkill_start_polling(sc->hw->wiphy);
1237}
1238
1239void ath_cleanup(struct ath_softc *sc)
1240{
1241        ath_detach(sc);
1242        free_irq(sc->irq, sc);
1243        ath_bus_cleanup(sc);
1244        kfree(sc->sec_wiphy);
1245        ieee80211_free_hw(sc->hw);
1246}
1247
1248void ath_detach(struct ath_softc *sc)
1249{
1250        struct ieee80211_hw *hw = sc->hw;
1251        int i = 0;
1252
1253        ath9k_ps_wakeup(sc);
1254
1255        DPRINTF(sc, ATH_DBG_CONFIG, "Detach ATH hw\n");
1256
1257        ath_deinit_leds(sc);
1258        wiphy_rfkill_stop_polling(sc->hw->wiphy);
1259
1260        for (i = 0; i < sc->num_sec_wiphy; i++) {
1261                struct ath_wiphy *aphy = sc->sec_wiphy[i];
1262                if (aphy == NULL)
1263                        continue;
1264                sc->sec_wiphy[i] = NULL;
1265                ieee80211_unregister_hw(aphy->hw);
1266                ieee80211_free_hw(aphy->hw);
1267        }
1268        ieee80211_unregister_hw(hw);
1269        ath_rx_cleanup(sc);
1270        ath_tx_cleanup(sc);
1271
1272        tasklet_kill(&sc->intr_tq);
1273        tasklet_kill(&sc->bcon_tasklet);
1274
1275        if (!(sc->sc_flags & SC_OP_INVALID))
1276                ath9k_hw_setpower(sc->sc_ah, ATH9K_PM_AWAKE);
1277
1278        /* cleanup tx queues */
1279        for (i = 0; i < ATH9K_NUM_TX_QUEUES; i++)
1280                if (ATH_TXQ_SETUP(sc, i))
1281                        ath_tx_cleanupq(sc, &sc->tx.txq[i]);
1282
1283        if ((sc->btcoex_info.no_stomp_timer) &&
1284            sc->btcoex_info.btcoex_scheme == ATH_BTCOEX_CFG_3WIRE)
1285                ath_gen_timer_free(sc->sc_ah, sc->btcoex_info.no_stomp_timer);
1286
1287        ath9k_hw_detach(sc->sc_ah);
1288        sc->sc_ah = NULL;
1289        ath9k_exit_debug(sc);
1290}
1291
1292static int ath9k_reg_notifier(struct wiphy *wiphy,
1293                              struct regulatory_request *request)
1294{
1295        struct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy);
1296        struct ath_wiphy *aphy = hw->priv;
1297        struct ath_softc *sc = aphy->sc;
1298        struct ath_regulatory *reg = &sc->common.regulatory;
1299
1300        return ath_reg_notifier_apply(wiphy, request, reg);
1301}
1302
1303/*
1304 * Initialize and fill ath_softc, ath_sofct is the
1305 * "Software Carrier" struct. Historically it has existed
1306 * to allow the separation between hardware specific
1307 * variables (now in ath_hw) and driver specific variables.
1308 */
1309static int ath_init_softc(u16 devid, struct ath_softc *sc, u16 subsysid)
1310{
1311        struct ath_hw *ah = NULL;
1312        int r = 0, i;
1313        int csz = 0;
1314
1315        /* XXX: hardware will not be ready until ath_open() being called */
1316        sc->sc_flags |= SC_OP_INVALID;
1317
1318        if (ath9k_init_debug(sc) < 0)
1319                printk(KERN_ERR "Unable to create debugfs files\n");
1320
1321        spin_lock_init(&sc->wiphy_lock);
1322        spin_lock_init(&sc->sc_resetlock);
1323        spin_lock_init(&sc->sc_serial_rw);
1324        spin_lock_init(&sc->ani_lock);
1325        spin_lock_init(&sc->sc_pm_lock);
1326        mutex_init(&sc->mutex);
1327        tasklet_init(&sc->intr_tq, ath9k_tasklet, (unsigned long)sc);
1328        tasklet_init(&sc->bcon_tasklet, ath_beacon_tasklet,
1329                     (unsigned long)sc);
1330
1331        /*
1332         * Cache line size is used to size and align various
1333         * structures used to communicate with the hardware.
1334         */
1335        ath_read_cachesize(sc, &csz);
1336        /* XXX assert csz is non-zero */
1337        sc->common.cachelsz = csz << 2; /* convert to bytes */
1338
1339        ah = kzalloc(sizeof(struct ath_hw), GFP_KERNEL);
1340        if (!ah) {
1341                r = -ENOMEM;
1342                goto bad_no_ah;
1343        }
1344
1345        ah->ah_sc = sc;
1346        ah->hw_version.devid = devid;
1347        ah->hw_version.subsysid = subsysid;
1348        sc->sc_ah = ah;
1349
1350        r = ath9k_hw_init(ah);
1351        if (r) {
1352                DPRINTF(sc, ATH_DBG_FATAL,
1353                        "Unable to initialize hardware; "
1354                        "initialization status: %d\n", r);
1355                goto bad;
1356        }
1357
1358        /* Get the hardware key cache size. */
1359        sc->keymax = ah->caps.keycache_size;
1360        if (sc->keymax > ATH_KEYMAX) {
1361                DPRINTF(sc, ATH_DBG_ANY,
1362                        "Warning, using only %u entries in %u key cache\n",
1363                        ATH_KEYMAX, sc->keymax);
1364                sc->keymax = ATH_KEYMAX;
1365        }
1366
1367        /*
1368         * Reset the key cache since some parts do not
1369         * reset the contents on initial power up.
1370         */
1371        for (i = 0; i < sc->keymax; i++)
1372                ath9k_hw_keyreset(ah, (u16) i);
1373
1374        /* default to MONITOR mode */
1375        sc->sc_ah->opmode = NL80211_IFTYPE_MONITOR;
1376
1377        /* Setup rate tables */
1378
1379        ath_rate_attach(sc);
1380        ath_setup_rates(sc, IEEE80211_BAND_2GHZ);
1381        ath_setup_rates(sc, IEEE80211_BAND_5GHZ);
1382
1383        /*
1384         * Allocate hardware transmit queues: one queue for
1385         * beacon frames and one data queue for each QoS
1386         * priority.  Note that the hal handles reseting
1387         * these queues at the needed time.
1388         */
1389        sc->beacon.beaconq = ath_beaconq_setup(ah);
1390        if (sc->beacon.beaconq == -1) {
1391                DPRINTF(sc, ATH_DBG_FATAL,
1392                        "Unable to setup a beacon xmit queue\n");
1393                r = -EIO;
1394                goto bad2;
1395        }
1396        sc->beacon.cabq = ath_txq_setup(sc, ATH9K_TX_QUEUE_CAB, 0);
1397        if (sc->beacon.cabq == NULL) {
1398                DPRINTF(sc, ATH_DBG_FATAL,
1399                        "Unable to setup CAB xmit queue\n");
1400                r = -EIO;
1401                goto bad2;
1402        }
1403
1404        sc->config.cabqReadytime = ATH_CABQ_READY_TIME;
1405        ath_cabq_update(sc);
1406
1407        for (i = 0; i < ARRAY_SIZE(sc->tx.hwq_map); i++)
1408                sc->tx.hwq_map[i] = -1;
1409
1410        /* Setup data queues */
1411        /* NB: ensure BK queue is the lowest priority h/w queue */
1412        if (!ath_tx_setup(sc, ATH9K_WME_AC_BK)) {
1413                DPRINTF(sc, ATH_DBG_FATAL,
1414                        "Unable to setup xmit queue for BK traffic\n");
1415                r = -EIO;
1416                goto bad2;
1417        }
1418
1419        if (!ath_tx_setup(sc, ATH9K_WME_AC_BE)) {
1420                DPRINTF(sc, ATH_DBG_FATAL,
1421                        "Unable to setup xmit queue for BE traffic\n");
1422                r = -EIO;
1423                goto bad2;
1424        }
1425        if (!ath_tx_setup(sc, ATH9K_WME_AC_VI)) {
1426                DPRINTF(sc, ATH_DBG_FATAL,
1427                        "Unable to setup xmit queue for VI traffic\n");
1428                r = -EIO;
1429                goto bad2;
1430        }
1431        if (!ath_tx_setup(sc, ATH9K_WME_AC_VO)) {
1432                DPRINTF(sc, ATH_DBG_FATAL,
1433                        "Unable to setup xmit queue for VO traffic\n");
1434                r = -EIO;
1435                goto bad2;
1436        }
1437
1438        /* Initializes the noise floor to a reasonable default value.
1439         * Later on this will be updated during ANI processing. */
1440
1441        sc->ani.noise_floor = ATH_DEFAULT_NOISE_FLOOR;
1442        setup_timer(&sc->ani.timer, ath_ani_calibrate, (unsigned long)sc);
1443
1444        if (ath9k_hw_getcapability(ah, ATH9K_CAP_CIPHER,
1445                                   ATH9K_CIPHER_TKIP, NULL)) {
1446                /*
1447                 * Whether we should enable h/w TKIP MIC.
1448                 * XXX: if we don't support WME TKIP MIC, then we wouldn't
1449                 * report WMM capable, so it's always safe to turn on
1450                 * TKIP MIC in this case.
1451                 */
1452                ath9k_hw_setcapability(sc->sc_ah, ATH9K_CAP_TKIP_MIC,
1453                                       0, 1, NULL);
1454        }
1455
1456        /*
1457         * Check whether the separate key cache entries
1458         * are required to handle both tx+rx MIC keys.
1459         * With split mic keys the number of stations is limited
1460         * to 27 otherwise 59.
1461         */
1462        if (ath9k_hw_getcapability(ah, ATH9K_CAP_CIPHER,
1463                                   ATH9K_CIPHER_TKIP, NULL)
1464            && ath9k_hw_getcapability(ah, ATH9K_CAP_CIPHER,
1465                                      ATH9K_CIPHER_MIC, NULL)
1466            && ath9k_hw_getcapability(ah, ATH9K_CAP_TKIP_SPLIT,
1467                                      0, NULL))
1468                sc->splitmic = 1;
1469
1470        /* turn on mcast key search if possible */
1471        if (!ath9k_hw_getcapability(ah, ATH9K_CAP_MCAST_KEYSRCH, 0, NULL))
1472                (void)ath9k_hw_setcapability(ah, ATH9K_CAP_MCAST_KEYSRCH, 1,
1473                                             1, NULL);
1474
1475        sc->config.txpowlimit = ATH_TXPOWER_MAX;
1476
1477        /* 11n Capabilities */
1478        if (ah->caps.hw_caps & ATH9K_HW_CAP_HT) {
1479                sc->sc_flags |= SC_OP_TXAGGR;
1480                sc->sc_flags |= SC_OP_RXAGGR;
1481        }
1482
1483        sc->tx_chainmask = ah->caps.tx_chainmask;
1484        sc->rx_chainmask = ah->caps.rx_chainmask;
1485
1486        ath9k_hw_setcapability(ah, ATH9K_CAP_DIVERSITY, 1, true, NULL);
1487        sc->rx.defant = ath9k_hw_getdefantenna(ah);
1488
1489        if (ah->caps.hw_caps & ATH9K_HW_CAP_BSSIDMASK)
1490                memcpy(sc->bssidmask, ath_bcast_mac, ETH_ALEN);
1491
1492        sc->beacon.slottime = ATH9K_SLOT_TIME_9;        /* default to short slot time */
1493
1494        /* initialize beacon slots */
1495        for (i = 0; i < ARRAY_SIZE(sc->beacon.bslot); i++) {
1496                sc->beacon.bslot[i] = NULL;
1497                sc->beacon.bslot_aphy[i] = NULL;
1498        }
1499
1500        /* setup channels and rates */
1501
1502        sc->sbands[IEEE80211_BAND_2GHZ].channels = ath9k_2ghz_chantable;
1503        sc->sbands[IEEE80211_BAND_2GHZ].bitrates =
1504                sc->rates[IEEE80211_BAND_2GHZ];
1505        sc->sbands[IEEE80211_BAND_2GHZ].band = IEEE80211_BAND_2GHZ;
1506        sc->sbands[IEEE80211_BAND_2GHZ].n_channels =
1507                ARRAY_SIZE(ath9k_2ghz_chantable);
1508
1509        if (test_bit(ATH9K_MODE_11A, sc->sc_ah->caps.wireless_modes)) {
1510                sc->sbands[IEEE80211_BAND_5GHZ].channels = ath9k_5ghz_chantable;
1511                sc->sbands[IEEE80211_BAND_5GHZ].bitrates =
1512                        sc->rates[IEEE80211_BAND_5GHZ];
1513                sc->sbands[IEEE80211_BAND_5GHZ].band = IEEE80211_BAND_5GHZ;
1514                sc->sbands[IEEE80211_BAND_5GHZ].n_channels =
1515                        ARRAY_SIZE(ath9k_5ghz_chantable);
1516        }
1517
1518        if (sc->btcoex_info.btcoex_scheme != ATH_BTCOEX_CFG_NONE) {
1519                r = ath9k_hw_btcoex_init(ah);
1520                if (r)
1521                        goto bad2;
1522        }
1523
1524        return 0;
1525bad2:
1526        /* cleanup tx queues */
1527        for (i = 0; i < ATH9K_NUM_TX_QUEUES; i++)
1528                if (ATH_TXQ_SETUP(sc, i))
1529                        ath_tx_cleanupq(sc, &sc->tx.txq[i]);
1530bad:
1531        ath9k_hw_detach(ah);
1532        sc->sc_ah = NULL;
1533bad_no_ah:
1534        ath9k_exit_debug(sc);
1535
1536        return r;
1537}
1538
1539void ath_set_hw_capab(struct ath_softc *sc, struct ieee80211_hw *hw)
1540{
1541        hw->flags = IEEE80211_HW_RX_INCLUDES_FCS |
1542                IEEE80211_HW_HOST_BROADCAST_PS_BUFFERING |
1543                IEEE80211_HW_SIGNAL_DBM |
1544                IEEE80211_HW_AMPDU_AGGREGATION |
1545                IEEE80211_HW_SUPPORTS_PS |
1546                IEEE80211_HW_PS_NULLFUNC_STACK |
1547                IEEE80211_HW_SPECTRUM_MGMT;
1548
1549        if (AR_SREV_9160_10_OR_LATER(sc->sc_ah) || modparam_nohwcrypt)
1550                hw->flags |= IEEE80211_HW_MFP_CAPABLE;
1551
1552        hw->wiphy->interface_modes =
1553                BIT(NL80211_IFTYPE_AP) |
1554                BIT(NL80211_IFTYPE_STATION) |
1555                BIT(NL80211_IFTYPE_ADHOC) |
1556                BIT(NL80211_IFTYPE_MESH_POINT);
1557
1558        hw->wiphy->ps_default = false;
1559
1560        hw->queues = 4;
1561        hw->max_rates = 4;
1562        hw->channel_change_time = 5000;
1563        hw->max_listen_interval = 10;
1564        /* Hardware supports 10 but we use 4 */
1565        hw->max_rate_tries = 4;
1566        hw->sta_data_size = sizeof(struct ath_node);
1567        hw->vif_data_size = sizeof(struct ath_vif);
1568
1569        hw->rate_control_algorithm = "ath9k_rate_control";
1570
1571        hw->wiphy->bands[IEEE80211_BAND_2GHZ] =
1572                &sc->sbands[IEEE80211_BAND_2GHZ];
1573        if (test_bit(ATH9K_MODE_11A, sc->sc_ah->caps.wireless_modes))
1574                hw->wiphy->bands[IEEE80211_BAND_5GHZ] =
1575                        &sc->sbands[IEEE80211_BAND_5GHZ];
1576}
1577
1578/* Device driver core initialization */
1579int ath_init_device(u16 devid, struct ath_softc *sc, u16 subsysid)
1580{
1581        struct ieee80211_hw *hw = sc->hw;
1582        int error = 0, i;
1583        struct ath_regulatory *reg;
1584
1585        DPRINTF(sc, ATH_DBG_CONFIG, "Attach ATH hw\n");
1586
1587        error = ath_init_softc(devid, sc, subsysid);
1588        if (error != 0)
1589                return error;
1590
1591        /* get mac address from hardware and set in mac80211 */
1592
1593        SET_IEEE80211_PERM_ADDR(hw, sc->sc_ah->macaddr);
1594
1595        ath_set_hw_capab(sc, hw);
1596
1597        error = ath_regd_init(&sc->common.regulatory, sc->hw->wiphy,
1598                              ath9k_reg_notifier);
1599        if (error)
1600                return error;
1601
1602        reg = &sc->common.regulatory;
1603
1604        if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_HT) {
1605                setup_ht_cap(sc, &sc->sbands[IEEE80211_BAND_2GHZ].ht_cap);
1606                if (test_bit(ATH9K_MODE_11A, sc->sc_ah->caps.wireless_modes))
1607                        setup_ht_cap(sc, &sc->sbands[IEEE80211_BAND_5GHZ].ht_cap);
1608        }
1609
1610        /* initialize tx/rx engine */
1611        error = ath_tx_init(sc, ATH_TXBUF);
1612        if (error != 0)
1613                goto error_attach;
1614
1615        error = ath_rx_init(sc, ATH_RXBUF);
1616        if (error != 0)
1617                goto error_attach;
1618
1619        INIT_WORK(&sc->chan_work, ath9k_wiphy_chan_work);
1620        INIT_DELAYED_WORK(&sc->wiphy_work, ath9k_wiphy_work);
1621        sc->wiphy_scheduler_int = msecs_to_jiffies(500);
1622
1623        error = ieee80211_register_hw(hw);
1624
1625        if (!ath_is_world_regd(reg)) {
1626                error = regulatory_hint(hw->wiphy, reg->alpha2);
1627                if (error)
1628                        goto error_attach;
1629        }
1630
1631        /* Initialize LED control */
1632        ath_init_leds(sc);
1633
1634        ath_start_rfkill_poll(sc);
1635
1636        return 0;
1637
1638error_attach:
1639        /* cleanup tx queues */
1640        for (i = 0; i < ATH9K_NUM_TX_QUEUES; i++)
1641                if (ATH_TXQ_SETUP(sc, i))
1642                        ath_tx_cleanupq(sc, &sc->tx.txq[i]);
1643
1644        ath9k_hw_detach(sc->sc_ah);
1645        sc->sc_ah = NULL;
1646        ath9k_exit_debug(sc);
1647
1648        return error;
1649}
1650
1651int ath_reset(struct ath_softc *sc, bool retry_tx)
1652{
1653        struct ath_hw *ah = sc->sc_ah;
1654        struct ieee80211_hw *hw = sc->hw;
1655        int r;
1656
1657        ath9k_hw_set_interrupts(ah, 0);
1658        ath_drain_all_txq(sc, retry_tx);
1659        ath_stoprecv(sc);
1660        ath_flushrecv(sc);
1661
1662        spin_lock_bh(&sc->sc_resetlock);
1663        r = ath9k_hw_reset(ah, sc->sc_ah->curchan, false);
1664        if (r)
1665                DPRINTF(sc, ATH_DBG_FATAL,
1666                        "Unable to reset hardware; reset status %d\n", r);
1667        spin_unlock_bh(&sc->sc_resetlock);
1668
1669        if (ath_startrecv(sc) != 0)
1670                DPRINTF(sc, ATH_DBG_FATAL, "Unable to start recv logic\n");
1671
1672        /*
1673         * We may be doing a reset in response to a request
1674         * that changes the channel so update any state that
1675         * might change as a result.
1676         */
1677        ath_cache_conf_rate(sc, &hw->conf);
1678
1679        ath_update_txpow(sc);
1680
1681        if (sc->sc_flags & SC_OP_BEACONS)
1682                ath_beacon_config(sc, NULL);    /* restart beacons */
1683
1684        ath9k_hw_set_interrupts(ah, sc->imask);
1685
1686        if (retry_tx) {
1687                int i;
1688                for (i = 0; i < ATH9K_NUM_TX_QUEUES; i++) {
1689                        if (ATH_TXQ_SETUP(sc, i)) {
1690                                spin_lock_bh(&sc->tx.txq[i].axq_lock);
1691                                ath_txq_schedule(sc, &sc->tx.txq[i]);
1692                                spin_unlock_bh(&sc->tx.txq[i].axq_lock);
1693                        }
1694                }
1695        }
1696
1697        return r;
1698}
1699
1700/*
1701 *  This function will allocate both the DMA descriptor structure, and the
1702 *  buffers it contains.  These are used to contain the descriptors used
1703 *  by the system.
1704*/
1705int ath_descdma_setup(struct ath_softc *sc, struct ath_descdma *dd,
1706                      struct list_head *head, const char *name,
1707                      int nbuf, int ndesc)
1708{
1709#define DS2PHYS(_dd, _ds)                                               \
1710        ((_dd)->dd_desc_paddr + ((caddr_t)(_ds) - (caddr_t)(_dd)->dd_desc))
1711#define ATH_DESC_4KB_BOUND_CHECK(_daddr) ((((_daddr) & 0xFFF) > 0xF7F) ? 1 : 0)
1712#define ATH_DESC_4KB_BOUND_NUM_SKIPPED(_len) ((_len) / 4096)
1713
1714        struct ath_desc *ds;
1715        struct ath_buf *bf;
1716        int i, bsize, error;
1717
1718        DPRINTF(sc, ATH_DBG_CONFIG, "%s DMA: %u buffers %u desc/buf\n",
1719                name, nbuf, ndesc);
1720
1721        INIT_LIST_HEAD(head);
1722        /* ath_desc must be a multiple of DWORDs */
1723        if ((sizeof(struct ath_desc) % 4) != 0) {
1724                DPRINTF(sc, ATH_DBG_FATAL, "ath_desc not DWORD aligned\n");
1725                ASSERT((sizeof(struct ath_desc) % 4) == 0);
1726                error = -ENOMEM;
1727                goto fail;
1728        }
1729
1730        dd->dd_desc_len = sizeof(struct ath_desc) * nbuf * ndesc;
1731
1732        /*
1733         * Need additional DMA memory because we can't use
1734         * descriptors that cross the 4K page boundary. Assume
1735         * one skipped descriptor per 4K page.
1736         */
1737        if (!(sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_4KB_SPLITTRANS)) {
1738                u32 ndesc_skipped =
1739                        ATH_DESC_4KB_BOUND_NUM_SKIPPED(dd->dd_desc_len);
1740                u32 dma_len;
1741
1742                while (ndesc_skipped) {
1743                        dma_len = ndesc_skipped * sizeof(struct ath_desc);
1744                        dd->dd_desc_len += dma_len;
1745
1746                        ndesc_skipped = ATH_DESC_4KB_BOUND_NUM_SKIPPED(dma_len);
1747                };
1748        }
1749
1750        /* allocate descriptors */
1751        dd->dd_desc = dma_alloc_coherent(sc->dev, dd->dd_desc_len,
1752                                         &dd->dd_desc_paddr, GFP_KERNEL);
1753        if (dd->dd_desc == NULL) {
1754                error = -ENOMEM;
1755                goto fail;
1756        }
1757        ds = dd->dd_desc;
1758        DPRINTF(sc, ATH_DBG_CONFIG, "%s DMA map: %p (%u) -> %llx (%u)\n",
1759                name, ds, (u32) dd->dd_desc_len,
1760                ito64(dd->dd_desc_paddr), /*XXX*/(u32) dd->dd_desc_len);
1761
1762        /* allocate buffers */
1763        bsize = sizeof(struct ath_buf) * nbuf;
1764        bf = kzalloc(bsize, GFP_KERNEL);
1765        if (bf == NULL) {
1766                error = -ENOMEM;
1767                goto fail2;
1768        }
1769        dd->dd_bufptr = bf;
1770
1771        for (i = 0; i < nbuf; i++, bf++, ds += ndesc) {
1772                bf->bf_desc = ds;
1773                bf->bf_daddr = DS2PHYS(dd, ds);
1774
1775                if (!(sc->sc_ah->caps.hw_caps &
1776                      ATH9K_HW_CAP_4KB_SPLITTRANS)) {
1777                        /*
1778                         * Skip descriptor addresses which can cause 4KB
1779                         * boundary crossing (addr + length) with a 32 dword
1780                         * descriptor fetch.
1781                         */
1782                        while (ATH_DESC_4KB_BOUND_CHECK(bf->bf_daddr)) {
1783                                ASSERT((caddr_t) bf->bf_desc <
1784                                       ((caddr_t) dd->dd_desc +
1785                                        dd->dd_desc_len));
1786
1787                                ds += ndesc;
1788                                bf->bf_desc = ds;
1789                                bf->bf_daddr = DS2PHYS(dd, ds);
1790                        }
1791                }
1792                list_add_tail(&bf->list, head);
1793        }
1794        return 0;
1795fail2:
1796        dma_free_coherent(sc->dev, dd->dd_desc_len, dd->dd_desc,
1797                          dd->dd_desc_paddr);
1798fail:
1799        memset(dd, 0, sizeof(*dd));
1800        return error;
1801#undef ATH_DESC_4KB_BOUND_CHECK
1802#undef ATH_DESC_4KB_BOUND_NUM_SKIPPED
1803#undef DS2PHYS
1804}
1805
1806void ath_descdma_cleanup(struct ath_softc *sc,
1807                         struct ath_descdma *dd,
1808                         struct list_head *head)
1809{
1810        dma_free_coherent(sc->dev, dd->dd_desc_len, dd->dd_desc,
1811                          dd->dd_desc_paddr);
1812
1813        INIT_LIST_HEAD(head);
1814        kfree(dd->dd_bufptr);
1815        memset(dd, 0, sizeof(*dd));
1816}
1817
1818int ath_get_hal_qnum(u16 queue, struct ath_softc *sc)
1819{
1820        int qnum;
1821
1822        switch (queue) {
1823        case 0:
1824                qnum = sc->tx.hwq_map[ATH9K_WME_AC_VO];
1825                break;
1826        case 1:
1827                qnum = sc->tx.hwq_map[ATH9K_WME_AC_VI];
1828                break;
1829        case 2:
1830                qnum = sc->tx.hwq_map[ATH9K_WME_AC_BE];
1831                break;
1832        case 3:
1833                qnum = sc->tx.hwq_map[ATH9K_WME_AC_BK];
1834                break;
1835        default:
1836                qnum = sc->tx.hwq_map[ATH9K_WME_AC_BE];
1837                break;
1838        }
1839
1840        return qnum;
1841}
1842
1843int ath_get_mac80211_qnum(u32 queue, struct ath_softc *sc)
1844{
1845        int qnum;
1846
1847        switch (queue) {
1848        case ATH9K_WME_AC_VO:
1849                qnum = 0;
1850                break;
1851        case ATH9K_WME_AC_VI:
1852                qnum = 1;
1853                break;
1854        case ATH9K_WME_AC_BE:
1855                qnum = 2;
1856                break;
1857        case ATH9K_WME_AC_BK:
1858                qnum = 3;
1859                break;
1860        default:
1861                qnum = -1;
1862                break;
1863        }
1864
1865        return qnum;
1866}
1867
1868/* XXX: Remove me once we don't depend on ath9k_channel for all
1869 * this redundant data */
1870void ath9k_update_ichannel(struct ath_softc *sc, struct ieee80211_hw *hw,
1871                           struct ath9k_channel *ichan)
1872{
1873        struct ieee80211_channel *chan = hw->conf.channel;
1874        struct ieee80211_conf *conf = &hw->conf;
1875
1876        ichan->channel = chan->center_freq;
1877        ichan->chan = chan;
1878
1879        if (chan->band == IEEE80211_BAND_2GHZ) {
1880                ichan->chanmode = CHANNEL_G;
1881                ichan->channelFlags = CHANNEL_2GHZ | CHANNEL_OFDM | CHANNEL_G;
1882        } else {
1883                ichan->chanmode = CHANNEL_A;
1884                ichan->channelFlags = CHANNEL_5GHZ | CHANNEL_OFDM;
1885        }
1886
1887        sc->tx_chan_width = ATH9K_HT_MACMODE_20;
1888
1889        if (conf_is_ht(conf)) {
1890                if (conf_is_ht40(conf))
1891                        sc->tx_chan_width = ATH9K_HT_MACMODE_2040;
1892
1893                ichan->chanmode = ath_get_extchanmode(sc, chan,
1894                                            conf->channel_type);
1895        }
1896}
1897
1898/**********************/
1899/* mac80211 callbacks */
1900/**********************/
1901
1902static int ath9k_start(struct ieee80211_hw *hw)
1903{
1904        struct ath_wiphy *aphy = hw->priv;
1905        struct ath_softc *sc = aphy->sc;
1906        struct ieee80211_channel *curchan = hw->conf.channel;
1907        struct ath9k_channel *init_channel;
1908        int r;
1909
1910        DPRINTF(sc, ATH_DBG_CONFIG, "Starting driver with "
1911                "initial channel: %d MHz\n", curchan->center_freq);
1912
1913        mutex_lock(&sc->mutex);
1914
1915        if (ath9k_wiphy_started(sc)) {
1916                if (sc->chan_idx == curchan->hw_value) {
1917                        /*
1918                         * Already on the operational channel, the new wiphy
1919                         * can be marked active.
1920                         */
1921                        aphy->state = ATH_WIPHY_ACTIVE;
1922                        ieee80211_wake_queues(hw);
1923                } else {
1924                        /*
1925                         * Another wiphy is on another channel, start the new
1926                         * wiphy in paused state.
1927                         */
1928                        aphy->state = ATH_WIPHY_PAUSED;
1929                        ieee80211_stop_queues(hw);
1930                }
1931                mutex_unlock(&sc->mutex);
1932                return 0;
1933        }
1934        aphy->state = ATH_WIPHY_ACTIVE;
1935
1936        /* setup initial channel */
1937
1938        sc->chan_idx = curchan->hw_value;
1939
1940        init_channel = ath_get_curchannel(sc, hw);
1941
1942        /* Reset SERDES registers */
1943        ath9k_hw_configpcipowersave(sc->sc_ah, 0, 0);
1944
1945        /*
1946         * The basic interface to setting the hardware in a good
1947         * state is ``reset''.  On return the hardware is known to
1948         * be powered up and with interrupts disabled.  This must
1949         * be followed by initialization of the appropriate bits
1950         * and then setup of the interrupt mask.
1951         */
1952        spin_lock_bh(&sc->sc_resetlock);
1953        r = ath9k_hw_reset(sc->sc_ah, init_channel, false);
1954        if (r) {
1955                DPRINTF(sc, ATH_DBG_FATAL,
1956                        "Unable to reset hardware; reset status %d "
1957                        "(freq %u MHz)\n", r,
1958                        curchan->center_freq);
1959                spin_unlock_bh(&sc->sc_resetlock);
1960                goto mutex_unlock;
1961        }
1962        spin_unlock_bh(&sc->sc_resetlock);
1963
1964        /*
1965         * This is needed only to setup initial state
1966         * but it's best done after a reset.
1967         */
1968        ath_update_txpow(sc);
1969
1970        /*
1971         * Setup the hardware after reset:
1972         * The receive engine is set going.
1973         * Frame transmit is handled entirely
1974         * in the frame output path; there's nothing to do
1975         * here except setup the interrupt mask.
1976         */
1977        if (ath_startrecv(sc) != 0) {
1978                DPRINTF(sc, ATH_DBG_FATAL, "Unable to start recv logic\n");
1979                r = -EIO;
1980                goto mutex_unlock;
1981        }
1982
1983        /* Setup our intr mask. */
1984        sc->imask = ATH9K_INT_RX | ATH9K_INT_TX
1985                | ATH9K_INT_RXEOL | ATH9K_INT_RXORN
1986                | ATH9K_INT_FATAL | ATH9K_INT_GLOBAL;
1987
1988        if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_GTT)
1989                sc->imask |= ATH9K_INT_GTT;
1990
1991        if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_HT)
1992                sc->imask |= ATH9K_INT_CST;
1993
1994        ath_cache_conf_rate(sc, &hw->conf);
1995
1996        sc->sc_flags &= ~SC_OP_INVALID;
1997
1998        /* Disable BMISS interrupt when we're not associated */
1999        sc->imask &= ~(ATH9K_INT_SWBA | ATH9K_INT_BMISS);
2000        ath9k_hw_set_interrupts(sc->sc_ah, sc->imask);
2001
2002        ieee80211_wake_queues(hw);
2003
2004        ieee80211_queue_delayed_work(sc->hw, &sc->tx_complete_work, 0);
2005
2006        if ((sc->btcoex_info.btcoex_scheme != ATH_BTCOEX_CFG_NONE) &&
2007            !(sc->sc_flags & SC_OP_BTCOEX_ENABLED)) {
2008                ath_btcoex_set_weight(&sc->btcoex_info, AR_BT_COEX_WGHT,
2009                                      AR_STOMP_LOW_WLAN_WGHT);
2010                ath9k_hw_btcoex_enable(sc->sc_ah);
2011
2012                ath_pcie_aspm_disable(sc);
2013                if (sc->btcoex_info.btcoex_scheme == ATH_BTCOEX_CFG_3WIRE)
2014                        ath_btcoex_timer_resume(sc, &sc->btcoex_info);
2015        }
2016
2017mutex_unlock:
2018        mutex_unlock(&sc->mutex);
2019
2020        return r;
2021}
2022
2023static int ath9k_tx(struct ieee80211_hw *hw,
2024                    struct sk_buff *skb)
2025{
2026        struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
2027        struct ath_wiphy *aphy = hw->priv;
2028        struct ath_softc *sc = aphy->sc;
2029        struct ath_tx_control txctl;
2030        int hdrlen, padsize;
2031
2032        if (aphy->state != ATH_WIPHY_ACTIVE && aphy->state != ATH_WIPHY_SCAN) {
2033                printk(KERN_DEBUG "ath9k: %s: TX in unexpected wiphy state "
2034                       "%d\n", wiphy_name(hw->wiphy), aphy->state);
2035                goto exit;
2036        }
2037
2038        if (sc->ps_enabled) {
2039                struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
2040                /*
2041                 * mac80211 does not set PM field for normal data frames, so we
2042                 * need to update that based on the current PS mode.
2043                 */
2044                if (ieee80211_is_data(hdr->frame_control) &&
2045                    !ieee80211_is_nullfunc(hdr->frame_control) &&
2046                    !ieee80211_has_pm(hdr->frame_control)) {
2047                        DPRINTF(sc, ATH_DBG_PS, "Add PM=1 for a TX frame "
2048                                "while in PS mode\n");
2049                        hdr->frame_control |= cpu_to_le16(IEEE80211_FCTL_PM);
2050                }
2051        }
2052
2053        if (unlikely(sc->sc_ah->power_mode != ATH9K_PM_AWAKE)) {
2054                /*
2055                 * We are using PS-Poll and mac80211 can request TX while in
2056                 * power save mode. Need to wake up hardware for the TX to be
2057                 * completed and if needed, also for RX of buffered frames.
2058                 */
2059                struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
2060                ath9k_ps_wakeup(sc);
2061                ath9k_hw_setrxabort(sc->sc_ah, 0);
2062                if (ieee80211_is_pspoll(hdr->frame_control)) {
2063                        DPRINTF(sc, ATH_DBG_PS, "Sending PS-Poll to pick a "
2064                                "buffered frame\n");
2065                        sc->sc_flags |= SC_OP_WAIT_FOR_PSPOLL_DATA;
2066                } else {
2067                        DPRINTF(sc, ATH_DBG_PS, "Wake up to complete TX\n");
2068                        sc->sc_flags |= SC_OP_WAIT_FOR_TX_ACK;
2069                }
2070                /*
2071                 * The actual restore operation will happen only after
2072                 * the sc_flags bit is cleared. We are just dropping
2073                 * the ps_usecount here.
2074                 */
2075                ath9k_ps_restore(sc);
2076        }
2077
2078        memset(&txctl, 0, sizeof(struct ath_tx_control));
2079
2080        /*
2081         * As a temporary workaround, assign seq# here; this will likely need
2082         * to be cleaned up to work better with Beacon transmission and virtual
2083         * BSSes.
2084         */
2085        if (info->flags & IEEE80211_TX_CTL_ASSIGN_SEQ) {
2086                struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
2087                if (info->flags & IEEE80211_TX_CTL_FIRST_FRAGMENT)
2088                        sc->tx.seq_no += 0x10;
2089                hdr->seq_ctrl &= cpu_to_le16(IEEE80211_SCTL_FRAG);
2090                hdr->seq_ctrl |= cpu_to_le16(sc->tx.seq_no);
2091        }
2092
2093        /* Add the padding after the header if this is not already done */
2094        hdrlen = ieee80211_get_hdrlen_from_skb(skb);
2095        if (hdrlen & 3) {
2096                padsize = hdrlen % 4;
2097                if (skb_headroom(skb) < padsize)
2098                        return -1;
2099                skb_push(skb, padsize);
2100                memmove(skb->data, skb->data + padsize, hdrlen);
2101        }
2102
2103        /* Check if a tx queue is available */
2104
2105        txctl.txq = ath_test_get_txq(sc, skb);
2106        if (!txctl.txq)
2107                goto exit;
2108
2109        DPRINTF(sc, ATH_DBG_XMIT, "transmitting packet, skb: %p\n", skb);
2110
2111        if (ath_tx_start(hw, skb, &txctl) != 0) {
2112                DPRINTF(sc, ATH_DBG_XMIT, "TX failed\n");
2113                goto exit;
2114        }
2115
2116        return 0;
2117exit:
2118        dev_kfree_skb_any(skb);
2119        return 0;
2120}
2121
2122static void ath9k_stop(struct ieee80211_hw *hw)
2123{
2124        struct ath_wiphy *aphy = hw->priv;
2125        struct ath_softc *sc = aphy->sc;
2126
2127        mutex_lock(&sc->mutex);
2128
2129        aphy->state = ATH_WIPHY_INACTIVE;
2130
2131        cancel_delayed_work_sync(&sc->ath_led_blink_work);
2132        cancel_delayed_work_sync(&sc->tx_complete_work);
2133
2134        if (!sc->num_sec_wiphy) {
2135                cancel_delayed_work_sync(&sc->wiphy_work);
2136                cancel_work_sync(&sc->chan_work);
2137        }
2138
2139        if (sc->sc_flags & SC_OP_INVALID) {
2140                DPRINTF(sc, ATH_DBG_ANY, "Device not present\n");
2141                mutex_unlock(&sc->mutex);
2142                return;
2143        }
2144
2145        if (ath9k_wiphy_started(sc)) {
2146                mutex_unlock(&sc->mutex);
2147                return; /* another wiphy still in use */
2148        }
2149
2150        if (sc->sc_flags & SC_OP_BTCOEX_ENABLED) {
2151                ath9k_hw_btcoex_disable(sc->sc_ah);
2152                if (sc->btcoex_info.btcoex_scheme == ATH_BTCOEX_CFG_3WIRE)
2153                        ath_btcoex_timer_pause(sc, &sc->btcoex_info);
2154        }
2155
2156        /* make sure h/w will not generate any interrupt
2157         * before setting the invalid flag. */
2158        ath9k_hw_set_interrupts(sc->sc_ah, 0);
2159
2160        if (!(sc->sc_flags & SC_OP_INVALID)) {
2161                ath_drain_all_txq(sc, false);
2162                ath_stoprecv(sc);
2163                ath9k_hw_phy_disable(sc->sc_ah);
2164        } else
2165                sc->rx.rxlink = NULL;
2166
2167        /* disable HAL and put h/w to sleep */
2168        ath9k_hw_disable(sc->sc_ah);
2169        ath9k_hw_configpcipowersave(sc->sc_ah, 1, 1);
2170        ath9k_hw_setpower(sc->sc_ah, ATH9K_PM_FULL_SLEEP);
2171
2172        sc->sc_flags |= SC_OP_INVALID;
2173
2174        mutex_unlock(&sc->mutex);
2175
2176        DPRINTF(sc, ATH_DBG_CONFIG, "Driver halt\n");
2177}
2178
2179static int ath9k_add_interface(struct ieee80211_hw *hw,
2180                               struct ieee80211_if_init_conf *conf)
2181{
2182        struct ath_wiphy *aphy = hw->priv;
2183        struct ath_softc *sc = aphy->sc;
2184        struct ath_vif *avp = (void *)conf->vif->drv_priv;
2185        enum nl80211_iftype ic_opmode = NL80211_IFTYPE_UNSPECIFIED;
2186        int ret = 0;
2187
2188        mutex_lock(&sc->mutex);
2189
2190        if (!(sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_BSSIDMASK) &&
2191            sc->nvifs > 0) {
2192                ret = -ENOBUFS;
2193                goto out;
2194        }
2195
2196        switch (conf->type) {
2197        case NL80211_IFTYPE_STATION:
2198                ic_opmode = NL80211_IFTYPE_STATION;
2199                break;
2200        case NL80211_IFTYPE_ADHOC:
2201        case NL80211_IFTYPE_AP:
2202        case NL80211_IFTYPE_MESH_POINT:
2203                if (sc->nbcnvifs >= ATH_BCBUF) {
2204                        ret = -ENOBUFS;
2205                        goto out;
2206                }
2207                ic_opmode = conf->type;
2208                break;
2209        default:
2210                DPRINTF(sc, ATH_DBG_FATAL,
2211                        "Interface type %d not yet supported\n", conf->type);
2212                ret = -EOPNOTSUPP;
2213                goto out;
2214        }
2215
2216        DPRINTF(sc, ATH_DBG_CONFIG, "Attach a VIF of type: %d\n", ic_opmode);
2217
2218        /* Set the VIF opmode */
2219        avp->av_opmode = ic_opmode;
2220        avp->av_bslot = -1;
2221
2222        sc->nvifs++;
2223
2224        if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_BSSIDMASK)
2225                ath9k_set_bssid_mask(hw);
2226
2227        if (sc->nvifs > 1)
2228                goto out; /* skip global settings for secondary vif */
2229
2230        if (ic_opmode == NL80211_IFTYPE_AP) {
2231                ath9k_hw_set_tsfadjust(sc->sc_ah, 1);
2232                sc->sc_flags |= SC_OP_TSF_RESET;
2233        }
2234
2235        /* Set the device opmode */
2236        sc->sc_ah->opmode = ic_opmode;
2237
2238        /*
2239         * Enable MIB interrupts when there are hardware phy counters.
2240         * Note we only do this (at the moment) for station mode.
2241         */
2242        if ((conf->type == NL80211_IFTYPE_STATION) ||
2243            (conf->type == NL80211_IFTYPE_ADHOC) ||
2244            (conf->type == NL80211_IFTYPE_MESH_POINT)) {
2245                sc->imask |= ATH9K_INT_MIB;
2246                sc->imask |= ATH9K_INT_TSFOOR;
2247        }
2248
2249        ath9k_hw_set_interrupts(sc->sc_ah, sc->imask);
2250
2251        if (conf->type == NL80211_IFTYPE_AP    ||
2252            conf->type == NL80211_IFTYPE_ADHOC ||
2253            conf->type == NL80211_IFTYPE_MONITOR)
2254                ath_start_ani(sc);
2255
2256out:
2257        mutex_unlock(&sc->mutex);
2258        return ret;
2259}
2260
2261static void ath9k_remove_interface(struct ieee80211_hw *hw,
2262                                   struct ieee80211_if_init_conf *conf)
2263{
2264        struct ath_wiphy *aphy = hw->priv;
2265        struct ath_softc *sc = aphy->sc;
2266        struct ath_vif *avp = (void *)conf->vif->drv_priv;
2267        int i;
2268
2269        DPRINTF(sc, ATH_DBG_CONFIG, "Detach Interface\n");
2270
2271        mutex_lock(&sc->mutex);
2272
2273        /* Stop ANI */
2274        del_timer_sync(&sc->ani.timer);
2275
2276        /* Reclaim beacon resources */
2277        if ((sc->sc_ah->opmode == NL80211_IFTYPE_AP) ||
2278            (sc->sc_ah->opmode == NL80211_IFTYPE_ADHOC) ||
2279            (sc->sc_ah->opmode == NL80211_IFTYPE_MESH_POINT)) {
2280                ath9k_hw_stoptxdma(sc->sc_ah, sc->beacon.beaconq);
2281                ath_beacon_return(sc, avp);
2282        }
2283
2284        sc->sc_flags &= ~SC_OP_BEACONS;
2285
2286        for (i = 0; i < ARRAY_SIZE(sc->beacon.bslot); i++) {
2287                if (sc->beacon.bslot[i] == conf->vif) {
2288                        printk(KERN_DEBUG "%s: vif had allocated beacon "
2289                               "slot\n", __func__);
2290                        sc->beacon.bslot[i] = NULL;
2291                        sc->beacon.bslot_aphy[i] = NULL;
2292                }
2293        }
2294
2295        sc->nvifs--;
2296
2297        mutex_unlock(&sc->mutex);
2298}
2299
2300static int ath9k_config(struct ieee80211_hw *hw, u32 changed)
2301{
2302        struct ath_wiphy *aphy = hw->priv;
2303        struct ath_softc *sc = aphy->sc;
2304        struct ieee80211_conf *conf = &hw->conf;
2305        struct ath_hw *ah = sc->sc_ah;
2306        bool all_wiphys_idle = false, disable_radio = false;
2307
2308        mutex_lock(&sc->mutex);
2309
2310        /* Leave this as the first check */
2311        if (changed & IEEE80211_CONF_CHANGE_IDLE) {
2312
2313                spin_lock_bh(&sc->wiphy_lock);
2314                all_wiphys_idle =  ath9k_all_wiphys_idle(sc);
2315                spin_unlock_bh(&sc->wiphy_lock);
2316
2317                if (conf->flags & IEEE80211_CONF_IDLE){
2318                        if (all_wiphys_idle)
2319                                disable_radio = true;
2320                }
2321                else if (all_wiphys_idle) {
2322                        ath_radio_enable(sc);
2323                        DPRINTF(sc, ATH_DBG_CONFIG,
2324                                "not-idle: enabling radio\n");
2325                }
2326        }
2327
2328        if (changed & IEEE80211_CONF_CHANGE_PS) {
2329                if (conf->flags & IEEE80211_CONF_PS) {
2330                        if (!(ah->caps.hw_caps &
2331                              ATH9K_HW_CAP_AUTOSLEEP)) {
2332                                if ((sc->imask & ATH9K_INT_TIM_TIMER) == 0) {
2333                                        sc->imask |= ATH9K_INT_TIM_TIMER;
2334                                        ath9k_hw_set_interrupts(sc->sc_ah,
2335                                                        sc->imask);
2336                                }
2337                                ath9k_hw_setrxabort(sc->sc_ah, 1);
2338                        }
2339                        sc->ps_enabled = true;
2340                } else {
2341                        sc->ps_enabled = false;
2342                        ath9k_hw_setpower(sc->sc_ah, ATH9K_PM_AWAKE);
2343                        if (!(ah->caps.hw_caps &
2344                              ATH9K_HW_CAP_AUTOSLEEP)) {
2345                                ath9k_hw_setrxabort(sc->sc_ah, 0);
2346                                sc->sc_flags &= ~(SC_OP_WAIT_FOR_BEACON |
2347                                                  SC_OP_WAIT_FOR_CAB |
2348                                                  SC_OP_WAIT_FOR_PSPOLL_DATA |
2349                                                  SC_OP_WAIT_FOR_TX_ACK);
2350                                if (sc->imask & ATH9K_INT_TIM_TIMER) {
2351                                        sc->imask &= ~ATH9K_INT_TIM_TIMER;
2352                                        ath9k_hw_set_interrupts(sc->sc_ah,
2353                                                        sc->imask);
2354                                }
2355                        }
2356                }
2357        }
2358
2359        if (changed & IEEE80211_CONF_CHANGE_CHANNEL) {
2360                struct ieee80211_channel *curchan = hw->conf.channel;
2361                int pos = curchan->hw_value;
2362
2363                aphy->chan_idx = pos;
2364                aphy->chan_is_ht = conf_is_ht(conf);
2365
2366                if (aphy->state == ATH_WIPHY_SCAN ||
2367                    aphy->state == ATH_WIPHY_ACTIVE)
2368                        ath9k_wiphy_pause_all_forced(sc, aphy);
2369                else {
2370                        /*
2371                         * Do not change operational channel based on a paused
2372                         * wiphy changes.
2373                         */
2374                        goto skip_chan_change;
2375                }
2376
2377                DPRINTF(sc, ATH_DBG_CONFIG, "Set channel: %d MHz\n",
2378                        curchan->center_freq);
2379
2380                /* XXX: remove me eventualy */
2381                ath9k_update_ichannel(sc, hw, &sc->sc_ah->channels[pos]);
2382
2383                ath_update_chainmask(sc, conf_is_ht(conf));
2384
2385                if (ath_set_channel(sc, hw, &sc->sc_ah->channels[pos]) < 0) {
2386                        DPRINTF(sc, ATH_DBG_FATAL, "Unable to set channel\n");
2387                        mutex_unlock(&sc->mutex);
2388                        return -EINVAL;
2389                }
2390        }
2391
2392skip_chan_change:
2393        if (changed & IEEE80211_CONF_CHANGE_POWER)
2394                sc->config.txpowlimit = 2 * conf->power_level;
2395
2396        if (disable_radio) {
2397                DPRINTF(sc, ATH_DBG_CONFIG, "idle: disabling radio\n");
2398                ath_radio_disable(sc);
2399        }
2400
2401        mutex_unlock(&sc->mutex);
2402
2403        return 0;
2404}
2405
2406#define SUPPORTED_FILTERS                       \
2407        (FIF_PROMISC_IN_BSS |                   \
2408        FIF_ALLMULTI |                          \
2409        FIF_CONTROL |                           \
2410        FIF_PSPOLL |                            \
2411        FIF_OTHER_BSS |                         \
2412        FIF_BCN_PRBRESP_PROMISC |               \
2413        FIF_FCSFAIL)
2414
2415/* FIXME: sc->sc_full_reset ? */
2416static void ath9k_configure_filter(struct ieee80211_hw *hw,
2417                                   unsigned int changed_flags,
2418                                   unsigned int *total_flags,
2419                                   u64 multicast)
2420{
2421        struct ath_wiphy *aphy = hw->priv;
2422        struct ath_softc *sc = aphy->sc;
2423        u32 rfilt;
2424
2425        changed_flags &= SUPPORTED_FILTERS;
2426        *total_flags &= SUPPORTED_FILTERS;
2427
2428        sc->rx.rxfilter = *total_flags;
2429        ath9k_ps_wakeup(sc);
2430        rfilt = ath_calcrxfilter(sc);
2431        ath9k_hw_setrxfilter(sc->sc_ah, rfilt);
2432        ath9k_ps_restore(sc);
2433
2434        DPRINTF(sc, ATH_DBG_CONFIG, "Set HW RX filter: 0x%x\n", rfilt);
2435}
2436
2437static void ath9k_sta_notify(struct ieee80211_hw *hw,
2438                             struct ieee80211_vif *vif,
2439                             enum sta_notify_cmd cmd,
2440                             struct ieee80211_sta *sta)
2441{
2442        struct ath_wiphy *aphy = hw->priv;
2443        struct ath_softc *sc = aphy->sc;
2444
2445        switch (cmd) {
2446        case STA_NOTIFY_ADD:
2447                ath_node_attach(sc, sta);
2448                break;
2449        case STA_NOTIFY_REMOVE:
2450                ath_node_detach(sc, sta);
2451                break;
2452        default:
2453                break;
2454        }
2455}
2456
2457static int ath9k_conf_tx(struct ieee80211_hw *hw, u16 queue,
2458                         const struct ieee80211_tx_queue_params *params)
2459{
2460        struct ath_wiphy *aphy = hw->priv;
2461        struct ath_softc *sc = aphy->sc;
2462        struct ath9k_tx_queue_info qi;
2463        int ret = 0, qnum;
2464
2465        if (queue >= WME_NUM_AC)
2466                return 0;
2467
2468        mutex_lock(&sc->mutex);
2469
2470        memset(&qi, 0, sizeof(struct ath9k_tx_queue_info));
2471
2472        qi.tqi_aifs = params->aifs;
2473        qi.tqi_cwmin = params->cw_min;
2474        qi.tqi_cwmax = params->cw_max;
2475        qi.tqi_burstTime = params->txop;
2476        qnum = ath_get_hal_qnum(queue, sc);
2477
2478        DPRINTF(sc, ATH_DBG_CONFIG,
2479                "Configure tx [queue/halq] [%d/%d],  "
2480                "aifs: %d, cw_min: %d, cw_max: %d, txop: %d\n",
2481                queue, qnum, params->aifs, params->cw_min,
2482                params->cw_max, params->txop);
2483
2484        ret = ath_txq_update(sc, qnum, &qi);
2485        if (ret)
2486                DPRINTF(sc, ATH_DBG_FATAL, "TXQ Update failed\n");
2487
2488        mutex_unlock(&sc->mutex);
2489
2490        return ret;
2491}
2492
2493static int ath9k_set_key(struct ieee80211_hw *hw,
2494                         enum set_key_cmd cmd,
2495                         struct ieee80211_vif *vif,
2496                         struct ieee80211_sta *sta,
2497                         struct ieee80211_key_conf *key)
2498{
2499        struct ath_wiphy *aphy = hw->priv;
2500        struct ath_softc *sc = aphy->sc;
2501        int ret = 0;
2502
2503        if (modparam_nohwcrypt)
2504                return -ENOSPC;
2505
2506        mutex_lock(&sc->mutex);
2507        ath9k_ps_wakeup(sc);
2508        DPRINTF(sc, ATH_DBG_CONFIG, "Set HW Key\n");
2509
2510        switch (cmd) {
2511        case SET_KEY:
2512                ret = ath_key_config(sc, vif, sta, key);
2513                if (ret >= 0) {
2514                        key->hw_key_idx = ret;
2515                        /* push IV and Michael MIC generation to stack */
2516                        key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV;
2517                        if (key->alg == ALG_TKIP)
2518                                key->flags |= IEEE80211_KEY_FLAG_GENERATE_MMIC;
2519                        if (sc->sc_ah->sw_mgmt_crypto && key->alg == ALG_CCMP)
2520                                key->flags |= IEEE80211_KEY_FLAG_SW_MGMT;
2521                        ret = 0;
2522                }
2523                break;
2524        case DISABLE_KEY:
2525                ath_key_delete(sc, key);
2526                break;
2527        default:
2528                ret = -EINVAL;
2529        }
2530
2531        ath9k_ps_restore(sc);
2532        mutex_unlock(&sc->mutex);
2533
2534        return ret;
2535}
2536
2537static void ath9k_bss_info_changed(struct ieee80211_hw *hw,
2538                                   struct ieee80211_vif *vif,
2539                                   struct ieee80211_bss_conf *bss_conf,
2540                                   u32 changed)
2541{
2542        struct ath_wiphy *aphy = hw->priv;
2543        struct ath_softc *sc = aphy->sc;
2544        struct ath_hw *ah = sc->sc_ah;
2545        struct ath_vif *avp = (void *)vif->drv_priv;
2546        u32 rfilt = 0;
2547        int error, i;
2548
2549        mutex_lock(&sc->mutex);
2550
2551        /*
2552         * TODO: Need to decide which hw opmode to use for
2553         *       multi-interface cases
2554         * XXX: This belongs into add_interface!
2555         */
2556        if (vif->type == NL80211_IFTYPE_AP &&
2557            ah->opmode != NL80211_IFTYPE_AP) {
2558                ah->opmode = NL80211_IFTYPE_STATION;
2559                ath9k_hw_setopmode(ah);
2560                memcpy(sc->curbssid, sc->sc_ah->macaddr, ETH_ALEN);
2561                sc->curaid = 0;
2562                ath9k_hw_write_associd(sc);
2563                /* Request full reset to get hw opmode changed properly */
2564                sc->sc_flags |= SC_OP_FULL_RESET;
2565        }
2566
2567        if ((changed & BSS_CHANGED_BSSID) &&
2568            !is_zero_ether_addr(bss_conf->bssid)) {
2569                switch (vif->type) {
2570                case NL80211_IFTYPE_STATION:
2571                case NL80211_IFTYPE_ADHOC:
2572                case NL80211_IFTYPE_MESH_POINT:
2573                        /* Set BSSID */
2574                        memcpy(sc->curbssid, bss_conf->bssid, ETH_ALEN);
2575                        memcpy(avp->bssid, bss_conf->bssid, ETH_ALEN);
2576                        sc->curaid = 0;
2577                        ath9k_hw_write_associd(sc);
2578
2579                        /* Set aggregation protection mode parameters */
2580                        sc->config.ath_aggr_prot = 0;
2581
2582                        DPRINTF(sc, ATH_DBG_CONFIG,
2583                                "RX filter 0x%x bssid %pM aid 0x%x\n",
2584                                rfilt, sc->curbssid, sc->curaid);
2585
2586                        /* need to reconfigure the beacon */
2587                        sc->sc_flags &= ~SC_OP_BEACONS ;
2588
2589                        break;
2590                default:
2591                        break;
2592                }
2593        }
2594
2595        if ((vif->type == NL80211_IFTYPE_ADHOC) ||
2596            (vif->type == NL80211_IFTYPE_AP) ||
2597            (vif->type == NL80211_IFTYPE_MESH_POINT)) {
2598                if ((changed & BSS_CHANGED_BEACON) ||
2599                    (changed & BSS_CHANGED_BEACON_ENABLED &&
2600                     bss_conf->enable_beacon)) {
2601                        /*
2602                         * Allocate and setup the beacon frame.
2603                         *
2604                         * Stop any previous beacon DMA.  This may be
2605                         * necessary, for example, when an ibss merge
2606                         * causes reconfiguration; we may be called
2607                         * with beacon transmission active.
2608                         */
2609                        ath9k_hw_stoptxdma(sc->sc_ah, sc->beacon.beaconq);
2610
2611                        error = ath_beacon_alloc(aphy, vif);
2612                        if (!error)
2613                                ath_beacon_config(sc, vif);
2614                }
2615        }
2616
2617        /* Check for WLAN_CAPABILITY_PRIVACY ? */
2618        if ((avp->av_opmode != NL80211_IFTYPE_STATION)) {
2619                for (i = 0; i < IEEE80211_WEP_NKID; i++)
2620                        if (ath9k_hw_keyisvalid(sc->sc_ah, (u16)i))
2621                                ath9k_hw_keysetmac(sc->sc_ah,
2622                                                   (u16)i,
2623                                                   sc->curbssid);
2624        }
2625
2626        /* Only legacy IBSS for now */
2627        if (vif->type == NL80211_IFTYPE_ADHOC)
2628                ath_update_chainmask(sc, 0);
2629
2630        if (changed & BSS_CHANGED_ERP_PREAMBLE) {
2631                DPRINTF(sc, ATH_DBG_CONFIG, "BSS Changed PREAMBLE %d\n",
2632                        bss_conf->use_short_preamble);
2633                if (bss_conf->use_short_preamble)
2634                        sc->sc_flags |= SC_OP_PREAMBLE_SHORT;
2635                else
2636                        sc->sc_flags &= ~SC_OP_PREAMBLE_SHORT;
2637        }
2638
2639        if (changed & BSS_CHANGED_ERP_CTS_PROT) {
2640                DPRINTF(sc, ATH_DBG_CONFIG, "BSS Changed CTS PROT %d\n",
2641                        bss_conf->use_cts_prot);
2642                if (bss_conf->use_cts_prot &&
2643                    hw->conf.channel->band != IEEE80211_BAND_5GHZ)
2644                        sc->sc_flags |= SC_OP_PROTECT_ENABLE;
2645                else
2646                        sc->sc_flags &= ~SC_OP_PROTECT_ENABLE;
2647        }
2648
2649        if (changed & BSS_CHANGED_ASSOC) {
2650                DPRINTF(sc, ATH_DBG_CONFIG, "BSS Changed ASSOC %d\n",
2651                        bss_conf->assoc);
2652                ath9k_bss_assoc_info(sc, vif, bss_conf);
2653        }
2654
2655        /*
2656         * The HW TSF has to be reset when the beacon interval changes.
2657         * We set the flag here, and ath_beacon_config_ap() would take this
2658         * into account when it gets called through the subsequent
2659         * config_interface() call - with IFCC_BEACON in the changed field.
2660         */
2661
2662        if (changed & BSS_CHANGED_BEACON_INT) {
2663                sc->sc_flags |= SC_OP_TSF_RESET;
2664                sc->beacon_interval = bss_conf->beacon_int;
2665        }
2666
2667        mutex_unlock(&sc->mutex);
2668}
2669
2670static u64 ath9k_get_tsf(struct ieee80211_hw *hw)
2671{
2672        u64 tsf;
2673        struct ath_wiphy *aphy = hw->priv;
2674        struct ath_softc *sc = aphy->sc;
2675
2676        mutex_lock(&sc->mutex);
2677        tsf = ath9k_hw_gettsf64(sc->sc_ah);
2678        mutex_unlock(&sc->mutex);
2679
2680        return tsf;
2681}
2682
2683static void ath9k_set_tsf(struct ieee80211_hw *hw, u64 tsf)
2684{
2685        struct ath_wiphy *aphy = hw->priv;
2686        struct ath_softc *sc = aphy->sc;
2687
2688        mutex_lock(&sc->mutex);
2689        ath9k_hw_settsf64(sc->sc_ah, tsf);
2690        mutex_unlock(&sc->mutex);
2691}
2692
2693static void ath9k_reset_tsf(struct ieee80211_hw *hw)
2694{
2695        struct ath_wiphy *aphy = hw->priv;
2696        struct ath_softc *sc = aphy->sc;
2697
2698        mutex_lock(&sc->mutex);
2699        ath9k_hw_reset_tsf(sc->sc_ah);
2700        mutex_unlock(&sc->mutex);
2701}
2702
2703static int ath9k_ampdu_action(struct ieee80211_hw *hw,
2704                              enum ieee80211_ampdu_mlme_action action,
2705                              struct ieee80211_sta *sta,
2706                              u16 tid, u16 *ssn)
2707{
2708        struct ath_wiphy *aphy = hw->priv;
2709        struct ath_softc *sc = aphy->sc;
2710        int ret = 0;
2711
2712        switch (action) {
2713        case IEEE80211_AMPDU_RX_START:
2714                if (!(sc->sc_flags & SC_OP_RXAGGR))
2715                        ret = -ENOTSUPP;
2716                break;
2717        case IEEE80211_AMPDU_RX_STOP:
2718                break;
2719        case IEEE80211_AMPDU_TX_START:
2720                ath_tx_aggr_start(sc, sta, tid, ssn);
2721                ieee80211_start_tx_ba_cb_irqsafe(hw, sta->addr, tid);
2722                break;
2723        case IEEE80211_AMPDU_TX_STOP:
2724                ath_tx_aggr_stop(sc, sta, tid);
2725                ieee80211_stop_tx_ba_cb_irqsafe(hw, sta->addr, tid);
2726                break;
2727        case IEEE80211_AMPDU_TX_OPERATIONAL:
2728                ath_tx_aggr_resume(sc, sta, tid);
2729                break;
2730        default:
2731                DPRINTF(sc, ATH_DBG_FATAL, "Unknown AMPDU action\n");
2732        }
2733
2734        return ret;
2735}
2736
2737static void ath9k_sw_scan_start(struct ieee80211_hw *hw)
2738{
2739        struct ath_wiphy *aphy = hw->priv;
2740        struct ath_softc *sc = aphy->sc;
2741
2742        mutex_lock(&sc->mutex);
2743        if (ath9k_wiphy_scanning(sc)) {
2744                printk(KERN_DEBUG "ath9k: Two wiphys trying to scan at the "
2745                       "same time\n");
2746                /*
2747                 * Do not allow the concurrent scanning state for now. This
2748                 * could be improved with scanning control moved into ath9k.
2749                 */
2750                mutex_unlock(&sc->mutex);
2751                return;
2752        }
2753
2754        aphy->state = ATH_WIPHY_SCAN;
2755        ath9k_wiphy_pause_all_forced(sc, aphy);
2756
2757        spin_lock_bh(&sc->ani_lock);
2758        sc->sc_flags |= SC_OP_SCANNING;
2759        spin_unlock_bh(&sc->ani_lock);
2760        mutex_unlock(&sc->mutex);
2761}
2762
2763static void ath9k_sw_scan_complete(struct ieee80211_hw *hw)
2764{
2765        struct ath_wiphy *aphy = hw->priv;
2766        struct ath_softc *sc = aphy->sc;
2767
2768        mutex_lock(&sc->mutex);
2769        spin_lock_bh(&sc->ani_lock);
2770        aphy->state = ATH_WIPHY_ACTIVE;
2771        sc->sc_flags &= ~SC_OP_SCANNING;
2772        sc->sc_flags |= SC_OP_FULL_RESET;
2773        spin_unlock_bh(&sc->ani_lock);
2774        ath_beacon_config(sc, NULL);
2775        mutex_unlock(&sc->mutex);
2776}
2777
2778struct ieee80211_ops ath9k_ops = {
2779        .tx                 = ath9k_tx,
2780        .start              = ath9k_start,
2781        .stop               = ath9k_stop,
2782        .add_interface      = ath9k_add_interface,
2783        .remove_interface   = ath9k_remove_interface,
2784        .config             = ath9k_config,
2785        .configure_filter   = ath9k_configure_filter,
2786        .sta_notify         = ath9k_sta_notify,
2787        .conf_tx            = ath9k_conf_tx,
2788        .bss_info_changed   = ath9k_bss_info_changed,
2789        .set_key            = ath9k_set_key,
2790        .get_tsf            = ath9k_get_tsf,
2791        .set_tsf            = ath9k_set_tsf,
2792        .reset_tsf          = ath9k_reset_tsf,
2793        .ampdu_action       = ath9k_ampdu_action,
2794        .sw_scan_start      = ath9k_sw_scan_start,
2795        .sw_scan_complete   = ath9k_sw_scan_complete,
2796        .rfkill_poll        = ath9k_rfkill_poll_state,
2797};
2798
2799static struct {
2800        u32 version;
2801        const char * name;
2802} ath_mac_bb_names[] = {
2803        { AR_SREV_VERSION_5416_PCI,     "5416" },
2804        { AR_SREV_VERSION_5416_PCIE,    "5418" },
2805        { AR_SREV_VERSION_9100,         "9100" },
2806        { AR_SREV_VERSION_9160,         "9160" },
2807        { AR_SREV_VERSION_9280,         "9280" },
2808        { AR_SREV_VERSION_9285,         "9285" },
2809        { AR_SREV_VERSION_9287,         "9287" }
2810};
2811
2812static struct {
2813        u16 version;
2814        const char * name;
2815} ath_rf_names[] = {
2816        { 0,                            "5133" },
2817        { AR_RAD5133_SREV_MAJOR,        "5133" },
2818        { AR_RAD5122_SREV_MAJOR,        "5122" },
2819        { AR_RAD2133_SREV_MAJOR,        "2133" },
2820        { AR_RAD2122_SREV_MAJOR,        "2122" }
2821};
2822
2823/*
2824 * Return the MAC/BB name. "????" is returned if the MAC/BB is unknown.
2825 */
2826const char *
2827ath_mac_bb_name(u32 mac_bb_version)
2828{
2829        int i;
2830
2831        for (i=0; i<ARRAY_SIZE(ath_mac_bb_names); i++) {
2832                if (ath_mac_bb_names[i].version == mac_bb_version) {
2833                        return ath_mac_bb_names[i].name;
2834                }
2835        }
2836
2837        return "????";
2838}
2839
2840/*
2841 * Return the RF name. "????" is returned if the RF is unknown.
2842 */
2843const char *
2844ath_rf_name(u16 rf_version)
2845{
2846        int i;
2847
2848        for (i=0; i<ARRAY_SIZE(ath_rf_names); i++) {
2849                if (ath_rf_names[i].version == rf_version) {
2850                        return ath_rf_names[i].name;
2851                }
2852        }
2853
2854        return "????";
2855}
2856
2857static int __init ath9k_init(void)
2858{
2859        int error;
2860
2861        /* Register rate control algorithm */
2862        error = ath_rate_control_register();
2863        if (error != 0) {
2864                printk(KERN_ERR
2865                        "ath9k: Unable to register rate control "
2866                        "algorithm: %d\n",
2867                        error);
2868                goto err_out;
2869        }
2870
2871        error = ath9k_debug_create_root();
2872        if (error) {
2873                printk(KERN_ERR
2874                        "ath9k: Unable to create debugfs root: %d\n",
2875                        error);
2876                goto err_rate_unregister;
2877        }
2878
2879        error = ath_pci_init();
2880        if (error < 0) {
2881                printk(KERN_ERR
2882                        "ath9k: No PCI devices found, driver not installed.\n");
2883                error = -ENODEV;
2884                goto err_remove_root;
2885        }
2886
2887        error = ath_ahb_init();
2888        if (error < 0) {
2889                error = -ENODEV;
2890                goto err_pci_exit;
2891        }
2892
2893        return 0;
2894
2895 err_pci_exit:
2896        ath_pci_exit();
2897
2898 err_remove_root:
2899        ath9k_debug_remove_root();
2900 err_rate_unregister:
2901        ath_rate_control_unregister();
2902 err_out:
2903        return error;
2904}
2905module_init(ath9k_init);
2906
2907static void __exit ath9k_exit(void)
2908{
2909        ath_ahb_exit();
2910        ath_pci_exit();
2911        ath9k_debug_remove_root();
2912        ath_rate_control_unregister();
2913        printk(KERN_INFO "%s: Driver unloaded\n", dev_info);
2914}
2915module_exit(ath9k_exit);
2916