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