linux/net/mac80211/util.c
<<
>>
Prefs
   1/*
   2 * Copyright 2002-2005, Instant802 Networks, Inc.
   3 * Copyright 2005-2006, Devicescape Software, Inc.
   4 * Copyright 2006-2007  Jiri Benc <jbenc@suse.cz>
   5 * Copyright 2007       Johannes Berg <johannes@sipsolutions.net>
   6 * Copyright 2013-2014  Intel Mobile Communications GmbH
   7 * Copyright (C) 2015-2017      Intel Deutschland GmbH
   8 * Copyright (C) 2018 Intel Corporation
   9 *
  10 * This program is free software; you can redistribute it and/or modify
  11 * it under the terms of the GNU General Public License version 2 as
  12 * published by the Free Software Foundation.
  13 *
  14 * utilities for mac80211
  15 */
  16
  17#include <net/mac80211.h>
  18#include <linux/netdevice.h>
  19#include <linux/export.h>
  20#include <linux/types.h>
  21#include <linux/slab.h>
  22#include <linux/skbuff.h>
  23#include <linux/etherdevice.h>
  24#include <linux/if_arp.h>
  25#include <linux/bitmap.h>
  26#include <linux/crc32.h>
  27#include <net/net_namespace.h>
  28#include <net/cfg80211.h>
  29#include <net/rtnetlink.h>
  30
  31#include "ieee80211_i.h"
  32#include "driver-ops.h"
  33#include "rate.h"
  34#include "mesh.h"
  35#include "wme.h"
  36#include "led.h"
  37#include "wep.h"
  38
  39/* privid for wiphys to determine whether they belong to us or not */
  40const void *const mac80211_wiphy_privid = &mac80211_wiphy_privid;
  41
  42struct ieee80211_hw *wiphy_to_ieee80211_hw(struct wiphy *wiphy)
  43{
  44        struct ieee80211_local *local;
  45        BUG_ON(!wiphy);
  46
  47        local = wiphy_priv(wiphy);
  48        return &local->hw;
  49}
  50EXPORT_SYMBOL(wiphy_to_ieee80211_hw);
  51
  52void ieee80211_tx_set_protected(struct ieee80211_tx_data *tx)
  53{
  54        struct sk_buff *skb;
  55        struct ieee80211_hdr *hdr;
  56
  57        skb_queue_walk(&tx->skbs, skb) {
  58                hdr = (struct ieee80211_hdr *) skb->data;
  59                hdr->frame_control |= cpu_to_le16(IEEE80211_FCTL_PROTECTED);
  60        }
  61}
  62
  63int ieee80211_frame_duration(enum nl80211_band band, size_t len,
  64                             int rate, int erp, int short_preamble,
  65                             int shift)
  66{
  67        int dur;
  68
  69        /* calculate duration (in microseconds, rounded up to next higher
  70         * integer if it includes a fractional microsecond) to send frame of
  71         * len bytes (does not include FCS) at the given rate. Duration will
  72         * also include SIFS.
  73         *
  74         * rate is in 100 kbps, so divident is multiplied by 10 in the
  75         * DIV_ROUND_UP() operations.
  76         *
  77         * shift may be 2 for 5 MHz channels or 1 for 10 MHz channels, and
  78         * is assumed to be 0 otherwise.
  79         */
  80
  81        if (band == NL80211_BAND_5GHZ || erp) {
  82                /*
  83                 * OFDM:
  84                 *
  85                 * N_DBPS = DATARATE x 4
  86                 * N_SYM = Ceiling((16+8xLENGTH+6) / N_DBPS)
  87                 *      (16 = SIGNAL time, 6 = tail bits)
  88                 * TXTIME = T_PREAMBLE + T_SIGNAL + T_SYM x N_SYM + Signal Ext
  89                 *
  90                 * T_SYM = 4 usec
  91                 * 802.11a - 18.5.2: aSIFSTime = 16 usec
  92                 * 802.11g - 19.8.4: aSIFSTime = 10 usec +
  93                 *      signal ext = 6 usec
  94                 */
  95                dur = 16; /* SIFS + signal ext */
  96                dur += 16; /* IEEE 802.11-2012 18.3.2.4: T_PREAMBLE = 16 usec */
  97                dur += 4; /* IEEE 802.11-2012 18.3.2.4: T_SIGNAL = 4 usec */
  98
  99                /* IEEE 802.11-2012 18.3.2.4: all values above are:
 100                 *  * times 4 for 5 MHz
 101                 *  * times 2 for 10 MHz
 102                 */
 103                dur *= 1 << shift;
 104
 105                /* rates should already consider the channel bandwidth,
 106                 * don't apply divisor again.
 107                 */
 108                dur += 4 * DIV_ROUND_UP((16 + 8 * (len + 4) + 6) * 10,
 109                                        4 * rate); /* T_SYM x N_SYM */
 110        } else {
 111                /*
 112                 * 802.11b or 802.11g with 802.11b compatibility:
 113                 * 18.3.4: TXTIME = PreambleLength + PLCPHeaderTime +
 114                 * Ceiling(((LENGTH+PBCC)x8)/DATARATE). PBCC=0.
 115                 *
 116                 * 802.11 (DS): 15.3.3, 802.11b: 18.3.4
 117                 * aSIFSTime = 10 usec
 118                 * aPreambleLength = 144 usec or 72 usec with short preamble
 119                 * aPLCPHeaderLength = 48 usec or 24 usec with short preamble
 120                 */
 121                dur = 10; /* aSIFSTime = 10 usec */
 122                dur += short_preamble ? (72 + 24) : (144 + 48);
 123
 124                dur += DIV_ROUND_UP(8 * (len + 4) * 10, rate);
 125        }
 126
 127        return dur;
 128}
 129
 130/* Exported duration function for driver use */
 131__le16 ieee80211_generic_frame_duration(struct ieee80211_hw *hw,
 132                                        struct ieee80211_vif *vif,
 133                                        enum nl80211_band band,
 134                                        size_t frame_len,
 135                                        struct ieee80211_rate *rate)
 136{
 137        struct ieee80211_sub_if_data *sdata;
 138        u16 dur;
 139        int erp, shift = 0;
 140        bool short_preamble = false;
 141
 142        erp = 0;
 143        if (vif) {
 144                sdata = vif_to_sdata(vif);
 145                short_preamble = sdata->vif.bss_conf.use_short_preamble;
 146                if (sdata->flags & IEEE80211_SDATA_OPERATING_GMODE)
 147                        erp = rate->flags & IEEE80211_RATE_ERP_G;
 148                shift = ieee80211_vif_get_shift(vif);
 149        }
 150
 151        dur = ieee80211_frame_duration(band, frame_len, rate->bitrate, erp,
 152                                       short_preamble, shift);
 153
 154        return cpu_to_le16(dur);
 155}
 156EXPORT_SYMBOL(ieee80211_generic_frame_duration);
 157
 158__le16 ieee80211_rts_duration(struct ieee80211_hw *hw,
 159                              struct ieee80211_vif *vif, size_t frame_len,
 160                              const struct ieee80211_tx_info *frame_txctl)
 161{
 162        struct ieee80211_local *local = hw_to_local(hw);
 163        struct ieee80211_rate *rate;
 164        struct ieee80211_sub_if_data *sdata;
 165        bool short_preamble;
 166        int erp, shift = 0, bitrate;
 167        u16 dur;
 168        struct ieee80211_supported_band *sband;
 169
 170        sband = local->hw.wiphy->bands[frame_txctl->band];
 171
 172        short_preamble = false;
 173
 174        rate = &sband->bitrates[frame_txctl->control.rts_cts_rate_idx];
 175
 176        erp = 0;
 177        if (vif) {
 178                sdata = vif_to_sdata(vif);
 179                short_preamble = sdata->vif.bss_conf.use_short_preamble;
 180                if (sdata->flags & IEEE80211_SDATA_OPERATING_GMODE)
 181                        erp = rate->flags & IEEE80211_RATE_ERP_G;
 182                shift = ieee80211_vif_get_shift(vif);
 183        }
 184
 185        bitrate = DIV_ROUND_UP(rate->bitrate, 1 << shift);
 186
 187        /* CTS duration */
 188        dur = ieee80211_frame_duration(sband->band, 10, bitrate,
 189                                       erp, short_preamble, shift);
 190        /* Data frame duration */
 191        dur += ieee80211_frame_duration(sband->band, frame_len, bitrate,
 192                                        erp, short_preamble, shift);
 193        /* ACK duration */
 194        dur += ieee80211_frame_duration(sband->band, 10, bitrate,
 195                                        erp, short_preamble, shift);
 196
 197        return cpu_to_le16(dur);
 198}
 199EXPORT_SYMBOL(ieee80211_rts_duration);
 200
 201__le16 ieee80211_ctstoself_duration(struct ieee80211_hw *hw,
 202                                    struct ieee80211_vif *vif,
 203                                    size_t frame_len,
 204                                    const struct ieee80211_tx_info *frame_txctl)
 205{
 206        struct ieee80211_local *local = hw_to_local(hw);
 207        struct ieee80211_rate *rate;
 208        struct ieee80211_sub_if_data *sdata;
 209        bool short_preamble;
 210        int erp, shift = 0, bitrate;
 211        u16 dur;
 212        struct ieee80211_supported_band *sband;
 213
 214        sband = local->hw.wiphy->bands[frame_txctl->band];
 215
 216        short_preamble = false;
 217
 218        rate = &sband->bitrates[frame_txctl->control.rts_cts_rate_idx];
 219        erp = 0;
 220        if (vif) {
 221                sdata = vif_to_sdata(vif);
 222                short_preamble = sdata->vif.bss_conf.use_short_preamble;
 223                if (sdata->flags & IEEE80211_SDATA_OPERATING_GMODE)
 224                        erp = rate->flags & IEEE80211_RATE_ERP_G;
 225                shift = ieee80211_vif_get_shift(vif);
 226        }
 227
 228        bitrate = DIV_ROUND_UP(rate->bitrate, 1 << shift);
 229
 230        /* Data frame duration */
 231        dur = ieee80211_frame_duration(sband->band, frame_len, bitrate,
 232                                       erp, short_preamble, shift);
 233        if (!(frame_txctl->flags & IEEE80211_TX_CTL_NO_ACK)) {
 234                /* ACK duration */
 235                dur += ieee80211_frame_duration(sband->band, 10, bitrate,
 236                                                erp, short_preamble, shift);
 237        }
 238
 239        return cpu_to_le16(dur);
 240}
 241EXPORT_SYMBOL(ieee80211_ctstoself_duration);
 242
 243static void __ieee80211_wake_txqs(struct ieee80211_sub_if_data *sdata, int ac)
 244{
 245        struct ieee80211_local *local = sdata->local;
 246        struct ieee80211_vif *vif = &sdata->vif;
 247        struct fq *fq = &local->fq;
 248        struct ps_data *ps = NULL;
 249        struct txq_info *txqi;
 250        struct sta_info *sta;
 251        int i;
 252
 253        spin_lock_bh(&fq->lock);
 254
 255        if (sdata->vif.type == NL80211_IFTYPE_AP)
 256                ps = &sdata->bss->ps;
 257
 258        sdata->vif.txqs_stopped[ac] = false;
 259
 260        list_for_each_entry_rcu(sta, &local->sta_list, list) {
 261                if (sdata != sta->sdata)
 262                        continue;
 263
 264                for (i = 0; i < ARRAY_SIZE(sta->sta.txq); i++) {
 265                        struct ieee80211_txq *txq = sta->sta.txq[i];
 266
 267                        if (!txq)
 268                                continue;
 269
 270                        txqi = to_txq_info(txq);
 271
 272                        if (ac != txq->ac)
 273                                continue;
 274
 275                        if (!test_and_clear_bit(IEEE80211_TXQ_STOP_NETIF_TX,
 276                                                &txqi->flags))
 277                                continue;
 278
 279                        spin_unlock_bh(&fq->lock);
 280                        drv_wake_tx_queue(local, txqi);
 281                        spin_lock_bh(&fq->lock);
 282                }
 283        }
 284
 285        if (!vif->txq)
 286                goto out;
 287
 288        txqi = to_txq_info(vif->txq);
 289
 290        if (!test_and_clear_bit(IEEE80211_TXQ_STOP_NETIF_TX, &txqi->flags) ||
 291            (ps && atomic_read(&ps->num_sta_ps)) || ac != vif->txq->ac)
 292                goto out;
 293
 294        spin_unlock_bh(&fq->lock);
 295
 296        drv_wake_tx_queue(local, txqi);
 297        return;
 298out:
 299        spin_unlock_bh(&fq->lock);
 300}
 301
 302void ieee80211_wake_txqs(unsigned long data)
 303{
 304        struct ieee80211_local *local = (struct ieee80211_local *)data;
 305        struct ieee80211_sub_if_data *sdata;
 306        int n_acs = IEEE80211_NUM_ACS;
 307        unsigned long flags;
 308        int i;
 309
 310        rcu_read_lock();
 311        spin_lock_irqsave(&local->queue_stop_reason_lock, flags);
 312
 313        if (local->hw.queues < IEEE80211_NUM_ACS)
 314                n_acs = 1;
 315
 316        for (i = 0; i < local->hw.queues; i++) {
 317                if (local->queue_stop_reasons[i])
 318                        continue;
 319
 320                spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags);
 321                list_for_each_entry_rcu(sdata, &local->interfaces, list) {
 322                        int ac;
 323
 324                        for (ac = 0; ac < n_acs; ac++) {
 325                                int ac_queue = sdata->vif.hw_queue[ac];
 326
 327                                if (ac_queue == i ||
 328                                    sdata->vif.cab_queue == i)
 329                                        __ieee80211_wake_txqs(sdata, ac);
 330                        }
 331                }
 332                spin_lock_irqsave(&local->queue_stop_reason_lock, flags);
 333        }
 334
 335        spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags);
 336        rcu_read_unlock();
 337}
 338
 339void ieee80211_propagate_queue_wake(struct ieee80211_local *local, int queue)
 340{
 341        struct ieee80211_sub_if_data *sdata;
 342        int n_acs = IEEE80211_NUM_ACS;
 343
 344        if (local->ops->wake_tx_queue)
 345                return;
 346
 347        if (local->hw.queues < IEEE80211_NUM_ACS)
 348                n_acs = 1;
 349
 350        list_for_each_entry_rcu(sdata, &local->interfaces, list) {
 351                int ac;
 352
 353                if (!sdata->dev)
 354                        continue;
 355
 356                if (sdata->vif.cab_queue != IEEE80211_INVAL_HW_QUEUE &&
 357                    local->queue_stop_reasons[sdata->vif.cab_queue] != 0)
 358                        continue;
 359
 360                for (ac = 0; ac < n_acs; ac++) {
 361                        int ac_queue = sdata->vif.hw_queue[ac];
 362
 363                        if (ac_queue == queue ||
 364                            (sdata->vif.cab_queue == queue &&
 365                             local->queue_stop_reasons[ac_queue] == 0 &&
 366                             skb_queue_empty(&local->pending[ac_queue])))
 367                                netif_wake_subqueue(sdata->dev, ac);
 368                }
 369        }
 370}
 371
 372static void __ieee80211_wake_queue(struct ieee80211_hw *hw, int queue,
 373                                   enum queue_stop_reason reason,
 374                                   bool refcounted)
 375{
 376        struct ieee80211_local *local = hw_to_local(hw);
 377
 378        trace_wake_queue(local, queue, reason);
 379
 380        if (WARN_ON(queue >= hw->queues))
 381                return;
 382
 383        if (!test_bit(reason, &local->queue_stop_reasons[queue]))
 384                return;
 385
 386        if (!refcounted) {
 387                local->q_stop_reasons[queue][reason] = 0;
 388        } else {
 389                local->q_stop_reasons[queue][reason]--;
 390                if (WARN_ON(local->q_stop_reasons[queue][reason] < 0))
 391                        local->q_stop_reasons[queue][reason] = 0;
 392        }
 393
 394        if (local->q_stop_reasons[queue][reason] == 0)
 395                __clear_bit(reason, &local->queue_stop_reasons[queue]);
 396
 397        if (local->queue_stop_reasons[queue] != 0)
 398                /* someone still has this queue stopped */
 399                return;
 400
 401        if (skb_queue_empty(&local->pending[queue])) {
 402                rcu_read_lock();
 403                ieee80211_propagate_queue_wake(local, queue);
 404                rcu_read_unlock();
 405        } else
 406                tasklet_schedule(&local->tx_pending_tasklet);
 407
 408        if (local->ops->wake_tx_queue)
 409                tasklet_schedule(&local->wake_txqs_tasklet);
 410}
 411
 412void ieee80211_wake_queue_by_reason(struct ieee80211_hw *hw, int queue,
 413                                    enum queue_stop_reason reason,
 414                                    bool refcounted)
 415{
 416        struct ieee80211_local *local = hw_to_local(hw);
 417        unsigned long flags;
 418
 419        spin_lock_irqsave(&local->queue_stop_reason_lock, flags);
 420        __ieee80211_wake_queue(hw, queue, reason, refcounted);
 421        spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags);
 422}
 423
 424void ieee80211_wake_queue(struct ieee80211_hw *hw, int queue)
 425{
 426        ieee80211_wake_queue_by_reason(hw, queue,
 427                                       IEEE80211_QUEUE_STOP_REASON_DRIVER,
 428                                       false);
 429}
 430EXPORT_SYMBOL(ieee80211_wake_queue);
 431
 432static void __ieee80211_stop_queue(struct ieee80211_hw *hw, int queue,
 433                                   enum queue_stop_reason reason,
 434                                   bool refcounted)
 435{
 436        struct ieee80211_local *local = hw_to_local(hw);
 437        struct ieee80211_sub_if_data *sdata;
 438        int n_acs = IEEE80211_NUM_ACS;
 439
 440        trace_stop_queue(local, queue, reason);
 441
 442        if (WARN_ON(queue >= hw->queues))
 443                return;
 444
 445        if (!refcounted)
 446                local->q_stop_reasons[queue][reason] = 1;
 447        else
 448                local->q_stop_reasons[queue][reason]++;
 449
 450        if (__test_and_set_bit(reason, &local->queue_stop_reasons[queue]))
 451                return;
 452
 453        if (local->hw.queues < IEEE80211_NUM_ACS)
 454                n_acs = 1;
 455
 456        rcu_read_lock();
 457        list_for_each_entry_rcu(sdata, &local->interfaces, list) {
 458                int ac;
 459
 460                if (!sdata->dev)
 461                        continue;
 462
 463                for (ac = 0; ac < n_acs; ac++) {
 464                        if (sdata->vif.hw_queue[ac] == queue ||
 465                            sdata->vif.cab_queue == queue) {
 466                                if (!local->ops->wake_tx_queue) {
 467                                        netif_stop_subqueue(sdata->dev, ac);
 468                                        continue;
 469                                }
 470                                spin_lock(&local->fq.lock);
 471                                sdata->vif.txqs_stopped[ac] = true;
 472                                spin_unlock(&local->fq.lock);
 473                        }
 474                }
 475        }
 476        rcu_read_unlock();
 477}
 478
 479void ieee80211_stop_queue_by_reason(struct ieee80211_hw *hw, int queue,
 480                                    enum queue_stop_reason reason,
 481                                    bool refcounted)
 482{
 483        struct ieee80211_local *local = hw_to_local(hw);
 484        unsigned long flags;
 485
 486        spin_lock_irqsave(&local->queue_stop_reason_lock, flags);
 487        __ieee80211_stop_queue(hw, queue, reason, refcounted);
 488        spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags);
 489}
 490
 491void ieee80211_stop_queue(struct ieee80211_hw *hw, int queue)
 492{
 493        ieee80211_stop_queue_by_reason(hw, queue,
 494                                       IEEE80211_QUEUE_STOP_REASON_DRIVER,
 495                                       false);
 496}
 497EXPORT_SYMBOL(ieee80211_stop_queue);
 498
 499void ieee80211_add_pending_skb(struct ieee80211_local *local,
 500                               struct sk_buff *skb)
 501{
 502        struct ieee80211_hw *hw = &local->hw;
 503        unsigned long flags;
 504        struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
 505        int queue = info->hw_queue;
 506
 507        if (WARN_ON(!info->control.vif)) {
 508                ieee80211_free_txskb(&local->hw, skb);
 509                return;
 510        }
 511
 512        spin_lock_irqsave(&local->queue_stop_reason_lock, flags);
 513        __ieee80211_stop_queue(hw, queue, IEEE80211_QUEUE_STOP_REASON_SKB_ADD,
 514                               false);
 515        __skb_queue_tail(&local->pending[queue], skb);
 516        __ieee80211_wake_queue(hw, queue, IEEE80211_QUEUE_STOP_REASON_SKB_ADD,
 517                               false);
 518        spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags);
 519}
 520
 521void ieee80211_add_pending_skbs(struct ieee80211_local *local,
 522                                struct sk_buff_head *skbs)
 523{
 524        struct ieee80211_hw *hw = &local->hw;
 525        struct sk_buff *skb;
 526        unsigned long flags;
 527        int queue, i;
 528
 529        spin_lock_irqsave(&local->queue_stop_reason_lock, flags);
 530        while ((skb = skb_dequeue(skbs))) {
 531                struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
 532
 533                if (WARN_ON(!info->control.vif)) {
 534                        ieee80211_free_txskb(&local->hw, skb);
 535                        continue;
 536                }
 537
 538                queue = info->hw_queue;
 539
 540                __ieee80211_stop_queue(hw, queue,
 541                                IEEE80211_QUEUE_STOP_REASON_SKB_ADD,
 542                                false);
 543
 544                __skb_queue_tail(&local->pending[queue], skb);
 545        }
 546
 547        for (i = 0; i < hw->queues; i++)
 548                __ieee80211_wake_queue(hw, i,
 549                        IEEE80211_QUEUE_STOP_REASON_SKB_ADD,
 550                        false);
 551        spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags);
 552}
 553
 554void ieee80211_stop_queues_by_reason(struct ieee80211_hw *hw,
 555                                     unsigned long queues,
 556                                     enum queue_stop_reason reason,
 557                                     bool refcounted)
 558{
 559        struct ieee80211_local *local = hw_to_local(hw);
 560        unsigned long flags;
 561        int i;
 562
 563        spin_lock_irqsave(&local->queue_stop_reason_lock, flags);
 564
 565        for_each_set_bit(i, &queues, hw->queues)
 566                __ieee80211_stop_queue(hw, i, reason, refcounted);
 567
 568        spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags);
 569}
 570
 571void ieee80211_stop_queues(struct ieee80211_hw *hw)
 572{
 573        ieee80211_stop_queues_by_reason(hw, IEEE80211_MAX_QUEUE_MAP,
 574                                        IEEE80211_QUEUE_STOP_REASON_DRIVER,
 575                                        false);
 576}
 577EXPORT_SYMBOL(ieee80211_stop_queues);
 578
 579int ieee80211_queue_stopped(struct ieee80211_hw *hw, int queue)
 580{
 581        struct ieee80211_local *local = hw_to_local(hw);
 582        unsigned long flags;
 583        int ret;
 584
 585        if (WARN_ON(queue >= hw->queues))
 586                return true;
 587
 588        spin_lock_irqsave(&local->queue_stop_reason_lock, flags);
 589        ret = test_bit(IEEE80211_QUEUE_STOP_REASON_DRIVER,
 590                       &local->queue_stop_reasons[queue]);
 591        spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags);
 592        return ret;
 593}
 594EXPORT_SYMBOL(ieee80211_queue_stopped);
 595
 596void ieee80211_wake_queues_by_reason(struct ieee80211_hw *hw,
 597                                     unsigned long queues,
 598                                     enum queue_stop_reason reason,
 599                                     bool refcounted)
 600{
 601        struct ieee80211_local *local = hw_to_local(hw);
 602        unsigned long flags;
 603        int i;
 604
 605        spin_lock_irqsave(&local->queue_stop_reason_lock, flags);
 606
 607        for_each_set_bit(i, &queues, hw->queues)
 608                __ieee80211_wake_queue(hw, i, reason, refcounted);
 609
 610        spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags);
 611}
 612
 613void ieee80211_wake_queues(struct ieee80211_hw *hw)
 614{
 615        ieee80211_wake_queues_by_reason(hw, IEEE80211_MAX_QUEUE_MAP,
 616                                        IEEE80211_QUEUE_STOP_REASON_DRIVER,
 617                                        false);
 618}
 619EXPORT_SYMBOL(ieee80211_wake_queues);
 620
 621static unsigned int
 622ieee80211_get_vif_queues(struct ieee80211_local *local,
 623                         struct ieee80211_sub_if_data *sdata)
 624{
 625        unsigned int queues;
 626
 627        if (sdata && ieee80211_hw_check(&local->hw, QUEUE_CONTROL)) {
 628                int ac;
 629
 630                queues = 0;
 631
 632                for (ac = 0; ac < IEEE80211_NUM_ACS; ac++)
 633                        queues |= BIT(sdata->vif.hw_queue[ac]);
 634                if (sdata->vif.cab_queue != IEEE80211_INVAL_HW_QUEUE)
 635                        queues |= BIT(sdata->vif.cab_queue);
 636        } else {
 637                /* all queues */
 638                queues = BIT(local->hw.queues) - 1;
 639        }
 640
 641        return queues;
 642}
 643
 644void __ieee80211_flush_queues(struct ieee80211_local *local,
 645                              struct ieee80211_sub_if_data *sdata,
 646                              unsigned int queues, bool drop)
 647{
 648        if (!local->ops->flush)
 649                return;
 650
 651        /*
 652         * If no queue was set, or if the HW doesn't support
 653         * IEEE80211_HW_QUEUE_CONTROL - flush all queues
 654         */
 655        if (!queues || !ieee80211_hw_check(&local->hw, QUEUE_CONTROL))
 656                queues = ieee80211_get_vif_queues(local, sdata);
 657
 658        ieee80211_stop_queues_by_reason(&local->hw, queues,
 659                                        IEEE80211_QUEUE_STOP_REASON_FLUSH,
 660                                        false);
 661
 662        drv_flush(local, sdata, queues, drop);
 663
 664        ieee80211_wake_queues_by_reason(&local->hw, queues,
 665                                        IEEE80211_QUEUE_STOP_REASON_FLUSH,
 666                                        false);
 667}
 668
 669void ieee80211_flush_queues(struct ieee80211_local *local,
 670                            struct ieee80211_sub_if_data *sdata, bool drop)
 671{
 672        __ieee80211_flush_queues(local, sdata, 0, drop);
 673}
 674
 675void ieee80211_stop_vif_queues(struct ieee80211_local *local,
 676                               struct ieee80211_sub_if_data *sdata,
 677                               enum queue_stop_reason reason)
 678{
 679        ieee80211_stop_queues_by_reason(&local->hw,
 680                                        ieee80211_get_vif_queues(local, sdata),
 681                                        reason, true);
 682}
 683
 684void ieee80211_wake_vif_queues(struct ieee80211_local *local,
 685                               struct ieee80211_sub_if_data *sdata,
 686                               enum queue_stop_reason reason)
 687{
 688        ieee80211_wake_queues_by_reason(&local->hw,
 689                                        ieee80211_get_vif_queues(local, sdata),
 690                                        reason, true);
 691}
 692
 693static void __iterate_interfaces(struct ieee80211_local *local,
 694                                 u32 iter_flags,
 695                                 void (*iterator)(void *data, u8 *mac,
 696                                                  struct ieee80211_vif *vif),
 697                                 void *data)
 698{
 699        struct ieee80211_sub_if_data *sdata;
 700        bool active_only = iter_flags & IEEE80211_IFACE_ITER_ACTIVE;
 701
 702        list_for_each_entry_rcu(sdata, &local->interfaces, list) {
 703                switch (sdata->vif.type) {
 704                case NL80211_IFTYPE_MONITOR:
 705                        if (!(sdata->u.mntr.flags & MONITOR_FLAG_ACTIVE))
 706                                continue;
 707                        break;
 708                case NL80211_IFTYPE_AP_VLAN:
 709                        continue;
 710                default:
 711                        break;
 712                }
 713                if (!(iter_flags & IEEE80211_IFACE_ITER_RESUME_ALL) &&
 714                    active_only && !(sdata->flags & IEEE80211_SDATA_IN_DRIVER))
 715                        continue;
 716                if (ieee80211_sdata_running(sdata) || !active_only)
 717                        iterator(data, sdata->vif.addr,
 718                                 &sdata->vif);
 719        }
 720
 721        sdata = rcu_dereference_check(local->monitor_sdata,
 722                                      lockdep_is_held(&local->iflist_mtx) ||
 723                                      lockdep_rtnl_is_held());
 724        if (sdata &&
 725            (iter_flags & IEEE80211_IFACE_ITER_RESUME_ALL || !active_only ||
 726             sdata->flags & IEEE80211_SDATA_IN_DRIVER))
 727                iterator(data, sdata->vif.addr, &sdata->vif);
 728}
 729
 730void ieee80211_iterate_interfaces(
 731        struct ieee80211_hw *hw, u32 iter_flags,
 732        void (*iterator)(void *data, u8 *mac,
 733                         struct ieee80211_vif *vif),
 734        void *data)
 735{
 736        struct ieee80211_local *local = hw_to_local(hw);
 737
 738        mutex_lock(&local->iflist_mtx);
 739        __iterate_interfaces(local, iter_flags, iterator, data);
 740        mutex_unlock(&local->iflist_mtx);
 741}
 742EXPORT_SYMBOL_GPL(ieee80211_iterate_interfaces);
 743
 744void ieee80211_iterate_active_interfaces_atomic(
 745        struct ieee80211_hw *hw, u32 iter_flags,
 746        void (*iterator)(void *data, u8 *mac,
 747                         struct ieee80211_vif *vif),
 748        void *data)
 749{
 750        struct ieee80211_local *local = hw_to_local(hw);
 751
 752        rcu_read_lock();
 753        __iterate_interfaces(local, iter_flags | IEEE80211_IFACE_ITER_ACTIVE,
 754                             iterator, data);
 755        rcu_read_unlock();
 756}
 757EXPORT_SYMBOL_GPL(ieee80211_iterate_active_interfaces_atomic);
 758
 759void ieee80211_iterate_active_interfaces_rtnl(
 760        struct ieee80211_hw *hw, u32 iter_flags,
 761        void (*iterator)(void *data, u8 *mac,
 762                         struct ieee80211_vif *vif),
 763        void *data)
 764{
 765        struct ieee80211_local *local = hw_to_local(hw);
 766
 767        ASSERT_RTNL();
 768
 769        __iterate_interfaces(local, iter_flags | IEEE80211_IFACE_ITER_ACTIVE,
 770                             iterator, data);
 771}
 772EXPORT_SYMBOL_GPL(ieee80211_iterate_active_interfaces_rtnl);
 773
 774static void __iterate_stations(struct ieee80211_local *local,
 775                               void (*iterator)(void *data,
 776                                                struct ieee80211_sta *sta),
 777                               void *data)
 778{
 779        struct sta_info *sta;
 780
 781        list_for_each_entry_rcu(sta, &local->sta_list, list) {
 782                if (!sta->uploaded)
 783                        continue;
 784
 785                iterator(data, &sta->sta);
 786        }
 787}
 788
 789void ieee80211_iterate_stations_atomic(struct ieee80211_hw *hw,
 790                        void (*iterator)(void *data,
 791                                         struct ieee80211_sta *sta),
 792                        void *data)
 793{
 794        struct ieee80211_local *local = hw_to_local(hw);
 795
 796        rcu_read_lock();
 797        __iterate_stations(local, iterator, data);
 798        rcu_read_unlock();
 799}
 800EXPORT_SYMBOL_GPL(ieee80211_iterate_stations_atomic);
 801
 802struct ieee80211_vif *wdev_to_ieee80211_vif(struct wireless_dev *wdev)
 803{
 804        struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev);
 805
 806        if (!ieee80211_sdata_running(sdata) ||
 807            !(sdata->flags & IEEE80211_SDATA_IN_DRIVER))
 808                return NULL;
 809        return &sdata->vif;
 810}
 811EXPORT_SYMBOL_GPL(wdev_to_ieee80211_vif);
 812
 813struct wireless_dev *ieee80211_vif_to_wdev(struct ieee80211_vif *vif)
 814{
 815        struct ieee80211_sub_if_data *sdata;
 816
 817        if (!vif)
 818                return NULL;
 819
 820        sdata = vif_to_sdata(vif);
 821
 822        if (!ieee80211_sdata_running(sdata) ||
 823            !(sdata->flags & IEEE80211_SDATA_IN_DRIVER))
 824                return NULL;
 825
 826        return &sdata->wdev;
 827}
 828EXPORT_SYMBOL_GPL(ieee80211_vif_to_wdev);
 829
 830/*
 831 * Nothing should have been stuffed into the workqueue during
 832 * the suspend->resume cycle. Since we can't check each caller
 833 * of this function if we are already quiescing / suspended,
 834 * check here and don't WARN since this can actually happen when
 835 * the rx path (for example) is racing against __ieee80211_suspend
 836 * and suspending / quiescing was set after the rx path checked
 837 * them.
 838 */
 839static bool ieee80211_can_queue_work(struct ieee80211_local *local)
 840{
 841        if (local->quiescing || (local->suspended && !local->resuming)) {
 842                pr_warn("queueing ieee80211 work while going to suspend\n");
 843                return false;
 844        }
 845
 846        return true;
 847}
 848
 849void ieee80211_queue_work(struct ieee80211_hw *hw, struct work_struct *work)
 850{
 851        struct ieee80211_local *local = hw_to_local(hw);
 852
 853        if (!ieee80211_can_queue_work(local))
 854                return;
 855
 856        queue_work(local->workqueue, work);
 857}
 858EXPORT_SYMBOL(ieee80211_queue_work);
 859
 860void ieee80211_queue_delayed_work(struct ieee80211_hw *hw,
 861                                  struct delayed_work *dwork,
 862                                  unsigned long delay)
 863{
 864        struct ieee80211_local *local = hw_to_local(hw);
 865
 866        if (!ieee80211_can_queue_work(local))
 867                return;
 868
 869        queue_delayed_work(local->workqueue, dwork, delay);
 870}
 871EXPORT_SYMBOL(ieee80211_queue_delayed_work);
 872
 873u32 ieee802_11_parse_elems_crc(const u8 *start, size_t len, bool action,
 874                               struct ieee802_11_elems *elems,
 875                               u64 filter, u32 crc)
 876{
 877        size_t left = len;
 878        const u8 *pos = start;
 879        bool calc_crc = filter != 0;
 880        DECLARE_BITMAP(seen_elems, 256);
 881        const u8 *ie;
 882
 883        bitmap_zero(seen_elems, 256);
 884        memset(elems, 0, sizeof(*elems));
 885        elems->ie_start = start;
 886        elems->total_len = len;
 887
 888        while (left >= 2) {
 889                u8 id, elen;
 890                bool elem_parse_failed;
 891
 892                id = *pos++;
 893                elen = *pos++;
 894                left -= 2;
 895
 896                if (elen > left) {
 897                        elems->parse_error = true;
 898                        break;
 899                }
 900
 901                switch (id) {
 902                case WLAN_EID_SSID:
 903                case WLAN_EID_SUPP_RATES:
 904                case WLAN_EID_FH_PARAMS:
 905                case WLAN_EID_DS_PARAMS:
 906                case WLAN_EID_CF_PARAMS:
 907                case WLAN_EID_TIM:
 908                case WLAN_EID_IBSS_PARAMS:
 909                case WLAN_EID_CHALLENGE:
 910                case WLAN_EID_RSN:
 911                case WLAN_EID_ERP_INFO:
 912                case WLAN_EID_EXT_SUPP_RATES:
 913                case WLAN_EID_HT_CAPABILITY:
 914                case WLAN_EID_HT_OPERATION:
 915                case WLAN_EID_VHT_CAPABILITY:
 916                case WLAN_EID_VHT_OPERATION:
 917                case WLAN_EID_MESH_ID:
 918                case WLAN_EID_MESH_CONFIG:
 919                case WLAN_EID_PEER_MGMT:
 920                case WLAN_EID_PREQ:
 921                case WLAN_EID_PREP:
 922                case WLAN_EID_PERR:
 923                case WLAN_EID_RANN:
 924                case WLAN_EID_CHANNEL_SWITCH:
 925                case WLAN_EID_EXT_CHANSWITCH_ANN:
 926                case WLAN_EID_COUNTRY:
 927                case WLAN_EID_PWR_CONSTRAINT:
 928                case WLAN_EID_TIMEOUT_INTERVAL:
 929                case WLAN_EID_SECONDARY_CHANNEL_OFFSET:
 930                case WLAN_EID_WIDE_BW_CHANNEL_SWITCH:
 931                case WLAN_EID_CHAN_SWITCH_PARAM:
 932                case WLAN_EID_EXT_CAPABILITY:
 933                case WLAN_EID_CHAN_SWITCH_TIMING:
 934                case WLAN_EID_LINK_ID:
 935                case WLAN_EID_BSS_MAX_IDLE_PERIOD:
 936                /*
 937                 * not listing WLAN_EID_CHANNEL_SWITCH_WRAPPER -- it seems possible
 938                 * that if the content gets bigger it might be needed more than once
 939                 */
 940                        if (test_bit(id, seen_elems)) {
 941                                elems->parse_error = true;
 942                                left -= elen;
 943                                pos += elen;
 944                                continue;
 945                        }
 946                        break;
 947                }
 948
 949                if (calc_crc && id < 64 && (filter & (1ULL << id)))
 950                        crc = crc32_be(crc, pos - 2, elen + 2);
 951
 952                elem_parse_failed = false;
 953
 954                switch (id) {
 955                case WLAN_EID_LINK_ID:
 956                        if (elen + 2 != sizeof(struct ieee80211_tdls_lnkie)) {
 957                                elem_parse_failed = true;
 958                                break;
 959                        }
 960                        elems->lnk_id = (void *)(pos - 2);
 961                        break;
 962                case WLAN_EID_CHAN_SWITCH_TIMING:
 963                        if (elen != sizeof(struct ieee80211_ch_switch_timing)) {
 964                                elem_parse_failed = true;
 965                                break;
 966                        }
 967                        elems->ch_sw_timing = (void *)pos;
 968                        break;
 969                case WLAN_EID_EXT_CAPABILITY:
 970                        elems->ext_capab = pos;
 971                        elems->ext_capab_len = elen;
 972                        break;
 973                case WLAN_EID_SSID:
 974                        elems->ssid = pos;
 975                        elems->ssid_len = elen;
 976                        break;
 977                case WLAN_EID_SUPP_RATES:
 978                        elems->supp_rates = pos;
 979                        elems->supp_rates_len = elen;
 980                        break;
 981                case WLAN_EID_DS_PARAMS:
 982                        if (elen >= 1)
 983                                elems->ds_params = pos;
 984                        else
 985                                elem_parse_failed = true;
 986                        break;
 987                case WLAN_EID_TIM:
 988                        if (elen >= sizeof(struct ieee80211_tim_ie)) {
 989                                elems->tim = (void *)pos;
 990                                elems->tim_len = elen;
 991                        } else
 992                                elem_parse_failed = true;
 993                        break;
 994                case WLAN_EID_CHALLENGE:
 995                        elems->challenge = pos;
 996                        elems->challenge_len = elen;
 997                        break;
 998                case WLAN_EID_VENDOR_SPECIFIC:
 999                        if (elen >= 4 && pos[0] == 0x00 && pos[1] == 0x50 &&
1000                            pos[2] == 0xf2) {
1001                                /* Microsoft OUI (00:50:F2) */
1002
1003                                if (calc_crc)
1004                                        crc = crc32_be(crc, pos - 2, elen + 2);
1005
1006                                if (elen >= 5 && pos[3] == 2) {
1007                                        /* OUI Type 2 - WMM IE */
1008                                        if (pos[4] == 0) {
1009                                                elems->wmm_info = pos;
1010                                                elems->wmm_info_len = elen;
1011                                        } else if (pos[4] == 1) {
1012                                                elems->wmm_param = pos;
1013                                                elems->wmm_param_len = elen;
1014                                        }
1015                                }
1016                        }
1017                        break;
1018                case WLAN_EID_RSN:
1019                        elems->rsn = pos;
1020                        elems->rsn_len = elen;
1021                        break;
1022                case WLAN_EID_ERP_INFO:
1023                        if (elen >= 1)
1024                                elems->erp_info = pos;
1025                        else
1026                                elem_parse_failed = true;
1027                        break;
1028                case WLAN_EID_EXT_SUPP_RATES:
1029                        elems->ext_supp_rates = pos;
1030                        elems->ext_supp_rates_len = elen;
1031                        break;
1032                case WLAN_EID_HT_CAPABILITY:
1033                        if (elen >= sizeof(struct ieee80211_ht_cap))
1034                                elems->ht_cap_elem = (void *)pos;
1035                        else
1036                                elem_parse_failed = true;
1037                        break;
1038                case WLAN_EID_HT_OPERATION:
1039                        if (elen >= sizeof(struct ieee80211_ht_operation))
1040                                elems->ht_operation = (void *)pos;
1041                        else
1042                                elem_parse_failed = true;
1043                        break;
1044                case WLAN_EID_VHT_CAPABILITY:
1045                        if (elen >= sizeof(struct ieee80211_vht_cap))
1046                                elems->vht_cap_elem = (void *)pos;
1047                        else
1048                                elem_parse_failed = true;
1049                        break;
1050                case WLAN_EID_VHT_OPERATION:
1051                        if (elen >= sizeof(struct ieee80211_vht_operation))
1052                                elems->vht_operation = (void *)pos;
1053                        else
1054                                elem_parse_failed = true;
1055                        break;
1056                case WLAN_EID_OPMODE_NOTIF:
1057                        if (elen > 0)
1058                                elems->opmode_notif = pos;
1059                        else
1060                                elem_parse_failed = true;
1061                        break;
1062                case WLAN_EID_MESH_ID:
1063                        elems->mesh_id = pos;
1064                        elems->mesh_id_len = elen;
1065                        break;
1066                case WLAN_EID_MESH_CONFIG:
1067                        if (elen >= sizeof(struct ieee80211_meshconf_ie))
1068                                elems->mesh_config = (void *)pos;
1069                        else
1070                                elem_parse_failed = true;
1071                        break;
1072                case WLAN_EID_PEER_MGMT:
1073                        elems->peering = pos;
1074                        elems->peering_len = elen;
1075                        break;
1076                case WLAN_EID_MESH_AWAKE_WINDOW:
1077                        if (elen >= 2)
1078                                elems->awake_window = (void *)pos;
1079                        break;
1080                case WLAN_EID_PREQ:
1081                        elems->preq = pos;
1082                        elems->preq_len = elen;
1083                        break;
1084                case WLAN_EID_PREP:
1085                        elems->prep = pos;
1086                        elems->prep_len = elen;
1087                        break;
1088                case WLAN_EID_PERR:
1089                        elems->perr = pos;
1090                        elems->perr_len = elen;
1091                        break;
1092                case WLAN_EID_RANN:
1093                        if (elen >= sizeof(struct ieee80211_rann_ie))
1094                                elems->rann = (void *)pos;
1095                        else
1096                                elem_parse_failed = true;
1097                        break;
1098                case WLAN_EID_CHANNEL_SWITCH:
1099                        if (elen != sizeof(struct ieee80211_channel_sw_ie)) {
1100                                elem_parse_failed = true;
1101                                break;
1102                        }
1103                        elems->ch_switch_ie = (void *)pos;
1104                        break;
1105                case WLAN_EID_EXT_CHANSWITCH_ANN:
1106                        if (elen != sizeof(struct ieee80211_ext_chansw_ie)) {
1107                                elem_parse_failed = true;
1108                                break;
1109                        }
1110                        elems->ext_chansw_ie = (void *)pos;
1111                        break;
1112                case WLAN_EID_SECONDARY_CHANNEL_OFFSET:
1113                        if (elen != sizeof(struct ieee80211_sec_chan_offs_ie)) {
1114                                elem_parse_failed = true;
1115                                break;
1116                        }
1117                        elems->sec_chan_offs = (void *)pos;
1118                        break;
1119                case WLAN_EID_CHAN_SWITCH_PARAM:
1120                        if (elen !=
1121                            sizeof(*elems->mesh_chansw_params_ie)) {
1122                                elem_parse_failed = true;
1123                                break;
1124                        }
1125                        elems->mesh_chansw_params_ie = (void *)pos;
1126                        break;
1127                case WLAN_EID_WIDE_BW_CHANNEL_SWITCH:
1128                        if (!action ||
1129                            elen != sizeof(*elems->wide_bw_chansw_ie)) {
1130                                elem_parse_failed = true;
1131                                break;
1132                        }
1133                        elems->wide_bw_chansw_ie = (void *)pos;
1134                        break;
1135                case WLAN_EID_CHANNEL_SWITCH_WRAPPER:
1136                        if (action) {
1137                                elem_parse_failed = true;
1138                                break;
1139                        }
1140                        /*
1141                         * This is a bit tricky, but as we only care about
1142                         * the wide bandwidth channel switch element, so
1143                         * just parse it out manually.
1144                         */
1145                        ie = cfg80211_find_ie(WLAN_EID_WIDE_BW_CHANNEL_SWITCH,
1146                                              pos, elen);
1147                        if (ie) {
1148                                if (ie[1] == sizeof(*elems->wide_bw_chansw_ie))
1149                                        elems->wide_bw_chansw_ie =
1150                                                (void *)(ie + 2);
1151                                else
1152                                        elem_parse_failed = true;
1153                        }
1154                        break;
1155                case WLAN_EID_COUNTRY:
1156                        elems->country_elem = pos;
1157                        elems->country_elem_len = elen;
1158                        break;
1159                case WLAN_EID_PWR_CONSTRAINT:
1160                        if (elen != 1) {
1161                                elem_parse_failed = true;
1162                                break;
1163                        }
1164                        elems->pwr_constr_elem = pos;
1165                        break;
1166                case WLAN_EID_CISCO_VENDOR_SPECIFIC:
1167                        /* Lots of different options exist, but we only care
1168                         * about the Dynamic Transmit Power Control element.
1169                         * First check for the Cisco OUI, then for the DTPC
1170                         * tag (0x00).
1171                         */
1172                        if (elen < 4) {
1173                                elem_parse_failed = true;
1174                                break;
1175                        }
1176
1177                        if (pos[0] != 0x00 || pos[1] != 0x40 ||
1178                            pos[2] != 0x96 || pos[3] != 0x00)
1179                                break;
1180
1181                        if (elen != 6) {
1182                                elem_parse_failed = true;
1183                                break;
1184                        }
1185
1186                        if (calc_crc)
1187                                crc = crc32_be(crc, pos - 2, elen + 2);
1188
1189                        elems->cisco_dtpc_elem = pos;
1190                        break;
1191                case WLAN_EID_TIMEOUT_INTERVAL:
1192                        if (elen >= sizeof(struct ieee80211_timeout_interval_ie))
1193                                elems->timeout_int = (void *)pos;
1194                        else
1195                                elem_parse_failed = true;
1196                        break;
1197                case WLAN_EID_BSS_MAX_IDLE_PERIOD:
1198                        if (elen >= sizeof(*elems->max_idle_period_ie))
1199                                elems->max_idle_period_ie = (void *)pos;
1200                        break;
1201                case WLAN_EID_EXTENSION:
1202                        if (pos[0] == WLAN_EID_EXT_HE_MU_EDCA &&
1203                            elen >= (sizeof(*elems->mu_edca_param_set) + 1)) {
1204                                elems->mu_edca_param_set = (void *)&pos[1];
1205                        } else if (pos[0] == WLAN_EID_EXT_HE_CAPABILITY) {
1206                                elems->he_cap = (void *)&pos[1];
1207                                elems->he_cap_len = elen - 1;
1208                        } else if (pos[0] == WLAN_EID_EXT_HE_OPERATION &&
1209                                   elen >= sizeof(*elems->he_operation) &&
1210                                   elen >= ieee80211_he_oper_size(&pos[1])) {
1211                                elems->he_operation = (void *)&pos[1];
1212                        } else if (pos[0] == WLAN_EID_EXT_UORA && elen >= 1) {
1213                                elems->uora_element = (void *)&pos[1];
1214                        }
1215                        break;
1216                default:
1217                        break;
1218                }
1219
1220                if (elem_parse_failed)
1221                        elems->parse_error = true;
1222                else
1223                        __set_bit(id, seen_elems);
1224
1225                left -= elen;
1226                pos += elen;
1227        }
1228
1229        if (left != 0)
1230                elems->parse_error = true;
1231
1232        return crc;
1233}
1234
1235void ieee80211_regulatory_limit_wmm_params(struct ieee80211_sub_if_data *sdata,
1236                                           struct ieee80211_tx_queue_params
1237                                           *qparam, int ac)
1238{
1239        struct ieee80211_chanctx_conf *chanctx_conf;
1240        const struct ieee80211_reg_rule *rrule;
1241        const struct ieee80211_wmm_ac *wmm_ac;
1242        u16 center_freq = 0;
1243
1244        if (sdata->vif.type != NL80211_IFTYPE_AP &&
1245            sdata->vif.type != NL80211_IFTYPE_STATION)
1246                return;
1247
1248        rcu_read_lock();
1249        chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf);
1250        if (chanctx_conf)
1251                center_freq = chanctx_conf->def.chan->center_freq;
1252
1253        if (!center_freq) {
1254                rcu_read_unlock();
1255                return;
1256        }
1257
1258        rrule = freq_reg_info(sdata->wdev.wiphy, MHZ_TO_KHZ(center_freq));
1259
1260        if (IS_ERR_OR_NULL(rrule) || !rrule->has_wmm) {
1261                rcu_read_unlock();
1262                return;
1263        }
1264
1265        if (sdata->vif.type == NL80211_IFTYPE_AP)
1266                wmm_ac = &rrule->wmm_rule.ap[ac];
1267        else
1268                wmm_ac = &rrule->wmm_rule.client[ac];
1269        qparam->cw_min = max_t(u16, qparam->cw_min, wmm_ac->cw_min);
1270        qparam->cw_max = max_t(u16, qparam->cw_max, wmm_ac->cw_max);
1271        qparam->aifs = max_t(u8, qparam->aifs, wmm_ac->aifsn);
1272        qparam->txop = min_t(u16, qparam->txop, wmm_ac->cot / 32);
1273        rcu_read_unlock();
1274}
1275
1276void ieee80211_set_wmm_default(struct ieee80211_sub_if_data *sdata,
1277                               bool bss_notify, bool enable_qos)
1278{
1279        struct ieee80211_local *local = sdata->local;
1280        struct ieee80211_tx_queue_params qparam;
1281        struct ieee80211_chanctx_conf *chanctx_conf;
1282        int ac;
1283        bool use_11b;
1284        bool is_ocb; /* Use another EDCA parameters if dot11OCBActivated=true */
1285        int aCWmin, aCWmax;
1286
1287        if (!local->ops->conf_tx)
1288                return;
1289
1290        if (local->hw.queues < IEEE80211_NUM_ACS)
1291                return;
1292
1293        memset(&qparam, 0, sizeof(qparam));
1294
1295        rcu_read_lock();
1296        chanctx_conf = rcu_dereference(sdata->vif.chanctx_conf);
1297        use_11b = (chanctx_conf &&
1298                   chanctx_conf->def.chan->band == NL80211_BAND_2GHZ) &&
1299                 !(sdata->flags & IEEE80211_SDATA_OPERATING_GMODE);
1300        rcu_read_unlock();
1301
1302        is_ocb = (sdata->vif.type == NL80211_IFTYPE_OCB);
1303
1304        /* Set defaults according to 802.11-2007 Table 7-37 */
1305        aCWmax = 1023;
1306        if (use_11b)
1307                aCWmin = 31;
1308        else
1309                aCWmin = 15;
1310
1311        /* Confiure old 802.11b/g medium access rules. */
1312        qparam.cw_max = aCWmax;
1313        qparam.cw_min = aCWmin;
1314        qparam.txop = 0;
1315        qparam.aifs = 2;
1316
1317        for (ac = 0; ac < IEEE80211_NUM_ACS; ac++) {
1318                /* Update if QoS is enabled. */
1319                if (enable_qos) {
1320                        switch (ac) {
1321                        case IEEE80211_AC_BK:
1322                                qparam.cw_max = aCWmax;
1323                                qparam.cw_min = aCWmin;
1324                                qparam.txop = 0;
1325                                if (is_ocb)
1326                                        qparam.aifs = 9;
1327                                else
1328                                        qparam.aifs = 7;
1329                                break;
1330                        /* never happens but let's not leave undefined */
1331                        default:
1332                        case IEEE80211_AC_BE:
1333                                qparam.cw_max = aCWmax;
1334                                qparam.cw_min = aCWmin;
1335                                qparam.txop = 0;
1336                                if (is_ocb)
1337                                        qparam.aifs = 6;
1338                                else
1339                                        qparam.aifs = 3;
1340                                break;
1341                        case IEEE80211_AC_VI:
1342                                qparam.cw_max = aCWmin;
1343                                qparam.cw_min = (aCWmin + 1) / 2 - 1;
1344                                if (is_ocb)
1345                                        qparam.txop = 0;
1346                                else if (use_11b)
1347                                        qparam.txop = 6016/32;
1348                                else
1349                                        qparam.txop = 3008/32;
1350
1351                                if (is_ocb)
1352                                        qparam.aifs = 3;
1353                                else
1354                                        qparam.aifs = 2;
1355                                break;
1356                        case IEEE80211_AC_VO:
1357                                qparam.cw_max = (aCWmin + 1) / 2 - 1;
1358                                qparam.cw_min = (aCWmin + 1) / 4 - 1;
1359                                if (is_ocb)
1360                                        qparam.txop = 0;
1361                                else if (use_11b)
1362                                        qparam.txop = 3264/32;
1363                                else
1364                                        qparam.txop = 1504/32;
1365                                qparam.aifs = 2;
1366                                break;
1367                        }
1368                }
1369                ieee80211_regulatory_limit_wmm_params(sdata, &qparam, ac);
1370
1371                qparam.uapsd = false;
1372
1373                sdata->tx_conf[ac] = qparam;
1374                drv_conf_tx(local, sdata, ac, &qparam);
1375        }
1376
1377        if (sdata->vif.type != NL80211_IFTYPE_MONITOR &&
1378            sdata->vif.type != NL80211_IFTYPE_P2P_DEVICE &&
1379            sdata->vif.type != NL80211_IFTYPE_NAN) {
1380                sdata->vif.bss_conf.qos = enable_qos;
1381                if (bss_notify)
1382                        ieee80211_bss_info_change_notify(sdata,
1383                                                         BSS_CHANGED_QOS);
1384        }
1385}
1386
1387void ieee80211_send_auth(struct ieee80211_sub_if_data *sdata,
1388                         u16 transaction, u16 auth_alg, u16 status,
1389                         const u8 *extra, size_t extra_len, const u8 *da,
1390                         const u8 *bssid, const u8 *key, u8 key_len, u8 key_idx,
1391                         u32 tx_flags)
1392{
1393        struct ieee80211_local *local = sdata->local;
1394        struct sk_buff *skb;
1395        struct ieee80211_mgmt *mgmt;
1396        int err;
1397
1398        /* 24 + 6 = header + auth_algo + auth_transaction + status_code */
1399        skb = dev_alloc_skb(local->hw.extra_tx_headroom + IEEE80211_WEP_IV_LEN +
1400                            24 + 6 + extra_len + IEEE80211_WEP_ICV_LEN);
1401        if (!skb)
1402                return;
1403
1404        skb_reserve(skb, local->hw.extra_tx_headroom + IEEE80211_WEP_IV_LEN);
1405
1406        mgmt = skb_put_zero(skb, 24 + 6);
1407        mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT |
1408                                          IEEE80211_STYPE_AUTH);
1409        memcpy(mgmt->da, da, ETH_ALEN);
1410        memcpy(mgmt->sa, sdata->vif.addr, ETH_ALEN);
1411        memcpy(mgmt->bssid, bssid, ETH_ALEN);
1412        mgmt->u.auth.auth_alg = cpu_to_le16(auth_alg);
1413        mgmt->u.auth.auth_transaction = cpu_to_le16(transaction);
1414        mgmt->u.auth.status_code = cpu_to_le16(status);
1415        if (extra)
1416                skb_put_data(skb, extra, extra_len);
1417
1418        if (auth_alg == WLAN_AUTH_SHARED_KEY && transaction == 3) {
1419                mgmt->frame_control |= cpu_to_le16(IEEE80211_FCTL_PROTECTED);
1420                err = ieee80211_wep_encrypt(local, skb, key, key_len, key_idx);
1421                WARN_ON(err);
1422        }
1423
1424        IEEE80211_SKB_CB(skb)->flags |= IEEE80211_TX_INTFL_DONT_ENCRYPT |
1425                                        tx_flags;
1426        ieee80211_tx_skb(sdata, skb);
1427}
1428
1429void ieee80211_send_deauth_disassoc(struct ieee80211_sub_if_data *sdata,
1430                                    const u8 *bssid, u16 stype, u16 reason,
1431                                    bool send_frame, u8 *frame_buf)
1432{
1433        struct ieee80211_local *local = sdata->local;
1434        struct sk_buff *skb;
1435        struct ieee80211_mgmt *mgmt = (void *)frame_buf;
1436
1437        /* build frame */
1438        mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT | stype);
1439        mgmt->duration = 0; /* initialize only */
1440        mgmt->seq_ctrl = 0; /* initialize only */
1441        memcpy(mgmt->da, bssid, ETH_ALEN);
1442        memcpy(mgmt->sa, sdata->vif.addr, ETH_ALEN);
1443        memcpy(mgmt->bssid, bssid, ETH_ALEN);
1444        /* u.deauth.reason_code == u.disassoc.reason_code */
1445        mgmt->u.deauth.reason_code = cpu_to_le16(reason);
1446
1447        if (send_frame) {
1448                skb = dev_alloc_skb(local->hw.extra_tx_headroom +
1449                                    IEEE80211_DEAUTH_FRAME_LEN);
1450                if (!skb)
1451                        return;
1452
1453                skb_reserve(skb, local->hw.extra_tx_headroom);
1454
1455                /* copy in frame */
1456                skb_put_data(skb, mgmt, IEEE80211_DEAUTH_FRAME_LEN);
1457
1458                if (sdata->vif.type != NL80211_IFTYPE_STATION ||
1459                    !(sdata->u.mgd.flags & IEEE80211_STA_MFP_ENABLED))
1460                        IEEE80211_SKB_CB(skb)->flags |=
1461                                IEEE80211_TX_INTFL_DONT_ENCRYPT;
1462
1463                ieee80211_tx_skb(sdata, skb);
1464        }
1465}
1466
1467static int ieee80211_build_preq_ies_band(struct ieee80211_local *local,
1468                                         u8 *buffer, size_t buffer_len,
1469                                         const u8 *ie, size_t ie_len,
1470                                         enum nl80211_band band,
1471                                         u32 rate_mask,
1472                                         struct cfg80211_chan_def *chandef,
1473                                         size_t *offset, u32 flags)
1474{
1475        struct ieee80211_supported_band *sband;
1476        const struct ieee80211_sta_he_cap *he_cap;
1477        u8 *pos = buffer, *end = buffer + buffer_len;
1478        size_t noffset;
1479        int supp_rates_len, i;
1480        u8 rates[32];
1481        int num_rates;
1482        int ext_rates_len;
1483        int shift;
1484        u32 rate_flags;
1485        bool have_80mhz = false;
1486
1487        *offset = 0;
1488
1489        sband = local->hw.wiphy->bands[band];
1490        if (WARN_ON_ONCE(!sband))
1491                return 0;
1492
1493        rate_flags = ieee80211_chandef_rate_flags(chandef);
1494        shift = ieee80211_chandef_get_shift(chandef);
1495
1496        num_rates = 0;
1497        for (i = 0; i < sband->n_bitrates; i++) {
1498                if ((BIT(i) & rate_mask) == 0)
1499                        continue; /* skip rate */
1500                if ((rate_flags & sband->bitrates[i].flags) != rate_flags)
1501                        continue;
1502
1503                rates[num_rates++] =
1504                        (u8) DIV_ROUND_UP(sband->bitrates[i].bitrate,
1505                                          (1 << shift) * 5);
1506        }
1507
1508        supp_rates_len = min_t(int, num_rates, 8);
1509
1510        if (end - pos < 2 + supp_rates_len)
1511                goto out_err;
1512        *pos++ = WLAN_EID_SUPP_RATES;
1513        *pos++ = supp_rates_len;
1514        memcpy(pos, rates, supp_rates_len);
1515        pos += supp_rates_len;
1516
1517        /* insert "request information" if in custom IEs */
1518        if (ie && ie_len) {
1519                static const u8 before_extrates[] = {
1520                        WLAN_EID_SSID,
1521                        WLAN_EID_SUPP_RATES,
1522                        WLAN_EID_REQUEST,
1523                };
1524                noffset = ieee80211_ie_split(ie, ie_len,
1525                                             before_extrates,
1526                                             ARRAY_SIZE(before_extrates),
1527                                             *offset);
1528                if (end - pos < noffset - *offset)
1529                        goto out_err;
1530                memcpy(pos, ie + *offset, noffset - *offset);
1531                pos += noffset - *offset;
1532                *offset = noffset;
1533        }
1534
1535        ext_rates_len = num_rates - supp_rates_len;
1536        if (ext_rates_len > 0) {
1537                if (end - pos < 2 + ext_rates_len)
1538                        goto out_err;
1539                *pos++ = WLAN_EID_EXT_SUPP_RATES;
1540                *pos++ = ext_rates_len;
1541                memcpy(pos, rates + supp_rates_len, ext_rates_len);
1542                pos += ext_rates_len;
1543        }
1544
1545        if (chandef->chan && sband->band == NL80211_BAND_2GHZ) {
1546                if (end - pos < 3)
1547                        goto out_err;
1548                *pos++ = WLAN_EID_DS_PARAMS;
1549                *pos++ = 1;
1550                *pos++ = ieee80211_frequency_to_channel(
1551                                chandef->chan->center_freq);
1552        }
1553
1554        if (flags & IEEE80211_PROBE_FLAG_MIN_CONTENT)
1555                goto done;
1556
1557        /* insert custom IEs that go before HT */
1558        if (ie && ie_len) {
1559                static const u8 before_ht[] = {
1560                        /*
1561                         * no need to list the ones split off already
1562                         * (or generated here)
1563                         */
1564                        WLAN_EID_DS_PARAMS,
1565                        WLAN_EID_SUPPORTED_REGULATORY_CLASSES,
1566                };
1567                noffset = ieee80211_ie_split(ie, ie_len,
1568                                             before_ht, ARRAY_SIZE(before_ht),
1569                                             *offset);
1570                if (end - pos < noffset - *offset)
1571                        goto out_err;
1572                memcpy(pos, ie + *offset, noffset - *offset);
1573                pos += noffset - *offset;
1574                *offset = noffset;
1575        }
1576
1577        if (sband->ht_cap.ht_supported) {
1578                if (end - pos < 2 + sizeof(struct ieee80211_ht_cap))
1579                        goto out_err;
1580                pos = ieee80211_ie_build_ht_cap(pos, &sband->ht_cap,
1581                                                sband->ht_cap.cap);
1582        }
1583
1584        /* insert custom IEs that go before VHT */
1585        if (ie && ie_len) {
1586                static const u8 before_vht[] = {
1587                        /*
1588                         * no need to list the ones split off already
1589                         * (or generated here)
1590                         */
1591                        WLAN_EID_BSS_COEX_2040,
1592                        WLAN_EID_EXT_CAPABILITY,
1593                        WLAN_EID_SSID_LIST,
1594                        WLAN_EID_CHANNEL_USAGE,
1595                        WLAN_EID_INTERWORKING,
1596                        WLAN_EID_MESH_ID,
1597                        /* 60 GHz (Multi-band, DMG, MMS) can't happen */
1598                };
1599                noffset = ieee80211_ie_split(ie, ie_len,
1600                                             before_vht, ARRAY_SIZE(before_vht),
1601                                             *offset);
1602                if (end - pos < noffset - *offset)
1603                        goto out_err;
1604                memcpy(pos, ie + *offset, noffset - *offset);
1605                pos += noffset - *offset;
1606                *offset = noffset;
1607        }
1608
1609        /* Check if any channel in this sband supports at least 80 MHz */
1610        for (i = 0; i < sband->n_channels; i++) {
1611                if (sband->channels[i].flags & (IEEE80211_CHAN_DISABLED |
1612                                                IEEE80211_CHAN_NO_80MHZ))
1613                        continue;
1614
1615                have_80mhz = true;
1616                break;
1617        }
1618
1619        if (sband->vht_cap.vht_supported && have_80mhz) {
1620                if (end - pos < 2 + sizeof(struct ieee80211_vht_cap))
1621                        goto out_err;
1622                pos = ieee80211_ie_build_vht_cap(pos, &sband->vht_cap,
1623                                                 sband->vht_cap.cap);
1624        }
1625
1626        /* insert custom IEs that go before HE */
1627        if (ie && ie_len) {
1628                static const u8 before_he[] = {
1629                        /*
1630                         * no need to list the ones split off before VHT
1631                         * or generated here
1632                         */
1633                        WLAN_EID_EXTENSION, WLAN_EID_EXT_FILS_REQ_PARAMS,
1634                        WLAN_EID_AP_CSN,
1635                        /* TODO: add 11ah/11aj/11ak elements */
1636                };
1637                noffset = ieee80211_ie_split(ie, ie_len,
1638                                             before_he, ARRAY_SIZE(before_he),
1639                                             *offset);
1640                if (end - pos < noffset - *offset)
1641                        goto out_err;
1642                memcpy(pos, ie + *offset, noffset - *offset);
1643                pos += noffset - *offset;
1644                *offset = noffset;
1645        }
1646
1647        he_cap = ieee80211_get_he_sta_cap(sband);
1648        if (he_cap) {
1649                pos = ieee80211_ie_build_he_cap(pos, he_cap, end);
1650                if (!pos)
1651                        goto out_err;
1652        }
1653
1654        /*
1655         * If adding more here, adjust code in main.c
1656         * that calculates local->scan_ies_len.
1657         */
1658
1659        return pos - buffer;
1660 out_err:
1661        WARN_ONCE(1, "not enough space for preq IEs\n");
1662 done:
1663        return pos - buffer;
1664}
1665
1666int ieee80211_build_preq_ies(struct ieee80211_local *local, u8 *buffer,
1667                             size_t buffer_len,
1668                             struct ieee80211_scan_ies *ie_desc,
1669                             const u8 *ie, size_t ie_len,
1670                             u8 bands_used, u32 *rate_masks,
1671                             struct cfg80211_chan_def *chandef,
1672                             u32 flags)
1673{
1674        size_t pos = 0, old_pos = 0, custom_ie_offset = 0;
1675        int i;
1676
1677        memset(ie_desc, 0, sizeof(*ie_desc));
1678
1679        for (i = 0; i < NUM_NL80211_BANDS; i++) {
1680                if (bands_used & BIT(i)) {
1681                        pos += ieee80211_build_preq_ies_band(local,
1682                                                             buffer + pos,
1683                                                             buffer_len - pos,
1684                                                             ie, ie_len, i,
1685                                                             rate_masks[i],
1686                                                             chandef,
1687                                                             &custom_ie_offset,
1688                                                             flags);
1689                        ie_desc->ies[i] = buffer + old_pos;
1690                        ie_desc->len[i] = pos - old_pos;
1691                        old_pos = pos;
1692                }
1693        }
1694
1695        /* add any remaining custom IEs */
1696        if (ie && ie_len) {
1697                if (WARN_ONCE(buffer_len - pos < ie_len - custom_ie_offset,
1698                              "not enough space for preq custom IEs\n"))
1699                        return pos;
1700                memcpy(buffer + pos, ie + custom_ie_offset,
1701                       ie_len - custom_ie_offset);
1702                ie_desc->common_ies = buffer + pos;
1703                ie_desc->common_ie_len = ie_len - custom_ie_offset;
1704                pos += ie_len - custom_ie_offset;
1705        }
1706
1707        return pos;
1708};
1709
1710struct sk_buff *ieee80211_build_probe_req(struct ieee80211_sub_if_data *sdata,
1711                                          const u8 *src, const u8 *dst,
1712                                          u32 ratemask,
1713                                          struct ieee80211_channel *chan,
1714                                          const u8 *ssid, size_t ssid_len,
1715                                          const u8 *ie, size_t ie_len,
1716                                          u32 flags)
1717{
1718        struct ieee80211_local *local = sdata->local;
1719        struct cfg80211_chan_def chandef;
1720        struct sk_buff *skb;
1721        struct ieee80211_mgmt *mgmt;
1722        int ies_len;
1723        u32 rate_masks[NUM_NL80211_BANDS] = {};
1724        struct ieee80211_scan_ies dummy_ie_desc;
1725
1726        /*
1727         * Do not send DS Channel parameter for directed probe requests
1728         * in order to maximize the chance that we get a response.  Some
1729         * badly-behaved APs don't respond when this parameter is included.
1730         */
1731        chandef.width = sdata->vif.bss_conf.chandef.width;
1732        if (flags & IEEE80211_PROBE_FLAG_DIRECTED)
1733                chandef.chan = NULL;
1734        else
1735                chandef.chan = chan;
1736
1737        skb = ieee80211_probereq_get(&local->hw, src, ssid, ssid_len,
1738                                     100 + ie_len);
1739        if (!skb)
1740                return NULL;
1741
1742        rate_masks[chan->band] = ratemask;
1743        ies_len = ieee80211_build_preq_ies(local, skb_tail_pointer(skb),
1744                                           skb_tailroom(skb), &dummy_ie_desc,
1745                                           ie, ie_len, BIT(chan->band),
1746                                           rate_masks, &chandef, flags);
1747        skb_put(skb, ies_len);
1748
1749        if (dst) {
1750                mgmt = (struct ieee80211_mgmt *) skb->data;
1751                memcpy(mgmt->da, dst, ETH_ALEN);
1752                memcpy(mgmt->bssid, dst, ETH_ALEN);
1753        }
1754
1755        IEEE80211_SKB_CB(skb)->flags |= IEEE80211_TX_INTFL_DONT_ENCRYPT;
1756
1757        return skb;
1758}
1759
1760u32 ieee80211_sta_get_rates(struct ieee80211_sub_if_data *sdata,
1761                            struct ieee802_11_elems *elems,
1762                            enum nl80211_band band, u32 *basic_rates)
1763{
1764        struct ieee80211_supported_band *sband;
1765        size_t num_rates;
1766        u32 supp_rates, rate_flags;
1767        int i, j, shift;
1768
1769        sband = sdata->local->hw.wiphy->bands[band];
1770        if (WARN_ON(!sband))
1771                return 1;
1772
1773        rate_flags = ieee80211_chandef_rate_flags(&sdata->vif.bss_conf.chandef);
1774        shift = ieee80211_vif_get_shift(&sdata->vif);
1775
1776        num_rates = sband->n_bitrates;
1777        supp_rates = 0;
1778        for (i = 0; i < elems->supp_rates_len +
1779                     elems->ext_supp_rates_len; i++) {
1780                u8 rate = 0;
1781                int own_rate;
1782                bool is_basic;
1783                if (i < elems->supp_rates_len)
1784                        rate = elems->supp_rates[i];
1785                else if (elems->ext_supp_rates)
1786                        rate = elems->ext_supp_rates
1787                                [i - elems->supp_rates_len];
1788                own_rate = 5 * (rate & 0x7f);
1789                is_basic = !!(rate & 0x80);
1790
1791                if (is_basic && (rate & 0x7f) == BSS_MEMBERSHIP_SELECTOR_HT_PHY)
1792                        continue;
1793
1794                for (j = 0; j < num_rates; j++) {
1795                        int brate;
1796                        if ((rate_flags & sband->bitrates[j].flags)
1797                            != rate_flags)
1798                                continue;
1799
1800                        brate = DIV_ROUND_UP(sband->bitrates[j].bitrate,
1801                                             1 << shift);
1802
1803                        if (brate == own_rate) {
1804                                supp_rates |= BIT(j);
1805                                if (basic_rates && is_basic)
1806                                        *basic_rates |= BIT(j);
1807                        }
1808                }
1809        }
1810        return supp_rates;
1811}
1812
1813void ieee80211_stop_device(struct ieee80211_local *local)
1814{
1815        ieee80211_led_radio(local, false);
1816        ieee80211_mod_tpt_led_trig(local, 0, IEEE80211_TPT_LEDTRIG_FL_RADIO);
1817
1818        cancel_work_sync(&local->reconfig_filter);
1819
1820        flush_workqueue(local->workqueue);
1821        drv_stop(local);
1822}
1823
1824static void ieee80211_flush_completed_scan(struct ieee80211_local *local,
1825                                           bool aborted)
1826{
1827        /* It's possible that we don't handle the scan completion in
1828         * time during suspend, so if it's still marked as completed
1829         * here, queue the work and flush it to clean things up.
1830         * Instead of calling the worker function directly here, we
1831         * really queue it to avoid potential races with other flows
1832         * scheduling the same work.
1833         */
1834        if (test_bit(SCAN_COMPLETED, &local->scanning)) {
1835                /* If coming from reconfiguration failure, abort the scan so
1836                 * we don't attempt to continue a partial HW scan - which is
1837                 * possible otherwise if (e.g.) the 2.4 GHz portion was the
1838                 * completed scan, and a 5 GHz portion is still pending.
1839                 */
1840                if (aborted)
1841                        set_bit(SCAN_ABORTED, &local->scanning);
1842                ieee80211_queue_delayed_work(&local->hw, &local->scan_work, 0);
1843                flush_delayed_work(&local->scan_work);
1844        }
1845}
1846
1847static void ieee80211_handle_reconfig_failure(struct ieee80211_local *local)
1848{
1849        struct ieee80211_sub_if_data *sdata;
1850        struct ieee80211_chanctx *ctx;
1851
1852        /*
1853         * We get here if during resume the device can't be restarted properly.
1854         * We might also get here if this happens during HW reset, which is a
1855         * slightly different situation and we need to drop all connections in
1856         * the latter case.
1857         *
1858         * Ask cfg80211 to turn off all interfaces, this will result in more
1859         * warnings but at least we'll then get into a clean stopped state.
1860         */
1861
1862        local->resuming = false;
1863        local->suspended = false;
1864        local->in_reconfig = false;
1865
1866        ieee80211_flush_completed_scan(local, true);
1867
1868        /* scheduled scan clearly can't be running any more, but tell
1869         * cfg80211 and clear local state
1870         */
1871        ieee80211_sched_scan_end(local);
1872
1873        list_for_each_entry(sdata, &local->interfaces, list)
1874                sdata->flags &= ~IEEE80211_SDATA_IN_DRIVER;
1875
1876        /* Mark channel contexts as not being in the driver any more to avoid
1877         * removing them from the driver during the shutdown process...
1878         */
1879        mutex_lock(&local->chanctx_mtx);
1880        list_for_each_entry(ctx, &local->chanctx_list, list)
1881                ctx->driver_present = false;
1882        mutex_unlock(&local->chanctx_mtx);
1883
1884        cfg80211_shutdown_all_interfaces(local->hw.wiphy);
1885}
1886
1887static void ieee80211_assign_chanctx(struct ieee80211_local *local,
1888                                     struct ieee80211_sub_if_data *sdata)
1889{
1890        struct ieee80211_chanctx_conf *conf;
1891        struct ieee80211_chanctx *ctx;
1892
1893        if (!local->use_chanctx)
1894                return;
1895
1896        mutex_lock(&local->chanctx_mtx);
1897        conf = rcu_dereference_protected(sdata->vif.chanctx_conf,
1898                                         lockdep_is_held(&local->chanctx_mtx));
1899        if (conf) {
1900                ctx = container_of(conf, struct ieee80211_chanctx, conf);
1901                drv_assign_vif_chanctx(local, sdata, ctx);
1902        }
1903        mutex_unlock(&local->chanctx_mtx);
1904}
1905
1906static void ieee80211_reconfig_stations(struct ieee80211_sub_if_data *sdata)
1907{
1908        struct ieee80211_local *local = sdata->local;
1909        struct sta_info *sta;
1910
1911        /* add STAs back */
1912        mutex_lock(&local->sta_mtx);
1913        list_for_each_entry(sta, &local->sta_list, list) {
1914                enum ieee80211_sta_state state;
1915
1916                if (!sta->uploaded || sta->sdata != sdata)
1917                        continue;
1918
1919                for (state = IEEE80211_STA_NOTEXIST;
1920                     state < sta->sta_state; state++)
1921                        WARN_ON(drv_sta_state(local, sta->sdata, sta, state,
1922                                              state + 1));
1923        }
1924        mutex_unlock(&local->sta_mtx);
1925}
1926
1927static int ieee80211_reconfig_nan(struct ieee80211_sub_if_data *sdata)
1928{
1929        struct cfg80211_nan_func *func, **funcs;
1930        int res, id, i = 0;
1931
1932        res = drv_start_nan(sdata->local, sdata,
1933                            &sdata->u.nan.conf);
1934        if (WARN_ON(res))
1935                return res;
1936
1937        funcs = kcalloc(sdata->local->hw.max_nan_de_entries + 1,
1938                        sizeof(*funcs),
1939                        GFP_KERNEL);
1940        if (!funcs)
1941                return -ENOMEM;
1942
1943        /* Add all the functions:
1944         * This is a little bit ugly. We need to call a potentially sleeping
1945         * callback for each NAN function, so we can't hold the spinlock.
1946         */
1947        spin_lock_bh(&sdata->u.nan.func_lock);
1948
1949        idr_for_each_entry(&sdata->u.nan.function_inst_ids, func, id)
1950                funcs[i++] = func;
1951
1952        spin_unlock_bh(&sdata->u.nan.func_lock);
1953
1954        for (i = 0; funcs[i]; i++) {
1955                res = drv_add_nan_func(sdata->local, sdata, funcs[i]);
1956                if (WARN_ON(res))
1957                        ieee80211_nan_func_terminated(&sdata->vif,
1958                                                      funcs[i]->instance_id,
1959                                                      NL80211_NAN_FUNC_TERM_REASON_ERROR,
1960                                                      GFP_KERNEL);
1961        }
1962
1963        kfree(funcs);
1964
1965        return 0;
1966}
1967
1968int ieee80211_reconfig(struct ieee80211_local *local)
1969{
1970        struct ieee80211_hw *hw = &local->hw;
1971        struct ieee80211_sub_if_data *sdata;
1972        struct ieee80211_chanctx *ctx;
1973        struct sta_info *sta;
1974        int res, i;
1975        bool reconfig_due_to_wowlan = false;
1976        struct ieee80211_sub_if_data *sched_scan_sdata;
1977        struct cfg80211_sched_scan_request *sched_scan_req;
1978        bool sched_scan_stopped = false;
1979        bool suspended = local->suspended;
1980
1981        /* nothing to do if HW shouldn't run */
1982        if (!local->open_count)
1983                goto wake_up;
1984
1985#ifdef CONFIG_PM
1986        if (suspended)
1987                local->resuming = true;
1988
1989        if (local->wowlan) {
1990                /*
1991                 * In the wowlan case, both mac80211 and the device
1992                 * are functional when the resume op is called, so
1993                 * clear local->suspended so the device could operate
1994                 * normally (e.g. pass rx frames).
1995                 */
1996                local->suspended = false;
1997                res = drv_resume(local);
1998                local->wowlan = false;
1999                if (res < 0) {
2000                        local->resuming = false;
2001                        return res;
2002                }
2003                if (res == 0)
2004                        goto wake_up;
2005                WARN_ON(res > 1);
2006                /*
2007                 * res is 1, which means the driver requested
2008                 * to go through a regular reset on wakeup.
2009                 * restore local->suspended in this case.
2010                 */
2011                reconfig_due_to_wowlan = true;
2012                local->suspended = true;
2013        }
2014#endif
2015
2016        /*
2017         * In case of hw_restart during suspend (without wowlan),
2018         * cancel restart work, as we are reconfiguring the device
2019         * anyway.
2020         * Note that restart_work is scheduled on a frozen workqueue,
2021         * so we can't deadlock in this case.
2022         */
2023        if (suspended && local->in_reconfig && !reconfig_due_to_wowlan)
2024                cancel_work_sync(&local->restart_work);
2025
2026        local->started = false;
2027
2028        /*
2029         * Upon resume hardware can sometimes be goofy due to
2030         * various platform / driver / bus issues, so restarting
2031         * the device may at times not work immediately. Propagate
2032         * the error.
2033         */
2034        res = drv_start(local);
2035        if (res) {
2036                if (suspended)
2037                        WARN(1, "Hardware became unavailable upon resume. This could be a software issue prior to suspend or a hardware issue.\n");
2038                else
2039                        WARN(1, "Hardware became unavailable during restart.\n");
2040                ieee80211_handle_reconfig_failure(local);
2041                return res;
2042        }
2043
2044        /* setup fragmentation threshold */
2045        drv_set_frag_threshold(local, hw->wiphy->frag_threshold);
2046
2047        /* setup RTS threshold */
2048        drv_set_rts_threshold(local, hw->wiphy->rts_threshold);
2049
2050        /* reset coverage class */
2051        drv_set_coverage_class(local, hw->wiphy->coverage_class);
2052
2053        ieee80211_led_radio(local, true);
2054        ieee80211_mod_tpt_led_trig(local,
2055                                   IEEE80211_TPT_LEDTRIG_FL_RADIO, 0);
2056
2057        /* add interfaces */
2058        sdata = rtnl_dereference(local->monitor_sdata);
2059        if (sdata) {
2060                /* in HW restart it exists already */
2061                WARN_ON(local->resuming);
2062                res = drv_add_interface(local, sdata);
2063                if (WARN_ON(res)) {
2064                        RCU_INIT_POINTER(local->monitor_sdata, NULL);
2065                        synchronize_net();
2066                        kfree(sdata);
2067                }
2068        }
2069
2070        list_for_each_entry(sdata, &local->interfaces, list) {
2071                if (sdata->vif.type != NL80211_IFTYPE_AP_VLAN &&
2072                    sdata->vif.type != NL80211_IFTYPE_MONITOR &&
2073                    ieee80211_sdata_running(sdata)) {
2074                        res = drv_add_interface(local, sdata);
2075                        if (WARN_ON(res))
2076                                break;
2077                }
2078        }
2079
2080        /* If adding any of the interfaces failed above, roll back and
2081         * report failure.
2082         */
2083        if (res) {
2084                list_for_each_entry_continue_reverse(sdata, &local->interfaces,
2085                                                     list)
2086                        if (sdata->vif.type != NL80211_IFTYPE_AP_VLAN &&
2087                            sdata->vif.type != NL80211_IFTYPE_MONITOR &&
2088                            ieee80211_sdata_running(sdata))
2089                                drv_remove_interface(local, sdata);
2090                ieee80211_handle_reconfig_failure(local);
2091                return res;
2092        }
2093
2094        /* add channel contexts */
2095        if (local->use_chanctx) {
2096                mutex_lock(&local->chanctx_mtx);
2097                list_for_each_entry(ctx, &local->chanctx_list, list)
2098                        if (ctx->replace_state !=
2099                            IEEE80211_CHANCTX_REPLACES_OTHER)
2100                                WARN_ON(drv_add_chanctx(local, ctx));
2101                mutex_unlock(&local->chanctx_mtx);
2102
2103                sdata = rtnl_dereference(local->monitor_sdata);
2104                if (sdata && ieee80211_sdata_running(sdata))
2105                        ieee80211_assign_chanctx(local, sdata);
2106        }
2107
2108        /* reconfigure hardware */
2109        ieee80211_hw_config(local, ~0);
2110
2111        ieee80211_configure_filter(local);
2112
2113        /* Finally also reconfigure all the BSS information */
2114        list_for_each_entry(sdata, &local->interfaces, list) {
2115                u32 changed;
2116
2117                if (!ieee80211_sdata_running(sdata))
2118                        continue;
2119
2120                ieee80211_assign_chanctx(local, sdata);
2121
2122                switch (sdata->vif.type) {
2123                case NL80211_IFTYPE_AP_VLAN:
2124                case NL80211_IFTYPE_MONITOR:
2125                        break;
2126                default:
2127                        ieee80211_reconfig_stations(sdata);
2128                        /* fall through */
2129                case NL80211_IFTYPE_AP: /* AP stations are handled later */
2130                        for (i = 0; i < IEEE80211_NUM_ACS; i++)
2131                                drv_conf_tx(local, sdata, i,
2132                                            &sdata->tx_conf[i]);
2133                        break;
2134                }
2135
2136                /* common change flags for all interface types */
2137                changed = BSS_CHANGED_ERP_CTS_PROT |
2138                          BSS_CHANGED_ERP_PREAMBLE |
2139                          BSS_CHANGED_ERP_SLOT |
2140                          BSS_CHANGED_HT |
2141                          BSS_CHANGED_BASIC_RATES |
2142                          BSS_CHANGED_BEACON_INT |
2143                          BSS_CHANGED_BSSID |
2144                          BSS_CHANGED_CQM |
2145                          BSS_CHANGED_QOS |
2146                          BSS_CHANGED_IDLE |
2147                          BSS_CHANGED_TXPOWER |
2148                          BSS_CHANGED_MCAST_RATE;
2149
2150                if (sdata->vif.mu_mimo_owner)
2151                        changed |= BSS_CHANGED_MU_GROUPS;
2152
2153                switch (sdata->vif.type) {
2154                case NL80211_IFTYPE_STATION:
2155                        changed |= BSS_CHANGED_ASSOC |
2156                                   BSS_CHANGED_ARP_FILTER |
2157                                   BSS_CHANGED_PS;
2158
2159                        /* Re-send beacon info report to the driver */
2160                        if (sdata->u.mgd.have_beacon)
2161                                changed |= BSS_CHANGED_BEACON_INFO;
2162
2163                        if (sdata->vif.bss_conf.max_idle_period ||
2164                            sdata->vif.bss_conf.protected_keep_alive)
2165                                changed |= BSS_CHANGED_KEEP_ALIVE;
2166
2167                        sdata_lock(sdata);
2168                        ieee80211_bss_info_change_notify(sdata, changed);
2169                        sdata_unlock(sdata);
2170                        break;
2171                case NL80211_IFTYPE_OCB:
2172                        changed |= BSS_CHANGED_OCB;
2173                        ieee80211_bss_info_change_notify(sdata, changed);
2174                        break;
2175                case NL80211_IFTYPE_ADHOC:
2176                        changed |= BSS_CHANGED_IBSS;
2177                        /* fall through */
2178                case NL80211_IFTYPE_AP:
2179                        changed |= BSS_CHANGED_SSID | BSS_CHANGED_P2P_PS;
2180
2181                        if (sdata->vif.bss_conf.ftm_responder == 1 &&
2182                            wiphy_ext_feature_isset(sdata->local->hw.wiphy,
2183                                        NL80211_EXT_FEATURE_ENABLE_FTM_RESPONDER))
2184                                changed |= BSS_CHANGED_FTM_RESPONDER;
2185
2186                        if (sdata->vif.type == NL80211_IFTYPE_AP) {
2187                                changed |= BSS_CHANGED_AP_PROBE_RESP;
2188
2189                                if (rcu_access_pointer(sdata->u.ap.beacon))
2190                                        drv_start_ap(local, sdata);
2191                        }
2192
2193                        /* fall through */
2194                case NL80211_IFTYPE_MESH_POINT:
2195                        if (sdata->vif.bss_conf.enable_beacon) {
2196                                changed |= BSS_CHANGED_BEACON |
2197                                           BSS_CHANGED_BEACON_ENABLED;
2198                                ieee80211_bss_info_change_notify(sdata, changed);
2199                        }
2200                        break;
2201                case NL80211_IFTYPE_NAN:
2202                        res = ieee80211_reconfig_nan(sdata);
2203                        if (res < 0) {
2204                                ieee80211_handle_reconfig_failure(local);
2205                                return res;
2206                        }
2207                        break;
2208                case NL80211_IFTYPE_WDS:
2209                case NL80211_IFTYPE_AP_VLAN:
2210                case NL80211_IFTYPE_MONITOR:
2211                case NL80211_IFTYPE_P2P_DEVICE:
2212                        /* nothing to do */
2213                        break;
2214                case NL80211_IFTYPE_UNSPECIFIED:
2215                case NUM_NL80211_IFTYPES:
2216                case NL80211_IFTYPE_P2P_CLIENT:
2217                case NL80211_IFTYPE_P2P_GO:
2218                        WARN_ON(1);
2219                        break;
2220                }
2221        }
2222
2223        ieee80211_recalc_ps(local);
2224
2225        /*
2226         * The sta might be in psm against the ap (e.g. because
2227         * this was the state before a hw restart), so we
2228         * explicitly send a null packet in order to make sure
2229         * it'll sync against the ap (and get out of psm).
2230         */
2231        if (!(local->hw.conf.flags & IEEE80211_CONF_PS)) {
2232                list_for_each_entry(sdata, &local->interfaces, list) {
2233                        if (sdata->vif.type != NL80211_IFTYPE_STATION)
2234                                continue;
2235                        if (!sdata->u.mgd.associated)
2236                                continue;
2237
2238                        ieee80211_send_nullfunc(local, sdata, false);
2239                }
2240        }
2241
2242        /* APs are now beaconing, add back stations */
2243        mutex_lock(&local->sta_mtx);
2244        list_for_each_entry(sta, &local->sta_list, list) {
2245                enum ieee80211_sta_state state;
2246
2247                if (!sta->uploaded)
2248                        continue;
2249
2250                if (sta->sdata->vif.type != NL80211_IFTYPE_AP &&
2251                    sta->sdata->vif.type != NL80211_IFTYPE_AP_VLAN)
2252                        continue;
2253
2254                for (state = IEEE80211_STA_NOTEXIST;
2255                     state < sta->sta_state; state++)
2256                        WARN_ON(drv_sta_state(local, sta->sdata, sta, state,
2257                                              state + 1));
2258        }
2259        mutex_unlock(&local->sta_mtx);
2260
2261        /* add back keys */
2262        list_for_each_entry(sdata, &local->interfaces, list)
2263                ieee80211_reset_crypto_tx_tailroom(sdata);
2264
2265        list_for_each_entry(sdata, &local->interfaces, list)
2266                if (ieee80211_sdata_running(sdata))
2267                        ieee80211_enable_keys(sdata);
2268
2269        /* Reconfigure sched scan if it was interrupted by FW restart */
2270        mutex_lock(&local->mtx);
2271        sched_scan_sdata = rcu_dereference_protected(local->sched_scan_sdata,
2272                                                lockdep_is_held(&local->mtx));
2273        sched_scan_req = rcu_dereference_protected(local->sched_scan_req,
2274                                                lockdep_is_held(&local->mtx));
2275        if (sched_scan_sdata && sched_scan_req)
2276                /*
2277                 * Sched scan stopped, but we don't want to report it. Instead,
2278                 * we're trying to reschedule. However, if more than one scan
2279                 * plan was set, we cannot reschedule since we don't know which
2280                 * scan plan was currently running (and some scan plans may have
2281                 * already finished).
2282                 */
2283                if (sched_scan_req->n_scan_plans > 1 ||
2284                    __ieee80211_request_sched_scan_start(sched_scan_sdata,
2285                                                         sched_scan_req)) {
2286                        RCU_INIT_POINTER(local->sched_scan_sdata, NULL);
2287                        RCU_INIT_POINTER(local->sched_scan_req, NULL);
2288                        sched_scan_stopped = true;
2289                }
2290        mutex_unlock(&local->mtx);
2291
2292        if (sched_scan_stopped)
2293                cfg80211_sched_scan_stopped_rtnl(local->hw.wiphy, 0);
2294
2295 wake_up:
2296
2297        if (local->monitors == local->open_count && local->monitors > 0)
2298                ieee80211_add_virtual_monitor(local);
2299
2300        /*
2301         * Clear the WLAN_STA_BLOCK_BA flag so new aggregation
2302         * sessions can be established after a resume.
2303         *
2304         * Also tear down aggregation sessions since reconfiguring
2305         * them in a hardware restart scenario is not easily done
2306         * right now, and the hardware will have lost information
2307         * about the sessions, but we and the AP still think they
2308         * are active. This is really a workaround though.
2309         */
2310        if (ieee80211_hw_check(hw, AMPDU_AGGREGATION)) {
2311                mutex_lock(&local->sta_mtx);
2312
2313                list_for_each_entry(sta, &local->sta_list, list) {
2314                        if (!local->resuming)
2315                                ieee80211_sta_tear_down_BA_sessions(
2316                                                sta, AGG_STOP_LOCAL_REQUEST);
2317                        clear_sta_flag(sta, WLAN_STA_BLOCK_BA);
2318                }
2319
2320                mutex_unlock(&local->sta_mtx);
2321        }
2322
2323        if (local->in_reconfig) {
2324                local->in_reconfig = false;
2325                barrier();
2326
2327                /* Restart deferred ROCs */
2328                mutex_lock(&local->mtx);
2329                ieee80211_start_next_roc(local);
2330                mutex_unlock(&local->mtx);
2331        }
2332
2333        ieee80211_wake_queues_by_reason(hw, IEEE80211_MAX_QUEUE_MAP,
2334                                        IEEE80211_QUEUE_STOP_REASON_SUSPEND,
2335                                        false);
2336
2337        /*
2338         * If this is for hw restart things are still running.
2339         * We may want to change that later, however.
2340         */
2341        if (local->open_count && (!suspended || reconfig_due_to_wowlan))
2342                drv_reconfig_complete(local, IEEE80211_RECONFIG_TYPE_RESTART);
2343
2344        if (!suspended)
2345                return 0;
2346
2347#ifdef CONFIG_PM
2348        /* first set suspended false, then resuming */
2349        local->suspended = false;
2350        mb();
2351        local->resuming = false;
2352
2353        ieee80211_flush_completed_scan(local, false);
2354
2355        if (local->open_count && !reconfig_due_to_wowlan)
2356                drv_reconfig_complete(local, IEEE80211_RECONFIG_TYPE_SUSPEND);
2357
2358        list_for_each_entry(sdata, &local->interfaces, list) {
2359                if (!ieee80211_sdata_running(sdata))
2360                        continue;
2361                if (sdata->vif.type == NL80211_IFTYPE_STATION)
2362                        ieee80211_sta_restart(sdata);
2363        }
2364
2365        mod_timer(&local->sta_cleanup, jiffies + 1);
2366#else
2367        WARN_ON(1);
2368#endif
2369
2370        return 0;
2371}
2372
2373void ieee80211_resume_disconnect(struct ieee80211_vif *vif)
2374{
2375        struct ieee80211_sub_if_data *sdata;
2376        struct ieee80211_local *local;
2377        struct ieee80211_key *key;
2378
2379        if (WARN_ON(!vif))
2380                return;
2381
2382        sdata = vif_to_sdata(vif);
2383        local = sdata->local;
2384
2385        if (WARN_ON(!local->resuming))
2386                return;
2387
2388        if (WARN_ON(vif->type != NL80211_IFTYPE_STATION))
2389                return;
2390
2391        sdata->flags |= IEEE80211_SDATA_DISCONNECT_RESUME;
2392
2393        mutex_lock(&local->key_mtx);
2394        list_for_each_entry(key, &sdata->key_list, list)
2395                key->flags |= KEY_FLAG_TAINTED;
2396        mutex_unlock(&local->key_mtx);
2397}
2398EXPORT_SYMBOL_GPL(ieee80211_resume_disconnect);
2399
2400void ieee80211_recalc_smps(struct ieee80211_sub_if_data *sdata)
2401{
2402        struct ieee80211_local *local = sdata->local;
2403        struct ieee80211_chanctx_conf *chanctx_conf;
2404        struct ieee80211_chanctx *chanctx;
2405
2406        mutex_lock(&local->chanctx_mtx);
2407
2408        chanctx_conf = rcu_dereference_protected(sdata->vif.chanctx_conf,
2409                                        lockdep_is_held(&local->chanctx_mtx));
2410
2411        /*
2412         * This function can be called from a work, thus it may be possible
2413         * that the chanctx_conf is removed (due to a disconnection, for
2414         * example).
2415         * So nothing should be done in such case.
2416         */
2417        if (!chanctx_conf)
2418                goto unlock;
2419
2420        chanctx = container_of(chanctx_conf, struct ieee80211_chanctx, conf);
2421        ieee80211_recalc_smps_chanctx(local, chanctx);
2422 unlock:
2423        mutex_unlock(&local->chanctx_mtx);
2424}
2425
2426void ieee80211_recalc_min_chandef(struct ieee80211_sub_if_data *sdata)
2427{
2428        struct ieee80211_local *local = sdata->local;
2429        struct ieee80211_chanctx_conf *chanctx_conf;
2430        struct ieee80211_chanctx *chanctx;
2431
2432        mutex_lock(&local->chanctx_mtx);
2433
2434        chanctx_conf = rcu_dereference_protected(sdata->vif.chanctx_conf,
2435                                        lockdep_is_held(&local->chanctx_mtx));
2436
2437        if (WARN_ON_ONCE(!chanctx_conf))
2438                goto unlock;
2439
2440        chanctx = container_of(chanctx_conf, struct ieee80211_chanctx, conf);
2441        ieee80211_recalc_chanctx_min_def(local, chanctx);
2442 unlock:
2443        mutex_unlock(&local->chanctx_mtx);
2444}
2445
2446size_t ieee80211_ie_split_vendor(const u8 *ies, size_t ielen, size_t offset)
2447{
2448        size_t pos = offset;
2449
2450        while (pos < ielen && ies[pos] != WLAN_EID_VENDOR_SPECIFIC)
2451                pos += 2 + ies[pos + 1];
2452
2453        return pos;
2454}
2455
2456static void _ieee80211_enable_rssi_reports(struct ieee80211_sub_if_data *sdata,
2457                                            int rssi_min_thold,
2458                                            int rssi_max_thold)
2459{
2460        trace_api_enable_rssi_reports(sdata, rssi_min_thold, rssi_max_thold);
2461
2462        if (WARN_ON(sdata->vif.type != NL80211_IFTYPE_STATION))
2463                return;
2464
2465        /*
2466         * Scale up threshold values before storing it, as the RSSI averaging
2467         * algorithm uses a scaled up value as well. Change this scaling
2468         * factor if the RSSI averaging algorithm changes.
2469         */
2470        sdata->u.mgd.rssi_min_thold = rssi_min_thold*16;
2471        sdata->u.mgd.rssi_max_thold = rssi_max_thold*16;
2472}
2473
2474void ieee80211_enable_rssi_reports(struct ieee80211_vif *vif,
2475                                    int rssi_min_thold,
2476                                    int rssi_max_thold)
2477{
2478        struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif);
2479
2480        WARN_ON(rssi_min_thold == rssi_max_thold ||
2481                rssi_min_thold > rssi_max_thold);
2482
2483        _ieee80211_enable_rssi_reports(sdata, rssi_min_thold,
2484                                       rssi_max_thold);
2485}
2486EXPORT_SYMBOL(ieee80211_enable_rssi_reports);
2487
2488void ieee80211_disable_rssi_reports(struct ieee80211_vif *vif)
2489{
2490        struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif);
2491
2492        _ieee80211_enable_rssi_reports(sdata, 0, 0);
2493}
2494EXPORT_SYMBOL(ieee80211_disable_rssi_reports);
2495
2496u8 *ieee80211_ie_build_ht_cap(u8 *pos, struct ieee80211_sta_ht_cap *ht_cap,
2497                              u16 cap)
2498{
2499        __le16 tmp;
2500
2501        *pos++ = WLAN_EID_HT_CAPABILITY;
2502        *pos++ = sizeof(struct ieee80211_ht_cap);
2503        memset(pos, 0, sizeof(struct ieee80211_ht_cap));
2504
2505        /* capability flags */
2506        tmp = cpu_to_le16(cap);
2507        memcpy(pos, &tmp, sizeof(u16));
2508        pos += sizeof(u16);
2509
2510        /* AMPDU parameters */
2511        *pos++ = ht_cap->ampdu_factor |
2512                 (ht_cap->ampdu_density <<
2513                        IEEE80211_HT_AMPDU_PARM_DENSITY_SHIFT);
2514
2515        /* MCS set */
2516        memcpy(pos, &ht_cap->mcs, sizeof(ht_cap->mcs));
2517        pos += sizeof(ht_cap->mcs);
2518
2519        /* extended capabilities */
2520        pos += sizeof(__le16);
2521
2522        /* BF capabilities */
2523        pos += sizeof(__le32);
2524
2525        /* antenna selection */
2526        pos += sizeof(u8);
2527
2528        return pos;
2529}
2530
2531u8 *ieee80211_ie_build_vht_cap(u8 *pos, struct ieee80211_sta_vht_cap *vht_cap,
2532                               u32 cap)
2533{
2534        __le32 tmp;
2535
2536        *pos++ = WLAN_EID_VHT_CAPABILITY;
2537        *pos++ = sizeof(struct ieee80211_vht_cap);
2538        memset(pos, 0, sizeof(struct ieee80211_vht_cap));
2539
2540        /* capability flags */
2541        tmp = cpu_to_le32(cap);
2542        memcpy(pos, &tmp, sizeof(u32));
2543        pos += sizeof(u32);
2544
2545        /* VHT MCS set */
2546        memcpy(pos, &vht_cap->vht_mcs, sizeof(vht_cap->vht_mcs));
2547        pos += sizeof(vht_cap->vht_mcs);
2548
2549        return pos;
2550}
2551
2552u8 *ieee80211_ie_build_he_cap(u8 *pos,
2553                              const struct ieee80211_sta_he_cap *he_cap,
2554                              u8 *end)
2555{
2556        u8 n;
2557        u8 ie_len;
2558        u8 *orig_pos = pos;
2559
2560        /* Make sure we have place for the IE */
2561        /*
2562         * TODO: the 1 added is because this temporarily is under the EXTENSION
2563         * IE. Get rid of it when it moves.
2564         */
2565        if (!he_cap)
2566                return orig_pos;
2567
2568        n = ieee80211_he_mcs_nss_size(&he_cap->he_cap_elem);
2569        ie_len = 2 + 1 +
2570                 sizeof(he_cap->he_cap_elem) + n +
2571                 ieee80211_he_ppe_size(he_cap->ppe_thres[0],
2572                                       he_cap->he_cap_elem.phy_cap_info);
2573
2574        if ((end - pos) < ie_len)
2575                return orig_pos;
2576
2577        *pos++ = WLAN_EID_EXTENSION;
2578        pos++; /* We'll set the size later below */
2579        *pos++ = WLAN_EID_EXT_HE_CAPABILITY;
2580
2581        /* Fixed data */
2582        memcpy(pos, &he_cap->he_cap_elem, sizeof(he_cap->he_cap_elem));
2583        pos += sizeof(he_cap->he_cap_elem);
2584
2585        memcpy(pos, &he_cap->he_mcs_nss_supp, n);
2586        pos += n;
2587
2588        /* Check if PPE Threshold should be present */
2589        if ((he_cap->he_cap_elem.phy_cap_info[6] &
2590             IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT) == 0)
2591                goto end;
2592
2593        /*
2594         * Calculate how many PPET16/PPET8 pairs are to come. Algorithm:
2595         * (NSS_M1 + 1) x (num of 1 bits in RU_INDEX_BITMASK)
2596         */
2597        n = hweight8(he_cap->ppe_thres[0] &
2598                     IEEE80211_PPE_THRES_RU_INDEX_BITMASK_MASK);
2599        n *= (1 + ((he_cap->ppe_thres[0] & IEEE80211_PPE_THRES_NSS_MASK) >>
2600                   IEEE80211_PPE_THRES_NSS_POS));
2601
2602        /*
2603         * Each pair is 6 bits, and we need to add the 7 "header" bits to the
2604         * total size.
2605         */
2606        n = (n * IEEE80211_PPE_THRES_INFO_PPET_SIZE * 2) + 7;
2607        n = DIV_ROUND_UP(n, 8);
2608
2609        /* Copy PPE Thresholds */
2610        memcpy(pos, &he_cap->ppe_thres, n);
2611        pos += n;
2612
2613end:
2614        orig_pos[1] = (pos - orig_pos) - 2;
2615        return pos;
2616}
2617
2618u8 *ieee80211_ie_build_ht_oper(u8 *pos, struct ieee80211_sta_ht_cap *ht_cap,
2619                               const struct cfg80211_chan_def *chandef,
2620                               u16 prot_mode, bool rifs_mode)
2621{
2622        struct ieee80211_ht_operation *ht_oper;
2623        /* Build HT Information */
2624        *pos++ = WLAN_EID_HT_OPERATION;
2625        *pos++ = sizeof(struct ieee80211_ht_operation);
2626        ht_oper = (struct ieee80211_ht_operation *)pos;
2627        ht_oper->primary_chan = ieee80211_frequency_to_channel(
2628                                        chandef->chan->center_freq);
2629        switch (chandef->width) {
2630        case NL80211_CHAN_WIDTH_160:
2631        case NL80211_CHAN_WIDTH_80P80:
2632        case NL80211_CHAN_WIDTH_80:
2633        case NL80211_CHAN_WIDTH_40:
2634                if (chandef->center_freq1 > chandef->chan->center_freq)
2635                        ht_oper->ht_param = IEEE80211_HT_PARAM_CHA_SEC_ABOVE;
2636                else
2637                        ht_oper->ht_param = IEEE80211_HT_PARAM_CHA_SEC_BELOW;
2638                break;
2639        default:
2640                ht_oper->ht_param = IEEE80211_HT_PARAM_CHA_SEC_NONE;
2641                break;
2642        }
2643        if (ht_cap->cap & IEEE80211_HT_CAP_SUP_WIDTH_20_40 &&
2644            chandef->width != NL80211_CHAN_WIDTH_20_NOHT &&
2645            chandef->width != NL80211_CHAN_WIDTH_20)
2646                ht_oper->ht_param |= IEEE80211_HT_PARAM_CHAN_WIDTH_ANY;
2647
2648        if (rifs_mode)
2649                ht_oper->ht_param |= IEEE80211_HT_PARAM_RIFS_MODE;
2650
2651        ht_oper->operation_mode = cpu_to_le16(prot_mode);
2652        ht_oper->stbc_param = 0x0000;
2653
2654        /* It seems that Basic MCS set and Supported MCS set
2655           are identical for the first 10 bytes */
2656        memset(&ht_oper->basic_set, 0, 16);
2657        memcpy(&ht_oper->basic_set, &ht_cap->mcs, 10);
2658
2659        return pos + sizeof(struct ieee80211_ht_operation);
2660}
2661
2662void ieee80211_ie_build_wide_bw_cs(u8 *pos,
2663                                   const struct cfg80211_chan_def *chandef)
2664{
2665        *pos++ = WLAN_EID_WIDE_BW_CHANNEL_SWITCH;       /* EID */
2666        *pos++ = 3;                                     /* IE length */
2667        /* New channel width */
2668        switch (chandef->width) {
2669        case NL80211_CHAN_WIDTH_80:
2670                *pos++ = IEEE80211_VHT_CHANWIDTH_80MHZ;
2671                break;
2672        case NL80211_CHAN_WIDTH_160:
2673                *pos++ = IEEE80211_VHT_CHANWIDTH_160MHZ;
2674                break;
2675        case NL80211_CHAN_WIDTH_80P80:
2676                *pos++ = IEEE80211_VHT_CHANWIDTH_80P80MHZ;
2677                break;
2678        default:
2679                *pos++ = IEEE80211_VHT_CHANWIDTH_USE_HT;
2680        }
2681
2682        /* new center frequency segment 0 */
2683        *pos++ = ieee80211_frequency_to_channel(chandef->center_freq1);
2684        /* new center frequency segment 1 */
2685        if (chandef->center_freq2)
2686                *pos++ = ieee80211_frequency_to_channel(chandef->center_freq2);
2687        else
2688                *pos++ = 0;
2689}
2690
2691u8 *ieee80211_ie_build_vht_oper(u8 *pos, struct ieee80211_sta_vht_cap *vht_cap,
2692                                const struct cfg80211_chan_def *chandef)
2693{
2694        struct ieee80211_vht_operation *vht_oper;
2695
2696        *pos++ = WLAN_EID_VHT_OPERATION;
2697        *pos++ = sizeof(struct ieee80211_vht_operation);
2698        vht_oper = (struct ieee80211_vht_operation *)pos;
2699        vht_oper->center_freq_seg0_idx = ieee80211_frequency_to_channel(
2700                                                        chandef->center_freq1);
2701        if (chandef->center_freq2)
2702                vht_oper->center_freq_seg1_idx =
2703                        ieee80211_frequency_to_channel(chandef->center_freq2);
2704        else
2705                vht_oper->center_freq_seg1_idx = 0x00;
2706
2707        switch (chandef->width) {
2708        case NL80211_CHAN_WIDTH_160:
2709                /*
2710                 * Convert 160 MHz channel width to new style as interop
2711                 * workaround.
2712                 */
2713                vht_oper->chan_width = IEEE80211_VHT_CHANWIDTH_80MHZ;
2714                vht_oper->center_freq_seg1_idx = vht_oper->center_freq_seg0_idx;
2715                if (chandef->chan->center_freq < chandef->center_freq1)
2716                        vht_oper->center_freq_seg0_idx -= 8;
2717                else
2718                        vht_oper->center_freq_seg0_idx += 8;
2719                break;
2720        case NL80211_CHAN_WIDTH_80P80:
2721                /*
2722                 * Convert 80+80 MHz channel width to new style as interop
2723                 * workaround.
2724                 */
2725                vht_oper->chan_width = IEEE80211_VHT_CHANWIDTH_80MHZ;
2726                break;
2727        case NL80211_CHAN_WIDTH_80:
2728                vht_oper->chan_width = IEEE80211_VHT_CHANWIDTH_80MHZ;
2729                break;
2730        default:
2731                vht_oper->chan_width = IEEE80211_VHT_CHANWIDTH_USE_HT;
2732                break;
2733        }
2734
2735        /* don't require special VHT peer rates */
2736        vht_oper->basic_mcs_set = cpu_to_le16(0xffff);
2737
2738        return pos + sizeof(struct ieee80211_vht_operation);
2739}
2740
2741bool ieee80211_chandef_ht_oper(const struct ieee80211_ht_operation *ht_oper,
2742                               struct cfg80211_chan_def *chandef)
2743{
2744        enum nl80211_channel_type channel_type;
2745
2746        if (!ht_oper)
2747                return false;
2748
2749        switch (ht_oper->ht_param & IEEE80211_HT_PARAM_CHA_SEC_OFFSET) {
2750        case IEEE80211_HT_PARAM_CHA_SEC_NONE:
2751                channel_type = NL80211_CHAN_HT20;
2752                break;
2753        case IEEE80211_HT_PARAM_CHA_SEC_ABOVE:
2754                channel_type = NL80211_CHAN_HT40PLUS;
2755                break;
2756        case IEEE80211_HT_PARAM_CHA_SEC_BELOW:
2757                channel_type = NL80211_CHAN_HT40MINUS;
2758                break;
2759        default:
2760                channel_type = NL80211_CHAN_NO_HT;
2761                return false;
2762        }
2763
2764        cfg80211_chandef_create(chandef, chandef->chan, channel_type);
2765        return true;
2766}
2767
2768bool ieee80211_chandef_vht_oper(struct ieee80211_hw *hw,
2769                                const struct ieee80211_vht_operation *oper,
2770                                const struct ieee80211_ht_operation *htop,
2771                                struct cfg80211_chan_def *chandef)
2772{
2773        struct cfg80211_chan_def new = *chandef;
2774        int cf0, cf1;
2775        int ccfs0, ccfs1, ccfs2;
2776        int ccf0, ccf1;
2777
2778        if (!oper || !htop)
2779                return false;
2780
2781        ccfs0 = oper->center_freq_seg0_idx;
2782        ccfs1 = oper->center_freq_seg1_idx;
2783        ccfs2 = (le16_to_cpu(htop->operation_mode) &
2784                                IEEE80211_HT_OP_MODE_CCFS2_MASK)
2785                        >> IEEE80211_HT_OP_MODE_CCFS2_SHIFT;
2786
2787        /* when parsing (and we know how to) CCFS1 and CCFS2 are equivalent */
2788        ccf0 = ccfs0;
2789        ccf1 = ccfs1;
2790        if (!ccfs1 && ieee80211_hw_check(hw, SUPPORTS_VHT_EXT_NSS_BW))
2791                ccf1 = ccfs2;
2792
2793        cf0 = ieee80211_channel_to_frequency(ccf0, chandef->chan->band);
2794        cf1 = ieee80211_channel_to_frequency(ccf1, chandef->chan->band);
2795
2796        switch (oper->chan_width) {
2797        case IEEE80211_VHT_CHANWIDTH_USE_HT:
2798                /* just use HT information directly */
2799                break;
2800        case IEEE80211_VHT_CHANWIDTH_80MHZ:
2801                new.width = NL80211_CHAN_WIDTH_80;
2802                new.center_freq1 = cf0;
2803                /* If needed, adjust based on the newer interop workaround. */
2804                if (ccf1) {
2805                        unsigned int diff;
2806
2807                        diff = abs(ccf1 - ccf0);
2808                        if (diff == 8) {
2809                                new.width = NL80211_CHAN_WIDTH_160;
2810                                new.center_freq1 = cf1;
2811                        } else if (diff > 8) {
2812                                new.width = NL80211_CHAN_WIDTH_80P80;
2813                                new.center_freq2 = cf1;
2814                        }
2815                }
2816                break;
2817        case IEEE80211_VHT_CHANWIDTH_160MHZ:
2818                /* deprecated encoding */
2819                new.width = NL80211_CHAN_WIDTH_160;
2820                new.center_freq1 = cf0;
2821                break;
2822        case IEEE80211_VHT_CHANWIDTH_80P80MHZ:
2823                /* deprecated encoding */
2824                new.width = NL80211_CHAN_WIDTH_80P80;
2825                new.center_freq1 = cf0;
2826                new.center_freq2 = cf1;
2827                break;
2828        default:
2829                return false;
2830        }
2831
2832        if (!cfg80211_chandef_valid(&new))
2833                return false;
2834
2835        *chandef = new;
2836        return true;
2837}
2838
2839int ieee80211_parse_bitrates(struct cfg80211_chan_def *chandef,
2840                             const struct ieee80211_supported_band *sband,
2841                             const u8 *srates, int srates_len, u32 *rates)
2842{
2843        u32 rate_flags = ieee80211_chandef_rate_flags(chandef);
2844        int shift = ieee80211_chandef_get_shift(chandef);
2845        struct ieee80211_rate *br;
2846        int brate, rate, i, j, count = 0;
2847
2848        *rates = 0;
2849
2850        for (i = 0; i < srates_len; i++) {
2851                rate = srates[i] & 0x7f;
2852
2853                for (j = 0; j < sband->n_bitrates; j++) {
2854                        br = &sband->bitrates[j];
2855                        if ((rate_flags & br->flags) != rate_flags)
2856                                continue;
2857
2858                        brate = DIV_ROUND_UP(br->bitrate, (1 << shift) * 5);
2859                        if (brate == rate) {
2860                                *rates |= BIT(j);
2861                                count++;
2862                                break;
2863                        }
2864                }
2865        }
2866        return count;
2867}
2868
2869int ieee80211_add_srates_ie(struct ieee80211_sub_if_data *sdata,
2870                            struct sk_buff *skb, bool need_basic,
2871                            enum nl80211_band band)
2872{
2873        struct ieee80211_local *local = sdata->local;
2874        struct ieee80211_supported_band *sband;
2875        int rate, shift;
2876        u8 i, rates, *pos;
2877        u32 basic_rates = sdata->vif.bss_conf.basic_rates;
2878        u32 rate_flags;
2879
2880        shift = ieee80211_vif_get_shift(&sdata->vif);
2881        rate_flags = ieee80211_chandef_rate_flags(&sdata->vif.bss_conf.chandef);
2882        sband = local->hw.wiphy->bands[band];
2883        rates = 0;
2884        for (i = 0; i < sband->n_bitrates; i++) {
2885                if ((rate_flags & sband->bitrates[i].flags) != rate_flags)
2886                        continue;
2887                rates++;
2888        }
2889        if (rates > 8)
2890                rates = 8;
2891
2892        if (skb_tailroom(skb) < rates + 2)
2893                return -ENOMEM;
2894
2895        pos = skb_put(skb, rates + 2);
2896        *pos++ = WLAN_EID_SUPP_RATES;
2897        *pos++ = rates;
2898        for (i = 0; i < rates; i++) {
2899                u8 basic = 0;
2900                if ((rate_flags & sband->bitrates[i].flags) != rate_flags)
2901                        continue;
2902
2903                if (need_basic && basic_rates & BIT(i))
2904                        basic = 0x80;
2905                rate = DIV_ROUND_UP(sband->bitrates[i].bitrate,
2906                                    5 * (1 << shift));
2907                *pos++ = basic | (u8) rate;
2908        }
2909
2910        return 0;
2911}
2912
2913int ieee80211_add_ext_srates_ie(struct ieee80211_sub_if_data *sdata,
2914                                struct sk_buff *skb, bool need_basic,
2915                                enum nl80211_band band)
2916{
2917        struct ieee80211_local *local = sdata->local;
2918        struct ieee80211_supported_band *sband;
2919        int rate, shift;
2920        u8 i, exrates, *pos;
2921        u32 basic_rates = sdata->vif.bss_conf.basic_rates;
2922        u32 rate_flags;
2923
2924        rate_flags = ieee80211_chandef_rate_flags(&sdata->vif.bss_conf.chandef);
2925        shift = ieee80211_vif_get_shift(&sdata->vif);
2926
2927        sband = local->hw.wiphy->bands[band];
2928        exrates = 0;
2929        for (i = 0; i < sband->n_bitrates; i++) {
2930                if ((rate_flags & sband->bitrates[i].flags) != rate_flags)
2931                        continue;
2932                exrates++;
2933        }
2934
2935        if (exrates > 8)
2936                exrates -= 8;
2937        else
2938                exrates = 0;
2939
2940        if (skb_tailroom(skb) < exrates + 2)
2941                return -ENOMEM;
2942
2943        if (exrates) {
2944                pos = skb_put(skb, exrates + 2);
2945                *pos++ = WLAN_EID_EXT_SUPP_RATES;
2946                *pos++ = exrates;
2947                for (i = 8; i < sband->n_bitrates; i++) {
2948                        u8 basic = 0;
2949                        if ((rate_flags & sband->bitrates[i].flags)
2950                            != rate_flags)
2951                                continue;
2952                        if (need_basic && basic_rates & BIT(i))
2953                                basic = 0x80;
2954                        rate = DIV_ROUND_UP(sband->bitrates[i].bitrate,
2955                                            5 * (1 << shift));
2956                        *pos++ = basic | (u8) rate;
2957                }
2958        }
2959        return 0;
2960}
2961
2962int ieee80211_ave_rssi(struct ieee80211_vif *vif)
2963{
2964        struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif);
2965        struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
2966
2967        if (WARN_ON_ONCE(sdata->vif.type != NL80211_IFTYPE_STATION)) {
2968                /* non-managed type inferfaces */
2969                return 0;
2970        }
2971        return -ewma_beacon_signal_read(&ifmgd->ave_beacon_signal);
2972}
2973EXPORT_SYMBOL_GPL(ieee80211_ave_rssi);
2974
2975u8 ieee80211_mcs_to_chains(const struct ieee80211_mcs_info *mcs)
2976{
2977        if (!mcs)
2978                return 1;
2979
2980        /* TODO: consider rx_highest */
2981
2982        if (mcs->rx_mask[3])
2983                return 4;
2984        if (mcs->rx_mask[2])
2985                return 3;
2986        if (mcs->rx_mask[1])
2987                return 2;
2988        return 1;
2989}
2990
2991/**
2992 * ieee80211_calculate_rx_timestamp - calculate timestamp in frame
2993 * @local: mac80211 hw info struct
2994 * @status: RX status
2995 * @mpdu_len: total MPDU length (including FCS)
2996 * @mpdu_offset: offset into MPDU to calculate timestamp at
2997 *
2998 * This function calculates the RX timestamp at the given MPDU offset, taking
2999 * into account what the RX timestamp was. An offset of 0 will just normalize
3000 * the timestamp to TSF at beginning of MPDU reception.
3001 */
3002u64 ieee80211_calculate_rx_timestamp(struct ieee80211_local *local,
3003                                     struct ieee80211_rx_status *status,
3004                                     unsigned int mpdu_len,
3005                                     unsigned int mpdu_offset)
3006{
3007        u64 ts = status->mactime;
3008        struct rate_info ri;
3009        u16 rate;
3010
3011        if (WARN_ON(!ieee80211_have_rx_timestamp(status)))
3012                return 0;
3013
3014        memset(&ri, 0, sizeof(ri));
3015
3016        ri.bw = status->bw;
3017
3018        /* Fill cfg80211 rate info */
3019        switch (status->encoding) {
3020        case RX_ENC_HT:
3021                ri.mcs = status->rate_idx;
3022                ri.flags |= RATE_INFO_FLAGS_MCS;
3023                if (status->enc_flags & RX_ENC_FLAG_SHORT_GI)
3024                        ri.flags |= RATE_INFO_FLAGS_SHORT_GI;
3025                break;
3026        case RX_ENC_VHT:
3027                ri.flags |= RATE_INFO_FLAGS_VHT_MCS;
3028                ri.mcs = status->rate_idx;
3029                ri.nss = status->nss;
3030                if (status->enc_flags & RX_ENC_FLAG_SHORT_GI)
3031                        ri.flags |= RATE_INFO_FLAGS_SHORT_GI;
3032                break;
3033        default:
3034                WARN_ON(1);
3035                /* fall through */
3036        case RX_ENC_LEGACY: {
3037                struct ieee80211_supported_band *sband;
3038                int shift = 0;
3039                int bitrate;
3040
3041                switch (status->bw) {
3042                case RATE_INFO_BW_10:
3043                        shift = 1;
3044                        break;
3045                case RATE_INFO_BW_5:
3046                        shift = 2;
3047                        break;
3048                }
3049
3050                sband = local->hw.wiphy->bands[status->band];
3051                bitrate = sband->bitrates[status->rate_idx].bitrate;
3052                ri.legacy = DIV_ROUND_UP(bitrate, (1 << shift));
3053
3054                if (status->flag & RX_FLAG_MACTIME_PLCP_START) {
3055                        /* TODO: handle HT/VHT preambles */
3056                        if (status->band == NL80211_BAND_5GHZ) {
3057                                ts += 20 << shift;
3058                                mpdu_offset += 2;
3059                        } else if (status->enc_flags & RX_ENC_FLAG_SHORTPRE) {
3060                                ts += 96;
3061                        } else {
3062                                ts += 192;
3063                        }
3064                }
3065                break;
3066                }
3067        }
3068
3069        rate = cfg80211_calculate_bitrate(&ri);
3070        if (WARN_ONCE(!rate,
3071                      "Invalid bitrate: flags=0x%llx, idx=%d, vht_nss=%d\n",
3072                      (unsigned long long)status->flag, status->rate_idx,
3073                      status->nss))
3074                return 0;
3075
3076        /* rewind from end of MPDU */
3077        if (status->flag & RX_FLAG_MACTIME_END)
3078                ts -= mpdu_len * 8 * 10 / rate;
3079
3080        ts += mpdu_offset * 8 * 10 / rate;
3081
3082        return ts;
3083}
3084
3085void ieee80211_dfs_cac_cancel(struct ieee80211_local *local)
3086{
3087        struct ieee80211_sub_if_data *sdata;
3088        struct cfg80211_chan_def chandef;
3089
3090        /* for interface list, to avoid linking iflist_mtx and chanctx_mtx */
3091        ASSERT_RTNL();
3092
3093        mutex_lock(&local->mtx);
3094        list_for_each_entry(sdata, &local->interfaces, list) {
3095                /* it might be waiting for the local->mtx, but then
3096                 * by the time it gets it, sdata->wdev.cac_started
3097                 * will no longer be true
3098                 */
3099                cancel_delayed_work(&sdata->dfs_cac_timer_work);
3100
3101                if (sdata->wdev.cac_started) {
3102                        chandef = sdata->vif.bss_conf.chandef;
3103                        ieee80211_vif_release_channel(sdata);
3104                        cfg80211_cac_event(sdata->dev,
3105                                           &chandef,
3106                                           NL80211_RADAR_CAC_ABORTED,
3107                                           GFP_KERNEL);
3108                }
3109        }
3110        mutex_unlock(&local->mtx);
3111}
3112
3113void ieee80211_dfs_radar_detected_work(struct work_struct *work)
3114{
3115        struct ieee80211_local *local =
3116                container_of(work, struct ieee80211_local, radar_detected_work);
3117        struct cfg80211_chan_def chandef = local->hw.conf.chandef;
3118        struct ieee80211_chanctx *ctx;
3119        int num_chanctx = 0;
3120
3121        mutex_lock(&local->chanctx_mtx);
3122        list_for_each_entry(ctx, &local->chanctx_list, list) {
3123                if (ctx->replace_state == IEEE80211_CHANCTX_REPLACES_OTHER)
3124                        continue;
3125
3126                num_chanctx++;
3127                chandef = ctx->conf.def;
3128        }
3129        mutex_unlock(&local->chanctx_mtx);
3130
3131        rtnl_lock();
3132        ieee80211_dfs_cac_cancel(local);
3133        rtnl_unlock();
3134
3135        if (num_chanctx > 1)
3136                /* XXX: multi-channel is not supported yet */
3137                WARN_ON(1);
3138        else
3139                cfg80211_radar_event(local->hw.wiphy, &chandef, GFP_KERNEL);
3140}
3141
3142void ieee80211_radar_detected(struct ieee80211_hw *hw)
3143{
3144        struct ieee80211_local *local = hw_to_local(hw);
3145
3146        trace_api_radar_detected(local);
3147
3148        schedule_work(&local->radar_detected_work);
3149}
3150EXPORT_SYMBOL(ieee80211_radar_detected);
3151
3152u32 ieee80211_chandef_downgrade(struct cfg80211_chan_def *c)
3153{
3154        u32 ret;
3155        int tmp;
3156
3157        switch (c->width) {
3158        case NL80211_CHAN_WIDTH_20:
3159                c->width = NL80211_CHAN_WIDTH_20_NOHT;
3160                ret = IEEE80211_STA_DISABLE_HT | IEEE80211_STA_DISABLE_VHT;
3161                break;
3162        case NL80211_CHAN_WIDTH_40:
3163                c->width = NL80211_CHAN_WIDTH_20;
3164                c->center_freq1 = c->chan->center_freq;
3165                ret = IEEE80211_STA_DISABLE_40MHZ |
3166                      IEEE80211_STA_DISABLE_VHT;
3167                break;
3168        case NL80211_CHAN_WIDTH_80:
3169                tmp = (30 + c->chan->center_freq - c->center_freq1)/20;
3170                /* n_P40 */
3171                tmp /= 2;
3172                /* freq_P40 */
3173                c->center_freq1 = c->center_freq1 - 20 + 40 * tmp;
3174                c->width = NL80211_CHAN_WIDTH_40;
3175                ret = IEEE80211_STA_DISABLE_VHT;
3176                break;
3177        case NL80211_CHAN_WIDTH_80P80:
3178                c->center_freq2 = 0;
3179                c->width = NL80211_CHAN_WIDTH_80;
3180                ret = IEEE80211_STA_DISABLE_80P80MHZ |
3181                      IEEE80211_STA_DISABLE_160MHZ;
3182                break;
3183        case NL80211_CHAN_WIDTH_160:
3184                /* n_P20 */
3185                tmp = (70 + c->chan->center_freq - c->center_freq1)/20;
3186                /* n_P80 */
3187                tmp /= 4;
3188                c->center_freq1 = c->center_freq1 - 40 + 80 * tmp;
3189                c->width = NL80211_CHAN_WIDTH_80;
3190                ret = IEEE80211_STA_DISABLE_80P80MHZ |
3191                      IEEE80211_STA_DISABLE_160MHZ;
3192                break;
3193        default:
3194        case NL80211_CHAN_WIDTH_20_NOHT:
3195                WARN_ON_ONCE(1);
3196                c->width = NL80211_CHAN_WIDTH_20_NOHT;
3197                ret = IEEE80211_STA_DISABLE_HT | IEEE80211_STA_DISABLE_VHT;
3198                break;
3199        case NL80211_CHAN_WIDTH_5:
3200        case NL80211_CHAN_WIDTH_10:
3201                WARN_ON_ONCE(1);
3202                /* keep c->width */
3203                ret = IEEE80211_STA_DISABLE_HT | IEEE80211_STA_DISABLE_VHT;
3204                break;
3205        }
3206
3207        WARN_ON_ONCE(!cfg80211_chandef_valid(c));
3208
3209        return ret;
3210}
3211
3212/*
3213 * Returns true if smps_mode_new is strictly more restrictive than
3214 * smps_mode_old.
3215 */
3216bool ieee80211_smps_is_restrictive(enum ieee80211_smps_mode smps_mode_old,
3217                                   enum ieee80211_smps_mode smps_mode_new)
3218{
3219        if (WARN_ON_ONCE(smps_mode_old == IEEE80211_SMPS_AUTOMATIC ||
3220                         smps_mode_new == IEEE80211_SMPS_AUTOMATIC))
3221                return false;
3222
3223        switch (smps_mode_old) {
3224        case IEEE80211_SMPS_STATIC:
3225                return false;
3226        case IEEE80211_SMPS_DYNAMIC:
3227                return smps_mode_new == IEEE80211_SMPS_STATIC;
3228        case IEEE80211_SMPS_OFF:
3229                return smps_mode_new != IEEE80211_SMPS_OFF;
3230        default:
3231                WARN_ON(1);
3232        }
3233
3234        return false;
3235}
3236
3237int ieee80211_send_action_csa(struct ieee80211_sub_if_data *sdata,
3238                              struct cfg80211_csa_settings *csa_settings)
3239{
3240        struct sk_buff *skb;
3241        struct ieee80211_mgmt *mgmt;
3242        struct ieee80211_local *local = sdata->local;
3243        int freq;
3244        int hdr_len = offsetofend(struct ieee80211_mgmt,
3245                                  u.action.u.chan_switch);
3246        u8 *pos;
3247
3248        if (sdata->vif.type != NL80211_IFTYPE_ADHOC &&
3249            sdata->vif.type != NL80211_IFTYPE_MESH_POINT)
3250                return -EOPNOTSUPP;
3251
3252        skb = dev_alloc_skb(local->tx_headroom + hdr_len +
3253                            5 + /* channel switch announcement element */
3254                            3 + /* secondary channel offset element */
3255                            5 + /* wide bandwidth channel switch announcement */
3256                            8); /* mesh channel switch parameters element */
3257        if (!skb)
3258                return -ENOMEM;
3259
3260        skb_reserve(skb, local->tx_headroom);
3261        mgmt = skb_put_zero(skb, hdr_len);
3262        mgmt->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT |
3263                                          IEEE80211_STYPE_ACTION);
3264
3265        eth_broadcast_addr(mgmt->da);
3266        memcpy(mgmt->sa, sdata->vif.addr, ETH_ALEN);
3267        if (ieee80211_vif_is_mesh(&sdata->vif)) {
3268                memcpy(mgmt->bssid, sdata->vif.addr, ETH_ALEN);
3269        } else {
3270                struct ieee80211_if_ibss *ifibss = &sdata->u.ibss;
3271                memcpy(mgmt->bssid, ifibss->bssid, ETH_ALEN);
3272        }
3273        mgmt->u.action.category = WLAN_CATEGORY_SPECTRUM_MGMT;
3274        mgmt->u.action.u.chan_switch.action_code = WLAN_ACTION_SPCT_CHL_SWITCH;
3275        pos = skb_put(skb, 5);
3276        *pos++ = WLAN_EID_CHANNEL_SWITCH;                       /* EID */
3277        *pos++ = 3;                                             /* IE length */
3278        *pos++ = csa_settings->block_tx ? 1 : 0;                /* CSA mode */
3279        freq = csa_settings->chandef.chan->center_freq;
3280        *pos++ = ieee80211_frequency_to_channel(freq);          /* channel */
3281        *pos++ = csa_settings->count;                           /* count */
3282
3283        if (csa_settings->chandef.width == NL80211_CHAN_WIDTH_40) {
3284                enum nl80211_channel_type ch_type;
3285
3286                skb_put(skb, 3);
3287                *pos++ = WLAN_EID_SECONDARY_CHANNEL_OFFSET;     /* EID */
3288                *pos++ = 1;                                     /* IE length */
3289                ch_type = cfg80211_get_chandef_type(&csa_settings->chandef);
3290                if (ch_type == NL80211_CHAN_HT40PLUS)
3291                        *pos++ = IEEE80211_HT_PARAM_CHA_SEC_ABOVE;
3292                else
3293                        *pos++ = IEEE80211_HT_PARAM_CHA_SEC_BELOW;
3294        }
3295
3296        if (ieee80211_vif_is_mesh(&sdata->vif)) {
3297                struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
3298
3299                skb_put(skb, 8);
3300                *pos++ = WLAN_EID_CHAN_SWITCH_PARAM;            /* EID */
3301                *pos++ = 6;                                     /* IE length */
3302                *pos++ = sdata->u.mesh.mshcfg.dot11MeshTTL;     /* Mesh TTL */
3303                *pos = 0x00;    /* Mesh Flag: Tx Restrict, Initiator, Reason */
3304                *pos |= WLAN_EID_CHAN_SWITCH_PARAM_INITIATOR;
3305                *pos++ |= csa_settings->block_tx ?
3306                          WLAN_EID_CHAN_SWITCH_PARAM_TX_RESTRICT : 0x00;
3307                put_unaligned_le16(WLAN_REASON_MESH_CHAN, pos); /* Reason Cd */
3308                pos += 2;
3309                put_unaligned_le16(ifmsh->pre_value, pos);/* Precedence Value */
3310                pos += 2;
3311        }
3312
3313        if (csa_settings->chandef.width == NL80211_CHAN_WIDTH_80 ||
3314            csa_settings->chandef.width == NL80211_CHAN_WIDTH_80P80 ||
3315            csa_settings->chandef.width == NL80211_CHAN_WIDTH_160) {
3316                skb_put(skb, 5);
3317                ieee80211_ie_build_wide_bw_cs(pos, &csa_settings->chandef);
3318        }
3319
3320        ieee80211_tx_skb(sdata, skb);
3321        return 0;
3322}
3323
3324bool ieee80211_cs_valid(const struct ieee80211_cipher_scheme *cs)
3325{
3326        return !(cs == NULL || cs->cipher == 0 ||
3327                 cs->hdr_len < cs->pn_len + cs->pn_off ||
3328                 cs->hdr_len <= cs->key_idx_off ||
3329                 cs->key_idx_shift > 7 ||
3330                 cs->key_idx_mask == 0);
3331}
3332
3333bool ieee80211_cs_list_valid(const struct ieee80211_cipher_scheme *cs, int n)
3334{
3335        int i;
3336
3337        /* Ensure we have enough iftype bitmap space for all iftype values */
3338        WARN_ON((NUM_NL80211_IFTYPES / 8 + 1) > sizeof(cs[0].iftype));
3339
3340        for (i = 0; i < n; i++)
3341                if (!ieee80211_cs_valid(&cs[i]))
3342                        return false;
3343
3344        return true;
3345}
3346
3347const struct ieee80211_cipher_scheme *
3348ieee80211_cs_get(struct ieee80211_local *local, u32 cipher,
3349                 enum nl80211_iftype iftype)
3350{
3351        const struct ieee80211_cipher_scheme *l = local->hw.cipher_schemes;
3352        int n = local->hw.n_cipher_schemes;
3353        int i;
3354        const struct ieee80211_cipher_scheme *cs = NULL;
3355
3356        for (i = 0; i < n; i++) {
3357                if (l[i].cipher == cipher) {
3358                        cs = &l[i];
3359                        break;
3360                }
3361        }
3362
3363        if (!cs || !(cs->iftype & BIT(iftype)))
3364                return NULL;
3365
3366        return cs;
3367}
3368
3369int ieee80211_cs_headroom(struct ieee80211_local *local,
3370                          struct cfg80211_crypto_settings *crypto,
3371                          enum nl80211_iftype iftype)
3372{
3373        const struct ieee80211_cipher_scheme *cs;
3374        int headroom = IEEE80211_ENCRYPT_HEADROOM;
3375        int i;
3376
3377        for (i = 0; i < crypto->n_ciphers_pairwise; i++) {
3378                cs = ieee80211_cs_get(local, crypto->ciphers_pairwise[i],
3379                                      iftype);
3380
3381                if (cs && headroom < cs->hdr_len)
3382                        headroom = cs->hdr_len;
3383        }
3384
3385        cs = ieee80211_cs_get(local, crypto->cipher_group, iftype);
3386        if (cs && headroom < cs->hdr_len)
3387                headroom = cs->hdr_len;
3388
3389        return headroom;
3390}
3391
3392static bool
3393ieee80211_extend_noa_desc(struct ieee80211_noa_data *data, u32 tsf, int i)
3394{
3395        s32 end = data->desc[i].start + data->desc[i].duration - (tsf + 1);
3396        int skip;
3397
3398        if (end > 0)
3399                return false;
3400
3401        /* One shot NOA  */
3402        if (data->count[i] == 1)
3403                return false;
3404
3405        if (data->desc[i].interval == 0)
3406                return false;
3407
3408        /* End time is in the past, check for repetitions */
3409        skip = DIV_ROUND_UP(-end, data->desc[i].interval);
3410        if (data->count[i] < 255) {
3411                if (data->count[i] <= skip) {
3412                        data->count[i] = 0;
3413                        return false;
3414                }
3415
3416                data->count[i] -= skip;
3417        }
3418
3419        data->desc[i].start += skip * data->desc[i].interval;
3420
3421        return true;
3422}
3423
3424static bool
3425ieee80211_extend_absent_time(struct ieee80211_noa_data *data, u32 tsf,
3426                             s32 *offset)
3427{
3428        bool ret = false;
3429        int i;
3430
3431        for (i = 0; i < IEEE80211_P2P_NOA_DESC_MAX; i++) {
3432                s32 cur;
3433
3434                if (!data->count[i])
3435                        continue;
3436
3437                if (ieee80211_extend_noa_desc(data, tsf + *offset, i))
3438                        ret = true;
3439
3440                cur = data->desc[i].start - tsf;
3441                if (cur > *offset)
3442                        continue;
3443
3444                cur = data->desc[i].start + data->desc[i].duration - tsf;
3445                if (cur > *offset)
3446                        *offset = cur;
3447        }
3448
3449        return ret;
3450}
3451
3452static u32
3453ieee80211_get_noa_absent_time(struct ieee80211_noa_data *data, u32 tsf)
3454{
3455        s32 offset = 0;
3456        int tries = 0;
3457        /*
3458         * arbitrary limit, used to avoid infinite loops when combined NoA
3459         * descriptors cover the full time period.
3460         */
3461        int max_tries = 5;
3462
3463        ieee80211_extend_absent_time(data, tsf, &offset);
3464        do {
3465                if (!ieee80211_extend_absent_time(data, tsf, &offset))
3466                        break;
3467
3468                tries++;
3469        } while (tries < max_tries);
3470
3471        return offset;
3472}
3473
3474void ieee80211_update_p2p_noa(struct ieee80211_noa_data *data, u32 tsf)
3475{
3476        u32 next_offset = BIT(31) - 1;
3477        int i;
3478
3479        data->absent = 0;
3480        data->has_next_tsf = false;
3481        for (i = 0; i < IEEE80211_P2P_NOA_DESC_MAX; i++) {
3482                s32 start;
3483
3484                if (!data->count[i])
3485                        continue;
3486
3487                ieee80211_extend_noa_desc(data, tsf, i);
3488                start = data->desc[i].start - tsf;
3489                if (start <= 0)
3490                        data->absent |= BIT(i);
3491
3492                if (next_offset > start)
3493                        next_offset = start;
3494
3495                data->has_next_tsf = true;
3496        }
3497
3498        if (data->absent)
3499                next_offset = ieee80211_get_noa_absent_time(data, tsf);
3500
3501        data->next_tsf = tsf + next_offset;
3502}
3503EXPORT_SYMBOL(ieee80211_update_p2p_noa);
3504
3505int ieee80211_parse_p2p_noa(const struct ieee80211_p2p_noa_attr *attr,
3506                            struct ieee80211_noa_data *data, u32 tsf)
3507{
3508        int ret = 0;
3509        int i;
3510
3511        memset(data, 0, sizeof(*data));
3512
3513        for (i = 0; i < IEEE80211_P2P_NOA_DESC_MAX; i++) {
3514                const struct ieee80211_p2p_noa_desc *desc = &attr->desc[i];
3515
3516                if (!desc->count || !desc->duration)
3517                        continue;
3518
3519                data->count[i] = desc->count;
3520                data->desc[i].start = le32_to_cpu(desc->start_time);
3521                data->desc[i].duration = le32_to_cpu(desc->duration);
3522                data->desc[i].interval = le32_to_cpu(desc->interval);
3523
3524                if (data->count[i] > 1 &&
3525                    data->desc[i].interval < data->desc[i].duration)
3526                        continue;
3527
3528                ieee80211_extend_noa_desc(data, tsf, i);
3529                ret++;
3530        }
3531
3532        if (ret)
3533                ieee80211_update_p2p_noa(data, tsf);
3534
3535        return ret;
3536}
3537EXPORT_SYMBOL(ieee80211_parse_p2p_noa);
3538
3539void ieee80211_recalc_dtim(struct ieee80211_local *local,
3540                           struct ieee80211_sub_if_data *sdata)
3541{
3542        u64 tsf = drv_get_tsf(local, sdata);
3543        u64 dtim_count = 0;
3544        u16 beacon_int = sdata->vif.bss_conf.beacon_int * 1024;
3545        u8 dtim_period = sdata->vif.bss_conf.dtim_period;
3546        struct ps_data *ps;
3547        u8 bcns_from_dtim;
3548
3549        if (tsf == -1ULL || !beacon_int || !dtim_period)
3550                return;
3551
3552        if (sdata->vif.type == NL80211_IFTYPE_AP ||
3553            sdata->vif.type == NL80211_IFTYPE_AP_VLAN) {
3554                if (!sdata->bss)
3555                        return;
3556
3557                ps = &sdata->bss->ps;
3558        } else if (ieee80211_vif_is_mesh(&sdata->vif)) {
3559                ps = &sdata->u.mesh.ps;
3560        } else {
3561                return;
3562        }
3563
3564        /*
3565         * actually finds last dtim_count, mac80211 will update in
3566         * __beacon_add_tim().
3567         * dtim_count = dtim_period - (tsf / bcn_int) % dtim_period
3568         */
3569        do_div(tsf, beacon_int);
3570        bcns_from_dtim = do_div(tsf, dtim_period);
3571        /* just had a DTIM */
3572        if (!bcns_from_dtim)
3573                dtim_count = 0;
3574        else
3575                dtim_count = dtim_period - bcns_from_dtim;
3576
3577        ps->dtim_count = dtim_count;
3578}
3579
3580static u8 ieee80211_chanctx_radar_detect(struct ieee80211_local *local,
3581                                         struct ieee80211_chanctx *ctx)
3582{
3583        struct ieee80211_sub_if_data *sdata;
3584        u8 radar_detect = 0;
3585
3586        lockdep_assert_held(&local->chanctx_mtx);
3587
3588        if (WARN_ON(ctx->replace_state == IEEE80211_CHANCTX_WILL_BE_REPLACED))
3589                return 0;
3590
3591        list_for_each_entry(sdata, &ctx->reserved_vifs, reserved_chanctx_list)
3592                if (sdata->reserved_radar_required)
3593                        radar_detect |= BIT(sdata->reserved_chandef.width);
3594
3595        /*
3596         * An in-place reservation context should not have any assigned vifs
3597         * until it replaces the other context.
3598         */
3599        WARN_ON(ctx->replace_state == IEEE80211_CHANCTX_REPLACES_OTHER &&
3600                !list_empty(&ctx->assigned_vifs));
3601
3602        list_for_each_entry(sdata, &ctx->assigned_vifs, assigned_chanctx_list)
3603                if (sdata->radar_required)
3604                        radar_detect |= BIT(sdata->vif.bss_conf.chandef.width);
3605
3606        return radar_detect;
3607}
3608
3609int ieee80211_check_combinations(struct ieee80211_sub_if_data *sdata,
3610                                 const struct cfg80211_chan_def *chandef,
3611                                 enum ieee80211_chanctx_mode chanmode,
3612                                 u8 radar_detect)
3613{
3614        struct ieee80211_local *local = sdata->local;
3615        struct ieee80211_sub_if_data *sdata_iter;
3616        enum nl80211_iftype iftype = sdata->wdev.iftype;
3617        struct ieee80211_chanctx *ctx;
3618        int total = 1;
3619        struct iface_combination_params params = {
3620                .radar_detect = radar_detect,
3621        };
3622
3623        lockdep_assert_held(&local->chanctx_mtx);
3624
3625        if (WARN_ON(hweight32(radar_detect) > 1))
3626                return -EINVAL;
3627
3628        if (WARN_ON(chandef && chanmode == IEEE80211_CHANCTX_SHARED &&
3629                    !chandef->chan))
3630                return -EINVAL;
3631
3632        if (WARN_ON(iftype >= NUM_NL80211_IFTYPES))
3633                return -EINVAL;
3634
3635        if (sdata->vif.type == NL80211_IFTYPE_AP ||
3636            sdata->vif.type == NL80211_IFTYPE_MESH_POINT) {
3637                /*
3638                 * always passing this is harmless, since it'll be the
3639                 * same value that cfg80211 finds if it finds the same
3640                 * interface ... and that's always allowed
3641                 */
3642                params.new_beacon_int = sdata->vif.bss_conf.beacon_int;
3643        }
3644
3645        /* Always allow software iftypes */
3646        if (local->hw.wiphy->software_iftypes & BIT(iftype)) {
3647                if (radar_detect)
3648                        return -EINVAL;
3649                return 0;
3650        }
3651
3652        if (chandef)
3653                params.num_different_channels = 1;
3654
3655        if (iftype != NL80211_IFTYPE_UNSPECIFIED)
3656                params.iftype_num[iftype] = 1;
3657
3658        list_for_each_entry(ctx, &local->chanctx_list, list) {
3659                if (ctx->replace_state == IEEE80211_CHANCTX_WILL_BE_REPLACED)
3660                        continue;
3661                params.radar_detect |=
3662                        ieee80211_chanctx_radar_detect(local, ctx);
3663                if (ctx->mode == IEEE80211_CHANCTX_EXCLUSIVE) {
3664                        params.num_different_channels++;
3665                        continue;
3666                }
3667                if (chandef && chanmode == IEEE80211_CHANCTX_SHARED &&
3668                    cfg80211_chandef_compatible(chandef,
3669                                                &ctx->conf.def))
3670                        continue;
3671                params.num_different_channels++;
3672        }
3673
3674        list_for_each_entry_rcu(sdata_iter, &local->interfaces, list) {
3675                struct wireless_dev *wdev_iter;
3676
3677                wdev_iter = &sdata_iter->wdev;
3678
3679                if (sdata_iter == sdata ||
3680                    !ieee80211_sdata_running(sdata_iter) ||
3681                    local->hw.wiphy->software_iftypes & BIT(wdev_iter->iftype))
3682                        continue;
3683
3684                params.iftype_num[wdev_iter->iftype]++;
3685                total++;
3686        }
3687
3688        if (total == 1 && !params.radar_detect)
3689                return 0;
3690
3691        return cfg80211_check_combinations(local->hw.wiphy, &params);
3692}
3693
3694static void
3695ieee80211_iter_max_chans(const struct ieee80211_iface_combination *c,
3696                         void *data)
3697{
3698        u32 *max_num_different_channels = data;
3699
3700        *max_num_different_channels = max(*max_num_different_channels,
3701                                          c->num_different_channels);
3702}
3703
3704int ieee80211_max_num_channels(struct ieee80211_local *local)
3705{
3706        struct ieee80211_sub_if_data *sdata;
3707        struct ieee80211_chanctx *ctx;
3708        u32 max_num_different_channels = 1;
3709        int err;
3710        struct iface_combination_params params = {0};
3711
3712        lockdep_assert_held(&local->chanctx_mtx);
3713
3714        list_for_each_entry(ctx, &local->chanctx_list, list) {
3715                if (ctx->replace_state == IEEE80211_CHANCTX_WILL_BE_REPLACED)
3716                        continue;
3717
3718                params.num_different_channels++;
3719
3720                params.radar_detect |=
3721                        ieee80211_chanctx_radar_detect(local, ctx);
3722        }
3723
3724        list_for_each_entry_rcu(sdata, &local->interfaces, list)
3725                params.iftype_num[sdata->wdev.iftype]++;
3726
3727        err = cfg80211_iter_combinations(local->hw.wiphy, &params,
3728                                         ieee80211_iter_max_chans,
3729                                         &max_num_different_channels);
3730        if (err < 0)
3731                return err;
3732
3733        return max_num_different_channels;
3734}
3735
3736u8 *ieee80211_add_wmm_info_ie(u8 *buf, u8 qosinfo)
3737{
3738        *buf++ = WLAN_EID_VENDOR_SPECIFIC;
3739        *buf++ = 7; /* len */
3740        *buf++ = 0x00; /* Microsoft OUI 00:50:F2 */
3741        *buf++ = 0x50;
3742        *buf++ = 0xf2;
3743        *buf++ = 2; /* WME */
3744        *buf++ = 0; /* WME info */
3745        *buf++ = 1; /* WME ver */
3746        *buf++ = qosinfo; /* U-APSD no in use */
3747
3748        return buf;
3749}
3750
3751void ieee80211_txq_get_depth(struct ieee80211_txq *txq,
3752                             unsigned long *frame_cnt,
3753                             unsigned long *byte_cnt)
3754{
3755        struct txq_info *txqi = to_txq_info(txq);
3756        u32 frag_cnt = 0, frag_bytes = 0;
3757        struct sk_buff *skb;
3758
3759        skb_queue_walk(&txqi->frags, skb) {
3760                frag_cnt++;
3761                frag_bytes += skb->len;
3762        }
3763
3764        if (frame_cnt)
3765                *frame_cnt = txqi->tin.backlog_packets + frag_cnt;
3766
3767        if (byte_cnt)
3768                *byte_cnt = txqi->tin.backlog_bytes + frag_bytes;
3769}
3770EXPORT_SYMBOL(ieee80211_txq_get_depth);
3771
3772const u8 ieee80211_ac_to_qos_mask[IEEE80211_NUM_ACS] = {
3773        IEEE80211_WMM_IE_STA_QOSINFO_AC_VO,
3774        IEEE80211_WMM_IE_STA_QOSINFO_AC_VI,
3775        IEEE80211_WMM_IE_STA_QOSINFO_AC_BE,
3776        IEEE80211_WMM_IE_STA_QOSINFO_AC_BK
3777};
3778