linux/drivers/net/wireless/ti/wlcore/main.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-only
   2/*
   3 * This file is part of wlcore
   4 *
   5 * Copyright (C) 2008-2010 Nokia Corporation
   6 * Copyright (C) 2011-2013 Texas Instruments Inc.
   7 */
   8
   9#include <linux/module.h>
  10#include <linux/firmware.h>
  11#include <linux/etherdevice.h>
  12#include <linux/vmalloc.h>
  13#include <linux/interrupt.h>
  14#include <linux/irq.h>
  15#include <linux/pm_runtime.h>
  16#include <linux/pm_wakeirq.h>
  17
  18#include "wlcore.h"
  19#include "debug.h"
  20#include "wl12xx_80211.h"
  21#include "io.h"
  22#include "tx.h"
  23#include "ps.h"
  24#include "init.h"
  25#include "debugfs.h"
  26#include "testmode.h"
  27#include "vendor_cmd.h"
  28#include "scan.h"
  29#include "hw_ops.h"
  30#include "sysfs.h"
  31
  32#define WL1271_BOOT_RETRIES 3
  33#define WL1271_WAKEUP_TIMEOUT 500
  34
  35static char *fwlog_param;
  36static int fwlog_mem_blocks = -1;
  37static int bug_on_recovery = -1;
  38static int no_recovery     = -1;
  39
  40static void __wl1271_op_remove_interface(struct wl1271 *wl,
  41                                         struct ieee80211_vif *vif,
  42                                         bool reset_tx_queues);
  43static void wlcore_op_stop_locked(struct wl1271 *wl);
  44static void wl1271_free_ap_keys(struct wl1271 *wl, struct wl12xx_vif *wlvif);
  45
  46static int wl12xx_set_authorized(struct wl1271 *wl, struct wl12xx_vif *wlvif)
  47{
  48        int ret;
  49
  50        if (WARN_ON(wlvif->bss_type != BSS_TYPE_STA_BSS))
  51                return -EINVAL;
  52
  53        if (!test_bit(WLVIF_FLAG_STA_ASSOCIATED, &wlvif->flags))
  54                return 0;
  55
  56        if (test_and_set_bit(WLVIF_FLAG_STA_STATE_SENT, &wlvif->flags))
  57                return 0;
  58
  59        ret = wl12xx_cmd_set_peer_state(wl, wlvif, wlvif->sta.hlid);
  60        if (ret < 0)
  61                return ret;
  62
  63        wl1271_info("Association completed.");
  64        return 0;
  65}
  66
  67static void wl1271_reg_notify(struct wiphy *wiphy,
  68                              struct regulatory_request *request)
  69{
  70        struct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy);
  71        struct wl1271 *wl = hw->priv;
  72
  73        /* copy the current dfs region */
  74        if (request)
  75                wl->dfs_region = request->dfs_region;
  76
  77        wlcore_regdomain_config(wl);
  78}
  79
  80static int wl1271_set_rx_streaming(struct wl1271 *wl, struct wl12xx_vif *wlvif,
  81                                   bool enable)
  82{
  83        int ret = 0;
  84
  85        /* we should hold wl->mutex */
  86        ret = wl1271_acx_ps_rx_streaming(wl, wlvif, enable);
  87        if (ret < 0)
  88                goto out;
  89
  90        if (enable)
  91                set_bit(WLVIF_FLAG_RX_STREAMING_STARTED, &wlvif->flags);
  92        else
  93                clear_bit(WLVIF_FLAG_RX_STREAMING_STARTED, &wlvif->flags);
  94out:
  95        return ret;
  96}
  97
  98/*
  99 * this function is being called when the rx_streaming interval
 100 * has beed changed or rx_streaming should be disabled
 101 */
 102int wl1271_recalc_rx_streaming(struct wl1271 *wl, struct wl12xx_vif *wlvif)
 103{
 104        int ret = 0;
 105        int period = wl->conf.rx_streaming.interval;
 106
 107        /* don't reconfigure if rx_streaming is disabled */
 108        if (!test_bit(WLVIF_FLAG_RX_STREAMING_STARTED, &wlvif->flags))
 109                goto out;
 110
 111        /* reconfigure/disable according to new streaming_period */
 112        if (period &&
 113            test_bit(WLVIF_FLAG_STA_ASSOCIATED, &wlvif->flags) &&
 114            (wl->conf.rx_streaming.always ||
 115             test_bit(WL1271_FLAG_SOFT_GEMINI, &wl->flags)))
 116                ret = wl1271_set_rx_streaming(wl, wlvif, true);
 117        else {
 118                ret = wl1271_set_rx_streaming(wl, wlvif, false);
 119                /* don't cancel_work_sync since we might deadlock */
 120                del_timer_sync(&wlvif->rx_streaming_timer);
 121        }
 122out:
 123        return ret;
 124}
 125
 126static void wl1271_rx_streaming_enable_work(struct work_struct *work)
 127{
 128        int ret;
 129        struct wl12xx_vif *wlvif = container_of(work, struct wl12xx_vif,
 130                                                rx_streaming_enable_work);
 131        struct wl1271 *wl = wlvif->wl;
 132
 133        mutex_lock(&wl->mutex);
 134
 135        if (test_bit(WLVIF_FLAG_RX_STREAMING_STARTED, &wlvif->flags) ||
 136            !test_bit(WLVIF_FLAG_STA_ASSOCIATED, &wlvif->flags) ||
 137            (!wl->conf.rx_streaming.always &&
 138             !test_bit(WL1271_FLAG_SOFT_GEMINI, &wl->flags)))
 139                goto out;
 140
 141        if (!wl->conf.rx_streaming.interval)
 142                goto out;
 143
 144        ret = pm_runtime_resume_and_get(wl->dev);
 145        if (ret < 0)
 146                goto out;
 147
 148        ret = wl1271_set_rx_streaming(wl, wlvif, true);
 149        if (ret < 0)
 150                goto out_sleep;
 151
 152        /* stop it after some time of inactivity */
 153        mod_timer(&wlvif->rx_streaming_timer,
 154                  jiffies + msecs_to_jiffies(wl->conf.rx_streaming.duration));
 155
 156out_sleep:
 157        pm_runtime_mark_last_busy(wl->dev);
 158        pm_runtime_put_autosuspend(wl->dev);
 159out:
 160        mutex_unlock(&wl->mutex);
 161}
 162
 163static void wl1271_rx_streaming_disable_work(struct work_struct *work)
 164{
 165        int ret;
 166        struct wl12xx_vif *wlvif = container_of(work, struct wl12xx_vif,
 167                                                rx_streaming_disable_work);
 168        struct wl1271 *wl = wlvif->wl;
 169
 170        mutex_lock(&wl->mutex);
 171
 172        if (!test_bit(WLVIF_FLAG_RX_STREAMING_STARTED, &wlvif->flags))
 173                goto out;
 174
 175        ret = pm_runtime_resume_and_get(wl->dev);
 176        if (ret < 0)
 177                goto out;
 178
 179        ret = wl1271_set_rx_streaming(wl, wlvif, false);
 180        if (ret)
 181                goto out_sleep;
 182
 183out_sleep:
 184        pm_runtime_mark_last_busy(wl->dev);
 185        pm_runtime_put_autosuspend(wl->dev);
 186out:
 187        mutex_unlock(&wl->mutex);
 188}
 189
 190static void wl1271_rx_streaming_timer(struct timer_list *t)
 191{
 192        struct wl12xx_vif *wlvif = from_timer(wlvif, t, rx_streaming_timer);
 193        struct wl1271 *wl = wlvif->wl;
 194        ieee80211_queue_work(wl->hw, &wlvif->rx_streaming_disable_work);
 195}
 196
 197/* wl->mutex must be taken */
 198void wl12xx_rearm_tx_watchdog_locked(struct wl1271 *wl)
 199{
 200        /* if the watchdog is not armed, don't do anything */
 201        if (wl->tx_allocated_blocks == 0)
 202                return;
 203
 204        cancel_delayed_work(&wl->tx_watchdog_work);
 205        ieee80211_queue_delayed_work(wl->hw, &wl->tx_watchdog_work,
 206                msecs_to_jiffies(wl->conf.tx.tx_watchdog_timeout));
 207}
 208
 209static void wlcore_rc_update_work(struct work_struct *work)
 210{
 211        int ret;
 212        struct wl12xx_vif *wlvif = container_of(work, struct wl12xx_vif,
 213                                                rc_update_work);
 214        struct wl1271 *wl = wlvif->wl;
 215        struct ieee80211_vif *vif = wl12xx_wlvif_to_vif(wlvif);
 216
 217        mutex_lock(&wl->mutex);
 218
 219        if (unlikely(wl->state != WLCORE_STATE_ON))
 220                goto out;
 221
 222        ret = pm_runtime_resume_and_get(wl->dev);
 223        if (ret < 0)
 224                goto out;
 225
 226        if (ieee80211_vif_is_mesh(vif)) {
 227                ret = wl1271_acx_set_ht_capabilities(wl, &wlvif->rc_ht_cap,
 228                                                     true, wlvif->sta.hlid);
 229                if (ret < 0)
 230                        goto out_sleep;
 231        } else {
 232                wlcore_hw_sta_rc_update(wl, wlvif);
 233        }
 234
 235out_sleep:
 236        pm_runtime_mark_last_busy(wl->dev);
 237        pm_runtime_put_autosuspend(wl->dev);
 238out:
 239        mutex_unlock(&wl->mutex);
 240}
 241
 242static void wl12xx_tx_watchdog_work(struct work_struct *work)
 243{
 244        struct delayed_work *dwork;
 245        struct wl1271 *wl;
 246
 247        dwork = to_delayed_work(work);
 248        wl = container_of(dwork, struct wl1271, tx_watchdog_work);
 249
 250        mutex_lock(&wl->mutex);
 251
 252        if (unlikely(wl->state != WLCORE_STATE_ON))
 253                goto out;
 254
 255        /* Tx went out in the meantime - everything is ok */
 256        if (unlikely(wl->tx_allocated_blocks == 0))
 257                goto out;
 258
 259        /*
 260         * if a ROC is in progress, we might not have any Tx for a long
 261         * time (e.g. pending Tx on the non-ROC channels)
 262         */
 263        if (find_first_bit(wl->roc_map, WL12XX_MAX_ROLES) < WL12XX_MAX_ROLES) {
 264                wl1271_debug(DEBUG_TX, "No Tx (in FW) for %d ms due to ROC",
 265                             wl->conf.tx.tx_watchdog_timeout);
 266                wl12xx_rearm_tx_watchdog_locked(wl);
 267                goto out;
 268        }
 269
 270        /*
 271         * if a scan is in progress, we might not have any Tx for a long
 272         * time
 273         */
 274        if (wl->scan.state != WL1271_SCAN_STATE_IDLE) {
 275                wl1271_debug(DEBUG_TX, "No Tx (in FW) for %d ms due to scan",
 276                             wl->conf.tx.tx_watchdog_timeout);
 277                wl12xx_rearm_tx_watchdog_locked(wl);
 278                goto out;
 279        }
 280
 281        /*
 282        * AP might cache a frame for a long time for a sleeping station,
 283        * so rearm the timer if there's an AP interface with stations. If
 284        * Tx is genuinely stuck we will most hopefully discover it when all
 285        * stations are removed due to inactivity.
 286        */
 287        if (wl->active_sta_count) {
 288                wl1271_debug(DEBUG_TX, "No Tx (in FW) for %d ms. AP has "
 289                             " %d stations",
 290                              wl->conf.tx.tx_watchdog_timeout,
 291                              wl->active_sta_count);
 292                wl12xx_rearm_tx_watchdog_locked(wl);
 293                goto out;
 294        }
 295
 296        wl1271_error("Tx stuck (in FW) for %d ms. Starting recovery",
 297                     wl->conf.tx.tx_watchdog_timeout);
 298        wl12xx_queue_recovery_work(wl);
 299
 300out:
 301        mutex_unlock(&wl->mutex);
 302}
 303
 304static void wlcore_adjust_conf(struct wl1271 *wl)
 305{
 306
 307        if (fwlog_param) {
 308                if (!strcmp(fwlog_param, "continuous")) {
 309                        wl->conf.fwlog.mode = WL12XX_FWLOG_CONTINUOUS;
 310                        wl->conf.fwlog.output = WL12XX_FWLOG_OUTPUT_HOST;
 311                } else if (!strcmp(fwlog_param, "dbgpins")) {
 312                        wl->conf.fwlog.mode = WL12XX_FWLOG_CONTINUOUS;
 313                        wl->conf.fwlog.output = WL12XX_FWLOG_OUTPUT_DBG_PINS;
 314                } else if (!strcmp(fwlog_param, "disable")) {
 315                        wl->conf.fwlog.mem_blocks = 0;
 316                        wl->conf.fwlog.output = WL12XX_FWLOG_OUTPUT_NONE;
 317                } else {
 318                        wl1271_error("Unknown fwlog parameter %s", fwlog_param);
 319                }
 320        }
 321
 322        if (bug_on_recovery != -1)
 323                wl->conf.recovery.bug_on_recovery = (u8) bug_on_recovery;
 324
 325        if (no_recovery != -1)
 326                wl->conf.recovery.no_recovery = (u8) no_recovery;
 327}
 328
 329static void wl12xx_irq_ps_regulate_link(struct wl1271 *wl,
 330                                        struct wl12xx_vif *wlvif,
 331                                        u8 hlid, u8 tx_pkts)
 332{
 333        bool fw_ps;
 334
 335        fw_ps = test_bit(hlid, &wl->ap_fw_ps_map);
 336
 337        /*
 338         * Wake up from high level PS if the STA is asleep with too little
 339         * packets in FW or if the STA is awake.
 340         */
 341        if (!fw_ps || tx_pkts < WL1271_PS_STA_MAX_PACKETS)
 342                wl12xx_ps_link_end(wl, wlvif, hlid);
 343
 344        /*
 345         * Start high-level PS if the STA is asleep with enough blocks in FW.
 346         * Make an exception if this is the only connected link. In this
 347         * case FW-memory congestion is less of a problem.
 348         * Note that a single connected STA means 2*ap_count + 1 active links,
 349         * since we must account for the global and broadcast AP links
 350         * for each AP. The "fw_ps" check assures us the other link is a STA
 351         * connected to the AP. Otherwise the FW would not set the PSM bit.
 352         */
 353        else if (wl->active_link_count > (wl->ap_count*2 + 1) && fw_ps &&
 354                 tx_pkts >= WL1271_PS_STA_MAX_PACKETS)
 355                wl12xx_ps_link_start(wl, wlvif, hlid, true);
 356}
 357
 358static void wl12xx_irq_update_links_status(struct wl1271 *wl,
 359                                           struct wl12xx_vif *wlvif,
 360                                           struct wl_fw_status *status)
 361{
 362        unsigned long cur_fw_ps_map;
 363        u8 hlid;
 364
 365        cur_fw_ps_map = status->link_ps_bitmap;
 366        if (wl->ap_fw_ps_map != cur_fw_ps_map) {
 367                wl1271_debug(DEBUG_PSM,
 368                             "link ps prev 0x%lx cur 0x%lx changed 0x%lx",
 369                             wl->ap_fw_ps_map, cur_fw_ps_map,
 370                             wl->ap_fw_ps_map ^ cur_fw_ps_map);
 371
 372                wl->ap_fw_ps_map = cur_fw_ps_map;
 373        }
 374
 375        for_each_set_bit(hlid, wlvif->ap.sta_hlid_map, wl->num_links)
 376                wl12xx_irq_ps_regulate_link(wl, wlvif, hlid,
 377                                            wl->links[hlid].allocated_pkts);
 378}
 379
 380static int wlcore_fw_status(struct wl1271 *wl, struct wl_fw_status *status)
 381{
 382        struct wl12xx_vif *wlvif;
 383        u32 old_tx_blk_count = wl->tx_blocks_available;
 384        int avail, freed_blocks;
 385        int i;
 386        int ret;
 387        struct wl1271_link *lnk;
 388
 389        ret = wlcore_raw_read_data(wl, REG_RAW_FW_STATUS_ADDR,
 390                                   wl->raw_fw_status,
 391                                   wl->fw_status_len, false);
 392        if (ret < 0)
 393                return ret;
 394
 395        wlcore_hw_convert_fw_status(wl, wl->raw_fw_status, wl->fw_status);
 396
 397        wl1271_debug(DEBUG_IRQ, "intr: 0x%x (fw_rx_counter = %d, "
 398                     "drv_rx_counter = %d, tx_results_counter = %d)",
 399                     status->intr,
 400                     status->fw_rx_counter,
 401                     status->drv_rx_counter,
 402                     status->tx_results_counter);
 403
 404        for (i = 0; i < NUM_TX_QUEUES; i++) {
 405                /* prevent wrap-around in freed-packets counter */
 406                wl->tx_allocated_pkts[i] -=
 407                                (status->counters.tx_released_pkts[i] -
 408                                wl->tx_pkts_freed[i]) & 0xff;
 409
 410                wl->tx_pkts_freed[i] = status->counters.tx_released_pkts[i];
 411        }
 412
 413
 414        for_each_set_bit(i, wl->links_map, wl->num_links) {
 415                u8 diff;
 416                lnk = &wl->links[i];
 417
 418                /* prevent wrap-around in freed-packets counter */
 419                diff = (status->counters.tx_lnk_free_pkts[i] -
 420                       lnk->prev_freed_pkts) & 0xff;
 421
 422                if (diff == 0)
 423                        continue;
 424
 425                lnk->allocated_pkts -= diff;
 426                lnk->prev_freed_pkts = status->counters.tx_lnk_free_pkts[i];
 427
 428                /* accumulate the prev_freed_pkts counter */
 429                lnk->total_freed_pkts += diff;
 430        }
 431
 432        /* prevent wrap-around in total blocks counter */
 433        if (likely(wl->tx_blocks_freed <= status->total_released_blks))
 434                freed_blocks = status->total_released_blks -
 435                               wl->tx_blocks_freed;
 436        else
 437                freed_blocks = 0x100000000LL - wl->tx_blocks_freed +
 438                               status->total_released_blks;
 439
 440        wl->tx_blocks_freed = status->total_released_blks;
 441
 442        wl->tx_allocated_blocks -= freed_blocks;
 443
 444        /*
 445         * If the FW freed some blocks:
 446         * If we still have allocated blocks - re-arm the timer, Tx is
 447         * not stuck. Otherwise, cancel the timer (no Tx currently).
 448         */
 449        if (freed_blocks) {
 450                if (wl->tx_allocated_blocks)
 451                        wl12xx_rearm_tx_watchdog_locked(wl);
 452                else
 453                        cancel_delayed_work(&wl->tx_watchdog_work);
 454        }
 455
 456        avail = status->tx_total - wl->tx_allocated_blocks;
 457
 458        /*
 459         * The FW might change the total number of TX memblocks before
 460         * we get a notification about blocks being released. Thus, the
 461         * available blocks calculation might yield a temporary result
 462         * which is lower than the actual available blocks. Keeping in
 463         * mind that only blocks that were allocated can be moved from
 464         * TX to RX, tx_blocks_available should never decrease here.
 465         */
 466        wl->tx_blocks_available = max((int)wl->tx_blocks_available,
 467                                      avail);
 468
 469        /* if more blocks are available now, tx work can be scheduled */
 470        if (wl->tx_blocks_available > old_tx_blk_count)
 471                clear_bit(WL1271_FLAG_FW_TX_BUSY, &wl->flags);
 472
 473        /* for AP update num of allocated TX blocks per link and ps status */
 474        wl12xx_for_each_wlvif_ap(wl, wlvif) {
 475                wl12xx_irq_update_links_status(wl, wlvif, status);
 476        }
 477
 478        /* update the host-chipset time offset */
 479        wl->time_offset = (ktime_get_boottime_ns() >> 10) -
 480                (s64)(status->fw_localtime);
 481
 482        wl->fw_fast_lnk_map = status->link_fast_bitmap;
 483
 484        return 0;
 485}
 486
 487static void wl1271_flush_deferred_work(struct wl1271 *wl)
 488{
 489        struct sk_buff *skb;
 490
 491        /* Pass all received frames to the network stack */
 492        while ((skb = skb_dequeue(&wl->deferred_rx_queue)))
 493                ieee80211_rx_ni(wl->hw, skb);
 494
 495        /* Return sent skbs to the network stack */
 496        while ((skb = skb_dequeue(&wl->deferred_tx_queue)))
 497                ieee80211_tx_status_ni(wl->hw, skb);
 498}
 499
 500static void wl1271_netstack_work(struct work_struct *work)
 501{
 502        struct wl1271 *wl =
 503                container_of(work, struct wl1271, netstack_work);
 504
 505        do {
 506                wl1271_flush_deferred_work(wl);
 507        } while (skb_queue_len(&wl->deferred_rx_queue));
 508}
 509
 510#define WL1271_IRQ_MAX_LOOPS 256
 511
 512static int wlcore_irq_locked(struct wl1271 *wl)
 513{
 514        int ret = 0;
 515        u32 intr;
 516        int loopcount = WL1271_IRQ_MAX_LOOPS;
 517        bool run_tx_queue = true;
 518        bool done = false;
 519        unsigned int defer_count;
 520        unsigned long flags;
 521
 522        /*
 523         * In case edge triggered interrupt must be used, we cannot iterate
 524         * more than once without introducing race conditions with the hardirq.
 525         */
 526        if (wl->irq_flags & (IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING))
 527                loopcount = 1;
 528
 529        wl1271_debug(DEBUG_IRQ, "IRQ work");
 530
 531        if (unlikely(wl->state != WLCORE_STATE_ON))
 532                goto out;
 533
 534        ret = pm_runtime_resume_and_get(wl->dev);
 535        if (ret < 0)
 536                goto out;
 537
 538        while (!done && loopcount--) {
 539                smp_mb__after_atomic();
 540
 541                ret = wlcore_fw_status(wl, wl->fw_status);
 542                if (ret < 0)
 543                        goto err_ret;
 544
 545                wlcore_hw_tx_immediate_compl(wl);
 546
 547                intr = wl->fw_status->intr;
 548                intr &= WLCORE_ALL_INTR_MASK;
 549                if (!intr) {
 550                        done = true;
 551                        continue;
 552                }
 553
 554                if (unlikely(intr & WL1271_ACX_INTR_WATCHDOG)) {
 555                        wl1271_error("HW watchdog interrupt received! starting recovery.");
 556                        wl->watchdog_recovery = true;
 557                        ret = -EIO;
 558
 559                        /* restarting the chip. ignore any other interrupt. */
 560                        goto err_ret;
 561                }
 562
 563                if (unlikely(intr & WL1271_ACX_SW_INTR_WATCHDOG)) {
 564                        wl1271_error("SW watchdog interrupt received! "
 565                                     "starting recovery.");
 566                        wl->watchdog_recovery = true;
 567                        ret = -EIO;
 568
 569                        /* restarting the chip. ignore any other interrupt. */
 570                        goto err_ret;
 571                }
 572
 573                if (likely(intr & WL1271_ACX_INTR_DATA)) {
 574                        wl1271_debug(DEBUG_IRQ, "WL1271_ACX_INTR_DATA");
 575
 576                        ret = wlcore_rx(wl, wl->fw_status);
 577                        if (ret < 0)
 578                                goto err_ret;
 579
 580                        /* Check if any tx blocks were freed */
 581                        if (!test_bit(WL1271_FLAG_FW_TX_BUSY, &wl->flags)) {
 582                                if (spin_trylock_irqsave(&wl->wl_lock, flags)) {
 583                                        if (!wl1271_tx_total_queue_count(wl))
 584                                                run_tx_queue = false;
 585                                        spin_unlock_irqrestore(&wl->wl_lock, flags);
 586                                }
 587
 588                                /*
 589                                 * In order to avoid starvation of the TX path,
 590                                 * call the work function directly.
 591                                 */
 592                                if (run_tx_queue) {
 593                                        ret = wlcore_tx_work_locked(wl);
 594                                        if (ret < 0)
 595                                                goto err_ret;
 596                                }
 597                        }
 598
 599                        /* check for tx results */
 600                        ret = wlcore_hw_tx_delayed_compl(wl);
 601                        if (ret < 0)
 602                                goto err_ret;
 603
 604                        /* Make sure the deferred queues don't get too long */
 605                        defer_count = skb_queue_len(&wl->deferred_tx_queue) +
 606                                      skb_queue_len(&wl->deferred_rx_queue);
 607                        if (defer_count > WL1271_DEFERRED_QUEUE_LIMIT)
 608                                wl1271_flush_deferred_work(wl);
 609                }
 610
 611                if (intr & WL1271_ACX_INTR_EVENT_A) {
 612                        wl1271_debug(DEBUG_IRQ, "WL1271_ACX_INTR_EVENT_A");
 613                        ret = wl1271_event_handle(wl, 0);
 614                        if (ret < 0)
 615                                goto err_ret;
 616                }
 617
 618                if (intr & WL1271_ACX_INTR_EVENT_B) {
 619                        wl1271_debug(DEBUG_IRQ, "WL1271_ACX_INTR_EVENT_B");
 620                        ret = wl1271_event_handle(wl, 1);
 621                        if (ret < 0)
 622                                goto err_ret;
 623                }
 624
 625                if (intr & WL1271_ACX_INTR_INIT_COMPLETE)
 626                        wl1271_debug(DEBUG_IRQ,
 627                                     "WL1271_ACX_INTR_INIT_COMPLETE");
 628
 629                if (intr & WL1271_ACX_INTR_HW_AVAILABLE)
 630                        wl1271_debug(DEBUG_IRQ, "WL1271_ACX_INTR_HW_AVAILABLE");
 631        }
 632
 633err_ret:
 634        pm_runtime_mark_last_busy(wl->dev);
 635        pm_runtime_put_autosuspend(wl->dev);
 636
 637out:
 638        return ret;
 639}
 640
 641static irqreturn_t wlcore_irq(int irq, void *cookie)
 642{
 643        int ret;
 644        unsigned long flags;
 645        struct wl1271 *wl = cookie;
 646        bool queue_tx_work = true;
 647
 648        set_bit(WL1271_FLAG_IRQ_RUNNING, &wl->flags);
 649
 650        /* complete the ELP completion */
 651        if (test_bit(WL1271_FLAG_IN_ELP, &wl->flags)) {
 652                spin_lock_irqsave(&wl->wl_lock, flags);
 653                if (wl->elp_compl)
 654                        complete(wl->elp_compl);
 655                spin_unlock_irqrestore(&wl->wl_lock, flags);
 656        }
 657
 658        if (test_bit(WL1271_FLAG_SUSPENDED, &wl->flags)) {
 659                /* don't enqueue a work right now. mark it as pending */
 660                set_bit(WL1271_FLAG_PENDING_WORK, &wl->flags);
 661                wl1271_debug(DEBUG_IRQ, "should not enqueue work");
 662                spin_lock_irqsave(&wl->wl_lock, flags);
 663                disable_irq_nosync(wl->irq);
 664                pm_wakeup_event(wl->dev, 0);
 665                spin_unlock_irqrestore(&wl->wl_lock, flags);
 666                goto out_handled;
 667        }
 668
 669        /* TX might be handled here, avoid redundant work */
 670        set_bit(WL1271_FLAG_TX_PENDING, &wl->flags);
 671        cancel_work_sync(&wl->tx_work);
 672
 673        mutex_lock(&wl->mutex);
 674
 675        ret = wlcore_irq_locked(wl);
 676        if (ret)
 677                wl12xx_queue_recovery_work(wl);
 678
 679        /* In case TX was not handled in wlcore_irq_locked(), queue TX work */
 680        clear_bit(WL1271_FLAG_TX_PENDING, &wl->flags);
 681        if (!test_bit(WL1271_FLAG_FW_TX_BUSY, &wl->flags)) {
 682                if (spin_trylock_irqsave(&wl->wl_lock, flags)) {
 683                        if (!wl1271_tx_total_queue_count(wl))
 684                                queue_tx_work = false;
 685                        spin_unlock_irqrestore(&wl->wl_lock, flags);
 686                }
 687                if (queue_tx_work)
 688                        ieee80211_queue_work(wl->hw, &wl->tx_work);
 689        }
 690
 691        mutex_unlock(&wl->mutex);
 692
 693out_handled:
 694        clear_bit(WL1271_FLAG_IRQ_RUNNING, &wl->flags);
 695
 696        return IRQ_HANDLED;
 697}
 698
 699struct vif_counter_data {
 700        u8 counter;
 701
 702        struct ieee80211_vif *cur_vif;
 703        bool cur_vif_running;
 704};
 705
 706static void wl12xx_vif_count_iter(void *data, u8 *mac,
 707                                  struct ieee80211_vif *vif)
 708{
 709        struct vif_counter_data *counter = data;
 710
 711        counter->counter++;
 712        if (counter->cur_vif == vif)
 713                counter->cur_vif_running = true;
 714}
 715
 716/* caller must not hold wl->mutex, as it might deadlock */
 717static void wl12xx_get_vif_count(struct ieee80211_hw *hw,
 718                               struct ieee80211_vif *cur_vif,
 719                               struct vif_counter_data *data)
 720{
 721        memset(data, 0, sizeof(*data));
 722        data->cur_vif = cur_vif;
 723
 724        ieee80211_iterate_active_interfaces(hw, IEEE80211_IFACE_ITER_RESUME_ALL,
 725                                            wl12xx_vif_count_iter, data);
 726}
 727
 728static int wl12xx_fetch_firmware(struct wl1271 *wl, bool plt)
 729{
 730        const struct firmware *fw;
 731        const char *fw_name;
 732        enum wl12xx_fw_type fw_type;
 733        int ret;
 734
 735        if (plt) {
 736                fw_type = WL12XX_FW_TYPE_PLT;
 737                fw_name = wl->plt_fw_name;
 738        } else {
 739                /*
 740                 * we can't call wl12xx_get_vif_count() here because
 741                 * wl->mutex is taken, so use the cached last_vif_count value
 742                 */
 743                if (wl->last_vif_count > 1 && wl->mr_fw_name) {
 744                        fw_type = WL12XX_FW_TYPE_MULTI;
 745                        fw_name = wl->mr_fw_name;
 746                } else {
 747                        fw_type = WL12XX_FW_TYPE_NORMAL;
 748                        fw_name = wl->sr_fw_name;
 749                }
 750        }
 751
 752        if (wl->fw_type == fw_type)
 753                return 0;
 754
 755        wl1271_debug(DEBUG_BOOT, "booting firmware %s", fw_name);
 756
 757        ret = request_firmware(&fw, fw_name, wl->dev);
 758
 759        if (ret < 0) {
 760                wl1271_error("could not get firmware %s: %d", fw_name, ret);
 761                return ret;
 762        }
 763
 764        if (fw->size % 4) {
 765                wl1271_error("firmware size is not multiple of 32 bits: %zu",
 766                             fw->size);
 767                ret = -EILSEQ;
 768                goto out;
 769        }
 770
 771        vfree(wl->fw);
 772        wl->fw_type = WL12XX_FW_TYPE_NONE;
 773        wl->fw_len = fw->size;
 774        wl->fw = vmalloc(wl->fw_len);
 775
 776        if (!wl->fw) {
 777                wl1271_error("could not allocate memory for the firmware");
 778                ret = -ENOMEM;
 779                goto out;
 780        }
 781
 782        memcpy(wl->fw, fw->data, wl->fw_len);
 783        ret = 0;
 784        wl->fw_type = fw_type;
 785out:
 786        release_firmware(fw);
 787
 788        return ret;
 789}
 790
 791void wl12xx_queue_recovery_work(struct wl1271 *wl)
 792{
 793        /* Avoid a recursive recovery */
 794        if (wl->state == WLCORE_STATE_ON) {
 795                WARN_ON(!test_bit(WL1271_FLAG_INTENDED_FW_RECOVERY,
 796                                  &wl->flags));
 797
 798                wl->state = WLCORE_STATE_RESTARTING;
 799                set_bit(WL1271_FLAG_RECOVERY_IN_PROGRESS, &wl->flags);
 800                ieee80211_queue_work(wl->hw, &wl->recovery_work);
 801        }
 802}
 803
 804size_t wl12xx_copy_fwlog(struct wl1271 *wl, u8 *memblock, size_t maxlen)
 805{
 806        size_t len;
 807
 808        /* Make sure we have enough room */
 809        len = min_t(size_t, maxlen, PAGE_SIZE - wl->fwlog_size);
 810
 811        /* Fill the FW log file, consumed by the sysfs fwlog entry */
 812        memcpy(wl->fwlog + wl->fwlog_size, memblock, len);
 813        wl->fwlog_size += len;
 814
 815        return len;
 816}
 817
 818static void wl12xx_read_fwlog_panic(struct wl1271 *wl)
 819{
 820        u32 end_of_log = 0;
 821        int error;
 822
 823        if (wl->quirks & WLCORE_QUIRK_FWLOG_NOT_IMPLEMENTED)
 824                return;
 825
 826        wl1271_info("Reading FW panic log");
 827
 828        /*
 829         * Make sure the chip is awake and the logger isn't active.
 830         * Do not send a stop fwlog command if the fw is hanged or if
 831         * dbgpins are used (due to some fw bug).
 832         */
 833        error = pm_runtime_resume_and_get(wl->dev);
 834        if (error < 0)
 835                return;
 836        if (!wl->watchdog_recovery &&
 837            wl->conf.fwlog.output != WL12XX_FWLOG_OUTPUT_DBG_PINS)
 838                wl12xx_cmd_stop_fwlog(wl);
 839
 840        /* Traverse the memory blocks linked list */
 841        do {
 842                end_of_log = wlcore_event_fw_logger(wl);
 843                if (end_of_log == 0) {
 844                        msleep(100);
 845                        end_of_log = wlcore_event_fw_logger(wl);
 846                }
 847        } while (end_of_log != 0);
 848}
 849
 850static void wlcore_save_freed_pkts(struct wl1271 *wl, struct wl12xx_vif *wlvif,
 851                                   u8 hlid, struct ieee80211_sta *sta)
 852{
 853        struct wl1271_station *wl_sta;
 854        u32 sqn_recovery_padding = WL1271_TX_SQN_POST_RECOVERY_PADDING;
 855
 856        wl_sta = (void *)sta->drv_priv;
 857        wl_sta->total_freed_pkts = wl->links[hlid].total_freed_pkts;
 858
 859        /*
 860         * increment the initial seq number on recovery to account for
 861         * transmitted packets that we haven't yet got in the FW status
 862         */
 863        if (wlvif->encryption_type == KEY_GEM)
 864                sqn_recovery_padding = WL1271_TX_SQN_POST_RECOVERY_PADDING_GEM;
 865
 866        if (test_bit(WL1271_FLAG_RECOVERY_IN_PROGRESS, &wl->flags))
 867                wl_sta->total_freed_pkts += sqn_recovery_padding;
 868}
 869
 870static void wlcore_save_freed_pkts_addr(struct wl1271 *wl,
 871                                        struct wl12xx_vif *wlvif,
 872                                        u8 hlid, const u8 *addr)
 873{
 874        struct ieee80211_sta *sta;
 875        struct ieee80211_vif *vif = wl12xx_wlvif_to_vif(wlvif);
 876
 877        if (WARN_ON(hlid == WL12XX_INVALID_LINK_ID ||
 878                    is_zero_ether_addr(addr)))
 879                return;
 880
 881        rcu_read_lock();
 882        sta = ieee80211_find_sta(vif, addr);
 883        if (sta)
 884                wlcore_save_freed_pkts(wl, wlvif, hlid, sta);
 885        rcu_read_unlock();
 886}
 887
 888static void wlcore_print_recovery(struct wl1271 *wl)
 889{
 890        u32 pc = 0;
 891        u32 hint_sts = 0;
 892        int ret;
 893
 894        wl1271_info("Hardware recovery in progress. FW ver: %s",
 895                    wl->chip.fw_ver_str);
 896
 897        /* change partitions momentarily so we can read the FW pc */
 898        ret = wlcore_set_partition(wl, &wl->ptable[PART_BOOT]);
 899        if (ret < 0)
 900                return;
 901
 902        ret = wlcore_read_reg(wl, REG_PC_ON_RECOVERY, &pc);
 903        if (ret < 0)
 904                return;
 905
 906        ret = wlcore_read_reg(wl, REG_INTERRUPT_NO_CLEAR, &hint_sts);
 907        if (ret < 0)
 908                return;
 909
 910        wl1271_info("pc: 0x%x, hint_sts: 0x%08x count: %d",
 911                                pc, hint_sts, ++wl->recovery_count);
 912
 913        wlcore_set_partition(wl, &wl->ptable[PART_WORK]);
 914}
 915
 916
 917static void wl1271_recovery_work(struct work_struct *work)
 918{
 919        struct wl1271 *wl =
 920                container_of(work, struct wl1271, recovery_work);
 921        struct wl12xx_vif *wlvif;
 922        struct ieee80211_vif *vif;
 923        int error;
 924
 925        mutex_lock(&wl->mutex);
 926
 927        if (wl->state == WLCORE_STATE_OFF || wl->plt)
 928                goto out_unlock;
 929
 930        error = pm_runtime_resume_and_get(wl->dev);
 931        if (error < 0)
 932                wl1271_warning("Enable for recovery failed");
 933        wlcore_disable_interrupts_nosync(wl);
 934
 935        if (!test_bit(WL1271_FLAG_INTENDED_FW_RECOVERY, &wl->flags)) {
 936                if (wl->conf.fwlog.output == WL12XX_FWLOG_OUTPUT_HOST)
 937                        wl12xx_read_fwlog_panic(wl);
 938                wlcore_print_recovery(wl);
 939        }
 940
 941        BUG_ON(wl->conf.recovery.bug_on_recovery &&
 942               !test_bit(WL1271_FLAG_INTENDED_FW_RECOVERY, &wl->flags));
 943
 944        clear_bit(WL1271_FLAG_INTENDED_FW_RECOVERY, &wl->flags);
 945
 946        if (wl->conf.recovery.no_recovery) {
 947                wl1271_info("No recovery (chosen on module load). Fw will remain stuck.");
 948                goto out_unlock;
 949        }
 950
 951        /* Prevent spurious TX during FW restart */
 952        wlcore_stop_queues(wl, WLCORE_QUEUE_STOP_REASON_FW_RESTART);
 953
 954        /* reboot the chipset */
 955        while (!list_empty(&wl->wlvif_list)) {
 956                wlvif = list_first_entry(&wl->wlvif_list,
 957                                       struct wl12xx_vif, list);
 958                vif = wl12xx_wlvif_to_vif(wlvif);
 959
 960                if (wlvif->bss_type == BSS_TYPE_STA_BSS &&
 961                    test_bit(WLVIF_FLAG_STA_ASSOCIATED, &wlvif->flags)) {
 962                        wlcore_save_freed_pkts_addr(wl, wlvif, wlvif->sta.hlid,
 963                                                    vif->bss_conf.bssid);
 964                }
 965
 966                __wl1271_op_remove_interface(wl, vif, false);
 967        }
 968
 969        wlcore_op_stop_locked(wl);
 970        pm_runtime_mark_last_busy(wl->dev);
 971        pm_runtime_put_autosuspend(wl->dev);
 972
 973        ieee80211_restart_hw(wl->hw);
 974
 975        /*
 976         * Its safe to enable TX now - the queues are stopped after a request
 977         * to restart the HW.
 978         */
 979        wlcore_wake_queues(wl, WLCORE_QUEUE_STOP_REASON_FW_RESTART);
 980
 981out_unlock:
 982        wl->watchdog_recovery = false;
 983        clear_bit(WL1271_FLAG_RECOVERY_IN_PROGRESS, &wl->flags);
 984        mutex_unlock(&wl->mutex);
 985}
 986
 987static int wlcore_fw_wakeup(struct wl1271 *wl)
 988{
 989        return wlcore_raw_write32(wl, HW_ACCESS_ELP_CTRL_REG, ELPCTRL_WAKE_UP);
 990}
 991
 992static int wl1271_setup(struct wl1271 *wl)
 993{
 994        wl->raw_fw_status = kzalloc(wl->fw_status_len, GFP_KERNEL);
 995        if (!wl->raw_fw_status)
 996                goto err;
 997
 998        wl->fw_status = kzalloc(sizeof(*wl->fw_status), GFP_KERNEL);
 999        if (!wl->fw_status)
1000                goto err;
1001
1002        wl->tx_res_if = kzalloc(sizeof(*wl->tx_res_if), GFP_KERNEL);
1003        if (!wl->tx_res_if)
1004                goto err;
1005
1006        return 0;
1007err:
1008        kfree(wl->fw_status);
1009        kfree(wl->raw_fw_status);
1010        return -ENOMEM;
1011}
1012
1013static int wl12xx_set_power_on(struct wl1271 *wl)
1014{
1015        int ret;
1016
1017        msleep(WL1271_PRE_POWER_ON_SLEEP);
1018        ret = wl1271_power_on(wl);
1019        if (ret < 0)
1020                goto out;
1021        msleep(WL1271_POWER_ON_SLEEP);
1022        wl1271_io_reset(wl);
1023        wl1271_io_init(wl);
1024
1025        ret = wlcore_set_partition(wl, &wl->ptable[PART_BOOT]);
1026        if (ret < 0)
1027                goto fail;
1028
1029        /* ELP module wake up */
1030        ret = wlcore_fw_wakeup(wl);
1031        if (ret < 0)
1032                goto fail;
1033
1034out:
1035        return ret;
1036
1037fail:
1038        wl1271_power_off(wl);
1039        return ret;
1040}
1041
1042static int wl12xx_chip_wakeup(struct wl1271 *wl, bool plt)
1043{
1044        int ret = 0;
1045
1046        ret = wl12xx_set_power_on(wl);
1047        if (ret < 0)
1048                goto out;
1049
1050        /*
1051         * For wl127x based devices we could use the default block
1052         * size (512 bytes), but due to a bug in the sdio driver, we
1053         * need to set it explicitly after the chip is powered on.  To
1054         * simplify the code and since the performance impact is
1055         * negligible, we use the same block size for all different
1056         * chip types.
1057         *
1058         * Check if the bus supports blocksize alignment and, if it
1059         * doesn't, make sure we don't have the quirk.
1060         */
1061        if (!wl1271_set_block_size(wl))
1062                wl->quirks &= ~WLCORE_QUIRK_TX_BLOCKSIZE_ALIGN;
1063
1064        /* TODO: make sure the lower driver has set things up correctly */
1065
1066        ret = wl1271_setup(wl);
1067        if (ret < 0)
1068                goto out;
1069
1070        ret = wl12xx_fetch_firmware(wl, plt);
1071        if (ret < 0) {
1072                kfree(wl->fw_status);
1073                kfree(wl->raw_fw_status);
1074                kfree(wl->tx_res_if);
1075        }
1076
1077out:
1078        return ret;
1079}
1080
1081int wl1271_plt_start(struct wl1271 *wl, const enum plt_mode plt_mode)
1082{
1083        int retries = WL1271_BOOT_RETRIES;
1084        struct wiphy *wiphy = wl->hw->wiphy;
1085
1086        static const char* const PLT_MODE[] = {
1087                "PLT_OFF",
1088                "PLT_ON",
1089                "PLT_FEM_DETECT",
1090                "PLT_CHIP_AWAKE"
1091        };
1092
1093        int ret;
1094
1095        mutex_lock(&wl->mutex);
1096
1097        wl1271_notice("power up");
1098
1099        if (wl->state != WLCORE_STATE_OFF) {
1100                wl1271_error("cannot go into PLT state because not "
1101                             "in off state: %d", wl->state);
1102                ret = -EBUSY;
1103                goto out;
1104        }
1105
1106        /* Indicate to lower levels that we are now in PLT mode */
1107        wl->plt = true;
1108        wl->plt_mode = plt_mode;
1109
1110        while (retries) {
1111                retries--;
1112                ret = wl12xx_chip_wakeup(wl, true);
1113                if (ret < 0)
1114                        goto power_off;
1115
1116                if (plt_mode != PLT_CHIP_AWAKE) {
1117                        ret = wl->ops->plt_init(wl);
1118                        if (ret < 0)
1119                                goto power_off;
1120                }
1121
1122                wl->state = WLCORE_STATE_ON;
1123                wl1271_notice("firmware booted in PLT mode %s (%s)",
1124                              PLT_MODE[plt_mode],
1125                              wl->chip.fw_ver_str);
1126
1127                /* update hw/fw version info in wiphy struct */
1128                wiphy->hw_version = wl->chip.id;
1129                strncpy(wiphy->fw_version, wl->chip.fw_ver_str,
1130                        sizeof(wiphy->fw_version));
1131
1132                goto out;
1133
1134power_off:
1135                wl1271_power_off(wl);
1136        }
1137
1138        wl->plt = false;
1139        wl->plt_mode = PLT_OFF;
1140
1141        wl1271_error("firmware boot in PLT mode failed despite %d retries",
1142                     WL1271_BOOT_RETRIES);
1143out:
1144        mutex_unlock(&wl->mutex);
1145
1146        return ret;
1147}
1148
1149int wl1271_plt_stop(struct wl1271 *wl)
1150{
1151        int ret = 0;
1152
1153        wl1271_notice("power down");
1154
1155        /*
1156         * Interrupts must be disabled before setting the state to OFF.
1157         * Otherwise, the interrupt handler might be called and exit without
1158         * reading the interrupt status.
1159         */
1160        wlcore_disable_interrupts(wl);
1161        mutex_lock(&wl->mutex);
1162        if (!wl->plt) {
1163                mutex_unlock(&wl->mutex);
1164
1165                /*
1166                 * This will not necessarily enable interrupts as interrupts
1167                 * may have been disabled when op_stop was called. It will,
1168                 * however, balance the above call to disable_interrupts().
1169                 */
1170                wlcore_enable_interrupts(wl);
1171
1172                wl1271_error("cannot power down because not in PLT "
1173                             "state: %d", wl->state);
1174                ret = -EBUSY;
1175                goto out;
1176        }
1177
1178        mutex_unlock(&wl->mutex);
1179
1180        wl1271_flush_deferred_work(wl);
1181        cancel_work_sync(&wl->netstack_work);
1182        cancel_work_sync(&wl->recovery_work);
1183        cancel_delayed_work_sync(&wl->tx_watchdog_work);
1184
1185        mutex_lock(&wl->mutex);
1186        wl1271_power_off(wl);
1187        wl->flags = 0;
1188        wl->sleep_auth = WL1271_PSM_ILLEGAL;
1189        wl->state = WLCORE_STATE_OFF;
1190        wl->plt = false;
1191        wl->plt_mode = PLT_OFF;
1192        wl->rx_counter = 0;
1193        mutex_unlock(&wl->mutex);
1194
1195out:
1196        return ret;
1197}
1198
1199static void wl1271_op_tx(struct ieee80211_hw *hw,
1200                         struct ieee80211_tx_control *control,
1201                         struct sk_buff *skb)
1202{
1203        struct wl1271 *wl = hw->priv;
1204        struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
1205        struct ieee80211_vif *vif = info->control.vif;
1206        struct wl12xx_vif *wlvif = NULL;
1207        unsigned long flags;
1208        int q, mapping;
1209        u8 hlid;
1210
1211        if (!vif) {
1212                wl1271_debug(DEBUG_TX, "DROP skb with no vif");
1213                ieee80211_free_txskb(hw, skb);
1214                return;
1215        }
1216
1217        wlvif = wl12xx_vif_to_data(vif);
1218        mapping = skb_get_queue_mapping(skb);
1219        q = wl1271_tx_get_queue(mapping);
1220
1221        hlid = wl12xx_tx_get_hlid(wl, wlvif, skb, control->sta);
1222
1223        spin_lock_irqsave(&wl->wl_lock, flags);
1224
1225        /*
1226         * drop the packet if the link is invalid or the queue is stopped
1227         * for any reason but watermark. Watermark is a "soft"-stop so we
1228         * allow these packets through.
1229         */
1230        if (hlid == WL12XX_INVALID_LINK_ID ||
1231            (!test_bit(hlid, wlvif->links_map)) ||
1232             (wlcore_is_queue_stopped_locked(wl, wlvif, q) &&
1233              !wlcore_is_queue_stopped_by_reason_locked(wl, wlvif, q,
1234                        WLCORE_QUEUE_STOP_REASON_WATERMARK))) {
1235                wl1271_debug(DEBUG_TX, "DROP skb hlid %d q %d", hlid, q);
1236                ieee80211_free_txskb(hw, skb);
1237                goto out;
1238        }
1239
1240        wl1271_debug(DEBUG_TX, "queue skb hlid %d q %d len %d",
1241                     hlid, q, skb->len);
1242        skb_queue_tail(&wl->links[hlid].tx_queue[q], skb);
1243
1244        wl->tx_queue_count[q]++;
1245        wlvif->tx_queue_count[q]++;
1246
1247        /*
1248         * The workqueue is slow to process the tx_queue and we need stop
1249         * the queue here, otherwise the queue will get too long.
1250         */
1251        if (wlvif->tx_queue_count[q] >= WL1271_TX_QUEUE_HIGH_WATERMARK &&
1252            !wlcore_is_queue_stopped_by_reason_locked(wl, wlvif, q,
1253                                        WLCORE_QUEUE_STOP_REASON_WATERMARK)) {
1254                wl1271_debug(DEBUG_TX, "op_tx: stopping queues for q %d", q);
1255                wlcore_stop_queue_locked(wl, wlvif, q,
1256                                         WLCORE_QUEUE_STOP_REASON_WATERMARK);
1257        }
1258
1259        /*
1260         * The chip specific setup must run before the first TX packet -
1261         * before that, the tx_work will not be initialized!
1262         */
1263
1264        if (!test_bit(WL1271_FLAG_FW_TX_BUSY, &wl->flags) &&
1265            !test_bit(WL1271_FLAG_TX_PENDING, &wl->flags))
1266                ieee80211_queue_work(wl->hw, &wl->tx_work);
1267
1268out:
1269        spin_unlock_irqrestore(&wl->wl_lock, flags);
1270}
1271
1272int wl1271_tx_dummy_packet(struct wl1271 *wl)
1273{
1274        unsigned long flags;
1275        int q;
1276
1277        /* no need to queue a new dummy packet if one is already pending */
1278        if (test_bit(WL1271_FLAG_DUMMY_PACKET_PENDING, &wl->flags))
1279                return 0;
1280
1281        q = wl1271_tx_get_queue(skb_get_queue_mapping(wl->dummy_packet));
1282
1283        spin_lock_irqsave(&wl->wl_lock, flags);
1284        set_bit(WL1271_FLAG_DUMMY_PACKET_PENDING, &wl->flags);
1285        wl->tx_queue_count[q]++;
1286        spin_unlock_irqrestore(&wl->wl_lock, flags);
1287
1288        /* The FW is low on RX memory blocks, so send the dummy packet asap */
1289        if (!test_bit(WL1271_FLAG_FW_TX_BUSY, &wl->flags))
1290                return wlcore_tx_work_locked(wl);
1291
1292        /*
1293         * If the FW TX is busy, TX work will be scheduled by the threaded
1294         * interrupt handler function
1295         */
1296        return 0;
1297}
1298
1299/*
1300 * The size of the dummy packet should be at least 1400 bytes. However, in
1301 * order to minimize the number of bus transactions, aligning it to 512 bytes
1302 * boundaries could be beneficial, performance wise
1303 */
1304#define TOTAL_TX_DUMMY_PACKET_SIZE (ALIGN(1400, 512))
1305
1306static struct sk_buff *wl12xx_alloc_dummy_packet(struct wl1271 *wl)
1307{
1308        struct sk_buff *skb;
1309        struct ieee80211_hdr_3addr *hdr;
1310        unsigned int dummy_packet_size;
1311
1312        dummy_packet_size = TOTAL_TX_DUMMY_PACKET_SIZE -
1313                            sizeof(struct wl1271_tx_hw_descr) - sizeof(*hdr);
1314
1315        skb = dev_alloc_skb(TOTAL_TX_DUMMY_PACKET_SIZE);
1316        if (!skb) {
1317                wl1271_warning("Failed to allocate a dummy packet skb");
1318                return NULL;
1319        }
1320
1321        skb_reserve(skb, sizeof(struct wl1271_tx_hw_descr));
1322
1323        hdr = skb_put_zero(skb, sizeof(*hdr));
1324        hdr->frame_control = cpu_to_le16(IEEE80211_FTYPE_DATA |
1325                                         IEEE80211_STYPE_NULLFUNC |
1326                                         IEEE80211_FCTL_TODS);
1327
1328        skb_put_zero(skb, dummy_packet_size);
1329
1330        /* Dummy packets require the TID to be management */
1331        skb->priority = WL1271_TID_MGMT;
1332
1333        /* Initialize all fields that might be used */
1334        skb_set_queue_mapping(skb, 0);
1335        memset(IEEE80211_SKB_CB(skb), 0, sizeof(struct ieee80211_tx_info));
1336
1337        return skb;
1338}
1339
1340
1341static int
1342wl1271_validate_wowlan_pattern(struct cfg80211_pkt_pattern *p)
1343{
1344        int num_fields = 0, in_field = 0, fields_size = 0;
1345        int i, pattern_len = 0;
1346
1347        if (!p->mask) {
1348                wl1271_warning("No mask in WoWLAN pattern");
1349                return -EINVAL;
1350        }
1351
1352        /*
1353         * The pattern is broken up into segments of bytes at different offsets
1354         * that need to be checked by the FW filter. Each segment is called
1355         * a field in the FW API. We verify that the total number of fields
1356         * required for this pattern won't exceed FW limits (8)
1357         * as well as the total fields buffer won't exceed the FW limit.
1358         * Note that if there's a pattern which crosses Ethernet/IP header
1359         * boundary a new field is required.
1360         */
1361        for (i = 0; i < p->pattern_len; i++) {
1362                if (test_bit(i, (unsigned long *)p->mask)) {
1363                        if (!in_field) {
1364                                in_field = 1;
1365                                pattern_len = 1;
1366                        } else {
1367                                if (i == WL1271_RX_FILTER_ETH_HEADER_SIZE) {
1368                                        num_fields++;
1369                                        fields_size += pattern_len +
1370                                                RX_FILTER_FIELD_OVERHEAD;
1371                                        pattern_len = 1;
1372                                } else
1373                                        pattern_len++;
1374                        }
1375                } else {
1376                        if (in_field) {
1377                                in_field = 0;
1378                                fields_size += pattern_len +
1379                                        RX_FILTER_FIELD_OVERHEAD;
1380                                num_fields++;
1381                        }
1382                }
1383        }
1384
1385        if (in_field) {
1386                fields_size += pattern_len + RX_FILTER_FIELD_OVERHEAD;
1387                num_fields++;
1388        }
1389
1390        if (num_fields > WL1271_RX_FILTER_MAX_FIELDS) {
1391                wl1271_warning("RX Filter too complex. Too many segments");
1392                return -EINVAL;
1393        }
1394
1395        if (fields_size > WL1271_RX_FILTER_MAX_FIELDS_SIZE) {
1396                wl1271_warning("RX filter pattern is too big");
1397                return -E2BIG;
1398        }
1399
1400        return 0;
1401}
1402
1403struct wl12xx_rx_filter *wl1271_rx_filter_alloc(void)
1404{
1405        return kzalloc(sizeof(struct wl12xx_rx_filter), GFP_KERNEL);
1406}
1407
1408void wl1271_rx_filter_free(struct wl12xx_rx_filter *filter)
1409{
1410        int i;
1411
1412        if (filter == NULL)
1413                return;
1414
1415        for (i = 0; i < filter->num_fields; i++)
1416                kfree(filter->fields[i].pattern);
1417
1418        kfree(filter);
1419}
1420
1421int wl1271_rx_filter_alloc_field(struct wl12xx_rx_filter *filter,
1422                                 u16 offset, u8 flags,
1423                                 const u8 *pattern, u8 len)
1424{
1425        struct wl12xx_rx_filter_field *field;
1426
1427        if (filter->num_fields == WL1271_RX_FILTER_MAX_FIELDS) {
1428                wl1271_warning("Max fields per RX filter. can't alloc another");
1429                return -EINVAL;
1430        }
1431
1432        field = &filter->fields[filter->num_fields];
1433
1434        field->pattern = kmemdup(pattern, len, GFP_KERNEL);
1435        if (!field->pattern) {
1436                wl1271_warning("Failed to allocate RX filter pattern");
1437                return -ENOMEM;
1438        }
1439
1440        filter->num_fields++;
1441
1442        field->offset = cpu_to_le16(offset);
1443        field->flags = flags;
1444        field->len = len;
1445
1446        return 0;
1447}
1448
1449int wl1271_rx_filter_get_fields_size(struct wl12xx_rx_filter *filter)
1450{
1451        int i, fields_size = 0;
1452
1453        for (i = 0; i < filter->num_fields; i++)
1454                fields_size += filter->fields[i].len +
1455                        sizeof(struct wl12xx_rx_filter_field) -
1456                        sizeof(u8 *);
1457
1458        return fields_size;
1459}
1460
1461void wl1271_rx_filter_flatten_fields(struct wl12xx_rx_filter *filter,
1462                                    u8 *buf)
1463{
1464        int i;
1465        struct wl12xx_rx_filter_field *field;
1466
1467        for (i = 0; i < filter->num_fields; i++) {
1468                field = (struct wl12xx_rx_filter_field *)buf;
1469
1470                field->offset = filter->fields[i].offset;
1471                field->flags = filter->fields[i].flags;
1472                field->len = filter->fields[i].len;
1473
1474                memcpy(&field->pattern, filter->fields[i].pattern, field->len);
1475                buf += sizeof(struct wl12xx_rx_filter_field) -
1476                        sizeof(u8 *) + field->len;
1477        }
1478}
1479
1480/*
1481 * Allocates an RX filter returned through f
1482 * which needs to be freed using rx_filter_free()
1483 */
1484static int
1485wl1271_convert_wowlan_pattern_to_rx_filter(struct cfg80211_pkt_pattern *p,
1486                                           struct wl12xx_rx_filter **f)
1487{
1488        int i, j, ret = 0;
1489        struct wl12xx_rx_filter *filter;
1490        u16 offset;
1491        u8 flags, len;
1492
1493        filter = wl1271_rx_filter_alloc();
1494        if (!filter) {
1495                wl1271_warning("Failed to alloc rx filter");
1496                ret = -ENOMEM;
1497                goto err;
1498        }
1499
1500        i = 0;
1501        while (i < p->pattern_len) {
1502                if (!test_bit(i, (unsigned long *)p->mask)) {
1503                        i++;
1504                        continue;
1505                }
1506
1507                for (j = i; j < p->pattern_len; j++) {
1508                        if (!test_bit(j, (unsigned long *)p->mask))
1509                                break;
1510
1511                        if (i < WL1271_RX_FILTER_ETH_HEADER_SIZE &&
1512                            j >= WL1271_RX_FILTER_ETH_HEADER_SIZE)
1513                                break;
1514                }
1515
1516                if (i < WL1271_RX_FILTER_ETH_HEADER_SIZE) {
1517                        offset = i;
1518                        flags = WL1271_RX_FILTER_FLAG_ETHERNET_HEADER;
1519                } else {
1520                        offset = i - WL1271_RX_FILTER_ETH_HEADER_SIZE;
1521                        flags = WL1271_RX_FILTER_FLAG_IP_HEADER;
1522                }
1523
1524                len = j - i;
1525
1526                ret = wl1271_rx_filter_alloc_field(filter,
1527                                                   offset,
1528                                                   flags,
1529                                                   &p->pattern[i], len);
1530                if (ret)
1531                        goto err;
1532
1533                i = j;
1534        }
1535
1536        filter->action = FILTER_SIGNAL;
1537
1538        *f = filter;
1539        return 0;
1540
1541err:
1542        wl1271_rx_filter_free(filter);
1543        *f = NULL;
1544
1545        return ret;
1546}
1547
1548static int wl1271_configure_wowlan(struct wl1271 *wl,
1549                                   struct cfg80211_wowlan *wow)
1550{
1551        int i, ret;
1552
1553        if (!wow || wow->any || !wow->n_patterns) {
1554                ret = wl1271_acx_default_rx_filter_enable(wl, 0,
1555                                                          FILTER_SIGNAL);
1556                if (ret)
1557                        goto out;
1558
1559                ret = wl1271_rx_filter_clear_all(wl);
1560                if (ret)
1561                        goto out;
1562
1563                return 0;
1564        }
1565
1566        if (WARN_ON(wow->n_patterns > WL1271_MAX_RX_FILTERS))
1567                return -EINVAL;
1568
1569        /* Validate all incoming patterns before clearing current FW state */
1570        for (i = 0; i < wow->n_patterns; i++) {
1571                ret = wl1271_validate_wowlan_pattern(&wow->patterns[i]);
1572                if (ret) {
1573                        wl1271_warning("Bad wowlan pattern %d", i);
1574                        return ret;
1575                }
1576        }
1577
1578        ret = wl1271_acx_default_rx_filter_enable(wl, 0, FILTER_SIGNAL);
1579        if (ret)
1580                goto out;
1581
1582        ret = wl1271_rx_filter_clear_all(wl);
1583        if (ret)
1584                goto out;
1585
1586        /* Translate WoWLAN patterns into filters */
1587        for (i = 0; i < wow->n_patterns; i++) {
1588                struct cfg80211_pkt_pattern *p;
1589                struct wl12xx_rx_filter *filter = NULL;
1590
1591                p = &wow->patterns[i];
1592
1593                ret = wl1271_convert_wowlan_pattern_to_rx_filter(p, &filter);
1594                if (ret) {
1595                        wl1271_warning("Failed to create an RX filter from "
1596                                       "wowlan pattern %d", i);
1597                        goto out;
1598                }
1599
1600                ret = wl1271_rx_filter_enable(wl, i, 1, filter);
1601
1602                wl1271_rx_filter_free(filter);
1603                if (ret)
1604                        goto out;
1605        }
1606
1607        ret = wl1271_acx_default_rx_filter_enable(wl, 1, FILTER_DROP);
1608
1609out:
1610        return ret;
1611}
1612
1613static int wl1271_configure_suspend_sta(struct wl1271 *wl,
1614                                        struct wl12xx_vif *wlvif,
1615                                        struct cfg80211_wowlan *wow)
1616{
1617        int ret = 0;
1618
1619        if (!test_bit(WLVIF_FLAG_STA_ASSOCIATED, &wlvif->flags))
1620                goto out;
1621
1622        ret = wl1271_configure_wowlan(wl, wow);
1623        if (ret < 0)
1624                goto out;
1625
1626        if ((wl->conf.conn.suspend_wake_up_event ==
1627             wl->conf.conn.wake_up_event) &&
1628            (wl->conf.conn.suspend_listen_interval ==
1629             wl->conf.conn.listen_interval))
1630                goto out;
1631
1632        ret = wl1271_acx_wake_up_conditions(wl, wlvif,
1633                                    wl->conf.conn.suspend_wake_up_event,
1634                                    wl->conf.conn.suspend_listen_interval);
1635
1636        if (ret < 0)
1637                wl1271_error("suspend: set wake up conditions failed: %d", ret);
1638out:
1639        return ret;
1640
1641}
1642
1643static int wl1271_configure_suspend_ap(struct wl1271 *wl,
1644                                        struct wl12xx_vif *wlvif,
1645                                        struct cfg80211_wowlan *wow)
1646{
1647        int ret = 0;
1648
1649        if (!test_bit(WLVIF_FLAG_AP_STARTED, &wlvif->flags))
1650                goto out;
1651
1652        ret = wl1271_acx_beacon_filter_opt(wl, wlvif, true);
1653        if (ret < 0)
1654                goto out;
1655
1656        ret = wl1271_configure_wowlan(wl, wow);
1657        if (ret < 0)
1658                goto out;
1659
1660out:
1661        return ret;
1662
1663}
1664
1665static int wl1271_configure_suspend(struct wl1271 *wl,
1666                                    struct wl12xx_vif *wlvif,
1667                                    struct cfg80211_wowlan *wow)
1668{
1669        if (wlvif->bss_type == BSS_TYPE_STA_BSS)
1670                return wl1271_configure_suspend_sta(wl, wlvif, wow);
1671        if (wlvif->bss_type == BSS_TYPE_AP_BSS)
1672                return wl1271_configure_suspend_ap(wl, wlvif, wow);
1673        return 0;
1674}
1675
1676static void wl1271_configure_resume(struct wl1271 *wl, struct wl12xx_vif *wlvif)
1677{
1678        int ret = 0;
1679        bool is_ap = wlvif->bss_type == BSS_TYPE_AP_BSS;
1680        bool is_sta = wlvif->bss_type == BSS_TYPE_STA_BSS;
1681
1682        if ((!is_ap) && (!is_sta))
1683                return;
1684
1685        if ((is_sta && !test_bit(WLVIF_FLAG_STA_ASSOCIATED, &wlvif->flags)) ||
1686            (is_ap && !test_bit(WLVIF_FLAG_AP_STARTED, &wlvif->flags)))
1687                return;
1688
1689        wl1271_configure_wowlan(wl, NULL);
1690
1691        if (is_sta) {
1692                if ((wl->conf.conn.suspend_wake_up_event ==
1693                     wl->conf.conn.wake_up_event) &&
1694                    (wl->conf.conn.suspend_listen_interval ==
1695                     wl->conf.conn.listen_interval))
1696                        return;
1697
1698                ret = wl1271_acx_wake_up_conditions(wl, wlvif,
1699                                    wl->conf.conn.wake_up_event,
1700                                    wl->conf.conn.listen_interval);
1701
1702                if (ret < 0)
1703                        wl1271_error("resume: wake up conditions failed: %d",
1704                                     ret);
1705
1706        } else if (is_ap) {
1707                ret = wl1271_acx_beacon_filter_opt(wl, wlvif, false);
1708        }
1709}
1710
1711static int __maybe_unused wl1271_op_suspend(struct ieee80211_hw *hw,
1712                                            struct cfg80211_wowlan *wow)
1713{
1714        struct wl1271 *wl = hw->priv;
1715        struct wl12xx_vif *wlvif;
1716        unsigned long flags;
1717        int ret;
1718
1719        wl1271_debug(DEBUG_MAC80211, "mac80211 suspend wow=%d", !!wow);
1720        WARN_ON(!wow);
1721
1722        /* we want to perform the recovery before suspending */
1723        if (test_bit(WL1271_FLAG_RECOVERY_IN_PROGRESS, &wl->flags)) {
1724                wl1271_warning("postponing suspend to perform recovery");
1725                return -EBUSY;
1726        }
1727
1728        wl1271_tx_flush(wl);
1729
1730        mutex_lock(&wl->mutex);
1731
1732        ret = pm_runtime_resume_and_get(wl->dev);
1733        if (ret < 0) {
1734                mutex_unlock(&wl->mutex);
1735                return ret;
1736        }
1737
1738        wl->wow_enabled = true;
1739        wl12xx_for_each_wlvif(wl, wlvif) {
1740                if (wlcore_is_p2p_mgmt(wlvif))
1741                        continue;
1742
1743                ret = wl1271_configure_suspend(wl, wlvif, wow);
1744                if (ret < 0) {
1745                        goto out_sleep;
1746                }
1747        }
1748
1749        /* disable fast link flow control notifications from FW */
1750        ret = wlcore_hw_interrupt_notify(wl, false);
1751        if (ret < 0)
1752                goto out_sleep;
1753
1754        /* if filtering is enabled, configure the FW to drop all RX BA frames */
1755        ret = wlcore_hw_rx_ba_filter(wl,
1756                                     !!wl->conf.conn.suspend_rx_ba_activity);
1757        if (ret < 0)
1758                goto out_sleep;
1759
1760out_sleep:
1761        pm_runtime_put_noidle(wl->dev);
1762        mutex_unlock(&wl->mutex);
1763
1764        if (ret < 0) {
1765                wl1271_warning("couldn't prepare device to suspend");
1766                return ret;
1767        }
1768
1769        /* flush any remaining work */
1770        wl1271_debug(DEBUG_MAC80211, "flushing remaining works");
1771
1772        flush_work(&wl->tx_work);
1773
1774        /*
1775         * Cancel the watchdog even if above tx_flush failed. We will detect
1776         * it on resume anyway.
1777         */
1778        cancel_delayed_work(&wl->tx_watchdog_work);
1779
1780        /*
1781         * set suspended flag to avoid triggering a new threaded_irq
1782         * work.
1783         */
1784        spin_lock_irqsave(&wl->wl_lock, flags);
1785        set_bit(WL1271_FLAG_SUSPENDED, &wl->flags);
1786        spin_unlock_irqrestore(&wl->wl_lock, flags);
1787
1788        return pm_runtime_force_suspend(wl->dev);
1789}
1790
1791static int __maybe_unused wl1271_op_resume(struct ieee80211_hw *hw)
1792{
1793        struct wl1271 *wl = hw->priv;
1794        struct wl12xx_vif *wlvif;
1795        unsigned long flags;
1796        bool run_irq_work = false, pending_recovery;
1797        int ret;
1798
1799        wl1271_debug(DEBUG_MAC80211, "mac80211 resume wow=%d",
1800                     wl->wow_enabled);
1801        WARN_ON(!wl->wow_enabled);
1802
1803        ret = pm_runtime_force_resume(wl->dev);
1804        if (ret < 0) {
1805                wl1271_error("ELP wakeup failure!");
1806                goto out_sleep;
1807        }
1808
1809        /*
1810         * re-enable irq_work enqueuing, and call irq_work directly if
1811         * there is a pending work.
1812         */
1813        spin_lock_irqsave(&wl->wl_lock, flags);
1814        clear_bit(WL1271_FLAG_SUSPENDED, &wl->flags);
1815        if (test_and_clear_bit(WL1271_FLAG_PENDING_WORK, &wl->flags))
1816                run_irq_work = true;
1817        spin_unlock_irqrestore(&wl->wl_lock, flags);
1818
1819        mutex_lock(&wl->mutex);
1820
1821        /* test the recovery flag before calling any SDIO functions */
1822        pending_recovery = test_bit(WL1271_FLAG_RECOVERY_IN_PROGRESS,
1823                                    &wl->flags);
1824
1825        if (run_irq_work) {
1826                wl1271_debug(DEBUG_MAC80211,
1827                             "run postponed irq_work directly");
1828
1829                /* don't talk to the HW if recovery is pending */
1830                if (!pending_recovery) {
1831                        ret = wlcore_irq_locked(wl);
1832                        if (ret)
1833                                wl12xx_queue_recovery_work(wl);
1834                }
1835
1836                wlcore_enable_interrupts(wl);
1837        }
1838
1839        if (pending_recovery) {
1840                wl1271_warning("queuing forgotten recovery on resume");
1841                ieee80211_queue_work(wl->hw, &wl->recovery_work);
1842                goto out_sleep;
1843        }
1844
1845        ret = pm_runtime_resume_and_get(wl->dev);
1846        if (ret < 0)
1847                goto out;
1848
1849        wl12xx_for_each_wlvif(wl, wlvif) {
1850                if (wlcore_is_p2p_mgmt(wlvif))
1851                        continue;
1852
1853                wl1271_configure_resume(wl, wlvif);
1854        }
1855
1856        ret = wlcore_hw_interrupt_notify(wl, true);
1857        if (ret < 0)
1858                goto out_sleep;
1859
1860        /* if filtering is enabled, configure the FW to drop all RX BA frames */
1861        ret = wlcore_hw_rx_ba_filter(wl, false);
1862        if (ret < 0)
1863                goto out_sleep;
1864
1865out_sleep:
1866        pm_runtime_mark_last_busy(wl->dev);
1867        pm_runtime_put_autosuspend(wl->dev);
1868
1869out:
1870        wl->wow_enabled = false;
1871
1872        /*
1873         * Set a flag to re-init the watchdog on the first Tx after resume.
1874         * That way we avoid possible conditions where Tx-complete interrupts
1875         * fail to arrive and we perform a spurious recovery.
1876         */
1877        set_bit(WL1271_FLAG_REINIT_TX_WDOG, &wl->flags);
1878        mutex_unlock(&wl->mutex);
1879
1880        return 0;
1881}
1882
1883static int wl1271_op_start(struct ieee80211_hw *hw)
1884{
1885        wl1271_debug(DEBUG_MAC80211, "mac80211 start");
1886
1887        /*
1888         * We have to delay the booting of the hardware because
1889         * we need to know the local MAC address before downloading and
1890         * initializing the firmware. The MAC address cannot be changed
1891         * after boot, and without the proper MAC address, the firmware
1892         * will not function properly.
1893         *
1894         * The MAC address is first known when the corresponding interface
1895         * is added. That is where we will initialize the hardware.
1896         */
1897
1898        return 0;
1899}
1900
1901static void wlcore_op_stop_locked(struct wl1271 *wl)
1902{
1903        int i;
1904
1905        if (wl->state == WLCORE_STATE_OFF) {
1906                if (test_and_clear_bit(WL1271_FLAG_RECOVERY_IN_PROGRESS,
1907                                        &wl->flags))
1908                        wlcore_enable_interrupts(wl);
1909
1910                return;
1911        }
1912
1913        /*
1914         * this must be before the cancel_work calls below, so that the work
1915         * functions don't perform further work.
1916         */
1917        wl->state = WLCORE_STATE_OFF;
1918
1919        /*
1920         * Use the nosync variant to disable interrupts, so the mutex could be
1921         * held while doing so without deadlocking.
1922         */
1923        wlcore_disable_interrupts_nosync(wl);
1924
1925        mutex_unlock(&wl->mutex);
1926
1927        wlcore_synchronize_interrupts(wl);
1928        if (!test_bit(WL1271_FLAG_RECOVERY_IN_PROGRESS, &wl->flags))
1929                cancel_work_sync(&wl->recovery_work);
1930        wl1271_flush_deferred_work(wl);
1931        cancel_delayed_work_sync(&wl->scan_complete_work);
1932        cancel_work_sync(&wl->netstack_work);
1933        cancel_work_sync(&wl->tx_work);
1934        cancel_delayed_work_sync(&wl->tx_watchdog_work);
1935
1936        /* let's notify MAC80211 about the remaining pending TX frames */
1937        mutex_lock(&wl->mutex);
1938        wl12xx_tx_reset(wl);
1939
1940        wl1271_power_off(wl);
1941        /*
1942         * In case a recovery was scheduled, interrupts were disabled to avoid
1943         * an interrupt storm. Now that the power is down, it is safe to
1944         * re-enable interrupts to balance the disable depth
1945         */
1946        if (test_and_clear_bit(WL1271_FLAG_RECOVERY_IN_PROGRESS, &wl->flags))
1947                wlcore_enable_interrupts(wl);
1948
1949        wl->band = NL80211_BAND_2GHZ;
1950
1951        wl->rx_counter = 0;
1952        wl->power_level = WL1271_DEFAULT_POWER_LEVEL;
1953        wl->channel_type = NL80211_CHAN_NO_HT;
1954        wl->tx_blocks_available = 0;
1955        wl->tx_allocated_blocks = 0;
1956        wl->tx_results_count = 0;
1957        wl->tx_packets_count = 0;
1958        wl->time_offset = 0;
1959        wl->ap_fw_ps_map = 0;
1960        wl->ap_ps_map = 0;
1961        wl->sleep_auth = WL1271_PSM_ILLEGAL;
1962        memset(wl->roles_map, 0, sizeof(wl->roles_map));
1963        memset(wl->links_map, 0, sizeof(wl->links_map));
1964        memset(wl->roc_map, 0, sizeof(wl->roc_map));
1965        memset(wl->session_ids, 0, sizeof(wl->session_ids));
1966        memset(wl->rx_filter_enabled, 0, sizeof(wl->rx_filter_enabled));
1967        wl->active_sta_count = 0;
1968        wl->active_link_count = 0;
1969
1970        /* The system link is always allocated */
1971        wl->links[WL12XX_SYSTEM_HLID].allocated_pkts = 0;
1972        wl->links[WL12XX_SYSTEM_HLID].prev_freed_pkts = 0;
1973        __set_bit(WL12XX_SYSTEM_HLID, wl->links_map);
1974
1975        /*
1976         * this is performed after the cancel_work calls and the associated
1977         * mutex_lock, so that wl1271_op_add_interface does not accidentally
1978         * get executed before all these vars have been reset.
1979         */
1980        wl->flags = 0;
1981
1982        wl->tx_blocks_freed = 0;
1983
1984        for (i = 0; i < NUM_TX_QUEUES; i++) {
1985                wl->tx_pkts_freed[i] = 0;
1986                wl->tx_allocated_pkts[i] = 0;
1987        }
1988
1989        wl1271_debugfs_reset(wl);
1990
1991        kfree(wl->raw_fw_status);
1992        wl->raw_fw_status = NULL;
1993        kfree(wl->fw_status);
1994        wl->fw_status = NULL;
1995        kfree(wl->tx_res_if);
1996        wl->tx_res_if = NULL;
1997        kfree(wl->target_mem_map);
1998        wl->target_mem_map = NULL;
1999
2000        /*
2001         * FW channels must be re-calibrated after recovery,
2002         * save current Reg-Domain channel configuration and clear it.
2003         */
2004        memcpy(wl->reg_ch_conf_pending, wl->reg_ch_conf_last,
2005               sizeof(wl->reg_ch_conf_pending));
2006        memset(wl->reg_ch_conf_last, 0, sizeof(wl->reg_ch_conf_last));
2007}
2008
2009static void wlcore_op_stop(struct ieee80211_hw *hw)
2010{
2011        struct wl1271 *wl = hw->priv;
2012
2013        wl1271_debug(DEBUG_MAC80211, "mac80211 stop");
2014
2015        mutex_lock(&wl->mutex);
2016
2017        wlcore_op_stop_locked(wl);
2018
2019        mutex_unlock(&wl->mutex);
2020}
2021
2022static void wlcore_channel_switch_work(struct work_struct *work)
2023{
2024        struct delayed_work *dwork;
2025        struct wl1271 *wl;
2026        struct ieee80211_vif *vif;
2027        struct wl12xx_vif *wlvif;
2028        int ret;
2029
2030        dwork = to_delayed_work(work);
2031        wlvif = container_of(dwork, struct wl12xx_vif, channel_switch_work);
2032        wl = wlvif->wl;
2033
2034        wl1271_info("channel switch failed (role_id: %d).", wlvif->role_id);
2035
2036        mutex_lock(&wl->mutex);
2037
2038        if (unlikely(wl->state != WLCORE_STATE_ON))
2039                goto out;
2040
2041        /* check the channel switch is still ongoing */
2042        if (!test_and_clear_bit(WLVIF_FLAG_CS_PROGRESS, &wlvif->flags))
2043                goto out;
2044
2045        vif = wl12xx_wlvif_to_vif(wlvif);
2046        ieee80211_chswitch_done(vif, false);
2047
2048        ret = pm_runtime_resume_and_get(wl->dev);
2049        if (ret < 0)
2050                goto out;
2051
2052        wl12xx_cmd_stop_channel_switch(wl, wlvif);
2053
2054        pm_runtime_mark_last_busy(wl->dev);
2055        pm_runtime_put_autosuspend(wl->dev);
2056out:
2057        mutex_unlock(&wl->mutex);
2058}
2059
2060static void wlcore_connection_loss_work(struct work_struct *work)
2061{
2062        struct delayed_work *dwork;
2063        struct wl1271 *wl;
2064        struct ieee80211_vif *vif;
2065        struct wl12xx_vif *wlvif;
2066
2067        dwork = to_delayed_work(work);
2068        wlvif = container_of(dwork, struct wl12xx_vif, connection_loss_work);
2069        wl = wlvif->wl;
2070
2071        wl1271_info("Connection loss work (role_id: %d).", wlvif->role_id);
2072
2073        mutex_lock(&wl->mutex);
2074
2075        if (unlikely(wl->state != WLCORE_STATE_ON))
2076                goto out;
2077
2078        /* Call mac80211 connection loss */
2079        if (!test_bit(WLVIF_FLAG_STA_ASSOCIATED, &wlvif->flags))
2080                goto out;
2081
2082        vif = wl12xx_wlvif_to_vif(wlvif);
2083        ieee80211_connection_loss(vif);
2084out:
2085        mutex_unlock(&wl->mutex);
2086}
2087
2088static void wlcore_pending_auth_complete_work(struct work_struct *work)
2089{
2090        struct delayed_work *dwork;
2091        struct wl1271 *wl;
2092        struct wl12xx_vif *wlvif;
2093        unsigned long time_spare;
2094        int ret;
2095
2096        dwork = to_delayed_work(work);
2097        wlvif = container_of(dwork, struct wl12xx_vif,
2098                             pending_auth_complete_work);
2099        wl = wlvif->wl;
2100
2101        mutex_lock(&wl->mutex);
2102
2103        if (unlikely(wl->state != WLCORE_STATE_ON))
2104                goto out;
2105
2106        /*
2107         * Make sure a second really passed since the last auth reply. Maybe
2108         * a second auth reply arrived while we were stuck on the mutex.
2109         * Check for a little less than the timeout to protect from scheduler
2110         * irregularities.
2111         */
2112        time_spare = jiffies +
2113                        msecs_to_jiffies(WLCORE_PEND_AUTH_ROC_TIMEOUT - 50);
2114        if (!time_after(time_spare, wlvif->pending_auth_reply_time))
2115                goto out;
2116
2117        ret = pm_runtime_resume_and_get(wl->dev);
2118        if (ret < 0)
2119                goto out;
2120
2121        /* cancel the ROC if active */
2122        wlcore_update_inconn_sta(wl, wlvif, NULL, false);
2123
2124        pm_runtime_mark_last_busy(wl->dev);
2125        pm_runtime_put_autosuspend(wl->dev);
2126out:
2127        mutex_unlock(&wl->mutex);
2128}
2129
2130static int wl12xx_allocate_rate_policy(struct wl1271 *wl, u8 *idx)
2131{
2132        u8 policy = find_first_zero_bit(wl->rate_policies_map,
2133                                        WL12XX_MAX_RATE_POLICIES);
2134        if (policy >= WL12XX_MAX_RATE_POLICIES)
2135                return -EBUSY;
2136
2137        __set_bit(policy, wl->rate_policies_map);
2138        *idx = policy;
2139        return 0;
2140}
2141
2142static void wl12xx_free_rate_policy(struct wl1271 *wl, u8 *idx)
2143{
2144        if (WARN_ON(*idx >= WL12XX_MAX_RATE_POLICIES))
2145                return;
2146
2147        __clear_bit(*idx, wl->rate_policies_map);
2148        *idx = WL12XX_MAX_RATE_POLICIES;
2149}
2150
2151static int wlcore_allocate_klv_template(struct wl1271 *wl, u8 *idx)
2152{
2153        u8 policy = find_first_zero_bit(wl->klv_templates_map,
2154                                        WLCORE_MAX_KLV_TEMPLATES);
2155        if (policy >= WLCORE_MAX_KLV_TEMPLATES)
2156                return -EBUSY;
2157
2158        __set_bit(policy, wl->klv_templates_map);
2159        *idx = policy;
2160        return 0;
2161}
2162
2163static void wlcore_free_klv_template(struct wl1271 *wl, u8 *idx)
2164{
2165        if (WARN_ON(*idx >= WLCORE_MAX_KLV_TEMPLATES))
2166                return;
2167
2168        __clear_bit(*idx, wl->klv_templates_map);
2169        *idx = WLCORE_MAX_KLV_TEMPLATES;
2170}
2171
2172static u8 wl12xx_get_role_type(struct wl1271 *wl, struct wl12xx_vif *wlvif)
2173{
2174        struct ieee80211_vif *vif = wl12xx_wlvif_to_vif(wlvif);
2175
2176        switch (wlvif->bss_type) {
2177        case BSS_TYPE_AP_BSS:
2178                if (wlvif->p2p)
2179                        return WL1271_ROLE_P2P_GO;
2180                else if (ieee80211_vif_is_mesh(vif))
2181                        return WL1271_ROLE_MESH_POINT;
2182                else
2183                        return WL1271_ROLE_AP;
2184
2185        case BSS_TYPE_STA_BSS:
2186                if (wlvif->p2p)
2187                        return WL1271_ROLE_P2P_CL;
2188                else
2189                        return WL1271_ROLE_STA;
2190
2191        case BSS_TYPE_IBSS:
2192                return WL1271_ROLE_IBSS;
2193
2194        default:
2195                wl1271_error("invalid bss_type: %d", wlvif->bss_type);
2196        }
2197        return WL12XX_INVALID_ROLE_TYPE;
2198}
2199
2200static int wl12xx_init_vif_data(struct wl1271 *wl, struct ieee80211_vif *vif)
2201{
2202        struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
2203        int i;
2204
2205        /* clear everything but the persistent data */
2206        memset(wlvif, 0, offsetof(struct wl12xx_vif, persistent));
2207
2208        switch (ieee80211_vif_type_p2p(vif)) {
2209        case NL80211_IFTYPE_P2P_CLIENT:
2210                wlvif->p2p = 1;
2211                fallthrough;
2212        case NL80211_IFTYPE_STATION:
2213        case NL80211_IFTYPE_P2P_DEVICE:
2214                wlvif->bss_type = BSS_TYPE_STA_BSS;
2215                break;
2216        case NL80211_IFTYPE_ADHOC:
2217                wlvif->bss_type = BSS_TYPE_IBSS;
2218                break;
2219        case NL80211_IFTYPE_P2P_GO:
2220                wlvif->p2p = 1;
2221                fallthrough;
2222        case NL80211_IFTYPE_AP:
2223        case NL80211_IFTYPE_MESH_POINT:
2224                wlvif->bss_type = BSS_TYPE_AP_BSS;
2225                break;
2226        default:
2227                wlvif->bss_type = MAX_BSS_TYPE;
2228                return -EOPNOTSUPP;
2229        }
2230
2231        wlvif->role_id = WL12XX_INVALID_ROLE_ID;
2232        wlvif->dev_role_id = WL12XX_INVALID_ROLE_ID;
2233        wlvif->dev_hlid = WL12XX_INVALID_LINK_ID;
2234
2235        if (wlvif->bss_type == BSS_TYPE_STA_BSS ||
2236            wlvif->bss_type == BSS_TYPE_IBSS) {
2237                /* init sta/ibss data */
2238                wlvif->sta.hlid = WL12XX_INVALID_LINK_ID;
2239                wl12xx_allocate_rate_policy(wl, &wlvif->sta.basic_rate_idx);
2240                wl12xx_allocate_rate_policy(wl, &wlvif->sta.ap_rate_idx);
2241                wl12xx_allocate_rate_policy(wl, &wlvif->sta.p2p_rate_idx);
2242                wlcore_allocate_klv_template(wl, &wlvif->sta.klv_template_id);
2243                wlvif->basic_rate_set = CONF_TX_RATE_MASK_BASIC;
2244                wlvif->basic_rate = CONF_TX_RATE_MASK_BASIC;
2245                wlvif->rate_set = CONF_TX_RATE_MASK_BASIC;
2246        } else {
2247                /* init ap data */
2248                wlvif->ap.bcast_hlid = WL12XX_INVALID_LINK_ID;
2249                wlvif->ap.global_hlid = WL12XX_INVALID_LINK_ID;
2250                wl12xx_allocate_rate_policy(wl, &wlvif->ap.mgmt_rate_idx);
2251                wl12xx_allocate_rate_policy(wl, &wlvif->ap.bcast_rate_idx);
2252                for (i = 0; i < CONF_TX_MAX_AC_COUNT; i++)
2253                        wl12xx_allocate_rate_policy(wl,
2254                                                &wlvif->ap.ucast_rate_idx[i]);
2255                wlvif->basic_rate_set = CONF_TX_ENABLED_RATES;
2256                /*
2257                 * TODO: check if basic_rate shouldn't be
2258                 * wl1271_tx_min_rate_get(wl, wlvif->basic_rate_set);
2259                 * instead (the same thing for STA above).
2260                */
2261                wlvif->basic_rate = CONF_TX_ENABLED_RATES;
2262                /* TODO: this seems to be used only for STA, check it */
2263                wlvif->rate_set = CONF_TX_ENABLED_RATES;
2264        }
2265
2266        wlvif->bitrate_masks[NL80211_BAND_2GHZ] = wl->conf.tx.basic_rate;
2267        wlvif->bitrate_masks[NL80211_BAND_5GHZ] = wl->conf.tx.basic_rate_5;
2268        wlvif->beacon_int = WL1271_DEFAULT_BEACON_INT;
2269
2270        /*
2271         * mac80211 configures some values globally, while we treat them
2272         * per-interface. thus, on init, we have to copy them from wl
2273         */
2274        wlvif->band = wl->band;
2275        wlvif->channel = wl->channel;
2276        wlvif->power_level = wl->power_level;
2277        wlvif->channel_type = wl->channel_type;
2278
2279        INIT_WORK(&wlvif->rx_streaming_enable_work,
2280                  wl1271_rx_streaming_enable_work);
2281        INIT_WORK(&wlvif->rx_streaming_disable_work,
2282                  wl1271_rx_streaming_disable_work);
2283        INIT_WORK(&wlvif->rc_update_work, wlcore_rc_update_work);
2284        INIT_DELAYED_WORK(&wlvif->channel_switch_work,
2285                          wlcore_channel_switch_work);
2286        INIT_DELAYED_WORK(&wlvif->connection_loss_work,
2287                          wlcore_connection_loss_work);
2288        INIT_DELAYED_WORK(&wlvif->pending_auth_complete_work,
2289                          wlcore_pending_auth_complete_work);
2290        INIT_LIST_HEAD(&wlvif->list);
2291
2292        timer_setup(&wlvif->rx_streaming_timer, wl1271_rx_streaming_timer, 0);
2293        return 0;
2294}
2295
2296static int wl12xx_init_fw(struct wl1271 *wl)
2297{
2298        int retries = WL1271_BOOT_RETRIES;
2299        bool booted = false;
2300        struct wiphy *wiphy = wl->hw->wiphy;
2301        int ret;
2302
2303        while (retries) {
2304                retries--;
2305                ret = wl12xx_chip_wakeup(wl, false);
2306                if (ret < 0)
2307                        goto power_off;
2308
2309                ret = wl->ops->boot(wl);
2310                if (ret < 0)
2311                        goto power_off;
2312
2313                ret = wl1271_hw_init(wl);
2314                if (ret < 0)
2315                        goto irq_disable;
2316
2317                booted = true;
2318                break;
2319
2320irq_disable:
2321                mutex_unlock(&wl->mutex);
2322                /* Unlocking the mutex in the middle of handling is
2323                   inherently unsafe. In this case we deem it safe to do,
2324                   because we need to let any possibly pending IRQ out of
2325                   the system (and while we are WLCORE_STATE_OFF the IRQ
2326                   work function will not do anything.) Also, any other
2327                   possible concurrent operations will fail due to the
2328                   current state, hence the wl1271 struct should be safe. */
2329                wlcore_disable_interrupts(wl);
2330                wl1271_flush_deferred_work(wl);
2331                cancel_work_sync(&wl->netstack_work);
2332                mutex_lock(&wl->mutex);
2333power_off:
2334                wl1271_power_off(wl);
2335        }
2336
2337        if (!booted) {
2338                wl1271_error("firmware boot failed despite %d retries",
2339                             WL1271_BOOT_RETRIES);
2340                goto out;
2341        }
2342
2343        wl1271_info("firmware booted (%s)", wl->chip.fw_ver_str);
2344
2345        /* update hw/fw version info in wiphy struct */
2346        wiphy->hw_version = wl->chip.id;
2347        strncpy(wiphy->fw_version, wl->chip.fw_ver_str,
2348                sizeof(wiphy->fw_version));
2349
2350        /*
2351         * Now we know if 11a is supported (info from the NVS), so disable
2352         * 11a channels if not supported
2353         */
2354        if (!wl->enable_11a)
2355                wiphy->bands[NL80211_BAND_5GHZ]->n_channels = 0;
2356
2357        wl1271_debug(DEBUG_MAC80211, "11a is %ssupported",
2358                     wl->enable_11a ? "" : "not ");
2359
2360        wl->state = WLCORE_STATE_ON;
2361out:
2362        return ret;
2363}
2364
2365static bool wl12xx_dev_role_started(struct wl12xx_vif *wlvif)
2366{
2367        return wlvif->dev_hlid != WL12XX_INVALID_LINK_ID;
2368}
2369
2370/*
2371 * Check whether a fw switch (i.e. moving from one loaded
2372 * fw to another) is needed. This function is also responsible
2373 * for updating wl->last_vif_count, so it must be called before
2374 * loading a non-plt fw (so the correct fw (single-role/multi-role)
2375 * will be used).
2376 */
2377static bool wl12xx_need_fw_change(struct wl1271 *wl,
2378                                  struct vif_counter_data vif_counter_data,
2379                                  bool add)
2380{
2381        enum wl12xx_fw_type current_fw = wl->fw_type;
2382        u8 vif_count = vif_counter_data.counter;
2383
2384        if (test_bit(WL1271_FLAG_VIF_CHANGE_IN_PROGRESS, &wl->flags))
2385                return false;
2386
2387        /* increase the vif count if this is a new vif */
2388        if (add && !vif_counter_data.cur_vif_running)
2389                vif_count++;
2390
2391        wl->last_vif_count = vif_count;
2392
2393        /* no need for fw change if the device is OFF */
2394        if (wl->state == WLCORE_STATE_OFF)
2395                return false;
2396
2397        /* no need for fw change if a single fw is used */
2398        if (!wl->mr_fw_name)
2399                return false;
2400
2401        if (vif_count > 1 && current_fw == WL12XX_FW_TYPE_NORMAL)
2402                return true;
2403        if (vif_count <= 1 && current_fw == WL12XX_FW_TYPE_MULTI)
2404                return true;
2405
2406        return false;
2407}
2408
2409/*
2410 * Enter "forced psm". Make sure the sta is in psm against the ap,
2411 * to make the fw switch a bit more disconnection-persistent.
2412 */
2413static void wl12xx_force_active_psm(struct wl1271 *wl)
2414{
2415        struct wl12xx_vif *wlvif;
2416
2417        wl12xx_for_each_wlvif_sta(wl, wlvif) {
2418                wl1271_ps_set_mode(wl, wlvif, STATION_POWER_SAVE_MODE);
2419        }
2420}
2421
2422struct wlcore_hw_queue_iter_data {
2423        unsigned long hw_queue_map[BITS_TO_LONGS(WLCORE_NUM_MAC_ADDRESSES)];
2424        /* current vif */
2425        struct ieee80211_vif *vif;
2426        /* is the current vif among those iterated */
2427        bool cur_running;
2428};
2429
2430static void wlcore_hw_queue_iter(void *data, u8 *mac,
2431                                 struct ieee80211_vif *vif)
2432{
2433        struct wlcore_hw_queue_iter_data *iter_data = data;
2434
2435        if (vif->type == NL80211_IFTYPE_P2P_DEVICE ||
2436            WARN_ON_ONCE(vif->hw_queue[0] == IEEE80211_INVAL_HW_QUEUE))
2437                return;
2438
2439        if (iter_data->cur_running || vif == iter_data->vif) {
2440                iter_data->cur_running = true;
2441                return;
2442        }
2443
2444        __set_bit(vif->hw_queue[0] / NUM_TX_QUEUES, iter_data->hw_queue_map);
2445}
2446
2447static int wlcore_allocate_hw_queue_base(struct wl1271 *wl,
2448                                         struct wl12xx_vif *wlvif)
2449{
2450        struct ieee80211_vif *vif = wl12xx_wlvif_to_vif(wlvif);
2451        struct wlcore_hw_queue_iter_data iter_data = {};
2452        int i, q_base;
2453
2454        if (vif->type == NL80211_IFTYPE_P2P_DEVICE) {
2455                vif->cab_queue = IEEE80211_INVAL_HW_QUEUE;
2456                return 0;
2457        }
2458
2459        iter_data.vif = vif;
2460
2461        /* mark all bits taken by active interfaces */
2462        ieee80211_iterate_active_interfaces_atomic(wl->hw,
2463                                        IEEE80211_IFACE_ITER_RESUME_ALL,
2464                                        wlcore_hw_queue_iter, &iter_data);
2465
2466        /* the current vif is already running in mac80211 (resume/recovery) */
2467        if (iter_data.cur_running) {
2468                wlvif->hw_queue_base = vif->hw_queue[0];
2469                wl1271_debug(DEBUG_MAC80211,
2470                             "using pre-allocated hw queue base %d",
2471                             wlvif->hw_queue_base);
2472
2473                /* interface type might have changed type */
2474                goto adjust_cab_queue;
2475        }
2476
2477        q_base = find_first_zero_bit(iter_data.hw_queue_map,
2478                                     WLCORE_NUM_MAC_ADDRESSES);
2479        if (q_base >= WLCORE_NUM_MAC_ADDRESSES)
2480                return -EBUSY;
2481
2482        wlvif->hw_queue_base = q_base * NUM_TX_QUEUES;
2483        wl1271_debug(DEBUG_MAC80211, "allocating hw queue base: %d",
2484                     wlvif->hw_queue_base);
2485
2486        for (i = 0; i < NUM_TX_QUEUES; i++) {
2487                wl->queue_stop_reasons[wlvif->hw_queue_base + i] = 0;
2488                /* register hw queues in mac80211 */
2489                vif->hw_queue[i] = wlvif->hw_queue_base + i;
2490        }
2491
2492adjust_cab_queue:
2493        /* the last places are reserved for cab queues per interface */
2494        if (wlvif->bss_type == BSS_TYPE_AP_BSS)
2495                vif->cab_queue = NUM_TX_QUEUES * WLCORE_NUM_MAC_ADDRESSES +
2496                                 wlvif->hw_queue_base / NUM_TX_QUEUES;
2497        else
2498                vif->cab_queue = IEEE80211_INVAL_HW_QUEUE;
2499
2500        return 0;
2501}
2502
2503static int wl1271_op_add_interface(struct ieee80211_hw *hw,
2504                                   struct ieee80211_vif *vif)
2505{
2506        struct wl1271 *wl = hw->priv;
2507        struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
2508        struct vif_counter_data vif_count;
2509        int ret = 0;
2510        u8 role_type;
2511
2512        if (wl->plt) {
2513                wl1271_error("Adding Interface not allowed while in PLT mode");
2514                return -EBUSY;
2515        }
2516
2517        vif->driver_flags |= IEEE80211_VIF_BEACON_FILTER |
2518                             IEEE80211_VIF_SUPPORTS_UAPSD |
2519                             IEEE80211_VIF_SUPPORTS_CQM_RSSI;
2520
2521        wl1271_debug(DEBUG_MAC80211, "mac80211 add interface type %d mac %pM",
2522                     ieee80211_vif_type_p2p(vif), vif->addr);
2523
2524        wl12xx_get_vif_count(hw, vif, &vif_count);
2525
2526        mutex_lock(&wl->mutex);
2527
2528        /*
2529         * in some very corner case HW recovery scenarios its possible to
2530         * get here before __wl1271_op_remove_interface is complete, so
2531         * opt out if that is the case.
2532         */
2533        if (test_bit(WL1271_FLAG_RECOVERY_IN_PROGRESS, &wl->flags) ||
2534            test_bit(WLVIF_FLAG_INITIALIZED, &wlvif->flags)) {
2535                ret = -EBUSY;
2536                goto out;
2537        }
2538
2539
2540        ret = wl12xx_init_vif_data(wl, vif);
2541        if (ret < 0)
2542                goto out;
2543
2544        wlvif->wl = wl;
2545        role_type = wl12xx_get_role_type(wl, wlvif);
2546        if (role_type == WL12XX_INVALID_ROLE_TYPE) {
2547                ret = -EINVAL;
2548                goto out;
2549        }
2550
2551        ret = wlcore_allocate_hw_queue_base(wl, wlvif);
2552        if (ret < 0)
2553                goto out;
2554
2555        /*
2556         * TODO: after the nvs issue will be solved, move this block
2557         * to start(), and make sure here the driver is ON.
2558         */
2559        if (wl->state == WLCORE_STATE_OFF) {
2560                /*
2561                 * we still need this in order to configure the fw
2562                 * while uploading the nvs
2563                 */
2564                memcpy(wl->addresses[0].addr, vif->addr, ETH_ALEN);
2565
2566                ret = wl12xx_init_fw(wl);
2567                if (ret < 0)
2568                        goto out;
2569        }
2570
2571        /*
2572         * Call runtime PM only after possible wl12xx_init_fw() above
2573         * is done. Otherwise we do not have interrupts enabled.
2574         */
2575        ret = pm_runtime_resume_and_get(wl->dev);
2576        if (ret < 0)
2577                goto out_unlock;
2578
2579        if (wl12xx_need_fw_change(wl, vif_count, true)) {
2580                wl12xx_force_active_psm(wl);
2581                set_bit(WL1271_FLAG_INTENDED_FW_RECOVERY, &wl->flags);
2582                mutex_unlock(&wl->mutex);
2583                wl1271_recovery_work(&wl->recovery_work);
2584                return 0;
2585        }
2586
2587        if (!wlcore_is_p2p_mgmt(wlvif)) {
2588                ret = wl12xx_cmd_role_enable(wl, vif->addr,
2589                                             role_type, &wlvif->role_id);
2590                if (ret < 0)
2591                        goto out;
2592
2593                ret = wl1271_init_vif_specific(wl, vif);
2594                if (ret < 0)
2595                        goto out;
2596
2597        } else {
2598                ret = wl12xx_cmd_role_enable(wl, vif->addr, WL1271_ROLE_DEVICE,
2599                                             &wlvif->dev_role_id);
2600                if (ret < 0)
2601                        goto out;
2602
2603                /* needed mainly for configuring rate policies */
2604                ret = wl1271_sta_hw_init(wl, wlvif);
2605                if (ret < 0)
2606                        goto out;
2607        }
2608
2609        list_add(&wlvif->list, &wl->wlvif_list);
2610        set_bit(WLVIF_FLAG_INITIALIZED, &wlvif->flags);
2611
2612        if (wlvif->bss_type == BSS_TYPE_AP_BSS)
2613                wl->ap_count++;
2614        else
2615                wl->sta_count++;
2616out:
2617        pm_runtime_mark_last_busy(wl->dev);
2618        pm_runtime_put_autosuspend(wl->dev);
2619out_unlock:
2620        mutex_unlock(&wl->mutex);
2621
2622        return ret;
2623}
2624
2625static void __wl1271_op_remove_interface(struct wl1271 *wl,
2626                                         struct ieee80211_vif *vif,
2627                                         bool reset_tx_queues)
2628{
2629        struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
2630        int i, ret;
2631        bool is_ap = (wlvif->bss_type == BSS_TYPE_AP_BSS);
2632
2633        wl1271_debug(DEBUG_MAC80211, "mac80211 remove interface");
2634
2635        if (!test_and_clear_bit(WLVIF_FLAG_INITIALIZED, &wlvif->flags))
2636                return;
2637
2638        /* because of hardware recovery, we may get here twice */
2639        if (wl->state == WLCORE_STATE_OFF)
2640                return;
2641
2642        wl1271_info("down");
2643
2644        if (wl->scan.state != WL1271_SCAN_STATE_IDLE &&
2645            wl->scan_wlvif == wlvif) {
2646                struct cfg80211_scan_info info = {
2647                        .aborted = true,
2648                };
2649
2650                /*
2651                 * Rearm the tx watchdog just before idling scan. This
2652                 * prevents just-finished scans from triggering the watchdog
2653                 */
2654                wl12xx_rearm_tx_watchdog_locked(wl);
2655
2656                wl->scan.state = WL1271_SCAN_STATE_IDLE;
2657                memset(wl->scan.scanned_ch, 0, sizeof(wl->scan.scanned_ch));
2658                wl->scan_wlvif = NULL;
2659                wl->scan.req = NULL;
2660                ieee80211_scan_completed(wl->hw, &info);
2661        }
2662
2663        if (wl->sched_vif == wlvif)
2664                wl->sched_vif = NULL;
2665
2666        if (wl->roc_vif == vif) {
2667                wl->roc_vif = NULL;
2668                ieee80211_remain_on_channel_expired(wl->hw);
2669        }
2670
2671        if (!test_bit(WL1271_FLAG_RECOVERY_IN_PROGRESS, &wl->flags)) {
2672                /* disable active roles */
2673                ret = pm_runtime_resume_and_get(wl->dev);
2674                if (ret < 0)
2675                        goto deinit;
2676
2677                if (wlvif->bss_type == BSS_TYPE_STA_BSS ||
2678                    wlvif->bss_type == BSS_TYPE_IBSS) {
2679                        if (wl12xx_dev_role_started(wlvif))
2680                                wl12xx_stop_dev(wl, wlvif);
2681                }
2682
2683                if (!wlcore_is_p2p_mgmt(wlvif)) {
2684                        ret = wl12xx_cmd_role_disable(wl, &wlvif->role_id);
2685                        if (ret < 0) {
2686                                pm_runtime_put_noidle(wl->dev);
2687                                goto deinit;
2688                        }
2689                } else {
2690                        ret = wl12xx_cmd_role_disable(wl, &wlvif->dev_role_id);
2691                        if (ret < 0) {
2692                                pm_runtime_put_noidle(wl->dev);
2693                                goto deinit;
2694                        }
2695                }
2696
2697                pm_runtime_mark_last_busy(wl->dev);
2698                pm_runtime_put_autosuspend(wl->dev);
2699        }
2700deinit:
2701        wl12xx_tx_reset_wlvif(wl, wlvif);
2702
2703        /* clear all hlids (except system_hlid) */
2704        wlvif->dev_hlid = WL12XX_INVALID_LINK_ID;
2705
2706        if (wlvif->bss_type == BSS_TYPE_STA_BSS ||
2707            wlvif->bss_type == BSS_TYPE_IBSS) {
2708                wlvif->sta.hlid = WL12XX_INVALID_LINK_ID;
2709                wl12xx_free_rate_policy(wl, &wlvif->sta.basic_rate_idx);
2710                wl12xx_free_rate_policy(wl, &wlvif->sta.ap_rate_idx);
2711                wl12xx_free_rate_policy(wl, &wlvif->sta.p2p_rate_idx);
2712                wlcore_free_klv_template(wl, &wlvif->sta.klv_template_id);
2713        } else {
2714                wlvif->ap.bcast_hlid = WL12XX_INVALID_LINK_ID;
2715                wlvif->ap.global_hlid = WL12XX_INVALID_LINK_ID;
2716                wl12xx_free_rate_policy(wl, &wlvif->ap.mgmt_rate_idx);
2717                wl12xx_free_rate_policy(wl, &wlvif->ap.bcast_rate_idx);
2718                for (i = 0; i < CONF_TX_MAX_AC_COUNT; i++)
2719                        wl12xx_free_rate_policy(wl,
2720                                                &wlvif->ap.ucast_rate_idx[i]);
2721                wl1271_free_ap_keys(wl, wlvif);
2722        }
2723
2724        dev_kfree_skb(wlvif->probereq);
2725        wlvif->probereq = NULL;
2726        if (wl->last_wlvif == wlvif)
2727                wl->last_wlvif = NULL;
2728        list_del(&wlvif->list);
2729        memset(wlvif->ap.sta_hlid_map, 0, sizeof(wlvif->ap.sta_hlid_map));
2730        wlvif->role_id = WL12XX_INVALID_ROLE_ID;
2731        wlvif->dev_role_id = WL12XX_INVALID_ROLE_ID;
2732
2733        if (is_ap)
2734                wl->ap_count--;
2735        else
2736                wl->sta_count--;
2737
2738        /*
2739         * Last AP, have more stations. Configure sleep auth according to STA.
2740         * Don't do thin on unintended recovery.
2741         */
2742        if (test_bit(WL1271_FLAG_RECOVERY_IN_PROGRESS, &wl->flags) &&
2743            !test_bit(WL1271_FLAG_INTENDED_FW_RECOVERY, &wl->flags))
2744                goto unlock;
2745
2746        if (wl->ap_count == 0 && is_ap) {
2747                /* mask ap events */
2748                wl->event_mask &= ~wl->ap_event_mask;
2749                wl1271_event_unmask(wl);
2750        }
2751
2752        if (wl->ap_count == 0 && is_ap && wl->sta_count) {
2753                u8 sta_auth = wl->conf.conn.sta_sleep_auth;
2754                /* Configure for power according to debugfs */
2755                if (sta_auth != WL1271_PSM_ILLEGAL)
2756                        wl1271_acx_sleep_auth(wl, sta_auth);
2757                /* Configure for ELP power saving */
2758                else
2759                        wl1271_acx_sleep_auth(wl, WL1271_PSM_ELP);
2760        }
2761
2762unlock:
2763        mutex_unlock(&wl->mutex);
2764
2765        del_timer_sync(&wlvif->rx_streaming_timer);
2766        cancel_work_sync(&wlvif->rx_streaming_enable_work);
2767        cancel_work_sync(&wlvif->rx_streaming_disable_work);
2768        cancel_work_sync(&wlvif->rc_update_work);
2769        cancel_delayed_work_sync(&wlvif->connection_loss_work);
2770        cancel_delayed_work_sync(&wlvif->channel_switch_work);
2771        cancel_delayed_work_sync(&wlvif->pending_auth_complete_work);
2772
2773        mutex_lock(&wl->mutex);
2774}
2775
2776static void wl1271_op_remove_interface(struct ieee80211_hw *hw,
2777                                       struct ieee80211_vif *vif)
2778{
2779        struct wl1271 *wl = hw->priv;
2780        struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
2781        struct wl12xx_vif *iter;
2782        struct vif_counter_data vif_count;
2783
2784        wl12xx_get_vif_count(hw, vif, &vif_count);
2785        mutex_lock(&wl->mutex);
2786
2787        if (wl->state == WLCORE_STATE_OFF ||
2788            !test_bit(WLVIF_FLAG_INITIALIZED, &wlvif->flags))
2789                goto out;
2790
2791        /*
2792         * wl->vif can be null here if someone shuts down the interface
2793         * just when hardware recovery has been started.
2794         */
2795        wl12xx_for_each_wlvif(wl, iter) {
2796                if (iter != wlvif)
2797                        continue;
2798
2799                __wl1271_op_remove_interface(wl, vif, true);
2800                break;
2801        }
2802        WARN_ON(iter != wlvif);
2803        if (wl12xx_need_fw_change(wl, vif_count, false)) {
2804                wl12xx_force_active_psm(wl);
2805                set_bit(WL1271_FLAG_INTENDED_FW_RECOVERY, &wl->flags);
2806                wl12xx_queue_recovery_work(wl);
2807        }
2808out:
2809        mutex_unlock(&wl->mutex);
2810}
2811
2812static int wl12xx_op_change_interface(struct ieee80211_hw *hw,
2813                                      struct ieee80211_vif *vif,
2814                                      enum nl80211_iftype new_type, bool p2p)
2815{
2816        struct wl1271 *wl = hw->priv;
2817        int ret;
2818
2819        set_bit(WL1271_FLAG_VIF_CHANGE_IN_PROGRESS, &wl->flags);
2820        wl1271_op_remove_interface(hw, vif);
2821
2822        vif->type = new_type;
2823        vif->p2p = p2p;
2824        ret = wl1271_op_add_interface(hw, vif);
2825
2826        clear_bit(WL1271_FLAG_VIF_CHANGE_IN_PROGRESS, &wl->flags);
2827        return ret;
2828}
2829
2830static int wlcore_join(struct wl1271 *wl, struct wl12xx_vif *wlvif)
2831{
2832        int ret;
2833        bool is_ibss = (wlvif->bss_type == BSS_TYPE_IBSS);
2834
2835        /*
2836         * One of the side effects of the JOIN command is that is clears
2837         * WPA/WPA2 keys from the chipset. Performing a JOIN while associated
2838         * to a WPA/WPA2 access point will therefore kill the data-path.
2839         * Currently the only valid scenario for JOIN during association
2840         * is on roaming, in which case we will also be given new keys.
2841         * Keep the below message for now, unless it starts bothering
2842         * users who really like to roam a lot :)
2843         */
2844        if (test_bit(WLVIF_FLAG_STA_ASSOCIATED, &wlvif->flags))
2845                wl1271_info("JOIN while associated.");
2846
2847        /* clear encryption type */
2848        wlvif->encryption_type = KEY_NONE;
2849
2850        if (is_ibss)
2851                ret = wl12xx_cmd_role_start_ibss(wl, wlvif);
2852        else
2853                ret = wl12xx_cmd_role_start_sta(wl, wlvif);
2854
2855        return ret;
2856}
2857
2858static int wl1271_ssid_set(struct wl12xx_vif *wlvif, struct sk_buff *skb,
2859                            int offset)
2860{
2861        u8 ssid_len;
2862        const u8 *ptr = cfg80211_find_ie(WLAN_EID_SSID, skb->data + offset,
2863                                         skb->len - offset);
2864
2865        if (!ptr) {
2866                wl1271_error("No SSID in IEs!");
2867                return -ENOENT;
2868        }
2869
2870        ssid_len = ptr[1];
2871        if (ssid_len > IEEE80211_MAX_SSID_LEN) {
2872                wl1271_error("SSID is too long!");
2873                return -EINVAL;
2874        }
2875
2876        wlvif->ssid_len = ssid_len;
2877        memcpy(wlvif->ssid, ptr+2, ssid_len);
2878        return 0;
2879}
2880
2881static int wlcore_set_ssid(struct wl1271 *wl, struct wl12xx_vif *wlvif)
2882{
2883        struct ieee80211_vif *vif = wl12xx_wlvif_to_vif(wlvif);
2884        struct sk_buff *skb;
2885        int ieoffset;
2886
2887        /* we currently only support setting the ssid from the ap probe req */
2888        if (wlvif->bss_type != BSS_TYPE_STA_BSS)
2889                return -EINVAL;
2890
2891        skb = ieee80211_ap_probereq_get(wl->hw, vif);
2892        if (!skb)
2893                return -EINVAL;
2894
2895        ieoffset = offsetof(struct ieee80211_mgmt,
2896                            u.probe_req.variable);
2897        wl1271_ssid_set(wlvif, skb, ieoffset);
2898        dev_kfree_skb(skb);
2899
2900        return 0;
2901}
2902
2903static int wlcore_set_assoc(struct wl1271 *wl, struct wl12xx_vif *wlvif,
2904                            struct ieee80211_bss_conf *bss_conf,
2905                            u32 sta_rate_set)
2906{
2907        int ieoffset;
2908        int ret;
2909
2910        wlvif->aid = bss_conf->aid;
2911        wlvif->channel_type = cfg80211_get_chandef_type(&bss_conf->chandef);
2912        wlvif->beacon_int = bss_conf->beacon_int;
2913        wlvif->wmm_enabled = bss_conf->qos;
2914
2915        set_bit(WLVIF_FLAG_STA_ASSOCIATED, &wlvif->flags);
2916
2917        /*
2918         * with wl1271, we don't need to update the
2919         * beacon_int and dtim_period, because the firmware
2920         * updates it by itself when the first beacon is
2921         * received after a join.
2922         */
2923        ret = wl1271_cmd_build_ps_poll(wl, wlvif, wlvif->aid);
2924        if (ret < 0)
2925                return ret;
2926
2927        /*
2928         * Get a template for hardware connection maintenance
2929         */
2930        dev_kfree_skb(wlvif->probereq);
2931        wlvif->probereq = wl1271_cmd_build_ap_probe_req(wl,
2932                                                        wlvif,
2933                                                        NULL);
2934        ieoffset = offsetof(struct ieee80211_mgmt,
2935                            u.probe_req.variable);
2936        wl1271_ssid_set(wlvif, wlvif->probereq, ieoffset);
2937
2938        /* enable the connection monitoring feature */
2939        ret = wl1271_acx_conn_monit_params(wl, wlvif, true);
2940        if (ret < 0)
2941                return ret;
2942
2943        /*
2944         * The join command disable the keep-alive mode, shut down its process,
2945         * and also clear the template config, so we need to reset it all after
2946         * the join. The acx_aid starts the keep-alive process, and the order
2947         * of the commands below is relevant.
2948         */
2949        ret = wl1271_acx_keep_alive_mode(wl, wlvif, true);
2950        if (ret < 0)
2951                return ret;
2952
2953        ret = wl1271_acx_aid(wl, wlvif, wlvif->aid);
2954        if (ret < 0)
2955                return ret;
2956
2957        ret = wl12xx_cmd_build_klv_null_data(wl, wlvif);
2958        if (ret < 0)
2959                return ret;
2960
2961        ret = wl1271_acx_keep_alive_config(wl, wlvif,
2962                                           wlvif->sta.klv_template_id,
2963                                           ACX_KEEP_ALIVE_TPL_VALID);
2964        if (ret < 0)
2965                return ret;
2966
2967        /*
2968         * The default fw psm configuration is AUTO, while mac80211 default
2969         * setting is off (ACTIVE), so sync the fw with the correct value.
2970         */
2971        ret = wl1271_ps_set_mode(wl, wlvif, STATION_ACTIVE_MODE);
2972        if (ret < 0)
2973                return ret;
2974
2975        if (sta_rate_set) {
2976                wlvif->rate_set =
2977                        wl1271_tx_enabled_rates_get(wl,
2978                                                    sta_rate_set,
2979                                                    wlvif->band);
2980                ret = wl1271_acx_sta_rate_policies(wl, wlvif);
2981                if (ret < 0)
2982                        return ret;
2983        }
2984
2985        return ret;
2986}
2987
2988static int wlcore_unset_assoc(struct wl1271 *wl, struct wl12xx_vif *wlvif)
2989{
2990        int ret;
2991        bool sta = wlvif->bss_type == BSS_TYPE_STA_BSS;
2992
2993        /* make sure we are connected (sta) joined */
2994        if (sta &&
2995            !test_and_clear_bit(WLVIF_FLAG_STA_ASSOCIATED, &wlvif->flags))
2996                return false;
2997
2998        /* make sure we are joined (ibss) */
2999        if (!sta &&
3000            test_and_clear_bit(WLVIF_FLAG_IBSS_JOINED, &wlvif->flags))
3001                return false;
3002
3003        if (sta) {
3004                /* use defaults when not associated */
3005                wlvif->aid = 0;
3006
3007                /* free probe-request template */
3008                dev_kfree_skb(wlvif->probereq);
3009                wlvif->probereq = NULL;
3010
3011                /* disable connection monitor features */
3012                ret = wl1271_acx_conn_monit_params(wl, wlvif, false);
3013                if (ret < 0)
3014                        return ret;
3015
3016                /* Disable the keep-alive feature */
3017                ret = wl1271_acx_keep_alive_mode(wl, wlvif, false);
3018                if (ret < 0)
3019                        return ret;
3020
3021                /* disable beacon filtering */
3022                ret = wl1271_acx_beacon_filter_opt(wl, wlvif, false);
3023                if (ret < 0)
3024                        return ret;
3025        }
3026
3027        if (test_and_clear_bit(WLVIF_FLAG_CS_PROGRESS, &wlvif->flags)) {
3028                struct ieee80211_vif *vif = wl12xx_wlvif_to_vif(wlvif);
3029
3030                wl12xx_cmd_stop_channel_switch(wl, wlvif);
3031                ieee80211_chswitch_done(vif, false);
3032                cancel_delayed_work(&wlvif->channel_switch_work);
3033        }
3034
3035        /* invalidate keep-alive template */
3036        wl1271_acx_keep_alive_config(wl, wlvif,
3037                                     wlvif->sta.klv_template_id,
3038                                     ACX_KEEP_ALIVE_TPL_INVALID);
3039
3040        return 0;
3041}
3042
3043static void wl1271_set_band_rate(struct wl1271 *wl, struct wl12xx_vif *wlvif)
3044{
3045        wlvif->basic_rate_set = wlvif->bitrate_masks[wlvif->band];
3046        wlvif->rate_set = wlvif->basic_rate_set;
3047}
3048
3049static void wl1271_sta_handle_idle(struct wl1271 *wl, struct wl12xx_vif *wlvif,
3050                                   bool idle)
3051{
3052        bool cur_idle = !test_bit(WLVIF_FLAG_ACTIVE, &wlvif->flags);
3053
3054        if (idle == cur_idle)
3055                return;
3056
3057        if (idle) {
3058                clear_bit(WLVIF_FLAG_ACTIVE, &wlvif->flags);
3059        } else {
3060                /* The current firmware only supports sched_scan in idle */
3061                if (wl->sched_vif == wlvif)
3062                        wl->ops->sched_scan_stop(wl, wlvif);
3063
3064                set_bit(WLVIF_FLAG_ACTIVE, &wlvif->flags);
3065        }
3066}
3067
3068static int wl12xx_config_vif(struct wl1271 *wl, struct wl12xx_vif *wlvif,
3069                             struct ieee80211_conf *conf, u32 changed)
3070{
3071        int ret;
3072
3073        if (wlcore_is_p2p_mgmt(wlvif))
3074                return 0;
3075
3076        if (conf->power_level != wlvif->power_level) {
3077                ret = wl1271_acx_tx_power(wl, wlvif, conf->power_level);
3078                if (ret < 0)
3079                        return ret;
3080
3081                wlvif->power_level = conf->power_level;
3082        }
3083
3084        return 0;
3085}
3086
3087static int wl1271_op_config(struct ieee80211_hw *hw, u32 changed)
3088{
3089        struct wl1271 *wl = hw->priv;
3090        struct wl12xx_vif *wlvif;
3091        struct ieee80211_conf *conf = &hw->conf;
3092        int ret = 0;
3093
3094        wl1271_debug(DEBUG_MAC80211, "mac80211 config psm %s power %d %s"
3095                     " changed 0x%x",
3096                     conf->flags & IEEE80211_CONF_PS ? "on" : "off",
3097                     conf->power_level,
3098                     conf->flags & IEEE80211_CONF_IDLE ? "idle" : "in use",
3099                         changed);
3100
3101        mutex_lock(&wl->mutex);
3102
3103        if (changed & IEEE80211_CONF_CHANGE_POWER)
3104                wl->power_level = conf->power_level;
3105
3106        if (unlikely(wl->state != WLCORE_STATE_ON))
3107                goto out;
3108
3109        ret = pm_runtime_resume_and_get(wl->dev);
3110        if (ret < 0)
3111                goto out;
3112
3113        /* configure each interface */
3114        wl12xx_for_each_wlvif(wl, wlvif) {
3115                ret = wl12xx_config_vif(wl, wlvif, conf, changed);
3116                if (ret < 0)
3117                        goto out_sleep;
3118        }
3119
3120out_sleep:
3121        pm_runtime_mark_last_busy(wl->dev);
3122        pm_runtime_put_autosuspend(wl->dev);
3123
3124out:
3125        mutex_unlock(&wl->mutex);
3126
3127        return ret;
3128}
3129
3130struct wl1271_filter_params {
3131        bool enabled;
3132        int mc_list_length;
3133        u8 mc_list[ACX_MC_ADDRESS_GROUP_MAX][ETH_ALEN];
3134};
3135
3136static u64 wl1271_op_prepare_multicast(struct ieee80211_hw *hw,
3137                                       struct netdev_hw_addr_list *mc_list)
3138{
3139        struct wl1271_filter_params *fp;
3140        struct netdev_hw_addr *ha;
3141
3142        fp = kzalloc(sizeof(*fp), GFP_ATOMIC);
3143        if (!fp) {
3144                wl1271_error("Out of memory setting filters.");
3145                return 0;
3146        }
3147
3148        /* update multicast filtering parameters */
3149        fp->mc_list_length = 0;
3150        if (netdev_hw_addr_list_count(mc_list) > ACX_MC_ADDRESS_GROUP_MAX) {
3151                fp->enabled = false;
3152        } else {
3153                fp->enabled = true;
3154                netdev_hw_addr_list_for_each(ha, mc_list) {
3155                        memcpy(fp->mc_list[fp->mc_list_length],
3156                                        ha->addr, ETH_ALEN);
3157                        fp->mc_list_length++;
3158                }
3159        }
3160
3161        return (u64)(unsigned long)fp;
3162}
3163
3164#define WL1271_SUPPORTED_FILTERS (FIF_ALLMULTI | \
3165                                  FIF_FCSFAIL | \
3166                                  FIF_BCN_PRBRESP_PROMISC | \
3167                                  FIF_CONTROL | \
3168                                  FIF_OTHER_BSS)
3169
3170static void wl1271_op_configure_filter(struct ieee80211_hw *hw,
3171                                       unsigned int changed,
3172                                       unsigned int *total, u64 multicast)
3173{
3174        struct wl1271_filter_params *fp = (void *)(unsigned long)multicast;
3175        struct wl1271 *wl = hw->priv;
3176        struct wl12xx_vif *wlvif;
3177
3178        int ret;
3179
3180        wl1271_debug(DEBUG_MAC80211, "mac80211 configure filter changed %x"
3181                     " total %x", changed, *total);
3182
3183        mutex_lock(&wl->mutex);
3184
3185        *total &= WL1271_SUPPORTED_FILTERS;
3186        changed &= WL1271_SUPPORTED_FILTERS;
3187
3188        if (unlikely(wl->state != WLCORE_STATE_ON))
3189                goto out;
3190
3191        ret = pm_runtime_resume_and_get(wl->dev);
3192        if (ret < 0)
3193                goto out;
3194
3195        wl12xx_for_each_wlvif(wl, wlvif) {
3196                if (wlcore_is_p2p_mgmt(wlvif))
3197                        continue;
3198
3199                if (wlvif->bss_type != BSS_TYPE_AP_BSS) {
3200                        if (*total & FIF_ALLMULTI)
3201                                ret = wl1271_acx_group_address_tbl(wl, wlvif,
3202                                                                   false,
3203                                                                   NULL, 0);
3204                        else if (fp)
3205                                ret = wl1271_acx_group_address_tbl(wl, wlvif,
3206                                                        fp->enabled,
3207                                                        fp->mc_list,
3208                                                        fp->mc_list_length);
3209                        if (ret < 0)
3210                                goto out_sleep;
3211                }
3212
3213                /*
3214                 * If interface in AP mode and created with allmulticast then disable
3215                 * the firmware filters so that all multicast packets are passed
3216                 * This is mandatory for MDNS based discovery protocols 
3217                 */
3218                if (wlvif->bss_type == BSS_TYPE_AP_BSS) {
3219                        if (*total & FIF_ALLMULTI) {
3220                                ret = wl1271_acx_group_address_tbl(wl, wlvif,
3221                                                        false,
3222                                                        NULL, 0);
3223                                if (ret < 0)
3224                                        goto out_sleep;
3225                        }
3226                }
3227        }
3228
3229        /*
3230         * the fw doesn't provide an api to configure the filters. instead,
3231         * the filters configuration is based on the active roles / ROC
3232         * state.
3233         */
3234
3235out_sleep:
3236        pm_runtime_mark_last_busy(wl->dev);
3237        pm_runtime_put_autosuspend(wl->dev);
3238
3239out:
3240        mutex_unlock(&wl->mutex);
3241        kfree(fp);
3242}
3243
3244static int wl1271_record_ap_key(struct wl1271 *wl, struct wl12xx_vif *wlvif,
3245                                u8 id, u8 key_type, u8 key_size,
3246                                const u8 *key, u8 hlid, u32 tx_seq_32,
3247                                u16 tx_seq_16, bool is_pairwise)
3248{
3249        struct wl1271_ap_key *ap_key;
3250        int i;
3251
3252        wl1271_debug(DEBUG_CRYPT, "record ap key id %d", (int)id);
3253
3254        if (key_size > MAX_KEY_SIZE)
3255                return -EINVAL;
3256
3257        /*
3258         * Find next free entry in ap_keys. Also check we are not replacing
3259         * an existing key.
3260         */
3261        for (i = 0; i < MAX_NUM_KEYS; i++) {
3262                if (wlvif->ap.recorded_keys[i] == NULL)
3263                        break;
3264
3265                if (wlvif->ap.recorded_keys[i]->id == id) {
3266                        wl1271_warning("trying to record key replacement");
3267                        return -EINVAL;
3268                }
3269        }
3270
3271        if (i == MAX_NUM_KEYS)
3272                return -EBUSY;
3273
3274        ap_key = kzalloc(sizeof(*ap_key), GFP_KERNEL);
3275        if (!ap_key)
3276                return -ENOMEM;
3277
3278        ap_key->id = id;
3279        ap_key->key_type = key_type;
3280        ap_key->key_size = key_size;
3281        memcpy(ap_key->key, key, key_size);
3282        ap_key->hlid = hlid;
3283        ap_key->tx_seq_32 = tx_seq_32;
3284        ap_key->tx_seq_16 = tx_seq_16;
3285        ap_key->is_pairwise = is_pairwise;
3286
3287        wlvif->ap.recorded_keys[i] = ap_key;
3288        return 0;
3289}
3290
3291static void wl1271_free_ap_keys(struct wl1271 *wl, struct wl12xx_vif *wlvif)
3292{
3293        int i;
3294
3295        for (i = 0; i < MAX_NUM_KEYS; i++) {
3296                kfree(wlvif->ap.recorded_keys[i]);
3297                wlvif->ap.recorded_keys[i] = NULL;
3298        }
3299}
3300
3301static int wl1271_ap_init_hwenc(struct wl1271 *wl, struct wl12xx_vif *wlvif)
3302{
3303        int i, ret = 0;
3304        struct wl1271_ap_key *key;
3305        bool wep_key_added = false;
3306
3307        for (i = 0; i < MAX_NUM_KEYS; i++) {
3308                u8 hlid;
3309                if (wlvif->ap.recorded_keys[i] == NULL)
3310                        break;
3311
3312                key = wlvif->ap.recorded_keys[i];
3313                hlid = key->hlid;
3314                if (hlid == WL12XX_INVALID_LINK_ID)
3315                        hlid = wlvif->ap.bcast_hlid;
3316
3317                ret = wl1271_cmd_set_ap_key(wl, wlvif, KEY_ADD_OR_REPLACE,
3318                                            key->id, key->key_type,
3319                                            key->key_size, key->key,
3320                                            hlid, key->tx_seq_32,
3321                                            key->tx_seq_16, key->is_pairwise);
3322                if (ret < 0)
3323                        goto out;
3324
3325                if (key->key_type == KEY_WEP)
3326                        wep_key_added = true;
3327        }
3328
3329        if (wep_key_added) {
3330                ret = wl12xx_cmd_set_default_wep_key(wl, wlvif->default_key,
3331                                                     wlvif->ap.bcast_hlid);
3332                if (ret < 0)
3333                        goto out;
3334        }
3335
3336out:
3337        wl1271_free_ap_keys(wl, wlvif);
3338        return ret;
3339}
3340
3341static int wl1271_set_key(struct wl1271 *wl, struct wl12xx_vif *wlvif,
3342                       u16 action, u8 id, u8 key_type,
3343                       u8 key_size, const u8 *key, u32 tx_seq_32,
3344                       u16 tx_seq_16, struct ieee80211_sta *sta,
3345                       bool is_pairwise)
3346{
3347        int ret;
3348        bool is_ap = (wlvif->bss_type == BSS_TYPE_AP_BSS);
3349
3350        if (is_ap) {
3351                struct wl1271_station *wl_sta;
3352                u8 hlid;
3353
3354                if (sta) {
3355                        wl_sta = (struct wl1271_station *)sta->drv_priv;
3356                        hlid = wl_sta->hlid;
3357                } else {
3358                        hlid = wlvif->ap.bcast_hlid;
3359                }
3360
3361                if (!test_bit(WLVIF_FLAG_AP_STARTED, &wlvif->flags)) {
3362                        /*
3363                         * We do not support removing keys after AP shutdown.
3364                         * Pretend we do to make mac80211 happy.
3365                         */
3366                        if (action != KEY_ADD_OR_REPLACE)
3367                                return 0;
3368
3369                        ret = wl1271_record_ap_key(wl, wlvif, id,
3370                                             key_type, key_size,
3371                                             key, hlid, tx_seq_32,
3372                                             tx_seq_16, is_pairwise);
3373                } else {
3374                        ret = wl1271_cmd_set_ap_key(wl, wlvif, action,
3375                                             id, key_type, key_size,
3376                                             key, hlid, tx_seq_32,
3377                                             tx_seq_16, is_pairwise);
3378                }
3379
3380                if (ret < 0)
3381                        return ret;
3382        } else {
3383                const u8 *addr;
3384                static const u8 bcast_addr[ETH_ALEN] = {
3385                        0xff, 0xff, 0xff, 0xff, 0xff, 0xff
3386                };
3387
3388                addr = sta ? sta->addr : bcast_addr;
3389
3390                if (is_zero_ether_addr(addr)) {
3391                        /* We dont support TX only encryption */
3392                        return -EOPNOTSUPP;
3393                }
3394
3395                /* The wl1271 does not allow to remove unicast keys - they
3396                   will be cleared automatically on next CMD_JOIN. Ignore the
3397                   request silently, as we dont want the mac80211 to emit
3398                   an error message. */
3399                if (action == KEY_REMOVE && !is_broadcast_ether_addr(addr))
3400                        return 0;
3401
3402                /* don't remove key if hlid was already deleted */
3403                if (action == KEY_REMOVE &&
3404                    wlvif->sta.hlid == WL12XX_INVALID_LINK_ID)
3405                        return 0;
3406
3407                ret = wl1271_cmd_set_sta_key(wl, wlvif, action,
3408                                             id, key_type, key_size,
3409                                             key, addr, tx_seq_32,
3410                                             tx_seq_16);
3411                if (ret < 0)
3412                        return ret;
3413
3414        }
3415
3416        return 0;
3417}
3418
3419static int wlcore_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
3420                             struct ieee80211_vif *vif,
3421                             struct ieee80211_sta *sta,
3422                             struct ieee80211_key_conf *key_conf)
3423{
3424        struct wl1271 *wl = hw->priv;
3425        int ret;
3426        bool might_change_spare =
3427                key_conf->cipher == WL1271_CIPHER_SUITE_GEM ||
3428                key_conf->cipher == WLAN_CIPHER_SUITE_TKIP;
3429
3430        if (might_change_spare) {
3431                /*
3432                 * stop the queues and flush to ensure the next packets are
3433                 * in sync with FW spare block accounting
3434                 */
3435                wlcore_stop_queues(wl, WLCORE_QUEUE_STOP_REASON_SPARE_BLK);
3436                wl1271_tx_flush(wl);
3437        }
3438
3439        mutex_lock(&wl->mutex);
3440
3441        if (unlikely(wl->state != WLCORE_STATE_ON)) {
3442                ret = -EAGAIN;
3443                goto out_wake_queues;
3444        }
3445
3446        ret = pm_runtime_resume_and_get(wl->dev);
3447        if (ret < 0)
3448                goto out_wake_queues;
3449
3450        ret = wlcore_hw_set_key(wl, cmd, vif, sta, key_conf);
3451
3452        pm_runtime_mark_last_busy(wl->dev);
3453        pm_runtime_put_autosuspend(wl->dev);
3454
3455out_wake_queues:
3456        if (might_change_spare)
3457                wlcore_wake_queues(wl, WLCORE_QUEUE_STOP_REASON_SPARE_BLK);
3458
3459        mutex_unlock(&wl->mutex);
3460
3461        return ret;
3462}
3463
3464int wlcore_set_key(struct wl1271 *wl, enum set_key_cmd cmd,
3465                   struct ieee80211_vif *vif,
3466                   struct ieee80211_sta *sta,
3467                   struct ieee80211_key_conf *key_conf)
3468{
3469        struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
3470        int ret;
3471        u32 tx_seq_32 = 0;
3472        u16 tx_seq_16 = 0;
3473        u8 key_type;
3474        u8 hlid;
3475        bool is_pairwise;
3476
3477        wl1271_debug(DEBUG_MAC80211, "mac80211 set key");
3478
3479        wl1271_debug(DEBUG_CRYPT, "CMD: 0x%x sta: %p", cmd, sta);
3480        wl1271_debug(DEBUG_CRYPT, "Key: algo:0x%x, id:%d, len:%d flags 0x%x",
3481                     key_conf->cipher, key_conf->keyidx,
3482                     key_conf->keylen, key_conf->flags);
3483        wl1271_dump(DEBUG_CRYPT, "KEY: ", key_conf->key, key_conf->keylen);
3484
3485        if (wlvif->bss_type == BSS_TYPE_AP_BSS)
3486                if (sta) {
3487                        struct wl1271_station *wl_sta = (void *)sta->drv_priv;
3488                        hlid = wl_sta->hlid;
3489                } else {
3490                        hlid = wlvif->ap.bcast_hlid;
3491                }
3492        else
3493                hlid = wlvif->sta.hlid;
3494
3495        if (hlid != WL12XX_INVALID_LINK_ID) {
3496                u64 tx_seq = wl->links[hlid].total_freed_pkts;
3497                tx_seq_32 = WL1271_TX_SECURITY_HI32(tx_seq);
3498                tx_seq_16 = WL1271_TX_SECURITY_LO16(tx_seq);
3499        }
3500
3501        switch (key_conf->cipher) {
3502        case WLAN_CIPHER_SUITE_WEP40:
3503        case WLAN_CIPHER_SUITE_WEP104:
3504                key_type = KEY_WEP;
3505
3506                key_conf->hw_key_idx = key_conf->keyidx;
3507                break;
3508        case WLAN_CIPHER_SUITE_TKIP:
3509                key_type = KEY_TKIP;
3510                key_conf->hw_key_idx = key_conf->keyidx;
3511                break;
3512        case WLAN_CIPHER_SUITE_CCMP:
3513                key_type = KEY_AES;
3514                key_conf->flags |= IEEE80211_KEY_FLAG_PUT_IV_SPACE;
3515                break;
3516        case WL1271_CIPHER_SUITE_GEM:
3517                key_type = KEY_GEM;
3518                break;
3519        default:
3520                wl1271_error("Unknown key algo 0x%x", key_conf->cipher);
3521
3522                return -EOPNOTSUPP;
3523        }
3524
3525        is_pairwise = key_conf->flags & IEEE80211_KEY_FLAG_PAIRWISE;
3526
3527        switch (cmd) {
3528        case SET_KEY:
3529                ret = wl1271_set_key(wl, wlvif, KEY_ADD_OR_REPLACE,
3530                                 key_conf->keyidx, key_type,
3531                                 key_conf->keylen, key_conf->key,
3532                                 tx_seq_32, tx_seq_16, sta, is_pairwise);
3533                if (ret < 0) {
3534                        wl1271_error("Could not add or replace key");
3535                        return ret;
3536                }
3537
3538                /*
3539                 * reconfiguring arp response if the unicast (or common)
3540                 * encryption key type was changed
3541                 */
3542                if (wlvif->bss_type == BSS_TYPE_STA_BSS &&
3543                    (sta || key_type == KEY_WEP) &&
3544                    wlvif->encryption_type != key_type) {
3545                        wlvif->encryption_type = key_type;
3546                        ret = wl1271_cmd_build_arp_rsp(wl, wlvif);
3547                        if (ret < 0) {
3548                                wl1271_warning("build arp rsp failed: %d", ret);
3549                                return ret;
3550                        }
3551                }
3552                break;
3553
3554        case DISABLE_KEY:
3555                ret = wl1271_set_key(wl, wlvif, KEY_REMOVE,
3556                                     key_conf->keyidx, key_type,
3557                                     key_conf->keylen, key_conf->key,
3558                                     0, 0, sta, is_pairwise);
3559                if (ret < 0) {
3560                        wl1271_error("Could not remove key");
3561                        return ret;
3562                }
3563                break;
3564
3565        default:
3566                wl1271_error("Unsupported key cmd 0x%x", cmd);
3567                return -EOPNOTSUPP;
3568        }
3569
3570        return ret;
3571}
3572EXPORT_SYMBOL_GPL(wlcore_set_key);
3573
3574static void wl1271_op_set_default_key_idx(struct ieee80211_hw *hw,
3575                                          struct ieee80211_vif *vif,
3576                                          int key_idx)
3577{
3578        struct wl1271 *wl = hw->priv;
3579        struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
3580        int ret;
3581
3582        wl1271_debug(DEBUG_MAC80211, "mac80211 set default key idx %d",
3583                     key_idx);
3584
3585        /* we don't handle unsetting of default key */
3586        if (key_idx == -1)
3587                return;
3588
3589        mutex_lock(&wl->mutex);
3590
3591        if (unlikely(wl->state != WLCORE_STATE_ON)) {
3592                ret = -EAGAIN;
3593                goto out_unlock;
3594        }
3595
3596        ret = pm_runtime_resume_and_get(wl->dev);
3597        if (ret < 0)
3598                goto out_unlock;
3599
3600        wlvif->default_key = key_idx;
3601
3602        /* the default WEP key needs to be configured at least once */
3603        if (wlvif->encryption_type == KEY_WEP) {
3604                ret = wl12xx_cmd_set_default_wep_key(wl,
3605                                key_idx,
3606                                wlvif->sta.hlid);
3607                if (ret < 0)
3608                        goto out_sleep;
3609        }
3610
3611out_sleep:
3612        pm_runtime_mark_last_busy(wl->dev);
3613        pm_runtime_put_autosuspend(wl->dev);
3614
3615out_unlock:
3616        mutex_unlock(&wl->mutex);
3617}
3618
3619void wlcore_regdomain_config(struct wl1271 *wl)
3620{
3621        int ret;
3622
3623        if (!(wl->quirks & WLCORE_QUIRK_REGDOMAIN_CONF))
3624                return;
3625
3626        mutex_lock(&wl->mutex);
3627
3628        if (unlikely(wl->state != WLCORE_STATE_ON))
3629                goto out;
3630
3631        ret = pm_runtime_resume_and_get(wl->dev);
3632        if (ret < 0)
3633                goto out;
3634
3635        ret = wlcore_cmd_regdomain_config_locked(wl);
3636        if (ret < 0) {
3637                wl12xx_queue_recovery_work(wl);
3638                goto out;
3639        }
3640
3641        pm_runtime_mark_last_busy(wl->dev);
3642        pm_runtime_put_autosuspend(wl->dev);
3643out:
3644        mutex_unlock(&wl->mutex);
3645}
3646
3647static int wl1271_op_hw_scan(struct ieee80211_hw *hw,
3648                             struct ieee80211_vif *vif,
3649                             struct ieee80211_scan_request *hw_req)
3650{
3651        struct cfg80211_scan_request *req = &hw_req->req;
3652        struct wl1271 *wl = hw->priv;
3653        int ret;
3654        u8 *ssid = NULL;
3655        size_t len = 0;
3656
3657        wl1271_debug(DEBUG_MAC80211, "mac80211 hw scan");
3658
3659        if (req->n_ssids) {
3660                ssid = req->ssids[0].ssid;
3661                len = req->ssids[0].ssid_len;
3662        }
3663
3664        mutex_lock(&wl->mutex);
3665
3666        if (unlikely(wl->state != WLCORE_STATE_ON)) {
3667                /*
3668                 * We cannot return -EBUSY here because cfg80211 will expect
3669                 * a call to ieee80211_scan_completed if we do - in this case
3670                 * there won't be any call.
3671                 */
3672                ret = -EAGAIN;
3673                goto out;
3674        }
3675
3676        ret = pm_runtime_resume_and_get(wl->dev);
3677        if (ret < 0)
3678                goto out;
3679
3680        /* fail if there is any role in ROC */
3681        if (find_first_bit(wl->roc_map, WL12XX_MAX_ROLES) < WL12XX_MAX_ROLES) {
3682                /* don't allow scanning right now */
3683                ret = -EBUSY;
3684                goto out_sleep;
3685        }
3686
3687        ret = wlcore_scan(hw->priv, vif, ssid, len, req);
3688out_sleep:
3689        pm_runtime_mark_last_busy(wl->dev);
3690        pm_runtime_put_autosuspend(wl->dev);
3691out:
3692        mutex_unlock(&wl->mutex);
3693
3694        return ret;
3695}
3696
3697static void wl1271_op_cancel_hw_scan(struct ieee80211_hw *hw,
3698                                     struct ieee80211_vif *vif)
3699{
3700        struct wl1271 *wl = hw->priv;
3701        struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
3702        struct cfg80211_scan_info info = {
3703                .aborted = true,
3704        };
3705        int ret;
3706
3707        wl1271_debug(DEBUG_MAC80211, "mac80211 cancel hw scan");
3708
3709        mutex_lock(&wl->mutex);
3710
3711        if (unlikely(wl->state != WLCORE_STATE_ON))
3712                goto out;
3713
3714        if (wl->scan.state == WL1271_SCAN_STATE_IDLE)
3715                goto out;
3716
3717        ret = pm_runtime_resume_and_get(wl->dev);
3718        if (ret < 0)
3719                goto out;
3720
3721        if (wl->scan.state != WL1271_SCAN_STATE_DONE) {
3722                ret = wl->ops->scan_stop(wl, wlvif);
3723                if (ret < 0)
3724                        goto out_sleep;
3725        }
3726
3727        /*
3728         * Rearm the tx watchdog just before idling scan. This
3729         * prevents just-finished scans from triggering the watchdog
3730         */
3731        wl12xx_rearm_tx_watchdog_locked(wl);
3732
3733        wl->scan.state = WL1271_SCAN_STATE_IDLE;
3734        memset(wl->scan.scanned_ch, 0, sizeof(wl->scan.scanned_ch));
3735        wl->scan_wlvif = NULL;
3736        wl->scan.req = NULL;
3737        ieee80211_scan_completed(wl->hw, &info);
3738
3739out_sleep:
3740        pm_runtime_mark_last_busy(wl->dev);
3741        pm_runtime_put_autosuspend(wl->dev);
3742out:
3743        mutex_unlock(&wl->mutex);
3744
3745        cancel_delayed_work_sync(&wl->scan_complete_work);
3746}
3747
3748static int wl1271_op_sched_scan_start(struct ieee80211_hw *hw,
3749                                      struct ieee80211_vif *vif,
3750                                      struct cfg80211_sched_scan_request *req,
3751                                      struct ieee80211_scan_ies *ies)
3752{
3753        struct wl1271 *wl = hw->priv;
3754        struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
3755        int ret;
3756
3757        wl1271_debug(DEBUG_MAC80211, "wl1271_op_sched_scan_start");
3758
3759        mutex_lock(&wl->mutex);
3760
3761        if (unlikely(wl->state != WLCORE_STATE_ON)) {
3762                ret = -EAGAIN;
3763                goto out;
3764        }
3765
3766        ret = pm_runtime_resume_and_get(wl->dev);
3767        if (ret < 0)
3768                goto out;
3769
3770        ret = wl->ops->sched_scan_start(wl, wlvif, req, ies);
3771        if (ret < 0)
3772                goto out_sleep;
3773
3774        wl->sched_vif = wlvif;
3775
3776out_sleep:
3777        pm_runtime_mark_last_busy(wl->dev);
3778        pm_runtime_put_autosuspend(wl->dev);
3779out:
3780        mutex_unlock(&wl->mutex);
3781        return ret;
3782}
3783
3784static int wl1271_op_sched_scan_stop(struct ieee80211_hw *hw,
3785                                     struct ieee80211_vif *vif)
3786{
3787        struct wl1271 *wl = hw->priv;
3788        struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
3789        int ret;
3790
3791        wl1271_debug(DEBUG_MAC80211, "wl1271_op_sched_scan_stop");
3792
3793        mutex_lock(&wl->mutex);
3794
3795        if (unlikely(wl->state != WLCORE_STATE_ON))
3796                goto out;
3797
3798        ret = pm_runtime_resume_and_get(wl->dev);
3799        if (ret < 0)
3800                goto out;
3801
3802        wl->ops->sched_scan_stop(wl, wlvif);
3803
3804        pm_runtime_mark_last_busy(wl->dev);
3805        pm_runtime_put_autosuspend(wl->dev);
3806out:
3807        mutex_unlock(&wl->mutex);
3808
3809        return 0;
3810}
3811
3812static int wl1271_op_set_frag_threshold(struct ieee80211_hw *hw, u32 value)
3813{
3814        struct wl1271 *wl = hw->priv;
3815        int ret = 0;
3816
3817        mutex_lock(&wl->mutex);
3818
3819        if (unlikely(wl->state != WLCORE_STATE_ON)) {
3820                ret = -EAGAIN;
3821                goto out;
3822        }
3823
3824        ret = pm_runtime_resume_and_get(wl->dev);
3825        if (ret < 0)
3826                goto out;
3827
3828        ret = wl1271_acx_frag_threshold(wl, value);
3829        if (ret < 0)
3830                wl1271_warning("wl1271_op_set_frag_threshold failed: %d", ret);
3831
3832        pm_runtime_mark_last_busy(wl->dev);
3833        pm_runtime_put_autosuspend(wl->dev);
3834
3835out:
3836        mutex_unlock(&wl->mutex);
3837
3838        return ret;
3839}
3840
3841static int wl1271_op_set_rts_threshold(struct ieee80211_hw *hw, u32 value)
3842{
3843        struct wl1271 *wl = hw->priv;
3844        struct wl12xx_vif *wlvif;
3845        int ret = 0;
3846
3847        mutex_lock(&wl->mutex);
3848
3849        if (unlikely(wl->state != WLCORE_STATE_ON)) {
3850                ret = -EAGAIN;
3851                goto out;
3852        }
3853
3854        ret = pm_runtime_resume_and_get(wl->dev);
3855        if (ret < 0)
3856                goto out;
3857
3858        wl12xx_for_each_wlvif(wl, wlvif) {
3859                ret = wl1271_acx_rts_threshold(wl, wlvif, value);
3860                if (ret < 0)
3861                        wl1271_warning("set rts threshold failed: %d", ret);
3862        }
3863        pm_runtime_mark_last_busy(wl->dev);
3864        pm_runtime_put_autosuspend(wl->dev);
3865
3866out:
3867        mutex_unlock(&wl->mutex);
3868
3869        return ret;
3870}
3871
3872static void wl12xx_remove_ie(struct sk_buff *skb, u8 eid, int ieoffset)
3873{
3874        int len;
3875        const u8 *next, *end = skb->data + skb->len;
3876        u8 *ie = (u8 *)cfg80211_find_ie(eid, skb->data + ieoffset,
3877                                        skb->len - ieoffset);
3878        if (!ie)
3879                return;
3880        len = ie[1] + 2;
3881        next = ie + len;
3882        memmove(ie, next, end - next);
3883        skb_trim(skb, skb->len - len);
3884}
3885
3886static void wl12xx_remove_vendor_ie(struct sk_buff *skb,
3887                                            unsigned int oui, u8 oui_type,
3888                                            int ieoffset)
3889{
3890        int len;
3891        const u8 *next, *end = skb->data + skb->len;
3892        u8 *ie = (u8 *)cfg80211_find_vendor_ie(oui, oui_type,
3893                                               skb->data + ieoffset,
3894                                               skb->len - ieoffset);
3895        if (!ie)
3896                return;
3897        len = ie[1] + 2;
3898        next = ie + len;
3899        memmove(ie, next, end - next);
3900        skb_trim(skb, skb->len - len);
3901}
3902
3903static int wl1271_ap_set_probe_resp_tmpl(struct wl1271 *wl, u32 rates,
3904                                         struct ieee80211_vif *vif)
3905{
3906        struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
3907        struct sk_buff *skb;
3908        int ret;
3909
3910        skb = ieee80211_proberesp_get(wl->hw, vif);
3911        if (!skb)
3912                return -EOPNOTSUPP;
3913
3914        ret = wl1271_cmd_template_set(wl, wlvif->role_id,
3915                                      CMD_TEMPL_AP_PROBE_RESPONSE,
3916                                      skb->data,
3917                                      skb->len, 0,
3918                                      rates);
3919        dev_kfree_skb(skb);
3920
3921        if (ret < 0)
3922                goto out;
3923
3924        wl1271_debug(DEBUG_AP, "probe response updated");
3925        set_bit(WLVIF_FLAG_AP_PROBE_RESP_SET, &wlvif->flags);
3926
3927out:
3928        return ret;
3929}
3930
3931static int wl1271_ap_set_probe_resp_tmpl_legacy(struct wl1271 *wl,
3932                                             struct ieee80211_vif *vif,
3933                                             u8 *probe_rsp_data,
3934                                             size_t probe_rsp_len,
3935                                             u32 rates)
3936{
3937        struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
3938        struct ieee80211_bss_conf *bss_conf = &vif->bss_conf;
3939        u8 probe_rsp_templ[WL1271_CMD_TEMPL_MAX_SIZE];
3940        int ssid_ie_offset, ie_offset, templ_len;
3941        const u8 *ptr;
3942
3943        /* no need to change probe response if the SSID is set correctly */
3944        if (wlvif->ssid_len > 0)
3945                return wl1271_cmd_template_set(wl, wlvif->role_id,
3946                                               CMD_TEMPL_AP_PROBE_RESPONSE,
3947                                               probe_rsp_data,
3948                                               probe_rsp_len, 0,
3949                                               rates);
3950
3951        if (probe_rsp_len + bss_conf->ssid_len > WL1271_CMD_TEMPL_MAX_SIZE) {
3952                wl1271_error("probe_rsp template too big");
3953                return -EINVAL;
3954        }
3955
3956        /* start searching from IE offset */
3957        ie_offset = offsetof(struct ieee80211_mgmt, u.probe_resp.variable);
3958
3959        ptr = cfg80211_find_ie(WLAN_EID_SSID, probe_rsp_data + ie_offset,
3960                               probe_rsp_len - ie_offset);
3961        if (!ptr) {
3962                wl1271_error("No SSID in beacon!");
3963                return -EINVAL;
3964        }
3965
3966        ssid_ie_offset = ptr - probe_rsp_data;
3967        ptr += (ptr[1] + 2);
3968
3969        memcpy(probe_rsp_templ, probe_rsp_data, ssid_ie_offset);
3970
3971        /* insert SSID from bss_conf */
3972        probe_rsp_templ[ssid_ie_offset] = WLAN_EID_SSID;
3973        probe_rsp_templ[ssid_ie_offset + 1] = bss_conf->ssid_len;
3974        memcpy(probe_rsp_templ + ssid_ie_offset + 2,
3975               bss_conf->ssid, bss_conf->ssid_len);
3976        templ_len = ssid_ie_offset + 2 + bss_conf->ssid_len;
3977
3978        memcpy(probe_rsp_templ + ssid_ie_offset + 2 + bss_conf->ssid_len,
3979               ptr, probe_rsp_len - (ptr - probe_rsp_data));
3980        templ_len += probe_rsp_len - (ptr - probe_rsp_data);
3981
3982        return wl1271_cmd_template_set(wl, wlvif->role_id,
3983                                       CMD_TEMPL_AP_PROBE_RESPONSE,
3984                                       probe_rsp_templ,
3985                                       templ_len, 0,
3986                                       rates);
3987}
3988
3989static int wl1271_bss_erp_info_changed(struct wl1271 *wl,
3990                                       struct ieee80211_vif *vif,
3991                                       struct ieee80211_bss_conf *bss_conf,
3992                                       u32 changed)
3993{
3994        struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
3995        int ret = 0;
3996
3997        if (changed & BSS_CHANGED_ERP_SLOT) {
3998                if (bss_conf->use_short_slot)
3999                        ret = wl1271_acx_slot(wl, wlvif, SLOT_TIME_SHORT);
4000                else
4001                        ret = wl1271_acx_slot(wl, wlvif, SLOT_TIME_LONG);
4002                if (ret < 0) {
4003                        wl1271_warning("Set slot time failed %d", ret);
4004                        goto out;
4005                }
4006        }
4007
4008        if (changed & BSS_CHANGED_ERP_PREAMBLE) {
4009                if (bss_conf->use_short_preamble)
4010                        wl1271_acx_set_preamble(wl, wlvif, ACX_PREAMBLE_SHORT);
4011                else
4012                        wl1271_acx_set_preamble(wl, wlvif, ACX_PREAMBLE_LONG);
4013        }
4014
4015        if (changed & BSS_CHANGED_ERP_CTS_PROT) {
4016                if (bss_conf->use_cts_prot)
4017                        ret = wl1271_acx_cts_protect(wl, wlvif,
4018                                                     CTSPROTECT_ENABLE);
4019                else
4020                        ret = wl1271_acx_cts_protect(wl, wlvif,
4021                                                     CTSPROTECT_DISABLE);
4022                if (ret < 0) {
4023                        wl1271_warning("Set ctsprotect failed %d", ret);
4024                        goto out;
4025                }
4026        }
4027
4028out:
4029        return ret;
4030}
4031
4032static int wlcore_set_beacon_template(struct wl1271 *wl,
4033                                      struct ieee80211_vif *vif,
4034                                      bool is_ap)
4035{
4036        struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
4037        struct ieee80211_hdr *hdr;
4038        u32 min_rate;
4039        int ret;
4040        int ieoffset = offsetof(struct ieee80211_mgmt, u.beacon.variable);
4041        struct sk_buff *beacon = ieee80211_beacon_get(wl->hw, vif);
4042        u16 tmpl_id;
4043
4044        if (!beacon) {
4045                ret = -EINVAL;
4046                goto out;
4047        }
4048
4049        wl1271_debug(DEBUG_MASTER, "beacon updated");
4050
4051        ret = wl1271_ssid_set(wlvif, beacon, ieoffset);
4052        if (ret < 0) {
4053                dev_kfree_skb(beacon);
4054                goto out;
4055        }
4056        min_rate = wl1271_tx_min_rate_get(wl, wlvif->basic_rate_set);
4057        tmpl_id = is_ap ? CMD_TEMPL_AP_BEACON :
4058                CMD_TEMPL_BEACON;
4059        ret = wl1271_cmd_template_set(wl, wlvif->role_id, tmpl_id,
4060                                      beacon->data,
4061                                      beacon->len, 0,
4062                                      min_rate);
4063        if (ret < 0) {
4064                dev_kfree_skb(beacon);
4065                goto out;
4066        }
4067
4068        wlvif->wmm_enabled =
4069                cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT,
4070                                        WLAN_OUI_TYPE_MICROSOFT_WMM,
4071                                        beacon->data + ieoffset,
4072                                        beacon->len - ieoffset);
4073
4074        /*
4075         * In case we already have a probe-resp beacon set explicitly
4076         * by usermode, don't use the beacon data.
4077         */
4078        if (test_bit(WLVIF_FLAG_AP_PROBE_RESP_SET, &wlvif->flags))
4079                goto end_bcn;
4080
4081        /* remove TIM ie from probe response */
4082        wl12xx_remove_ie(beacon, WLAN_EID_TIM, ieoffset);
4083
4084        /*
4085         * remove p2p ie from probe response.
4086         * the fw reponds to probe requests that don't include
4087         * the p2p ie. probe requests with p2p ie will be passed,
4088         * and will be responded by the supplicant (the spec
4089         * forbids including the p2p ie when responding to probe
4090         * requests that didn't include it).
4091         */
4092        wl12xx_remove_vendor_ie(beacon, WLAN_OUI_WFA,
4093                                WLAN_OUI_TYPE_WFA_P2P, ieoffset);
4094
4095        hdr = (struct ieee80211_hdr *) beacon->data;
4096        hdr->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT |
4097                                         IEEE80211_STYPE_PROBE_RESP);
4098        if (is_ap)
4099                ret = wl1271_ap_set_probe_resp_tmpl_legacy(wl, vif,
4100                                                           beacon->data,
4101                                                           beacon->len,
4102                                                           min_rate);
4103        else
4104                ret = wl1271_cmd_template_set(wl, wlvif->role_id,
4105                                              CMD_TEMPL_PROBE_RESPONSE,
4106                                              beacon->data,
4107                                              beacon->len, 0,
4108                                              min_rate);
4109end_bcn:
4110        dev_kfree_skb(beacon);
4111        if (ret < 0)
4112                goto out;
4113
4114out:
4115        return ret;
4116}
4117
4118static int wl1271_bss_beacon_info_changed(struct wl1271 *wl,
4119                                          struct ieee80211_vif *vif,
4120                                          struct ieee80211_bss_conf *bss_conf,
4121                                          u32 changed)
4122{
4123        struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
4124        bool is_ap = (wlvif->bss_type == BSS_TYPE_AP_BSS);
4125        int ret = 0;
4126
4127        if (changed & BSS_CHANGED_BEACON_INT) {
4128                wl1271_debug(DEBUG_MASTER, "beacon interval updated: %d",
4129                        bss_conf->beacon_int);
4130
4131                wlvif->beacon_int = bss_conf->beacon_int;
4132        }
4133
4134        if ((changed & BSS_CHANGED_AP_PROBE_RESP) && is_ap) {
4135                u32 rate = wl1271_tx_min_rate_get(wl, wlvif->basic_rate_set);
4136
4137                wl1271_ap_set_probe_resp_tmpl(wl, rate, vif);
4138        }
4139
4140        if (changed & BSS_CHANGED_BEACON) {
4141                ret = wlcore_set_beacon_template(wl, vif, is_ap);
4142                if (ret < 0)
4143                        goto out;
4144
4145                if (test_and_clear_bit(WLVIF_FLAG_BEACON_DISABLED,
4146                                       &wlvif->flags)) {
4147                        ret = wlcore_hw_dfs_master_restart(wl, wlvif);
4148                        if (ret < 0)
4149                                goto out;
4150                }
4151        }
4152out:
4153        if (ret != 0)
4154                wl1271_error("beacon info change failed: %d", ret);
4155        return ret;
4156}
4157
4158/* AP mode changes */
4159static void wl1271_bss_info_changed_ap(struct wl1271 *wl,
4160                                       struct ieee80211_vif *vif,
4161                                       struct ieee80211_bss_conf *bss_conf,
4162                                       u32 changed)
4163{
4164        struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
4165        int ret = 0;
4166
4167        if (changed & BSS_CHANGED_BASIC_RATES) {
4168                u32 rates = bss_conf->basic_rates;
4169
4170                wlvif->basic_rate_set = wl1271_tx_enabled_rates_get(wl, rates,
4171                                                                 wlvif->band);
4172                wlvif->basic_rate = wl1271_tx_min_rate_get(wl,
4173                                                        wlvif->basic_rate_set);
4174
4175                ret = wl1271_init_ap_rates(wl, wlvif);
4176                if (ret < 0) {
4177                        wl1271_error("AP rate policy change failed %d", ret);
4178                        goto out;
4179                }
4180
4181                ret = wl1271_ap_init_templates(wl, vif);
4182                if (ret < 0)
4183                        goto out;
4184
4185                /* No need to set probe resp template for mesh */
4186                if (!ieee80211_vif_is_mesh(vif)) {
4187                        ret = wl1271_ap_set_probe_resp_tmpl(wl,
4188                                                            wlvif->basic_rate,
4189                                                            vif);
4190                        if (ret < 0)
4191                                goto out;
4192                }
4193
4194                ret = wlcore_set_beacon_template(wl, vif, true);
4195                if (ret < 0)
4196                        goto out;
4197        }
4198
4199        ret = wl1271_bss_beacon_info_changed(wl, vif, bss_conf, changed);
4200        if (ret < 0)
4201                goto out;
4202
4203        if (changed & BSS_CHANGED_BEACON_ENABLED) {
4204                if (bss_conf->enable_beacon) {
4205                        if (!test_bit(WLVIF_FLAG_AP_STARTED, &wlvif->flags)) {
4206                                ret = wl12xx_cmd_role_start_ap(wl, wlvif);
4207                                if (ret < 0)
4208                                        goto out;
4209
4210                                ret = wl1271_ap_init_hwenc(wl, wlvif);
4211                                if (ret < 0)
4212                                        goto out;
4213
4214                                set_bit(WLVIF_FLAG_AP_STARTED, &wlvif->flags);
4215                                wl1271_debug(DEBUG_AP, "started AP");
4216                        }
4217                } else {
4218                        if (test_bit(WLVIF_FLAG_AP_STARTED, &wlvif->flags)) {
4219                                /*
4220                                 * AP might be in ROC in case we have just
4221                                 * sent auth reply. handle it.
4222                                 */
4223                                if (test_bit(wlvif->role_id, wl->roc_map))
4224                                        wl12xx_croc(wl, wlvif->role_id);
4225
4226                                ret = wl12xx_cmd_role_stop_ap(wl, wlvif);
4227                                if (ret < 0)
4228                                        goto out;
4229
4230                                clear_bit(WLVIF_FLAG_AP_STARTED, &wlvif->flags);
4231                                clear_bit(WLVIF_FLAG_AP_PROBE_RESP_SET,
4232                                          &wlvif->flags);
4233                                wl1271_debug(DEBUG_AP, "stopped AP");
4234                        }
4235                }
4236        }
4237
4238        ret = wl1271_bss_erp_info_changed(wl, vif, bss_conf, changed);
4239        if (ret < 0)
4240                goto out;
4241
4242        /* Handle HT information change */
4243        if ((changed & BSS_CHANGED_HT) &&
4244            (bss_conf->chandef.width != NL80211_CHAN_WIDTH_20_NOHT)) {
4245                ret = wl1271_acx_set_ht_information(wl, wlvif,
4246                                        bss_conf->ht_operation_mode);
4247                if (ret < 0) {
4248                        wl1271_warning("Set ht information failed %d", ret);
4249                        goto out;
4250                }
4251        }
4252
4253out:
4254        return;
4255}
4256
4257static int wlcore_set_bssid(struct wl1271 *wl, struct wl12xx_vif *wlvif,
4258                            struct ieee80211_bss_conf *bss_conf,
4259                            u32 sta_rate_set)
4260{
4261        u32 rates;
4262        int ret;
4263
4264        wl1271_debug(DEBUG_MAC80211,
4265             "changed_bssid: %pM, aid: %d, bcn_int: %d, brates: 0x%x sta_rate_set: 0x%x",
4266             bss_conf->bssid, bss_conf->aid,
4267             bss_conf->beacon_int,
4268             bss_conf->basic_rates, sta_rate_set);
4269
4270        wlvif->beacon_int = bss_conf->beacon_int;
4271        rates = bss_conf->basic_rates;
4272        wlvif->basic_rate_set =
4273                wl1271_tx_enabled_rates_get(wl, rates,
4274                                            wlvif->band);
4275        wlvif->basic_rate =
4276                wl1271_tx_min_rate_get(wl,
4277                                       wlvif->basic_rate_set);
4278
4279        if (sta_rate_set)
4280                wlvif->rate_set =
4281                        wl1271_tx_enabled_rates_get(wl,
4282                                                sta_rate_set,
4283                                                wlvif->band);
4284
4285        /* we only support sched_scan while not connected */
4286        if (wl->sched_vif == wlvif)
4287                wl->ops->sched_scan_stop(wl, wlvif);
4288
4289        ret = wl1271_acx_sta_rate_policies(wl, wlvif);
4290        if (ret < 0)
4291                return ret;
4292
4293        ret = wl12xx_cmd_build_null_data(wl, wlvif);
4294        if (ret < 0)
4295                return ret;
4296
4297        ret = wl1271_build_qos_null_data(wl, wl12xx_wlvif_to_vif(wlvif));
4298        if (ret < 0)
4299                return ret;
4300
4301        wlcore_set_ssid(wl, wlvif);
4302
4303        set_bit(WLVIF_FLAG_IN_USE, &wlvif->flags);
4304
4305        return 0;
4306}
4307
4308static int wlcore_clear_bssid(struct wl1271 *wl, struct wl12xx_vif *wlvif)
4309{
4310        int ret;
4311
4312        /* revert back to minimum rates for the current band */
4313        wl1271_set_band_rate(wl, wlvif);
4314        wlvif->basic_rate = wl1271_tx_min_rate_get(wl, wlvif->basic_rate_set);
4315
4316        ret = wl1271_acx_sta_rate_policies(wl, wlvif);
4317        if (ret < 0)
4318                return ret;
4319
4320        if (wlvif->bss_type == BSS_TYPE_STA_BSS &&
4321            test_bit(WLVIF_FLAG_IN_USE, &wlvif->flags)) {
4322                ret = wl12xx_cmd_role_stop_sta(wl, wlvif);
4323                if (ret < 0)
4324                        return ret;
4325        }
4326
4327        clear_bit(WLVIF_FLAG_IN_USE, &wlvif->flags);
4328        return 0;
4329}
4330/* STA/IBSS mode changes */
4331static void wl1271_bss_info_changed_sta(struct wl1271 *wl,
4332                                        struct ieee80211_vif *vif,
4333                                        struct ieee80211_bss_conf *bss_conf,
4334                                        u32 changed)
4335{
4336        struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
4337        bool do_join = false;
4338        bool is_ibss = (wlvif->bss_type == BSS_TYPE_IBSS);
4339        bool ibss_joined = false;
4340        u32 sta_rate_set = 0;
4341        int ret;
4342        struct ieee80211_sta *sta;
4343        bool sta_exists = false;
4344        struct ieee80211_sta_ht_cap sta_ht_cap;
4345
4346        if (is_ibss) {
4347                ret = wl1271_bss_beacon_info_changed(wl, vif, bss_conf,
4348                                                     changed);
4349                if (ret < 0)
4350                        goto out;
4351        }
4352
4353        if (changed & BSS_CHANGED_IBSS) {
4354                if (bss_conf->ibss_joined) {
4355                        set_bit(WLVIF_FLAG_IBSS_JOINED, &wlvif->flags);
4356                        ibss_joined = true;
4357                } else {
4358                        wlcore_unset_assoc(wl, wlvif);
4359                        wl12xx_cmd_role_stop_sta(wl, wlvif);
4360                }
4361        }
4362
4363        if ((changed & BSS_CHANGED_BEACON_INT) && ibss_joined)
4364                do_join = true;
4365
4366        /* Need to update the SSID (for filtering etc) */
4367        if ((changed & BSS_CHANGED_BEACON) && ibss_joined)
4368                do_join = true;
4369
4370        if ((changed & BSS_CHANGED_BEACON_ENABLED) && ibss_joined) {
4371                wl1271_debug(DEBUG_ADHOC, "ad-hoc beaconing: %s",
4372                             bss_conf->enable_beacon ? "enabled" : "disabled");
4373
4374                do_join = true;
4375        }
4376
4377        if (changed & BSS_CHANGED_IDLE && !is_ibss)
4378                wl1271_sta_handle_idle(wl, wlvif, bss_conf->idle);
4379
4380        if (changed & BSS_CHANGED_CQM) {
4381                bool enable = false;
4382                if (bss_conf->cqm_rssi_thold)
4383                        enable = true;
4384                ret = wl1271_acx_rssi_snr_trigger(wl, wlvif, enable,
4385                                                  bss_conf->cqm_rssi_thold,
4386                                                  bss_conf->cqm_rssi_hyst);
4387                if (ret < 0)
4388                        goto out;
4389                wlvif->rssi_thold = bss_conf->cqm_rssi_thold;
4390        }
4391
4392        if (changed & (BSS_CHANGED_BSSID | BSS_CHANGED_HT |
4393                       BSS_CHANGED_ASSOC)) {
4394                rcu_read_lock();
4395                sta = ieee80211_find_sta(vif, bss_conf->bssid);
4396                if (sta) {
4397                        u8 *rx_mask = sta->deflink.ht_cap.mcs.rx_mask;
4398
4399                        /* save the supp_rates of the ap */
4400                        sta_rate_set = sta->deflink.supp_rates[wlvif->band];
4401                        if (sta->deflink.ht_cap.ht_supported)
4402                                sta_rate_set |=
4403                                        (rx_mask[0] << HW_HT_RATES_OFFSET) |
4404                                        (rx_mask[1] << HW_MIMO_RATES_OFFSET);
4405                        sta_ht_cap = sta->deflink.ht_cap;
4406                        sta_exists = true;
4407                }
4408
4409                rcu_read_unlock();
4410        }
4411
4412        if (changed & BSS_CHANGED_BSSID) {
4413                if (!is_zero_ether_addr(bss_conf->bssid)) {
4414                        ret = wlcore_set_bssid(wl, wlvif, bss_conf,
4415                                               sta_rate_set);
4416                        if (ret < 0)
4417                                goto out;
4418
4419                        /* Need to update the BSSID (for filtering etc) */
4420                        do_join = true;
4421                } else {
4422                        ret = wlcore_clear_bssid(wl, wlvif);
4423                        if (ret < 0)
4424                                goto out;
4425                }
4426        }
4427
4428        if (changed & BSS_CHANGED_IBSS) {
4429                wl1271_debug(DEBUG_ADHOC, "ibss_joined: %d",
4430                             bss_conf->ibss_joined);
4431
4432                if (bss_conf->ibss_joined) {
4433                        u32 rates = bss_conf->basic_rates;
4434                        wlvif->basic_rate_set =
4435                                wl1271_tx_enabled_rates_get(wl, rates,
4436                                                            wlvif->band);
4437                        wlvif->basic_rate =
4438                                wl1271_tx_min_rate_get(wl,
4439                                                       wlvif->basic_rate_set);
4440
4441                        /* by default, use 11b + OFDM rates */
4442                        wlvif->rate_set = CONF_TX_IBSS_DEFAULT_RATES;
4443                        ret = wl1271_acx_sta_rate_policies(wl, wlvif);
4444                        if (ret < 0)
4445                                goto out;
4446                }
4447        }
4448
4449        if ((changed & BSS_CHANGED_BEACON_INFO) && bss_conf->dtim_period) {
4450                /* enable beacon filtering */
4451                ret = wl1271_acx_beacon_filter_opt(wl, wlvif, true);
4452                if (ret < 0)
4453                        goto out;
4454        }
4455
4456        ret = wl1271_bss_erp_info_changed(wl, vif, bss_conf, changed);
4457        if (ret < 0)
4458                goto out;
4459
4460        if (do_join) {
4461                ret = wlcore_join(wl, wlvif);
4462                if (ret < 0) {
4463                        wl1271_warning("cmd join failed %d", ret);
4464                        goto out;
4465                }
4466        }
4467
4468        if (changed & BSS_CHANGED_ASSOC) {
4469                if (bss_conf->assoc) {
4470                        ret = wlcore_set_assoc(wl, wlvif, bss_conf,
4471                                               sta_rate_set);
4472                        if (ret < 0)
4473                                goto out;
4474
4475                        if (test_bit(WLVIF_FLAG_STA_AUTHORIZED, &wlvif->flags))
4476                                wl12xx_set_authorized(wl, wlvif);
4477                } else {
4478                        wlcore_unset_assoc(wl, wlvif);
4479                }
4480        }
4481
4482        if (changed & BSS_CHANGED_PS) {
4483                if ((bss_conf->ps) &&
4484                    test_bit(WLVIF_FLAG_STA_ASSOCIATED, &wlvif->flags) &&
4485                    !test_bit(WLVIF_FLAG_IN_PS, &wlvif->flags)) {
4486                        int ps_mode;
4487                        char *ps_mode_str;
4488
4489                        if (wl->conf.conn.forced_ps) {
4490                                ps_mode = STATION_POWER_SAVE_MODE;
4491                                ps_mode_str = "forced";
4492                        } else {
4493                                ps_mode = STATION_AUTO_PS_MODE;
4494                                ps_mode_str = "auto";
4495                        }
4496
4497                        wl1271_debug(DEBUG_PSM, "%s ps enabled", ps_mode_str);
4498
4499                        ret = wl1271_ps_set_mode(wl, wlvif, ps_mode);
4500                        if (ret < 0)
4501                                wl1271_warning("enter %s ps failed %d",
4502                                               ps_mode_str, ret);
4503                } else if (!bss_conf->ps &&
4504                           test_bit(WLVIF_FLAG_IN_PS, &wlvif->flags)) {
4505                        wl1271_debug(DEBUG_PSM, "auto ps disabled");
4506
4507                        ret = wl1271_ps_set_mode(wl, wlvif,
4508                                                 STATION_ACTIVE_MODE);
4509                        if (ret < 0)
4510                                wl1271_warning("exit auto ps failed %d", ret);
4511                }
4512        }
4513
4514        /* Handle new association with HT. Do this after join. */
4515        if (sta_exists) {
4516                bool enabled =
4517                        bss_conf->chandef.width != NL80211_CHAN_WIDTH_20_NOHT;
4518
4519                ret = wlcore_hw_set_peer_cap(wl,
4520                                             &sta_ht_cap,
4521                                             enabled,
4522                                             wlvif->rate_set,
4523                                             wlvif->sta.hlid);
4524                if (ret < 0) {
4525                        wl1271_warning("Set ht cap failed %d", ret);
4526                        goto out;
4527
4528                }
4529
4530                if (enabled) {
4531                        ret = wl1271_acx_set_ht_information(wl, wlvif,
4532                                                bss_conf->ht_operation_mode);
4533                        if (ret < 0) {
4534                                wl1271_warning("Set ht information failed %d",
4535                                               ret);
4536                                goto out;
4537                        }
4538                }
4539        }
4540
4541        /* Handle arp filtering. Done after join. */
4542        if ((changed & BSS_CHANGED_ARP_FILTER) ||
4543            (!is_ibss && (changed & BSS_CHANGED_QOS))) {
4544                __be32 addr = bss_conf->arp_addr_list[0];
4545                wlvif->sta.qos = bss_conf->qos;
4546                WARN_ON(wlvif->bss_type != BSS_TYPE_STA_BSS);
4547
4548                if (bss_conf->arp_addr_cnt == 1 && bss_conf->assoc) {
4549                        wlvif->ip_addr = addr;
4550                        /*
4551                         * The template should have been configured only upon
4552                         * association. however, it seems that the correct ip
4553                         * isn't being set (when sending), so we have to
4554                         * reconfigure the template upon every ip change.
4555                         */
4556                        ret = wl1271_cmd_build_arp_rsp(wl, wlvif);
4557                        if (ret < 0) {
4558                                wl1271_warning("build arp rsp failed: %d", ret);
4559                                goto out;
4560                        }
4561
4562                        ret = wl1271_acx_arp_ip_filter(wl, wlvif,
4563                                (ACX_ARP_FILTER_ARP_FILTERING |
4564                                 ACX_ARP_FILTER_AUTO_ARP),
4565                                addr);
4566                } else {
4567                        wlvif->ip_addr = 0;
4568                        ret = wl1271_acx_arp_ip_filter(wl, wlvif, 0, addr);
4569                }
4570
4571                if (ret < 0)
4572                        goto out;
4573        }
4574
4575out:
4576        return;
4577}
4578
4579static void wl1271_op_bss_info_changed(struct ieee80211_hw *hw,
4580                                       struct ieee80211_vif *vif,
4581                                       struct ieee80211_bss_conf *bss_conf,
4582                                       u32 changed)
4583{
4584        struct wl1271 *wl = hw->priv;
4585        struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
4586        bool is_ap = (wlvif->bss_type == BSS_TYPE_AP_BSS);
4587        int ret;
4588
4589        wl1271_debug(DEBUG_MAC80211, "mac80211 bss info role %d changed 0x%x",
4590                     wlvif->role_id, (int)changed);
4591
4592        /*
4593         * make sure to cancel pending disconnections if our association
4594         * state changed
4595         */
4596        if (!is_ap && (changed & BSS_CHANGED_ASSOC))
4597                cancel_delayed_work_sync(&wlvif->connection_loss_work);
4598
4599        if (is_ap && (changed & BSS_CHANGED_BEACON_ENABLED) &&
4600            !bss_conf->enable_beacon)
4601                wl1271_tx_flush(wl);
4602
4603        mutex_lock(&wl->mutex);
4604
4605        if (unlikely(wl->state != WLCORE_STATE_ON))
4606                goto out;
4607
4608        if (unlikely(!test_bit(WLVIF_FLAG_INITIALIZED, &wlvif->flags)))
4609                goto out;
4610
4611        ret = pm_runtime_resume_and_get(wl->dev);
4612        if (ret < 0)
4613                goto out;
4614
4615        if ((changed & BSS_CHANGED_TXPOWER) &&
4616            bss_conf->txpower != wlvif->power_level) {
4617
4618                ret = wl1271_acx_tx_power(wl, wlvif, bss_conf->txpower);
4619                if (ret < 0)
4620                        goto out;
4621
4622                wlvif->power_level = bss_conf->txpower;
4623        }
4624
4625        if (is_ap)
4626                wl1271_bss_info_changed_ap(wl, vif, bss_conf, changed);
4627        else
4628                wl1271_bss_info_changed_sta(wl, vif, bss_conf, changed);
4629
4630        pm_runtime_mark_last_busy(wl->dev);
4631        pm_runtime_put_autosuspend(wl->dev);
4632
4633out:
4634        mutex_unlock(&wl->mutex);
4635}
4636
4637static int wlcore_op_add_chanctx(struct ieee80211_hw *hw,
4638                                 struct ieee80211_chanctx_conf *ctx)
4639{
4640        wl1271_debug(DEBUG_MAC80211, "mac80211 add chanctx %d (type %d)",
4641                     ieee80211_frequency_to_channel(ctx->def.chan->center_freq),
4642                     cfg80211_get_chandef_type(&ctx->def));
4643        return 0;
4644}
4645
4646static void wlcore_op_remove_chanctx(struct ieee80211_hw *hw,
4647                                     struct ieee80211_chanctx_conf *ctx)
4648{
4649        wl1271_debug(DEBUG_MAC80211, "mac80211 remove chanctx %d (type %d)",
4650                     ieee80211_frequency_to_channel(ctx->def.chan->center_freq),
4651                     cfg80211_get_chandef_type(&ctx->def));
4652}
4653
4654static void wlcore_op_change_chanctx(struct ieee80211_hw *hw,
4655                                     struct ieee80211_chanctx_conf *ctx,
4656                                     u32 changed)
4657{
4658        struct wl1271 *wl = hw->priv;
4659        struct wl12xx_vif *wlvif;
4660        int ret;
4661        int channel = ieee80211_frequency_to_channel(
4662                ctx->def.chan->center_freq);
4663
4664        wl1271_debug(DEBUG_MAC80211,
4665                     "mac80211 change chanctx %d (type %d) changed 0x%x",
4666                     channel, cfg80211_get_chandef_type(&ctx->def), changed);
4667
4668        mutex_lock(&wl->mutex);
4669
4670        ret = pm_runtime_resume_and_get(wl->dev);
4671        if (ret < 0)
4672                goto out;
4673
4674        wl12xx_for_each_wlvif(wl, wlvif) {
4675                struct ieee80211_vif *vif = wl12xx_wlvif_to_vif(wlvif);
4676
4677                rcu_read_lock();
4678                if (rcu_access_pointer(vif->chanctx_conf) != ctx) {
4679                        rcu_read_unlock();
4680                        continue;
4681                }
4682                rcu_read_unlock();
4683
4684                /* start radar if needed */
4685                if (changed & IEEE80211_CHANCTX_CHANGE_RADAR &&
4686                    wlvif->bss_type == BSS_TYPE_AP_BSS &&
4687                    ctx->radar_enabled && !wlvif->radar_enabled &&
4688                    ctx->def.chan->dfs_state == NL80211_DFS_USABLE) {
4689                        wl1271_debug(DEBUG_MAC80211, "Start radar detection");
4690                        wlcore_hw_set_cac(wl, wlvif, true);
4691                        wlvif->radar_enabled = true;
4692                }
4693        }
4694
4695        pm_runtime_mark_last_busy(wl->dev);
4696        pm_runtime_put_autosuspend(wl->dev);
4697out:
4698        mutex_unlock(&wl->mutex);
4699}
4700
4701static int wlcore_op_assign_vif_chanctx(struct ieee80211_hw *hw,
4702                                        struct ieee80211_vif *vif,
4703                                        struct ieee80211_chanctx_conf *ctx)
4704{
4705        struct wl1271 *wl = hw->priv;
4706        struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
4707        int channel = ieee80211_frequency_to_channel(
4708                ctx->def.chan->center_freq);
4709        int ret = -EINVAL;
4710
4711        wl1271_debug(DEBUG_MAC80211,
4712                     "mac80211 assign chanctx (role %d) %d (type %d) (radar %d dfs_state %d)",
4713                     wlvif->role_id, channel,
4714                     cfg80211_get_chandef_type(&ctx->def),
4715                     ctx->radar_enabled, ctx->def.chan->dfs_state);
4716
4717        mutex_lock(&wl->mutex);
4718
4719        if (unlikely(wl->state != WLCORE_STATE_ON))
4720                goto out;
4721
4722        if (unlikely(!test_bit(WLVIF_FLAG_INITIALIZED, &wlvif->flags)))
4723                goto out;
4724
4725        ret = pm_runtime_resume_and_get(wl->dev);
4726        if (ret < 0)
4727                goto out;
4728
4729        wlvif->band = ctx->def.chan->band;
4730        wlvif->channel = channel;
4731        wlvif->channel_type = cfg80211_get_chandef_type(&ctx->def);
4732
4733        /* update default rates according to the band */
4734        wl1271_set_band_rate(wl, wlvif);
4735
4736        if (ctx->radar_enabled &&
4737            ctx->def.chan->dfs_state == NL80211_DFS_USABLE) {
4738                wl1271_debug(DEBUG_MAC80211, "Start radar detection");
4739                wlcore_hw_set_cac(wl, wlvif, true);
4740                wlvif->radar_enabled = true;
4741        }
4742
4743        pm_runtime_mark_last_busy(wl->dev);
4744        pm_runtime_put_autosuspend(wl->dev);
4745out:
4746        mutex_unlock(&wl->mutex);
4747
4748        return 0;
4749}
4750
4751static void wlcore_op_unassign_vif_chanctx(struct ieee80211_hw *hw,
4752                                           struct ieee80211_vif *vif,
4753                                           struct ieee80211_chanctx_conf *ctx)
4754{
4755        struct wl1271 *wl = hw->priv;
4756        struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
4757        int ret;
4758
4759        wl1271_debug(DEBUG_MAC80211,
4760                     "mac80211 unassign chanctx (role %d) %d (type %d)",
4761                     wlvif->role_id,
4762                     ieee80211_frequency_to_channel(ctx->def.chan->center_freq),
4763                     cfg80211_get_chandef_type(&ctx->def));
4764
4765        wl1271_tx_flush(wl);
4766
4767        mutex_lock(&wl->mutex);
4768
4769        if (unlikely(wl->state != WLCORE_STATE_ON))
4770                goto out;
4771
4772        if (unlikely(!test_bit(WLVIF_FLAG_INITIALIZED, &wlvif->flags)))
4773                goto out;
4774
4775        ret = pm_runtime_resume_and_get(wl->dev);
4776        if (ret < 0)
4777                goto out;
4778
4779        if (wlvif->radar_enabled) {
4780                wl1271_debug(DEBUG_MAC80211, "Stop radar detection");
4781                wlcore_hw_set_cac(wl, wlvif, false);
4782                wlvif->radar_enabled = false;
4783        }
4784
4785        pm_runtime_mark_last_busy(wl->dev);
4786        pm_runtime_put_autosuspend(wl->dev);
4787out:
4788        mutex_unlock(&wl->mutex);
4789}
4790
4791static int __wlcore_switch_vif_chan(struct wl1271 *wl,
4792                                    struct wl12xx_vif *wlvif,
4793                                    struct ieee80211_chanctx_conf *new_ctx)
4794{
4795        int channel = ieee80211_frequency_to_channel(
4796                new_ctx->def.chan->center_freq);
4797
4798        wl1271_debug(DEBUG_MAC80211,
4799                     "switch vif (role %d) %d -> %d chan_type: %d",
4800                     wlvif->role_id, wlvif->channel, channel,
4801                     cfg80211_get_chandef_type(&new_ctx->def));
4802
4803        if (WARN_ON_ONCE(wlvif->bss_type != BSS_TYPE_AP_BSS))
4804                return 0;
4805
4806        WARN_ON(!test_bit(WLVIF_FLAG_BEACON_DISABLED, &wlvif->flags));
4807
4808        if (wlvif->radar_enabled) {
4809                wl1271_debug(DEBUG_MAC80211, "Stop radar detection");
4810                wlcore_hw_set_cac(wl, wlvif, false);
4811                wlvif->radar_enabled = false;
4812        }
4813
4814        wlvif->band = new_ctx->def.chan->band;
4815        wlvif->channel = channel;
4816        wlvif->channel_type = cfg80211_get_chandef_type(&new_ctx->def);
4817
4818        /* start radar if needed */
4819        if (new_ctx->radar_enabled) {
4820                wl1271_debug(DEBUG_MAC80211, "Start radar detection");
4821                wlcore_hw_set_cac(wl, wlvif, true);
4822                wlvif->radar_enabled = true;
4823        }
4824
4825        return 0;
4826}
4827
4828static int
4829wlcore_op_switch_vif_chanctx(struct ieee80211_hw *hw,
4830                             struct ieee80211_vif_chanctx_switch *vifs,
4831                             int n_vifs,
4832                             enum ieee80211_chanctx_switch_mode mode)
4833{
4834        struct wl1271 *wl = hw->priv;
4835        int i, ret;
4836
4837        wl1271_debug(DEBUG_MAC80211,
4838                     "mac80211 switch chanctx n_vifs %d mode %d",
4839                     n_vifs, mode);
4840
4841        mutex_lock(&wl->mutex);
4842
4843        ret = pm_runtime_resume_and_get(wl->dev);
4844        if (ret < 0)
4845                goto out;
4846
4847        for (i = 0; i < n_vifs; i++) {
4848                struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vifs[i].vif);
4849
4850                ret = __wlcore_switch_vif_chan(wl, wlvif, vifs[i].new_ctx);
4851                if (ret)
4852                        goto out_sleep;
4853        }
4854out_sleep:
4855        pm_runtime_mark_last_busy(wl->dev);
4856        pm_runtime_put_autosuspend(wl->dev);
4857out:
4858        mutex_unlock(&wl->mutex);
4859
4860        return 0;
4861}
4862
4863static int wl1271_op_conf_tx(struct ieee80211_hw *hw,
4864                             struct ieee80211_vif *vif, u16 queue,
4865                             const struct ieee80211_tx_queue_params *params)
4866{
4867        struct wl1271 *wl = hw->priv;
4868        struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
4869        u8 ps_scheme;
4870        int ret = 0;
4871
4872        if (wlcore_is_p2p_mgmt(wlvif))
4873                return 0;
4874
4875        mutex_lock(&wl->mutex);
4876
4877        wl1271_debug(DEBUG_MAC80211, "mac80211 conf tx %d", queue);
4878
4879        if (params->uapsd)
4880                ps_scheme = CONF_PS_SCHEME_UPSD_TRIGGER;
4881        else
4882                ps_scheme = CONF_PS_SCHEME_LEGACY;
4883
4884        if (!test_bit(WLVIF_FLAG_INITIALIZED, &wlvif->flags))
4885                goto out;
4886
4887        ret = pm_runtime_resume_and_get(wl->dev);
4888        if (ret < 0)
4889                goto out;
4890
4891        /*
4892         * the txop is confed in units of 32us by the mac80211,
4893         * we need us
4894         */
4895        ret = wl1271_acx_ac_cfg(wl, wlvif, wl1271_tx_get_queue(queue),
4896                                params->cw_min, params->cw_max,
4897                                params->aifs, params->txop << 5);
4898        if (ret < 0)
4899                goto out_sleep;
4900
4901        ret = wl1271_acx_tid_cfg(wl, wlvif, wl1271_tx_get_queue(queue),
4902                                 CONF_CHANNEL_TYPE_EDCF,
4903                                 wl1271_tx_get_queue(queue),
4904                                 ps_scheme, CONF_ACK_POLICY_LEGACY,
4905                                 0, 0);
4906
4907out_sleep:
4908        pm_runtime_mark_last_busy(wl->dev);
4909        pm_runtime_put_autosuspend(wl->dev);
4910
4911out:
4912        mutex_unlock(&wl->mutex);
4913
4914        return ret;
4915}
4916
4917static u64 wl1271_op_get_tsf(struct ieee80211_hw *hw,
4918                             struct ieee80211_vif *vif)
4919{
4920
4921        struct wl1271 *wl = hw->priv;
4922        struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
4923        u64 mactime = ULLONG_MAX;
4924        int ret;
4925
4926        wl1271_debug(DEBUG_MAC80211, "mac80211 get tsf");
4927
4928        mutex_lock(&wl->mutex);
4929
4930        if (unlikely(wl->state != WLCORE_STATE_ON))
4931                goto out;
4932
4933        ret = pm_runtime_resume_and_get(wl->dev);
4934        if (ret < 0)
4935                goto out;
4936
4937        ret = wl12xx_acx_tsf_info(wl, wlvif, &mactime);
4938        if (ret < 0)
4939                goto out_sleep;
4940
4941out_sleep:
4942        pm_runtime_mark_last_busy(wl->dev);
4943        pm_runtime_put_autosuspend(wl->dev);
4944
4945out:
4946        mutex_unlock(&wl->mutex);
4947        return mactime;
4948}
4949
4950static int wl1271_op_get_survey(struct ieee80211_hw *hw, int idx,
4951                                struct survey_info *survey)
4952{
4953        struct ieee80211_conf *conf = &hw->conf;
4954
4955        if (idx != 0)
4956                return -ENOENT;
4957
4958        survey->channel = conf->chandef.chan;
4959        survey->filled = 0;
4960        return 0;
4961}
4962
4963static int wl1271_allocate_sta(struct wl1271 *wl,
4964                             struct wl12xx_vif *wlvif,
4965                             struct ieee80211_sta *sta)
4966{
4967        struct wl1271_station *wl_sta;
4968        int ret;
4969
4970
4971        if (wl->active_sta_count >= wl->max_ap_stations) {
4972                wl1271_warning("could not allocate HLID - too much stations");
4973                return -EBUSY;
4974        }
4975
4976        wl_sta = (struct wl1271_station *)sta->drv_priv;
4977        ret = wl12xx_allocate_link(wl, wlvif, &wl_sta->hlid);
4978        if (ret < 0) {
4979                wl1271_warning("could not allocate HLID - too many links");
4980                return -EBUSY;
4981        }
4982
4983        /* use the previous security seq, if this is a recovery/resume */
4984        wl->links[wl_sta->hlid].total_freed_pkts = wl_sta->total_freed_pkts;
4985
4986        set_bit(wl_sta->hlid, wlvif->ap.sta_hlid_map);
4987        memcpy(wl->links[wl_sta->hlid].addr, sta->addr, ETH_ALEN);
4988        wl->active_sta_count++;
4989        return 0;
4990}
4991
4992void wl1271_free_sta(struct wl1271 *wl, struct wl12xx_vif *wlvif, u8 hlid)
4993{
4994        if (!test_bit(hlid, wlvif->ap.sta_hlid_map))
4995                return;
4996
4997        clear_bit(hlid, wlvif->ap.sta_hlid_map);
4998        __clear_bit(hlid, &wl->ap_ps_map);
4999        __clear_bit(hlid, &wl->ap_fw_ps_map);
5000
5001        /*
5002         * save the last used PN in the private part of iee80211_sta,
5003         * in case of recovery/suspend
5004         */
5005        wlcore_save_freed_pkts_addr(wl, wlvif, hlid, wl->links[hlid].addr);
5006
5007        wl12xx_free_link(wl, wlvif, &hlid);
5008        wl->active_sta_count--;
5009
5010        /*
5011         * rearm the tx watchdog when the last STA is freed - give the FW a
5012         * chance to return STA-buffered packets before complaining.
5013         */
5014        if (wl->active_sta_count == 0)
5015                wl12xx_rearm_tx_watchdog_locked(wl);
5016}
5017
5018static int wl12xx_sta_add(struct wl1271 *wl,
5019                          struct wl12xx_vif *wlvif,
5020                          struct ieee80211_sta *sta)
5021{
5022        struct wl1271_station *wl_sta;
5023        int ret = 0;
5024        u8 hlid;
5025
5026        wl1271_debug(DEBUG_MAC80211, "mac80211 add sta %d", (int)sta->aid);
5027
5028        ret = wl1271_allocate_sta(wl, wlvif, sta);
5029        if (ret < 0)
5030                return ret;
5031
5032        wl_sta = (struct wl1271_station *)sta->drv_priv;
5033        hlid = wl_sta->hlid;
5034
5035        ret = wl12xx_cmd_add_peer(wl, wlvif, sta, hlid);
5036        if (ret < 0)
5037                wl1271_free_sta(wl, wlvif, hlid);
5038
5039        return ret;
5040}
5041
5042static int wl12xx_sta_remove(struct wl1271 *wl,
5043                             struct wl12xx_vif *wlvif,
5044                             struct ieee80211_sta *sta)
5045{
5046        struct wl1271_station *wl_sta;
5047        int ret = 0, id;
5048
5049        wl1271_debug(DEBUG_MAC80211, "mac80211 remove sta %d", (int)sta->aid);
5050
5051        wl_sta = (struct wl1271_station *)sta->drv_priv;
5052        id = wl_sta->hlid;
5053        if (WARN_ON(!test_bit(id, wlvif->ap.sta_hlid_map)))
5054                return -EINVAL;
5055
5056        ret = wl12xx_cmd_remove_peer(wl, wlvif, wl_sta->hlid);
5057        if (ret < 0)
5058                return ret;
5059
5060        wl1271_free_sta(wl, wlvif, wl_sta->hlid);
5061        return ret;
5062}
5063
5064static void wlcore_roc_if_possible(struct wl1271 *wl,
5065                                   struct wl12xx_vif *wlvif)
5066{
5067        if (find_first_bit(wl->roc_map,
5068                           WL12XX_MAX_ROLES) < WL12XX_MAX_ROLES)
5069                return;
5070
5071        if (WARN_ON(wlvif->role_id == WL12XX_INVALID_ROLE_ID))
5072                return;
5073
5074        wl12xx_roc(wl, wlvif, wlvif->role_id, wlvif->band, wlvif->channel);
5075}
5076
5077/*
5078 * when wl_sta is NULL, we treat this call as if coming from a
5079 * pending auth reply.
5080 * wl->mutex must be taken and the FW must be awake when the call
5081 * takes place.
5082 */
5083void wlcore_update_inconn_sta(struct wl1271 *wl, struct wl12xx_vif *wlvif,
5084                              struct wl1271_station *wl_sta, bool in_conn)
5085{
5086        if (in_conn) {
5087                if (WARN_ON(wl_sta && wl_sta->in_connection))
5088                        return;
5089
5090                if (!wlvif->ap_pending_auth_reply &&
5091                    !wlvif->inconn_count)
5092                        wlcore_roc_if_possible(wl, wlvif);
5093
5094                if (wl_sta) {
5095                        wl_sta->in_connection = true;
5096                        wlvif->inconn_count++;
5097                } else {
5098                        wlvif->ap_pending_auth_reply = true;
5099                }
5100        } else {
5101                if (wl_sta && !wl_sta->in_connection)
5102                        return;
5103
5104                if (WARN_ON(!wl_sta && !wlvif->ap_pending_auth_reply))
5105                        return;
5106
5107                if (WARN_ON(wl_sta && !wlvif->inconn_count))
5108                        return;
5109
5110                if (wl_sta) {
5111                        wl_sta->in_connection = false;
5112                        wlvif->inconn_count--;
5113                } else {
5114                        wlvif->ap_pending_auth_reply = false;
5115                }
5116
5117                if (!wlvif->inconn_count && !wlvif->ap_pending_auth_reply &&
5118                    test_bit(wlvif->role_id, wl->roc_map))
5119                        wl12xx_croc(wl, wlvif->role_id);
5120        }
5121}
5122
5123static int wl12xx_update_sta_state(struct wl1271 *wl,
5124                                   struct wl12xx_vif *wlvif,
5125                                   struct ieee80211_sta *sta,
5126                                   enum ieee80211_sta_state old_state,
5127                                   enum ieee80211_sta_state new_state)
5128{
5129        struct wl1271_station *wl_sta;
5130        bool is_ap = wlvif->bss_type == BSS_TYPE_AP_BSS;
5131        bool is_sta = wlvif->bss_type == BSS_TYPE_STA_BSS;
5132        int ret;
5133
5134        wl_sta = (struct wl1271_station *)sta->drv_priv;
5135
5136        /* Add station (AP mode) */
5137        if (is_ap &&
5138            old_state == IEEE80211_STA_NOTEXIST &&
5139            new_state == IEEE80211_STA_NONE) {
5140                ret = wl12xx_sta_add(wl, wlvif, sta);
5141                if (ret)
5142                        return ret;
5143
5144                wlcore_update_inconn_sta(wl, wlvif, wl_sta, true);
5145        }
5146
5147        /* Remove station (AP mode) */
5148        if (is_ap &&
5149            old_state == IEEE80211_STA_NONE &&
5150            new_state == IEEE80211_STA_NOTEXIST) {
5151                /* must not fail */
5152                wl12xx_sta_remove(wl, wlvif, sta);
5153
5154                wlcore_update_inconn_sta(wl, wlvif, wl_sta, false);
5155        }
5156
5157        /* Authorize station (AP mode) */
5158        if (is_ap &&
5159            new_state == IEEE80211_STA_AUTHORIZED) {
5160                ret = wl12xx_cmd_set_peer_state(wl, wlvif, wl_sta->hlid);
5161                if (ret < 0)
5162                        return ret;
5163
5164                /* reconfigure rates */
5165                ret = wl12xx_cmd_add_peer(wl, wlvif, sta, wl_sta->hlid);
5166                if (ret < 0)
5167                        return ret;
5168
5169                ret = wl1271_acx_set_ht_capabilities(wl, &sta->deflink.ht_cap,
5170                                                     true,
5171                                                     wl_sta->hlid);
5172                if (ret)
5173                        return ret;
5174
5175                wlcore_update_inconn_sta(wl, wlvif, wl_sta, false);
5176        }
5177
5178        /* Authorize station */
5179        if (is_sta &&
5180            new_state == IEEE80211_STA_AUTHORIZED) {
5181                set_bit(WLVIF_FLAG_STA_AUTHORIZED, &wlvif->flags);
5182                ret = wl12xx_set_authorized(wl, wlvif);
5183                if (ret)
5184                        return ret;
5185        }
5186
5187        if (is_sta &&
5188            old_state == IEEE80211_STA_AUTHORIZED &&
5189            new_state == IEEE80211_STA_ASSOC) {
5190                clear_bit(WLVIF_FLAG_STA_AUTHORIZED, &wlvif->flags);
5191                clear_bit(WLVIF_FLAG_STA_STATE_SENT, &wlvif->flags);
5192        }
5193
5194        /* save seq number on disassoc (suspend) */
5195        if (is_sta &&
5196            old_state == IEEE80211_STA_ASSOC &&
5197            new_state == IEEE80211_STA_AUTH) {
5198                wlcore_save_freed_pkts(wl, wlvif, wlvif->sta.hlid, sta);
5199                wlvif->total_freed_pkts = 0;
5200        }
5201
5202        /* restore seq number on assoc (resume) */
5203        if (is_sta &&
5204            old_state == IEEE80211_STA_AUTH &&
5205            new_state == IEEE80211_STA_ASSOC) {
5206                wlvif->total_freed_pkts = wl_sta->total_freed_pkts;
5207        }
5208
5209        /* clear ROCs on failure or authorization */
5210        if (is_sta &&
5211            (new_state == IEEE80211_STA_AUTHORIZED ||
5212             new_state == IEEE80211_STA_NOTEXIST)) {
5213                if (test_bit(wlvif->role_id, wl->roc_map))
5214                        wl12xx_croc(wl, wlvif->role_id);
5215        }
5216
5217        if (is_sta &&
5218            old_state == IEEE80211_STA_NOTEXIST &&
5219            new_state == IEEE80211_STA_NONE) {
5220                if (find_first_bit(wl->roc_map,
5221                                   WL12XX_MAX_ROLES) >= WL12XX_MAX_ROLES) {
5222                        WARN_ON(wlvif->role_id == WL12XX_INVALID_ROLE_ID);
5223                        wl12xx_roc(wl, wlvif, wlvif->role_id,
5224                                   wlvif->band, wlvif->channel);
5225                }
5226        }
5227        return 0;
5228}
5229
5230static int wl12xx_op_sta_state(struct ieee80211_hw *hw,
5231                               struct ieee80211_vif *vif,
5232                               struct ieee80211_sta *sta,
5233                               enum ieee80211_sta_state old_state,
5234                               enum ieee80211_sta_state new_state)
5235{
5236        struct wl1271 *wl = hw->priv;
5237        struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
5238        int ret;
5239
5240        wl1271_debug(DEBUG_MAC80211, "mac80211 sta %d state=%d->%d",
5241                     sta->aid, old_state, new_state);
5242
5243        mutex_lock(&wl->mutex);
5244
5245        if (unlikely(wl->state != WLCORE_STATE_ON)) {
5246                ret = -EBUSY;
5247                goto out;
5248        }
5249
5250        ret = pm_runtime_resume_and_get(wl->dev);
5251        if (ret < 0)
5252                goto out;
5253
5254        ret = wl12xx_update_sta_state(wl, wlvif, sta, old_state, new_state);
5255
5256        pm_runtime_mark_last_busy(wl->dev);
5257        pm_runtime_put_autosuspend(wl->dev);
5258out:
5259        mutex_unlock(&wl->mutex);
5260        if (new_state < old_state)
5261                return 0;
5262        return ret;
5263}
5264
5265static int wl1271_op_ampdu_action(struct ieee80211_hw *hw,
5266                                  struct ieee80211_vif *vif,
5267                                  struct ieee80211_ampdu_params *params)
5268{
5269        struct wl1271 *wl = hw->priv;
5270        struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
5271        int ret;
5272        u8 hlid, *ba_bitmap;
5273        struct ieee80211_sta *sta = params->sta;
5274        enum ieee80211_ampdu_mlme_action action = params->action;
5275        u16 tid = params->tid;
5276        u16 *ssn = &params->ssn;
5277
5278        wl1271_debug(DEBUG_MAC80211, "mac80211 ampdu action %d tid %d", action,
5279                     tid);
5280
5281        /* sanity check - the fields in FW are only 8bits wide */
5282        if (WARN_ON(tid > 0xFF))
5283                return -ENOTSUPP;
5284
5285        mutex_lock(&wl->mutex);
5286
5287        if (unlikely(wl->state != WLCORE_STATE_ON)) {
5288                ret = -EAGAIN;
5289                goto out;
5290        }
5291
5292        if (wlvif->bss_type == BSS_TYPE_STA_BSS) {
5293                hlid = wlvif->sta.hlid;
5294        } else if (wlvif->bss_type == BSS_TYPE_AP_BSS) {
5295                struct wl1271_station *wl_sta;
5296
5297                wl_sta = (struct wl1271_station *)sta->drv_priv;
5298                hlid = wl_sta->hlid;
5299        } else {
5300                ret = -EINVAL;
5301                goto out;
5302        }
5303
5304        ba_bitmap = &wl->links[hlid].ba_bitmap;
5305
5306        ret = pm_runtime_resume_and_get(wl->dev);
5307        if (ret < 0)
5308                goto out;
5309
5310        wl1271_debug(DEBUG_MAC80211, "mac80211 ampdu: Rx tid %d action %d",
5311                     tid, action);
5312
5313        switch (action) {
5314        case IEEE80211_AMPDU_RX_START:
5315                if (!wlvif->ba_support || !wlvif->ba_allowed) {
5316                        ret = -ENOTSUPP;
5317                        break;
5318                }
5319
5320                if (wl->ba_rx_session_count >= wl->ba_rx_session_count_max) {
5321                        ret = -EBUSY;
5322                        wl1271_debug(DEBUG_RX, "exceeded max RX BA sessions");
5323                        break;
5324                }
5325
5326                if (*ba_bitmap & BIT(tid)) {
5327                        ret = -EINVAL;
5328                        wl1271_error("cannot enable RX BA session on active "
5329                                     "tid: %d", tid);
5330                        break;
5331                }
5332
5333                ret = wl12xx_acx_set_ba_receiver_session(wl, tid, *ssn, true,
5334                                hlid,
5335                                params->buf_size);
5336
5337                if (!ret) {
5338                        *ba_bitmap |= BIT(tid);
5339                        wl->ba_rx_session_count++;
5340                }
5341                break;
5342
5343        case IEEE80211_AMPDU_RX_STOP:
5344                if (!(*ba_bitmap & BIT(tid))) {
5345                        /*
5346                         * this happens on reconfig - so only output a debug
5347                         * message for now, and don't fail the function.
5348                         */
5349                        wl1271_debug(DEBUG_MAC80211,
5350                                     "no active RX BA session on tid: %d",
5351                                     tid);
5352                        ret = 0;
5353                        break;
5354                }
5355
5356                ret = wl12xx_acx_set_ba_receiver_session(wl, tid, 0, false,
5357                                                         hlid, 0);
5358                if (!ret) {
5359                        *ba_bitmap &= ~BIT(tid);
5360                        wl->ba_rx_session_count--;
5361                }
5362                break;
5363
5364        /*
5365         * The BA initiator session management in FW independently.
5366         * Falling break here on purpose for all TX APDU commands.
5367         */
5368        case IEEE80211_AMPDU_TX_START:
5369        case IEEE80211_AMPDU_TX_STOP_CONT:
5370        case IEEE80211_AMPDU_TX_STOP_FLUSH:
5371        case IEEE80211_AMPDU_TX_STOP_FLUSH_CONT:
5372        case IEEE80211_AMPDU_TX_OPERATIONAL:
5373                ret = -EINVAL;
5374                break;
5375
5376        default:
5377                wl1271_error("Incorrect ampdu action id=%x\n", action);
5378                ret = -EINVAL;
5379        }
5380
5381        pm_runtime_mark_last_busy(wl->dev);
5382        pm_runtime_put_autosuspend(wl->dev);
5383
5384out:
5385        mutex_unlock(&wl->mutex);
5386
5387        return ret;
5388}
5389
5390static int wl12xx_set_bitrate_mask(struct ieee80211_hw *hw,
5391                                   struct ieee80211_vif *vif,
5392                                   const struct cfg80211_bitrate_mask *mask)
5393{
5394        struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
5395        struct wl1271 *wl = hw->priv;
5396        int i, ret = 0;
5397
5398        wl1271_debug(DEBUG_MAC80211, "mac80211 set_bitrate_mask 0x%x 0x%x",
5399                mask->control[NL80211_BAND_2GHZ].legacy,
5400                mask->control[NL80211_BAND_5GHZ].legacy);
5401
5402        mutex_lock(&wl->mutex);
5403
5404        for (i = 0; i < WLCORE_NUM_BANDS; i++)
5405                wlvif->bitrate_masks[i] =
5406                        wl1271_tx_enabled_rates_get(wl,
5407                                                    mask->control[i].legacy,
5408                                                    i);
5409
5410        if (unlikely(wl->state != WLCORE_STATE_ON))
5411                goto out;
5412
5413        if (wlvif->bss_type == BSS_TYPE_STA_BSS &&
5414            !test_bit(WLVIF_FLAG_STA_ASSOCIATED, &wlvif->flags)) {
5415
5416                ret = pm_runtime_resume_and_get(wl->dev);
5417                if (ret < 0)
5418                        goto out;
5419
5420                wl1271_set_band_rate(wl, wlvif);
5421                wlvif->basic_rate =
5422                        wl1271_tx_min_rate_get(wl, wlvif->basic_rate_set);
5423                ret = wl1271_acx_sta_rate_policies(wl, wlvif);
5424
5425                pm_runtime_mark_last_busy(wl->dev);
5426                pm_runtime_put_autosuspend(wl->dev);
5427        }
5428out:
5429        mutex_unlock(&wl->mutex);
5430
5431        return ret;
5432}
5433
5434static void wl12xx_op_channel_switch(struct ieee80211_hw *hw,
5435                                     struct ieee80211_vif *vif,
5436                                     struct ieee80211_channel_switch *ch_switch)
5437{
5438        struct wl1271 *wl = hw->priv;
5439        struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
5440        int ret;
5441
5442        wl1271_debug(DEBUG_MAC80211, "mac80211 channel switch");
5443
5444        wl1271_tx_flush(wl);
5445
5446        mutex_lock(&wl->mutex);
5447
5448        if (unlikely(wl->state == WLCORE_STATE_OFF)) {
5449                if (test_bit(WLVIF_FLAG_STA_ASSOCIATED, &wlvif->flags))
5450                        ieee80211_chswitch_done(vif, false);
5451                goto out;
5452        } else if (unlikely(wl->state != WLCORE_STATE_ON)) {
5453                goto out;
5454        }
5455
5456        ret = pm_runtime_resume_and_get(wl->dev);
5457        if (ret < 0)
5458                goto out;
5459
5460        /* TODO: change mac80211 to pass vif as param */
5461
5462        if (test_bit(WLVIF_FLAG_STA_ASSOCIATED, &wlvif->flags)) {
5463                unsigned long delay_usec;
5464
5465                ret = wl->ops->channel_switch(wl, wlvif, ch_switch);
5466                if (ret)
5467                        goto out_sleep;
5468
5469                set_bit(WLVIF_FLAG_CS_PROGRESS, &wlvif->flags);
5470
5471                /* indicate failure 5 seconds after channel switch time */
5472                delay_usec = ieee80211_tu_to_usec(wlvif->beacon_int) *
5473                        ch_switch->count;
5474                ieee80211_queue_delayed_work(hw, &wlvif->channel_switch_work,
5475                                             usecs_to_jiffies(delay_usec) +
5476                                             msecs_to_jiffies(5000));
5477        }
5478
5479out_sleep:
5480        pm_runtime_mark_last_busy(wl->dev);
5481        pm_runtime_put_autosuspend(wl->dev);
5482
5483out:
5484        mutex_unlock(&wl->mutex);
5485}
5486
5487static const void *wlcore_get_beacon_ie(struct wl1271 *wl,
5488                                        struct wl12xx_vif *wlvif,
5489                                        u8 eid)
5490{
5491        int ieoffset = offsetof(struct ieee80211_mgmt, u.beacon.variable);
5492        struct sk_buff *beacon =
5493                ieee80211_beacon_get(wl->hw, wl12xx_wlvif_to_vif(wlvif));
5494
5495        if (!beacon)
5496                return NULL;
5497
5498        return cfg80211_find_ie(eid,
5499                                beacon->data + ieoffset,
5500                                beacon->len - ieoffset);
5501}
5502
5503static int wlcore_get_csa_count(struct wl1271 *wl, struct wl12xx_vif *wlvif,
5504                                u8 *csa_count)
5505{
5506        const u8 *ie;
5507        const struct ieee80211_channel_sw_ie *ie_csa;
5508
5509        ie = wlcore_get_beacon_ie(wl, wlvif, WLAN_EID_CHANNEL_SWITCH);
5510        if (!ie)
5511                return -EINVAL;
5512
5513        ie_csa = (struct ieee80211_channel_sw_ie *)&ie[2];
5514        *csa_count = ie_csa->count;
5515
5516        return 0;
5517}
5518
5519static void wlcore_op_channel_switch_beacon(struct ieee80211_hw *hw,
5520                                            struct ieee80211_vif *vif,
5521                                            struct cfg80211_chan_def *chandef)
5522{
5523        struct wl1271 *wl = hw->priv;
5524        struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
5525        struct ieee80211_channel_switch ch_switch = {
5526                .block_tx = true,
5527                .chandef = *chandef,
5528        };
5529        int ret;
5530
5531        wl1271_debug(DEBUG_MAC80211,
5532                     "mac80211 channel switch beacon (role %d)",
5533                     wlvif->role_id);
5534
5535        ret = wlcore_get_csa_count(wl, wlvif, &ch_switch.count);
5536        if (ret < 0) {
5537                wl1271_error("error getting beacon (for CSA counter)");
5538                return;
5539        }
5540
5541        mutex_lock(&wl->mutex);
5542
5543        if (unlikely(wl->state != WLCORE_STATE_ON)) {
5544                ret = -EBUSY;
5545                goto out;
5546        }
5547
5548        ret = pm_runtime_resume_and_get(wl->dev);
5549        if (ret < 0)
5550                goto out;
5551
5552        ret = wl->ops->channel_switch(wl, wlvif, &ch_switch);
5553        if (ret)
5554                goto out_sleep;
5555
5556        set_bit(WLVIF_FLAG_CS_PROGRESS, &wlvif->flags);
5557
5558out_sleep:
5559        pm_runtime_mark_last_busy(wl->dev);
5560        pm_runtime_put_autosuspend(wl->dev);
5561out:
5562        mutex_unlock(&wl->mutex);
5563}
5564
5565static void wlcore_op_flush(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
5566                            u32 queues, bool drop)
5567{
5568        struct wl1271 *wl = hw->priv;
5569
5570        wl1271_tx_flush(wl);
5571}
5572
5573static int wlcore_op_remain_on_channel(struct ieee80211_hw *hw,
5574                                       struct ieee80211_vif *vif,
5575                                       struct ieee80211_channel *chan,
5576                                       int duration,
5577                                       enum ieee80211_roc_type type)
5578{
5579        struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
5580        struct wl1271 *wl = hw->priv;
5581        int channel, active_roc, ret = 0;
5582
5583        channel = ieee80211_frequency_to_channel(chan->center_freq);
5584
5585        wl1271_debug(DEBUG_MAC80211, "mac80211 roc %d (%d)",
5586                     channel, wlvif->role_id);
5587
5588        mutex_lock(&wl->mutex);
5589
5590        if (unlikely(wl->state != WLCORE_STATE_ON))
5591                goto out;
5592
5593        /* return EBUSY if we can't ROC right now */
5594        active_roc = find_first_bit(wl->roc_map, WL12XX_MAX_ROLES);
5595        if (wl->roc_vif || active_roc < WL12XX_MAX_ROLES) {
5596                wl1271_warning("active roc on role %d", active_roc);
5597                ret = -EBUSY;
5598                goto out;
5599        }
5600
5601        ret = pm_runtime_resume_and_get(wl->dev);
5602        if (ret < 0)
5603                goto out;
5604
5605        ret = wl12xx_start_dev(wl, wlvif, chan->band, channel);
5606        if (ret < 0)
5607                goto out_sleep;
5608
5609        wl->roc_vif = vif;
5610        ieee80211_queue_delayed_work(hw, &wl->roc_complete_work,
5611                                     msecs_to_jiffies(duration));
5612out_sleep:
5613        pm_runtime_mark_last_busy(wl->dev);
5614        pm_runtime_put_autosuspend(wl->dev);
5615out:
5616        mutex_unlock(&wl->mutex);
5617        return ret;
5618}
5619
5620static int __wlcore_roc_completed(struct wl1271 *wl)
5621{
5622        struct wl12xx_vif *wlvif;
5623        int ret;
5624
5625        /* already completed */
5626        if (unlikely(!wl->roc_vif))
5627                return 0;
5628
5629        wlvif = wl12xx_vif_to_data(wl->roc_vif);
5630
5631        if (!test_bit(WLVIF_FLAG_INITIALIZED, &wlvif->flags))
5632                return -EBUSY;
5633
5634        ret = wl12xx_stop_dev(wl, wlvif);
5635        if (ret < 0)
5636                return ret;
5637
5638        wl->roc_vif = NULL;
5639
5640        return 0;
5641}
5642
5643static int wlcore_roc_completed(struct wl1271 *wl)
5644{
5645        int ret;
5646
5647        wl1271_debug(DEBUG_MAC80211, "roc complete");
5648
5649        mutex_lock(&wl->mutex);
5650
5651        if (unlikely(wl->state != WLCORE_STATE_ON)) {
5652                ret = -EBUSY;
5653                goto out;
5654        }
5655
5656        ret = pm_runtime_resume_and_get(wl->dev);
5657        if (ret < 0)
5658                goto out;
5659
5660        ret = __wlcore_roc_completed(wl);
5661
5662        pm_runtime_mark_last_busy(wl->dev);
5663        pm_runtime_put_autosuspend(wl->dev);
5664out:
5665        mutex_unlock(&wl->mutex);
5666
5667        return ret;
5668}
5669
5670static void wlcore_roc_complete_work(struct work_struct *work)
5671{
5672        struct delayed_work *dwork;
5673        struct wl1271 *wl;
5674        int ret;
5675
5676        dwork = to_delayed_work(work);
5677        wl = container_of(dwork, struct wl1271, roc_complete_work);
5678
5679        ret = wlcore_roc_completed(wl);
5680        if (!ret)
5681                ieee80211_remain_on_channel_expired(wl->hw);
5682}
5683
5684static int wlcore_op_cancel_remain_on_channel(struct ieee80211_hw *hw,
5685                                              struct ieee80211_vif *vif)
5686{
5687        struct wl1271 *wl = hw->priv;
5688
5689        wl1271_debug(DEBUG_MAC80211, "mac80211 croc");
5690
5691        /* TODO: per-vif */
5692        wl1271_tx_flush(wl);
5693
5694        /*
5695         * we can't just flush_work here, because it might deadlock
5696         * (as we might get called from the same workqueue)
5697         */
5698        cancel_delayed_work_sync(&wl->roc_complete_work);
5699        wlcore_roc_completed(wl);
5700
5701        return 0;
5702}
5703
5704static void wlcore_op_sta_rc_update(struct ieee80211_hw *hw,
5705                                    struct ieee80211_vif *vif,
5706                                    struct ieee80211_sta *sta,
5707                                    u32 changed)
5708{
5709        struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
5710
5711        wl1271_debug(DEBUG_MAC80211, "mac80211 sta_rc_update");
5712
5713        if (!(changed & IEEE80211_RC_BW_CHANGED))
5714                return;
5715
5716        /* this callback is atomic, so schedule a new work */
5717        wlvif->rc_update_bw = sta->deflink.bandwidth;
5718        memcpy(&wlvif->rc_ht_cap, &sta->deflink.ht_cap,
5719               sizeof(sta->deflink.ht_cap));
5720        ieee80211_queue_work(hw, &wlvif->rc_update_work);
5721}
5722
5723static void wlcore_op_sta_statistics(struct ieee80211_hw *hw,
5724                                     struct ieee80211_vif *vif,
5725                                     struct ieee80211_sta *sta,
5726                                     struct station_info *sinfo)
5727{
5728        struct wl1271 *wl = hw->priv;
5729        struct wl12xx_vif *wlvif = wl12xx_vif_to_data(vif);
5730        s8 rssi_dbm;
5731        int ret;
5732
5733        wl1271_debug(DEBUG_MAC80211, "mac80211 get_rssi");
5734
5735        mutex_lock(&wl->mutex);
5736
5737        if (unlikely(wl->state != WLCORE_STATE_ON))
5738                goto out;
5739
5740        ret = pm_runtime_resume_and_get(wl->dev);
5741        if (ret < 0)
5742                goto out_sleep;
5743
5744        ret = wlcore_acx_average_rssi(wl, wlvif, &rssi_dbm);
5745        if (ret < 0)
5746                goto out_sleep;
5747
5748        sinfo->filled |= BIT_ULL(NL80211_STA_INFO_SIGNAL);
5749        sinfo->signal = rssi_dbm;
5750
5751out_sleep:
5752        pm_runtime_mark_last_busy(wl->dev);
5753        pm_runtime_put_autosuspend(wl->dev);
5754
5755out:
5756        mutex_unlock(&wl->mutex);
5757}
5758
5759static u32 wlcore_op_get_expected_throughput(struct ieee80211_hw *hw,
5760                                             struct ieee80211_sta *sta)
5761{
5762        struct wl1271_station *wl_sta = (struct wl1271_station *)sta->drv_priv;
5763        struct wl1271 *wl = hw->priv;
5764        u8 hlid = wl_sta->hlid;
5765
5766        /* return in units of Kbps */
5767        return (wl->links[hlid].fw_rate_mbps * 1000);
5768}
5769
5770static bool wl1271_tx_frames_pending(struct ieee80211_hw *hw)
5771{
5772        struct wl1271 *wl = hw->priv;
5773        bool ret = false;
5774
5775        mutex_lock(&wl->mutex);
5776
5777        if (unlikely(wl->state != WLCORE_STATE_ON))
5778                goto out;
5779
5780        /* packets are considered pending if in the TX queue or the FW */
5781        ret = (wl1271_tx_total_queue_count(wl) > 0) || (wl->tx_frames_cnt > 0);
5782out:
5783        mutex_unlock(&wl->mutex);
5784
5785        return ret;
5786}
5787
5788/* can't be const, mac80211 writes to this */
5789static struct ieee80211_rate wl1271_rates[] = {
5790        { .bitrate = 10,
5791          .hw_value = CONF_HW_BIT_RATE_1MBPS,
5792          .hw_value_short = CONF_HW_BIT_RATE_1MBPS, },
5793        { .bitrate = 20,
5794          .hw_value = CONF_HW_BIT_RATE_2MBPS,
5795          .hw_value_short = CONF_HW_BIT_RATE_2MBPS,
5796          .flags = IEEE80211_RATE_SHORT_PREAMBLE },
5797        { .bitrate = 55,
5798          .hw_value = CONF_HW_BIT_RATE_5_5MBPS,
5799          .hw_value_short = CONF_HW_BIT_RATE_5_5MBPS,
5800          .flags = IEEE80211_RATE_SHORT_PREAMBLE },
5801        { .bitrate = 110,
5802          .hw_value = CONF_HW_BIT_RATE_11MBPS,
5803          .hw_value_short = CONF_HW_BIT_RATE_11MBPS,
5804          .flags = IEEE80211_RATE_SHORT_PREAMBLE },
5805        { .bitrate = 60,
5806          .hw_value = CONF_HW_BIT_RATE_6MBPS,
5807          .hw_value_short = CONF_HW_BIT_RATE_6MBPS, },
5808        { .bitrate = 90,
5809          .hw_value = CONF_HW_BIT_RATE_9MBPS,
5810          .hw_value_short = CONF_HW_BIT_RATE_9MBPS, },
5811        { .bitrate = 120,
5812          .hw_value = CONF_HW_BIT_RATE_12MBPS,
5813          .hw_value_short = CONF_HW_BIT_RATE_12MBPS, },
5814        { .bitrate = 180,
5815          .hw_value = CONF_HW_BIT_RATE_18MBPS,
5816          .hw_value_short = CONF_HW_BIT_RATE_18MBPS, },
5817        { .bitrate = 240,
5818          .hw_value = CONF_HW_BIT_RATE_24MBPS,
5819          .hw_value_short = CONF_HW_BIT_RATE_24MBPS, },
5820        { .bitrate = 360,
5821         .hw_value = CONF_HW_BIT_RATE_36MBPS,
5822         .hw_value_short = CONF_HW_BIT_RATE_36MBPS, },
5823        { .bitrate = 480,
5824          .hw_value = CONF_HW_BIT_RATE_48MBPS,
5825          .hw_value_short = CONF_HW_BIT_RATE_48MBPS, },
5826        { .bitrate = 540,
5827          .hw_value = CONF_HW_BIT_RATE_54MBPS,
5828          .hw_value_short = CONF_HW_BIT_RATE_54MBPS, },
5829};
5830
5831/* can't be const, mac80211 writes to this */
5832static struct ieee80211_channel wl1271_channels[] = {
5833        { .hw_value = 1, .center_freq = 2412, .max_power = WLCORE_MAX_TXPWR },
5834        { .hw_value = 2, .center_freq = 2417, .max_power = WLCORE_MAX_TXPWR },
5835        { .hw_value = 3, .center_freq = 2422, .max_power = WLCORE_MAX_TXPWR },
5836        { .hw_value = 4, .center_freq = 2427, .max_power = WLCORE_MAX_TXPWR },
5837        { .hw_value = 5, .center_freq = 2432, .max_power = WLCORE_MAX_TXPWR },
5838        { .hw_value = 6, .center_freq = 2437, .max_power = WLCORE_MAX_TXPWR },
5839        { .hw_value = 7, .center_freq = 2442, .max_power = WLCORE_MAX_TXPWR },
5840        { .hw_value = 8, .center_freq = 2447, .max_power = WLCORE_MAX_TXPWR },
5841        { .hw_value = 9, .center_freq = 2452, .max_power = WLCORE_MAX_TXPWR },
5842        { .hw_value = 10, .center_freq = 2457, .max_power = WLCORE_MAX_TXPWR },
5843        { .hw_value = 11, .center_freq = 2462, .max_power = WLCORE_MAX_TXPWR },
5844        { .hw_value = 12, .center_freq = 2467, .max_power = WLCORE_MAX_TXPWR },
5845        { .hw_value = 13, .center_freq = 2472, .max_power = WLCORE_MAX_TXPWR },
5846        { .hw_value = 14, .center_freq = 2484, .max_power = WLCORE_MAX_TXPWR },
5847};
5848
5849/* can't be const, mac80211 writes to this */
5850static struct ieee80211_supported_band wl1271_band_2ghz = {
5851        .channels = wl1271_channels,
5852        .n_channels = ARRAY_SIZE(wl1271_channels),
5853        .bitrates = wl1271_rates,
5854        .n_bitrates = ARRAY_SIZE(wl1271_rates),
5855};
5856
5857/* 5 GHz data rates for WL1273 */
5858static struct ieee80211_rate wl1271_rates_5ghz[] = {
5859        { .bitrate = 60,
5860          .hw_value = CONF_HW_BIT_RATE_6MBPS,
5861          .hw_value_short = CONF_HW_BIT_RATE_6MBPS, },
5862        { .bitrate = 90,
5863          .hw_value = CONF_HW_BIT_RATE_9MBPS,
5864          .hw_value_short = CONF_HW_BIT_RATE_9MBPS, },
5865        { .bitrate = 120,
5866          .hw_value = CONF_HW_BIT_RATE_12MBPS,
5867          .hw_value_short = CONF_HW_BIT_RATE_12MBPS, },
5868        { .bitrate = 180,
5869          .hw_value = CONF_HW_BIT_RATE_18MBPS,
5870          .hw_value_short = CONF_HW_BIT_RATE_18MBPS, },
5871        { .bitrate = 240,
5872          .hw_value = CONF_HW_BIT_RATE_24MBPS,
5873          .hw_value_short = CONF_HW_BIT_RATE_24MBPS, },
5874        { .bitrate = 360,
5875         .hw_value = CONF_HW_BIT_RATE_36MBPS,
5876         .hw_value_short = CONF_HW_BIT_RATE_36MBPS, },
5877        { .bitrate = 480,
5878          .hw_value = CONF_HW_BIT_RATE_48MBPS,
5879          .hw_value_short = CONF_HW_BIT_RATE_48MBPS, },
5880        { .bitrate = 540,
5881          .hw_value = CONF_HW_BIT_RATE_54MBPS,
5882          .hw_value_short = CONF_HW_BIT_RATE_54MBPS, },
5883};
5884
5885/* 5 GHz band channels for WL1273 */
5886static struct ieee80211_channel wl1271_channels_5ghz[] = {
5887        { .hw_value = 8, .center_freq = 5040, .max_power = WLCORE_MAX_TXPWR },
5888        { .hw_value = 12, .center_freq = 5060, .max_power = WLCORE_MAX_TXPWR },
5889        { .hw_value = 16, .center_freq = 5080, .max_power = WLCORE_MAX_TXPWR },
5890        { .hw_value = 34, .center_freq = 5170, .max_power = WLCORE_MAX_TXPWR },
5891        { .hw_value = 36, .center_freq = 5180, .max_power = WLCORE_MAX_TXPWR },
5892        { .hw_value = 38, .center_freq = 5190, .max_power = WLCORE_MAX_TXPWR },
5893        { .hw_value = 40, .center_freq = 5200, .max_power = WLCORE_MAX_TXPWR },
5894        { .hw_value = 42, .center_freq = 5210, .max_power = WLCORE_MAX_TXPWR },
5895        { .hw_value = 44, .center_freq = 5220, .max_power = WLCORE_MAX_TXPWR },
5896        { .hw_value = 46, .center_freq = 5230, .max_power = WLCORE_MAX_TXPWR },
5897        { .hw_value = 48, .center_freq = 5240, .max_power = WLCORE_MAX_TXPWR },
5898        { .hw_value = 52, .center_freq = 5260, .max_power = WLCORE_MAX_TXPWR },
5899        { .hw_value = 56, .center_freq = 5280, .max_power = WLCORE_MAX_TXPWR },
5900        { .hw_value = 60, .center_freq = 5300, .max_power = WLCORE_MAX_TXPWR },
5901        { .hw_value = 64, .center_freq = 5320, .max_power = WLCORE_MAX_TXPWR },
5902        { .hw_value = 100, .center_freq = 5500, .max_power = WLCORE_MAX_TXPWR },
5903        { .hw_value = 104, .center_freq = 5520, .max_power = WLCORE_MAX_TXPWR },
5904        { .hw_value = 108, .center_freq = 5540, .max_power = WLCORE_MAX_TXPWR },
5905        { .hw_value = 112, .center_freq = 5560, .max_power = WLCORE_MAX_TXPWR },
5906        { .hw_value = 116, .center_freq = 5580, .max_power = WLCORE_MAX_TXPWR },
5907        { .hw_value = 120, .center_freq = 5600, .max_power = WLCORE_MAX_TXPWR },
5908        { .hw_value = 124, .center_freq = 5620, .max_power = WLCORE_MAX_TXPWR },
5909        { .hw_value = 128, .center_freq = 5640, .max_power = WLCORE_MAX_TXPWR },
5910        { .hw_value = 132, .center_freq = 5660, .max_power = WLCORE_MAX_TXPWR },
5911        { .hw_value = 136, .center_freq = 5680, .max_power = WLCORE_MAX_TXPWR },
5912        { .hw_value = 140, .center_freq = 5700, .max_power = WLCORE_MAX_TXPWR },
5913        { .hw_value = 149, .center_freq = 5745, .max_power = WLCORE_MAX_TXPWR },
5914        { .hw_value = 153, .center_freq = 5765, .max_power = WLCORE_MAX_TXPWR },
5915        { .hw_value = 157, .center_freq = 5785, .max_power = WLCORE_MAX_TXPWR },
5916        { .hw_value = 161, .center_freq = 5805, .max_power = WLCORE_MAX_TXPWR },
5917        { .hw_value = 165, .center_freq = 5825, .max_power = WLCORE_MAX_TXPWR },
5918};
5919
5920static struct ieee80211_supported_band wl1271_band_5ghz = {
5921        .channels = wl1271_channels_5ghz,
5922        .n_channels = ARRAY_SIZE(wl1271_channels_5ghz),
5923        .bitrates = wl1271_rates_5ghz,
5924        .n_bitrates = ARRAY_SIZE(wl1271_rates_5ghz),
5925};
5926
5927static const struct ieee80211_ops wl1271_ops = {
5928        .start = wl1271_op_start,
5929        .stop = wlcore_op_stop,
5930        .add_interface = wl1271_op_add_interface,
5931        .remove_interface = wl1271_op_remove_interface,
5932        .change_interface = wl12xx_op_change_interface,
5933#ifdef CONFIG_PM
5934        .suspend = wl1271_op_suspend,
5935        .resume = wl1271_op_resume,
5936#endif
5937        .config = wl1271_op_config,
5938        .prepare_multicast = wl1271_op_prepare_multicast,
5939        .configure_filter = wl1271_op_configure_filter,
5940        .tx = wl1271_op_tx,
5941        .set_key = wlcore_op_set_key,
5942        .hw_scan = wl1271_op_hw_scan,
5943        .cancel_hw_scan = wl1271_op_cancel_hw_scan,
5944        .sched_scan_start = wl1271_op_sched_scan_start,
5945        .sched_scan_stop = wl1271_op_sched_scan_stop,
5946        .bss_info_changed = wl1271_op_bss_info_changed,
5947        .set_frag_threshold = wl1271_op_set_frag_threshold,
5948        .set_rts_threshold = wl1271_op_set_rts_threshold,
5949        .conf_tx = wl1271_op_conf_tx,
5950        .get_tsf = wl1271_op_get_tsf,
5951        .get_survey = wl1271_op_get_survey,
5952        .sta_state = wl12xx_op_sta_state,
5953        .ampdu_action = wl1271_op_ampdu_action,
5954        .tx_frames_pending = wl1271_tx_frames_pending,
5955        .set_bitrate_mask = wl12xx_set_bitrate_mask,
5956        .set_default_unicast_key = wl1271_op_set_default_key_idx,
5957        .channel_switch = wl12xx_op_channel_switch,
5958        .channel_switch_beacon = wlcore_op_channel_switch_beacon,
5959        .flush = wlcore_op_flush,
5960        .remain_on_channel = wlcore_op_remain_on_channel,
5961        .cancel_remain_on_channel = wlcore_op_cancel_remain_on_channel,
5962        .add_chanctx = wlcore_op_add_chanctx,
5963        .remove_chanctx = wlcore_op_remove_chanctx,
5964        .change_chanctx = wlcore_op_change_chanctx,
5965        .assign_vif_chanctx = wlcore_op_assign_vif_chanctx,
5966        .unassign_vif_chanctx = wlcore_op_unassign_vif_chanctx,
5967        .switch_vif_chanctx = wlcore_op_switch_vif_chanctx,
5968        .sta_rc_update = wlcore_op_sta_rc_update,
5969        .sta_statistics = wlcore_op_sta_statistics,
5970        .get_expected_throughput = wlcore_op_get_expected_throughput,
5971        CFG80211_TESTMODE_CMD(wl1271_tm_cmd)
5972};
5973
5974
5975u8 wlcore_rate_to_idx(struct wl1271 *wl, u8 rate, enum nl80211_band band)
5976{
5977        u8 idx;
5978
5979        BUG_ON(band >= 2);
5980
5981        if (unlikely(rate >= wl->hw_tx_rate_tbl_size)) {
5982                wl1271_error("Illegal RX rate from HW: %d", rate);
5983                return 0;
5984        }
5985
5986        idx = wl->band_rate_to_idx[band][rate];
5987        if (unlikely(idx == CONF_HW_RXTX_RATE_UNSUPPORTED)) {
5988                wl1271_error("Unsupported RX rate from HW: %d", rate);
5989                return 0;
5990        }
5991
5992        return idx;
5993}
5994
5995static void wl12xx_derive_mac_addresses(struct wl1271 *wl, u32 oui, u32 nic)
5996{
5997        int i;
5998
5999        wl1271_debug(DEBUG_PROBE, "base address: oui %06x nic %06x",
6000                     oui, nic);
6001
6002        if (nic + WLCORE_NUM_MAC_ADDRESSES - wl->num_mac_addr > 0xffffff)
6003                wl1271_warning("NIC part of the MAC address wraps around!");
6004
6005        for (i = 0; i < wl->num_mac_addr; i++) {
6006                wl->addresses[i].addr[0] = (u8)(oui >> 16);
6007                wl->addresses[i].addr[1] = (u8)(oui >> 8);
6008                wl->addresses[i].addr[2] = (u8) oui;
6009                wl->addresses[i].addr[3] = (u8)(nic >> 16);
6010                wl->addresses[i].addr[4] = (u8)(nic >> 8);
6011                wl->addresses[i].addr[5] = (u8) nic;
6012                nic++;
6013        }
6014
6015        /* we may be one address short at the most */
6016        WARN_ON(wl->num_mac_addr + 1 < WLCORE_NUM_MAC_ADDRESSES);
6017
6018        /*
6019         * turn on the LAA bit in the first address and use it as
6020         * the last address.
6021         */
6022        if (wl->num_mac_addr < WLCORE_NUM_MAC_ADDRESSES) {
6023                int idx = WLCORE_NUM_MAC_ADDRESSES - 1;
6024                memcpy(&wl->addresses[idx], &wl->addresses[0],
6025                       sizeof(wl->addresses[0]));
6026                /* LAA bit */
6027                wl->addresses[idx].addr[0] |= BIT(1);
6028        }
6029
6030        wl->hw->wiphy->n_addresses = WLCORE_NUM_MAC_ADDRESSES;
6031        wl->hw->wiphy->addresses = wl->addresses;
6032}
6033
6034static int wl12xx_get_hw_info(struct wl1271 *wl)
6035{
6036        int ret;
6037
6038        ret = wlcore_read_reg(wl, REG_CHIP_ID_B, &wl->chip.id);
6039        if (ret < 0)
6040                goto out;
6041
6042        wl->fuse_oui_addr = 0;
6043        wl->fuse_nic_addr = 0;
6044
6045        ret = wl->ops->get_pg_ver(wl, &wl->hw_pg_ver);
6046        if (ret < 0)
6047                goto out;
6048
6049        if (wl->ops->get_mac)
6050                ret = wl->ops->get_mac(wl);
6051
6052out:
6053        return ret;
6054}
6055
6056static int wl1271_register_hw(struct wl1271 *wl)
6057{
6058        int ret;
6059        u32 oui_addr = 0, nic_addr = 0;
6060        struct platform_device *pdev = wl->pdev;
6061        struct wlcore_platdev_data *pdev_data = dev_get_platdata(&pdev->dev);
6062
6063        if (wl->mac80211_registered)
6064                return 0;
6065
6066        if (wl->nvs_len >= 12) {
6067                /* NOTE: The wl->nvs->nvs element must be first, in
6068                 * order to simplify the casting, we assume it is at
6069                 * the beginning of the wl->nvs structure.
6070                 */
6071                u8 *nvs_ptr = (u8 *)wl->nvs;
6072
6073                oui_addr =
6074                        (nvs_ptr[11] << 16) + (nvs_ptr[10] << 8) + nvs_ptr[6];
6075                nic_addr =
6076                        (nvs_ptr[5] << 16) + (nvs_ptr[4] << 8) + nvs_ptr[3];
6077        }
6078
6079        /* if the MAC address is zeroed in the NVS derive from fuse */
6080        if (oui_addr == 0 && nic_addr == 0) {
6081                oui_addr = wl->fuse_oui_addr;
6082                /* fuse has the BD_ADDR, the WLAN addresses are the next two */
6083                nic_addr = wl->fuse_nic_addr + 1;
6084        }
6085
6086        if (oui_addr == 0xdeadbe && nic_addr == 0xef0000) {
6087                wl1271_warning("Detected unconfigured mac address in nvs, derive from fuse instead.");
6088                if (!strcmp(pdev_data->family->name, "wl18xx")) {
6089                        wl1271_warning("This default nvs file can be removed from the file system");
6090                } else {
6091                        wl1271_warning("Your device performance is not optimized.");
6092                        wl1271_warning("Please use the calibrator tool to configure your device.");
6093                }
6094
6095                if (wl->fuse_oui_addr == 0 && wl->fuse_nic_addr == 0) {
6096                        wl1271_warning("Fuse mac address is zero. using random mac");
6097                        /* Use TI oui and a random nic */
6098                        oui_addr = WLCORE_TI_OUI_ADDRESS;
6099                        nic_addr = get_random_int();
6100                } else {
6101                        oui_addr = wl->fuse_oui_addr;
6102                        /* fuse has the BD_ADDR, the WLAN addresses are the next two */
6103                        nic_addr = wl->fuse_nic_addr + 1;
6104                }
6105        }
6106
6107        wl12xx_derive_mac_addresses(wl, oui_addr, nic_addr);
6108
6109        ret = ieee80211_register_hw(wl->hw);
6110        if (ret < 0) {
6111                wl1271_error("unable to register mac80211 hw: %d", ret);
6112                goto out;
6113        }
6114
6115        wl->mac80211_registered = true;
6116
6117        wl1271_debugfs_init(wl);
6118
6119        wl1271_notice("loaded");
6120
6121out:
6122        return ret;
6123}
6124
6125static void wl1271_unregister_hw(struct wl1271 *wl)
6126{
6127        if (wl->plt)
6128                wl1271_plt_stop(wl);
6129
6130        ieee80211_unregister_hw(wl->hw);
6131        wl->mac80211_registered = false;
6132
6133}
6134
6135static int wl1271_init_ieee80211(struct wl1271 *wl)
6136{
6137        int i;
6138        static const u32 cipher_suites[] = {
6139                WLAN_CIPHER_SUITE_WEP40,
6140                WLAN_CIPHER_SUITE_WEP104,
6141                WLAN_CIPHER_SUITE_TKIP,
6142                WLAN_CIPHER_SUITE_CCMP,
6143                WL1271_CIPHER_SUITE_GEM,
6144        };
6145
6146        /* The tx descriptor buffer */
6147        wl->hw->extra_tx_headroom = sizeof(struct wl1271_tx_hw_descr);
6148
6149        if (wl->quirks & WLCORE_QUIRK_TKIP_HEADER_SPACE)
6150                wl->hw->extra_tx_headroom += WL1271_EXTRA_SPACE_TKIP;
6151
6152        /* unit us */
6153        /* FIXME: find a proper value */
6154        wl->hw->max_listen_interval = wl->conf.conn.max_listen_interval;
6155
6156        ieee80211_hw_set(wl->hw, SUPPORT_FAST_XMIT);
6157        ieee80211_hw_set(wl->hw, CHANCTX_STA_CSA);
6158        ieee80211_hw_set(wl->hw, SUPPORTS_PER_STA_GTK);
6159        ieee80211_hw_set(wl->hw, QUEUE_CONTROL);
6160        ieee80211_hw_set(wl->hw, TX_AMPDU_SETUP_IN_HW);
6161        ieee80211_hw_set(wl->hw, AMPDU_AGGREGATION);
6162        ieee80211_hw_set(wl->hw, AP_LINK_PS);
6163        ieee80211_hw_set(wl->hw, SPECTRUM_MGMT);
6164        ieee80211_hw_set(wl->hw, REPORTS_TX_ACK_STATUS);
6165        ieee80211_hw_set(wl->hw, CONNECTION_MONITOR);
6166        ieee80211_hw_set(wl->hw, HAS_RATE_CONTROL);
6167        ieee80211_hw_set(wl->hw, SUPPORTS_DYNAMIC_PS);
6168        ieee80211_hw_set(wl->hw, SIGNAL_DBM);
6169        ieee80211_hw_set(wl->hw, SUPPORTS_PS);
6170        ieee80211_hw_set(wl->hw, SUPPORTS_TX_FRAG);
6171
6172        wl->hw->wiphy->cipher_suites = cipher_suites;
6173        wl->hw->wiphy->n_cipher_suites = ARRAY_SIZE(cipher_suites);
6174
6175        wl->hw->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) |
6176                                         BIT(NL80211_IFTYPE_AP) |
6177                                         BIT(NL80211_IFTYPE_P2P_DEVICE) |
6178                                         BIT(NL80211_IFTYPE_P2P_CLIENT) |
6179#ifdef CONFIG_MAC80211_MESH
6180                                         BIT(NL80211_IFTYPE_MESH_POINT) |
6181#endif
6182                                         BIT(NL80211_IFTYPE_P2P_GO);
6183
6184        wl->hw->wiphy->max_scan_ssids = 1;
6185        wl->hw->wiphy->max_sched_scan_ssids = 16;
6186        wl->hw->wiphy->max_match_sets = 16;
6187        /*
6188         * Maximum length of elements in scanning probe request templates
6189         * should be the maximum length possible for a template, without
6190         * the IEEE80211 header of the template
6191         */
6192        wl->hw->wiphy->max_scan_ie_len = WL1271_CMD_TEMPL_MAX_SIZE -
6193                        sizeof(struct ieee80211_header);
6194
6195        wl->hw->wiphy->max_sched_scan_reqs = 1;
6196        wl->hw->wiphy->max_sched_scan_ie_len = WL1271_CMD_TEMPL_MAX_SIZE -
6197                sizeof(struct ieee80211_header);
6198
6199        wl->hw->wiphy->max_remain_on_channel_duration = 30000;
6200
6201        wl->hw->wiphy->flags |= WIPHY_FLAG_AP_UAPSD |
6202                                WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL |
6203                                WIPHY_FLAG_HAS_CHANNEL_SWITCH |
6204                                WIPHY_FLAG_IBSS_RSN;
6205
6206        wl->hw->wiphy->features |= NL80211_FEATURE_AP_SCAN;
6207
6208        /* make sure all our channels fit in the scanned_ch bitmask */
6209        BUILD_BUG_ON(ARRAY_SIZE(wl1271_channels) +
6210                     ARRAY_SIZE(wl1271_channels_5ghz) >
6211                     WL1271_MAX_CHANNELS);
6212        /*
6213        * clear channel flags from the previous usage
6214        * and restore max_power & max_antenna_gain values.
6215        */
6216        for (i = 0; i < ARRAY_SIZE(wl1271_channels); i++) {
6217                wl1271_band_2ghz.channels[i].flags = 0;
6218                wl1271_band_2ghz.channels[i].max_power = WLCORE_MAX_TXPWR;
6219                wl1271_band_2ghz.channels[i].max_antenna_gain = 0;
6220        }
6221
6222        for (i = 0; i < ARRAY_SIZE(wl1271_channels_5ghz); i++) {
6223                wl1271_band_5ghz.channels[i].flags = 0;
6224                wl1271_band_5ghz.channels[i].max_power = WLCORE_MAX_TXPWR;
6225                wl1271_band_5ghz.channels[i].max_antenna_gain = 0;
6226        }
6227
6228        /*
6229         * We keep local copies of the band structs because we need to
6230         * modify them on a per-device basis.
6231         */
6232        memcpy(&wl->bands[NL80211_BAND_2GHZ], &wl1271_band_2ghz,
6233               sizeof(wl1271_band_2ghz));
6234        memcpy(&wl->bands[NL80211_BAND_2GHZ].ht_cap,
6235               &wl->ht_cap[NL80211_BAND_2GHZ],
6236               sizeof(*wl->ht_cap));
6237        memcpy(&wl->bands[NL80211_BAND_5GHZ], &wl1271_band_5ghz,
6238               sizeof(wl1271_band_5ghz));
6239        memcpy(&wl->bands[NL80211_BAND_5GHZ].ht_cap,
6240               &wl->ht_cap[NL80211_BAND_5GHZ],
6241               sizeof(*wl->ht_cap));
6242
6243        wl->hw->wiphy->bands[NL80211_BAND_2GHZ] =
6244                &wl->bands[NL80211_BAND_2GHZ];
6245        wl->hw->wiphy->bands[NL80211_BAND_5GHZ] =
6246                &wl->bands[NL80211_BAND_5GHZ];
6247
6248        /*
6249         * allow 4 queues per mac address we support +
6250         * 1 cab queue per mac + one global offchannel Tx queue
6251         */
6252        wl->hw->queues = (NUM_TX_QUEUES + 1) * WLCORE_NUM_MAC_ADDRESSES + 1;
6253
6254        /* the last queue is the offchannel queue */
6255        wl->hw->offchannel_tx_hw_queue = wl->hw->queues - 1;
6256        wl->hw->max_rates = 1;
6257
6258        wl->hw->wiphy->reg_notifier = wl1271_reg_notify;
6259
6260        /* the FW answers probe-requests in AP-mode */
6261        wl->hw->wiphy->flags |= WIPHY_FLAG_AP_PROBE_RESP_OFFLOAD;
6262        wl->hw->wiphy->probe_resp_offload =
6263                NL80211_PROBE_RESP_OFFLOAD_SUPPORT_WPS |
6264                NL80211_PROBE_RESP_OFFLOAD_SUPPORT_WPS2 |
6265                NL80211_PROBE_RESP_OFFLOAD_SUPPORT_P2P;
6266
6267        /* allowed interface combinations */
6268        wl->hw->wiphy->iface_combinations = wl->iface_combinations;
6269        wl->hw->wiphy->n_iface_combinations = wl->n_iface_combinations;
6270
6271        /* register vendor commands */
6272        wlcore_set_vendor_commands(wl->hw->wiphy);
6273
6274        SET_IEEE80211_DEV(wl->hw, wl->dev);
6275
6276        wl->hw->sta_data_size = sizeof(struct wl1271_station);
6277        wl->hw->vif_data_size = sizeof(struct wl12xx_vif);
6278
6279        wl->hw->max_rx_aggregation_subframes = wl->conf.ht.rx_ba_win_size;
6280
6281        return 0;
6282}
6283
6284struct ieee80211_hw *wlcore_alloc_hw(size_t priv_size, u32 aggr_buf_size,
6285                                     u32 mbox_size)
6286{
6287        struct ieee80211_hw *hw;
6288        struct wl1271 *wl;
6289        int i, j, ret;
6290        unsigned int order;
6291
6292        hw = ieee80211_alloc_hw(sizeof(*wl), &wl1271_ops);
6293        if (!hw) {
6294                wl1271_error("could not alloc ieee80211_hw");
6295                ret = -ENOMEM;
6296                goto err_hw_alloc;
6297        }
6298
6299        wl = hw->priv;
6300        memset(wl, 0, sizeof(*wl));
6301
6302        wl->priv = kzalloc(priv_size, GFP_KERNEL);
6303        if (!wl->priv) {
6304                wl1271_error("could not alloc wl priv");
6305                ret = -ENOMEM;
6306                goto err_priv_alloc;
6307        }
6308
6309        INIT_LIST_HEAD(&wl->wlvif_list);
6310
6311        wl->hw = hw;
6312
6313        /*
6314         * wl->num_links is not configured yet, so just use WLCORE_MAX_LINKS.
6315         * we don't allocate any additional resource here, so that's fine.
6316         */
6317        for (i = 0; i < NUM_TX_QUEUES; i++)
6318                for (j = 0; j < WLCORE_MAX_LINKS; j++)
6319                        skb_queue_head_init(&wl->links[j].tx_queue[i]);
6320
6321        skb_queue_head_init(&wl->deferred_rx_queue);
6322        skb_queue_head_init(&wl->deferred_tx_queue);
6323
6324        INIT_WORK(&wl->netstack_work, wl1271_netstack_work);
6325        INIT_WORK(&wl->tx_work, wl1271_tx_work);
6326        INIT_WORK(&wl->recovery_work, wl1271_recovery_work);
6327        INIT_DELAYED_WORK(&wl->scan_complete_work, wl1271_scan_complete_work);
6328        INIT_DELAYED_WORK(&wl->roc_complete_work, wlcore_roc_complete_work);
6329        INIT_DELAYED_WORK(&wl->tx_watchdog_work, wl12xx_tx_watchdog_work);
6330
6331        wl->freezable_wq = create_freezable_workqueue("wl12xx_wq");
6332        if (!wl->freezable_wq) {
6333                ret = -ENOMEM;
6334                goto err_hw;
6335        }
6336
6337        wl->channel = 0;
6338        wl->rx_counter = 0;
6339        wl->power_level = WL1271_DEFAULT_POWER_LEVEL;
6340        wl->band = NL80211_BAND_2GHZ;
6341        wl->channel_type = NL80211_CHAN_NO_HT;
6342        wl->flags = 0;
6343        wl->sg_enabled = true;
6344        wl->sleep_auth = WL1271_PSM_ILLEGAL;
6345        wl->recovery_count = 0;
6346        wl->hw_pg_ver = -1;
6347        wl->ap_ps_map = 0;
6348        wl->ap_fw_ps_map = 0;
6349        wl->quirks = 0;
6350        wl->system_hlid = WL12XX_SYSTEM_HLID;
6351        wl->active_sta_count = 0;
6352        wl->active_link_count = 0;
6353        wl->fwlog_size = 0;
6354
6355        /* The system link is always allocated */
6356        __set_bit(WL12XX_SYSTEM_HLID, wl->links_map);
6357
6358        memset(wl->tx_frames_map, 0, sizeof(wl->tx_frames_map));
6359        for (i = 0; i < wl->num_tx_desc; i++)
6360                wl->tx_frames[i] = NULL;
6361
6362        spin_lock_init(&wl->wl_lock);
6363
6364        wl->state = WLCORE_STATE_OFF;
6365        wl->fw_type = WL12XX_FW_TYPE_NONE;
6366        mutex_init(&wl->mutex);
6367        mutex_init(&wl->flush_mutex);
6368        init_completion(&wl->nvs_loading_complete);
6369
6370        order = get_order(aggr_buf_size);
6371        wl->aggr_buf = (u8 *)__get_free_pages(GFP_KERNEL, order);
6372        if (!wl->aggr_buf) {
6373                ret = -ENOMEM;
6374                goto err_wq;
6375        }
6376        wl->aggr_buf_size = aggr_buf_size;
6377
6378        wl->dummy_packet = wl12xx_alloc_dummy_packet(wl);
6379        if (!wl->dummy_packet) {
6380                ret = -ENOMEM;
6381                goto err_aggr;
6382        }
6383
6384        /* Allocate one page for the FW log */
6385        wl->fwlog = (u8 *)get_zeroed_page(GFP_KERNEL);
6386        if (!wl->fwlog) {
6387                ret = -ENOMEM;
6388                goto err_dummy_packet;
6389        }
6390
6391        wl->mbox_size = mbox_size;
6392        wl->mbox = kmalloc(wl->mbox_size, GFP_KERNEL | GFP_DMA);
6393        if (!wl->mbox) {
6394                ret = -ENOMEM;
6395                goto err_fwlog;
6396        }
6397
6398        wl->buffer_32 = kmalloc(sizeof(*wl->buffer_32), GFP_KERNEL);
6399        if (!wl->buffer_32) {
6400                ret = -ENOMEM;
6401                goto err_mbox;
6402        }
6403
6404        return hw;
6405
6406err_mbox:
6407        kfree(wl->mbox);
6408
6409err_fwlog:
6410        free_page((unsigned long)wl->fwlog);
6411
6412err_dummy_packet:
6413        dev_kfree_skb(wl->dummy_packet);
6414
6415err_aggr:
6416        free_pages((unsigned long)wl->aggr_buf, order);
6417
6418err_wq:
6419        destroy_workqueue(wl->freezable_wq);
6420
6421err_hw:
6422        wl1271_debugfs_exit(wl);
6423        kfree(wl->priv);
6424
6425err_priv_alloc:
6426        ieee80211_free_hw(hw);
6427
6428err_hw_alloc:
6429
6430        return ERR_PTR(ret);
6431}
6432EXPORT_SYMBOL_GPL(wlcore_alloc_hw);
6433
6434int wlcore_free_hw(struct wl1271 *wl)
6435{
6436        /* Unblock any fwlog readers */
6437        mutex_lock(&wl->mutex);
6438        wl->fwlog_size = -1;
6439        mutex_unlock(&wl->mutex);
6440
6441        wlcore_sysfs_free(wl);
6442
6443        kfree(wl->buffer_32);
6444        kfree(wl->mbox);
6445        free_page((unsigned long)wl->fwlog);
6446        dev_kfree_skb(wl->dummy_packet);
6447        free_pages((unsigned long)wl->aggr_buf, get_order(wl->aggr_buf_size));
6448
6449        wl1271_debugfs_exit(wl);
6450
6451        vfree(wl->fw);
6452        wl->fw = NULL;
6453        wl->fw_type = WL12XX_FW_TYPE_NONE;
6454        kfree(wl->nvs);
6455        wl->nvs = NULL;
6456
6457        kfree(wl->raw_fw_status);
6458        kfree(wl->fw_status);
6459        kfree(wl->tx_res_if);
6460        destroy_workqueue(wl->freezable_wq);
6461
6462        kfree(wl->priv);
6463        ieee80211_free_hw(wl->hw);
6464
6465        return 0;
6466}
6467EXPORT_SYMBOL_GPL(wlcore_free_hw);
6468
6469#ifdef CONFIG_PM
6470static const struct wiphy_wowlan_support wlcore_wowlan_support = {
6471        .flags = WIPHY_WOWLAN_ANY,
6472        .n_patterns = WL1271_MAX_RX_FILTERS,
6473        .pattern_min_len = 1,
6474        .pattern_max_len = WL1271_RX_FILTER_MAX_PATTERN_SIZE,
6475};
6476#endif
6477
6478static irqreturn_t wlcore_hardirq(int irq, void *cookie)
6479{
6480        return IRQ_WAKE_THREAD;
6481}
6482
6483static void wlcore_nvs_cb(const struct firmware *fw, void *context)
6484{
6485        struct wl1271 *wl = context;
6486        struct platform_device *pdev = wl->pdev;
6487        struct wlcore_platdev_data *pdev_data = dev_get_platdata(&pdev->dev);
6488        struct resource *res;
6489
6490        int ret;
6491        irq_handler_t hardirq_fn = NULL;
6492
6493        if (fw) {
6494                wl->nvs = kmemdup(fw->data, fw->size, GFP_KERNEL);
6495                if (!wl->nvs) {
6496                        wl1271_error("Could not allocate nvs data");
6497                        goto out;
6498                }
6499                wl->nvs_len = fw->size;
6500        } else if (pdev_data->family->nvs_name) {
6501                wl1271_debug(DEBUG_BOOT, "Could not get nvs file %s",
6502                             pdev_data->family->nvs_name);
6503                wl->nvs = NULL;
6504                wl->nvs_len = 0;
6505        } else {
6506                wl->nvs = NULL;
6507                wl->nvs_len = 0;
6508        }
6509
6510        ret = wl->ops->setup(wl);
6511        if (ret < 0)
6512                goto out_free_nvs;
6513
6514        BUG_ON(wl->num_tx_desc > WLCORE_MAX_TX_DESCRIPTORS);
6515
6516        /* adjust some runtime configuration parameters */
6517        wlcore_adjust_conf(wl);
6518
6519        res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
6520        if (!res) {
6521                wl1271_error("Could not get IRQ resource");
6522                goto out_free_nvs;
6523        }
6524
6525        wl->irq = res->start;
6526        wl->irq_flags = res->flags & IRQF_TRIGGER_MASK;
6527        wl->if_ops = pdev_data->if_ops;
6528
6529        if (wl->irq_flags & (IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING))
6530                hardirq_fn = wlcore_hardirq;
6531        else
6532                wl->irq_flags |= IRQF_ONESHOT;
6533
6534        ret = wl12xx_set_power_on(wl);
6535        if (ret < 0)
6536                goto out_free_nvs;
6537
6538        ret = wl12xx_get_hw_info(wl);
6539        if (ret < 0) {
6540                wl1271_error("couldn't get hw info");
6541                wl1271_power_off(wl);
6542                goto out_free_nvs;
6543        }
6544
6545        ret = request_threaded_irq(wl->irq, hardirq_fn, wlcore_irq,
6546                                   wl->irq_flags, pdev->name, wl);
6547        if (ret < 0) {
6548                wl1271_error("interrupt configuration failed");
6549                wl1271_power_off(wl);
6550                goto out_free_nvs;
6551        }
6552
6553#ifdef CONFIG_PM
6554        device_init_wakeup(wl->dev, true);
6555
6556        ret = enable_irq_wake(wl->irq);
6557        if (!ret) {
6558                wl->irq_wake_enabled = true;
6559                if (pdev_data->pwr_in_suspend)
6560                        wl->hw->wiphy->wowlan = &wlcore_wowlan_support;
6561        }
6562
6563        res = platform_get_resource(pdev, IORESOURCE_IRQ, 1);
6564        if (res) {
6565                wl->wakeirq = res->start;
6566                wl->wakeirq_flags = res->flags & IRQF_TRIGGER_MASK;
6567                ret = dev_pm_set_dedicated_wake_irq(wl->dev, wl->wakeirq);
6568                if (ret)
6569                        wl->wakeirq = -ENODEV;
6570        } else {
6571                wl->wakeirq = -ENODEV;
6572        }
6573#endif
6574        disable_irq(wl->irq);
6575        wl1271_power_off(wl);
6576
6577        ret = wl->ops->identify_chip(wl);
6578        if (ret < 0)
6579                goto out_irq;
6580
6581        ret = wl1271_init_ieee80211(wl);
6582        if (ret)
6583                goto out_irq;
6584
6585        ret = wl1271_register_hw(wl);
6586        if (ret)
6587                goto out_irq;
6588
6589        ret = wlcore_sysfs_init(wl);
6590        if (ret)
6591                goto out_unreg;
6592
6593        wl->initialized = true;
6594        goto out;
6595
6596out_unreg:
6597        wl1271_unregister_hw(wl);
6598
6599out_irq:
6600        if (wl->wakeirq >= 0)
6601                dev_pm_clear_wake_irq(wl->dev);
6602        device_init_wakeup(wl->dev, false);
6603        free_irq(wl->irq, wl);
6604
6605out_free_nvs:
6606        kfree(wl->nvs);
6607
6608out:
6609        release_firmware(fw);
6610        complete_all(&wl->nvs_loading_complete);
6611}
6612
6613static int __maybe_unused wlcore_runtime_suspend(struct device *dev)
6614{
6615        struct wl1271 *wl = dev_get_drvdata(dev);
6616        struct wl12xx_vif *wlvif;
6617        int error;
6618
6619        /* We do not enter elp sleep in PLT mode */
6620        if (wl->plt)
6621                return 0;
6622
6623        /* Nothing to do if no ELP mode requested */
6624        if (wl->sleep_auth != WL1271_PSM_ELP)
6625                return 0;
6626
6627        wl12xx_for_each_wlvif(wl, wlvif) {
6628                if (!test_bit(WLVIF_FLAG_IN_PS, &wlvif->flags) &&
6629                    test_bit(WLVIF_FLAG_IN_USE, &wlvif->flags))
6630                        return -EBUSY;
6631        }
6632
6633        wl1271_debug(DEBUG_PSM, "chip to elp");
6634        error = wlcore_raw_write32(wl, HW_ACCESS_ELP_CTRL_REG, ELPCTRL_SLEEP);
6635        if (error < 0) {
6636                wl12xx_queue_recovery_work(wl);
6637
6638                return error;
6639        }
6640
6641        set_bit(WL1271_FLAG_IN_ELP, &wl->flags);
6642
6643        return 0;
6644}
6645
6646static int __maybe_unused wlcore_runtime_resume(struct device *dev)
6647{
6648        struct wl1271 *wl = dev_get_drvdata(dev);
6649        DECLARE_COMPLETION_ONSTACK(compl);
6650        unsigned long flags;
6651        int ret;
6652        unsigned long start_time = jiffies;
6653        bool recovery = false;
6654
6655        /* Nothing to do if no ELP mode requested */
6656        if (!test_bit(WL1271_FLAG_IN_ELP, &wl->flags))
6657                return 0;
6658
6659        wl1271_debug(DEBUG_PSM, "waking up chip from elp");
6660
6661        spin_lock_irqsave(&wl->wl_lock, flags);
6662        wl->elp_compl = &compl;
6663        spin_unlock_irqrestore(&wl->wl_lock, flags);
6664
6665        ret = wlcore_raw_write32(wl, HW_ACCESS_ELP_CTRL_REG, ELPCTRL_WAKE_UP);
6666        if (ret < 0) {
6667                recovery = true;
6668        } else if (!test_bit(WL1271_FLAG_IRQ_RUNNING, &wl->flags)) {
6669                ret = wait_for_completion_timeout(&compl,
6670                        msecs_to_jiffies(WL1271_WAKEUP_TIMEOUT));
6671                if (ret == 0) {
6672                        wl1271_warning("ELP wakeup timeout!");
6673                        recovery = true;
6674                }
6675        }
6676
6677        spin_lock_irqsave(&wl->wl_lock, flags);
6678        wl->elp_compl = NULL;
6679        spin_unlock_irqrestore(&wl->wl_lock, flags);
6680        clear_bit(WL1271_FLAG_IN_ELP, &wl->flags);
6681
6682        if (recovery) {
6683                set_bit(WL1271_FLAG_INTENDED_FW_RECOVERY, &wl->flags);
6684                wl12xx_queue_recovery_work(wl);
6685        } else {
6686                wl1271_debug(DEBUG_PSM, "wakeup time: %u ms",
6687                             jiffies_to_msecs(jiffies - start_time));
6688        }
6689
6690        return 0;
6691}
6692
6693static const struct dev_pm_ops wlcore_pm_ops = {
6694        SET_RUNTIME_PM_OPS(wlcore_runtime_suspend,
6695                           wlcore_runtime_resume,
6696                           NULL)
6697};
6698
6699int wlcore_probe(struct wl1271 *wl, struct platform_device *pdev)
6700{
6701        struct wlcore_platdev_data *pdev_data = dev_get_platdata(&pdev->dev);
6702        const char *nvs_name;
6703        int ret = 0;
6704
6705        if (!wl->ops || !wl->ptable || !pdev_data)
6706                return -EINVAL;
6707
6708        wl->dev = &pdev->dev;
6709        wl->pdev = pdev;
6710        platform_set_drvdata(pdev, wl);
6711
6712        if (pdev_data->family && pdev_data->family->nvs_name) {
6713                nvs_name = pdev_data->family->nvs_name;
6714                ret = request_firmware_nowait(THIS_MODULE, FW_ACTION_UEVENT,
6715                                              nvs_name, &pdev->dev, GFP_KERNEL,
6716                                              wl, wlcore_nvs_cb);
6717                if (ret < 0) {
6718                        wl1271_error("request_firmware_nowait failed for %s: %d",
6719                                     nvs_name, ret);
6720                        complete_all(&wl->nvs_loading_complete);
6721                }
6722        } else {
6723                wlcore_nvs_cb(NULL, wl);
6724        }
6725
6726        wl->dev->driver->pm = &wlcore_pm_ops;
6727        pm_runtime_set_autosuspend_delay(wl->dev, 50);
6728        pm_runtime_use_autosuspend(wl->dev);
6729        pm_runtime_enable(wl->dev);
6730
6731        return ret;
6732}
6733EXPORT_SYMBOL_GPL(wlcore_probe);
6734
6735int wlcore_remove(struct platform_device *pdev)
6736{
6737        struct wlcore_platdev_data *pdev_data = dev_get_platdata(&pdev->dev);
6738        struct wl1271 *wl = platform_get_drvdata(pdev);
6739        int error;
6740
6741        error = pm_runtime_get_sync(wl->dev);
6742        if (error < 0)
6743                dev_warn(wl->dev, "PM runtime failed: %i\n", error);
6744
6745        wl->dev->driver->pm = NULL;
6746
6747        if (pdev_data->family && pdev_data->family->nvs_name)
6748                wait_for_completion(&wl->nvs_loading_complete);
6749        if (!wl->initialized)
6750                return 0;
6751
6752        if (wl->wakeirq >= 0) {
6753                dev_pm_clear_wake_irq(wl->dev);
6754                wl->wakeirq = -ENODEV;
6755        }
6756
6757        device_init_wakeup(wl->dev, false);
6758
6759        if (wl->irq_wake_enabled)
6760                disable_irq_wake(wl->irq);
6761
6762        wl1271_unregister_hw(wl);
6763
6764        pm_runtime_put_sync(wl->dev);
6765        pm_runtime_dont_use_autosuspend(wl->dev);
6766        pm_runtime_disable(wl->dev);
6767
6768        free_irq(wl->irq, wl);
6769        wlcore_free_hw(wl);
6770
6771        return 0;
6772}
6773EXPORT_SYMBOL_GPL(wlcore_remove);
6774
6775u32 wl12xx_debug_level = DEBUG_NONE;
6776EXPORT_SYMBOL_GPL(wl12xx_debug_level);
6777module_param_named(debug_level, wl12xx_debug_level, uint, 0600);
6778MODULE_PARM_DESC(debug_level, "wl12xx debugging level");
6779
6780module_param_named(fwlog, fwlog_param, charp, 0);
6781MODULE_PARM_DESC(fwlog,
6782                 "FW logger options: continuous, dbgpins or disable");
6783
6784module_param(fwlog_mem_blocks, int, 0600);
6785MODULE_PARM_DESC(fwlog_mem_blocks, "fwlog mem_blocks");
6786
6787module_param(bug_on_recovery, int, 0600);
6788MODULE_PARM_DESC(bug_on_recovery, "BUG() on fw recovery");
6789
6790module_param(no_recovery, int, 0600);
6791MODULE_PARM_DESC(no_recovery, "Prevent HW recovery. FW will remain stuck.");
6792
6793MODULE_LICENSE("GPL");
6794MODULE_AUTHOR("Luciano Coelho <coelho@ti.com>");
6795MODULE_AUTHOR("Juuso Oikarinen <juuso.oikarinen@nokia.com>");
6796