linux/drivers/net/wireless/ath/ath9k/channel.c
<<
>>
Prefs
   1/*
   2 * Copyright (c) 2014 Qualcomm Atheros, 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 "ath9k.h"
  18
  19/* Set/change channels.  If the channel is really being changed, it's done
  20 * by reseting the chip.  To accomplish this we must first cleanup any pending
  21 * DMA, then restart stuff.
  22 */
  23static int ath_set_channel(struct ath_softc *sc)
  24{
  25        struct ath_hw *ah = sc->sc_ah;
  26        struct ath_common *common = ath9k_hw_common(ah);
  27        struct ieee80211_hw *hw = sc->hw;
  28        struct ath9k_channel *hchan;
  29        struct cfg80211_chan_def *chandef = &sc->cur_chan->chandef;
  30        struct ieee80211_channel *chan = chandef->chan;
  31        int pos = chan->hw_value;
  32        unsigned long flags;
  33        int old_pos = -1;
  34        int r;
  35
  36        if (test_bit(ATH_OP_INVALID, &common->op_flags))
  37                return -EIO;
  38
  39        if (ah->curchan)
  40                old_pos = ah->curchan - &ah->channels[0];
  41
  42        ath_dbg(common, CONFIG, "Set channel: %d MHz width: %d\n",
  43                chan->center_freq, chandef->width);
  44
  45        /* update survey stats for the old channel before switching */
  46        spin_lock_irqsave(&common->cc_lock, flags);
  47        ath_update_survey_stats(sc);
  48        spin_unlock_irqrestore(&common->cc_lock, flags);
  49
  50        ath9k_cmn_get_channel(hw, ah, chandef);
  51
  52        /* If the operating channel changes, change the survey in-use flags
  53         * along with it.
  54         * Reset the survey data for the new channel, unless we're switching
  55         * back to the operating channel from an off-channel operation.
  56         */
  57        if (!sc->cur_chan->offchannel && sc->cur_survey != &sc->survey[pos]) {
  58                if (sc->cur_survey)
  59                        sc->cur_survey->filled &= ~SURVEY_INFO_IN_USE;
  60
  61                sc->cur_survey = &sc->survey[pos];
  62
  63                memset(sc->cur_survey, 0, sizeof(struct survey_info));
  64                sc->cur_survey->filled |= SURVEY_INFO_IN_USE;
  65        } else if (!(sc->survey[pos].filled & SURVEY_INFO_IN_USE)) {
  66                memset(&sc->survey[pos], 0, sizeof(struct survey_info));
  67        }
  68
  69        hchan = &sc->sc_ah->channels[pos];
  70        r = ath_reset(sc, hchan);
  71        if (r)
  72                return r;
  73
  74        /* The most recent snapshot of channel->noisefloor for the old
  75         * channel is only available after the hardware reset. Copy it to
  76         * the survey stats now.
  77         */
  78        if (old_pos >= 0)
  79                ath_update_survey_nf(sc, old_pos);
  80
  81        /* Enable radar pulse detection if on a DFS channel. Spectral
  82         * scanning and radar detection can not be used concurrently.
  83         */
  84        if (hw->conf.radar_enabled) {
  85                u32 rxfilter;
  86
  87                rxfilter = ath9k_hw_getrxfilter(ah);
  88                rxfilter |= ATH9K_RX_FILTER_PHYRADAR |
  89                                ATH9K_RX_FILTER_PHYERR;
  90                ath9k_hw_setrxfilter(ah, rxfilter);
  91                ath_dbg(common, DFS, "DFS enabled at freq %d\n",
  92                        chan->center_freq);
  93        } else {
  94                /* perform spectral scan if requested. */
  95                if (test_bit(ATH_OP_SCANNING, &common->op_flags) &&
  96                        sc->spec_priv.spectral_mode == SPECTRAL_CHANSCAN)
  97                        ath9k_cmn_spectral_scan_trigger(common, &sc->spec_priv);
  98        }
  99
 100        return 0;
 101}
 102
 103void ath_chanctx_init(struct ath_softc *sc)
 104{
 105        struct ath_chanctx *ctx;
 106        struct ath_common *common = ath9k_hw_common(sc->sc_ah);
 107        struct ieee80211_supported_band *sband;
 108        struct ieee80211_channel *chan;
 109        int i, j;
 110
 111        sband = &common->sbands[NL80211_BAND_2GHZ];
 112        if (!sband->n_channels)
 113                sband = &common->sbands[NL80211_BAND_5GHZ];
 114
 115        chan = &sband->channels[0];
 116        for (i = 0; i < ATH9K_NUM_CHANCTX; i++) {
 117                ctx = &sc->chanctx[i];
 118                cfg80211_chandef_create(&ctx->chandef, chan, NL80211_CHAN_HT20);
 119                INIT_LIST_HEAD(&ctx->vifs);
 120                ctx->txpower = ATH_TXPOWER_MAX;
 121                ctx->flush_timeout = HZ / 5; /* 200ms */
 122                for (j = 0; j < ARRAY_SIZE(ctx->acq); j++) {
 123                        INIT_LIST_HEAD(&ctx->acq[j].acq_new);
 124                        INIT_LIST_HEAD(&ctx->acq[j].acq_old);
 125                        spin_lock_init(&ctx->acq[j].lock);
 126                }
 127        }
 128}
 129
 130void ath_chanctx_set_channel(struct ath_softc *sc, struct ath_chanctx *ctx,
 131                             struct cfg80211_chan_def *chandef)
 132{
 133        struct ath_common *common = ath9k_hw_common(sc->sc_ah);
 134        bool cur_chan;
 135
 136        spin_lock_bh(&sc->chan_lock);
 137        if (chandef)
 138                memcpy(&ctx->chandef, chandef, sizeof(*chandef));
 139        cur_chan = sc->cur_chan == ctx;
 140        spin_unlock_bh(&sc->chan_lock);
 141
 142        if (!cur_chan) {
 143                ath_dbg(common, CHAN_CTX,
 144                        "Current context differs from the new context\n");
 145                return;
 146        }
 147
 148        ath_set_channel(sc);
 149}
 150
 151#ifdef CONFIG_ATH9K_CHANNEL_CONTEXT
 152
 153/*************/
 154/* Utilities */
 155/*************/
 156
 157struct ath_chanctx* ath_is_go_chanctx_present(struct ath_softc *sc)
 158{
 159        struct ath_chanctx *ctx;
 160        struct ath_vif *avp;
 161        struct ieee80211_vif *vif;
 162
 163        spin_lock_bh(&sc->chan_lock);
 164
 165        ath_for_each_chanctx(sc, ctx) {
 166                if (!ctx->active)
 167                        continue;
 168
 169                list_for_each_entry(avp, &ctx->vifs, list) {
 170                        vif = avp->vif;
 171
 172                        if (ieee80211_vif_type_p2p(vif) == NL80211_IFTYPE_P2P_GO) {
 173                                spin_unlock_bh(&sc->chan_lock);
 174                                return ctx;
 175                        }
 176                }
 177        }
 178
 179        spin_unlock_bh(&sc->chan_lock);
 180        return NULL;
 181}
 182
 183/**********************************************************/
 184/* Functions to handle the channel context state machine. */
 185/**********************************************************/
 186
 187static const char *offchannel_state_string(enum ath_offchannel_state state)
 188{
 189        switch (state) {
 190                case_rtn_string(ATH_OFFCHANNEL_IDLE);
 191                case_rtn_string(ATH_OFFCHANNEL_PROBE_SEND);
 192                case_rtn_string(ATH_OFFCHANNEL_PROBE_WAIT);
 193                case_rtn_string(ATH_OFFCHANNEL_SUSPEND);
 194                case_rtn_string(ATH_OFFCHANNEL_ROC_START);
 195                case_rtn_string(ATH_OFFCHANNEL_ROC_WAIT);
 196                case_rtn_string(ATH_OFFCHANNEL_ROC_DONE);
 197        default:
 198                return "unknown";
 199        }
 200}
 201
 202static const char *chanctx_event_string(enum ath_chanctx_event ev)
 203{
 204        switch (ev) {
 205                case_rtn_string(ATH_CHANCTX_EVENT_BEACON_PREPARE);
 206                case_rtn_string(ATH_CHANCTX_EVENT_BEACON_SENT);
 207                case_rtn_string(ATH_CHANCTX_EVENT_TSF_TIMER);
 208                case_rtn_string(ATH_CHANCTX_EVENT_BEACON_RECEIVED);
 209                case_rtn_string(ATH_CHANCTX_EVENT_AUTHORIZED);
 210                case_rtn_string(ATH_CHANCTX_EVENT_SWITCH);
 211                case_rtn_string(ATH_CHANCTX_EVENT_ASSIGN);
 212                case_rtn_string(ATH_CHANCTX_EVENT_UNASSIGN);
 213                case_rtn_string(ATH_CHANCTX_EVENT_CHANGE);
 214                case_rtn_string(ATH_CHANCTX_EVENT_ENABLE_MULTICHANNEL);
 215        default:
 216                return "unknown";
 217        }
 218}
 219
 220static const char *chanctx_state_string(enum ath_chanctx_state state)
 221{
 222        switch (state) {
 223                case_rtn_string(ATH_CHANCTX_STATE_IDLE);
 224                case_rtn_string(ATH_CHANCTX_STATE_WAIT_FOR_BEACON);
 225                case_rtn_string(ATH_CHANCTX_STATE_WAIT_FOR_TIMER);
 226                case_rtn_string(ATH_CHANCTX_STATE_SWITCH);
 227                case_rtn_string(ATH_CHANCTX_STATE_FORCE_ACTIVE);
 228        default:
 229                return "unknown";
 230        }
 231}
 232
 233static u32 chanctx_event_delta(struct ath_softc *sc)
 234{
 235        u64 ms;
 236        struct timespec64 ts, *old;
 237
 238        ktime_get_raw_ts64(&ts);
 239        old = &sc->last_event_time;
 240        ms = ts.tv_sec * 1000 + ts.tv_nsec / 1000000;
 241        ms -= old->tv_sec * 1000 + old->tv_nsec / 1000000;
 242        sc->last_event_time = ts;
 243
 244        return (u32)ms;
 245}
 246
 247void ath_chanctx_check_active(struct ath_softc *sc, struct ath_chanctx *ctx)
 248{
 249        struct ath_common *common = ath9k_hw_common(sc->sc_ah);
 250        struct ath_chanctx *ictx;
 251        struct ath_vif *avp;
 252        bool active = false;
 253        u8 n_active = 0;
 254
 255        if (!ctx)
 256                return;
 257
 258        if (ctx == &sc->offchannel.chan) {
 259                spin_lock_bh(&sc->chan_lock);
 260
 261                if (likely(sc->sched.channel_switch_time))
 262                        ctx->flush_timeout =
 263                                usecs_to_jiffies(sc->sched.channel_switch_time);
 264                else
 265                        ctx->flush_timeout =
 266                                msecs_to_jiffies(10);
 267
 268                spin_unlock_bh(&sc->chan_lock);
 269
 270                /*
 271                 * There is no need to iterate over the
 272                 * active/assigned channel contexts if
 273                 * the current context is offchannel.
 274                 */
 275                return;
 276        }
 277
 278        ictx = ctx;
 279
 280        list_for_each_entry(avp, &ctx->vifs, list) {
 281                struct ieee80211_vif *vif = avp->vif;
 282
 283                switch (vif->type) {
 284                case NL80211_IFTYPE_P2P_CLIENT:
 285                case NL80211_IFTYPE_STATION:
 286                        if (avp->assoc)
 287                                active = true;
 288                        break;
 289                default:
 290                        active = true;
 291                        break;
 292                }
 293        }
 294        ctx->active = active;
 295
 296        ath_for_each_chanctx(sc, ctx) {
 297                if (!ctx->assigned || list_empty(&ctx->vifs))
 298                        continue;
 299                n_active++;
 300        }
 301
 302        spin_lock_bh(&sc->chan_lock);
 303
 304        if (n_active <= 1) {
 305                ictx->flush_timeout = HZ / 5;
 306                clear_bit(ATH_OP_MULTI_CHANNEL, &common->op_flags);
 307                spin_unlock_bh(&sc->chan_lock);
 308                return;
 309        }
 310
 311        ictx->flush_timeout = usecs_to_jiffies(sc->sched.channel_switch_time);
 312
 313        if (test_and_set_bit(ATH_OP_MULTI_CHANNEL, &common->op_flags)) {
 314                spin_unlock_bh(&sc->chan_lock);
 315                return;
 316        }
 317
 318        spin_unlock_bh(&sc->chan_lock);
 319
 320        if (ath9k_is_chanctx_enabled()) {
 321                ath_chanctx_event(sc, NULL,
 322                                  ATH_CHANCTX_EVENT_ENABLE_MULTICHANNEL);
 323        }
 324}
 325
 326static struct ath_chanctx *
 327ath_chanctx_get_next(struct ath_softc *sc, struct ath_chanctx *ctx)
 328{
 329        int idx = ctx - &sc->chanctx[0];
 330
 331        return &sc->chanctx[!idx];
 332}
 333
 334static void ath_chanctx_adjust_tbtt_delta(struct ath_softc *sc)
 335{
 336        struct ath_chanctx *prev, *cur;
 337        struct timespec64 ts;
 338        u32 cur_tsf, prev_tsf, beacon_int;
 339        s32 offset;
 340
 341        beacon_int = TU_TO_USEC(sc->cur_chan->beacon.beacon_interval);
 342
 343        cur = sc->cur_chan;
 344        prev = ath_chanctx_get_next(sc, cur);
 345
 346        if (!prev->switch_after_beacon)
 347                return;
 348
 349        ktime_get_raw_ts64(&ts);
 350        cur_tsf = (u32) cur->tsf_val +
 351                  ath9k_hw_get_tsf_offset(&cur->tsf_ts, &ts);
 352
 353        prev_tsf = prev->last_beacon - (u32) prev->tsf_val + cur_tsf;
 354        prev_tsf -= ath9k_hw_get_tsf_offset(&prev->tsf_ts, &ts);
 355
 356        /* Adjust the TSF time of the AP chanctx to keep its beacons
 357         * at half beacon interval offset relative to the STA chanctx.
 358         */
 359        offset = cur_tsf - prev_tsf;
 360
 361        /* Ignore stale data or spurious timestamps */
 362        if (offset < 0 || offset > 3 * beacon_int)
 363                return;
 364
 365        offset = beacon_int / 2 - (offset % beacon_int);
 366        prev->tsf_val += offset;
 367}
 368
 369/* Configure the TSF based hardware timer for a channel switch.
 370 * Also set up backup software timer, in case the gen timer fails.
 371 * This could be caused by a hardware reset.
 372 */
 373static void ath_chanctx_setup_timer(struct ath_softc *sc, u32 tsf_time)
 374{
 375        struct ath_common *common = ath9k_hw_common(sc->sc_ah);
 376        struct ath_hw *ah = sc->sc_ah;
 377        unsigned long timeout;
 378
 379        ath9k_hw_gen_timer_start(ah, sc->p2p_ps_timer, tsf_time, 1000000);
 380        tsf_time -= ath9k_hw_gettsf32(ah);
 381        timeout = msecs_to_jiffies(tsf_time / 1000) + 1;
 382        mod_timer(&sc->sched.timer, jiffies + timeout);
 383
 384        ath_dbg(common, CHAN_CTX,
 385                "Setup chanctx timer with timeout: %d (%d) ms\n",
 386                tsf_time / 1000, jiffies_to_msecs(timeout));
 387}
 388
 389static void ath_chanctx_handle_bmiss(struct ath_softc *sc,
 390                                     struct ath_chanctx *ctx,
 391                                     struct ath_vif *avp)
 392{
 393        /*
 394         * Clear the extend_absence flag if it had been
 395         * set during the previous beacon transmission,
 396         * since we need to revert to the normal NoA
 397         * schedule.
 398         */
 399        if (ctx->active && sc->sched.extend_absence) {
 400                avp->noa_duration = 0;
 401                sc->sched.extend_absence = false;
 402        }
 403
 404        /* If at least two consecutive beacons were missed on the STA
 405         * chanctx, stay on the STA channel for one extra beacon period,
 406         * to resync the timer properly.
 407         */
 408        if (ctx->active && sc->sched.beacon_miss >= 2) {
 409                avp->noa_duration = 0;
 410                sc->sched.extend_absence = true;
 411        }
 412}
 413
 414static void ath_chanctx_offchannel_noa(struct ath_softc *sc,
 415                                       struct ath_chanctx *ctx,
 416                                       struct ath_vif *avp,
 417                                       u32 tsf_time)
 418{
 419        struct ath_common *common = ath9k_hw_common(sc->sc_ah);
 420
 421        avp->noa_index++;
 422        avp->offchannel_start = tsf_time;
 423        avp->offchannel_duration = sc->sched.offchannel_duration;
 424
 425        ath_dbg(common, CHAN_CTX,
 426                "offchannel noa_duration: %d, noa_start: %u, noa_index: %d\n",
 427                avp->offchannel_duration,
 428                avp->offchannel_start,
 429                avp->noa_index);
 430
 431        /*
 432         * When multiple contexts are active, the NoA
 433         * has to be recalculated and advertised after
 434         * an offchannel operation.
 435         */
 436        if (ctx->active && avp->noa_duration)
 437                avp->noa_duration = 0;
 438}
 439
 440static void ath_chanctx_set_periodic_noa(struct ath_softc *sc,
 441                                         struct ath_vif *avp,
 442                                         struct ath_beacon_config *cur_conf,
 443                                         u32 tsf_time,
 444                                         u32 beacon_int)
 445{
 446        struct ath_common *common = ath9k_hw_common(sc->sc_ah);
 447
 448        avp->noa_index++;
 449        avp->noa_start = tsf_time;
 450
 451        if (sc->sched.extend_absence)
 452                avp->noa_duration = (3 * beacon_int / 2) +
 453                        sc->sched.channel_switch_time;
 454        else
 455                avp->noa_duration =
 456                        TU_TO_USEC(cur_conf->beacon_interval) / 2 +
 457                        sc->sched.channel_switch_time;
 458
 459        if (test_bit(ATH_OP_SCANNING, &common->op_flags) ||
 460            sc->sched.extend_absence)
 461                avp->periodic_noa = false;
 462        else
 463                avp->periodic_noa = true;
 464
 465        ath_dbg(common, CHAN_CTX,
 466                "noa_duration: %d, noa_start: %u, noa_index: %d, periodic: %d\n",
 467                avp->noa_duration,
 468                avp->noa_start,
 469                avp->noa_index,
 470                avp->periodic_noa);
 471}
 472
 473static void ath_chanctx_set_oneshot_noa(struct ath_softc *sc,
 474                                        struct ath_vif *avp,
 475                                        u32 tsf_time,
 476                                        u32 duration)
 477{
 478        struct ath_common *common = ath9k_hw_common(sc->sc_ah);
 479
 480        avp->noa_index++;
 481        avp->noa_start = tsf_time;
 482        avp->periodic_noa = false;
 483        avp->oneshot_noa = true;
 484        avp->noa_duration = duration + sc->sched.channel_switch_time;
 485
 486        ath_dbg(common, CHAN_CTX,
 487                "oneshot noa_duration: %d, noa_start: %u, noa_index: %d, periodic: %d\n",
 488                avp->noa_duration,
 489                avp->noa_start,
 490                avp->noa_index,
 491                avp->periodic_noa);
 492}
 493
 494void ath_chanctx_event(struct ath_softc *sc, struct ieee80211_vif *vif,
 495                       enum ath_chanctx_event ev)
 496{
 497        struct ath_hw *ah = sc->sc_ah;
 498        struct ath_common *common = ath9k_hw_common(ah);
 499        struct ath_beacon_config *cur_conf;
 500        struct ath_vif *avp = NULL;
 501        struct ath_chanctx *ctx;
 502        u32 tsf_time;
 503        u32 beacon_int;
 504
 505        if (vif)
 506                avp = (struct ath_vif *) vif->drv_priv;
 507
 508        spin_lock_bh(&sc->chan_lock);
 509
 510        ath_dbg(common, CHAN_CTX, "cur_chan: %d MHz, event: %s, state: %s, delta: %u ms\n",
 511                sc->cur_chan->chandef.center_freq1,
 512                chanctx_event_string(ev),
 513                chanctx_state_string(sc->sched.state),
 514                chanctx_event_delta(sc));
 515
 516        switch (ev) {
 517        case ATH_CHANCTX_EVENT_BEACON_PREPARE:
 518                if (avp->offchannel_duration)
 519                        avp->offchannel_duration = 0;
 520
 521                if (avp->oneshot_noa) {
 522                        avp->noa_duration = 0;
 523                        avp->oneshot_noa = false;
 524
 525                        ath_dbg(common, CHAN_CTX,
 526                                "Clearing oneshot NoA\n");
 527                }
 528
 529                if (avp->chanctx != sc->cur_chan) {
 530                        ath_dbg(common, CHAN_CTX,
 531                                "Contexts differ, not preparing beacon\n");
 532                        break;
 533                }
 534
 535                if (sc->sched.offchannel_pending && !sc->sched.wait_switch) {
 536                        sc->sched.offchannel_pending = false;
 537                        sc->next_chan = &sc->offchannel.chan;
 538                        sc->sched.state = ATH_CHANCTX_STATE_WAIT_FOR_BEACON;
 539                        ath_dbg(common, CHAN_CTX,
 540                                "Setting offchannel_pending to false\n");
 541                }
 542
 543                ctx = ath_chanctx_get_next(sc, sc->cur_chan);
 544                if (ctx->active && sc->sched.state == ATH_CHANCTX_STATE_IDLE) {
 545                        sc->next_chan = ctx;
 546                        sc->sched.state = ATH_CHANCTX_STATE_WAIT_FOR_BEACON;
 547                        ath_dbg(common, CHAN_CTX,
 548                                "Set next context, move chanctx state to WAIT_FOR_BEACON\n");
 549                }
 550
 551                /* if the timer missed its window, use the next interval */
 552                if (sc->sched.state == ATH_CHANCTX_STATE_WAIT_FOR_TIMER) {
 553                        sc->sched.state = ATH_CHANCTX_STATE_WAIT_FOR_BEACON;
 554                        ath_dbg(common, CHAN_CTX,
 555                                "Move chanctx state from WAIT_FOR_TIMER to WAIT_FOR_BEACON\n");
 556                }
 557
 558                if (sc->sched.mgd_prepare_tx)
 559                        sc->sched.state = ATH_CHANCTX_STATE_WAIT_FOR_BEACON;
 560
 561                /*
 562                 * When a context becomes inactive, for example,
 563                 * disassociation of a station context, the NoA
 564                 * attribute needs to be removed from subsequent
 565                 * beacons.
 566                 */
 567                if (!ctx->active && avp->noa_duration &&
 568                    sc->sched.state != ATH_CHANCTX_STATE_WAIT_FOR_BEACON) {
 569                        avp->noa_duration = 0;
 570                        avp->periodic_noa = false;
 571
 572                        ath_dbg(common, CHAN_CTX,
 573                                "Clearing NoA schedule\n");
 574                }
 575
 576                if (sc->sched.state != ATH_CHANCTX_STATE_WAIT_FOR_BEACON)
 577                        break;
 578
 579                ath_dbg(common, CHAN_CTX, "Preparing beacon for vif: %pM\n", vif->addr);
 580
 581                sc->sched.beacon_pending = true;
 582                sc->sched.next_tbtt = REG_READ(ah, AR_NEXT_TBTT_TIMER);
 583
 584                cur_conf = &sc->cur_chan->beacon;
 585                beacon_int = TU_TO_USEC(cur_conf->beacon_interval);
 586
 587                /* defer channel switch by a quarter beacon interval */
 588                tsf_time = sc->sched.next_tbtt + beacon_int / 4;
 589                sc->sched.switch_start_time = tsf_time;
 590                sc->cur_chan->last_beacon = sc->sched.next_tbtt;
 591
 592                /*
 593                 * If an offchannel switch is scheduled to happen after
 594                 * a beacon transmission, update the NoA with one-shot
 595                 * values and increment the index.
 596                 */
 597                if (sc->next_chan == &sc->offchannel.chan) {
 598                        ath_chanctx_offchannel_noa(sc, ctx, avp, tsf_time);
 599                        break;
 600                }
 601
 602                ath_chanctx_handle_bmiss(sc, ctx, avp);
 603
 604                /*
 605                 * If a mgd_prepare_tx() has been called by mac80211,
 606                 * a one-shot NoA needs to be sent. This can happen
 607                 * with one or more active channel contexts - in both
 608                 * cases, a new NoA schedule has to be advertised.
 609                 */
 610                if (sc->sched.mgd_prepare_tx) {
 611                        ath_chanctx_set_oneshot_noa(sc, avp, tsf_time,
 612                                                    jiffies_to_usecs(HZ / 5));
 613                        break;
 614                }
 615
 616                /* Prevent wrap-around issues */
 617                if (avp->noa_duration && tsf_time - avp->noa_start > BIT(30))
 618                        avp->noa_duration = 0;
 619
 620                /*
 621                 * If multiple contexts are active, start periodic
 622                 * NoA and increment the index for the first
 623                 * announcement.
 624                 */
 625                if (ctx->active &&
 626                    (!avp->noa_duration || sc->sched.force_noa_update))
 627                        ath_chanctx_set_periodic_noa(sc, avp, cur_conf,
 628                                                     tsf_time, beacon_int);
 629
 630                if (ctx->active && sc->sched.force_noa_update)
 631                        sc->sched.force_noa_update = false;
 632
 633                break;
 634        case ATH_CHANCTX_EVENT_BEACON_SENT:
 635                if (!sc->sched.beacon_pending) {
 636                        ath_dbg(common, CHAN_CTX,
 637                                "No pending beacon\n");
 638                        break;
 639                }
 640
 641                sc->sched.beacon_pending = false;
 642
 643                if (sc->sched.mgd_prepare_tx) {
 644                        sc->sched.mgd_prepare_tx = false;
 645                        complete(&sc->go_beacon);
 646                        ath_dbg(common, CHAN_CTX,
 647                                "Beacon sent, complete go_beacon\n");
 648                        break;
 649                }
 650
 651                if (sc->sched.state != ATH_CHANCTX_STATE_WAIT_FOR_BEACON)
 652                        break;
 653
 654                ath_dbg(common, CHAN_CTX,
 655                        "Move chanctx state to WAIT_FOR_TIMER\n");
 656
 657                sc->sched.state = ATH_CHANCTX_STATE_WAIT_FOR_TIMER;
 658                ath_chanctx_setup_timer(sc, sc->sched.switch_start_time);
 659                break;
 660        case ATH_CHANCTX_EVENT_TSF_TIMER:
 661                if (sc->sched.state != ATH_CHANCTX_STATE_WAIT_FOR_TIMER)
 662                        break;
 663
 664                if (!sc->cur_chan->switch_after_beacon &&
 665                    sc->sched.beacon_pending)
 666                        sc->sched.beacon_miss++;
 667
 668                ath_dbg(common, CHAN_CTX,
 669                        "Move chanctx state to SWITCH\n");
 670
 671                sc->sched.state = ATH_CHANCTX_STATE_SWITCH;
 672                ieee80211_queue_work(sc->hw, &sc->chanctx_work);
 673                break;
 674        case ATH_CHANCTX_EVENT_BEACON_RECEIVED:
 675                if (!test_bit(ATH_OP_MULTI_CHANNEL, &common->op_flags) ||
 676                    sc->cur_chan == &sc->offchannel.chan)
 677                        break;
 678
 679                sc->sched.beacon_pending = false;
 680                sc->sched.beacon_miss = 0;
 681
 682                if (sc->sched.state == ATH_CHANCTX_STATE_FORCE_ACTIVE ||
 683                    !sc->sched.beacon_adjust ||
 684                    !sc->cur_chan->tsf_val)
 685                        break;
 686
 687                ath_chanctx_adjust_tbtt_delta(sc);
 688
 689                /* TSF time might have been updated by the incoming beacon,
 690                 * need update the channel switch timer to reflect the change.
 691                 */
 692                tsf_time = sc->sched.switch_start_time;
 693                tsf_time -= (u32) sc->cur_chan->tsf_val +
 694                        ath9k_hw_get_tsf_offset(&sc->cur_chan->tsf_ts, NULL);
 695                tsf_time += ath9k_hw_gettsf32(ah);
 696
 697                sc->sched.beacon_adjust = false;
 698                ath_chanctx_setup_timer(sc, tsf_time);
 699                break;
 700        case ATH_CHANCTX_EVENT_AUTHORIZED:
 701                if (sc->sched.state != ATH_CHANCTX_STATE_FORCE_ACTIVE ||
 702                    avp->chanctx != sc->cur_chan)
 703                        break;
 704
 705                ath_dbg(common, CHAN_CTX,
 706                        "Move chanctx state from FORCE_ACTIVE to IDLE\n");
 707
 708                sc->sched.state = ATH_CHANCTX_STATE_IDLE;
 709                fallthrough;
 710        case ATH_CHANCTX_EVENT_SWITCH:
 711                if (!test_bit(ATH_OP_MULTI_CHANNEL, &common->op_flags) ||
 712                    sc->sched.state == ATH_CHANCTX_STATE_FORCE_ACTIVE ||
 713                    sc->cur_chan->switch_after_beacon ||
 714                    sc->cur_chan == &sc->offchannel.chan)
 715                        break;
 716
 717                /* If this is a station chanctx, stay active for a half
 718                 * beacon period (minus channel switch time)
 719                 */
 720                sc->next_chan = ath_chanctx_get_next(sc, sc->cur_chan);
 721                cur_conf = &sc->cur_chan->beacon;
 722
 723                ath_dbg(common, CHAN_CTX,
 724                        "Move chanctx state to WAIT_FOR_TIMER (event SWITCH)\n");
 725
 726                sc->sched.state = ATH_CHANCTX_STATE_WAIT_FOR_TIMER;
 727                sc->sched.wait_switch = false;
 728
 729                tsf_time = TU_TO_USEC(cur_conf->beacon_interval) / 2;
 730
 731                if (sc->sched.extend_absence) {
 732                        sc->sched.beacon_miss = 0;
 733                        tsf_time *= 3;
 734                }
 735
 736                tsf_time -= sc->sched.channel_switch_time;
 737                tsf_time += ath9k_hw_gettsf32(sc->sc_ah);
 738                sc->sched.switch_start_time = tsf_time;
 739
 740                ath_chanctx_setup_timer(sc, tsf_time);
 741                sc->sched.beacon_pending = true;
 742                sc->sched.beacon_adjust = true;
 743                break;
 744        case ATH_CHANCTX_EVENT_ENABLE_MULTICHANNEL:
 745                if (sc->cur_chan == &sc->offchannel.chan ||
 746                    sc->cur_chan->switch_after_beacon)
 747                        break;
 748
 749                sc->next_chan = ath_chanctx_get_next(sc, sc->cur_chan);
 750                ieee80211_queue_work(sc->hw, &sc->chanctx_work);
 751                break;
 752        case ATH_CHANCTX_EVENT_UNASSIGN:
 753                if (sc->cur_chan->assigned) {
 754                        if (sc->next_chan && !sc->next_chan->assigned &&
 755                            sc->next_chan != &sc->offchannel.chan)
 756                                sc->sched.state = ATH_CHANCTX_STATE_IDLE;
 757                        break;
 758                }
 759
 760                ctx = ath_chanctx_get_next(sc, sc->cur_chan);
 761                sc->sched.state = ATH_CHANCTX_STATE_IDLE;
 762                if (!ctx->assigned)
 763                        break;
 764
 765                sc->next_chan = ctx;
 766                ieee80211_queue_work(sc->hw, &sc->chanctx_work);
 767                break;
 768        case ATH_CHANCTX_EVENT_ASSIGN:
 769                break;
 770        case ATH_CHANCTX_EVENT_CHANGE:
 771                break;
 772        }
 773
 774        spin_unlock_bh(&sc->chan_lock);
 775}
 776
 777void ath_chanctx_beacon_sent_ev(struct ath_softc *sc,
 778                                enum ath_chanctx_event ev)
 779{
 780        if (sc->sched.beacon_pending)
 781                ath_chanctx_event(sc, NULL, ev);
 782}
 783
 784void ath_chanctx_beacon_recv_ev(struct ath_softc *sc,
 785                                enum ath_chanctx_event ev)
 786{
 787        ath_chanctx_event(sc, NULL, ev);
 788}
 789
 790static int ath_scan_channel_duration(struct ath_softc *sc,
 791                                     struct ieee80211_channel *chan)
 792{
 793        struct cfg80211_scan_request *req = sc->offchannel.scan_req;
 794
 795        if (!req->n_ssids || (chan->flags & IEEE80211_CHAN_NO_IR))
 796                return (HZ / 9); /* ~110 ms */
 797
 798        return (HZ / 16); /* ~60 ms */
 799}
 800
 801static void ath_chanctx_switch(struct ath_softc *sc, struct ath_chanctx *ctx,
 802                               struct cfg80211_chan_def *chandef)
 803{
 804        struct ath_common *common = ath9k_hw_common(sc->sc_ah);
 805
 806        spin_lock_bh(&sc->chan_lock);
 807
 808        if (test_bit(ATH_OP_MULTI_CHANNEL, &common->op_flags) &&
 809            (sc->cur_chan != ctx) && (ctx == &sc->offchannel.chan)) {
 810                if (chandef)
 811                        ctx->chandef = *chandef;
 812
 813                sc->sched.offchannel_pending = true;
 814                sc->sched.wait_switch = true;
 815                sc->sched.offchannel_duration =
 816                        jiffies_to_usecs(sc->offchannel.duration) +
 817                        sc->sched.channel_switch_time;
 818
 819                spin_unlock_bh(&sc->chan_lock);
 820                ath_dbg(common, CHAN_CTX,
 821                        "Set offchannel_pending to true\n");
 822                return;
 823        }
 824
 825        sc->next_chan = ctx;
 826        if (chandef) {
 827                ctx->chandef = *chandef;
 828                ath_dbg(common, CHAN_CTX,
 829                        "Assigned next_chan to %d MHz\n", chandef->center_freq1);
 830        }
 831
 832        if (sc->next_chan == &sc->offchannel.chan) {
 833                sc->sched.offchannel_duration =
 834                        jiffies_to_usecs(sc->offchannel.duration) +
 835                        sc->sched.channel_switch_time;
 836
 837                if (chandef) {
 838                        ath_dbg(common, CHAN_CTX,
 839                                "Offchannel duration for chan %d MHz : %u\n",
 840                                chandef->center_freq1,
 841                                sc->sched.offchannel_duration);
 842                }
 843        }
 844        spin_unlock_bh(&sc->chan_lock);
 845        ieee80211_queue_work(sc->hw, &sc->chanctx_work);
 846}
 847
 848static void ath_chanctx_offchan_switch(struct ath_softc *sc,
 849                                       struct ieee80211_channel *chan)
 850{
 851        struct ath_common *common = ath9k_hw_common(sc->sc_ah);
 852        struct cfg80211_chan_def chandef;
 853
 854        cfg80211_chandef_create(&chandef, chan, NL80211_CHAN_NO_HT);
 855        ath_dbg(common, CHAN_CTX,
 856                "Channel definition created: %d MHz\n", chandef.center_freq1);
 857
 858        ath_chanctx_switch(sc, &sc->offchannel.chan, &chandef);
 859}
 860
 861static struct ath_chanctx *ath_chanctx_get_oper_chan(struct ath_softc *sc,
 862                                                     bool active)
 863{
 864        struct ath_chanctx *ctx;
 865
 866        ath_for_each_chanctx(sc, ctx) {
 867                if (!ctx->assigned || list_empty(&ctx->vifs))
 868                        continue;
 869                if (active && !ctx->active)
 870                        continue;
 871
 872                if (ctx->switch_after_beacon)
 873                        return ctx;
 874        }
 875
 876        return &sc->chanctx[0];
 877}
 878
 879static void
 880ath_scan_next_channel(struct ath_softc *sc)
 881{
 882        struct ath_common *common = ath9k_hw_common(sc->sc_ah);
 883        struct cfg80211_scan_request *req = sc->offchannel.scan_req;
 884        struct ieee80211_channel *chan;
 885
 886        if (sc->offchannel.scan_idx >= req->n_channels) {
 887                ath_dbg(common, CHAN_CTX,
 888                        "Moving offchannel state to ATH_OFFCHANNEL_IDLE, "
 889                        "scan_idx: %d, n_channels: %d\n",
 890                        sc->offchannel.scan_idx,
 891                        req->n_channels);
 892
 893                sc->offchannel.state = ATH_OFFCHANNEL_IDLE;
 894                ath_chanctx_switch(sc, ath_chanctx_get_oper_chan(sc, false),
 895                                   NULL);
 896                return;
 897        }
 898
 899        ath_dbg(common, CHAN_CTX,
 900                "Moving offchannel state to ATH_OFFCHANNEL_PROBE_SEND, scan_idx: %d\n",
 901                sc->offchannel.scan_idx);
 902
 903        chan = req->channels[sc->offchannel.scan_idx++];
 904        sc->offchannel.duration = ath_scan_channel_duration(sc, chan);
 905        sc->offchannel.state = ATH_OFFCHANNEL_PROBE_SEND;
 906
 907        ath_chanctx_offchan_switch(sc, chan);
 908}
 909
 910void ath_offchannel_next(struct ath_softc *sc)
 911{
 912        struct ieee80211_vif *vif;
 913
 914        if (sc->offchannel.scan_req) {
 915                vif = sc->offchannel.scan_vif;
 916                sc->offchannel.chan.txpower = vif->bss_conf.txpower;
 917                ath_scan_next_channel(sc);
 918        } else if (sc->offchannel.roc_vif) {
 919                vif = sc->offchannel.roc_vif;
 920                sc->offchannel.chan.txpower = vif->bss_conf.txpower;
 921                sc->offchannel.duration =
 922                        msecs_to_jiffies(sc->offchannel.roc_duration);
 923                sc->offchannel.state = ATH_OFFCHANNEL_ROC_START;
 924                ath_chanctx_offchan_switch(sc, sc->offchannel.roc_chan);
 925        } else {
 926                spin_lock_bh(&sc->chan_lock);
 927                sc->sched.offchannel_pending = false;
 928                sc->sched.wait_switch = false;
 929                spin_unlock_bh(&sc->chan_lock);
 930
 931                ath_chanctx_switch(sc, ath_chanctx_get_oper_chan(sc, false),
 932                                   NULL);
 933                sc->offchannel.state = ATH_OFFCHANNEL_IDLE;
 934                if (sc->ps_idle)
 935                        ath_cancel_work(sc);
 936        }
 937}
 938
 939void ath_roc_complete(struct ath_softc *sc, enum ath_roc_complete_reason reason)
 940{
 941        struct ath_common *common = ath9k_hw_common(sc->sc_ah);
 942
 943        sc->offchannel.roc_vif = NULL;
 944        sc->offchannel.roc_chan = NULL;
 945
 946        switch (reason) {
 947        case ATH_ROC_COMPLETE_ABORT:
 948                ath_dbg(common, CHAN_CTX, "RoC aborted\n");
 949                ieee80211_remain_on_channel_expired(sc->hw);
 950                break;
 951        case ATH_ROC_COMPLETE_EXPIRE:
 952                ath_dbg(common, CHAN_CTX, "RoC expired\n");
 953                ieee80211_remain_on_channel_expired(sc->hw);
 954                break;
 955        case ATH_ROC_COMPLETE_CANCEL:
 956                ath_dbg(common, CHAN_CTX, "RoC canceled\n");
 957                break;
 958        }
 959
 960        ath_offchannel_next(sc);
 961        ath9k_ps_restore(sc);
 962}
 963
 964void ath_scan_complete(struct ath_softc *sc, bool abort)
 965{
 966        struct ath_common *common = ath9k_hw_common(sc->sc_ah);
 967        struct cfg80211_scan_info info = {
 968                .aborted = abort,
 969        };
 970
 971        if (abort)
 972                ath_dbg(common, CHAN_CTX, "HW scan aborted\n");
 973        else
 974                ath_dbg(common, CHAN_CTX, "HW scan complete\n");
 975
 976        sc->offchannel.scan_req = NULL;
 977        sc->offchannel.scan_vif = NULL;
 978        sc->offchannel.state = ATH_OFFCHANNEL_IDLE;
 979        ieee80211_scan_completed(sc->hw, &info);
 980        clear_bit(ATH_OP_SCANNING, &common->op_flags);
 981        spin_lock_bh(&sc->chan_lock);
 982        if (test_bit(ATH_OP_MULTI_CHANNEL, &common->op_flags))
 983                sc->sched.force_noa_update = true;
 984        spin_unlock_bh(&sc->chan_lock);
 985        ath_offchannel_next(sc);
 986        ath9k_ps_restore(sc);
 987}
 988
 989static void ath_scan_send_probe(struct ath_softc *sc,
 990                                struct cfg80211_ssid *ssid)
 991{
 992        struct cfg80211_scan_request *req = sc->offchannel.scan_req;
 993        struct ieee80211_vif *vif = sc->offchannel.scan_vif;
 994        struct ath_tx_control txctl = {};
 995        struct sk_buff *skb;
 996        struct ieee80211_tx_info *info;
 997        int band = sc->offchannel.chan.chandef.chan->band;
 998
 999        skb = ieee80211_probereq_get(sc->hw, vif->addr,
1000                        ssid->ssid, ssid->ssid_len, req->ie_len);
1001        if (!skb)
1002                return;
1003
1004        info = IEEE80211_SKB_CB(skb);
1005        if (req->no_cck)
1006                info->flags |= IEEE80211_TX_CTL_NO_CCK_RATE;
1007
1008        if (req->ie_len)
1009                skb_put_data(skb, req->ie, req->ie_len);
1010
1011        skb_set_queue_mapping(skb, IEEE80211_AC_VO);
1012
1013        if (!ieee80211_tx_prepare_skb(sc->hw, vif, skb, band, NULL))
1014                goto error;
1015
1016        txctl.txq = sc->tx.txq_map[IEEE80211_AC_VO];
1017        if (ath_tx_start(sc->hw, skb, &txctl))
1018                goto error;
1019
1020        return;
1021
1022error:
1023        ieee80211_free_txskb(sc->hw, skb);
1024}
1025
1026static void ath_scan_channel_start(struct ath_softc *sc)
1027{
1028        struct ath_common *common = ath9k_hw_common(sc->sc_ah);
1029        struct cfg80211_scan_request *req = sc->offchannel.scan_req;
1030        int i;
1031
1032        if (!(sc->cur_chan->chandef.chan->flags & IEEE80211_CHAN_NO_IR) &&
1033            req->n_ssids) {
1034                for (i = 0; i < req->n_ssids; i++)
1035                        ath_scan_send_probe(sc, &req->ssids[i]);
1036
1037        }
1038
1039        ath_dbg(common, CHAN_CTX,
1040                "Moving offchannel state to ATH_OFFCHANNEL_PROBE_WAIT\n");
1041
1042        sc->offchannel.state = ATH_OFFCHANNEL_PROBE_WAIT;
1043        mod_timer(&sc->offchannel.timer, jiffies + sc->offchannel.duration);
1044}
1045
1046static void ath_chanctx_timer(struct timer_list *t)
1047{
1048        struct ath_softc *sc = from_timer(sc, t, sched.timer);
1049        struct ath_common *common = ath9k_hw_common(sc->sc_ah);
1050
1051        ath_dbg(common, CHAN_CTX,
1052                "Channel context timer invoked\n");
1053
1054        ath_chanctx_event(sc, NULL, ATH_CHANCTX_EVENT_TSF_TIMER);
1055}
1056
1057static void ath_offchannel_timer(struct timer_list *t)
1058{
1059        struct ath_softc *sc = from_timer(sc, t, offchannel.timer);
1060        struct ath_chanctx *ctx;
1061        struct ath_common *common = ath9k_hw_common(sc->sc_ah);
1062
1063        ath_dbg(common, CHAN_CTX, "%s: offchannel state: %s\n",
1064                __func__, offchannel_state_string(sc->offchannel.state));
1065
1066        switch (sc->offchannel.state) {
1067        case ATH_OFFCHANNEL_PROBE_WAIT:
1068                if (!sc->offchannel.scan_req)
1069                        return;
1070
1071                /* get first active channel context */
1072                ctx = ath_chanctx_get_oper_chan(sc, true);
1073                if (ctx->active) {
1074                        ath_dbg(common, CHAN_CTX,
1075                                "Switch to oper/active context, "
1076                                "move offchannel state to ATH_OFFCHANNEL_SUSPEND\n");
1077
1078                        sc->offchannel.state = ATH_OFFCHANNEL_SUSPEND;
1079                        ath_chanctx_switch(sc, ctx, NULL);
1080                        mod_timer(&sc->offchannel.timer, jiffies + HZ / 10);
1081                        break;
1082                }
1083                fallthrough;
1084        case ATH_OFFCHANNEL_SUSPEND:
1085                if (!sc->offchannel.scan_req)
1086                        return;
1087
1088                ath_scan_next_channel(sc);
1089                break;
1090        case ATH_OFFCHANNEL_ROC_START:
1091        case ATH_OFFCHANNEL_ROC_WAIT:
1092                sc->offchannel.state = ATH_OFFCHANNEL_ROC_DONE;
1093                ath_roc_complete(sc, ATH_ROC_COMPLETE_EXPIRE);
1094                break;
1095        default:
1096                break;
1097        }
1098}
1099
1100static bool
1101ath_chanctx_send_vif_ps_frame(struct ath_softc *sc, struct ath_vif *avp,
1102                              bool powersave)
1103{
1104        struct ieee80211_vif *vif = avp->vif;
1105        struct ieee80211_sta *sta = NULL;
1106        struct ieee80211_hdr_3addr *nullfunc;
1107        struct ath_tx_control txctl;
1108        struct sk_buff *skb;
1109        int band = sc->cur_chan->chandef.chan->band;
1110
1111        switch (vif->type) {
1112        case NL80211_IFTYPE_STATION:
1113                if (!avp->assoc)
1114                        return false;
1115
1116                skb = ieee80211_nullfunc_get(sc->hw, vif, false);
1117                if (!skb)
1118                        return false;
1119
1120                nullfunc = (struct ieee80211_hdr_3addr *) skb->data;
1121                if (powersave)
1122                        nullfunc->frame_control |=
1123                                cpu_to_le16(IEEE80211_FCTL_PM);
1124
1125                skb->priority = 7;
1126                skb_set_queue_mapping(skb, IEEE80211_AC_VO);
1127                if (!ieee80211_tx_prepare_skb(sc->hw, vif, skb, band, &sta)) {
1128                        dev_kfree_skb_any(skb);
1129                        return false;
1130                }
1131                break;
1132        default:
1133                return false;
1134        }
1135
1136        memset(&txctl, 0, sizeof(txctl));
1137        txctl.txq = sc->tx.txq_map[IEEE80211_AC_VO];
1138        txctl.sta = sta;
1139        if (ath_tx_start(sc->hw, skb, &txctl)) {
1140                ieee80211_free_txskb(sc->hw, skb);
1141                return false;
1142        }
1143
1144        return true;
1145}
1146
1147static bool
1148ath_chanctx_send_ps_frame(struct ath_softc *sc, bool powersave)
1149{
1150        struct ath_vif *avp;
1151        bool sent = false;
1152
1153        rcu_read_lock();
1154        list_for_each_entry(avp, &sc->cur_chan->vifs, list) {
1155                if (ath_chanctx_send_vif_ps_frame(sc, avp, powersave))
1156                        sent = true;
1157        }
1158        rcu_read_unlock();
1159
1160        return sent;
1161}
1162
1163static bool ath_chanctx_defer_switch(struct ath_softc *sc)
1164{
1165        struct ath_common *common = ath9k_hw_common(sc->sc_ah);
1166
1167        if (sc->cur_chan == &sc->offchannel.chan)
1168                return false;
1169
1170        switch (sc->sched.state) {
1171        case ATH_CHANCTX_STATE_SWITCH:
1172                return false;
1173        case ATH_CHANCTX_STATE_IDLE:
1174                if (!sc->cur_chan->switch_after_beacon)
1175                        return false;
1176
1177                ath_dbg(common, CHAN_CTX,
1178                        "Defer switch, set chanctx state to WAIT_FOR_BEACON\n");
1179
1180                sc->sched.state = ATH_CHANCTX_STATE_WAIT_FOR_BEACON;
1181                break;
1182        default:
1183                break;
1184        }
1185
1186        return true;
1187}
1188
1189static void ath_offchannel_channel_change(struct ath_softc *sc)
1190{
1191        struct ath_common *common = ath9k_hw_common(sc->sc_ah);
1192
1193        ath_dbg(common, CHAN_CTX, "%s: offchannel state: %s\n",
1194                __func__, offchannel_state_string(sc->offchannel.state));
1195
1196        switch (sc->offchannel.state) {
1197        case ATH_OFFCHANNEL_PROBE_SEND:
1198                if (!sc->offchannel.scan_req)
1199                        return;
1200
1201                if (sc->cur_chan->chandef.chan !=
1202                    sc->offchannel.chan.chandef.chan)
1203                        return;
1204
1205                ath_scan_channel_start(sc);
1206                break;
1207        case ATH_OFFCHANNEL_IDLE:
1208                if (!sc->offchannel.scan_req)
1209                        return;
1210
1211                ath_scan_complete(sc, false);
1212                break;
1213        case ATH_OFFCHANNEL_ROC_START:
1214                if (sc->cur_chan != &sc->offchannel.chan)
1215                        break;
1216
1217                sc->offchannel.state = ATH_OFFCHANNEL_ROC_WAIT;
1218                mod_timer(&sc->offchannel.timer,
1219                          jiffies + sc->offchannel.duration);
1220                ieee80211_ready_on_channel(sc->hw);
1221                break;
1222        case ATH_OFFCHANNEL_ROC_DONE:
1223                break;
1224        default:
1225                break;
1226        }
1227}
1228
1229void ath_chanctx_set_next(struct ath_softc *sc, bool force)
1230{
1231        struct ath_common *common = ath9k_hw_common(sc->sc_ah);
1232        struct ath_chanctx *old_ctx;
1233        struct timespec64 ts;
1234        bool measure_time = false;
1235        bool send_ps = false;
1236        bool queues_stopped = false;
1237
1238        spin_lock_bh(&sc->chan_lock);
1239        if (!sc->next_chan) {
1240                spin_unlock_bh(&sc->chan_lock);
1241                return;
1242        }
1243
1244        if (!force && ath_chanctx_defer_switch(sc)) {
1245                spin_unlock_bh(&sc->chan_lock);
1246                return;
1247        }
1248
1249        ath_dbg(common, CHAN_CTX,
1250                "%s: current: %d MHz, next: %d MHz\n",
1251                __func__,
1252                sc->cur_chan->chandef.center_freq1,
1253                sc->next_chan->chandef.center_freq1);
1254
1255        if (sc->cur_chan != sc->next_chan) {
1256                ath_dbg(common, CHAN_CTX,
1257                        "Stopping current chanctx: %d\n",
1258                        sc->cur_chan->chandef.center_freq1);
1259                sc->cur_chan->stopped = true;
1260                spin_unlock_bh(&sc->chan_lock);
1261
1262                if (sc->next_chan == &sc->offchannel.chan) {
1263                        ktime_get_raw_ts64(&ts);
1264                        measure_time = true;
1265                }
1266
1267                ath9k_chanctx_stop_queues(sc, sc->cur_chan);
1268                queues_stopped = true;
1269
1270                __ath9k_flush(sc->hw, ~0, true, false, false);
1271
1272                if (ath_chanctx_send_ps_frame(sc, true))
1273                        __ath9k_flush(sc->hw, BIT(IEEE80211_AC_VO),
1274                                      false, false, false);
1275
1276                send_ps = true;
1277                spin_lock_bh(&sc->chan_lock);
1278
1279                if (sc->cur_chan != &sc->offchannel.chan) {
1280                        ktime_get_raw_ts64(&sc->cur_chan->tsf_ts);
1281                        sc->cur_chan->tsf_val = ath9k_hw_gettsf64(sc->sc_ah);
1282                }
1283        }
1284        old_ctx = sc->cur_chan;
1285        sc->cur_chan = sc->next_chan;
1286        sc->cur_chan->stopped = false;
1287        sc->next_chan = NULL;
1288
1289        if (!sc->sched.offchannel_pending)
1290                sc->sched.offchannel_duration = 0;
1291
1292        if (sc->sched.state != ATH_CHANCTX_STATE_FORCE_ACTIVE)
1293                sc->sched.state = ATH_CHANCTX_STATE_IDLE;
1294
1295        spin_unlock_bh(&sc->chan_lock);
1296
1297        if (sc->sc_ah->chip_fullsleep ||
1298            memcmp(&sc->cur_chandef, &sc->cur_chan->chandef,
1299                   sizeof(sc->cur_chandef))) {
1300                ath_dbg(common, CHAN_CTX,
1301                        "%s: Set channel %d MHz\n",
1302                        __func__, sc->cur_chan->chandef.center_freq1);
1303                ath_set_channel(sc);
1304                if (measure_time)
1305                        sc->sched.channel_switch_time =
1306                                ath9k_hw_get_tsf_offset(&ts, NULL);
1307                /*
1308                 * A reset will ensure that all queues are woken up,
1309                 * so there is no need to awaken them again.
1310                 */
1311                goto out;
1312        }
1313
1314        if (queues_stopped)
1315                ath9k_chanctx_wake_queues(sc, old_ctx);
1316out:
1317        if (send_ps)
1318                ath_chanctx_send_ps_frame(sc, false);
1319
1320        ath_offchannel_channel_change(sc);
1321        ath_chanctx_event(sc, NULL, ATH_CHANCTX_EVENT_SWITCH);
1322}
1323
1324static void ath_chanctx_work(struct work_struct *work)
1325{
1326        struct ath_softc *sc = container_of(work, struct ath_softc,
1327                                            chanctx_work);
1328        mutex_lock(&sc->mutex);
1329        ath_chanctx_set_next(sc, false);
1330        mutex_unlock(&sc->mutex);
1331}
1332
1333void ath9k_offchannel_init(struct ath_softc *sc)
1334{
1335        struct ath_chanctx *ctx;
1336        struct ath_common *common = ath9k_hw_common(sc->sc_ah);
1337        struct ieee80211_supported_band *sband;
1338        struct ieee80211_channel *chan;
1339        int i;
1340
1341        sband = &common->sbands[NL80211_BAND_2GHZ];
1342        if (!sband->n_channels)
1343                sband = &common->sbands[NL80211_BAND_5GHZ];
1344
1345        chan = &sband->channels[0];
1346
1347        ctx = &sc->offchannel.chan;
1348        INIT_LIST_HEAD(&ctx->vifs);
1349        ctx->txpower = ATH_TXPOWER_MAX;
1350        cfg80211_chandef_create(&ctx->chandef, chan, NL80211_CHAN_HT20);
1351
1352        for (i = 0; i < ARRAY_SIZE(ctx->acq); i++) {
1353                INIT_LIST_HEAD(&ctx->acq[i].acq_new);
1354                INIT_LIST_HEAD(&ctx->acq[i].acq_old);
1355                spin_lock_init(&ctx->acq[i].lock);
1356        }
1357
1358        sc->offchannel.chan.offchannel = true;
1359}
1360
1361void ath9k_init_channel_context(struct ath_softc *sc)
1362{
1363        INIT_WORK(&sc->chanctx_work, ath_chanctx_work);
1364
1365        timer_setup(&sc->offchannel.timer, ath_offchannel_timer, 0);
1366        timer_setup(&sc->sched.timer, ath_chanctx_timer, 0);
1367
1368        init_completion(&sc->go_beacon);
1369}
1370
1371void ath9k_deinit_channel_context(struct ath_softc *sc)
1372{
1373        cancel_work_sync(&sc->chanctx_work);
1374}
1375
1376bool ath9k_is_chanctx_enabled(void)
1377{
1378        return (ath9k_use_chanctx == 1);
1379}
1380
1381/********************/
1382/* Queue management */
1383/********************/
1384
1385void ath9k_chanctx_stop_queues(struct ath_softc *sc, struct ath_chanctx *ctx)
1386{
1387        struct ath_hw *ah = sc->sc_ah;
1388        int i;
1389
1390        if (ctx == &sc->offchannel.chan) {
1391                ieee80211_stop_queue(sc->hw,
1392                                     sc->hw->offchannel_tx_hw_queue);
1393        } else {
1394                for (i = 0; i < IEEE80211_NUM_ACS; i++)
1395                        ieee80211_stop_queue(sc->hw,
1396                                             ctx->hw_queue_base + i);
1397        }
1398
1399        if (ah->opmode == NL80211_IFTYPE_AP)
1400                ieee80211_stop_queue(sc->hw, sc->hw->queues - 2);
1401}
1402
1403
1404void ath9k_chanctx_wake_queues(struct ath_softc *sc, struct ath_chanctx *ctx)
1405{
1406        struct ath_hw *ah = sc->sc_ah;
1407        int i;
1408
1409        if (ctx == &sc->offchannel.chan) {
1410                ieee80211_wake_queue(sc->hw,
1411                                     sc->hw->offchannel_tx_hw_queue);
1412        } else {
1413                for (i = 0; i < IEEE80211_NUM_ACS; i++)
1414                        ieee80211_wake_queue(sc->hw,
1415                                             ctx->hw_queue_base + i);
1416        }
1417
1418        if (ah->opmode == NL80211_IFTYPE_AP)
1419                ieee80211_wake_queue(sc->hw, sc->hw->queues - 2);
1420}
1421
1422/*****************/
1423/* P2P Powersave */
1424/*****************/
1425
1426static void ath9k_update_p2p_ps_timer(struct ath_softc *sc, struct ath_vif *avp)
1427{
1428        struct ath_common *common = ath9k_hw_common(sc->sc_ah);
1429        struct ath_hw *ah = sc->sc_ah;
1430        u32 tsf, target_tsf;
1431
1432        if (!avp || !avp->noa.has_next_tsf)
1433                return;
1434
1435        ath9k_hw_gen_timer_stop(ah, sc->p2p_ps_timer);
1436
1437        tsf = ath9k_hw_gettsf32(sc->sc_ah);
1438
1439        target_tsf = avp->noa.next_tsf;
1440        if (!avp->noa.absent)
1441                target_tsf -= ATH_P2P_PS_STOP_TIME;
1442        else
1443                target_tsf += ATH_P2P_PS_STOP_TIME;
1444
1445        if (target_tsf - tsf < ATH_P2P_PS_STOP_TIME)
1446                target_tsf = tsf + ATH_P2P_PS_STOP_TIME;
1447
1448        ath_dbg(common, CHAN_CTX, "%s absent %d tsf 0x%08X next_tsf 0x%08X (%dms)\n",
1449                __func__, avp->noa.absent, tsf, target_tsf,
1450                (target_tsf - tsf) / 1000);
1451
1452        ath9k_hw_gen_timer_start(ah, sc->p2p_ps_timer, target_tsf, 1000000);
1453}
1454
1455static void ath9k_update_p2p_ps(struct ath_softc *sc, struct ieee80211_vif *vif)
1456{
1457        struct ath_vif *avp = (void *)vif->drv_priv;
1458        u32 tsf;
1459
1460        if (!sc->p2p_ps_timer)
1461                return;
1462
1463        if (vif->type != NL80211_IFTYPE_STATION)
1464                return;
1465
1466        sc->p2p_ps_vif = avp;
1467
1468        if (sc->ps_flags & PS_BEACON_SYNC)
1469                return;
1470
1471        tsf = ath9k_hw_gettsf32(sc->sc_ah);
1472        ieee80211_parse_p2p_noa(&vif->bss_conf.p2p_noa_attr, &avp->noa, tsf);
1473        ath9k_update_p2p_ps_timer(sc, avp);
1474}
1475
1476static u8 ath9k_get_ctwin(struct ath_softc *sc, struct ath_vif *avp)
1477{
1478        struct ath_beacon_config *cur_conf = &sc->cur_chan->beacon;
1479        u8 switch_time, ctwin;
1480
1481        /*
1482         * Channel switch in multi-channel mode is deferred
1483         * by a quarter beacon interval when handling
1484         * ATH_CHANCTX_EVENT_BEACON_PREPARE, so the P2P-GO
1485         * interface is guaranteed to be discoverable
1486         * for that duration after a TBTT.
1487         */
1488        switch_time = cur_conf->beacon_interval / 4;
1489
1490        ctwin = avp->vif->bss_conf.p2p_noa_attr.oppps_ctwindow;
1491        if (ctwin && (ctwin < switch_time))
1492                return ctwin;
1493
1494        if (switch_time < P2P_DEFAULT_CTWIN)
1495                return 0;
1496
1497        return P2P_DEFAULT_CTWIN;
1498}
1499
1500void ath9k_beacon_add_noa(struct ath_softc *sc, struct ath_vif *avp,
1501                          struct sk_buff *skb)
1502{
1503        static const u8 noa_ie_hdr[] = {
1504                WLAN_EID_VENDOR_SPECIFIC,       /* type */
1505                0,                              /* length */
1506                0x50, 0x6f, 0x9a,               /* WFA OUI */
1507                0x09,                           /* P2P subtype */
1508                0x0c,                           /* Notice of Absence */
1509                0x00,                           /* LSB of little-endian len */
1510                0x00,                           /* MSB of little-endian len */
1511        };
1512
1513        struct ieee80211_p2p_noa_attr *noa;
1514        int noa_len, noa_desc, i = 0;
1515        u8 *hdr;
1516
1517        if (!avp->offchannel_duration && !avp->noa_duration)
1518                return;
1519
1520        noa_desc = !!avp->offchannel_duration + !!avp->noa_duration;
1521        noa_len = 2 + sizeof(struct ieee80211_p2p_noa_desc) * noa_desc;
1522
1523        hdr = skb_put_data(skb, noa_ie_hdr, sizeof(noa_ie_hdr));
1524        hdr[1] = sizeof(noa_ie_hdr) + noa_len - 2;
1525        hdr[7] = noa_len;
1526
1527        noa = skb_put_zero(skb, noa_len);
1528
1529        noa->index = avp->noa_index;
1530        noa->oppps_ctwindow = ath9k_get_ctwin(sc, avp);
1531        if (noa->oppps_ctwindow)
1532                noa->oppps_ctwindow |= BIT(7);
1533
1534        if (avp->noa_duration) {
1535                if (avp->periodic_noa) {
1536                        u32 interval = TU_TO_USEC(sc->cur_chan->beacon.beacon_interval);
1537                        noa->desc[i].count = 255;
1538                        noa->desc[i].interval = cpu_to_le32(interval);
1539                } else {
1540                        noa->desc[i].count = 1;
1541                }
1542
1543                noa->desc[i].start_time = cpu_to_le32(avp->noa_start);
1544                noa->desc[i].duration = cpu_to_le32(avp->noa_duration);
1545                i++;
1546        }
1547
1548        if (avp->offchannel_duration) {
1549                noa->desc[i].count = 1;
1550                noa->desc[i].start_time = cpu_to_le32(avp->offchannel_start);
1551                noa->desc[i].duration = cpu_to_le32(avp->offchannel_duration);
1552        }
1553}
1554
1555void ath9k_p2p_ps_timer(void *priv)
1556{
1557        struct ath_softc *sc = priv;
1558        struct ath_vif *avp = sc->p2p_ps_vif;
1559        struct ieee80211_vif *vif;
1560        struct ieee80211_sta *sta;
1561        struct ath_node *an;
1562        u32 tsf;
1563
1564        del_timer_sync(&sc->sched.timer);
1565        ath9k_hw_gen_timer_stop(sc->sc_ah, sc->p2p_ps_timer);
1566        ath_chanctx_event(sc, NULL, ATH_CHANCTX_EVENT_TSF_TIMER);
1567
1568        if (!avp || avp->chanctx != sc->cur_chan)
1569                return;
1570
1571        tsf = ath9k_hw_gettsf32(sc->sc_ah);
1572        if (!avp->noa.absent)
1573                tsf += ATH_P2P_PS_STOP_TIME;
1574        else
1575                tsf -= ATH_P2P_PS_STOP_TIME;
1576
1577        if (!avp->noa.has_next_tsf ||
1578            avp->noa.next_tsf - tsf > BIT(31))
1579                ieee80211_update_p2p_noa(&avp->noa, tsf);
1580
1581        ath9k_update_p2p_ps_timer(sc, avp);
1582
1583        rcu_read_lock();
1584
1585        vif = avp->vif;
1586        sta = ieee80211_find_sta(vif, avp->bssid);
1587        if (!sta)
1588                goto out;
1589
1590        an = (void *) sta->drv_priv;
1591        if (an->sleeping == !!avp->noa.absent)
1592                goto out;
1593
1594        an->sleeping = avp->noa.absent;
1595        if (an->sleeping)
1596                ath_tx_aggr_sleep(sta, sc, an);
1597        else
1598                ath_tx_aggr_wakeup(sc, an);
1599
1600out:
1601        rcu_read_unlock();
1602}
1603
1604void ath9k_p2p_bss_info_changed(struct ath_softc *sc,
1605                                struct ieee80211_vif *vif)
1606{
1607        unsigned long flags;
1608
1609        spin_lock_bh(&sc->sc_pcu_lock);
1610        spin_lock_irqsave(&sc->sc_pm_lock, flags);
1611        ath9k_update_p2p_ps(sc, vif);
1612        spin_unlock_irqrestore(&sc->sc_pm_lock, flags);
1613        spin_unlock_bh(&sc->sc_pcu_lock);
1614}
1615
1616void ath9k_p2p_beacon_sync(struct ath_softc *sc)
1617{
1618        if (sc->p2p_ps_vif)
1619                ath9k_update_p2p_ps(sc, sc->p2p_ps_vif->vif);
1620}
1621
1622void ath9k_p2p_remove_vif(struct ath_softc *sc,
1623                          struct ieee80211_vif *vif)
1624{
1625        struct ath_vif *avp = (void *)vif->drv_priv;
1626
1627        spin_lock_bh(&sc->sc_pcu_lock);
1628        if (avp == sc->p2p_ps_vif) {
1629                sc->p2p_ps_vif = NULL;
1630                ath9k_update_p2p_ps_timer(sc, NULL);
1631        }
1632        spin_unlock_bh(&sc->sc_pcu_lock);
1633}
1634
1635int ath9k_init_p2p(struct ath_softc *sc)
1636{
1637        sc->p2p_ps_timer = ath_gen_timer_alloc(sc->sc_ah, ath9k_p2p_ps_timer,
1638                                               NULL, sc, AR_FIRST_NDP_TIMER);
1639        if (!sc->p2p_ps_timer)
1640                return -ENOMEM;
1641
1642        return 0;
1643}
1644
1645void ath9k_deinit_p2p(struct ath_softc *sc)
1646{
1647        if (sc->p2p_ps_timer)
1648                ath_gen_timer_free(sc->sc_ah, sc->p2p_ps_timer);
1649}
1650
1651#endif /* CONFIG_ATH9K_CHANNEL_CONTEXT */
1652