linux/drivers/net/wireless/wl12xx/main.c
<<
>>
Prefs
   1/*
   2 * This file is part of wl1271
   3 *
   4 * Copyright (C) 2008-2010 Nokia Corporation
   5 *
   6 * Contact: Luciano Coelho <luciano.coelho@nokia.com>
   7 *
   8 * This program is free software; you can redistribute it and/or
   9 * modify it under the terms of the GNU General Public License
  10 * version 2 as published by the Free Software Foundation.
  11 *
  12 * This program is distributed in the hope that it will be useful, but
  13 * WITHOUT ANY WARRANTY; without even the implied warranty of
  14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  15 * General Public License for more details.
  16 *
  17 * You should have received a copy of the GNU General Public License
  18 * along with this program; if not, write to the Free Software
  19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
  20 * 02110-1301 USA
  21 *
  22 */
  23
  24#include <linux/module.h>
  25#include <linux/firmware.h>
  26#include <linux/delay.h>
  27#include <linux/spi/spi.h>
  28#include <linux/crc32.h>
  29#include <linux/etherdevice.h>
  30#include <linux/vmalloc.h>
  31#include <linux/platform_device.h>
  32#include <linux/slab.h>
  33
  34#include "wl12xx.h"
  35#include "wl12xx_80211.h"
  36#include "reg.h"
  37#include "io.h"
  38#include "event.h"
  39#include "tx.h"
  40#include "rx.h"
  41#include "ps.h"
  42#include "init.h"
  43#include "debugfs.h"
  44#include "cmd.h"
  45#include "boot.h"
  46#include "testmode.h"
  47#include "scan.h"
  48
  49#define WL1271_BOOT_RETRIES 3
  50
  51static struct conf_drv_settings default_conf = {
  52        .sg = {
  53                .params = {
  54                        [CONF_SG_BT_PER_THRESHOLD]                  = 7500,
  55                        [CONF_SG_HV3_MAX_OVERRIDE]                  = 0,
  56                        [CONF_SG_BT_NFS_SAMPLE_INTERVAL]            = 400,
  57                        [CONF_SG_BT_LOAD_RATIO]                     = 50,
  58                        [CONF_SG_AUTO_PS_MODE]                      = 1,
  59                        [CONF_SG_AUTO_SCAN_PROBE_REQ]               = 170,
  60                        [CONF_SG_ACTIVE_SCAN_DURATION_FACTOR_HV3]   = 50,
  61                        [CONF_SG_ANTENNA_CONFIGURATION]             = 0,
  62                        [CONF_SG_BEACON_MISS_PERCENT]               = 60,
  63                        [CONF_SG_RATE_ADAPT_THRESH]                 = 12,
  64                        [CONF_SG_RATE_ADAPT_SNR]                    = 0,
  65                        [CONF_SG_WLAN_PS_BT_ACL_MASTER_MIN_BR]      = 10,
  66                        [CONF_SG_WLAN_PS_BT_ACL_MASTER_MAX_BR]      = 30,
  67                        [CONF_SG_WLAN_PS_MAX_BT_ACL_MASTER_BR]      = 8,
  68                        [CONF_SG_WLAN_PS_BT_ACL_SLAVE_MIN_BR]       = 20,
  69                        [CONF_SG_WLAN_PS_BT_ACL_SLAVE_MAX_BR]       = 50,
  70                        /* Note: with UPSD, this should be 4 */
  71                        [CONF_SG_WLAN_PS_MAX_BT_ACL_SLAVE_BR]       = 8,
  72                        [CONF_SG_WLAN_PS_BT_ACL_MASTER_MIN_EDR]     = 7,
  73                        [CONF_SG_WLAN_PS_BT_ACL_MASTER_MAX_EDR]     = 25,
  74                        [CONF_SG_WLAN_PS_MAX_BT_ACL_MASTER_EDR]     = 20,
  75                        /* Note: with UPDS, this should be 15 */
  76                        [CONF_SG_WLAN_PS_BT_ACL_SLAVE_MIN_EDR]      = 8,
  77                        /* Note: with UPDS, this should be 50 */
  78                        [CONF_SG_WLAN_PS_BT_ACL_SLAVE_MAX_EDR]      = 40,
  79                        /* Note: with UPDS, this should be 10 */
  80                        [CONF_SG_WLAN_PS_MAX_BT_ACL_SLAVE_EDR]      = 20,
  81                        [CONF_SG_RXT]                               = 1200,
  82                        [CONF_SG_TXT]                               = 1000,
  83                        [CONF_SG_ADAPTIVE_RXT_TXT]                  = 1,
  84                        [CONF_SG_PS_POLL_TIMEOUT]                   = 10,
  85                        [CONF_SG_UPSD_TIMEOUT]                      = 10,
  86                        [CONF_SG_WLAN_ACTIVE_BT_ACL_MASTER_MIN_EDR] = 7,
  87                        [CONF_SG_WLAN_ACTIVE_BT_ACL_MASTER_MAX_EDR] = 15,
  88                        [CONF_SG_WLAN_ACTIVE_MAX_BT_ACL_MASTER_EDR] = 15,
  89                        [CONF_SG_WLAN_ACTIVE_BT_ACL_SLAVE_MIN_EDR]  = 8,
  90                        [CONF_SG_WLAN_ACTIVE_BT_ACL_SLAVE_MAX_EDR]  = 20,
  91                        [CONF_SG_WLAN_ACTIVE_MAX_BT_ACL_SLAVE_EDR]  = 15,
  92                        [CONF_SG_WLAN_ACTIVE_BT_ACL_MIN_BR]         = 20,
  93                        [CONF_SG_WLAN_ACTIVE_BT_ACL_MAX_BR]         = 50,
  94                        [CONF_SG_WLAN_ACTIVE_MAX_BT_ACL_BR]         = 10,
  95                        [CONF_SG_PASSIVE_SCAN_DURATION_FACTOR_HV3]  = 200,
  96                        [CONF_SG_PASSIVE_SCAN_DURATION_FACTOR_A2DP] = 800,
  97                        [CONF_SG_PASSIVE_SCAN_A2DP_BT_TIME]         = 75,
  98                        [CONF_SG_PASSIVE_SCAN_A2DP_WLAN_TIME]       = 15,
  99                        [CONF_SG_HV3_MAX_SERVED]                    = 6,
 100                        [CONF_SG_DHCP_TIME]                         = 5000,
 101                        [CONF_SG_ACTIVE_SCAN_DURATION_FACTOR_A2DP]  = 100,
 102                },
 103                .state = CONF_SG_PROTECTIVE,
 104        },
 105        .rx = {
 106                .rx_msdu_life_time           = 512000,
 107                .packet_detection_threshold  = 0,
 108                .ps_poll_timeout             = 15,
 109                .upsd_timeout                = 15,
 110                .rts_threshold               = 2347,
 111                .rx_cca_threshold            = 0,
 112                .irq_blk_threshold           = 0xFFFF,
 113                .irq_pkt_threshold           = 0,
 114                .irq_timeout                 = 600,
 115                .queue_type                  = CONF_RX_QUEUE_TYPE_LOW_PRIORITY,
 116        },
 117        .tx = {
 118                .tx_energy_detection         = 0,
 119                .rc_conf                     = {
 120                        .enabled_rates       = 0,
 121                        .short_retry_limit   = 10,
 122                        .long_retry_limit    = 10,
 123                        .aflags              = 0
 124                },
 125                .ac_conf_count               = 4,
 126                .ac_conf                     = {
 127                        [CONF_TX_AC_BE] = {
 128                                .ac          = CONF_TX_AC_BE,
 129                                .cw_min      = 15,
 130                                .cw_max      = 63,
 131                                .aifsn       = 3,
 132                                .tx_op_limit = 0,
 133                        },
 134                        [CONF_TX_AC_BK] = {
 135                                .ac          = CONF_TX_AC_BK,
 136                                .cw_min      = 15,
 137                                .cw_max      = 63,
 138                                .aifsn       = 7,
 139                                .tx_op_limit = 0,
 140                        },
 141                        [CONF_TX_AC_VI] = {
 142                                .ac          = CONF_TX_AC_VI,
 143                                .cw_min      = 15,
 144                                .cw_max      = 63,
 145                                .aifsn       = CONF_TX_AIFS_PIFS,
 146                                .tx_op_limit = 3008,
 147                        },
 148                        [CONF_TX_AC_VO] = {
 149                                .ac          = CONF_TX_AC_VO,
 150                                .cw_min      = 15,
 151                                .cw_max      = 63,
 152                                .aifsn       = CONF_TX_AIFS_PIFS,
 153                                .tx_op_limit = 1504,
 154                        },
 155                },
 156                .tid_conf_count = 4,
 157                .tid_conf = {
 158                        [CONF_TX_AC_BE] = {
 159                                .queue_id    = CONF_TX_AC_BE,
 160                                .channel_type = CONF_CHANNEL_TYPE_EDCF,
 161                                .tsid        = CONF_TX_AC_BE,
 162                                .ps_scheme   = CONF_PS_SCHEME_LEGACY,
 163                                .ack_policy  = CONF_ACK_POLICY_LEGACY,
 164                                .apsd_conf   = {0, 0},
 165                        },
 166                        [CONF_TX_AC_BK] = {
 167                                .queue_id    = CONF_TX_AC_BK,
 168                                .channel_type = CONF_CHANNEL_TYPE_EDCF,
 169                                .tsid        = CONF_TX_AC_BK,
 170                                .ps_scheme   = CONF_PS_SCHEME_LEGACY,
 171                                .ack_policy  = CONF_ACK_POLICY_LEGACY,
 172                                .apsd_conf   = {0, 0},
 173                        },
 174                        [CONF_TX_AC_VI] = {
 175                                .queue_id    = CONF_TX_AC_VI,
 176                                .channel_type = CONF_CHANNEL_TYPE_EDCF,
 177                                .tsid        = CONF_TX_AC_VI,
 178                                .ps_scheme   = CONF_PS_SCHEME_LEGACY,
 179                                .ack_policy  = CONF_ACK_POLICY_LEGACY,
 180                                .apsd_conf   = {0, 0},
 181                        },
 182                        [CONF_TX_AC_VO] = {
 183                                .queue_id    = CONF_TX_AC_VO,
 184                                .channel_type = CONF_CHANNEL_TYPE_EDCF,
 185                                .tsid        = CONF_TX_AC_VO,
 186                                .ps_scheme   = CONF_PS_SCHEME_LEGACY,
 187                                .ack_policy  = CONF_ACK_POLICY_LEGACY,
 188                                .apsd_conf   = {0, 0},
 189                        },
 190                },
 191                .frag_threshold              = IEEE80211_MAX_FRAG_THRESHOLD,
 192                .tx_compl_timeout            = 700,
 193                .tx_compl_threshold          = 4,
 194                .basic_rate                  = CONF_HW_BIT_RATE_1MBPS,
 195                .basic_rate_5                = CONF_HW_BIT_RATE_6MBPS,
 196        },
 197        .conn = {
 198                .wake_up_event               = CONF_WAKE_UP_EVENT_DTIM,
 199                .listen_interval             = 1,
 200                .bcn_filt_mode               = CONF_BCN_FILT_MODE_ENABLED,
 201                .bcn_filt_ie_count           = 1,
 202                .bcn_filt_ie = {
 203                        [0] = {
 204                                .ie          = WLAN_EID_CHANNEL_SWITCH,
 205                                .rule        = CONF_BCN_RULE_PASS_ON_APPEARANCE,
 206                        }
 207                },
 208                .synch_fail_thold            = 10,
 209                .bss_lose_timeout            = 100,
 210                .beacon_rx_timeout           = 10000,
 211                .broadcast_timeout           = 20000,
 212                .rx_broadcast_in_ps          = 1,
 213                .ps_poll_threshold           = 10,
 214                .ps_poll_recovery_period     = 700,
 215                .bet_enable                  = CONF_BET_MODE_ENABLE,
 216                .bet_max_consecutive         = 10,
 217                .psm_entry_retries           = 5,
 218                .psm_entry_nullfunc_retries  = 3,
 219                .psm_entry_hangover_period   = 1,
 220                .keep_alive_interval         = 55000,
 221                .max_listen_interval         = 20,
 222        },
 223        .itrim = {
 224                .enable = false,
 225                .timeout = 50000,
 226        },
 227        .pm_config = {
 228                .host_clk_settling_time = 5000,
 229                .host_fast_wakeup_support = false
 230        },
 231        .roam_trigger = {
 232                .trigger_pacing               = 1,
 233                .avg_weight_rssi_beacon       = 20,
 234                .avg_weight_rssi_data         = 10,
 235                .avg_weight_snr_beacon        = 20,
 236                .avg_weight_snr_data          = 10
 237        },
 238        .scan = {
 239                .min_dwell_time_active        = 7500,
 240                .max_dwell_time_active        = 30000,
 241                .min_dwell_time_passive       = 30000,
 242                .max_dwell_time_passive       = 60000,
 243                .num_probe_reqs               = 2,
 244        },
 245        .rf = {
 246                .tx_per_channel_power_compensation_2 = {
 247                        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 248                },
 249                .tx_per_channel_power_compensation_5 = {
 250                        0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 251                        0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 252                        0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
 253                },
 254        },
 255};
 256
 257static void __wl1271_op_remove_interface(struct wl1271 *wl);
 258
 259
 260static void wl1271_device_release(struct device *dev)
 261{
 262
 263}
 264
 265static struct platform_device wl1271_device = {
 266        .name           = "wl1271",
 267        .id             = -1,
 268
 269        /* device model insists to have a release function */
 270        .dev            = {
 271                .release = wl1271_device_release,
 272        },
 273};
 274
 275static LIST_HEAD(wl_list);
 276
 277static int wl1271_dev_notify(struct notifier_block *me, unsigned long what,
 278                             void *arg)
 279{
 280        struct net_device *dev = arg;
 281        struct wireless_dev *wdev;
 282        struct wiphy *wiphy;
 283        struct ieee80211_hw *hw;
 284        struct wl1271 *wl;
 285        struct wl1271 *wl_temp;
 286        int ret = 0;
 287
 288        /* Check that this notification is for us. */
 289        if (what != NETDEV_CHANGE)
 290                return NOTIFY_DONE;
 291
 292        wdev = dev->ieee80211_ptr;
 293        if (wdev == NULL)
 294                return NOTIFY_DONE;
 295
 296        wiphy = wdev->wiphy;
 297        if (wiphy == NULL)
 298                return NOTIFY_DONE;
 299
 300        hw = wiphy_priv(wiphy);
 301        if (hw == NULL)
 302                return NOTIFY_DONE;
 303
 304        wl_temp = hw->priv;
 305        list_for_each_entry(wl, &wl_list, list) {
 306                if (wl == wl_temp)
 307                        break;
 308        }
 309        if (wl != wl_temp)
 310                return NOTIFY_DONE;
 311
 312        mutex_lock(&wl->mutex);
 313
 314        if (wl->state == WL1271_STATE_OFF)
 315                goto out;
 316
 317        if (!test_bit(WL1271_FLAG_STA_ASSOCIATED, &wl->flags))
 318                goto out;
 319
 320        ret = wl1271_ps_elp_wakeup(wl, false);
 321        if (ret < 0)
 322                goto out;
 323
 324        if ((dev->operstate == IF_OPER_UP) &&
 325            !test_and_set_bit(WL1271_FLAG_STA_STATE_SENT, &wl->flags)) {
 326                wl1271_cmd_set_sta_state(wl);
 327                wl1271_info("Association completed.");
 328        }
 329
 330        wl1271_ps_elp_sleep(wl);
 331
 332out:
 333        mutex_unlock(&wl->mutex);
 334
 335        return NOTIFY_OK;
 336}
 337
 338static int wl1271_reg_notify(struct wiphy *wiphy,
 339                             struct regulatory_request *request)
 340{
 341        struct ieee80211_supported_band *band;
 342        struct ieee80211_channel *ch;
 343        int i;
 344
 345        band = wiphy->bands[IEEE80211_BAND_5GHZ];
 346        for (i = 0; i < band->n_channels; i++) {
 347                ch = &band->channels[i];
 348                if (ch->flags & IEEE80211_CHAN_DISABLED)
 349                        continue;
 350
 351                if (ch->flags & IEEE80211_CHAN_RADAR)
 352                        ch->flags |= IEEE80211_CHAN_NO_IBSS |
 353                                     IEEE80211_CHAN_PASSIVE_SCAN;
 354
 355        }
 356
 357        return 0;
 358}
 359
 360static void wl1271_conf_init(struct wl1271 *wl)
 361{
 362
 363        /*
 364         * This function applies the default configuration to the driver. This
 365         * function is invoked upon driver load (spi probe.)
 366         *
 367         * The configuration is stored in a run-time structure in order to
 368         * facilitate for run-time adjustment of any of the parameters. Making
 369         * changes to the configuration structure will apply the new values on
 370         * the next interface up (wl1271_op_start.)
 371         */
 372
 373        /* apply driver default configuration */
 374        memcpy(&wl->conf, &default_conf, sizeof(default_conf));
 375}
 376
 377
 378static int wl1271_plt_init(struct wl1271 *wl)
 379{
 380        struct conf_tx_ac_category *conf_ac;
 381        struct conf_tx_tid *conf_tid;
 382        int ret, i;
 383
 384        ret = wl1271_cmd_general_parms(wl);
 385        if (ret < 0)
 386                return ret;
 387
 388        ret = wl1271_cmd_radio_parms(wl);
 389        if (ret < 0)
 390                return ret;
 391
 392        ret = wl1271_cmd_ext_radio_parms(wl);
 393        if (ret < 0)
 394                return ret;
 395
 396        ret = wl1271_init_templates_config(wl);
 397        if (ret < 0)
 398                return ret;
 399
 400        ret = wl1271_acx_init_mem_config(wl);
 401        if (ret < 0)
 402                return ret;
 403
 404        /* PHY layer config */
 405        ret = wl1271_init_phy_config(wl);
 406        if (ret < 0)
 407                goto out_free_memmap;
 408
 409        ret = wl1271_acx_dco_itrim_params(wl);
 410        if (ret < 0)
 411                goto out_free_memmap;
 412
 413        /* Initialize connection monitoring thresholds */
 414        ret = wl1271_acx_conn_monit_params(wl, false);
 415        if (ret < 0)
 416                goto out_free_memmap;
 417
 418        /* Bluetooth WLAN coexistence */
 419        ret = wl1271_init_pta(wl);
 420        if (ret < 0)
 421                goto out_free_memmap;
 422
 423        /* Energy detection */
 424        ret = wl1271_init_energy_detection(wl);
 425        if (ret < 0)
 426                goto out_free_memmap;
 427
 428        /* Default fragmentation threshold */
 429        ret = wl1271_acx_frag_threshold(wl, wl->conf.tx.frag_threshold);
 430        if (ret < 0)
 431                goto out_free_memmap;
 432
 433        /* Default TID/AC configuration */
 434        BUG_ON(wl->conf.tx.tid_conf_count != wl->conf.tx.ac_conf_count);
 435        for (i = 0; i < wl->conf.tx.tid_conf_count; i++) {
 436                conf_ac = &wl->conf.tx.ac_conf[i];
 437                ret = wl1271_acx_ac_cfg(wl, conf_ac->ac, conf_ac->cw_min,
 438                                        conf_ac->cw_max, conf_ac->aifsn,
 439                                        conf_ac->tx_op_limit);
 440                if (ret < 0)
 441                        goto out_free_memmap;
 442
 443                conf_tid = &wl->conf.tx.tid_conf[i];
 444                ret = wl1271_acx_tid_cfg(wl, conf_tid->queue_id,
 445                                         conf_tid->channel_type,
 446                                         conf_tid->tsid,
 447                                         conf_tid->ps_scheme,
 448                                         conf_tid->ack_policy,
 449                                         conf_tid->apsd_conf[0],
 450                                         conf_tid->apsd_conf[1]);
 451                if (ret < 0)
 452                        goto out_free_memmap;
 453        }
 454
 455        /* Enable data path */
 456        ret = wl1271_cmd_data_path(wl, 1);
 457        if (ret < 0)
 458                goto out_free_memmap;
 459
 460        /* Configure for CAM power saving (ie. always active) */
 461        ret = wl1271_acx_sleep_auth(wl, WL1271_PSM_CAM);
 462        if (ret < 0)
 463                goto out_free_memmap;
 464
 465        /* configure PM */
 466        ret = wl1271_acx_pm_config(wl);
 467        if (ret < 0)
 468                goto out_free_memmap;
 469
 470        return 0;
 471
 472 out_free_memmap:
 473        kfree(wl->target_mem_map);
 474        wl->target_mem_map = NULL;
 475
 476        return ret;
 477}
 478
 479static void wl1271_fw_status(struct wl1271 *wl,
 480                             struct wl1271_fw_status *status)
 481{
 482        struct timespec ts;
 483        u32 total = 0;
 484        int i;
 485
 486        wl1271_raw_read(wl, FW_STATUS_ADDR, status, sizeof(*status), false);
 487
 488        wl1271_debug(DEBUG_IRQ, "intr: 0x%x (fw_rx_counter = %d, "
 489                     "drv_rx_counter = %d, tx_results_counter = %d)",
 490                     status->intr,
 491                     status->fw_rx_counter,
 492                     status->drv_rx_counter,
 493                     status->tx_results_counter);
 494
 495        /* update number of available TX blocks */
 496        for (i = 0; i < NUM_TX_QUEUES; i++) {
 497                u32 cnt = le32_to_cpu(status->tx_released_blks[i]) -
 498                        wl->tx_blocks_freed[i];
 499
 500                wl->tx_blocks_freed[i] =
 501                        le32_to_cpu(status->tx_released_blks[i]);
 502                wl->tx_blocks_available += cnt;
 503                total += cnt;
 504        }
 505
 506        /* if more blocks are available now, tx work can be scheduled */
 507        if (total)
 508                clear_bit(WL1271_FLAG_FW_TX_BUSY, &wl->flags);
 509
 510        /* update the host-chipset time offset */
 511        getnstimeofday(&ts);
 512        wl->time_offset = (timespec_to_ns(&ts) >> 10) -
 513                (s64)le32_to_cpu(status->fw_localtime);
 514}
 515
 516#define WL1271_IRQ_MAX_LOOPS 10
 517
 518static void wl1271_irq_work(struct work_struct *work)
 519{
 520        int ret;
 521        u32 intr;
 522        int loopcount = WL1271_IRQ_MAX_LOOPS;
 523        unsigned long flags;
 524        struct wl1271 *wl =
 525                container_of(work, struct wl1271, irq_work);
 526
 527        mutex_lock(&wl->mutex);
 528
 529        wl1271_debug(DEBUG_IRQ, "IRQ work");
 530
 531        if (unlikely(wl->state == WL1271_STATE_OFF))
 532                goto out;
 533
 534        ret = wl1271_ps_elp_wakeup(wl, true);
 535        if (ret < 0)
 536                goto out;
 537
 538        spin_lock_irqsave(&wl->wl_lock, flags);
 539        while (test_bit(WL1271_FLAG_IRQ_PENDING, &wl->flags) && loopcount) {
 540                clear_bit(WL1271_FLAG_IRQ_PENDING, &wl->flags);
 541                spin_unlock_irqrestore(&wl->wl_lock, flags);
 542                loopcount--;
 543
 544                wl1271_fw_status(wl, wl->fw_status);
 545                intr = le32_to_cpu(wl->fw_status->intr);
 546                if (!intr) {
 547                        wl1271_debug(DEBUG_IRQ, "Zero interrupt received.");
 548                        spin_lock_irqsave(&wl->wl_lock, flags);
 549                        continue;
 550                }
 551
 552                intr &= WL1271_INTR_MASK;
 553
 554                if (unlikely(intr & WL1271_ACX_INTR_WATCHDOG)) {
 555                        wl1271_error("watchdog interrupt received! "
 556                                     "starting recovery.");
 557                        ieee80211_queue_work(wl->hw, &wl->recovery_work);
 558
 559                        /* restarting the chip. ignore any other interrupt. */
 560                        goto out;
 561                }
 562
 563                if (intr & WL1271_ACX_INTR_DATA) {
 564                        wl1271_debug(DEBUG_IRQ, "WL1271_ACX_INTR_DATA");
 565
 566                        /* check for tx results */
 567                        if (wl->fw_status->tx_results_counter !=
 568                            (wl->tx_results_count & 0xff))
 569                                wl1271_tx_complete(wl);
 570
 571                        /* Check if any tx blocks were freed */
 572                        if (!test_bit(WL1271_FLAG_FW_TX_BUSY, &wl->flags) &&
 573                            wl->tx_queue_count) {
 574                                /*
 575                                 * In order to avoid starvation of the TX path,
 576                                 * call the work function directly.
 577                                 */
 578                                wl1271_tx_work_locked(wl);
 579                        }
 580
 581                        wl1271_rx(wl, wl->fw_status);
 582                }
 583
 584                if (intr & WL1271_ACX_INTR_EVENT_A) {
 585                        wl1271_debug(DEBUG_IRQ, "WL1271_ACX_INTR_EVENT_A");
 586                        wl1271_event_handle(wl, 0);
 587                }
 588
 589                if (intr & WL1271_ACX_INTR_EVENT_B) {
 590                        wl1271_debug(DEBUG_IRQ, "WL1271_ACX_INTR_EVENT_B");
 591                        wl1271_event_handle(wl, 1);
 592                }
 593
 594                if (intr & WL1271_ACX_INTR_INIT_COMPLETE)
 595                        wl1271_debug(DEBUG_IRQ,
 596                                     "WL1271_ACX_INTR_INIT_COMPLETE");
 597
 598                if (intr & WL1271_ACX_INTR_HW_AVAILABLE)
 599                        wl1271_debug(DEBUG_IRQ, "WL1271_ACX_INTR_HW_AVAILABLE");
 600
 601                spin_lock_irqsave(&wl->wl_lock, flags);
 602        }
 603
 604        if (test_bit(WL1271_FLAG_IRQ_PENDING, &wl->flags))
 605                ieee80211_queue_work(wl->hw, &wl->irq_work);
 606        else
 607                clear_bit(WL1271_FLAG_IRQ_RUNNING, &wl->flags);
 608        spin_unlock_irqrestore(&wl->wl_lock, flags);
 609
 610        wl1271_ps_elp_sleep(wl);
 611
 612out:
 613        mutex_unlock(&wl->mutex);
 614}
 615
 616static int wl1271_fetch_firmware(struct wl1271 *wl)
 617{
 618        const struct firmware *fw;
 619        int ret;
 620
 621        ret = request_firmware(&fw, WL1271_FW_NAME, wl1271_wl_to_dev(wl));
 622
 623        if (ret < 0) {
 624                wl1271_error("could not get firmware: %d", ret);
 625                return ret;
 626        }
 627
 628        if (fw->size % 4) {
 629                wl1271_error("firmware size is not multiple of 32 bits: %zu",
 630                             fw->size);
 631                ret = -EILSEQ;
 632                goto out;
 633        }
 634
 635        wl->fw_len = fw->size;
 636        wl->fw = vmalloc(wl->fw_len);
 637
 638        if (!wl->fw) {
 639                wl1271_error("could not allocate memory for the firmware");
 640                ret = -ENOMEM;
 641                goto out;
 642        }
 643
 644        memcpy(wl->fw, fw->data, wl->fw_len);
 645
 646        ret = 0;
 647
 648out:
 649        release_firmware(fw);
 650
 651        return ret;
 652}
 653
 654static int wl1271_fetch_nvs(struct wl1271 *wl)
 655{
 656        const struct firmware *fw;
 657        int ret;
 658
 659        ret = request_firmware(&fw, WL1271_NVS_NAME, wl1271_wl_to_dev(wl));
 660
 661        if (ret < 0) {
 662                wl1271_error("could not get nvs file: %d", ret);
 663                return ret;
 664        }
 665
 666        wl->nvs = kmemdup(fw->data, sizeof(struct wl1271_nvs_file), GFP_KERNEL);
 667
 668        if (!wl->nvs) {
 669                wl1271_error("could not allocate memory for the nvs file");
 670                ret = -ENOMEM;
 671                goto out;
 672        }
 673
 674        wl->nvs_len = fw->size;
 675
 676out:
 677        release_firmware(fw);
 678
 679        return ret;
 680}
 681
 682static void wl1271_recovery_work(struct work_struct *work)
 683{
 684        struct wl1271 *wl =
 685                container_of(work, struct wl1271, recovery_work);
 686
 687        mutex_lock(&wl->mutex);
 688
 689        if (wl->state != WL1271_STATE_ON)
 690                goto out;
 691
 692        wl1271_info("Hardware recovery in progress.");
 693
 694        if (test_bit(WL1271_FLAG_STA_ASSOCIATED, &wl->flags))
 695                ieee80211_connection_loss(wl->vif);
 696
 697        /* reboot the chipset */
 698        __wl1271_op_remove_interface(wl);
 699        ieee80211_restart_hw(wl->hw);
 700
 701out:
 702        mutex_unlock(&wl->mutex);
 703}
 704
 705static void wl1271_fw_wakeup(struct wl1271 *wl)
 706{
 707        u32 elp_reg;
 708
 709        elp_reg = ELPCTRL_WAKE_UP;
 710        wl1271_raw_write32(wl, HW_ACCESS_ELP_CTRL_REG_ADDR, elp_reg);
 711}
 712
 713static int wl1271_setup(struct wl1271 *wl)
 714{
 715        wl->fw_status = kmalloc(sizeof(*wl->fw_status), GFP_KERNEL);
 716        if (!wl->fw_status)
 717                return -ENOMEM;
 718
 719        wl->tx_res_if = kmalloc(sizeof(*wl->tx_res_if), GFP_KERNEL);
 720        if (!wl->tx_res_if) {
 721                kfree(wl->fw_status);
 722                return -ENOMEM;
 723        }
 724
 725        return 0;
 726}
 727
 728static int wl1271_chip_wakeup(struct wl1271 *wl)
 729{
 730        struct wl1271_partition_set partition;
 731        int ret = 0;
 732
 733        msleep(WL1271_PRE_POWER_ON_SLEEP);
 734        ret = wl1271_power_on(wl);
 735        if (ret < 0)
 736                goto out;
 737        msleep(WL1271_POWER_ON_SLEEP);
 738        wl1271_io_reset(wl);
 739        wl1271_io_init(wl);
 740
 741        /* We don't need a real memory partition here, because we only want
 742         * to use the registers at this point. */
 743        memset(&partition, 0, sizeof(partition));
 744        partition.reg.start = REGISTERS_BASE;
 745        partition.reg.size = REGISTERS_DOWN_SIZE;
 746        wl1271_set_partition(wl, &partition);
 747
 748        /* ELP module wake up */
 749        wl1271_fw_wakeup(wl);
 750
 751        /* whal_FwCtrl_BootSm() */
 752
 753        /* 0. read chip id from CHIP_ID */
 754        wl->chip.id = wl1271_read32(wl, CHIP_ID_B);
 755
 756        /* 1. check if chip id is valid */
 757
 758        switch (wl->chip.id) {
 759        case CHIP_ID_1271_PG10:
 760                wl1271_warning("chip id 0x%x (1271 PG10) support is obsolete",
 761                               wl->chip.id);
 762
 763                ret = wl1271_setup(wl);
 764                if (ret < 0)
 765                        goto out;
 766                break;
 767        case CHIP_ID_1271_PG20:
 768                wl1271_debug(DEBUG_BOOT, "chip id 0x%x (1271 PG20)",
 769                             wl->chip.id);
 770
 771                ret = wl1271_setup(wl);
 772                if (ret < 0)
 773                        goto out;
 774                break;
 775        default:
 776                wl1271_warning("unsupported chip id: 0x%x", wl->chip.id);
 777                ret = -ENODEV;
 778                goto out;
 779        }
 780
 781        if (wl->fw == NULL) {
 782                ret = wl1271_fetch_firmware(wl);
 783                if (ret < 0)
 784                        goto out;
 785        }
 786
 787        /* No NVS from netlink, try to get it from the filesystem */
 788        if (wl->nvs == NULL) {
 789                ret = wl1271_fetch_nvs(wl);
 790                if (ret < 0)
 791                        goto out;
 792        }
 793
 794out:
 795        return ret;
 796}
 797
 798int wl1271_plt_start(struct wl1271 *wl)
 799{
 800        int retries = WL1271_BOOT_RETRIES;
 801        int ret;
 802
 803        mutex_lock(&wl->mutex);
 804
 805        wl1271_notice("power up");
 806
 807        if (wl->state != WL1271_STATE_OFF) {
 808                wl1271_error("cannot go into PLT state because not "
 809                             "in off state: %d", wl->state);
 810                ret = -EBUSY;
 811                goto out;
 812        }
 813
 814        while (retries) {
 815                retries--;
 816                ret = wl1271_chip_wakeup(wl);
 817                if (ret < 0)
 818                        goto power_off;
 819
 820                ret = wl1271_boot(wl);
 821                if (ret < 0)
 822                        goto power_off;
 823
 824                ret = wl1271_plt_init(wl);
 825                if (ret < 0)
 826                        goto irq_disable;
 827
 828                wl->state = WL1271_STATE_PLT;
 829                wl1271_notice("firmware booted in PLT mode (%s)",
 830                              wl->chip.fw_ver);
 831                goto out;
 832
 833irq_disable:
 834                wl1271_disable_interrupts(wl);
 835                mutex_unlock(&wl->mutex);
 836                /* Unlocking the mutex in the middle of handling is
 837                   inherently unsafe. In this case we deem it safe to do,
 838                   because we need to let any possibly pending IRQ out of
 839                   the system (and while we are WL1271_STATE_OFF the IRQ
 840                   work function will not do anything.) Also, any other
 841                   possible concurrent operations will fail due to the
 842                   current state, hence the wl1271 struct should be safe. */
 843                cancel_work_sync(&wl->irq_work);
 844                mutex_lock(&wl->mutex);
 845power_off:
 846                wl1271_power_off(wl);
 847        }
 848
 849        wl1271_error("firmware boot in PLT mode failed despite %d retries",
 850                     WL1271_BOOT_RETRIES);
 851out:
 852        mutex_unlock(&wl->mutex);
 853
 854        return ret;
 855}
 856
 857int wl1271_plt_stop(struct wl1271 *wl)
 858{
 859        int ret = 0;
 860
 861        mutex_lock(&wl->mutex);
 862
 863        wl1271_notice("power down");
 864
 865        if (wl->state != WL1271_STATE_PLT) {
 866                wl1271_error("cannot power down because not in PLT "
 867                             "state: %d", wl->state);
 868                ret = -EBUSY;
 869                goto out;
 870        }
 871
 872        wl1271_disable_interrupts(wl);
 873        wl1271_power_off(wl);
 874
 875        wl->state = WL1271_STATE_OFF;
 876        wl->rx_counter = 0;
 877
 878out:
 879        mutex_unlock(&wl->mutex);
 880
 881        cancel_work_sync(&wl->irq_work);
 882        cancel_work_sync(&wl->recovery_work);
 883
 884        return ret;
 885}
 886
 887static int wl1271_op_tx(struct ieee80211_hw *hw, struct sk_buff *skb)
 888{
 889        struct wl1271 *wl = hw->priv;
 890        struct ieee80211_conf *conf = &hw->conf;
 891        struct ieee80211_tx_info *txinfo = IEEE80211_SKB_CB(skb);
 892        struct ieee80211_sta *sta = txinfo->control.sta;
 893        unsigned long flags;
 894        int q;
 895
 896        /*
 897         * peek into the rates configured in the STA entry.
 898         * The rates set after connection stage, The first block only BG sets:
 899         * the compare is for bit 0-16 of sta_rate_set. The second block add
 900         * HT rates in case of HT supported.
 901         */
 902        spin_lock_irqsave(&wl->wl_lock, flags);
 903        if (sta &&
 904            (sta->supp_rates[conf->channel->band] !=
 905            (wl->sta_rate_set & HW_BG_RATES_MASK))) {
 906                wl->sta_rate_set = sta->supp_rates[conf->channel->band];
 907                set_bit(WL1271_FLAG_STA_RATES_CHANGED, &wl->flags);
 908        }
 909
 910#ifdef CONFIG_WL12XX_HT
 911        if (sta &&
 912            sta->ht_cap.ht_supported &&
 913            ((wl->sta_rate_set >> HW_HT_RATES_OFFSET) !=
 914              sta->ht_cap.mcs.rx_mask[0])) {
 915                /* Clean MCS bits before setting them */
 916                wl->sta_rate_set &= HW_BG_RATES_MASK;
 917                wl->sta_rate_set |=
 918                        (sta->ht_cap.mcs.rx_mask[0] << HW_HT_RATES_OFFSET);
 919                set_bit(WL1271_FLAG_STA_RATES_CHANGED, &wl->flags);
 920        }
 921#endif
 922        wl->tx_queue_count++;
 923        spin_unlock_irqrestore(&wl->wl_lock, flags);
 924
 925        /* queue the packet */
 926        q = wl1271_tx_get_queue(skb_get_queue_mapping(skb));
 927        skb_queue_tail(&wl->tx_queue[q], skb);
 928
 929        /*
 930         * The chip specific setup must run before the first TX packet -
 931         * before that, the tx_work will not be initialized!
 932         */
 933
 934        if (!test_bit(WL1271_FLAG_FW_TX_BUSY, &wl->flags))
 935                ieee80211_queue_work(wl->hw, &wl->tx_work);
 936
 937        /*
 938         * The workqueue is slow to process the tx_queue and we need stop
 939         * the queue here, otherwise the queue will get too long.
 940         */
 941        if (wl->tx_queue_count >= WL1271_TX_QUEUE_HIGH_WATERMARK) {
 942                wl1271_debug(DEBUG_TX, "op_tx: stopping queues");
 943
 944                spin_lock_irqsave(&wl->wl_lock, flags);
 945                ieee80211_stop_queues(wl->hw);
 946                set_bit(WL1271_FLAG_TX_QUEUE_STOPPED, &wl->flags);
 947                spin_unlock_irqrestore(&wl->wl_lock, flags);
 948        }
 949
 950        return NETDEV_TX_OK;
 951}
 952
 953static struct notifier_block wl1271_dev_notifier = {
 954        .notifier_call = wl1271_dev_notify,
 955};
 956
 957static int wl1271_op_start(struct ieee80211_hw *hw)
 958{
 959        wl1271_debug(DEBUG_MAC80211, "mac80211 start");
 960
 961        /*
 962         * We have to delay the booting of the hardware because
 963         * we need to know the local MAC address before downloading and
 964         * initializing the firmware. The MAC address cannot be changed
 965         * after boot, and without the proper MAC address, the firmware
 966         * will not function properly.
 967         *
 968         * The MAC address is first known when the corresponding interface
 969         * is added. That is where we will initialize the hardware.
 970         */
 971
 972        return 0;
 973}
 974
 975static void wl1271_op_stop(struct ieee80211_hw *hw)
 976{
 977        wl1271_debug(DEBUG_MAC80211, "mac80211 stop");
 978}
 979
 980static int wl1271_op_add_interface(struct ieee80211_hw *hw,
 981                                   struct ieee80211_vif *vif)
 982{
 983        struct wl1271 *wl = hw->priv;
 984        struct wiphy *wiphy = hw->wiphy;
 985        int retries = WL1271_BOOT_RETRIES;
 986        int ret = 0;
 987        bool booted = false;
 988
 989        wl1271_debug(DEBUG_MAC80211, "mac80211 add interface type %d mac %pM",
 990                     vif->type, vif->addr);
 991
 992        mutex_lock(&wl->mutex);
 993        if (wl->vif) {
 994                wl1271_debug(DEBUG_MAC80211,
 995                             "multiple vifs are not supported yet");
 996                ret = -EBUSY;
 997                goto out;
 998        }
 999
1000        switch (vif->type) {
1001        case NL80211_IFTYPE_STATION:
1002                wl->bss_type = BSS_TYPE_STA_BSS;
1003                wl->set_bss_type = BSS_TYPE_STA_BSS;
1004                break;
1005        case NL80211_IFTYPE_ADHOC:
1006                wl->bss_type = BSS_TYPE_IBSS;
1007                wl->set_bss_type = BSS_TYPE_STA_BSS;
1008                break;
1009        default:
1010                ret = -EOPNOTSUPP;
1011                goto out;
1012        }
1013
1014        memcpy(wl->mac_addr, vif->addr, ETH_ALEN);
1015
1016        if (wl->state != WL1271_STATE_OFF) {
1017                wl1271_error("cannot start because not in off state: %d",
1018                             wl->state);
1019                ret = -EBUSY;
1020                goto out;
1021        }
1022
1023        while (retries) {
1024                retries--;
1025                ret = wl1271_chip_wakeup(wl);
1026                if (ret < 0)
1027                        goto power_off;
1028
1029                ret = wl1271_boot(wl);
1030                if (ret < 0)
1031                        goto power_off;
1032
1033                ret = wl1271_hw_init(wl);
1034                if (ret < 0)
1035                        goto irq_disable;
1036
1037                booted = true;
1038                break;
1039
1040irq_disable:
1041                wl1271_disable_interrupts(wl);
1042                mutex_unlock(&wl->mutex);
1043                /* Unlocking the mutex in the middle of handling is
1044                   inherently unsafe. In this case we deem it safe to do,
1045                   because we need to let any possibly pending IRQ out of
1046                   the system (and while we are WL1271_STATE_OFF the IRQ
1047                   work function will not do anything.) Also, any other
1048                   possible concurrent operations will fail due to the
1049                   current state, hence the wl1271 struct should be safe. */
1050                cancel_work_sync(&wl->irq_work);
1051                mutex_lock(&wl->mutex);
1052power_off:
1053                wl1271_power_off(wl);
1054        }
1055
1056        if (!booted) {
1057                wl1271_error("firmware boot failed despite %d retries",
1058                             WL1271_BOOT_RETRIES);
1059                goto out;
1060        }
1061
1062        wl->vif = vif;
1063        wl->state = WL1271_STATE_ON;
1064        wl1271_info("firmware booted (%s)", wl->chip.fw_ver);
1065
1066        /* update hw/fw version info in wiphy struct */
1067        wiphy->hw_version = wl->chip.id;
1068        strncpy(wiphy->fw_version, wl->chip.fw_ver,
1069                sizeof(wiphy->fw_version));
1070
1071        /*
1072         * Now we know if 11a is supported (info from the NVS), so disable
1073         * 11a channels if not supported
1074         */
1075        if (!wl->enable_11a)
1076                wiphy->bands[IEEE80211_BAND_5GHZ]->n_channels = 0;
1077
1078        wl1271_debug(DEBUG_MAC80211, "11a is %ssupported",
1079                     wl->enable_11a ? "" : "not ");
1080
1081out:
1082        mutex_unlock(&wl->mutex);
1083
1084        if (!ret)
1085                list_add(&wl->list, &wl_list);
1086
1087        return ret;
1088}
1089
1090static void __wl1271_op_remove_interface(struct wl1271 *wl)
1091{
1092        int i;
1093
1094        wl1271_debug(DEBUG_MAC80211, "mac80211 remove interface");
1095
1096        wl1271_info("down");
1097
1098        list_del(&wl->list);
1099
1100        WARN_ON(wl->state != WL1271_STATE_ON);
1101
1102        /* enable dyn ps just in case (if left on due to fw crash etc) */
1103        if (wl->bss_type == BSS_TYPE_STA_BSS)
1104                ieee80211_enable_dyn_ps(wl->vif);
1105
1106        if (wl->scan.state != WL1271_SCAN_STATE_IDLE) {
1107                wl->scan.state = WL1271_SCAN_STATE_IDLE;
1108                kfree(wl->scan.scanned_ch);
1109                wl->scan.scanned_ch = NULL;
1110                wl->scan.req = NULL;
1111                ieee80211_scan_completed(wl->hw, true);
1112        }
1113
1114        wl->state = WL1271_STATE_OFF;
1115
1116        wl1271_disable_interrupts(wl);
1117
1118        mutex_unlock(&wl->mutex);
1119
1120        cancel_delayed_work_sync(&wl->scan_complete_work);
1121        cancel_work_sync(&wl->irq_work);
1122        cancel_work_sync(&wl->tx_work);
1123        cancel_delayed_work_sync(&wl->pspoll_work);
1124        cancel_delayed_work_sync(&wl->elp_work);
1125
1126        mutex_lock(&wl->mutex);
1127
1128        /* let's notify MAC80211 about the remaining pending TX frames */
1129        wl1271_tx_reset(wl);
1130        wl1271_power_off(wl);
1131
1132        memset(wl->bssid, 0, ETH_ALEN);
1133        memset(wl->ssid, 0, IW_ESSID_MAX_SIZE + 1);
1134        wl->ssid_len = 0;
1135        wl->bss_type = MAX_BSS_TYPE;
1136        wl->set_bss_type = MAX_BSS_TYPE;
1137        wl->band = IEEE80211_BAND_2GHZ;
1138
1139        wl->rx_counter = 0;
1140        wl->psm_entry_retry = 0;
1141        wl->power_level = WL1271_DEFAULT_POWER_LEVEL;
1142        wl->tx_blocks_available = 0;
1143        wl->tx_results_count = 0;
1144        wl->tx_packets_count = 0;
1145        wl->tx_security_last_seq = 0;
1146        wl->tx_security_seq = 0;
1147        wl->time_offset = 0;
1148        wl->session_counter = 0;
1149        wl->rate_set = CONF_TX_RATE_MASK_BASIC;
1150        wl->sta_rate_set = 0;
1151        wl->flags = 0;
1152        wl->vif = NULL;
1153        wl->filters = 0;
1154
1155        for (i = 0; i < NUM_TX_QUEUES; i++)
1156                wl->tx_blocks_freed[i] = 0;
1157
1158        wl1271_debugfs_reset(wl);
1159
1160        kfree(wl->fw_status);
1161        wl->fw_status = NULL;
1162        kfree(wl->tx_res_if);
1163        wl->tx_res_if = NULL;
1164        kfree(wl->target_mem_map);
1165        wl->target_mem_map = NULL;
1166}
1167
1168static void wl1271_op_remove_interface(struct ieee80211_hw *hw,
1169                                       struct ieee80211_vif *vif)
1170{
1171        struct wl1271 *wl = hw->priv;
1172
1173        mutex_lock(&wl->mutex);
1174        /*
1175         * wl->vif can be null here if someone shuts down the interface
1176         * just when hardware recovery has been started.
1177         */
1178        if (wl->vif) {
1179                WARN_ON(wl->vif != vif);
1180                __wl1271_op_remove_interface(wl);
1181        }
1182
1183        mutex_unlock(&wl->mutex);
1184        cancel_work_sync(&wl->recovery_work);
1185}
1186
1187static void wl1271_configure_filters(struct wl1271 *wl, unsigned int filters)
1188{
1189        wl->rx_config = WL1271_DEFAULT_RX_CONFIG;
1190        wl->rx_filter = WL1271_DEFAULT_RX_FILTER;
1191
1192        /* combine requested filters with current filter config */
1193        filters = wl->filters | filters;
1194
1195        wl1271_debug(DEBUG_FILTERS, "RX filters set: ");
1196
1197        if (filters & FIF_PROMISC_IN_BSS) {
1198                wl1271_debug(DEBUG_FILTERS, " - FIF_PROMISC_IN_BSS");
1199                wl->rx_config &= ~CFG_UNI_FILTER_EN;
1200                wl->rx_config |= CFG_BSSID_FILTER_EN;
1201        }
1202        if (filters & FIF_BCN_PRBRESP_PROMISC) {
1203                wl1271_debug(DEBUG_FILTERS, " - FIF_BCN_PRBRESP_PROMISC");
1204                wl->rx_config &= ~CFG_BSSID_FILTER_EN;
1205                wl->rx_config &= ~CFG_SSID_FILTER_EN;
1206        }
1207        if (filters & FIF_OTHER_BSS) {
1208                wl1271_debug(DEBUG_FILTERS, " - FIF_OTHER_BSS");
1209                wl->rx_config &= ~CFG_BSSID_FILTER_EN;
1210        }
1211        if (filters & FIF_CONTROL) {
1212                wl1271_debug(DEBUG_FILTERS, " - FIF_CONTROL");
1213                wl->rx_filter |= CFG_RX_CTL_EN;
1214        }
1215        if (filters & FIF_FCSFAIL) {
1216                wl1271_debug(DEBUG_FILTERS, " - FIF_FCSFAIL");
1217                wl->rx_filter |= CFG_RX_FCS_ERROR;
1218        }
1219}
1220
1221static int wl1271_dummy_join(struct wl1271 *wl)
1222{
1223        int ret = 0;
1224        /* we need to use a dummy BSSID for now */
1225        static const u8 dummy_bssid[ETH_ALEN] = { 0x0b, 0xad, 0xde,
1226                                                  0xad, 0xbe, 0xef };
1227
1228        memcpy(wl->bssid, dummy_bssid, ETH_ALEN);
1229
1230        /* pass through frames from all BSS */
1231        wl1271_configure_filters(wl, FIF_OTHER_BSS);
1232
1233        ret = wl1271_cmd_join(wl, wl->set_bss_type);
1234        if (ret < 0)
1235                goto out;
1236
1237        set_bit(WL1271_FLAG_JOINED, &wl->flags);
1238
1239out:
1240        return ret;
1241}
1242
1243static int wl1271_join(struct wl1271 *wl, bool set_assoc)
1244{
1245        int ret;
1246
1247        /*
1248         * One of the side effects of the JOIN command is that is clears
1249         * WPA/WPA2 keys from the chipset. Performing a JOIN while associated
1250         * to a WPA/WPA2 access point will therefore kill the data-path.
1251         * Currently there is no supported scenario for JOIN during
1252         * association - if it becomes a supported scenario, the WPA/WPA2 keys
1253         * must be handled somehow.
1254         *
1255         */
1256        if (test_bit(WL1271_FLAG_STA_ASSOCIATED, &wl->flags))
1257                wl1271_info("JOIN while associated.");
1258
1259        if (set_assoc)
1260                set_bit(WL1271_FLAG_STA_ASSOCIATED, &wl->flags);
1261
1262        ret = wl1271_cmd_join(wl, wl->set_bss_type);
1263        if (ret < 0)
1264                goto out;
1265
1266        set_bit(WL1271_FLAG_JOINED, &wl->flags);
1267
1268        if (!test_bit(WL1271_FLAG_STA_ASSOCIATED, &wl->flags))
1269                goto out;
1270
1271        /*
1272         * The join command disable the keep-alive mode, shut down its process,
1273         * and also clear the template config, so we need to reset it all after
1274         * the join. The acx_aid starts the keep-alive process, and the order
1275         * of the commands below is relevant.
1276         */
1277        ret = wl1271_acx_keep_alive_mode(wl, true);
1278        if (ret < 0)
1279                goto out;
1280
1281        ret = wl1271_acx_aid(wl, wl->aid);
1282        if (ret < 0)
1283                goto out;
1284
1285        ret = wl1271_cmd_build_klv_null_data(wl);
1286        if (ret < 0)
1287                goto out;
1288
1289        ret = wl1271_acx_keep_alive_config(wl, CMD_TEMPL_KLV_IDX_NULL_DATA,
1290                                           ACX_KEEP_ALIVE_TPL_VALID);
1291        if (ret < 0)
1292                goto out;
1293
1294out:
1295        return ret;
1296}
1297
1298static int wl1271_unjoin(struct wl1271 *wl)
1299{
1300        int ret;
1301
1302        /* to stop listening to a channel, we disconnect */
1303        ret = wl1271_cmd_disconnect(wl);
1304        if (ret < 0)
1305                goto out;
1306
1307        clear_bit(WL1271_FLAG_JOINED, &wl->flags);
1308        memset(wl->bssid, 0, ETH_ALEN);
1309
1310        /* stop filterting packets based on bssid */
1311        wl1271_configure_filters(wl, FIF_OTHER_BSS);
1312
1313out:
1314        return ret;
1315}
1316
1317static void wl1271_set_band_rate(struct wl1271 *wl)
1318{
1319        if (wl->band == IEEE80211_BAND_2GHZ)
1320                wl->basic_rate_set = wl->conf.tx.basic_rate;
1321        else
1322                wl->basic_rate_set = wl->conf.tx.basic_rate_5;
1323}
1324
1325static u32 wl1271_min_rate_get(struct wl1271 *wl)
1326{
1327        int i;
1328        u32 rate = 0;
1329
1330        if (!wl->basic_rate_set) {
1331                WARN_ON(1);
1332                wl->basic_rate_set = wl->conf.tx.basic_rate;
1333        }
1334
1335        for (i = 0; !rate; i++) {
1336                if ((wl->basic_rate_set >> i) & 0x1)
1337                        rate = 1 << i;
1338        }
1339
1340        return rate;
1341}
1342
1343static int wl1271_handle_idle(struct wl1271 *wl, bool idle)
1344{
1345        int ret;
1346
1347        if (idle) {
1348                if (test_bit(WL1271_FLAG_JOINED, &wl->flags)) {
1349                        ret = wl1271_unjoin(wl);
1350                        if (ret < 0)
1351                                goto out;
1352                }
1353                wl->rate_set = wl1271_min_rate_get(wl);
1354                wl->sta_rate_set = 0;
1355                ret = wl1271_acx_rate_policies(wl);
1356                if (ret < 0)
1357                        goto out;
1358                ret = wl1271_acx_keep_alive_config(
1359                        wl, CMD_TEMPL_KLV_IDX_NULL_DATA,
1360                        ACX_KEEP_ALIVE_TPL_INVALID);
1361                if (ret < 0)
1362                        goto out;
1363                set_bit(WL1271_FLAG_IDLE, &wl->flags);
1364        } else {
1365                /* increment the session counter */
1366                wl->session_counter++;
1367                if (wl->session_counter >= SESSION_COUNTER_MAX)
1368                        wl->session_counter = 0;
1369                ret = wl1271_dummy_join(wl);
1370                if (ret < 0)
1371                        goto out;
1372                clear_bit(WL1271_FLAG_IDLE, &wl->flags);
1373        }
1374
1375out:
1376        return ret;
1377}
1378
1379static int wl1271_op_config(struct ieee80211_hw *hw, u32 changed)
1380{
1381        struct wl1271 *wl = hw->priv;
1382        struct ieee80211_conf *conf = &hw->conf;
1383        int channel, ret = 0;
1384
1385        channel = ieee80211_frequency_to_channel(conf->channel->center_freq);
1386
1387        wl1271_debug(DEBUG_MAC80211, "mac80211 config ch %d psm %s power %d %s",
1388                     channel,
1389                     conf->flags & IEEE80211_CONF_PS ? "on" : "off",
1390                     conf->power_level,
1391                     conf->flags & IEEE80211_CONF_IDLE ? "idle" : "in use");
1392
1393        /*
1394         * mac80211 will go to idle nearly immediately after transmitting some
1395         * frames, such as the deauth. To make sure those frames reach the air,
1396         * wait here until the TX queue is fully flushed.
1397         */
1398        if ((changed & IEEE80211_CONF_CHANGE_IDLE) &&
1399            (conf->flags & IEEE80211_CONF_IDLE))
1400                wl1271_tx_flush(wl);
1401
1402        mutex_lock(&wl->mutex);
1403
1404        if (unlikely(wl->state == WL1271_STATE_OFF)) {
1405                ret = -EAGAIN;
1406                goto out;
1407        }
1408
1409        ret = wl1271_ps_elp_wakeup(wl, false);
1410        if (ret < 0)
1411                goto out;
1412
1413        /* if the channel changes while joined, join again */
1414        if (changed & IEEE80211_CONF_CHANGE_CHANNEL &&
1415            ((wl->band != conf->channel->band) ||
1416             (wl->channel != channel))) {
1417                wl->band = conf->channel->band;
1418                wl->channel = channel;
1419
1420                /*
1421                 * FIXME: the mac80211 should really provide a fixed rate
1422                 * to use here. for now, just use the smallest possible rate
1423                 * for the band as a fixed rate for association frames and
1424                 * other control messages.
1425                 */
1426                if (!test_bit(WL1271_FLAG_STA_ASSOCIATED, &wl->flags))
1427                        wl1271_set_band_rate(wl);
1428
1429                wl->basic_rate = wl1271_min_rate_get(wl);
1430                ret = wl1271_acx_rate_policies(wl);
1431                if (ret < 0)
1432                        wl1271_warning("rate policy for update channel "
1433                                       "failed %d", ret);
1434
1435                if (test_bit(WL1271_FLAG_JOINED, &wl->flags)) {
1436                        ret = wl1271_join(wl, false);
1437                        if (ret < 0)
1438                                wl1271_warning("cmd join to update channel "
1439                                               "failed %d", ret);
1440                }
1441        }
1442
1443        if (changed & IEEE80211_CONF_CHANGE_IDLE) {
1444                ret = wl1271_handle_idle(wl, conf->flags & IEEE80211_CONF_IDLE);
1445                if (ret < 0)
1446                        wl1271_warning("idle mode change failed %d", ret);
1447        }
1448
1449        /*
1450         * if mac80211 changes the PSM mode, make sure the mode is not
1451         * incorrectly changed after the pspoll failure active window.
1452         */
1453        if (changed & IEEE80211_CONF_CHANGE_PS)
1454                clear_bit(WL1271_FLAG_PSPOLL_FAILURE, &wl->flags);
1455
1456        if (conf->flags & IEEE80211_CONF_PS &&
1457            !test_bit(WL1271_FLAG_PSM_REQUESTED, &wl->flags)) {
1458                set_bit(WL1271_FLAG_PSM_REQUESTED, &wl->flags);
1459
1460                /*
1461                 * We enter PSM only if we're already associated.
1462                 * If we're not, we'll enter it when joining an SSID,
1463                 * through the bss_info_changed() hook.
1464                 */
1465                if (test_bit(WL1271_FLAG_STA_ASSOCIATED, &wl->flags)) {
1466                        wl1271_debug(DEBUG_PSM, "psm enabled");
1467                        ret = wl1271_ps_set_mode(wl, STATION_POWER_SAVE_MODE,
1468                                                 wl->basic_rate, true);
1469                }
1470        } else if (!(conf->flags & IEEE80211_CONF_PS) &&
1471                   test_bit(WL1271_FLAG_PSM_REQUESTED, &wl->flags)) {
1472                wl1271_debug(DEBUG_PSM, "psm disabled");
1473
1474                clear_bit(WL1271_FLAG_PSM_REQUESTED, &wl->flags);
1475
1476                if (test_bit(WL1271_FLAG_PSM, &wl->flags))
1477                        ret = wl1271_ps_set_mode(wl, STATION_ACTIVE_MODE,
1478                                                 wl->basic_rate, true);
1479        }
1480
1481        if (conf->power_level != wl->power_level) {
1482                ret = wl1271_acx_tx_power(wl, conf->power_level);
1483                if (ret < 0)
1484                        goto out_sleep;
1485
1486                wl->power_level = conf->power_level;
1487        }
1488
1489out_sleep:
1490        wl1271_ps_elp_sleep(wl);
1491
1492out:
1493        mutex_unlock(&wl->mutex);
1494
1495        return ret;
1496}
1497
1498struct wl1271_filter_params {
1499        bool enabled;
1500        int mc_list_length;
1501        u8 mc_list[ACX_MC_ADDRESS_GROUP_MAX][ETH_ALEN];
1502};
1503
1504static u64 wl1271_op_prepare_multicast(struct ieee80211_hw *hw,
1505                                       struct netdev_hw_addr_list *mc_list)
1506{
1507        struct wl1271_filter_params *fp;
1508        struct netdev_hw_addr *ha;
1509        struct wl1271 *wl = hw->priv;
1510
1511        if (unlikely(wl->state == WL1271_STATE_OFF))
1512                return 0;
1513
1514        fp = kzalloc(sizeof(*fp), GFP_ATOMIC);
1515        if (!fp) {
1516                wl1271_error("Out of memory setting filters.");
1517                return 0;
1518        }
1519
1520        /* update multicast filtering parameters */
1521        fp->mc_list_length = 0;
1522        if (netdev_hw_addr_list_count(mc_list) > ACX_MC_ADDRESS_GROUP_MAX) {
1523                fp->enabled = false;
1524        } else {
1525                fp->enabled = true;
1526                netdev_hw_addr_list_for_each(ha, mc_list) {
1527                        memcpy(fp->mc_list[fp->mc_list_length],
1528                                        ha->addr, ETH_ALEN);
1529                        fp->mc_list_length++;
1530                }
1531        }
1532
1533        return (u64)(unsigned long)fp;
1534}
1535
1536#define WL1271_SUPPORTED_FILTERS (FIF_PROMISC_IN_BSS | \
1537                                  FIF_ALLMULTI | \
1538                                  FIF_FCSFAIL | \
1539                                  FIF_BCN_PRBRESP_PROMISC | \
1540                                  FIF_CONTROL | \
1541                                  FIF_OTHER_BSS)
1542
1543static void wl1271_op_configure_filter(struct ieee80211_hw *hw,
1544                                       unsigned int changed,
1545                                       unsigned int *total, u64 multicast)
1546{
1547        struct wl1271_filter_params *fp = (void *)(unsigned long)multicast;
1548        struct wl1271 *wl = hw->priv;
1549        int ret;
1550
1551        wl1271_debug(DEBUG_MAC80211, "mac80211 configure filter");
1552
1553        mutex_lock(&wl->mutex);
1554
1555        *total &= WL1271_SUPPORTED_FILTERS;
1556        changed &= WL1271_SUPPORTED_FILTERS;
1557
1558        if (unlikely(wl->state == WL1271_STATE_OFF))
1559                goto out;
1560
1561        ret = wl1271_ps_elp_wakeup(wl, false);
1562        if (ret < 0)
1563                goto out;
1564
1565
1566        if (*total & FIF_ALLMULTI)
1567                ret = wl1271_acx_group_address_tbl(wl, false, NULL, 0);
1568        else if (fp)
1569                ret = wl1271_acx_group_address_tbl(wl, fp->enabled,
1570                                                   fp->mc_list,
1571                                                   fp->mc_list_length);
1572        if (ret < 0)
1573                goto out_sleep;
1574
1575        /* determine, whether supported filter values have changed */
1576        if (changed == 0)
1577                goto out_sleep;
1578
1579        /* configure filters */
1580        wl->filters = *total;
1581        wl1271_configure_filters(wl, 0);
1582
1583        /* apply configured filters */
1584        ret = wl1271_acx_rx_config(wl, wl->rx_config, wl->rx_filter);
1585        if (ret < 0)
1586                goto out_sleep;
1587
1588out_sleep:
1589        wl1271_ps_elp_sleep(wl);
1590
1591out:
1592        mutex_unlock(&wl->mutex);
1593        kfree(fp);
1594}
1595
1596static int wl1271_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
1597                             struct ieee80211_vif *vif,
1598                             struct ieee80211_sta *sta,
1599                             struct ieee80211_key_conf *key_conf)
1600{
1601        struct wl1271 *wl = hw->priv;
1602        const u8 *addr;
1603        int ret;
1604        u32 tx_seq_32 = 0;
1605        u16 tx_seq_16 = 0;
1606        u8 key_type;
1607
1608        static const u8 bcast_addr[ETH_ALEN] =
1609                { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
1610
1611        wl1271_debug(DEBUG_MAC80211, "mac80211 set key");
1612
1613        addr = sta ? sta->addr : bcast_addr;
1614
1615        wl1271_debug(DEBUG_CRYPT, "CMD: 0x%x", cmd);
1616        wl1271_dump(DEBUG_CRYPT, "ADDR: ", addr, ETH_ALEN);
1617        wl1271_debug(DEBUG_CRYPT, "Key: algo:0x%x, id:%d, len:%d flags 0x%x",
1618                     key_conf->cipher, key_conf->keyidx,
1619                     key_conf->keylen, key_conf->flags);
1620        wl1271_dump(DEBUG_CRYPT, "KEY: ", key_conf->key, key_conf->keylen);
1621
1622        if (is_zero_ether_addr(addr)) {
1623                /* We dont support TX only encryption */
1624                ret = -EOPNOTSUPP;
1625                goto out;
1626        }
1627
1628        mutex_lock(&wl->mutex);
1629
1630        if (unlikely(wl->state == WL1271_STATE_OFF)) {
1631                ret = -EAGAIN;
1632                goto out_unlock;
1633        }
1634
1635        ret = wl1271_ps_elp_wakeup(wl, false);
1636        if (ret < 0)
1637                goto out_unlock;
1638
1639        switch (key_conf->cipher) {
1640        case WLAN_CIPHER_SUITE_WEP40:
1641        case WLAN_CIPHER_SUITE_WEP104:
1642                key_type = KEY_WEP;
1643
1644                key_conf->hw_key_idx = key_conf->keyidx;
1645                break;
1646        case WLAN_CIPHER_SUITE_TKIP:
1647                key_type = KEY_TKIP;
1648
1649                key_conf->hw_key_idx = key_conf->keyidx;
1650                tx_seq_32 = WL1271_TX_SECURITY_HI32(wl->tx_security_seq);
1651                tx_seq_16 = WL1271_TX_SECURITY_LO16(wl->tx_security_seq);
1652                break;
1653        case WLAN_CIPHER_SUITE_CCMP:
1654                key_type = KEY_AES;
1655
1656                key_conf->flags |= IEEE80211_KEY_FLAG_GENERATE_IV;
1657                tx_seq_32 = WL1271_TX_SECURITY_HI32(wl->tx_security_seq);
1658                tx_seq_16 = WL1271_TX_SECURITY_LO16(wl->tx_security_seq);
1659                break;
1660        case WL1271_CIPHER_SUITE_GEM:
1661                key_type = KEY_GEM;
1662                tx_seq_32 = WL1271_TX_SECURITY_HI32(wl->tx_security_seq);
1663                tx_seq_16 = WL1271_TX_SECURITY_LO16(wl->tx_security_seq);
1664                break;
1665        default:
1666                wl1271_error("Unknown key algo 0x%x", key_conf->cipher);
1667
1668                ret = -EOPNOTSUPP;
1669                goto out_sleep;
1670        }
1671
1672        switch (cmd) {
1673        case SET_KEY:
1674                ret = wl1271_cmd_set_key(wl, KEY_ADD_OR_REPLACE,
1675                                         key_conf->keyidx, key_type,
1676                                         key_conf->keylen, key_conf->key,
1677                                         addr, tx_seq_32, tx_seq_16);
1678                if (ret < 0) {
1679                        wl1271_error("Could not add or replace key");
1680                        goto out_sleep;
1681                }
1682
1683                /* the default WEP key needs to be configured at least once */
1684                if (key_type == KEY_WEP) {
1685                        ret = wl1271_cmd_set_default_wep_key(wl,
1686                                                             wl->default_key);
1687                        if (ret < 0)
1688                                goto out_sleep;
1689                }
1690                break;
1691
1692        case DISABLE_KEY:
1693                /* The wl1271 does not allow to remove unicast keys - they
1694                   will be cleared automatically on next CMD_JOIN. Ignore the
1695                   request silently, as we dont want the mac80211 to emit
1696                   an error message. */
1697                if (!is_broadcast_ether_addr(addr))
1698                        break;
1699
1700                ret = wl1271_cmd_set_key(wl, KEY_REMOVE,
1701                                         key_conf->keyidx, key_type,
1702                                         key_conf->keylen, key_conf->key,
1703                                         addr, 0, 0);
1704                if (ret < 0) {
1705                        wl1271_error("Could not remove key");
1706                        goto out_sleep;
1707                }
1708                break;
1709
1710        default:
1711                wl1271_error("Unsupported key cmd 0x%x", cmd);
1712                ret = -EOPNOTSUPP;
1713                break;
1714        }
1715
1716out_sleep:
1717        wl1271_ps_elp_sleep(wl);
1718
1719out_unlock:
1720        mutex_unlock(&wl->mutex);
1721
1722out:
1723        return ret;
1724}
1725
1726static int wl1271_op_hw_scan(struct ieee80211_hw *hw,
1727                             struct ieee80211_vif *vif,
1728                             struct cfg80211_scan_request *req)
1729{
1730        struct wl1271 *wl = hw->priv;
1731        int ret;
1732        u8 *ssid = NULL;
1733        size_t len = 0;
1734
1735        wl1271_debug(DEBUG_MAC80211, "mac80211 hw scan");
1736
1737        if (req->n_ssids) {
1738                ssid = req->ssids[0].ssid;
1739                len = req->ssids[0].ssid_len;
1740        }
1741
1742        mutex_lock(&wl->mutex);
1743
1744        if (wl->state == WL1271_STATE_OFF) {
1745                /*
1746                 * We cannot return -EBUSY here because cfg80211 will expect
1747                 * a call to ieee80211_scan_completed if we do - in this case
1748                 * there won't be any call.
1749                 */
1750                ret = -EAGAIN;
1751                goto out;
1752        }
1753
1754        ret = wl1271_ps_elp_wakeup(wl, false);
1755        if (ret < 0)
1756                goto out;
1757
1758        ret = wl1271_scan(hw->priv, ssid, len, req);
1759
1760        wl1271_ps_elp_sleep(wl);
1761
1762out:
1763        mutex_unlock(&wl->mutex);
1764
1765        return ret;
1766}
1767
1768static int wl1271_op_set_frag_threshold(struct ieee80211_hw *hw, u32 value)
1769{
1770        struct wl1271 *wl = hw->priv;
1771        int ret = 0;
1772
1773        mutex_lock(&wl->mutex);
1774
1775        if (unlikely(wl->state == WL1271_STATE_OFF)) {
1776                ret = -EAGAIN;
1777                goto out;
1778        }
1779
1780        ret = wl1271_ps_elp_wakeup(wl, false);
1781        if (ret < 0)
1782                goto out;
1783
1784        ret = wl1271_acx_frag_threshold(wl, (u16)value);
1785        if (ret < 0)
1786                wl1271_warning("wl1271_op_set_frag_threshold failed: %d", ret);
1787
1788        wl1271_ps_elp_sleep(wl);
1789
1790out:
1791        mutex_unlock(&wl->mutex);
1792
1793        return ret;
1794}
1795
1796static int wl1271_op_set_rts_threshold(struct ieee80211_hw *hw, u32 value)
1797{
1798        struct wl1271 *wl = hw->priv;
1799        int ret = 0;
1800
1801        mutex_lock(&wl->mutex);
1802
1803        if (unlikely(wl->state == WL1271_STATE_OFF)) {
1804                ret = -EAGAIN;
1805                goto out;
1806        }
1807
1808        ret = wl1271_ps_elp_wakeup(wl, false);
1809        if (ret < 0)
1810                goto out;
1811
1812        ret = wl1271_acx_rts_threshold(wl, (u16) value);
1813        if (ret < 0)
1814                wl1271_warning("wl1271_op_set_rts_threshold failed: %d", ret);
1815
1816        wl1271_ps_elp_sleep(wl);
1817
1818out:
1819        mutex_unlock(&wl->mutex);
1820
1821        return ret;
1822}
1823
1824static void wl1271_ssid_set(struct wl1271 *wl, struct sk_buff *skb,
1825                            int offset)
1826{
1827        u8 *ptr = skb->data + offset;
1828
1829        /* find the location of the ssid in the beacon */
1830        while (ptr < skb->data + skb->len) {
1831                if (ptr[0] == WLAN_EID_SSID) {
1832                        wl->ssid_len = ptr[1];
1833                        memcpy(wl->ssid, ptr+2, wl->ssid_len);
1834                        return;
1835                }
1836                ptr += (ptr[1] + 2);
1837        }
1838        wl1271_error("No SSID in IEs!\n");
1839}
1840
1841static void wl1271_op_bss_info_changed(struct ieee80211_hw *hw,
1842                                       struct ieee80211_vif *vif,
1843                                       struct ieee80211_bss_conf *bss_conf,
1844                                       u32 changed)
1845{
1846        enum wl1271_cmd_ps_mode mode;
1847        struct wl1271 *wl = hw->priv;
1848        struct ieee80211_sta *sta = ieee80211_find_sta(vif, bss_conf->bssid);
1849        bool do_join = false;
1850        bool set_assoc = false;
1851        int ret;
1852
1853        wl1271_debug(DEBUG_MAC80211, "mac80211 bss info changed");
1854
1855        mutex_lock(&wl->mutex);
1856
1857        if (unlikely(wl->state == WL1271_STATE_OFF))
1858                goto out;
1859
1860        ret = wl1271_ps_elp_wakeup(wl, false);
1861        if (ret < 0)
1862                goto out;
1863
1864        if ((changed & BSS_CHANGED_BEACON_INT) &&
1865            (wl->bss_type == BSS_TYPE_IBSS)) {
1866                wl1271_debug(DEBUG_ADHOC, "ad-hoc beacon interval updated: %d",
1867                        bss_conf->beacon_int);
1868
1869                wl->beacon_int = bss_conf->beacon_int;
1870                do_join = true;
1871        }
1872
1873        if ((changed & BSS_CHANGED_BEACON) &&
1874            (wl->bss_type == BSS_TYPE_IBSS)) {
1875                struct sk_buff *beacon = ieee80211_beacon_get(hw, vif);
1876
1877                wl1271_debug(DEBUG_ADHOC, "ad-hoc beacon updated");
1878
1879                if (beacon) {
1880                        struct ieee80211_hdr *hdr;
1881                        int ieoffset = offsetof(struct ieee80211_mgmt,
1882                                                u.beacon.variable);
1883
1884                        wl1271_ssid_set(wl, beacon, ieoffset);
1885
1886                        ret = wl1271_cmd_template_set(wl, CMD_TEMPL_BEACON,
1887                                                      beacon->data,
1888                                                      beacon->len, 0,
1889                                                      wl1271_min_rate_get(wl));
1890
1891                        if (ret < 0) {
1892                                dev_kfree_skb(beacon);
1893                                goto out_sleep;
1894                        }
1895
1896                        hdr = (struct ieee80211_hdr *) beacon->data;
1897                        hdr->frame_control = cpu_to_le16(
1898                                IEEE80211_FTYPE_MGMT |
1899                                IEEE80211_STYPE_PROBE_RESP);
1900
1901                        ret = wl1271_cmd_template_set(wl,
1902                                                      CMD_TEMPL_PROBE_RESPONSE,
1903                                                      beacon->data,
1904                                                      beacon->len, 0,
1905                                                      wl1271_min_rate_get(wl));
1906                        dev_kfree_skb(beacon);
1907                        if (ret < 0)
1908                                goto out_sleep;
1909
1910                        /* Need to update the SSID (for filtering etc) */
1911                        do_join = true;
1912                }
1913        }
1914
1915        if ((changed & BSS_CHANGED_BEACON_ENABLED) &&
1916            (wl->bss_type == BSS_TYPE_IBSS)) {
1917                wl1271_debug(DEBUG_ADHOC, "ad-hoc beaconing: %s",
1918                             bss_conf->enable_beacon ? "enabled" : "disabled");
1919
1920                if (bss_conf->enable_beacon)
1921                        wl->set_bss_type = BSS_TYPE_IBSS;
1922                else
1923                        wl->set_bss_type = BSS_TYPE_STA_BSS;
1924                do_join = true;
1925        }
1926
1927        if (changed & BSS_CHANGED_CQM) {
1928                bool enable = false;
1929                if (bss_conf->cqm_rssi_thold)
1930                        enable = true;
1931                ret = wl1271_acx_rssi_snr_trigger(wl, enable,
1932                                                  bss_conf->cqm_rssi_thold,
1933                                                  bss_conf->cqm_rssi_hyst);
1934                if (ret < 0)
1935                        goto out;
1936                wl->rssi_thold = bss_conf->cqm_rssi_thold;
1937        }
1938
1939        if ((changed & BSS_CHANGED_BSSID) &&
1940            /*
1941             * Now we know the correct bssid, so we send a new join command
1942             * and enable the BSSID filter
1943             */
1944            memcmp(wl->bssid, bss_conf->bssid, ETH_ALEN)) {
1945                        memcpy(wl->bssid, bss_conf->bssid, ETH_ALEN);
1946
1947                        ret = wl1271_cmd_build_null_data(wl);
1948                        if (ret < 0)
1949                                goto out_sleep;
1950
1951                        ret = wl1271_build_qos_null_data(wl);
1952                        if (ret < 0)
1953                                goto out_sleep;
1954
1955                        /* filter out all packets not from this BSSID */
1956                        wl1271_configure_filters(wl, 0);
1957
1958                        /* Need to update the BSSID (for filtering etc) */
1959                        do_join = true;
1960        }
1961
1962        if (changed & BSS_CHANGED_ASSOC) {
1963                if (bss_conf->assoc) {
1964                        u32 rates;
1965                        int ieoffset;
1966                        wl->aid = bss_conf->aid;
1967                        set_assoc = true;
1968
1969                        wl->ps_poll_failures = 0;
1970
1971                        /*
1972                         * use basic rates from AP, and determine lowest rate
1973                         * to use with control frames.
1974                         */
1975                        rates = bss_conf->basic_rates;
1976                        wl->basic_rate_set = wl1271_tx_enabled_rates_get(wl,
1977                                                                         rates);
1978                        wl->basic_rate = wl1271_min_rate_get(wl);
1979                        ret = wl1271_acx_rate_policies(wl);
1980                        if (ret < 0)
1981                                goto out_sleep;
1982
1983                        /*
1984                         * with wl1271, we don't need to update the
1985                         * beacon_int and dtim_period, because the firmware
1986                         * updates it by itself when the first beacon is
1987                         * received after a join.
1988                         */
1989                        ret = wl1271_cmd_build_ps_poll(wl, wl->aid);
1990                        if (ret < 0)
1991                                goto out_sleep;
1992
1993                        /*
1994                         * Get a template for hardware connection maintenance
1995                         */
1996                        dev_kfree_skb(wl->probereq);
1997                        wl->probereq = wl1271_cmd_build_ap_probe_req(wl, NULL);
1998                        ieoffset = offsetof(struct ieee80211_mgmt,
1999                                            u.probe_req.variable);
2000                        wl1271_ssid_set(wl, wl->probereq, ieoffset);
2001
2002                        /* enable the connection monitoring feature */
2003                        ret = wl1271_acx_conn_monit_params(wl, true);
2004                        if (ret < 0)
2005                                goto out_sleep;
2006
2007                        /* If we want to go in PSM but we're not there yet */
2008                        if (test_bit(WL1271_FLAG_PSM_REQUESTED, &wl->flags) &&
2009                            !test_bit(WL1271_FLAG_PSM, &wl->flags)) {
2010                                mode = STATION_POWER_SAVE_MODE;
2011                                ret = wl1271_ps_set_mode(wl, mode,
2012                                                         wl->basic_rate,
2013                                                         true);
2014                                if (ret < 0)
2015                                        goto out_sleep;
2016                        }
2017                } else {
2018                        /* use defaults when not associated */
2019                        clear_bit(WL1271_FLAG_STA_STATE_SENT, &wl->flags);
2020                        clear_bit(WL1271_FLAG_STA_ASSOCIATED, &wl->flags);
2021                        wl->aid = 0;
2022
2023                        /* free probe-request template */
2024                        dev_kfree_skb(wl->probereq);
2025                        wl->probereq = NULL;
2026
2027                        /* re-enable dynamic ps - just in case */
2028                        ieee80211_enable_dyn_ps(wl->vif);
2029
2030                        /* revert back to minimum rates for the current band */
2031                        wl1271_set_band_rate(wl);
2032                        wl->basic_rate = wl1271_min_rate_get(wl);
2033                        ret = wl1271_acx_rate_policies(wl);
2034                        if (ret < 0)
2035                                goto out_sleep;
2036
2037                        /* disable connection monitor features */
2038                        ret = wl1271_acx_conn_monit_params(wl, false);
2039
2040                        /* Disable the keep-alive feature */
2041                        ret = wl1271_acx_keep_alive_mode(wl, false);
2042                        if (ret < 0)
2043                                goto out_sleep;
2044
2045                        /* restore the bssid filter and go to dummy bssid */
2046                        wl1271_unjoin(wl);
2047                        wl1271_dummy_join(wl);
2048                }
2049
2050        }
2051
2052        if (changed & BSS_CHANGED_ERP_SLOT) {
2053                if (bss_conf->use_short_slot)
2054                        ret = wl1271_acx_slot(wl, SLOT_TIME_SHORT);
2055                else
2056                        ret = wl1271_acx_slot(wl, SLOT_TIME_LONG);
2057                if (ret < 0) {
2058                        wl1271_warning("Set slot time failed %d", ret);
2059                        goto out_sleep;
2060                }
2061        }
2062
2063        if (changed & BSS_CHANGED_ERP_PREAMBLE) {
2064                if (bss_conf->use_short_preamble)
2065                        wl1271_acx_set_preamble(wl, ACX_PREAMBLE_SHORT);
2066                else
2067                        wl1271_acx_set_preamble(wl, ACX_PREAMBLE_LONG);
2068        }
2069
2070        if (changed & BSS_CHANGED_ERP_CTS_PROT) {
2071                if (bss_conf->use_cts_prot)
2072                        ret = wl1271_acx_cts_protect(wl, CTSPROTECT_ENABLE);
2073                else
2074                        ret = wl1271_acx_cts_protect(wl, CTSPROTECT_DISABLE);
2075                if (ret < 0) {
2076                        wl1271_warning("Set ctsprotect failed %d", ret);
2077                        goto out_sleep;
2078                }
2079        }
2080
2081        /*
2082         * Takes care of: New association with HT enable,
2083         *                HT information change in beacon.
2084         */
2085        if (sta &&
2086            (changed & BSS_CHANGED_HT) &&
2087            (bss_conf->channel_type != NL80211_CHAN_NO_HT)) {
2088                ret = wl1271_acx_set_ht_capabilities(wl, &sta->ht_cap, true);
2089                if (ret < 0) {
2090                        wl1271_warning("Set ht cap true failed %d", ret);
2091                        goto out_sleep;
2092                }
2093                        ret = wl1271_acx_set_ht_information(wl,
2094                                bss_conf->ht_operation_mode);
2095                if (ret < 0) {
2096                        wl1271_warning("Set ht information failed %d", ret);
2097                        goto out_sleep;
2098                }
2099        }
2100        /*
2101         * Takes care of: New association without HT,
2102         *                Disassociation.
2103         */
2104        else if (sta && (changed & BSS_CHANGED_ASSOC)) {
2105                ret = wl1271_acx_set_ht_capabilities(wl, &sta->ht_cap, false);
2106                if (ret < 0) {
2107                        wl1271_warning("Set ht cap false failed %d", ret);
2108                        goto out_sleep;
2109                }
2110        }
2111
2112        if (changed & BSS_CHANGED_ARP_FILTER) {
2113                __be32 addr = bss_conf->arp_addr_list[0];
2114                WARN_ON(wl->bss_type != BSS_TYPE_STA_BSS);
2115
2116                if (bss_conf->arp_addr_cnt == 1 &&
2117                    bss_conf->arp_filter_enabled) {
2118                        /*
2119                         * The template should have been configured only upon
2120                         * association. however, it seems that the correct ip
2121                         * isn't being set (when sending), so we have to
2122                         * reconfigure the template upon every ip change.
2123                         */
2124                        ret = wl1271_cmd_build_arp_rsp(wl, addr);
2125                        if (ret < 0) {
2126                                wl1271_warning("build arp rsp failed: %d", ret);
2127                                goto out_sleep;
2128                        }
2129
2130                        ret = wl1271_acx_arp_ip_filter(wl,
2131                                (ACX_ARP_FILTER_ARP_FILTERING |
2132                                 ACX_ARP_FILTER_AUTO_ARP),
2133                                addr);
2134                } else
2135                        ret = wl1271_acx_arp_ip_filter(wl, 0, addr);
2136
2137                if (ret < 0)
2138                        goto out_sleep;
2139        }
2140
2141        if (do_join) {
2142                ret = wl1271_join(wl, set_assoc);
2143                if (ret < 0) {
2144                        wl1271_warning("cmd join failed %d", ret);
2145                        goto out_sleep;
2146                }
2147        }
2148
2149out_sleep:
2150        wl1271_ps_elp_sleep(wl);
2151
2152out:
2153        mutex_unlock(&wl->mutex);
2154}
2155
2156static int wl1271_op_conf_tx(struct ieee80211_hw *hw, u16 queue,
2157                             const struct ieee80211_tx_queue_params *params)
2158{
2159        struct wl1271 *wl = hw->priv;
2160        u8 ps_scheme;
2161        int ret;
2162
2163        mutex_lock(&wl->mutex);
2164
2165        wl1271_debug(DEBUG_MAC80211, "mac80211 conf tx %d", queue);
2166
2167        if (unlikely(wl->state == WL1271_STATE_OFF)) {
2168                ret = -EAGAIN;
2169                goto out;
2170        }
2171
2172        ret = wl1271_ps_elp_wakeup(wl, false);
2173        if (ret < 0)
2174                goto out;
2175
2176        /* the txop is confed in units of 32us by the mac80211, we need us */
2177        ret = wl1271_acx_ac_cfg(wl, wl1271_tx_get_queue(queue),
2178                                params->cw_min, params->cw_max,
2179                                params->aifs, params->txop << 5);
2180        if (ret < 0)
2181                goto out_sleep;
2182
2183        if (params->uapsd)
2184                ps_scheme = CONF_PS_SCHEME_UPSD_TRIGGER;
2185        else
2186                ps_scheme = CONF_PS_SCHEME_LEGACY;
2187
2188        ret = wl1271_acx_tid_cfg(wl, wl1271_tx_get_queue(queue),
2189                                 CONF_CHANNEL_TYPE_EDCF,
2190                                 wl1271_tx_get_queue(queue),
2191                                 ps_scheme, CONF_ACK_POLICY_LEGACY, 0, 0);
2192        if (ret < 0)
2193                goto out_sleep;
2194
2195out_sleep:
2196        wl1271_ps_elp_sleep(wl);
2197
2198out:
2199        mutex_unlock(&wl->mutex);
2200
2201        return ret;
2202}
2203
2204static u64 wl1271_op_get_tsf(struct ieee80211_hw *hw)
2205{
2206
2207        struct wl1271 *wl = hw->priv;
2208        u64 mactime = ULLONG_MAX;
2209        int ret;
2210
2211        wl1271_debug(DEBUG_MAC80211, "mac80211 get tsf");
2212
2213        mutex_lock(&wl->mutex);
2214
2215        if (unlikely(wl->state == WL1271_STATE_OFF))
2216                goto out;
2217
2218        ret = wl1271_ps_elp_wakeup(wl, false);
2219        if (ret < 0)
2220                goto out;
2221
2222        ret = wl1271_acx_tsf_info(wl, &mactime);
2223        if (ret < 0)
2224                goto out_sleep;
2225
2226out_sleep:
2227        wl1271_ps_elp_sleep(wl);
2228
2229out:
2230        mutex_unlock(&wl->mutex);
2231        return mactime;
2232}
2233
2234static int wl1271_op_get_survey(struct ieee80211_hw *hw, int idx,
2235                                struct survey_info *survey)
2236{
2237        struct wl1271 *wl = hw->priv;
2238        struct ieee80211_conf *conf = &hw->conf;
2239
2240        if (idx != 0)
2241                return -ENOENT;
2242
2243        survey->channel = conf->channel;
2244        survey->filled = SURVEY_INFO_NOISE_DBM;
2245        survey->noise = wl->noise;
2246
2247        return 0;
2248}
2249
2250/* can't be const, mac80211 writes to this */
2251static struct ieee80211_rate wl1271_rates[] = {
2252        { .bitrate = 10,
2253          .hw_value = CONF_HW_BIT_RATE_1MBPS,
2254          .hw_value_short = CONF_HW_BIT_RATE_1MBPS, },
2255        { .bitrate = 20,
2256          .hw_value = CONF_HW_BIT_RATE_2MBPS,
2257          .hw_value_short = CONF_HW_BIT_RATE_2MBPS,
2258          .flags = IEEE80211_RATE_SHORT_PREAMBLE },
2259        { .bitrate = 55,
2260          .hw_value = CONF_HW_BIT_RATE_5_5MBPS,
2261          .hw_value_short = CONF_HW_BIT_RATE_5_5MBPS,
2262          .flags = IEEE80211_RATE_SHORT_PREAMBLE },
2263        { .bitrate = 110,
2264          .hw_value = CONF_HW_BIT_RATE_11MBPS,
2265          .hw_value_short = CONF_HW_BIT_RATE_11MBPS,
2266          .flags = IEEE80211_RATE_SHORT_PREAMBLE },
2267        { .bitrate = 60,
2268          .hw_value = CONF_HW_BIT_RATE_6MBPS,
2269          .hw_value_short = CONF_HW_BIT_RATE_6MBPS, },
2270        { .bitrate = 90,
2271          .hw_value = CONF_HW_BIT_RATE_9MBPS,
2272          .hw_value_short = CONF_HW_BIT_RATE_9MBPS, },
2273        { .bitrate = 120,
2274          .hw_value = CONF_HW_BIT_RATE_12MBPS,
2275          .hw_value_short = CONF_HW_BIT_RATE_12MBPS, },
2276        { .bitrate = 180,
2277          .hw_value = CONF_HW_BIT_RATE_18MBPS,
2278          .hw_value_short = CONF_HW_BIT_RATE_18MBPS, },
2279        { .bitrate = 240,
2280          .hw_value = CONF_HW_BIT_RATE_24MBPS,
2281          .hw_value_short = CONF_HW_BIT_RATE_24MBPS, },
2282        { .bitrate = 360,
2283         .hw_value = CONF_HW_BIT_RATE_36MBPS,
2284         .hw_value_short = CONF_HW_BIT_RATE_36MBPS, },
2285        { .bitrate = 480,
2286          .hw_value = CONF_HW_BIT_RATE_48MBPS,
2287          .hw_value_short = CONF_HW_BIT_RATE_48MBPS, },
2288        { .bitrate = 540,
2289          .hw_value = CONF_HW_BIT_RATE_54MBPS,
2290          .hw_value_short = CONF_HW_BIT_RATE_54MBPS, },
2291};
2292
2293/* can't be const, mac80211 writes to this */
2294static struct ieee80211_channel wl1271_channels[] = {
2295        { .hw_value = 1, .center_freq = 2412, .max_power = 25 },
2296        { .hw_value = 2, .center_freq = 2417, .max_power = 25 },
2297        { .hw_value = 3, .center_freq = 2422, .max_power = 25 },
2298        { .hw_value = 4, .center_freq = 2427, .max_power = 25 },
2299        { .hw_value = 5, .center_freq = 2432, .max_power = 25 },
2300        { .hw_value = 6, .center_freq = 2437, .max_power = 25 },
2301        { .hw_value = 7, .center_freq = 2442, .max_power = 25 },
2302        { .hw_value = 8, .center_freq = 2447, .max_power = 25 },
2303        { .hw_value = 9, .center_freq = 2452, .max_power = 25 },
2304        { .hw_value = 10, .center_freq = 2457, .max_power = 25 },
2305        { .hw_value = 11, .center_freq = 2462, .max_power = 25 },
2306        { .hw_value = 12, .center_freq = 2467, .max_power = 25 },
2307        { .hw_value = 13, .center_freq = 2472, .max_power = 25 },
2308};
2309
2310/* mapping to indexes for wl1271_rates */
2311static const u8 wl1271_rate_to_idx_2ghz[] = {
2312        /* MCS rates are used only with 11n */
2313        7,                            /* CONF_HW_RXTX_RATE_MCS7 */
2314        6,                            /* CONF_HW_RXTX_RATE_MCS6 */
2315        5,                            /* CONF_HW_RXTX_RATE_MCS5 */
2316        4,                            /* CONF_HW_RXTX_RATE_MCS4 */
2317        3,                            /* CONF_HW_RXTX_RATE_MCS3 */
2318        2,                            /* CONF_HW_RXTX_RATE_MCS2 */
2319        1,                            /* CONF_HW_RXTX_RATE_MCS1 */
2320        0,                            /* CONF_HW_RXTX_RATE_MCS0 */
2321
2322        11,                            /* CONF_HW_RXTX_RATE_54   */
2323        10,                            /* CONF_HW_RXTX_RATE_48   */
2324        9,                             /* CONF_HW_RXTX_RATE_36   */
2325        8,                             /* CONF_HW_RXTX_RATE_24   */
2326
2327        /* TI-specific rate */
2328        CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_22   */
2329
2330        7,                             /* CONF_HW_RXTX_RATE_18   */
2331        6,                             /* CONF_HW_RXTX_RATE_12   */
2332        3,                             /* CONF_HW_RXTX_RATE_11   */
2333        5,                             /* CONF_HW_RXTX_RATE_9    */
2334        4,                             /* CONF_HW_RXTX_RATE_6    */
2335        2,                             /* CONF_HW_RXTX_RATE_5_5  */
2336        1,                             /* CONF_HW_RXTX_RATE_2    */
2337        0                              /* CONF_HW_RXTX_RATE_1    */
2338};
2339
2340/* 11n STA capabilities */
2341#define HW_RX_HIGHEST_RATE      72
2342
2343#ifdef CONFIG_WL12XX_HT
2344#define WL12XX_HT_CAP { \
2345        .cap = IEEE80211_HT_CAP_GRN_FLD | IEEE80211_HT_CAP_SGI_20, \
2346        .ht_supported = true, \
2347        .ampdu_factor = IEEE80211_HT_MAX_AMPDU_8K, \
2348        .ampdu_density = IEEE80211_HT_MPDU_DENSITY_8, \
2349        .mcs = { \
2350                .rx_mask = { 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, \
2351                .rx_highest = cpu_to_le16(HW_RX_HIGHEST_RATE), \
2352                .tx_params = IEEE80211_HT_MCS_TX_DEFINED, \
2353                }, \
2354}
2355#else
2356#define WL12XX_HT_CAP { \
2357        .ht_supported = false, \
2358}
2359#endif
2360
2361/* can't be const, mac80211 writes to this */
2362static struct ieee80211_supported_band wl1271_band_2ghz = {
2363        .channels = wl1271_channels,
2364        .n_channels = ARRAY_SIZE(wl1271_channels),
2365        .bitrates = wl1271_rates,
2366        .n_bitrates = ARRAY_SIZE(wl1271_rates),
2367        .ht_cap = WL12XX_HT_CAP,
2368};
2369
2370/* 5 GHz data rates for WL1273 */
2371static struct ieee80211_rate wl1271_rates_5ghz[] = {
2372        { .bitrate = 60,
2373          .hw_value = CONF_HW_BIT_RATE_6MBPS,
2374          .hw_value_short = CONF_HW_BIT_RATE_6MBPS, },
2375        { .bitrate = 90,
2376          .hw_value = CONF_HW_BIT_RATE_9MBPS,
2377          .hw_value_short = CONF_HW_BIT_RATE_9MBPS, },
2378        { .bitrate = 120,
2379          .hw_value = CONF_HW_BIT_RATE_12MBPS,
2380          .hw_value_short = CONF_HW_BIT_RATE_12MBPS, },
2381        { .bitrate = 180,
2382          .hw_value = CONF_HW_BIT_RATE_18MBPS,
2383          .hw_value_short = CONF_HW_BIT_RATE_18MBPS, },
2384        { .bitrate = 240,
2385          .hw_value = CONF_HW_BIT_RATE_24MBPS,
2386          .hw_value_short = CONF_HW_BIT_RATE_24MBPS, },
2387        { .bitrate = 360,
2388         .hw_value = CONF_HW_BIT_RATE_36MBPS,
2389         .hw_value_short = CONF_HW_BIT_RATE_36MBPS, },
2390        { .bitrate = 480,
2391          .hw_value = CONF_HW_BIT_RATE_48MBPS,
2392          .hw_value_short = CONF_HW_BIT_RATE_48MBPS, },
2393        { .bitrate = 540,
2394          .hw_value = CONF_HW_BIT_RATE_54MBPS,
2395          .hw_value_short = CONF_HW_BIT_RATE_54MBPS, },
2396};
2397
2398/* 5 GHz band channels for WL1273 */
2399static struct ieee80211_channel wl1271_channels_5ghz[] = {
2400        { .hw_value = 7, .center_freq = 5035},
2401        { .hw_value = 8, .center_freq = 5040},
2402        { .hw_value = 9, .center_freq = 5045},
2403        { .hw_value = 11, .center_freq = 5055},
2404        { .hw_value = 12, .center_freq = 5060},
2405        { .hw_value = 16, .center_freq = 5080},
2406        { .hw_value = 34, .center_freq = 5170},
2407        { .hw_value = 36, .center_freq = 5180},
2408        { .hw_value = 38, .center_freq = 5190},
2409        { .hw_value = 40, .center_freq = 5200},
2410        { .hw_value = 42, .center_freq = 5210},
2411        { .hw_value = 44, .center_freq = 5220},
2412        { .hw_value = 46, .center_freq = 5230},
2413        { .hw_value = 48, .center_freq = 5240},
2414        { .hw_value = 52, .center_freq = 5260},
2415        { .hw_value = 56, .center_freq = 5280},
2416        { .hw_value = 60, .center_freq = 5300},
2417        { .hw_value = 64, .center_freq = 5320},
2418        { .hw_value = 100, .center_freq = 5500},
2419        { .hw_value = 104, .center_freq = 5520},
2420        { .hw_value = 108, .center_freq = 5540},
2421        { .hw_value = 112, .center_freq = 5560},
2422        { .hw_value = 116, .center_freq = 5580},
2423        { .hw_value = 120, .center_freq = 5600},
2424        { .hw_value = 124, .center_freq = 5620},
2425        { .hw_value = 128, .center_freq = 5640},
2426        { .hw_value = 132, .center_freq = 5660},
2427        { .hw_value = 136, .center_freq = 5680},
2428        { .hw_value = 140, .center_freq = 5700},
2429        { .hw_value = 149, .center_freq = 5745},
2430        { .hw_value = 153, .center_freq = 5765},
2431        { .hw_value = 157, .center_freq = 5785},
2432        { .hw_value = 161, .center_freq = 5805},
2433        { .hw_value = 165, .center_freq = 5825},
2434};
2435
2436/* mapping to indexes for wl1271_rates_5ghz */
2437static const u8 wl1271_rate_to_idx_5ghz[] = {
2438        /* MCS rates are used only with 11n */
2439        7,                            /* CONF_HW_RXTX_RATE_MCS7 */
2440        6,                            /* CONF_HW_RXTX_RATE_MCS6 */
2441        5,                            /* CONF_HW_RXTX_RATE_MCS5 */
2442        4,                            /* CONF_HW_RXTX_RATE_MCS4 */
2443        3,                            /* CONF_HW_RXTX_RATE_MCS3 */
2444        2,                            /* CONF_HW_RXTX_RATE_MCS2 */
2445        1,                            /* CONF_HW_RXTX_RATE_MCS1 */
2446        0,                            /* CONF_HW_RXTX_RATE_MCS0 */
2447
2448        7,                             /* CONF_HW_RXTX_RATE_54   */
2449        6,                             /* CONF_HW_RXTX_RATE_48   */
2450        5,                             /* CONF_HW_RXTX_RATE_36   */
2451        4,                             /* CONF_HW_RXTX_RATE_24   */
2452
2453        /* TI-specific rate */
2454        CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_22   */
2455
2456        3,                             /* CONF_HW_RXTX_RATE_18   */
2457        2,                             /* CONF_HW_RXTX_RATE_12   */
2458        CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_11   */
2459        1,                             /* CONF_HW_RXTX_RATE_9    */
2460        0,                             /* CONF_HW_RXTX_RATE_6    */
2461        CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_5_5  */
2462        CONF_HW_RXTX_RATE_UNSUPPORTED, /* CONF_HW_RXTX_RATE_2    */
2463        CONF_HW_RXTX_RATE_UNSUPPORTED  /* CONF_HW_RXTX_RATE_1    */
2464};
2465
2466static struct ieee80211_supported_band wl1271_band_5ghz = {
2467        .channels = wl1271_channels_5ghz,
2468        .n_channels = ARRAY_SIZE(wl1271_channels_5ghz),
2469        .bitrates = wl1271_rates_5ghz,
2470        .n_bitrates = ARRAY_SIZE(wl1271_rates_5ghz),
2471        .ht_cap = WL12XX_HT_CAP,
2472};
2473
2474static const u8 *wl1271_band_rate_to_idx[] = {
2475        [IEEE80211_BAND_2GHZ] = wl1271_rate_to_idx_2ghz,
2476        [IEEE80211_BAND_5GHZ] = wl1271_rate_to_idx_5ghz
2477};
2478
2479static const struct ieee80211_ops wl1271_ops = {
2480        .start = wl1271_op_start,
2481        .stop = wl1271_op_stop,
2482        .add_interface = wl1271_op_add_interface,
2483        .remove_interface = wl1271_op_remove_interface,
2484        .config = wl1271_op_config,
2485        .prepare_multicast = wl1271_op_prepare_multicast,
2486        .configure_filter = wl1271_op_configure_filter,
2487        .tx = wl1271_op_tx,
2488        .set_key = wl1271_op_set_key,
2489        .hw_scan = wl1271_op_hw_scan,
2490        .bss_info_changed = wl1271_op_bss_info_changed,
2491        .set_frag_threshold = wl1271_op_set_frag_threshold,
2492        .set_rts_threshold = wl1271_op_set_rts_threshold,
2493        .conf_tx = wl1271_op_conf_tx,
2494        .get_tsf = wl1271_op_get_tsf,
2495        .get_survey = wl1271_op_get_survey,
2496        CFG80211_TESTMODE_CMD(wl1271_tm_cmd)
2497};
2498
2499
2500u8 wl1271_rate_to_idx(int rate, enum ieee80211_band band)
2501{
2502        u8 idx;
2503
2504        BUG_ON(band >= sizeof(wl1271_band_rate_to_idx)/sizeof(u8 *));
2505
2506        if (unlikely(rate >= CONF_HW_RXTX_RATE_MAX)) {
2507                wl1271_error("Illegal RX rate from HW: %d", rate);
2508                return 0;
2509        }
2510
2511        idx = wl1271_band_rate_to_idx[band][rate];
2512        if (unlikely(idx == CONF_HW_RXTX_RATE_UNSUPPORTED)) {
2513                wl1271_error("Unsupported RX rate from HW: %d", rate);
2514                return 0;
2515        }
2516
2517        return idx;
2518}
2519
2520static ssize_t wl1271_sysfs_show_bt_coex_state(struct device *dev,
2521                                               struct device_attribute *attr,
2522                                               char *buf)
2523{
2524        struct wl1271 *wl = dev_get_drvdata(dev);
2525        ssize_t len;
2526
2527        len = PAGE_SIZE;
2528
2529        mutex_lock(&wl->mutex);
2530        len = snprintf(buf, len, "%d\n\n0 - off\n1 - on\n",
2531                       wl->sg_enabled);
2532        mutex_unlock(&wl->mutex);
2533
2534        return len;
2535
2536}
2537
2538static ssize_t wl1271_sysfs_store_bt_coex_state(struct device *dev,
2539                                                struct device_attribute *attr,
2540                                                const char *buf, size_t count)
2541{
2542        struct wl1271 *wl = dev_get_drvdata(dev);
2543        unsigned long res;
2544        int ret;
2545
2546        ret = strict_strtoul(buf, 10, &res);
2547
2548        if (ret < 0) {
2549                wl1271_warning("incorrect value written to bt_coex_mode");
2550                return count;
2551        }
2552
2553        mutex_lock(&wl->mutex);
2554
2555        res = !!res;
2556
2557        if (res == wl->sg_enabled)
2558                goto out;
2559
2560        wl->sg_enabled = res;
2561
2562        if (wl->state == WL1271_STATE_OFF)
2563                goto out;
2564
2565        ret = wl1271_ps_elp_wakeup(wl, false);
2566        if (ret < 0)
2567                goto out;
2568
2569        wl1271_acx_sg_enable(wl, wl->sg_enabled);
2570        wl1271_ps_elp_sleep(wl);
2571
2572 out:
2573        mutex_unlock(&wl->mutex);
2574        return count;
2575}
2576
2577static DEVICE_ATTR(bt_coex_state, S_IRUGO | S_IWUSR,
2578                   wl1271_sysfs_show_bt_coex_state,
2579                   wl1271_sysfs_store_bt_coex_state);
2580
2581static ssize_t wl1271_sysfs_show_hw_pg_ver(struct device *dev,
2582                                           struct device_attribute *attr,
2583                                           char *buf)
2584{
2585        struct wl1271 *wl = dev_get_drvdata(dev);
2586        ssize_t len;
2587
2588        len = PAGE_SIZE;
2589
2590        mutex_lock(&wl->mutex);
2591        if (wl->hw_pg_ver >= 0)
2592                len = snprintf(buf, len, "%d\n", wl->hw_pg_ver);
2593        else
2594                len = snprintf(buf, len, "n/a\n");
2595        mutex_unlock(&wl->mutex);
2596
2597        return len;
2598}
2599
2600static DEVICE_ATTR(hw_pg_ver, S_IRUGO | S_IWUSR,
2601                   wl1271_sysfs_show_hw_pg_ver, NULL);
2602
2603int wl1271_register_hw(struct wl1271 *wl)
2604{
2605        int ret;
2606
2607        if (wl->mac80211_registered)
2608                return 0;
2609
2610        SET_IEEE80211_PERM_ADDR(wl->hw, wl->mac_addr);
2611
2612        ret = ieee80211_register_hw(wl->hw);
2613        if (ret < 0) {
2614                wl1271_error("unable to register mac80211 hw: %d", ret);
2615                return ret;
2616        }
2617
2618        wl->mac80211_registered = true;
2619
2620        wl1271_debugfs_init(wl);
2621
2622        register_netdevice_notifier(&wl1271_dev_notifier);
2623
2624        wl1271_notice("loaded");
2625
2626        return 0;
2627}
2628EXPORT_SYMBOL_GPL(wl1271_register_hw);
2629
2630void wl1271_unregister_hw(struct wl1271 *wl)
2631{
2632        unregister_netdevice_notifier(&wl1271_dev_notifier);
2633        ieee80211_unregister_hw(wl->hw);
2634        wl->mac80211_registered = false;
2635
2636}
2637EXPORT_SYMBOL_GPL(wl1271_unregister_hw);
2638
2639int wl1271_init_ieee80211(struct wl1271 *wl)
2640{
2641        static const u32 cipher_suites[] = {
2642                WLAN_CIPHER_SUITE_WEP40,
2643                WLAN_CIPHER_SUITE_WEP104,
2644                WLAN_CIPHER_SUITE_TKIP,
2645                WLAN_CIPHER_SUITE_CCMP,
2646                WL1271_CIPHER_SUITE_GEM,
2647        };
2648
2649        /* The tx descriptor buffer and the TKIP space. */
2650        wl->hw->extra_tx_headroom = WL1271_TKIP_IV_SPACE +
2651                sizeof(struct wl1271_tx_hw_descr);
2652
2653        /* unit us */
2654        /* FIXME: find a proper value */
2655        wl->hw->channel_change_time = 10000;
2656        wl->hw->max_listen_interval = wl->conf.conn.max_listen_interval;
2657
2658        wl->hw->flags = IEEE80211_HW_SIGNAL_DBM |
2659                IEEE80211_HW_BEACON_FILTER |
2660                IEEE80211_HW_SUPPORTS_PS |
2661                IEEE80211_HW_SUPPORTS_UAPSD |
2662                IEEE80211_HW_HAS_RATE_CONTROL |
2663                IEEE80211_HW_CONNECTION_MONITOR |
2664                IEEE80211_HW_SUPPORTS_CQM_RSSI;
2665
2666        wl->hw->wiphy->cipher_suites = cipher_suites;
2667        wl->hw->wiphy->n_cipher_suites = ARRAY_SIZE(cipher_suites);
2668
2669        wl->hw->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) |
2670                BIT(NL80211_IFTYPE_ADHOC);
2671        wl->hw->wiphy->max_scan_ssids = 1;
2672        /*
2673         * Maximum length of elements in scanning probe request templates
2674         * should be the maximum length possible for a template, without
2675         * the IEEE80211 header of the template
2676         */
2677        wl->hw->wiphy->max_scan_ie_len = WL1271_CMD_TEMPL_MAX_SIZE -
2678                        sizeof(struct ieee80211_header);
2679        wl->hw->wiphy->bands[IEEE80211_BAND_2GHZ] = &wl1271_band_2ghz;
2680        wl->hw->wiphy->bands[IEEE80211_BAND_5GHZ] = &wl1271_band_5ghz;
2681
2682        wl->hw->queues = 4;
2683        wl->hw->max_rates = 1;
2684
2685        wl->hw->wiphy->reg_notifier = wl1271_reg_notify;
2686
2687        SET_IEEE80211_DEV(wl->hw, wl1271_wl_to_dev(wl));
2688
2689        return 0;
2690}
2691EXPORT_SYMBOL_GPL(wl1271_init_ieee80211);
2692
2693#define WL1271_DEFAULT_CHANNEL 0
2694
2695struct ieee80211_hw *wl1271_alloc_hw(void)
2696{
2697        struct ieee80211_hw *hw;
2698        struct platform_device *plat_dev = NULL;
2699        struct wl1271 *wl;
2700        int i, ret;
2701        unsigned int order;
2702
2703        hw = ieee80211_alloc_hw(sizeof(*wl), &wl1271_ops);
2704        if (!hw) {
2705                wl1271_error("could not alloc ieee80211_hw");
2706                ret = -ENOMEM;
2707                goto err_hw_alloc;
2708        }
2709
2710        plat_dev = kmemdup(&wl1271_device, sizeof(wl1271_device), GFP_KERNEL);
2711        if (!plat_dev) {
2712                wl1271_error("could not allocate platform_device");
2713                ret = -ENOMEM;
2714                goto err_plat_alloc;
2715        }
2716
2717        wl = hw->priv;
2718        memset(wl, 0, sizeof(*wl));
2719
2720        INIT_LIST_HEAD(&wl->list);
2721
2722        wl->hw = hw;
2723        wl->plat_dev = plat_dev;
2724
2725        for (i = 0; i < NUM_TX_QUEUES; i++)
2726                skb_queue_head_init(&wl->tx_queue[i]);
2727
2728        INIT_DELAYED_WORK(&wl->elp_work, wl1271_elp_work);
2729        INIT_DELAYED_WORK(&wl->pspoll_work, wl1271_pspoll_work);
2730        INIT_WORK(&wl->irq_work, wl1271_irq_work);
2731        INIT_WORK(&wl->tx_work, wl1271_tx_work);
2732        INIT_WORK(&wl->recovery_work, wl1271_recovery_work);
2733        INIT_DELAYED_WORK(&wl->scan_complete_work, wl1271_scan_complete_work);
2734        wl->channel = WL1271_DEFAULT_CHANNEL;
2735        wl->beacon_int = WL1271_DEFAULT_BEACON_INT;
2736        wl->default_key = 0;
2737        wl->rx_counter = 0;
2738        wl->rx_config = WL1271_DEFAULT_RX_CONFIG;
2739        wl->rx_filter = WL1271_DEFAULT_RX_FILTER;
2740        wl->psm_entry_retry = 0;
2741        wl->power_level = WL1271_DEFAULT_POWER_LEVEL;
2742        wl->basic_rate_set = CONF_TX_RATE_MASK_BASIC;
2743        wl->basic_rate = CONF_TX_RATE_MASK_BASIC;
2744        wl->rate_set = CONF_TX_RATE_MASK_BASIC;
2745        wl->sta_rate_set = 0;
2746        wl->band = IEEE80211_BAND_2GHZ;
2747        wl->vif = NULL;
2748        wl->flags = 0;
2749        wl->sg_enabled = true;
2750        wl->hw_pg_ver = -1;
2751
2752        memset(wl->tx_frames_map, 0, sizeof(wl->tx_frames_map));
2753        for (i = 0; i < ACX_TX_DESCRIPTORS; i++)
2754                wl->tx_frames[i] = NULL;
2755
2756        spin_lock_init(&wl->wl_lock);
2757
2758        wl->state = WL1271_STATE_OFF;
2759        mutex_init(&wl->mutex);
2760
2761        /* Apply default driver configuration. */
2762        wl1271_conf_init(wl);
2763
2764        order = get_order(WL1271_AGGR_BUFFER_SIZE);
2765        wl->aggr_buf = (u8 *)__get_free_pages(GFP_KERNEL, order);
2766        if (!wl->aggr_buf) {
2767                ret = -ENOMEM;
2768                goto err_hw;
2769        }
2770
2771        /* Register platform device */
2772        ret = platform_device_register(wl->plat_dev);
2773        if (ret) {
2774                wl1271_error("couldn't register platform device");
2775                goto err_aggr;
2776        }
2777        dev_set_drvdata(&wl->plat_dev->dev, wl);
2778
2779        /* Create sysfs file to control bt coex state */
2780        ret = device_create_file(&wl->plat_dev->dev, &dev_attr_bt_coex_state);
2781        if (ret < 0) {
2782                wl1271_error("failed to create sysfs file bt_coex_state");
2783                goto err_platform;
2784        }
2785
2786        /* Create sysfs file to get HW PG version */
2787        ret = device_create_file(&wl->plat_dev->dev, &dev_attr_hw_pg_ver);
2788        if (ret < 0) {
2789                wl1271_error("failed to create sysfs file hw_pg_ver");
2790                goto err_bt_coex_state;
2791        }
2792
2793        return hw;
2794
2795err_bt_coex_state:
2796        device_remove_file(&wl->plat_dev->dev, &dev_attr_bt_coex_state);
2797
2798err_platform:
2799        platform_device_unregister(wl->plat_dev);
2800
2801err_aggr:
2802        free_pages((unsigned long)wl->aggr_buf, order);
2803
2804err_hw:
2805        wl1271_debugfs_exit(wl);
2806        kfree(plat_dev);
2807
2808err_plat_alloc:
2809        ieee80211_free_hw(hw);
2810
2811err_hw_alloc:
2812
2813        return ERR_PTR(ret);
2814}
2815EXPORT_SYMBOL_GPL(wl1271_alloc_hw);
2816
2817int wl1271_free_hw(struct wl1271 *wl)
2818{
2819        platform_device_unregister(wl->plat_dev);
2820        free_pages((unsigned long)wl->aggr_buf,
2821                        get_order(WL1271_AGGR_BUFFER_SIZE));
2822        kfree(wl->plat_dev);
2823
2824        wl1271_debugfs_exit(wl);
2825
2826        vfree(wl->fw);
2827        wl->fw = NULL;
2828        kfree(wl->nvs);
2829        wl->nvs = NULL;
2830
2831        kfree(wl->fw_status);
2832        kfree(wl->tx_res_if);
2833
2834        ieee80211_free_hw(wl->hw);
2835
2836        return 0;
2837}
2838EXPORT_SYMBOL_GPL(wl1271_free_hw);
2839
2840u32 wl12xx_debug_level;
2841EXPORT_SYMBOL_GPL(wl12xx_debug_level);
2842module_param_named(debug_level, wl12xx_debug_level, uint, DEBUG_NONE);
2843MODULE_PARM_DESC(debug_level, "wl12xx debugging level");
2844
2845MODULE_LICENSE("GPL");
2846MODULE_AUTHOR("Luciano Coelho <luciano.coelho@nokia.com>");
2847MODULE_AUTHOR("Juuso Oikarinen <juuso.oikarinen@nokia.com>");
2848