linux/drivers/net/wireless/b43/main.c
<<
>>
Prefs
   1/*
   2
   3  Broadcom B43 wireless driver
   4
   5  Copyright (c) 2005 Martin Langer <martin-langer@gmx.de>
   6  Copyright (c) 2005 Stefano Brivio <stefano.brivio@polimi.it>
   7  Copyright (c) 2005-2009 Michael Buesch <m@bues.ch>
   8  Copyright (c) 2005 Danny van Dyk <kugelfang@gentoo.org>
   9  Copyright (c) 2005 Andreas Jaggi <andreas.jaggi@waterwave.ch>
  10  Copyright (c) 2010-2011 Rafał Miłecki <zajec5@gmail.com>
  11
  12  SDIO support
  13  Copyright (c) 2009 Albert Herranz <albert_herranz@yahoo.es>
  14
  15  Some parts of the code in this file are derived from the ipw2200
  16  driver  Copyright(c) 2003 - 2004 Intel Corporation.
  17
  18  This program is free software; you can redistribute it and/or modify
  19  it under the terms of the GNU General Public License as published by
  20  the Free Software Foundation; either version 2 of the License, or
  21  (at your option) any later version.
  22
  23  This program is distributed in the hope that it will be useful,
  24  but WITHOUT ANY WARRANTY; without even the implied warranty of
  25  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  26  GNU General Public License for more details.
  27
  28  You should have received a copy of the GNU General Public License
  29  along with this program; see the file COPYING.  If not, write to
  30  the Free Software Foundation, Inc., 51 Franklin Steet, Fifth Floor,
  31  Boston, MA 02110-1301, USA.
  32
  33*/
  34
  35#include <linux/delay.h>
  36#include <linux/init.h>
  37#include <linux/module.h>
  38#include <linux/if_arp.h>
  39#include <linux/etherdevice.h>
  40#include <linux/firmware.h>
  41#include <linux/workqueue.h>
  42#include <linux/skbuff.h>
  43#include <linux/io.h>
  44#include <linux/dma-mapping.h>
  45#include <linux/slab.h>
  46#include <asm/unaligned.h>
  47
  48#include "b43.h"
  49#include "main.h"
  50#include "debugfs.h"
  51#include "phy_common.h"
  52#include "phy_g.h"
  53#include "phy_n.h"
  54#include "dma.h"
  55#include "pio.h"
  56#include "sysfs.h"
  57#include "xmit.h"
  58#include "lo.h"
  59#include "pcmcia.h"
  60#include "sdio.h"
  61#include <linux/mmc/sdio_func.h>
  62
  63MODULE_DESCRIPTION("Broadcom B43 wireless driver");
  64MODULE_AUTHOR("Martin Langer");
  65MODULE_AUTHOR("Stefano Brivio");
  66MODULE_AUTHOR("Michael Buesch");
  67MODULE_AUTHOR("Gábor Stefanik");
  68MODULE_AUTHOR("Rafał Miłecki");
  69MODULE_LICENSE("GPL");
  70
  71MODULE_FIRMWARE("b43/ucode11.fw");
  72MODULE_FIRMWARE("b43/ucode13.fw");
  73MODULE_FIRMWARE("b43/ucode14.fw");
  74MODULE_FIRMWARE("b43/ucode15.fw");
  75MODULE_FIRMWARE("b43/ucode16_mimo.fw");
  76MODULE_FIRMWARE("b43/ucode5.fw");
  77MODULE_FIRMWARE("b43/ucode9.fw");
  78
  79static int modparam_bad_frames_preempt;
  80module_param_named(bad_frames_preempt, modparam_bad_frames_preempt, int, 0444);
  81MODULE_PARM_DESC(bad_frames_preempt,
  82                 "enable(1) / disable(0) Bad Frames Preemption");
  83
  84static char modparam_fwpostfix[16];
  85module_param_string(fwpostfix, modparam_fwpostfix, 16, 0444);
  86MODULE_PARM_DESC(fwpostfix, "Postfix for the .fw files to load.");
  87
  88static int modparam_hwpctl;
  89module_param_named(hwpctl, modparam_hwpctl, int, 0444);
  90MODULE_PARM_DESC(hwpctl, "Enable hardware-side power control (default off)");
  91
  92static int modparam_nohwcrypt;
  93module_param_named(nohwcrypt, modparam_nohwcrypt, int, 0444);
  94MODULE_PARM_DESC(nohwcrypt, "Disable hardware encryption.");
  95
  96static int modparam_hwtkip;
  97module_param_named(hwtkip, modparam_hwtkip, int, 0444);
  98MODULE_PARM_DESC(hwtkip, "Enable hardware tkip.");
  99
 100static int modparam_qos = 1;
 101module_param_named(qos, modparam_qos, int, 0444);
 102MODULE_PARM_DESC(qos, "Enable QOS support (default on)");
 103
 104static int modparam_btcoex = 1;
 105module_param_named(btcoex, modparam_btcoex, int, 0444);
 106MODULE_PARM_DESC(btcoex, "Enable Bluetooth coexistence (default on)");
 107
 108int b43_modparam_verbose = B43_VERBOSITY_DEFAULT;
 109module_param_named(verbose, b43_modparam_verbose, int, 0644);
 110MODULE_PARM_DESC(verbose, "Log message verbosity: 0=error, 1=warn, 2=info(default), 3=debug");
 111
 112static int b43_modparam_pio = 0;
 113module_param_named(pio, b43_modparam_pio, int, 0644);
 114MODULE_PARM_DESC(pio, "Use PIO accesses by default: 0=DMA, 1=PIO");
 115
 116#ifdef CONFIG_B43_BCMA
 117static const struct bcma_device_id b43_bcma_tbl[] = {
 118        BCMA_CORE(BCMA_MANUF_BCM, BCMA_CORE_80211, 0x11, BCMA_ANY_CLASS),
 119#ifdef CONFIG_B43_BCMA_EXTRA
 120        BCMA_CORE(BCMA_MANUF_BCM, BCMA_CORE_80211, 0x17, BCMA_ANY_CLASS),
 121        BCMA_CORE(BCMA_MANUF_BCM, BCMA_CORE_80211, 0x18, BCMA_ANY_CLASS),
 122#endif
 123        BCMA_CORE(BCMA_MANUF_BCM, BCMA_CORE_80211, 0x1D, BCMA_ANY_CLASS),
 124        BCMA_CORETABLE_END
 125};
 126MODULE_DEVICE_TABLE(bcma, b43_bcma_tbl);
 127#endif
 128
 129#ifdef CONFIG_B43_SSB
 130static const struct ssb_device_id b43_ssb_tbl[] = {
 131        SSB_DEVICE(SSB_VENDOR_BROADCOM, SSB_DEV_80211, 5),
 132        SSB_DEVICE(SSB_VENDOR_BROADCOM, SSB_DEV_80211, 6),
 133        SSB_DEVICE(SSB_VENDOR_BROADCOM, SSB_DEV_80211, 7),
 134        SSB_DEVICE(SSB_VENDOR_BROADCOM, SSB_DEV_80211, 9),
 135        SSB_DEVICE(SSB_VENDOR_BROADCOM, SSB_DEV_80211, 10),
 136        SSB_DEVICE(SSB_VENDOR_BROADCOM, SSB_DEV_80211, 11),
 137        SSB_DEVICE(SSB_VENDOR_BROADCOM, SSB_DEV_80211, 12),
 138        SSB_DEVICE(SSB_VENDOR_BROADCOM, SSB_DEV_80211, 13),
 139        SSB_DEVICE(SSB_VENDOR_BROADCOM, SSB_DEV_80211, 15),
 140        SSB_DEVICE(SSB_VENDOR_BROADCOM, SSB_DEV_80211, 16),
 141        SSB_DEVTABLE_END
 142};
 143MODULE_DEVICE_TABLE(ssb, b43_ssb_tbl);
 144#endif
 145
 146/* Channel and ratetables are shared for all devices.
 147 * They can't be const, because ieee80211 puts some precalculated
 148 * data in there. This data is the same for all devices, so we don't
 149 * get concurrency issues */
 150#define RATETAB_ENT(_rateid, _flags) \
 151        {                                                               \
 152                .bitrate        = B43_RATE_TO_BASE100KBPS(_rateid),     \
 153                .hw_value       = (_rateid),                            \
 154                .flags          = (_flags),                             \
 155        }
 156
 157/*
 158 * NOTE: When changing this, sync with xmit.c's
 159 *       b43_plcp_get_bitrate_idx_* functions!
 160 */
 161static struct ieee80211_rate __b43_ratetable[] = {
 162        RATETAB_ENT(B43_CCK_RATE_1MB, 0),
 163        RATETAB_ENT(B43_CCK_RATE_2MB, IEEE80211_RATE_SHORT_PREAMBLE),
 164        RATETAB_ENT(B43_CCK_RATE_5MB, IEEE80211_RATE_SHORT_PREAMBLE),
 165        RATETAB_ENT(B43_CCK_RATE_11MB, IEEE80211_RATE_SHORT_PREAMBLE),
 166        RATETAB_ENT(B43_OFDM_RATE_6MB, 0),
 167        RATETAB_ENT(B43_OFDM_RATE_9MB, 0),
 168        RATETAB_ENT(B43_OFDM_RATE_12MB, 0),
 169        RATETAB_ENT(B43_OFDM_RATE_18MB, 0),
 170        RATETAB_ENT(B43_OFDM_RATE_24MB, 0),
 171        RATETAB_ENT(B43_OFDM_RATE_36MB, 0),
 172        RATETAB_ENT(B43_OFDM_RATE_48MB, 0),
 173        RATETAB_ENT(B43_OFDM_RATE_54MB, 0),
 174};
 175
 176#define b43_a_ratetable         (__b43_ratetable + 4)
 177#define b43_a_ratetable_size    8
 178#define b43_b_ratetable         (__b43_ratetable + 0)
 179#define b43_b_ratetable_size    4
 180#define b43_g_ratetable         (__b43_ratetable + 0)
 181#define b43_g_ratetable_size    12
 182
 183#define CHAN4G(_channel, _freq, _flags) {                       \
 184        .band                   = IEEE80211_BAND_2GHZ,          \
 185        .center_freq            = (_freq),                      \
 186        .hw_value               = (_channel),                   \
 187        .flags                  = (_flags),                     \
 188        .max_antenna_gain       = 0,                            \
 189        .max_power              = 30,                           \
 190}
 191static struct ieee80211_channel b43_2ghz_chantable[] = {
 192        CHAN4G(1, 2412, 0),
 193        CHAN4G(2, 2417, 0),
 194        CHAN4G(3, 2422, 0),
 195        CHAN4G(4, 2427, 0),
 196        CHAN4G(5, 2432, 0),
 197        CHAN4G(6, 2437, 0),
 198        CHAN4G(7, 2442, 0),
 199        CHAN4G(8, 2447, 0),
 200        CHAN4G(9, 2452, 0),
 201        CHAN4G(10, 2457, 0),
 202        CHAN4G(11, 2462, 0),
 203        CHAN4G(12, 2467, 0),
 204        CHAN4G(13, 2472, 0),
 205        CHAN4G(14, 2484, 0),
 206};
 207#undef CHAN4G
 208
 209#define CHAN5G(_channel, _flags) {                              \
 210        .band                   = IEEE80211_BAND_5GHZ,          \
 211        .center_freq            = 5000 + (5 * (_channel)),      \
 212        .hw_value               = (_channel),                   \
 213        .flags                  = (_flags),                     \
 214        .max_antenna_gain       = 0,                            \
 215        .max_power              = 30,                           \
 216}
 217static struct ieee80211_channel b43_5ghz_nphy_chantable[] = {
 218        CHAN5G(32, 0),          CHAN5G(34, 0),
 219        CHAN5G(36, 0),          CHAN5G(38, 0),
 220        CHAN5G(40, 0),          CHAN5G(42, 0),
 221        CHAN5G(44, 0),          CHAN5G(46, 0),
 222        CHAN5G(48, 0),          CHAN5G(50, 0),
 223        CHAN5G(52, 0),          CHAN5G(54, 0),
 224        CHAN5G(56, 0),          CHAN5G(58, 0),
 225        CHAN5G(60, 0),          CHAN5G(62, 0),
 226        CHAN5G(64, 0),          CHAN5G(66, 0),
 227        CHAN5G(68, 0),          CHAN5G(70, 0),
 228        CHAN5G(72, 0),          CHAN5G(74, 0),
 229        CHAN5G(76, 0),          CHAN5G(78, 0),
 230        CHAN5G(80, 0),          CHAN5G(82, 0),
 231        CHAN5G(84, 0),          CHAN5G(86, 0),
 232        CHAN5G(88, 0),          CHAN5G(90, 0),
 233        CHAN5G(92, 0),          CHAN5G(94, 0),
 234        CHAN5G(96, 0),          CHAN5G(98, 0),
 235        CHAN5G(100, 0),         CHAN5G(102, 0),
 236        CHAN5G(104, 0),         CHAN5G(106, 0),
 237        CHAN5G(108, 0),         CHAN5G(110, 0),
 238        CHAN5G(112, 0),         CHAN5G(114, 0),
 239        CHAN5G(116, 0),         CHAN5G(118, 0),
 240        CHAN5G(120, 0),         CHAN5G(122, 0),
 241        CHAN5G(124, 0),         CHAN5G(126, 0),
 242        CHAN5G(128, 0),         CHAN5G(130, 0),
 243        CHAN5G(132, 0),         CHAN5G(134, 0),
 244        CHAN5G(136, 0),         CHAN5G(138, 0),
 245        CHAN5G(140, 0),         CHAN5G(142, 0),
 246        CHAN5G(144, 0),         CHAN5G(145, 0),
 247        CHAN5G(146, 0),         CHAN5G(147, 0),
 248        CHAN5G(148, 0),         CHAN5G(149, 0),
 249        CHAN5G(150, 0),         CHAN5G(151, 0),
 250        CHAN5G(152, 0),         CHAN5G(153, 0),
 251        CHAN5G(154, 0),         CHAN5G(155, 0),
 252        CHAN5G(156, 0),         CHAN5G(157, 0),
 253        CHAN5G(158, 0),         CHAN5G(159, 0),
 254        CHAN5G(160, 0),         CHAN5G(161, 0),
 255        CHAN5G(162, 0),         CHAN5G(163, 0),
 256        CHAN5G(164, 0),         CHAN5G(165, 0),
 257        CHAN5G(166, 0),         CHAN5G(168, 0),
 258        CHAN5G(170, 0),         CHAN5G(172, 0),
 259        CHAN5G(174, 0),         CHAN5G(176, 0),
 260        CHAN5G(178, 0),         CHAN5G(180, 0),
 261        CHAN5G(182, 0),         CHAN5G(184, 0),
 262        CHAN5G(186, 0),         CHAN5G(188, 0),
 263        CHAN5G(190, 0),         CHAN5G(192, 0),
 264        CHAN5G(194, 0),         CHAN5G(196, 0),
 265        CHAN5G(198, 0),         CHAN5G(200, 0),
 266        CHAN5G(202, 0),         CHAN5G(204, 0),
 267        CHAN5G(206, 0),         CHAN5G(208, 0),
 268        CHAN5G(210, 0),         CHAN5G(212, 0),
 269        CHAN5G(214, 0),         CHAN5G(216, 0),
 270        CHAN5G(218, 0),         CHAN5G(220, 0),
 271        CHAN5G(222, 0),         CHAN5G(224, 0),
 272        CHAN5G(226, 0),         CHAN5G(228, 0),
 273};
 274
 275static struct ieee80211_channel b43_5ghz_aphy_chantable[] = {
 276        CHAN5G(34, 0),          CHAN5G(36, 0),
 277        CHAN5G(38, 0),          CHAN5G(40, 0),
 278        CHAN5G(42, 0),          CHAN5G(44, 0),
 279        CHAN5G(46, 0),          CHAN5G(48, 0),
 280        CHAN5G(52, 0),          CHAN5G(56, 0),
 281        CHAN5G(60, 0),          CHAN5G(64, 0),
 282        CHAN5G(100, 0),         CHAN5G(104, 0),
 283        CHAN5G(108, 0),         CHAN5G(112, 0),
 284        CHAN5G(116, 0),         CHAN5G(120, 0),
 285        CHAN5G(124, 0),         CHAN5G(128, 0),
 286        CHAN5G(132, 0),         CHAN5G(136, 0),
 287        CHAN5G(140, 0),         CHAN5G(149, 0),
 288        CHAN5G(153, 0),         CHAN5G(157, 0),
 289        CHAN5G(161, 0),         CHAN5G(165, 0),
 290        CHAN5G(184, 0),         CHAN5G(188, 0),
 291        CHAN5G(192, 0),         CHAN5G(196, 0),
 292        CHAN5G(200, 0),         CHAN5G(204, 0),
 293        CHAN5G(208, 0),         CHAN5G(212, 0),
 294        CHAN5G(216, 0),
 295};
 296#undef CHAN5G
 297
 298static struct ieee80211_supported_band b43_band_5GHz_nphy = {
 299        .band           = IEEE80211_BAND_5GHZ,
 300        .channels       = b43_5ghz_nphy_chantable,
 301        .n_channels     = ARRAY_SIZE(b43_5ghz_nphy_chantable),
 302        .bitrates       = b43_a_ratetable,
 303        .n_bitrates     = b43_a_ratetable_size,
 304};
 305
 306static struct ieee80211_supported_band b43_band_5GHz_aphy = {
 307        .band           = IEEE80211_BAND_5GHZ,
 308        .channels       = b43_5ghz_aphy_chantable,
 309        .n_channels     = ARRAY_SIZE(b43_5ghz_aphy_chantable),
 310        .bitrates       = b43_a_ratetable,
 311        .n_bitrates     = b43_a_ratetable_size,
 312};
 313
 314static struct ieee80211_supported_band b43_band_2GHz = {
 315        .band           = IEEE80211_BAND_2GHZ,
 316        .channels       = b43_2ghz_chantable,
 317        .n_channels     = ARRAY_SIZE(b43_2ghz_chantable),
 318        .bitrates       = b43_g_ratetable,
 319        .n_bitrates     = b43_g_ratetable_size,
 320};
 321
 322static void b43_wireless_core_exit(struct b43_wldev *dev);
 323static int b43_wireless_core_init(struct b43_wldev *dev);
 324static struct b43_wldev * b43_wireless_core_stop(struct b43_wldev *dev);
 325static int b43_wireless_core_start(struct b43_wldev *dev);
 326static void b43_op_bss_info_changed(struct ieee80211_hw *hw,
 327                                    struct ieee80211_vif *vif,
 328                                    struct ieee80211_bss_conf *conf,
 329                                    u32 changed);
 330
 331static int b43_ratelimit(struct b43_wl *wl)
 332{
 333        if (!wl || !wl->current_dev)
 334                return 1;
 335        if (b43_status(wl->current_dev) < B43_STAT_STARTED)
 336                return 1;
 337        /* We are up and running.
 338         * Ratelimit the messages to avoid DoS over the net. */
 339        return net_ratelimit();
 340}
 341
 342void b43info(struct b43_wl *wl, const char *fmt, ...)
 343{
 344        struct va_format vaf;
 345        va_list args;
 346
 347        if (b43_modparam_verbose < B43_VERBOSITY_INFO)
 348                return;
 349        if (!b43_ratelimit(wl))
 350                return;
 351
 352        va_start(args, fmt);
 353
 354        vaf.fmt = fmt;
 355        vaf.va = &args;
 356
 357        printk(KERN_INFO "b43-%s: %pV",
 358               (wl && wl->hw) ? wiphy_name(wl->hw->wiphy) : "wlan", &vaf);
 359
 360        va_end(args);
 361}
 362
 363void b43err(struct b43_wl *wl, const char *fmt, ...)
 364{
 365        struct va_format vaf;
 366        va_list args;
 367
 368        if (b43_modparam_verbose < B43_VERBOSITY_ERROR)
 369                return;
 370        if (!b43_ratelimit(wl))
 371                return;
 372
 373        va_start(args, fmt);
 374
 375        vaf.fmt = fmt;
 376        vaf.va = &args;
 377
 378        printk(KERN_ERR "b43-%s ERROR: %pV",
 379               (wl && wl->hw) ? wiphy_name(wl->hw->wiphy) : "wlan", &vaf);
 380
 381        va_end(args);
 382}
 383
 384void b43warn(struct b43_wl *wl, const char *fmt, ...)
 385{
 386        struct va_format vaf;
 387        va_list args;
 388
 389        if (b43_modparam_verbose < B43_VERBOSITY_WARN)
 390                return;
 391        if (!b43_ratelimit(wl))
 392                return;
 393
 394        va_start(args, fmt);
 395
 396        vaf.fmt = fmt;
 397        vaf.va = &args;
 398
 399        printk(KERN_WARNING "b43-%s warning: %pV",
 400               (wl && wl->hw) ? wiphy_name(wl->hw->wiphy) : "wlan", &vaf);
 401
 402        va_end(args);
 403}
 404
 405void b43dbg(struct b43_wl *wl, const char *fmt, ...)
 406{
 407        struct va_format vaf;
 408        va_list args;
 409
 410        if (b43_modparam_verbose < B43_VERBOSITY_DEBUG)
 411                return;
 412
 413        va_start(args, fmt);
 414
 415        vaf.fmt = fmt;
 416        vaf.va = &args;
 417
 418        printk(KERN_DEBUG "b43-%s debug: %pV",
 419               (wl && wl->hw) ? wiphy_name(wl->hw->wiphy) : "wlan", &vaf);
 420
 421        va_end(args);
 422}
 423
 424static void b43_ram_write(struct b43_wldev *dev, u16 offset, u32 val)
 425{
 426        u32 macctl;
 427
 428        B43_WARN_ON(offset % 4 != 0);
 429
 430        macctl = b43_read32(dev, B43_MMIO_MACCTL);
 431        if (macctl & B43_MACCTL_BE)
 432                val = swab32(val);
 433
 434        b43_write32(dev, B43_MMIO_RAM_CONTROL, offset);
 435        mmiowb();
 436        b43_write32(dev, B43_MMIO_RAM_DATA, val);
 437}
 438
 439static inline void b43_shm_control_word(struct b43_wldev *dev,
 440                                        u16 routing, u16 offset)
 441{
 442        u32 control;
 443
 444        /* "offset" is the WORD offset. */
 445        control = routing;
 446        control <<= 16;
 447        control |= offset;
 448        b43_write32(dev, B43_MMIO_SHM_CONTROL, control);
 449}
 450
 451u32 b43_shm_read32(struct b43_wldev *dev, u16 routing, u16 offset)
 452{
 453        u32 ret;
 454
 455        if (routing == B43_SHM_SHARED) {
 456                B43_WARN_ON(offset & 0x0001);
 457                if (offset & 0x0003) {
 458                        /* Unaligned access */
 459                        b43_shm_control_word(dev, routing, offset >> 2);
 460                        ret = b43_read16(dev, B43_MMIO_SHM_DATA_UNALIGNED);
 461                        b43_shm_control_word(dev, routing, (offset >> 2) + 1);
 462                        ret |= ((u32)b43_read16(dev, B43_MMIO_SHM_DATA)) << 16;
 463
 464                        goto out;
 465                }
 466                offset >>= 2;
 467        }
 468        b43_shm_control_word(dev, routing, offset);
 469        ret = b43_read32(dev, B43_MMIO_SHM_DATA);
 470out:
 471        return ret;
 472}
 473
 474u16 b43_shm_read16(struct b43_wldev *dev, u16 routing, u16 offset)
 475{
 476        u16 ret;
 477
 478        if (routing == B43_SHM_SHARED) {
 479                B43_WARN_ON(offset & 0x0001);
 480                if (offset & 0x0003) {
 481                        /* Unaligned access */
 482                        b43_shm_control_word(dev, routing, offset >> 2);
 483                        ret = b43_read16(dev, B43_MMIO_SHM_DATA_UNALIGNED);
 484
 485                        goto out;
 486                }
 487                offset >>= 2;
 488        }
 489        b43_shm_control_word(dev, routing, offset);
 490        ret = b43_read16(dev, B43_MMIO_SHM_DATA);
 491out:
 492        return ret;
 493}
 494
 495void b43_shm_write32(struct b43_wldev *dev, u16 routing, u16 offset, u32 value)
 496{
 497        if (routing == B43_SHM_SHARED) {
 498                B43_WARN_ON(offset & 0x0001);
 499                if (offset & 0x0003) {
 500                        /* Unaligned access */
 501                        b43_shm_control_word(dev, routing, offset >> 2);
 502                        b43_write16(dev, B43_MMIO_SHM_DATA_UNALIGNED,
 503                                    value & 0xFFFF);
 504                        b43_shm_control_word(dev, routing, (offset >> 2) + 1);
 505                        b43_write16(dev, B43_MMIO_SHM_DATA,
 506                                    (value >> 16) & 0xFFFF);
 507                        return;
 508                }
 509                offset >>= 2;
 510        }
 511        b43_shm_control_word(dev, routing, offset);
 512        b43_write32(dev, B43_MMIO_SHM_DATA, value);
 513}
 514
 515void b43_shm_write16(struct b43_wldev *dev, u16 routing, u16 offset, u16 value)
 516{
 517        if (routing == B43_SHM_SHARED) {
 518                B43_WARN_ON(offset & 0x0001);
 519                if (offset & 0x0003) {
 520                        /* Unaligned access */
 521                        b43_shm_control_word(dev, routing, offset >> 2);
 522                        b43_write16(dev, B43_MMIO_SHM_DATA_UNALIGNED, value);
 523                        return;
 524                }
 525                offset >>= 2;
 526        }
 527        b43_shm_control_word(dev, routing, offset);
 528        b43_write16(dev, B43_MMIO_SHM_DATA, value);
 529}
 530
 531/* Read HostFlags */
 532u64 b43_hf_read(struct b43_wldev *dev)
 533{
 534        u64 ret;
 535
 536        ret = b43_shm_read16(dev, B43_SHM_SHARED, B43_SHM_SH_HOSTF3);
 537        ret <<= 16;
 538        ret |= b43_shm_read16(dev, B43_SHM_SHARED, B43_SHM_SH_HOSTF2);
 539        ret <<= 16;
 540        ret |= b43_shm_read16(dev, B43_SHM_SHARED, B43_SHM_SH_HOSTF1);
 541
 542        return ret;
 543}
 544
 545/* Write HostFlags */
 546void b43_hf_write(struct b43_wldev *dev, u64 value)
 547{
 548        u16 lo, mi, hi;
 549
 550        lo = (value & 0x00000000FFFFULL);
 551        mi = (value & 0x0000FFFF0000ULL) >> 16;
 552        hi = (value & 0xFFFF00000000ULL) >> 32;
 553        b43_shm_write16(dev, B43_SHM_SHARED, B43_SHM_SH_HOSTF1, lo);
 554        b43_shm_write16(dev, B43_SHM_SHARED, B43_SHM_SH_HOSTF2, mi);
 555        b43_shm_write16(dev, B43_SHM_SHARED, B43_SHM_SH_HOSTF3, hi);
 556}
 557
 558/* Read the firmware capabilities bitmask (Opensource firmware only) */
 559static u16 b43_fwcapa_read(struct b43_wldev *dev)
 560{
 561        B43_WARN_ON(!dev->fw.opensource);
 562        return b43_shm_read16(dev, B43_SHM_SHARED, B43_SHM_SH_FWCAPA);
 563}
 564
 565void b43_tsf_read(struct b43_wldev *dev, u64 *tsf)
 566{
 567        u32 low, high;
 568
 569        B43_WARN_ON(dev->dev->core_rev < 3);
 570
 571        /* The hardware guarantees us an atomic read, if we
 572         * read the low register first. */
 573        low = b43_read32(dev, B43_MMIO_REV3PLUS_TSF_LOW);
 574        high = b43_read32(dev, B43_MMIO_REV3PLUS_TSF_HIGH);
 575
 576        *tsf = high;
 577        *tsf <<= 32;
 578        *tsf |= low;
 579}
 580
 581static void b43_time_lock(struct b43_wldev *dev)
 582{
 583        b43_maskset32(dev, B43_MMIO_MACCTL, ~0, B43_MACCTL_TBTTHOLD);
 584        /* Commit the write */
 585        b43_read32(dev, B43_MMIO_MACCTL);
 586}
 587
 588static void b43_time_unlock(struct b43_wldev *dev)
 589{
 590        b43_maskset32(dev, B43_MMIO_MACCTL, ~B43_MACCTL_TBTTHOLD, 0);
 591        /* Commit the write */
 592        b43_read32(dev, B43_MMIO_MACCTL);
 593}
 594
 595static void b43_tsf_write_locked(struct b43_wldev *dev, u64 tsf)
 596{
 597        u32 low, high;
 598
 599        B43_WARN_ON(dev->dev->core_rev < 3);
 600
 601        low = tsf;
 602        high = (tsf >> 32);
 603        /* The hardware guarantees us an atomic write, if we
 604         * write the low register first. */
 605        b43_write32(dev, B43_MMIO_REV3PLUS_TSF_LOW, low);
 606        mmiowb();
 607        b43_write32(dev, B43_MMIO_REV3PLUS_TSF_HIGH, high);
 608        mmiowb();
 609}
 610
 611void b43_tsf_write(struct b43_wldev *dev, u64 tsf)
 612{
 613        b43_time_lock(dev);
 614        b43_tsf_write_locked(dev, tsf);
 615        b43_time_unlock(dev);
 616}
 617
 618static
 619void b43_macfilter_set(struct b43_wldev *dev, u16 offset, const u8 *mac)
 620{
 621        static const u8 zero_addr[ETH_ALEN] = { 0 };
 622        u16 data;
 623
 624        if (!mac)
 625                mac = zero_addr;
 626
 627        offset |= 0x0020;
 628        b43_write16(dev, B43_MMIO_MACFILTER_CONTROL, offset);
 629
 630        data = mac[0];
 631        data |= mac[1] << 8;
 632        b43_write16(dev, B43_MMIO_MACFILTER_DATA, data);
 633        data = mac[2];
 634        data |= mac[3] << 8;
 635        b43_write16(dev, B43_MMIO_MACFILTER_DATA, data);
 636        data = mac[4];
 637        data |= mac[5] << 8;
 638        b43_write16(dev, B43_MMIO_MACFILTER_DATA, data);
 639}
 640
 641static void b43_write_mac_bssid_templates(struct b43_wldev *dev)
 642{
 643        const u8 *mac;
 644        const u8 *bssid;
 645        u8 mac_bssid[ETH_ALEN * 2];
 646        int i;
 647        u32 tmp;
 648
 649        bssid = dev->wl->bssid;
 650        mac = dev->wl->mac_addr;
 651
 652        b43_macfilter_set(dev, B43_MACFILTER_BSSID, bssid);
 653
 654        memcpy(mac_bssid, mac, ETH_ALEN);
 655        memcpy(mac_bssid + ETH_ALEN, bssid, ETH_ALEN);
 656
 657        /* Write our MAC address and BSSID to template ram */
 658        for (i = 0; i < ARRAY_SIZE(mac_bssid); i += sizeof(u32)) {
 659                tmp = (u32) (mac_bssid[i + 0]);
 660                tmp |= (u32) (mac_bssid[i + 1]) << 8;
 661                tmp |= (u32) (mac_bssid[i + 2]) << 16;
 662                tmp |= (u32) (mac_bssid[i + 3]) << 24;
 663                b43_ram_write(dev, 0x20 + i, tmp);
 664        }
 665}
 666
 667static void b43_upload_card_macaddress(struct b43_wldev *dev)
 668{
 669        b43_write_mac_bssid_templates(dev);
 670        b43_macfilter_set(dev, B43_MACFILTER_SELF, dev->wl->mac_addr);
 671}
 672
 673static void b43_set_slot_time(struct b43_wldev *dev, u16 slot_time)
 674{
 675        /* slot_time is in usec. */
 676        /* This test used to exit for all but a G PHY. */
 677        if (b43_current_band(dev->wl) == IEEE80211_BAND_5GHZ)
 678                return;
 679        b43_write16(dev, B43_MMIO_IFSSLOT, 510 + slot_time);
 680        /* Shared memory location 0x0010 is the slot time and should be
 681         * set to slot_time; however, this register is initially 0 and changing
 682         * the value adversely affects the transmit rate for BCM4311
 683         * devices. Until this behavior is unterstood, delete this step
 684         *
 685         * b43_shm_write16(dev, B43_SHM_SHARED, 0x0010, slot_time);
 686         */
 687}
 688
 689static void b43_short_slot_timing_enable(struct b43_wldev *dev)
 690{
 691        b43_set_slot_time(dev, 9);
 692}
 693
 694static void b43_short_slot_timing_disable(struct b43_wldev *dev)
 695{
 696        b43_set_slot_time(dev, 20);
 697}
 698
 699/* DummyTransmission function, as documented on
 700 * http://bcm-v4.sipsolutions.net/802.11/DummyTransmission
 701 */
 702void b43_dummy_transmission(struct b43_wldev *dev, bool ofdm, bool pa_on)
 703{
 704        struct b43_phy *phy = &dev->phy;
 705        unsigned int i, max_loop;
 706        u16 value;
 707        u32 buffer[5] = {
 708                0x00000000,
 709                0x00D40000,
 710                0x00000000,
 711                0x01000000,
 712                0x00000000,
 713        };
 714
 715        if (ofdm) {
 716                max_loop = 0x1E;
 717                buffer[0] = 0x000201CC;
 718        } else {
 719                max_loop = 0xFA;
 720                buffer[0] = 0x000B846E;
 721        }
 722
 723        for (i = 0; i < 5; i++)
 724                b43_ram_write(dev, i * 4, buffer[i]);
 725
 726        b43_write16(dev, B43_MMIO_XMTSEL, 0x0000);
 727
 728        if (dev->dev->core_rev < 11)
 729                b43_write16(dev, B43_MMIO_WEPCTL, 0x0000);
 730        else
 731                b43_write16(dev, B43_MMIO_WEPCTL, 0x0100);
 732
 733        value = (ofdm ? 0x41 : 0x40);
 734        b43_write16(dev, B43_MMIO_TXE0_PHYCTL, value);
 735        if (phy->type == B43_PHYTYPE_N || phy->type == B43_PHYTYPE_LP ||
 736            phy->type == B43_PHYTYPE_LCN)
 737                b43_write16(dev, B43_MMIO_TXE0_PHYCTL1, 0x1A02);
 738
 739        b43_write16(dev, B43_MMIO_TXE0_WM_0, 0x0000);
 740        b43_write16(dev, B43_MMIO_TXE0_WM_1, 0x0000);
 741
 742        b43_write16(dev, B43_MMIO_XMTTPLATETXPTR, 0x0000);
 743        b43_write16(dev, B43_MMIO_XMTTXCNT, 0x0014);
 744        b43_write16(dev, B43_MMIO_XMTSEL, 0x0826);
 745        b43_write16(dev, B43_MMIO_TXE0_CTL, 0x0000);
 746
 747        if (!pa_on && phy->type == B43_PHYTYPE_N)
 748                ; /*b43_nphy_pa_override(dev, false) */
 749
 750        switch (phy->type) {
 751        case B43_PHYTYPE_N:
 752        case B43_PHYTYPE_LCN:
 753                b43_write16(dev, B43_MMIO_TXE0_AUX, 0x00D0);
 754                break;
 755        case B43_PHYTYPE_LP:
 756                b43_write16(dev, B43_MMIO_TXE0_AUX, 0x0050);
 757                break;
 758        default:
 759                b43_write16(dev, B43_MMIO_TXE0_AUX, 0x0030);
 760        }
 761        b43_read16(dev, B43_MMIO_TXE0_AUX);
 762
 763        if (phy->radio_ver == 0x2050 && phy->radio_rev <= 0x5)
 764                b43_radio_write16(dev, 0x0051, 0x0017);
 765        for (i = 0x00; i < max_loop; i++) {
 766                value = b43_read16(dev, B43_MMIO_TXE0_STATUS);
 767                if (value & 0x0080)
 768                        break;
 769                udelay(10);
 770        }
 771        for (i = 0x00; i < 0x0A; i++) {
 772                value = b43_read16(dev, B43_MMIO_TXE0_STATUS);
 773                if (value & 0x0400)
 774                        break;
 775                udelay(10);
 776        }
 777        for (i = 0x00; i < 0x19; i++) {
 778                value = b43_read16(dev, B43_MMIO_IFSSTAT);
 779                if (!(value & 0x0100))
 780                        break;
 781                udelay(10);
 782        }
 783        if (phy->radio_ver == 0x2050 && phy->radio_rev <= 0x5)
 784                b43_radio_write16(dev, 0x0051, 0x0037);
 785}
 786
 787static void key_write(struct b43_wldev *dev,
 788                      u8 index, u8 algorithm, const u8 *key)
 789{
 790        unsigned int i;
 791        u32 offset;
 792        u16 value;
 793        u16 kidx;
 794
 795        /* Key index/algo block */
 796        kidx = b43_kidx_to_fw(dev, index);
 797        value = ((kidx << 4) | algorithm);
 798        b43_shm_write16(dev, B43_SHM_SHARED,
 799                        B43_SHM_SH_KEYIDXBLOCK + (kidx * 2), value);
 800
 801        /* Write the key to the Key Table Pointer offset */
 802        offset = dev->ktp + (index * B43_SEC_KEYSIZE);
 803        for (i = 0; i < B43_SEC_KEYSIZE; i += 2) {
 804                value = key[i];
 805                value |= (u16) (key[i + 1]) << 8;
 806                b43_shm_write16(dev, B43_SHM_SHARED, offset + i, value);
 807        }
 808}
 809
 810static void keymac_write(struct b43_wldev *dev, u8 index, const u8 *addr)
 811{
 812        u32 addrtmp[2] = { 0, 0, };
 813        u8 pairwise_keys_start = B43_NR_GROUP_KEYS * 2;
 814
 815        if (b43_new_kidx_api(dev))
 816                pairwise_keys_start = B43_NR_GROUP_KEYS;
 817
 818        B43_WARN_ON(index < pairwise_keys_start);
 819        /* We have four default TX keys and possibly four default RX keys.
 820         * Physical mac 0 is mapped to physical key 4 or 8, depending
 821         * on the firmware version.
 822         * So we must adjust the index here.
 823         */
 824        index -= pairwise_keys_start;
 825        B43_WARN_ON(index >= B43_NR_PAIRWISE_KEYS);
 826
 827        if (addr) {
 828                addrtmp[0] = addr[0];
 829                addrtmp[0] |= ((u32) (addr[1]) << 8);
 830                addrtmp[0] |= ((u32) (addr[2]) << 16);
 831                addrtmp[0] |= ((u32) (addr[3]) << 24);
 832                addrtmp[1] = addr[4];
 833                addrtmp[1] |= ((u32) (addr[5]) << 8);
 834        }
 835
 836        /* Receive match transmitter address (RCMTA) mechanism */
 837        b43_shm_write32(dev, B43_SHM_RCMTA,
 838                        (index * 2) + 0, addrtmp[0]);
 839        b43_shm_write16(dev, B43_SHM_RCMTA,
 840                        (index * 2) + 1, addrtmp[1]);
 841}
 842
 843/* The ucode will use phase1 key with TEK key to decrypt rx packets.
 844 * When a packet is received, the iv32 is checked.
 845 * - if it doesn't the packet is returned without modification (and software
 846 *   decryption can be done). That's what happen when iv16 wrap.
 847 * - if it does, the rc4 key is computed, and decryption is tried.
 848 *   Either it will success and B43_RX_MAC_DEC is returned,
 849 *   either it fails and B43_RX_MAC_DEC|B43_RX_MAC_DECERR is returned
 850 *   and the packet is not usable (it got modified by the ucode).
 851 * So in order to never have B43_RX_MAC_DECERR, we should provide
 852 * a iv32 and phase1key that match. Because we drop packets in case of
 853 * B43_RX_MAC_DECERR, if we have a correct iv32 but a wrong phase1key, all
 854 * packets will be lost without higher layer knowing (ie no resync possible
 855 * until next wrap).
 856 *
 857 * NOTE : this should support 50 key like RCMTA because
 858 * (B43_SHM_SH_KEYIDXBLOCK - B43_SHM_SH_TKIPTSCTTAK)/14 = 50
 859 */
 860static void rx_tkip_phase1_write(struct b43_wldev *dev, u8 index, u32 iv32,
 861                u16 *phase1key)
 862{
 863        unsigned int i;
 864        u32 offset;
 865        u8 pairwise_keys_start = B43_NR_GROUP_KEYS * 2;
 866
 867        if (!modparam_hwtkip)
 868                return;
 869
 870        if (b43_new_kidx_api(dev))
 871                pairwise_keys_start = B43_NR_GROUP_KEYS;
 872
 873        B43_WARN_ON(index < pairwise_keys_start);
 874        /* We have four default TX keys and possibly four default RX keys.
 875         * Physical mac 0 is mapped to physical key 4 or 8, depending
 876         * on the firmware version.
 877         * So we must adjust the index here.
 878         */
 879        index -= pairwise_keys_start;
 880        B43_WARN_ON(index >= B43_NR_PAIRWISE_KEYS);
 881
 882        if (b43_debug(dev, B43_DBG_KEYS)) {
 883                b43dbg(dev->wl, "rx_tkip_phase1_write : idx 0x%x, iv32 0x%x\n",
 884                                index, iv32);
 885        }
 886        /* Write the key to the  RX tkip shared mem */
 887        offset = B43_SHM_SH_TKIPTSCTTAK + index * (10 + 4);
 888        for (i = 0; i < 10; i += 2) {
 889                b43_shm_write16(dev, B43_SHM_SHARED, offset + i,
 890                                phase1key ? phase1key[i / 2] : 0);
 891        }
 892        b43_shm_write16(dev, B43_SHM_SHARED, offset + i, iv32);
 893        b43_shm_write16(dev, B43_SHM_SHARED, offset + i + 2, iv32 >> 16);
 894}
 895
 896static void b43_op_update_tkip_key(struct ieee80211_hw *hw,
 897                                   struct ieee80211_vif *vif,
 898                                   struct ieee80211_key_conf *keyconf,
 899                                   struct ieee80211_sta *sta,
 900                                   u32 iv32, u16 *phase1key)
 901{
 902        struct b43_wl *wl = hw_to_b43_wl(hw);
 903        struct b43_wldev *dev;
 904        int index = keyconf->hw_key_idx;
 905
 906        if (B43_WARN_ON(!modparam_hwtkip))
 907                return;
 908
 909        /* This is only called from the RX path through mac80211, where
 910         * our mutex is already locked. */
 911        B43_WARN_ON(!mutex_is_locked(&wl->mutex));
 912        dev = wl->current_dev;
 913        B43_WARN_ON(!dev || b43_status(dev) < B43_STAT_INITIALIZED);
 914
 915        keymac_write(dev, index, NULL); /* First zero out mac to avoid race */
 916
 917        rx_tkip_phase1_write(dev, index, iv32, phase1key);
 918        /* only pairwise TKIP keys are supported right now */
 919        if (WARN_ON(!sta))
 920                return;
 921        keymac_write(dev, index, sta->addr);
 922}
 923
 924static void do_key_write(struct b43_wldev *dev,
 925                         u8 index, u8 algorithm,
 926                         const u8 *key, size_t key_len, const u8 *mac_addr)
 927{
 928        u8 buf[B43_SEC_KEYSIZE] = { 0, };
 929        u8 pairwise_keys_start = B43_NR_GROUP_KEYS * 2;
 930
 931        if (b43_new_kidx_api(dev))
 932                pairwise_keys_start = B43_NR_GROUP_KEYS;
 933
 934        B43_WARN_ON(index >= ARRAY_SIZE(dev->key));
 935        B43_WARN_ON(key_len > B43_SEC_KEYSIZE);
 936
 937        if (index >= pairwise_keys_start)
 938                keymac_write(dev, index, NULL); /* First zero out mac. */
 939        if (algorithm == B43_SEC_ALGO_TKIP) {
 940                /*
 941                 * We should provide an initial iv32, phase1key pair.
 942                 * We could start with iv32=0 and compute the corresponding
 943                 * phase1key, but this means calling ieee80211_get_tkip_key
 944                 * with a fake skb (or export other tkip function).
 945                 * Because we are lazy we hope iv32 won't start with
 946                 * 0xffffffff and let's b43_op_update_tkip_key provide a
 947                 * correct pair.
 948                 */
 949                rx_tkip_phase1_write(dev, index, 0xffffffff, (u16*)buf);
 950        } else if (index >= pairwise_keys_start) /* clear it */
 951                rx_tkip_phase1_write(dev, index, 0, NULL);
 952        if (key)
 953                memcpy(buf, key, key_len);
 954        key_write(dev, index, algorithm, buf);
 955        if (index >= pairwise_keys_start)
 956                keymac_write(dev, index, mac_addr);
 957
 958        dev->key[index].algorithm = algorithm;
 959}
 960
 961static int b43_key_write(struct b43_wldev *dev,
 962                         int index, u8 algorithm,
 963                         const u8 *key, size_t key_len,
 964                         const u8 *mac_addr,
 965                         struct ieee80211_key_conf *keyconf)
 966{
 967        int i;
 968        int pairwise_keys_start;
 969
 970        /* For ALG_TKIP the key is encoded as a 256-bit (32 byte) data block:
 971         *      - Temporal Encryption Key (128 bits)
 972         *      - Temporal Authenticator Tx MIC Key (64 bits)
 973         *      - Temporal Authenticator Rx MIC Key (64 bits)
 974         *
 975         *      Hardware only store TEK
 976         */
 977        if (algorithm == B43_SEC_ALGO_TKIP && key_len == 32)
 978                key_len = 16;
 979        if (key_len > B43_SEC_KEYSIZE)
 980                return -EINVAL;
 981        for (i = 0; i < ARRAY_SIZE(dev->key); i++) {
 982                /* Check that we don't already have this key. */
 983                B43_WARN_ON(dev->key[i].keyconf == keyconf);
 984        }
 985        if (index < 0) {
 986                /* Pairwise key. Get an empty slot for the key. */
 987                if (b43_new_kidx_api(dev))
 988                        pairwise_keys_start = B43_NR_GROUP_KEYS;
 989                else
 990                        pairwise_keys_start = B43_NR_GROUP_KEYS * 2;
 991                for (i = pairwise_keys_start;
 992                     i < pairwise_keys_start + B43_NR_PAIRWISE_KEYS;
 993                     i++) {
 994                        B43_WARN_ON(i >= ARRAY_SIZE(dev->key));
 995                        if (!dev->key[i].keyconf) {
 996                                /* found empty */
 997                                index = i;
 998                                break;
 999                        }
1000                }
1001                if (index < 0) {
1002                        b43warn(dev->wl, "Out of hardware key memory\n");
1003                        return -ENOSPC;
1004                }
1005        } else
1006                B43_WARN_ON(index > 3);
1007
1008        do_key_write(dev, index, algorithm, key, key_len, mac_addr);
1009        if ((index <= 3) && !b43_new_kidx_api(dev)) {
1010                /* Default RX key */
1011                B43_WARN_ON(mac_addr);
1012                do_key_write(dev, index + 4, algorithm, key, key_len, NULL);
1013        }
1014        keyconf->hw_key_idx = index;
1015        dev->key[index].keyconf = keyconf;
1016
1017        return 0;
1018}
1019
1020static int b43_key_clear(struct b43_wldev *dev, int index)
1021{
1022        if (B43_WARN_ON((index < 0) || (index >= ARRAY_SIZE(dev->key))))
1023                return -EINVAL;
1024        do_key_write(dev, index, B43_SEC_ALGO_NONE,
1025                     NULL, B43_SEC_KEYSIZE, NULL);
1026        if ((index <= 3) && !b43_new_kidx_api(dev)) {
1027                do_key_write(dev, index + 4, B43_SEC_ALGO_NONE,
1028                             NULL, B43_SEC_KEYSIZE, NULL);
1029        }
1030        dev->key[index].keyconf = NULL;
1031
1032        return 0;
1033}
1034
1035static void b43_clear_keys(struct b43_wldev *dev)
1036{
1037        int i, count;
1038
1039        if (b43_new_kidx_api(dev))
1040                count = B43_NR_GROUP_KEYS + B43_NR_PAIRWISE_KEYS;
1041        else
1042                count = B43_NR_GROUP_KEYS * 2 + B43_NR_PAIRWISE_KEYS;
1043        for (i = 0; i < count; i++)
1044                b43_key_clear(dev, i);
1045}
1046
1047static void b43_dump_keymemory(struct b43_wldev *dev)
1048{
1049        unsigned int i, index, count, offset, pairwise_keys_start;
1050        u8 mac[ETH_ALEN];
1051        u16 algo;
1052        u32 rcmta0;
1053        u16 rcmta1;
1054        u64 hf;
1055        struct b43_key *key;
1056
1057        if (!b43_debug(dev, B43_DBG_KEYS))
1058                return;
1059
1060        hf = b43_hf_read(dev);
1061        b43dbg(dev->wl, "Hardware key memory dump:  USEDEFKEYS=%u\n",
1062               !!(hf & B43_HF_USEDEFKEYS));
1063        if (b43_new_kidx_api(dev)) {
1064                pairwise_keys_start = B43_NR_GROUP_KEYS;
1065                count = B43_NR_GROUP_KEYS + B43_NR_PAIRWISE_KEYS;
1066        } else {
1067                pairwise_keys_start = B43_NR_GROUP_KEYS * 2;
1068                count = B43_NR_GROUP_KEYS * 2 + B43_NR_PAIRWISE_KEYS;
1069        }
1070        for (index = 0; index < count; index++) {
1071                key = &(dev->key[index]);
1072                printk(KERN_DEBUG "Key slot %02u: %s",
1073                       index, (key->keyconf == NULL) ? " " : "*");
1074                offset = dev->ktp + (index * B43_SEC_KEYSIZE);
1075                for (i = 0; i < B43_SEC_KEYSIZE; i += 2) {
1076                        u16 tmp = b43_shm_read16(dev, B43_SHM_SHARED, offset + i);
1077                        printk("%02X%02X", (tmp & 0xFF), ((tmp >> 8) & 0xFF));
1078                }
1079
1080                algo = b43_shm_read16(dev, B43_SHM_SHARED,
1081                                      B43_SHM_SH_KEYIDXBLOCK + (index * 2));
1082                printk("   Algo: %04X/%02X", algo, key->algorithm);
1083
1084                if (index >= pairwise_keys_start) {
1085                        if (key->algorithm == B43_SEC_ALGO_TKIP) {
1086                                printk("   TKIP: ");
1087                                offset = B43_SHM_SH_TKIPTSCTTAK + (index - 4) * (10 + 4);
1088                                for (i = 0; i < 14; i += 2) {
1089                                        u16 tmp = b43_shm_read16(dev, B43_SHM_SHARED, offset + i);
1090                                        printk("%02X%02X", (tmp & 0xFF), ((tmp >> 8) & 0xFF));
1091                                }
1092                        }
1093                        rcmta0 = b43_shm_read32(dev, B43_SHM_RCMTA,
1094                                                ((index - pairwise_keys_start) * 2) + 0);
1095                        rcmta1 = b43_shm_read16(dev, B43_SHM_RCMTA,
1096                                                ((index - pairwise_keys_start) * 2) + 1);
1097                        *((__le32 *)(&mac[0])) = cpu_to_le32(rcmta0);
1098                        *((__le16 *)(&mac[4])) = cpu_to_le16(rcmta1);
1099                        printk("   MAC: %pM", mac);
1100                } else
1101                        printk("   DEFAULT KEY");
1102                printk("\n");
1103        }
1104}
1105
1106void b43_power_saving_ctl_bits(struct b43_wldev *dev, unsigned int ps_flags)
1107{
1108        u32 macctl;
1109        u16 ucstat;
1110        bool hwps;
1111        bool awake;
1112        int i;
1113
1114        B43_WARN_ON((ps_flags & B43_PS_ENABLED) &&
1115                    (ps_flags & B43_PS_DISABLED));
1116        B43_WARN_ON((ps_flags & B43_PS_AWAKE) && (ps_flags & B43_PS_ASLEEP));
1117
1118        if (ps_flags & B43_PS_ENABLED) {
1119                hwps = true;
1120        } else if (ps_flags & B43_PS_DISABLED) {
1121                hwps = false;
1122        } else {
1123                //TODO: If powersave is not off and FIXME is not set and we are not in adhoc
1124                //      and thus is not an AP and we are associated, set bit 25
1125        }
1126        if (ps_flags & B43_PS_AWAKE) {
1127                awake = true;
1128        } else if (ps_flags & B43_PS_ASLEEP) {
1129                awake = false;
1130        } else {
1131                //TODO: If the device is awake or this is an AP, or we are scanning, or FIXME,
1132                //      or we are associated, or FIXME, or the latest PS-Poll packet sent was
1133                //      successful, set bit26
1134        }
1135
1136/* FIXME: For now we force awake-on and hwps-off */
1137        hwps = false;
1138        awake = true;
1139
1140        macctl = b43_read32(dev, B43_MMIO_MACCTL);
1141        if (hwps)
1142                macctl |= B43_MACCTL_HWPS;
1143        else
1144                macctl &= ~B43_MACCTL_HWPS;
1145        if (awake)
1146                macctl |= B43_MACCTL_AWAKE;
1147        else
1148                macctl &= ~B43_MACCTL_AWAKE;
1149        b43_write32(dev, B43_MMIO_MACCTL, macctl);
1150        /* Commit write */
1151        b43_read32(dev, B43_MMIO_MACCTL);
1152        if (awake && dev->dev->core_rev >= 5) {
1153                /* Wait for the microcode to wake up. */
1154                for (i = 0; i < 100; i++) {
1155                        ucstat = b43_shm_read16(dev, B43_SHM_SHARED,
1156                                                B43_SHM_SH_UCODESTAT);
1157                        if (ucstat != B43_SHM_SH_UCODESTAT_SLEEP)
1158                                break;
1159                        udelay(10);
1160                }
1161        }
1162}
1163
1164#ifdef CONFIG_B43_BCMA
1165static void b43_bcma_phy_reset(struct b43_wldev *dev)
1166{
1167        u32 flags;
1168
1169        /* Put PHY into reset */
1170        flags = bcma_aread32(dev->dev->bdev, BCMA_IOCTL);
1171        flags |= B43_BCMA_IOCTL_PHY_RESET;
1172        flags |= B43_BCMA_IOCTL_PHY_BW_20MHZ; /* Make 20 MHz def */
1173        bcma_awrite32(dev->dev->bdev, BCMA_IOCTL, flags);
1174        udelay(2);
1175
1176        /* Take PHY out of reset */
1177        flags = bcma_aread32(dev->dev->bdev, BCMA_IOCTL);
1178        flags &= ~B43_BCMA_IOCTL_PHY_RESET;
1179        flags |= BCMA_IOCTL_FGC;
1180        bcma_awrite32(dev->dev->bdev, BCMA_IOCTL, flags);
1181        udelay(1);
1182
1183        /* Do not force clock anymore */
1184        flags = bcma_aread32(dev->dev->bdev, BCMA_IOCTL);
1185        flags &= ~BCMA_IOCTL_FGC;
1186        bcma_awrite32(dev->dev->bdev, BCMA_IOCTL, flags);
1187        udelay(1);
1188}
1189
1190static void b43_bcma_wireless_core_reset(struct b43_wldev *dev, bool gmode)
1191{
1192        b43_device_enable(dev, B43_BCMA_IOCTL_PHY_CLKEN);
1193        bcma_core_set_clockmode(dev->dev->bdev, BCMA_CLKMODE_FAST);
1194        b43_bcma_phy_reset(dev);
1195        bcma_core_pll_ctl(dev->dev->bdev, 0x300, 0x3000000, true);
1196}
1197#endif
1198
1199static void b43_ssb_wireless_core_reset(struct b43_wldev *dev, bool gmode)
1200{
1201        struct ssb_device *sdev = dev->dev->sdev;
1202        u32 tmslow;
1203        u32 flags = 0;
1204
1205        if (gmode)
1206                flags |= B43_TMSLOW_GMODE;
1207        flags |= B43_TMSLOW_PHYCLKEN;
1208        flags |= B43_TMSLOW_PHYRESET;
1209        if (dev->phy.type == B43_PHYTYPE_N)
1210                flags |= B43_TMSLOW_PHY_BANDWIDTH_20MHZ; /* Make 20 MHz def */
1211        b43_device_enable(dev, flags);
1212        msleep(2);              /* Wait for the PLL to turn on. */
1213
1214        /* Now take the PHY out of Reset again */
1215        tmslow = ssb_read32(sdev, SSB_TMSLOW);
1216        tmslow |= SSB_TMSLOW_FGC;
1217        tmslow &= ~B43_TMSLOW_PHYRESET;
1218        ssb_write32(sdev, SSB_TMSLOW, tmslow);
1219        ssb_read32(sdev, SSB_TMSLOW);   /* flush */
1220        msleep(1);
1221        tmslow &= ~SSB_TMSLOW_FGC;
1222        ssb_write32(sdev, SSB_TMSLOW, tmslow);
1223        ssb_read32(sdev, SSB_TMSLOW);   /* flush */
1224        msleep(1);
1225}
1226
1227void b43_wireless_core_reset(struct b43_wldev *dev, bool gmode)
1228{
1229        u32 macctl;
1230
1231        switch (dev->dev->bus_type) {
1232#ifdef CONFIG_B43_BCMA
1233        case B43_BUS_BCMA:
1234                b43_bcma_wireless_core_reset(dev, gmode);
1235                break;
1236#endif
1237#ifdef CONFIG_B43_SSB
1238        case B43_BUS_SSB:
1239                b43_ssb_wireless_core_reset(dev, gmode);
1240                break;
1241#endif
1242        }
1243
1244        /* Turn Analog ON, but only if we already know the PHY-type.
1245         * This protects against very early setup where we don't know the
1246         * PHY-type, yet. wireless_core_reset will be called once again later,
1247         * when we know the PHY-type. */
1248        if (dev->phy.ops)
1249                dev->phy.ops->switch_analog(dev, 1);
1250
1251        macctl = b43_read32(dev, B43_MMIO_MACCTL);
1252        macctl &= ~B43_MACCTL_GMODE;
1253        if (gmode)
1254                macctl |= B43_MACCTL_GMODE;
1255        macctl |= B43_MACCTL_IHR_ENABLED;
1256        b43_write32(dev, B43_MMIO_MACCTL, macctl);
1257}
1258
1259static void handle_irq_transmit_status(struct b43_wldev *dev)
1260{
1261        u32 v0, v1;
1262        u16 tmp;
1263        struct b43_txstatus stat;
1264
1265        while (1) {
1266                v0 = b43_read32(dev, B43_MMIO_XMITSTAT_0);
1267                if (!(v0 & 0x00000001))
1268                        break;
1269                v1 = b43_read32(dev, B43_MMIO_XMITSTAT_1);
1270
1271                stat.cookie = (v0 >> 16);
1272                stat.seq = (v1 & 0x0000FFFF);
1273                stat.phy_stat = ((v1 & 0x00FF0000) >> 16);
1274                tmp = (v0 & 0x0000FFFF);
1275                stat.frame_count = ((tmp & 0xF000) >> 12);
1276                stat.rts_count = ((tmp & 0x0F00) >> 8);
1277                stat.supp_reason = ((tmp & 0x001C) >> 2);
1278                stat.pm_indicated = !!(tmp & 0x0080);
1279                stat.intermediate = !!(tmp & 0x0040);
1280                stat.for_ampdu = !!(tmp & 0x0020);
1281                stat.acked = !!(tmp & 0x0002);
1282
1283                b43_handle_txstatus(dev, &stat);
1284        }
1285}
1286
1287static void drain_txstatus_queue(struct b43_wldev *dev)
1288{
1289        u32 dummy;
1290
1291        if (dev->dev->core_rev < 5)
1292                return;
1293        /* Read all entries from the microcode TXstatus FIFO
1294         * and throw them away.
1295         */
1296        while (1) {
1297                dummy = b43_read32(dev, B43_MMIO_XMITSTAT_0);
1298                if (!(dummy & 0x00000001))
1299                        break;
1300                dummy = b43_read32(dev, B43_MMIO_XMITSTAT_1);
1301        }
1302}
1303
1304static u32 b43_jssi_read(struct b43_wldev *dev)
1305{
1306        u32 val = 0;
1307
1308        val = b43_shm_read16(dev, B43_SHM_SHARED, 0x08A);
1309        val <<= 16;
1310        val |= b43_shm_read16(dev, B43_SHM_SHARED, 0x088);
1311
1312        return val;
1313}
1314
1315static void b43_jssi_write(struct b43_wldev *dev, u32 jssi)
1316{
1317        b43_shm_write16(dev, B43_SHM_SHARED, 0x088, (jssi & 0x0000FFFF));
1318        b43_shm_write16(dev, B43_SHM_SHARED, 0x08A, (jssi & 0xFFFF0000) >> 16);
1319}
1320
1321static void b43_generate_noise_sample(struct b43_wldev *dev)
1322{
1323        b43_jssi_write(dev, 0x7F7F7F7F);
1324        b43_write32(dev, B43_MMIO_MACCMD,
1325                    b43_read32(dev, B43_MMIO_MACCMD) | B43_MACCMD_BGNOISE);
1326}
1327
1328static void b43_calculate_link_quality(struct b43_wldev *dev)
1329{
1330        /* Top half of Link Quality calculation. */
1331
1332        if (dev->phy.type != B43_PHYTYPE_G)
1333                return;
1334        if (dev->noisecalc.calculation_running)
1335                return;
1336        dev->noisecalc.calculation_running = true;
1337        dev->noisecalc.nr_samples = 0;
1338
1339        b43_generate_noise_sample(dev);
1340}
1341
1342static void handle_irq_noise(struct b43_wldev *dev)
1343{
1344        struct b43_phy_g *phy = dev->phy.g;
1345        u16 tmp;
1346        u8 noise[4];
1347        u8 i, j;
1348        s32 average;
1349
1350        /* Bottom half of Link Quality calculation. */
1351
1352        if (dev->phy.type != B43_PHYTYPE_G)
1353                return;
1354
1355        /* Possible race condition: It might be possible that the user
1356         * changed to a different channel in the meantime since we
1357         * started the calculation. We ignore that fact, since it's
1358         * not really that much of a problem. The background noise is
1359         * an estimation only anyway. Slightly wrong results will get damped
1360         * by the averaging of the 8 sample rounds. Additionally the
1361         * value is shortlived. So it will be replaced by the next noise
1362         * calculation round soon. */
1363
1364        B43_WARN_ON(!dev->noisecalc.calculation_running);
1365        *((__le32 *)noise) = cpu_to_le32(b43_jssi_read(dev));
1366        if (noise[0] == 0x7F || noise[1] == 0x7F ||
1367            noise[2] == 0x7F || noise[3] == 0x7F)
1368                goto generate_new;
1369
1370        /* Get the noise samples. */
1371        B43_WARN_ON(dev->noisecalc.nr_samples >= 8);
1372        i = dev->noisecalc.nr_samples;
1373        noise[0] = clamp_val(noise[0], 0, ARRAY_SIZE(phy->nrssi_lt) - 1);
1374        noise[1] = clamp_val(noise[1], 0, ARRAY_SIZE(phy->nrssi_lt) - 1);
1375        noise[2] = clamp_val(noise[2], 0, ARRAY_SIZE(phy->nrssi_lt) - 1);
1376        noise[3] = clamp_val(noise[3], 0, ARRAY_SIZE(phy->nrssi_lt) - 1);
1377        dev->noisecalc.samples[i][0] = phy->nrssi_lt[noise[0]];
1378        dev->noisecalc.samples[i][1] = phy->nrssi_lt[noise[1]];
1379        dev->noisecalc.samples[i][2] = phy->nrssi_lt[noise[2]];
1380        dev->noisecalc.samples[i][3] = phy->nrssi_lt[noise[3]];
1381        dev->noisecalc.nr_samples++;
1382        if (dev->noisecalc.nr_samples == 8) {
1383                /* Calculate the Link Quality by the noise samples. */
1384                average = 0;
1385                for (i = 0; i < 8; i++) {
1386                        for (j = 0; j < 4; j++)
1387                                average += dev->noisecalc.samples[i][j];
1388                }
1389                average /= (8 * 4);
1390                average *= 125;
1391                average += 64;
1392                average /= 128;
1393                tmp = b43_shm_read16(dev, B43_SHM_SHARED, 0x40C);
1394                tmp = (tmp / 128) & 0x1F;
1395                if (tmp >= 8)
1396                        average += 2;
1397                else
1398                        average -= 25;
1399                if (tmp == 8)
1400                        average -= 72;
1401                else
1402                        average -= 48;
1403
1404                dev->stats.link_noise = average;
1405                dev->noisecalc.calculation_running = false;
1406                return;
1407        }
1408generate_new:
1409        b43_generate_noise_sample(dev);
1410}
1411
1412static void handle_irq_tbtt_indication(struct b43_wldev *dev)
1413{
1414        if (b43_is_mode(dev->wl, NL80211_IFTYPE_AP)) {
1415                ///TODO: PS TBTT
1416        } else {
1417                if (1 /*FIXME: the last PSpoll frame was sent successfully */ )
1418                        b43_power_saving_ctl_bits(dev, 0);
1419        }
1420        if (b43_is_mode(dev->wl, NL80211_IFTYPE_ADHOC))
1421                dev->dfq_valid = true;
1422}
1423
1424static void handle_irq_atim_end(struct b43_wldev *dev)
1425{
1426        if (dev->dfq_valid) {
1427                b43_write32(dev, B43_MMIO_MACCMD,
1428                            b43_read32(dev, B43_MMIO_MACCMD)
1429                            | B43_MACCMD_DFQ_VALID);
1430                dev->dfq_valid = false;
1431        }
1432}
1433
1434static void handle_irq_pmq(struct b43_wldev *dev)
1435{
1436        u32 tmp;
1437
1438        //TODO: AP mode.
1439
1440        while (1) {
1441                tmp = b43_read32(dev, B43_MMIO_PS_STATUS);
1442                if (!(tmp & 0x00000008))
1443                        break;
1444        }
1445        /* 16bit write is odd, but correct. */
1446        b43_write16(dev, B43_MMIO_PS_STATUS, 0x0002);
1447}
1448
1449static void b43_write_template_common(struct b43_wldev *dev,
1450                                      const u8 *data, u16 size,
1451                                      u16 ram_offset,
1452                                      u16 shm_size_offset, u8 rate)
1453{
1454        u32 i, tmp;
1455        struct b43_plcp_hdr4 plcp;
1456
1457        plcp.data = 0;
1458        b43_generate_plcp_hdr(&plcp, size + FCS_LEN, rate);
1459        b43_ram_write(dev, ram_offset, le32_to_cpu(plcp.data));
1460        ram_offset += sizeof(u32);
1461        /* The PLCP is 6 bytes long, but we only wrote 4 bytes, yet.
1462         * So leave the first two bytes of the next write blank.
1463         */
1464        tmp = (u32) (data[0]) << 16;
1465        tmp |= (u32) (data[1]) << 24;
1466        b43_ram_write(dev, ram_offset, tmp);
1467        ram_offset += sizeof(u32);
1468        for (i = 2; i < size; i += sizeof(u32)) {
1469                tmp = (u32) (data[i + 0]);
1470                if (i + 1 < size)
1471                        tmp |= (u32) (data[i + 1]) << 8;
1472                if (i + 2 < size)
1473                        tmp |= (u32) (data[i + 2]) << 16;
1474                if (i + 3 < size)
1475                        tmp |= (u32) (data[i + 3]) << 24;
1476                b43_ram_write(dev, ram_offset + i - 2, tmp);
1477        }
1478        b43_shm_write16(dev, B43_SHM_SHARED, shm_size_offset,
1479                        size + sizeof(struct b43_plcp_hdr6));
1480}
1481
1482/* Check if the use of the antenna that ieee80211 told us to
1483 * use is possible. This will fall back to DEFAULT.
1484 * "antenna_nr" is the antenna identifier we got from ieee80211. */
1485u8 b43_ieee80211_antenna_sanitize(struct b43_wldev *dev,
1486                                  u8 antenna_nr)
1487{
1488        u8 antenna_mask;
1489
1490        if (antenna_nr == 0) {
1491                /* Zero means "use default antenna". That's always OK. */
1492                return 0;
1493        }
1494
1495        /* Get the mask of available antennas. */
1496        if (dev->phy.gmode)
1497                antenna_mask = dev->dev->bus_sprom->ant_available_bg;
1498        else
1499                antenna_mask = dev->dev->bus_sprom->ant_available_a;
1500
1501        if (!(antenna_mask & (1 << (antenna_nr - 1)))) {
1502                /* This antenna is not available. Fall back to default. */
1503                return 0;
1504        }
1505
1506        return antenna_nr;
1507}
1508
1509/* Convert a b43 antenna number value to the PHY TX control value. */
1510static u16 b43_antenna_to_phyctl(int antenna)
1511{
1512        switch (antenna) {
1513        case B43_ANTENNA0:
1514                return B43_TXH_PHY_ANT0;
1515        case B43_ANTENNA1:
1516                return B43_TXH_PHY_ANT1;
1517        case B43_ANTENNA2:
1518                return B43_TXH_PHY_ANT2;
1519        case B43_ANTENNA3:
1520                return B43_TXH_PHY_ANT3;
1521        case B43_ANTENNA_AUTO0:
1522        case B43_ANTENNA_AUTO1:
1523                return B43_TXH_PHY_ANT01AUTO;
1524        }
1525        B43_WARN_ON(1);
1526        return 0;
1527}
1528
1529static void b43_write_beacon_template(struct b43_wldev *dev,
1530                                      u16 ram_offset,
1531                                      u16 shm_size_offset)
1532{
1533        unsigned int i, len, variable_len;
1534        const struct ieee80211_mgmt *bcn;
1535        const u8 *ie;
1536        bool tim_found = false;
1537        unsigned int rate;
1538        u16 ctl;
1539        int antenna;
1540        struct ieee80211_tx_info *info = IEEE80211_SKB_CB(dev->wl->current_beacon);
1541
1542        bcn = (const struct ieee80211_mgmt *)(dev->wl->current_beacon->data);
1543        len = min((size_t) dev->wl->current_beacon->len,
1544                  0x200 - sizeof(struct b43_plcp_hdr6));
1545        rate = ieee80211_get_tx_rate(dev->wl->hw, info)->hw_value;
1546
1547        b43_write_template_common(dev, (const u8 *)bcn,
1548                                  len, ram_offset, shm_size_offset, rate);
1549
1550        /* Write the PHY TX control parameters. */
1551        antenna = B43_ANTENNA_DEFAULT;
1552        antenna = b43_antenna_to_phyctl(antenna);
1553        ctl = b43_shm_read16(dev, B43_SHM_SHARED, B43_SHM_SH_BEACPHYCTL);
1554        /* We can't send beacons with short preamble. Would get PHY errors. */
1555        ctl &= ~B43_TXH_PHY_SHORTPRMBL;
1556        ctl &= ~B43_TXH_PHY_ANT;
1557        ctl &= ~B43_TXH_PHY_ENC;
1558        ctl |= antenna;
1559        if (b43_is_cck_rate(rate))
1560                ctl |= B43_TXH_PHY_ENC_CCK;
1561        else
1562                ctl |= B43_TXH_PHY_ENC_OFDM;
1563        b43_shm_write16(dev, B43_SHM_SHARED, B43_SHM_SH_BEACPHYCTL, ctl);
1564
1565        /* Find the position of the TIM and the DTIM_period value
1566         * and write them to SHM. */
1567        ie = bcn->u.beacon.variable;
1568        variable_len = len - offsetof(struct ieee80211_mgmt, u.beacon.variable);
1569        for (i = 0; i < variable_len - 2; ) {
1570                uint8_t ie_id, ie_len;
1571
1572                ie_id = ie[i];
1573                ie_len = ie[i + 1];
1574                if (ie_id == 5) {
1575                        u16 tim_position;
1576                        u16 dtim_period;
1577                        /* This is the TIM Information Element */
1578
1579                        /* Check whether the ie_len is in the beacon data range. */
1580                        if (variable_len < ie_len + 2 + i)
1581                                break;
1582                        /* A valid TIM is at least 4 bytes long. */
1583                        if (ie_len < 4)
1584                                break;
1585                        tim_found = true;
1586
1587                        tim_position = sizeof(struct b43_plcp_hdr6);
1588                        tim_position += offsetof(struct ieee80211_mgmt, u.beacon.variable);
1589                        tim_position += i;
1590
1591                        dtim_period = ie[i + 3];
1592
1593                        b43_shm_write16(dev, B43_SHM_SHARED,
1594                                        B43_SHM_SH_TIMBPOS, tim_position);
1595                        b43_shm_write16(dev, B43_SHM_SHARED,
1596                                        B43_SHM_SH_DTIMPER, dtim_period);
1597                        break;
1598                }
1599                i += ie_len + 2;
1600        }
1601        if (!tim_found) {
1602                /*
1603                 * If ucode wants to modify TIM do it behind the beacon, this
1604                 * will happen, for example, when doing mesh networking.
1605                 */
1606                b43_shm_write16(dev, B43_SHM_SHARED,
1607                                B43_SHM_SH_TIMBPOS,
1608                                len + sizeof(struct b43_plcp_hdr6));
1609                b43_shm_write16(dev, B43_SHM_SHARED,
1610                                B43_SHM_SH_DTIMPER, 0);
1611        }
1612        b43dbg(dev->wl, "Updated beacon template at 0x%x\n", ram_offset);
1613}
1614
1615static void b43_upload_beacon0(struct b43_wldev *dev)
1616{
1617        struct b43_wl *wl = dev->wl;
1618
1619        if (wl->beacon0_uploaded)
1620                return;
1621        b43_write_beacon_template(dev, 0x68, 0x18);
1622        wl->beacon0_uploaded = true;
1623}
1624
1625static void b43_upload_beacon1(struct b43_wldev *dev)
1626{
1627        struct b43_wl *wl = dev->wl;
1628
1629        if (wl->beacon1_uploaded)
1630                return;
1631        b43_write_beacon_template(dev, 0x468, 0x1A);
1632        wl->beacon1_uploaded = true;
1633}
1634
1635static void handle_irq_beacon(struct b43_wldev *dev)
1636{
1637        struct b43_wl *wl = dev->wl;
1638        u32 cmd, beacon0_valid, beacon1_valid;
1639
1640        if (!b43_is_mode(wl, NL80211_IFTYPE_AP) &&
1641            !b43_is_mode(wl, NL80211_IFTYPE_MESH_POINT) &&
1642            !b43_is_mode(wl, NL80211_IFTYPE_ADHOC))
1643                return;
1644
1645        /* This is the bottom half of the asynchronous beacon update. */
1646
1647        /* Ignore interrupt in the future. */
1648        dev->irq_mask &= ~B43_IRQ_BEACON;
1649
1650        cmd = b43_read32(dev, B43_MMIO_MACCMD);
1651        beacon0_valid = (cmd & B43_MACCMD_BEACON0_VALID);
1652        beacon1_valid = (cmd & B43_MACCMD_BEACON1_VALID);
1653
1654        /* Schedule interrupt manually, if busy. */
1655        if (beacon0_valid && beacon1_valid) {
1656                b43_write32(dev, B43_MMIO_GEN_IRQ_REASON, B43_IRQ_BEACON);
1657                dev->irq_mask |= B43_IRQ_BEACON;
1658                return;
1659        }
1660
1661        if (unlikely(wl->beacon_templates_virgin)) {
1662                /* We never uploaded a beacon before.
1663                 * Upload both templates now, but only mark one valid. */
1664                wl->beacon_templates_virgin = false;
1665                b43_upload_beacon0(dev);
1666                b43_upload_beacon1(dev);
1667                cmd = b43_read32(dev, B43_MMIO_MACCMD);
1668                cmd |= B43_MACCMD_BEACON0_VALID;
1669                b43_write32(dev, B43_MMIO_MACCMD, cmd);
1670        } else {
1671                if (!beacon0_valid) {
1672                        b43_upload_beacon0(dev);
1673                        cmd = b43_read32(dev, B43_MMIO_MACCMD);
1674                        cmd |= B43_MACCMD_BEACON0_VALID;
1675                        b43_write32(dev, B43_MMIO_MACCMD, cmd);
1676                } else if (!beacon1_valid) {
1677                        b43_upload_beacon1(dev);
1678                        cmd = b43_read32(dev, B43_MMIO_MACCMD);
1679                        cmd |= B43_MACCMD_BEACON1_VALID;
1680                        b43_write32(dev, B43_MMIO_MACCMD, cmd);
1681                }
1682        }
1683}
1684
1685static void b43_do_beacon_update_trigger_work(struct b43_wldev *dev)
1686{
1687        u32 old_irq_mask = dev->irq_mask;
1688
1689        /* update beacon right away or defer to irq */
1690        handle_irq_beacon(dev);
1691        if (old_irq_mask != dev->irq_mask) {
1692                /* The handler updated the IRQ mask. */
1693                B43_WARN_ON(!dev->irq_mask);
1694                if (b43_read32(dev, B43_MMIO_GEN_IRQ_MASK)) {
1695                        b43_write32(dev, B43_MMIO_GEN_IRQ_MASK, dev->irq_mask);
1696                } else {
1697                        /* Device interrupts are currently disabled. That means
1698                         * we just ran the hardirq handler and scheduled the
1699                         * IRQ thread. The thread will write the IRQ mask when
1700                         * it finished, so there's nothing to do here. Writing
1701                         * the mask _here_ would incorrectly re-enable IRQs. */
1702                }
1703        }
1704}
1705
1706static void b43_beacon_update_trigger_work(struct work_struct *work)
1707{
1708        struct b43_wl *wl = container_of(work, struct b43_wl,
1709                                         beacon_update_trigger);
1710        struct b43_wldev *dev;
1711
1712        mutex_lock(&wl->mutex);
1713        dev = wl->current_dev;
1714        if (likely(dev && (b43_status(dev) >= B43_STAT_INITIALIZED))) {
1715                if (b43_bus_host_is_sdio(dev->dev)) {
1716                        /* wl->mutex is enough. */
1717                        b43_do_beacon_update_trigger_work(dev);
1718                        mmiowb();
1719                } else {
1720                        spin_lock_irq(&wl->hardirq_lock);
1721                        b43_do_beacon_update_trigger_work(dev);
1722                        mmiowb();
1723                        spin_unlock_irq(&wl->hardirq_lock);
1724                }
1725        }
1726        mutex_unlock(&wl->mutex);
1727}
1728
1729/* Asynchronously update the packet templates in template RAM.
1730 * Locking: Requires wl->mutex to be locked. */
1731static void b43_update_templates(struct b43_wl *wl)
1732{
1733        struct sk_buff *beacon;
1734
1735        /* This is the top half of the ansynchronous beacon update.
1736         * The bottom half is the beacon IRQ.
1737         * Beacon update must be asynchronous to avoid sending an
1738         * invalid beacon. This can happen for example, if the firmware
1739         * transmits a beacon while we are updating it. */
1740
1741        /* We could modify the existing beacon and set the aid bit in
1742         * the TIM field, but that would probably require resizing and
1743         * moving of data within the beacon template.
1744         * Simply request a new beacon and let mac80211 do the hard work. */
1745        beacon = ieee80211_beacon_get(wl->hw, wl->vif);
1746        if (unlikely(!beacon))
1747                return;
1748
1749        if (wl->current_beacon)
1750                dev_kfree_skb_any(wl->current_beacon);
1751        wl->current_beacon = beacon;
1752        wl->beacon0_uploaded = false;
1753        wl->beacon1_uploaded = false;
1754        ieee80211_queue_work(wl->hw, &wl->beacon_update_trigger);
1755}
1756
1757static void b43_set_beacon_int(struct b43_wldev *dev, u16 beacon_int)
1758{
1759        b43_time_lock(dev);
1760        if (dev->dev->core_rev >= 3) {
1761                b43_write32(dev, B43_MMIO_TSF_CFP_REP, (beacon_int << 16));
1762                b43_write32(dev, B43_MMIO_TSF_CFP_START, (beacon_int << 10));
1763        } else {
1764                b43_write16(dev, 0x606, (beacon_int >> 6));
1765                b43_write16(dev, 0x610, beacon_int);
1766        }
1767        b43_time_unlock(dev);
1768        b43dbg(dev->wl, "Set beacon interval to %u\n", beacon_int);
1769}
1770
1771static void b43_handle_firmware_panic(struct b43_wldev *dev)
1772{
1773        u16 reason;
1774
1775        /* Read the register that contains the reason code for the panic. */
1776        reason = b43_shm_read16(dev, B43_SHM_SCRATCH, B43_FWPANIC_REASON_REG);
1777        b43err(dev->wl, "Whoopsy, firmware panic! Reason: %u\n", reason);
1778
1779        switch (reason) {
1780        default:
1781                b43dbg(dev->wl, "The panic reason is unknown.\n");
1782                /* fallthrough */
1783        case B43_FWPANIC_DIE:
1784                /* Do not restart the controller or firmware.
1785                 * The device is nonfunctional from now on.
1786                 * Restarting would result in this panic to trigger again,
1787                 * so we avoid that recursion. */
1788                break;
1789        case B43_FWPANIC_RESTART:
1790                b43_controller_restart(dev, "Microcode panic");
1791                break;
1792        }
1793}
1794
1795static void handle_irq_ucode_debug(struct b43_wldev *dev)
1796{
1797        unsigned int i, cnt;
1798        u16 reason, marker_id, marker_line;
1799        __le16 *buf;
1800
1801        /* The proprietary firmware doesn't have this IRQ. */
1802        if (!dev->fw.opensource)
1803                return;
1804
1805        /* Read the register that contains the reason code for this IRQ. */
1806        reason = b43_shm_read16(dev, B43_SHM_SCRATCH, B43_DEBUGIRQ_REASON_REG);
1807
1808        switch (reason) {
1809        case B43_DEBUGIRQ_PANIC:
1810                b43_handle_firmware_panic(dev);
1811                break;
1812        case B43_DEBUGIRQ_DUMP_SHM:
1813                if (!B43_DEBUG)
1814                        break; /* Only with driver debugging enabled. */
1815                buf = kmalloc(4096, GFP_ATOMIC);
1816                if (!buf) {
1817                        b43dbg(dev->wl, "SHM-dump: Failed to allocate memory\n");
1818                        goto out;
1819                }
1820                for (i = 0; i < 4096; i += 2) {
1821                        u16 tmp = b43_shm_read16(dev, B43_SHM_SHARED, i);
1822                        buf[i / 2] = cpu_to_le16(tmp);
1823                }
1824                b43info(dev->wl, "Shared memory dump:\n");
1825                print_hex_dump(KERN_INFO, "", DUMP_PREFIX_OFFSET,
1826                               16, 2, buf, 4096, 1);
1827                kfree(buf);
1828                break;
1829        case B43_DEBUGIRQ_DUMP_REGS:
1830                if (!B43_DEBUG)
1831                        break; /* Only with driver debugging enabled. */
1832                b43info(dev->wl, "Microcode register dump:\n");
1833                for (i = 0, cnt = 0; i < 64; i++) {
1834                        u16 tmp = b43_shm_read16(dev, B43_SHM_SCRATCH, i);
1835                        if (cnt == 0)
1836                                printk(KERN_INFO);
1837                        printk("r%02u: 0x%04X  ", i, tmp);
1838                        cnt++;
1839                        if (cnt == 6) {
1840                                printk("\n");
1841                                cnt = 0;
1842                        }
1843                }
1844                printk("\n");
1845                break;
1846        case B43_DEBUGIRQ_MARKER:
1847                if (!B43_DEBUG)
1848                        break; /* Only with driver debugging enabled. */
1849                marker_id = b43_shm_read16(dev, B43_SHM_SCRATCH,
1850                                           B43_MARKER_ID_REG);
1851                marker_line = b43_shm_read16(dev, B43_SHM_SCRATCH,
1852                                             B43_MARKER_LINE_REG);
1853                b43info(dev->wl, "The firmware just executed the MARKER(%u) "
1854                        "at line number %u\n",
1855                        marker_id, marker_line);
1856                break;
1857        default:
1858                b43dbg(dev->wl, "Debug-IRQ triggered for unknown reason: %u\n",
1859                       reason);
1860        }
1861out:
1862        /* Acknowledge the debug-IRQ, so the firmware can continue. */
1863        b43_shm_write16(dev, B43_SHM_SCRATCH,
1864                        B43_DEBUGIRQ_REASON_REG, B43_DEBUGIRQ_ACK);
1865}
1866
1867static void b43_do_interrupt_thread(struct b43_wldev *dev)
1868{
1869        u32 reason;
1870        u32 dma_reason[ARRAY_SIZE(dev->dma_reason)];
1871        u32 merged_dma_reason = 0;
1872        int i;
1873
1874        if (unlikely(b43_status(dev) != B43_STAT_STARTED))
1875                return;
1876
1877        reason = dev->irq_reason;
1878        for (i = 0; i < ARRAY_SIZE(dma_reason); i++) {
1879                dma_reason[i] = dev->dma_reason[i];
1880                merged_dma_reason |= dma_reason[i];
1881        }
1882
1883        if (unlikely(reason & B43_IRQ_MAC_TXERR))
1884                b43err(dev->wl, "MAC transmission error\n");
1885
1886        if (unlikely(reason & B43_IRQ_PHY_TXERR)) {
1887                b43err(dev->wl, "PHY transmission error\n");
1888                rmb();
1889                if (unlikely(atomic_dec_and_test(&dev->phy.txerr_cnt))) {
1890                        atomic_set(&dev->phy.txerr_cnt,
1891                                   B43_PHY_TX_BADNESS_LIMIT);
1892                        b43err(dev->wl, "Too many PHY TX errors, "
1893                                        "restarting the controller\n");
1894                        b43_controller_restart(dev, "PHY TX errors");
1895                }
1896        }
1897
1898        if (unlikely(merged_dma_reason & (B43_DMAIRQ_FATALMASK))) {
1899                b43err(dev->wl,
1900                        "Fatal DMA error: 0x%08X, 0x%08X, 0x%08X, 0x%08X, 0x%08X, 0x%08X\n",
1901                        dma_reason[0], dma_reason[1],
1902                        dma_reason[2], dma_reason[3],
1903                        dma_reason[4], dma_reason[5]);
1904                b43err(dev->wl, "This device does not support DMA "
1905                               "on your system. It will now be switched to PIO.\n");
1906                /* Fall back to PIO transfers if we get fatal DMA errors! */
1907                dev->use_pio = true;
1908                b43_controller_restart(dev, "DMA error");
1909                return;
1910        }
1911
1912        if (unlikely(reason & B43_IRQ_UCODE_DEBUG))
1913                handle_irq_ucode_debug(dev);
1914        if (reason & B43_IRQ_TBTT_INDI)
1915                handle_irq_tbtt_indication(dev);
1916        if (reason & B43_IRQ_ATIM_END)
1917                handle_irq_atim_end(dev);
1918        if (reason & B43_IRQ_BEACON)
1919                handle_irq_beacon(dev);
1920        if (reason & B43_IRQ_PMQ)
1921                handle_irq_pmq(dev);
1922        if (reason & B43_IRQ_TXFIFO_FLUSH_OK)
1923                ;/* TODO */
1924        if (reason & B43_IRQ_NOISESAMPLE_OK)
1925                handle_irq_noise(dev);
1926
1927        /* Check the DMA reason registers for received data. */
1928        if (dma_reason[0] & B43_DMAIRQ_RDESC_UFLOW) {
1929                if (B43_DEBUG)
1930                        b43warn(dev->wl, "RX descriptor underrun\n");
1931                b43_dma_handle_rx_overflow(dev->dma.rx_ring);
1932        }
1933        if (dma_reason[0] & B43_DMAIRQ_RX_DONE) {
1934                if (b43_using_pio_transfers(dev))
1935                        b43_pio_rx(dev->pio.rx_queue);
1936                else
1937                        b43_dma_rx(dev->dma.rx_ring);
1938        }
1939        B43_WARN_ON(dma_reason[1] & B43_DMAIRQ_RX_DONE);
1940        B43_WARN_ON(dma_reason[2] & B43_DMAIRQ_RX_DONE);
1941        B43_WARN_ON(dma_reason[3] & B43_DMAIRQ_RX_DONE);
1942        B43_WARN_ON(dma_reason[4] & B43_DMAIRQ_RX_DONE);
1943        B43_WARN_ON(dma_reason[5] & B43_DMAIRQ_RX_DONE);
1944
1945        if (reason & B43_IRQ_TX_OK)
1946                handle_irq_transmit_status(dev);
1947
1948        /* Re-enable interrupts on the device by restoring the current interrupt mask. */
1949        b43_write32(dev, B43_MMIO_GEN_IRQ_MASK, dev->irq_mask);
1950
1951#if B43_DEBUG
1952        if (b43_debug(dev, B43_DBG_VERBOSESTATS)) {
1953                dev->irq_count++;
1954                for (i = 0; i < ARRAY_SIZE(dev->irq_bit_count); i++) {
1955                        if (reason & (1 << i))
1956                                dev->irq_bit_count[i]++;
1957                }
1958        }
1959#endif
1960}
1961
1962/* Interrupt thread handler. Handles device interrupts in thread context. */
1963static irqreturn_t b43_interrupt_thread_handler(int irq, void *dev_id)
1964{
1965        struct b43_wldev *dev = dev_id;
1966
1967        mutex_lock(&dev->wl->mutex);
1968        b43_do_interrupt_thread(dev);
1969        mmiowb();
1970        mutex_unlock(&dev->wl->mutex);
1971
1972        return IRQ_HANDLED;
1973}
1974
1975static irqreturn_t b43_do_interrupt(struct b43_wldev *dev)
1976{
1977        u32 reason;
1978
1979        /* This code runs under wl->hardirq_lock, but _only_ on non-SDIO busses.
1980         * On SDIO, this runs under wl->mutex. */
1981
1982        reason = b43_read32(dev, B43_MMIO_GEN_IRQ_REASON);
1983        if (reason == 0xffffffff)       /* shared IRQ */
1984                return IRQ_NONE;
1985        reason &= dev->irq_mask;
1986        if (!reason)
1987                return IRQ_NONE;
1988
1989        dev->dma_reason[0] = b43_read32(dev, B43_MMIO_DMA0_REASON)
1990            & 0x0001FC00;
1991        dev->dma_reason[1] = b43_read32(dev, B43_MMIO_DMA1_REASON)
1992            & 0x0000DC00;
1993        dev->dma_reason[2] = b43_read32(dev, B43_MMIO_DMA2_REASON)
1994            & 0x0000DC00;
1995        dev->dma_reason[3] = b43_read32(dev, B43_MMIO_DMA3_REASON)
1996            & 0x0001DC00;
1997        dev->dma_reason[4] = b43_read32(dev, B43_MMIO_DMA4_REASON)
1998            & 0x0000DC00;
1999/* Unused ring
2000        dev->dma_reason[5] = b43_read32(dev, B43_MMIO_DMA5_REASON)
2001            & 0x0000DC00;
2002*/
2003
2004        /* ACK the interrupt. */
2005        b43_write32(dev, B43_MMIO_GEN_IRQ_REASON, reason);
2006        b43_write32(dev, B43_MMIO_DMA0_REASON, dev->dma_reason[0]);
2007        b43_write32(dev, B43_MMIO_DMA1_REASON, dev->dma_reason[1]);
2008        b43_write32(dev, B43_MMIO_DMA2_REASON, dev->dma_reason[2]);
2009        b43_write32(dev, B43_MMIO_DMA3_REASON, dev->dma_reason[3]);
2010        b43_write32(dev, B43_MMIO_DMA4_REASON, dev->dma_reason[4]);
2011/* Unused ring
2012        b43_write32(dev, B43_MMIO_DMA5_REASON, dev->dma_reason[5]);
2013*/
2014
2015        /* Disable IRQs on the device. The IRQ thread handler will re-enable them. */
2016        b43_write32(dev, B43_MMIO_GEN_IRQ_MASK, 0);
2017        /* Save the reason bitmasks for the IRQ thread handler. */
2018        dev->irq_reason = reason;
2019
2020        return IRQ_WAKE_THREAD;
2021}
2022
2023/* Interrupt handler top-half. This runs with interrupts disabled. */
2024static irqreturn_t b43_interrupt_handler(int irq, void *dev_id)
2025{
2026        struct b43_wldev *dev = dev_id;
2027        irqreturn_t ret;
2028
2029        if (unlikely(b43_status(dev) < B43_STAT_STARTED))
2030                return IRQ_NONE;
2031
2032        spin_lock(&dev->wl->hardirq_lock);
2033        ret = b43_do_interrupt(dev);
2034        mmiowb();
2035        spin_unlock(&dev->wl->hardirq_lock);
2036
2037        return ret;
2038}
2039
2040/* SDIO interrupt handler. This runs in process context. */
2041static void b43_sdio_interrupt_handler(struct b43_wldev *dev)
2042{
2043        struct b43_wl *wl = dev->wl;
2044        irqreturn_t ret;
2045
2046        mutex_lock(&wl->mutex);
2047
2048        ret = b43_do_interrupt(dev);
2049        if (ret == IRQ_WAKE_THREAD)
2050                b43_do_interrupt_thread(dev);
2051
2052        mutex_unlock(&wl->mutex);
2053}
2054
2055void b43_do_release_fw(struct b43_firmware_file *fw)
2056{
2057        release_firmware(fw->data);
2058        fw->data = NULL;
2059        fw->filename = NULL;
2060}
2061
2062static void b43_release_firmware(struct b43_wldev *dev)
2063{
2064        b43_do_release_fw(&dev->fw.ucode);
2065        b43_do_release_fw(&dev->fw.pcm);
2066        b43_do_release_fw(&dev->fw.initvals);
2067        b43_do_release_fw(&dev->fw.initvals_band);
2068}
2069
2070static void b43_print_fw_helptext(struct b43_wl *wl, bool error)
2071{
2072        const char text[] =
2073                "You must go to " \
2074                "http://wireless.kernel.org/en/users/Drivers/b43#devicefirmware " \
2075                "and download the correct firmware for this driver version. " \
2076                "Please carefully read all instructions on this website.\n";
2077
2078        if (error)
2079                b43err(wl, text);
2080        else
2081                b43warn(wl, text);
2082}
2083
2084static void b43_fw_cb(const struct firmware *firmware, void *context)
2085{
2086        struct b43_request_fw_context *ctx = context;
2087
2088        ctx->blob = firmware;
2089        complete(&ctx->fw_load_complete);
2090}
2091
2092int b43_do_request_fw(struct b43_request_fw_context *ctx,
2093                      const char *name,
2094                      struct b43_firmware_file *fw, bool async)
2095{
2096        struct b43_fw_header *hdr;
2097        u32 size;
2098        int err;
2099
2100        if (!name) {
2101                /* Don't fetch anything. Free possibly cached firmware. */
2102                /* FIXME: We should probably keep it anyway, to save some headache
2103                 * on suspend/resume with multiband devices. */
2104                b43_do_release_fw(fw);
2105                return 0;
2106        }
2107        if (fw->filename) {
2108                if ((fw->type == ctx->req_type) &&
2109                    (strcmp(fw->filename, name) == 0))
2110                        return 0; /* Already have this fw. */
2111                /* Free the cached firmware first. */
2112                /* FIXME: We should probably do this later after we successfully
2113                 * got the new fw. This could reduce headache with multiband devices.
2114                 * We could also redesign this to cache the firmware for all possible
2115                 * bands all the time. */
2116                b43_do_release_fw(fw);
2117        }
2118
2119        switch (ctx->req_type) {
2120        case B43_FWTYPE_PROPRIETARY:
2121                snprintf(ctx->fwname, sizeof(ctx->fwname),
2122                         "b43%s/%s.fw",
2123                         modparam_fwpostfix, name);
2124                break;
2125        case B43_FWTYPE_OPENSOURCE:
2126                snprintf(ctx->fwname, sizeof(ctx->fwname),
2127                         "b43-open%s/%s.fw",
2128                         modparam_fwpostfix, name);
2129                break;
2130        default:
2131                B43_WARN_ON(1);
2132                return -ENOSYS;
2133        }
2134        if (async) {
2135                /* do this part asynchronously */
2136                init_completion(&ctx->fw_load_complete);
2137                err = request_firmware_nowait(THIS_MODULE, 1, ctx->fwname,
2138                                              ctx->dev->dev->dev, GFP_KERNEL,
2139                                              ctx, b43_fw_cb);
2140                if (err < 0) {
2141                        pr_err("Unable to load firmware\n");
2142                        return err;
2143                }
2144                /* stall here until fw ready */
2145                wait_for_completion(&ctx->fw_load_complete);
2146                if (ctx->blob)
2147                        goto fw_ready;
2148        /* On some ARM systems, the async request will fail, but the next sync
2149         * request works. For this reason, we dall through here
2150         */
2151        }
2152        err = request_firmware(&ctx->blob, ctx->fwname,
2153                               ctx->dev->dev->dev);
2154        if (err == -ENOENT) {
2155                snprintf(ctx->errors[ctx->req_type],
2156                         sizeof(ctx->errors[ctx->req_type]),
2157                         "Firmware file \"%s\" not found\n",
2158                         ctx->fwname);
2159                return err;
2160        } else if (err) {
2161                snprintf(ctx->errors[ctx->req_type],
2162                         sizeof(ctx->errors[ctx->req_type]),
2163                         "Firmware file \"%s\" request failed (err=%d)\n",
2164                         ctx->fwname, err);
2165                return err;
2166        }
2167fw_ready:
2168        if (ctx->blob->size < sizeof(struct b43_fw_header))
2169                goto err_format;
2170        hdr = (struct b43_fw_header *)(ctx->blob->data);
2171        switch (hdr->type) {
2172        case B43_FW_TYPE_UCODE:
2173        case B43_FW_TYPE_PCM:
2174                size = be32_to_cpu(hdr->size);
2175                if (size != ctx->blob->size - sizeof(struct b43_fw_header))
2176                        goto err_format;
2177                /* fallthrough */
2178        case B43_FW_TYPE_IV:
2179                if (hdr->ver != 1)
2180                        goto err_format;
2181                break;
2182        default:
2183                goto err_format;
2184        }
2185
2186        fw->data = ctx->blob;
2187        fw->filename = name;
2188        fw->type = ctx->req_type;
2189
2190        return 0;
2191
2192err_format:
2193        snprintf(ctx->errors[ctx->req_type],
2194                 sizeof(ctx->errors[ctx->req_type]),
2195                 "Firmware file \"%s\" format error.\n", ctx->fwname);
2196        release_firmware(ctx->blob);
2197
2198        return -EPROTO;
2199}
2200
2201static int b43_try_request_fw(struct b43_request_fw_context *ctx)
2202{
2203        struct b43_wldev *dev = ctx->dev;
2204        struct b43_firmware *fw = &ctx->dev->fw;
2205        const u8 rev = ctx->dev->dev->core_rev;
2206        const char *filename;
2207        u32 tmshigh;
2208        int err;
2209
2210        /* Files for HT and LCN were found by trying one by one */
2211
2212        /* Get microcode */
2213        if ((rev >= 5) && (rev <= 10)) {
2214                filename = "ucode5";
2215        } else if ((rev >= 11) && (rev <= 12)) {
2216                filename = "ucode11";
2217        } else if (rev == 13) {
2218                filename = "ucode13";
2219        } else if (rev == 14) {
2220                filename = "ucode14";
2221        } else if (rev == 15) {
2222                filename = "ucode15";
2223        } else {
2224                switch (dev->phy.type) {
2225                case B43_PHYTYPE_N:
2226                        if (rev >= 16)
2227                                filename = "ucode16_mimo";
2228                        else
2229                                goto err_no_ucode;
2230                        break;
2231                case B43_PHYTYPE_HT:
2232                        if (rev == 29)
2233                                filename = "ucode29_mimo";
2234                        else
2235                                goto err_no_ucode;
2236                        break;
2237                case B43_PHYTYPE_LCN:
2238                        if (rev == 24)
2239                                filename = "ucode24_mimo";
2240                        else
2241                                goto err_no_ucode;
2242                        break;
2243                default:
2244                        goto err_no_ucode;
2245                }
2246        }
2247        err = b43_do_request_fw(ctx, filename, &fw->ucode, true);
2248        if (err)
2249                goto err_load;
2250
2251        /* Get PCM code */
2252        if ((rev >= 5) && (rev <= 10))
2253                filename = "pcm5";
2254        else if (rev >= 11)
2255                filename = NULL;
2256        else
2257                goto err_no_pcm;
2258        fw->pcm_request_failed = false;
2259        err = b43_do_request_fw(ctx, filename, &fw->pcm, false);
2260        if (err == -ENOENT) {
2261                /* We did not find a PCM file? Not fatal, but
2262                 * core rev <= 10 must do without hwcrypto then. */
2263                fw->pcm_request_failed = true;
2264        } else if (err)
2265                goto err_load;
2266
2267        /* Get initvals */
2268        switch (dev->phy.type) {
2269        case B43_PHYTYPE_A:
2270                if ((rev >= 5) && (rev <= 10)) {
2271                        tmshigh = ssb_read32(dev->dev->sdev, SSB_TMSHIGH);
2272                        if (tmshigh & B43_TMSHIGH_HAVE_2GHZ_PHY)
2273                                filename = "a0g1initvals5";
2274                        else
2275                                filename = "a0g0initvals5";
2276                } else
2277                        goto err_no_initvals;
2278                break;
2279        case B43_PHYTYPE_G:
2280                if ((rev >= 5) && (rev <= 10))
2281                        filename = "b0g0initvals5";
2282                else if (rev >= 13)
2283                        filename = "b0g0initvals13";
2284                else
2285                        goto err_no_initvals;
2286                break;
2287        case B43_PHYTYPE_N:
2288                if (rev >= 16)
2289                        filename = "n0initvals16";
2290                else if ((rev >= 11) && (rev <= 12))
2291                        filename = "n0initvals11";
2292                else
2293                        goto err_no_initvals;
2294                break;
2295        case B43_PHYTYPE_LP:
2296                if (rev == 13)
2297                        filename = "lp0initvals13";
2298                else if (rev == 14)
2299                        filename = "lp0initvals14";
2300                else if (rev >= 15)
2301                        filename = "lp0initvals15";
2302                else
2303                        goto err_no_initvals;
2304                break;
2305        case B43_PHYTYPE_HT:
2306                if (rev == 29)
2307                        filename = "ht0initvals29";
2308                else
2309                        goto err_no_initvals;
2310                break;
2311        case B43_PHYTYPE_LCN:
2312                if (rev == 24)
2313                        filename = "lcn0initvals24";
2314                else
2315                        goto err_no_initvals;
2316                break;
2317        default:
2318                goto err_no_initvals;
2319        }
2320        err = b43_do_request_fw(ctx, filename, &fw->initvals, false);
2321        if (err)
2322                goto err_load;
2323
2324        /* Get bandswitch initvals */
2325        switch (dev->phy.type) {
2326        case B43_PHYTYPE_A:
2327                if ((rev >= 5) && (rev <= 10)) {
2328                        tmshigh = ssb_read32(dev->dev->sdev, SSB_TMSHIGH);
2329                        if (tmshigh & B43_TMSHIGH_HAVE_2GHZ_PHY)
2330                                filename = "a0g1bsinitvals5";
2331                        else
2332                                filename = "a0g0bsinitvals5";
2333                } else if (rev >= 11)
2334                        filename = NULL;
2335                else
2336                        goto err_no_initvals;
2337                break;
2338        case B43_PHYTYPE_G:
2339                if ((rev >= 5) && (rev <= 10))
2340                        filename = "b0g0bsinitvals5";
2341                else if (rev >= 11)
2342                        filename = NULL;
2343                else
2344                        goto err_no_initvals;
2345                break;
2346        case B43_PHYTYPE_N:
2347                if (rev >= 16)
2348                        filename = "n0bsinitvals16";
2349                else if ((rev >= 11) && (rev <= 12))
2350                        filename = "n0bsinitvals11";
2351                else
2352                        goto err_no_initvals;
2353                break;
2354        case B43_PHYTYPE_LP:
2355                if (rev == 13)
2356                        filename = "lp0bsinitvals13";
2357                else if (rev == 14)
2358                        filename = "lp0bsinitvals14";
2359                else if (rev >= 15)
2360                        filename = "lp0bsinitvals15";
2361                else
2362                        goto err_no_initvals;
2363                break;
2364        case B43_PHYTYPE_HT:
2365                if (rev == 29)
2366                        filename = "ht0bsinitvals29";
2367                else
2368                        goto err_no_initvals;
2369                break;
2370        case B43_PHYTYPE_LCN:
2371                if (rev == 24)
2372                        filename = "lcn0bsinitvals24";
2373                else
2374                        goto err_no_initvals;
2375                break;
2376        default:
2377                goto err_no_initvals;
2378        }
2379        err = b43_do_request_fw(ctx, filename, &fw->initvals_band, false);
2380        if (err)
2381                goto err_load;
2382
2383        fw->opensource = (ctx->req_type == B43_FWTYPE_OPENSOURCE);
2384
2385        return 0;
2386
2387err_no_ucode:
2388        err = ctx->fatal_failure = -EOPNOTSUPP;
2389        b43err(dev->wl, "The driver does not know which firmware (ucode) "
2390               "is required for your device (wl-core rev %u)\n", rev);
2391        goto error;
2392
2393err_no_pcm:
2394        err = ctx->fatal_failure = -EOPNOTSUPP;
2395        b43err(dev->wl, "The driver does not know which firmware (PCM) "
2396               "is required for your device (wl-core rev %u)\n", rev);
2397        goto error;
2398
2399err_no_initvals:
2400        err = ctx->fatal_failure = -EOPNOTSUPP;
2401        b43err(dev->wl, "The driver does not know which firmware (initvals) "
2402               "is required for your device (wl-core rev %u)\n", rev);
2403        goto error;
2404
2405err_load:
2406        /* We failed to load this firmware image. The error message
2407         * already is in ctx->errors. Return and let our caller decide
2408         * what to do. */
2409        goto error;
2410
2411error:
2412        b43_release_firmware(dev);
2413        return err;
2414}
2415
2416static int b43_one_core_attach(struct b43_bus_dev *dev, struct b43_wl *wl);
2417static void b43_one_core_detach(struct b43_bus_dev *dev);
2418
2419static void b43_request_firmware(struct work_struct *work)
2420{
2421        struct b43_wl *wl = container_of(work,
2422                            struct b43_wl, firmware_load);
2423        struct b43_wldev *dev = wl->current_dev;
2424        struct b43_request_fw_context *ctx;
2425        unsigned int i;
2426        int err;
2427        const char *errmsg;
2428
2429        ctx = kzalloc(sizeof(*ctx), GFP_KERNEL);
2430        if (!ctx)
2431                return;
2432        ctx->dev = dev;
2433
2434        ctx->req_type = B43_FWTYPE_PROPRIETARY;
2435        err = b43_try_request_fw(ctx);
2436        if (!err)
2437                goto start_ieee80211; /* Successfully loaded it. */
2438        /* Was fw version known? */
2439        if (ctx->fatal_failure)
2440                goto out;
2441
2442        /* proprietary fw not found, try open source */
2443        ctx->req_type = B43_FWTYPE_OPENSOURCE;
2444        err = b43_try_request_fw(ctx);
2445        if (!err)
2446                goto start_ieee80211; /* Successfully loaded it. */
2447        if(ctx->fatal_failure)
2448                goto out;
2449
2450        /* Could not find a usable firmware. Print the errors. */
2451        for (i = 0; i < B43_NR_FWTYPES; i++) {
2452                errmsg = ctx->errors[i];
2453                if (strlen(errmsg))
2454                        b43err(dev->wl, errmsg);
2455        }
2456        b43_print_fw_helptext(dev->wl, 1);
2457        goto out;
2458
2459start_ieee80211:
2460        wl->hw->queues = B43_QOS_QUEUE_NUM;
2461        if (!modparam_qos || dev->fw.opensource)
2462                wl->hw->queues = 1;
2463
2464        err = ieee80211_register_hw(wl->hw);
2465        if (err)
2466                goto err_one_core_detach;
2467        wl->hw_registred = true;
2468        b43_leds_register(wl->current_dev);
2469        goto out;
2470
2471err_one_core_detach:
2472        b43_one_core_detach(dev->dev);
2473
2474out:
2475        kfree(ctx);
2476}
2477
2478static int b43_upload_microcode(struct b43_wldev *dev)
2479{
2480        struct wiphy *wiphy = dev->wl->hw->wiphy;
2481        const size_t hdr_len = sizeof(struct b43_fw_header);
2482        const __be32 *data;
2483        unsigned int i, len;
2484        u16 fwrev, fwpatch, fwdate, fwtime;
2485        u32 tmp, macctl;
2486        int err = 0;
2487
2488        /* Jump the microcode PSM to offset 0 */
2489        macctl = b43_read32(dev, B43_MMIO_MACCTL);
2490        B43_WARN_ON(macctl & B43_MACCTL_PSM_RUN);
2491        macctl |= B43_MACCTL_PSM_JMP0;
2492        b43_write32(dev, B43_MMIO_MACCTL, macctl);
2493        /* Zero out all microcode PSM registers and shared memory. */
2494        for (i = 0; i < 64; i++)
2495                b43_shm_write16(dev, B43_SHM_SCRATCH, i, 0);
2496        for (i = 0; i < 4096; i += 2)
2497                b43_shm_write16(dev, B43_SHM_SHARED, i, 0);
2498
2499        /* Upload Microcode. */
2500        data = (__be32 *) (dev->fw.ucode.data->data + hdr_len);
2501        len = (dev->fw.ucode.data->size - hdr_len) / sizeof(__be32);
2502        b43_shm_control_word(dev, B43_SHM_UCODE | B43_SHM_AUTOINC_W, 0x0000);
2503        for (i = 0; i < len; i++) {
2504                b43_write32(dev, B43_MMIO_SHM_DATA, be32_to_cpu(data[i]));
2505                udelay(10);
2506        }
2507
2508        if (dev->fw.pcm.data) {
2509                /* Upload PCM data. */
2510                data = (__be32 *) (dev->fw.pcm.data->data + hdr_len);
2511                len = (dev->fw.pcm.data->size - hdr_len) / sizeof(__be32);
2512                b43_shm_control_word(dev, B43_SHM_HW, 0x01EA);
2513                b43_write32(dev, B43_MMIO_SHM_DATA, 0x00004000);
2514                /* No need for autoinc bit in SHM_HW */
2515                b43_shm_control_word(dev, B43_SHM_HW, 0x01EB);
2516                for (i = 0; i < len; i++) {
2517                        b43_write32(dev, B43_MMIO_SHM_DATA, be32_to_cpu(data[i]));
2518                        udelay(10);
2519                }
2520        }
2521
2522        b43_write32(dev, B43_MMIO_GEN_IRQ_REASON, B43_IRQ_ALL);
2523
2524        /* Start the microcode PSM */
2525        b43_maskset32(dev, B43_MMIO_MACCTL, ~B43_MACCTL_PSM_JMP0,
2526                      B43_MACCTL_PSM_RUN);
2527
2528        /* Wait for the microcode to load and respond */
2529        i = 0;
2530        while (1) {
2531                tmp = b43_read32(dev, B43_MMIO_GEN_IRQ_REASON);
2532                if (tmp == B43_IRQ_MAC_SUSPENDED)
2533                        break;
2534                i++;
2535                if (i >= 20) {
2536                        b43err(dev->wl, "Microcode not responding\n");
2537                        b43_print_fw_helptext(dev->wl, 1);
2538                        err = -ENODEV;
2539                        goto error;
2540                }
2541                msleep(50);
2542        }
2543        b43_read32(dev, B43_MMIO_GEN_IRQ_REASON);       /* dummy read */
2544
2545        /* Get and check the revisions. */
2546        fwrev = b43_shm_read16(dev, B43_SHM_SHARED, B43_SHM_SH_UCODEREV);
2547        fwpatch = b43_shm_read16(dev, B43_SHM_SHARED, B43_SHM_SH_UCODEPATCH);
2548        fwdate = b43_shm_read16(dev, B43_SHM_SHARED, B43_SHM_SH_UCODEDATE);
2549        fwtime = b43_shm_read16(dev, B43_SHM_SHARED, B43_SHM_SH_UCODETIME);
2550
2551        if (fwrev <= 0x128) {
2552                b43err(dev->wl, "YOUR FIRMWARE IS TOO OLD. Firmware from "
2553                       "binary drivers older than version 4.x is unsupported. "
2554                       "You must upgrade your firmware files.\n");
2555                b43_print_fw_helptext(dev->wl, 1);
2556                err = -EOPNOTSUPP;
2557                goto error;
2558        }
2559        dev->fw.rev = fwrev;
2560        dev->fw.patch = fwpatch;
2561        if (dev->fw.rev >= 598)
2562                dev->fw.hdr_format = B43_FW_HDR_598;
2563        else if (dev->fw.rev >= 410)
2564                dev->fw.hdr_format = B43_FW_HDR_410;
2565        else
2566                dev->fw.hdr_format = B43_FW_HDR_351;
2567        WARN_ON(dev->fw.opensource != (fwdate == 0xFFFF));
2568
2569        dev->qos_enabled = dev->wl->hw->queues > 1;
2570        /* Default to firmware/hardware crypto acceleration. */
2571        dev->hwcrypto_enabled = true;
2572
2573        if (dev->fw.opensource) {
2574                u16 fwcapa;
2575
2576                /* Patchlevel info is encoded in the "time" field. */
2577                dev->fw.patch = fwtime;
2578                b43info(dev->wl, "Loading OpenSource firmware version %u.%u\n",
2579                        dev->fw.rev, dev->fw.patch);
2580
2581                fwcapa = b43_fwcapa_read(dev);
2582                if (!(fwcapa & B43_FWCAPA_HWCRYPTO) || dev->fw.pcm_request_failed) {
2583                        b43info(dev->wl, "Hardware crypto acceleration not supported by firmware\n");
2584                        /* Disable hardware crypto and fall back to software crypto. */
2585                        dev->hwcrypto_enabled = false;
2586                }
2587                /* adding QoS support should use an offline discovery mechanism */
2588                WARN(fwcapa & B43_FWCAPA_QOS, "QoS in OpenFW not supported\n");
2589        } else {
2590                b43info(dev->wl, "Loading firmware version %u.%u "
2591                        "(20%.2i-%.2i-%.2i %.2i:%.2i:%.2i)\n",
2592                        fwrev, fwpatch,
2593                        (fwdate >> 12) & 0xF, (fwdate >> 8) & 0xF, fwdate & 0xFF,
2594                        (fwtime >> 11) & 0x1F, (fwtime >> 5) & 0x3F, fwtime & 0x1F);
2595                if (dev->fw.pcm_request_failed) {
2596                        b43warn(dev->wl, "No \"pcm5.fw\" firmware file found. "
2597                                "Hardware accelerated cryptography is disabled.\n");
2598                        b43_print_fw_helptext(dev->wl, 0);
2599                }
2600        }
2601
2602        snprintf(wiphy->fw_version, sizeof(wiphy->fw_version), "%u.%u",
2603                        dev->fw.rev, dev->fw.patch);
2604        wiphy->hw_version = dev->dev->core_id;
2605
2606        if (dev->fw.hdr_format == B43_FW_HDR_351) {
2607                /* We're over the deadline, but we keep support for old fw
2608                 * until it turns out to be in major conflict with something new. */
2609                b43warn(dev->wl, "You are using an old firmware image. "
2610                        "Support for old firmware will be removed soon "
2611                        "(official deadline was July 2008).\n");
2612                b43_print_fw_helptext(dev->wl, 0);
2613        }
2614
2615        return 0;
2616
2617error:
2618        /* Stop the microcode PSM. */
2619        b43_maskset32(dev, B43_MMIO_MACCTL, ~B43_MACCTL_PSM_RUN,
2620                      B43_MACCTL_PSM_JMP0);
2621
2622        return err;
2623}
2624
2625static int b43_write_initvals(struct b43_wldev *dev,
2626                              const struct b43_iv *ivals,
2627                              size_t count,
2628                              size_t array_size)
2629{
2630        const struct b43_iv *iv;
2631        u16 offset;
2632        size_t i;
2633        bool bit32;
2634
2635        BUILD_BUG_ON(sizeof(struct b43_iv) != 6);
2636        iv = ivals;
2637        for (i = 0; i < count; i++) {
2638                if (array_size < sizeof(iv->offset_size))
2639                        goto err_format;
2640                array_size -= sizeof(iv->offset_size);
2641                offset = be16_to_cpu(iv->offset_size);
2642                bit32 = !!(offset & B43_IV_32BIT);
2643                offset &= B43_IV_OFFSET_MASK;
2644                if (offset >= 0x1000)
2645                        goto err_format;
2646                if (bit32) {
2647                        u32 value;
2648
2649                        if (array_size < sizeof(iv->data.d32))
2650                                goto err_format;
2651                        array_size -= sizeof(iv->data.d32);
2652
2653                        value = get_unaligned_be32(&iv->data.d32);
2654                        b43_write32(dev, offset, value);
2655
2656                        iv = (const struct b43_iv *)((const uint8_t *)iv +
2657                                                        sizeof(__be16) +
2658                                                        sizeof(__be32));
2659                } else {
2660                        u16 value;
2661
2662                        if (array_size < sizeof(iv->data.d16))
2663                                goto err_format;
2664                        array_size -= sizeof(iv->data.d16);
2665
2666                        value = be16_to_cpu(iv->data.d16);
2667                        b43_write16(dev, offset, value);
2668
2669                        iv = (const struct b43_iv *)((const uint8_t *)iv +
2670                                                        sizeof(__be16) +
2671                                                        sizeof(__be16));
2672                }
2673        }
2674        if (array_size)
2675                goto err_format;
2676
2677        return 0;
2678
2679err_format:
2680        b43err(dev->wl, "Initial Values Firmware file-format error.\n");
2681        b43_print_fw_helptext(dev->wl, 1);
2682
2683        return -EPROTO;
2684}
2685
2686static int b43_upload_initvals(struct b43_wldev *dev)
2687{
2688        const size_t hdr_len = sizeof(struct b43_fw_header);
2689        const struct b43_fw_header *hdr;
2690        struct b43_firmware *fw = &dev->fw;
2691        const struct b43_iv *ivals;
2692        size_t count;
2693        int err;
2694
2695        hdr = (const struct b43_fw_header *)(fw->initvals.data->data);
2696        ivals = (const struct b43_iv *)(fw->initvals.data->data + hdr_len);
2697        count = be32_to_cpu(hdr->size);
2698        err = b43_write_initvals(dev, ivals, count,
2699                                 fw->initvals.data->size - hdr_len);
2700        if (err)
2701                goto out;
2702        if (fw->initvals_band.data) {
2703                hdr = (const struct b43_fw_header *)(fw->initvals_band.data->data);
2704                ivals = (const struct b43_iv *)(fw->initvals_band.data->data + hdr_len);
2705                count = be32_to_cpu(hdr->size);
2706                err = b43_write_initvals(dev, ivals, count,
2707                                         fw->initvals_band.data->size - hdr_len);
2708                if (err)
2709                        goto out;
2710        }
2711out:
2712
2713        return err;
2714}
2715
2716/* Initialize the GPIOs
2717 * http://bcm-specs.sipsolutions.net/GPIO
2718 */
2719static struct ssb_device *b43_ssb_gpio_dev(struct b43_wldev *dev)
2720{
2721        struct ssb_bus *bus = dev->dev->sdev->bus;
2722
2723#ifdef CONFIG_SSB_DRIVER_PCICORE
2724        return (bus->chipco.dev ? bus->chipco.dev : bus->pcicore.dev);
2725#else
2726        return bus->chipco.dev;
2727#endif
2728}
2729
2730static int b43_gpio_init(struct b43_wldev *dev)
2731{
2732        struct ssb_device *gpiodev;
2733        u32 mask, set;
2734
2735        b43_maskset32(dev, B43_MMIO_MACCTL, ~B43_MACCTL_GPOUTSMSK, 0);
2736        b43_maskset16(dev, B43_MMIO_GPIO_MASK, ~0, 0xF);
2737
2738        mask = 0x0000001F;
2739        set = 0x0000000F;
2740        if (dev->dev->chip_id == 0x4301) {
2741                mask |= 0x0060;
2742                set |= 0x0060;
2743        } else if (dev->dev->chip_id == 0x5354) {
2744                /* Don't allow overtaking buttons GPIOs */
2745                set &= 0x2; /* 0x2 is LED GPIO on BCM5354 */
2746        }
2747
2748        if (0 /* FIXME: conditional unknown */ ) {
2749                b43_write16(dev, B43_MMIO_GPIO_MASK,
2750                            b43_read16(dev, B43_MMIO_GPIO_MASK)
2751                            | 0x0100);
2752                /* BT Coexistance Input */
2753                mask |= 0x0080;
2754                set |= 0x0080;
2755                /* BT Coexistance Out */
2756                mask |= 0x0100;
2757                set |= 0x0100;
2758        }
2759        if (dev->dev->bus_sprom->boardflags_lo & B43_BFL_PACTRL) {
2760                /* PA is controlled by gpio 9, let ucode handle it */
2761                b43_write16(dev, B43_MMIO_GPIO_MASK,
2762                            b43_read16(dev, B43_MMIO_GPIO_MASK)
2763                            | 0x0200);
2764                mask |= 0x0200;
2765                set |= 0x0200;
2766        }
2767
2768        switch (dev->dev->bus_type) {
2769#ifdef CONFIG_B43_BCMA
2770        case B43_BUS_BCMA:
2771                bcma_cc_write32(&dev->dev->bdev->bus->drv_cc, BCMA_CC_GPIOCTL,
2772                                (bcma_cc_read32(&dev->dev->bdev->bus->drv_cc,
2773                                        BCMA_CC_GPIOCTL) & ~mask) | set);
2774                break;
2775#endif
2776#ifdef CONFIG_B43_SSB
2777        case B43_BUS_SSB:
2778                gpiodev = b43_ssb_gpio_dev(dev);
2779                if (gpiodev)
2780                        ssb_write32(gpiodev, B43_GPIO_CONTROL,
2781                                    (ssb_read32(gpiodev, B43_GPIO_CONTROL)
2782                                    & ~mask) | set);
2783                break;
2784#endif
2785        }
2786
2787        return 0;
2788}
2789
2790/* Turn off all GPIO stuff. Call this on module unload, for example. */
2791static void b43_gpio_cleanup(struct b43_wldev *dev)
2792{
2793        struct ssb_device *gpiodev;
2794
2795        switch (dev->dev->bus_type) {
2796#ifdef CONFIG_B43_BCMA
2797        case B43_BUS_BCMA:
2798                bcma_cc_write32(&dev->dev->bdev->bus->drv_cc, BCMA_CC_GPIOCTL,
2799                                0);
2800                break;
2801#endif
2802#ifdef CONFIG_B43_SSB
2803        case B43_BUS_SSB:
2804                gpiodev = b43_ssb_gpio_dev(dev);
2805                if (gpiodev)
2806                        ssb_write32(gpiodev, B43_GPIO_CONTROL, 0);
2807                break;
2808#endif
2809        }
2810}
2811
2812/* http://bcm-specs.sipsolutions.net/EnableMac */
2813void b43_mac_enable(struct b43_wldev *dev)
2814{
2815        if (b43_debug(dev, B43_DBG_FIRMWARE)) {
2816                u16 fwstate;
2817
2818                fwstate = b43_shm_read16(dev, B43_SHM_SHARED,
2819                                         B43_SHM_SH_UCODESTAT);
2820                if ((fwstate != B43_SHM_SH_UCODESTAT_SUSP) &&
2821                    (fwstate != B43_SHM_SH_UCODESTAT_SLEEP)) {
2822                        b43err(dev->wl, "b43_mac_enable(): The firmware "
2823                               "should be suspended, but current state is %u\n",
2824                               fwstate);
2825                }
2826        }
2827
2828        dev->mac_suspended--;
2829        B43_WARN_ON(dev->mac_suspended < 0);
2830        if (dev->mac_suspended == 0) {
2831                b43_maskset32(dev, B43_MMIO_MACCTL, ~0, B43_MACCTL_ENABLED);
2832                b43_write32(dev, B43_MMIO_GEN_IRQ_REASON,
2833                            B43_IRQ_MAC_SUSPENDED);
2834                /* Commit writes */
2835                b43_read32(dev, B43_MMIO_MACCTL);
2836                b43_read32(dev, B43_MMIO_GEN_IRQ_REASON);
2837                b43_power_saving_ctl_bits(dev, 0);
2838        }
2839}
2840
2841/* http://bcm-specs.sipsolutions.net/SuspendMAC */
2842void b43_mac_suspend(struct b43_wldev *dev)
2843{
2844        int i;
2845        u32 tmp;
2846
2847        might_sleep();
2848        B43_WARN_ON(dev->mac_suspended < 0);
2849
2850        if (dev->mac_suspended == 0) {
2851                b43_power_saving_ctl_bits(dev, B43_PS_AWAKE);
2852                b43_maskset32(dev, B43_MMIO_MACCTL, ~B43_MACCTL_ENABLED, 0);
2853                /* force pci to flush the write */
2854                b43_read32(dev, B43_MMIO_MACCTL);
2855                for (i = 35; i; i--) {
2856                        tmp = b43_read32(dev, B43_MMIO_GEN_IRQ_REASON);
2857                        if (tmp & B43_IRQ_MAC_SUSPENDED)
2858                                goto out;
2859                        udelay(10);
2860                }
2861                /* Hm, it seems this will take some time. Use msleep(). */
2862                for (i = 40; i; i--) {
2863                        tmp = b43_read32(dev, B43_MMIO_GEN_IRQ_REASON);
2864                        if (tmp & B43_IRQ_MAC_SUSPENDED)
2865                                goto out;
2866                        msleep(1);
2867                }
2868                b43err(dev->wl, "MAC suspend failed\n");
2869        }
2870out:
2871        dev->mac_suspended++;
2872}
2873
2874/* http://bcm-v4.sipsolutions.net/802.11/PHY/N/MacPhyClkSet */
2875void b43_mac_phy_clock_set(struct b43_wldev *dev, bool on)
2876{
2877        u32 tmp;
2878
2879        switch (dev->dev->bus_type) {
2880#ifdef CONFIG_B43_BCMA
2881        case B43_BUS_BCMA:
2882                tmp = bcma_aread32(dev->dev->bdev, BCMA_IOCTL);
2883                if (on)
2884                        tmp |= B43_BCMA_IOCTL_MACPHYCLKEN;
2885                else
2886                        tmp &= ~B43_BCMA_IOCTL_MACPHYCLKEN;
2887                bcma_awrite32(dev->dev->bdev, BCMA_IOCTL, tmp);
2888                break;
2889#endif
2890#ifdef CONFIG_B43_SSB
2891        case B43_BUS_SSB:
2892                tmp = ssb_read32(dev->dev->sdev, SSB_TMSLOW);
2893                if (on)
2894                        tmp |= B43_TMSLOW_MACPHYCLKEN;
2895                else
2896                        tmp &= ~B43_TMSLOW_MACPHYCLKEN;
2897                ssb_write32(dev->dev->sdev, SSB_TMSLOW, tmp);
2898                break;
2899#endif
2900        }
2901}
2902
2903static void b43_adjust_opmode(struct b43_wldev *dev)
2904{
2905        struct b43_wl *wl = dev->wl;
2906        u32 ctl;
2907        u16 cfp_pretbtt;
2908
2909        ctl = b43_read32(dev, B43_MMIO_MACCTL);
2910        /* Reset status to STA infrastructure mode. */
2911        ctl &= ~B43_MACCTL_AP;
2912        ctl &= ~B43_MACCTL_KEEP_CTL;
2913        ctl &= ~B43_MACCTL_KEEP_BADPLCP;
2914        ctl &= ~B43_MACCTL_KEEP_BAD;
2915        ctl &= ~B43_MACCTL_PROMISC;
2916        ctl &= ~B43_MACCTL_BEACPROMISC;
2917        ctl |= B43_MACCTL_INFRA;
2918
2919        if (b43_is_mode(wl, NL80211_IFTYPE_AP) ||
2920            b43_is_mode(wl, NL80211_IFTYPE_MESH_POINT))
2921                ctl |= B43_MACCTL_AP;
2922        else if (b43_is_mode(wl, NL80211_IFTYPE_ADHOC))
2923                ctl &= ~B43_MACCTL_INFRA;
2924
2925        if (wl->filter_flags & FIF_CONTROL)
2926                ctl |= B43_MACCTL_KEEP_CTL;
2927        if (wl->filter_flags & FIF_FCSFAIL)
2928                ctl |= B43_MACCTL_KEEP_BAD;
2929        if (wl->filter_flags & FIF_PLCPFAIL)
2930                ctl |= B43_MACCTL_KEEP_BADPLCP;
2931        if (wl->filter_flags & FIF_PROMISC_IN_BSS)
2932                ctl |= B43_MACCTL_PROMISC;
2933        if (wl->filter_flags & FIF_BCN_PRBRESP_PROMISC)
2934                ctl |= B43_MACCTL_BEACPROMISC;
2935
2936        /* Workaround: On old hardware the HW-MAC-address-filter
2937         * doesn't work properly, so always run promisc in filter
2938         * it in software. */
2939        if (dev->dev->core_rev <= 4)
2940                ctl |= B43_MACCTL_PROMISC;
2941
2942        b43_write32(dev, B43_MMIO_MACCTL, ctl);
2943
2944        cfp_pretbtt = 2;
2945        if ((ctl & B43_MACCTL_INFRA) && !(ctl & B43_MACCTL_AP)) {
2946                if (dev->dev->chip_id == 0x4306 &&
2947                    dev->dev->chip_rev == 3)
2948                        cfp_pretbtt = 100;
2949                else
2950                        cfp_pretbtt = 50;
2951        }
2952        b43_write16(dev, 0x612, cfp_pretbtt);
2953
2954        /* FIXME: We don't currently implement the PMQ mechanism,
2955         *        so always disable it. If we want to implement PMQ,
2956         *        we need to enable it here (clear DISCPMQ) in AP mode.
2957         */
2958        if (0  /* ctl & B43_MACCTL_AP */)
2959                b43_maskset32(dev, B43_MMIO_MACCTL, ~B43_MACCTL_DISCPMQ, 0);
2960        else
2961                b43_maskset32(dev, B43_MMIO_MACCTL, ~0, B43_MACCTL_DISCPMQ);
2962}
2963
2964static void b43_rate_memory_write(struct b43_wldev *dev, u16 rate, int is_ofdm)
2965{
2966        u16 offset;
2967
2968        if (is_ofdm) {
2969                offset = 0x480;
2970                offset += (b43_plcp_get_ratecode_ofdm(rate) & 0x000F) * 2;
2971        } else {
2972                offset = 0x4C0;
2973                offset += (b43_plcp_get_ratecode_cck(rate) & 0x000F) * 2;
2974        }
2975        b43_shm_write16(dev, B43_SHM_SHARED, offset + 0x20,
2976                        b43_shm_read16(dev, B43_SHM_SHARED, offset));
2977}
2978
2979static void b43_rate_memory_init(struct b43_wldev *dev)
2980{
2981        switch (dev->phy.type) {
2982        case B43_PHYTYPE_A:
2983        case B43_PHYTYPE_G:
2984        case B43_PHYTYPE_N:
2985        case B43_PHYTYPE_LP:
2986        case B43_PHYTYPE_HT:
2987        case B43_PHYTYPE_LCN:
2988                b43_rate_memory_write(dev, B43_OFDM_RATE_6MB, 1);
2989                b43_rate_memory_write(dev, B43_OFDM_RATE_12MB, 1);
2990                b43_rate_memory_write(dev, B43_OFDM_RATE_18MB, 1);
2991                b43_rate_memory_write(dev, B43_OFDM_RATE_24MB, 1);
2992                b43_rate_memory_write(dev, B43_OFDM_RATE_36MB, 1);
2993                b43_rate_memory_write(dev, B43_OFDM_RATE_48MB, 1);
2994                b43_rate_memory_write(dev, B43_OFDM_RATE_54MB, 1);
2995                if (dev->phy.type == B43_PHYTYPE_A)
2996                        break;
2997                /* fallthrough */
2998        case B43_PHYTYPE_B:
2999                b43_rate_memory_write(dev, B43_CCK_RATE_1MB, 0);
3000                b43_rate_memory_write(dev, B43_CCK_RATE_2MB, 0);
3001                b43_rate_memory_write(dev, B43_CCK_RATE_5MB, 0);
3002                b43_rate_memory_write(dev, B43_CCK_RATE_11MB, 0);
3003                break;
3004        default:
3005                B43_WARN_ON(1);
3006        }
3007}
3008
3009/* Set the default values for the PHY TX Control Words. */
3010static void b43_set_phytxctl_defaults(struct b43_wldev *dev)
3011{
3012        u16 ctl = 0;
3013
3014        ctl |= B43_TXH_PHY_ENC_CCK;
3015        ctl |= B43_TXH_PHY_ANT01AUTO;
3016        ctl |= B43_TXH_PHY_TXPWR;
3017
3018        b43_shm_write16(dev, B43_SHM_SHARED, B43_SHM_SH_BEACPHYCTL, ctl);
3019        b43_shm_write16(dev, B43_SHM_SHARED, B43_SHM_SH_ACKCTSPHYCTL, ctl);
3020        b43_shm_write16(dev, B43_SHM_SHARED, B43_SHM_SH_PRPHYCTL, ctl);
3021}
3022
3023/* Set the TX-Antenna for management frames sent by firmware. */
3024static void b43_mgmtframe_txantenna(struct b43_wldev *dev, int antenna)
3025{
3026        u16 ant;
3027        u16 tmp;
3028
3029        ant = b43_antenna_to_phyctl(antenna);
3030
3031        /* For ACK/CTS */
3032        tmp = b43_shm_read16(dev, B43_SHM_SHARED, B43_SHM_SH_ACKCTSPHYCTL);
3033        tmp = (tmp & ~B43_TXH_PHY_ANT) | ant;
3034        b43_shm_write16(dev, B43_SHM_SHARED, B43_SHM_SH_ACKCTSPHYCTL, tmp);
3035        /* For Probe Resposes */
3036        tmp = b43_shm_read16(dev, B43_SHM_SHARED, B43_SHM_SH_PRPHYCTL);
3037        tmp = (tmp & ~B43_TXH_PHY_ANT) | ant;
3038        b43_shm_write16(dev, B43_SHM_SHARED, B43_SHM_SH_PRPHYCTL, tmp);
3039}
3040
3041/* This is the opposite of b43_chip_init() */
3042static void b43_chip_exit(struct b43_wldev *dev)
3043{
3044        b43_phy_exit(dev);
3045        b43_gpio_cleanup(dev);
3046        /* firmware is released later */
3047}
3048
3049/* Initialize the chip
3050 * http://bcm-specs.sipsolutions.net/ChipInit
3051 */
3052static int b43_chip_init(struct b43_wldev *dev)
3053{
3054        struct b43_phy *phy = &dev->phy;
3055        int err;
3056        u32 macctl;
3057        u16 value16;
3058
3059        /* Initialize the MAC control */
3060        macctl = B43_MACCTL_IHR_ENABLED | B43_MACCTL_SHM_ENABLED;
3061        if (dev->phy.gmode)
3062                macctl |= B43_MACCTL_GMODE;
3063        macctl |= B43_MACCTL_INFRA;
3064        b43_write32(dev, B43_MMIO_MACCTL, macctl);
3065
3066        err = b43_upload_microcode(dev);
3067        if (err)
3068                goto out;       /* firmware is released later */
3069
3070        err = b43_gpio_init(dev);
3071        if (err)
3072                goto out;       /* firmware is released later */
3073
3074        err = b43_upload_initvals(dev);
3075        if (err)
3076                goto err_gpio_clean;
3077
3078        /* Turn the Analog on and initialize the PHY. */
3079        phy->ops->switch_analog(dev, 1);
3080        err = b43_phy_init(dev);
3081        if (err)
3082                goto err_gpio_clean;
3083
3084        /* Disable Interference Mitigation. */
3085        if (phy->ops->interf_mitigation)
3086                phy->ops->interf_mitigation(dev, B43_INTERFMODE_NONE);
3087
3088        /* Select the antennae */
3089        if (phy->ops->set_rx_antenna)
3090                phy->ops->set_rx_antenna(dev, B43_ANTENNA_DEFAULT);
3091        b43_mgmtframe_txantenna(dev, B43_ANTENNA_DEFAULT);
3092
3093        if (phy->type == B43_PHYTYPE_B) {
3094                value16 = b43_read16(dev, 0x005E);
3095                value16 |= 0x0004;
3096                b43_write16(dev, 0x005E, value16);
3097        }
3098        b43_write32(dev, 0x0100, 0x01000000);
3099        if (dev->dev->core_rev < 5)
3100                b43_write32(dev, 0x010C, 0x01000000);
3101
3102        b43_maskset32(dev, B43_MMIO_MACCTL, ~B43_MACCTL_INFRA, 0);
3103        b43_maskset32(dev, B43_MMIO_MACCTL, ~0, B43_MACCTL_INFRA);
3104
3105        /* Probe Response Timeout value */
3106        /* FIXME: Default to 0, has to be set by ioctl probably... :-/ */
3107        b43_shm_write16(dev, B43_SHM_SHARED, 0x0074, 0x0000);
3108
3109        /* Initially set the wireless operation mode. */
3110        b43_adjust_opmode(dev);
3111
3112        if (dev->dev->core_rev < 3) {
3113                b43_write16(dev, 0x060E, 0x0000);
3114                b43_write16(dev, 0x0610, 0x8000);
3115                b43_write16(dev, 0x0604, 0x0000);
3116                b43_write16(dev, 0x0606, 0x0200);
3117        } else {
3118                b43_write32(dev, 0x0188, 0x80000000);
3119                b43_write32(dev, 0x018C, 0x02000000);
3120        }
3121        b43_write32(dev, B43_MMIO_GEN_IRQ_REASON, 0x00004000);
3122        b43_write32(dev, B43_MMIO_DMA0_IRQ_MASK, 0x0001FC00);
3123        b43_write32(dev, B43_MMIO_DMA1_IRQ_MASK, 0x0000DC00);
3124        b43_write32(dev, B43_MMIO_DMA2_IRQ_MASK, 0x0000DC00);
3125        b43_write32(dev, B43_MMIO_DMA3_IRQ_MASK, 0x0001DC00);
3126        b43_write32(dev, B43_MMIO_DMA4_IRQ_MASK, 0x0000DC00);
3127        b43_write32(dev, B43_MMIO_DMA5_IRQ_MASK, 0x0000DC00);
3128
3129        b43_mac_phy_clock_set(dev, true);
3130
3131        switch (dev->dev->bus_type) {
3132#ifdef CONFIG_B43_BCMA
3133        case B43_BUS_BCMA:
3134                /* FIXME: 0xE74 is quite common, but should be read from CC */
3135                b43_write16(dev, B43_MMIO_POWERUP_DELAY, 0xE74);
3136                break;
3137#endif
3138#ifdef CONFIG_B43_SSB
3139        case B43_BUS_SSB:
3140                b43_write16(dev, B43_MMIO_POWERUP_DELAY,
3141                            dev->dev->sdev->bus->chipco.fast_pwrup_delay);
3142                break;
3143#endif
3144        }
3145
3146        err = 0;
3147        b43dbg(dev->wl, "Chip initialized\n");
3148out:
3149        return err;
3150
3151err_gpio_clean:
3152        b43_gpio_cleanup(dev);
3153        return err;
3154}
3155
3156static void b43_periodic_every60sec(struct b43_wldev *dev)
3157{
3158        const struct b43_phy_operations *ops = dev->phy.ops;
3159
3160        if (ops->pwork_60sec)
3161                ops->pwork_60sec(dev);
3162
3163        /* Force check the TX power emission now. */
3164        b43_phy_txpower_check(dev, B43_TXPWR_IGNORE_TIME);
3165}
3166
3167static void b43_periodic_every30sec(struct b43_wldev *dev)
3168{
3169        /* Update device statistics. */
3170        b43_calculate_link_quality(dev);
3171}
3172
3173static void b43_periodic_every15sec(struct b43_wldev *dev)
3174{
3175        struct b43_phy *phy = &dev->phy;
3176        u16 wdr;
3177
3178        if (dev->fw.opensource) {
3179                /* Check if the firmware is still alive.
3180                 * It will reset the watchdog counter to 0 in its idle loop. */
3181                wdr = b43_shm_read16(dev, B43_SHM_SCRATCH, B43_WATCHDOG_REG);
3182                if (unlikely(wdr)) {
3183                        b43err(dev->wl, "Firmware watchdog: The firmware died!\n");
3184                        b43_controller_restart(dev, "Firmware watchdog");
3185                        return;
3186                } else {
3187                        b43_shm_write16(dev, B43_SHM_SCRATCH,
3188                                        B43_WATCHDOG_REG, 1);
3189                }
3190        }
3191
3192        if (phy->ops->pwork_15sec)
3193                phy->ops->pwork_15sec(dev);
3194
3195        atomic_set(&phy->txerr_cnt, B43_PHY_TX_BADNESS_LIMIT);
3196        wmb();
3197
3198#if B43_DEBUG
3199        if (b43_debug(dev, B43_DBG_VERBOSESTATS)) {
3200                unsigned int i;
3201
3202                b43dbg(dev->wl, "Stats: %7u IRQs/sec, %7u TX/sec, %7u RX/sec\n",
3203                       dev->irq_count / 15,
3204                       dev->tx_count / 15,
3205                       dev->rx_count / 15);
3206                dev->irq_count = 0;
3207                dev->tx_count = 0;
3208                dev->rx_count = 0;
3209                for (i = 0; i < ARRAY_SIZE(dev->irq_bit_count); i++) {
3210                        if (dev->irq_bit_count[i]) {
3211                                b43dbg(dev->wl, "Stats: %7u IRQ-%02u/sec (0x%08X)\n",
3212                                       dev->irq_bit_count[i] / 15, i, (1 << i));
3213                                dev->irq_bit_count[i] = 0;
3214                        }
3215                }
3216        }
3217#endif
3218}
3219
3220static void do_periodic_work(struct b43_wldev *dev)
3221{
3222        unsigned int state;
3223
3224        state = dev->periodic_state;
3225        if (state % 4 == 0)
3226                b43_periodic_every60sec(dev);
3227        if (state % 2 == 0)
3228                b43_periodic_every30sec(dev);
3229        b43_periodic_every15sec(dev);
3230}
3231
3232/* Periodic work locking policy:
3233 *      The whole periodic work handler is protected by
3234 *      wl->mutex. If another lock is needed somewhere in the
3235 *      pwork callchain, it's acquired in-place, where it's needed.
3236 */
3237static void b43_periodic_work_handler(struct work_struct *work)
3238{
3239        struct b43_wldev *dev = container_of(work, struct b43_wldev,
3240                                             periodic_work.work);
3241        struct b43_wl *wl = dev->wl;
3242        unsigned long delay;
3243
3244        mutex_lock(&wl->mutex);
3245
3246        if (unlikely(b43_status(dev) != B43_STAT_STARTED))
3247                goto out;
3248        if (b43_debug(dev, B43_DBG_PWORK_STOP))
3249                goto out_requeue;
3250
3251        do_periodic_work(dev);
3252
3253        dev->periodic_state++;
3254out_requeue:
3255        if (b43_debug(dev, B43_DBG_PWORK_FAST))
3256                delay = msecs_to_jiffies(50);
3257        else
3258                delay = round_jiffies_relative(HZ * 15);
3259        ieee80211_queue_delayed_work(wl->hw, &dev->periodic_work, delay);
3260out:
3261        mutex_unlock(&wl->mutex);
3262}
3263
3264static void b43_periodic_tasks_setup(struct b43_wldev *dev)
3265{
3266        struct delayed_work *work = &dev->periodic_work;
3267
3268        dev->periodic_state = 0;
3269        INIT_DELAYED_WORK(work, b43_periodic_work_handler);
3270        ieee80211_queue_delayed_work(dev->wl->hw, work, 0);
3271}
3272
3273/* Check if communication with the device works correctly. */
3274static int b43_validate_chipaccess(struct b43_wldev *dev)
3275{
3276        u32 v, backup0, backup4;
3277
3278        backup0 = b43_shm_read32(dev, B43_SHM_SHARED, 0);
3279        backup4 = b43_shm_read32(dev, B43_SHM_SHARED, 4);
3280
3281        /* Check for read/write and endianness problems. */
3282        b43_shm_write32(dev, B43_SHM_SHARED, 0, 0x55AAAA55);
3283        if (b43_shm_read32(dev, B43_SHM_SHARED, 0) != 0x55AAAA55)
3284                goto error;
3285        b43_shm_write32(dev, B43_SHM_SHARED, 0, 0xAA5555AA);
3286        if (b43_shm_read32(dev, B43_SHM_SHARED, 0) != 0xAA5555AA)
3287                goto error;
3288
3289        /* Check if unaligned 32bit SHM_SHARED access works properly.
3290         * However, don't bail out on failure, because it's noncritical. */
3291        b43_shm_write16(dev, B43_SHM_SHARED, 0, 0x1122);
3292        b43_shm_write16(dev, B43_SHM_SHARED, 2, 0x3344);
3293        b43_shm_write16(dev, B43_SHM_SHARED, 4, 0x5566);
3294        b43_shm_write16(dev, B43_SHM_SHARED, 6, 0x7788);
3295        if (b43_shm_read32(dev, B43_SHM_SHARED, 2) != 0x55663344)
3296                b43warn(dev->wl, "Unaligned 32bit SHM read access is broken\n");
3297        b43_shm_write32(dev, B43_SHM_SHARED, 2, 0xAABBCCDD);
3298        if (b43_shm_read16(dev, B43_SHM_SHARED, 0) != 0x1122 ||
3299            b43_shm_read16(dev, B43_SHM_SHARED, 2) != 0xCCDD ||
3300            b43_shm_read16(dev, B43_SHM_SHARED, 4) != 0xAABB ||
3301            b43_shm_read16(dev, B43_SHM_SHARED, 6) != 0x7788)
3302                b43warn(dev->wl, "Unaligned 32bit SHM write access is broken\n");
3303
3304        b43_shm_write32(dev, B43_SHM_SHARED, 0, backup0);
3305        b43_shm_write32(dev, B43_SHM_SHARED, 4, backup4);
3306
3307        if ((dev->dev->core_rev >= 3) && (dev->dev->core_rev <= 10)) {
3308                /* The 32bit register shadows the two 16bit registers
3309                 * with update sideeffects. Validate this. */
3310                b43_write16(dev, B43_MMIO_TSF_CFP_START, 0xAAAA);
3311                b43_write32(dev, B43_MMIO_TSF_CFP_START, 0xCCCCBBBB);
3312                if (b43_read16(dev, B43_MMIO_TSF_CFP_START_LOW) != 0xBBBB)
3313                        goto error;
3314                if (b43_read16(dev, B43_MMIO_TSF_CFP_START_HIGH) != 0xCCCC)
3315                        goto error;
3316        }
3317        b43_write32(dev, B43_MMIO_TSF_CFP_START, 0);
3318
3319        v = b43_read32(dev, B43_MMIO_MACCTL);
3320        v |= B43_MACCTL_GMODE;
3321        if (v != (B43_MACCTL_GMODE | B43_MACCTL_IHR_ENABLED))
3322                goto error;
3323
3324        return 0;
3325error:
3326        b43err(dev->wl, "Failed to validate the chipaccess\n");
3327        return -ENODEV;
3328}
3329
3330static void b43_security_init(struct b43_wldev *dev)
3331{
3332        dev->ktp = b43_shm_read16(dev, B43_SHM_SHARED, B43_SHM_SH_KTP);
3333        /* KTP is a word address, but we address SHM bytewise.
3334         * So multiply by two.
3335         */
3336        dev->ktp *= 2;
3337        /* Number of RCMTA address slots */
3338        b43_write16(dev, B43_MMIO_RCMTA_COUNT, B43_NR_PAIRWISE_KEYS);
3339        /* Clear the key memory. */
3340        b43_clear_keys(dev);
3341}
3342
3343#ifdef CONFIG_B43_HWRNG
3344static int b43_rng_read(struct hwrng *rng, u32 *data)
3345{
3346        struct b43_wl *wl = (struct b43_wl *)rng->priv;
3347        struct b43_wldev *dev;
3348        int count = -ENODEV;
3349
3350        mutex_lock(&wl->mutex);
3351        dev = wl->current_dev;
3352        if (likely(dev && b43_status(dev) >= B43_STAT_INITIALIZED)) {
3353                *data = b43_read16(dev, B43_MMIO_RNG);
3354                count = sizeof(u16);
3355        }
3356        mutex_unlock(&wl->mutex);
3357
3358        return count;
3359}
3360#endif /* CONFIG_B43_HWRNG */
3361
3362static void b43_rng_exit(struct b43_wl *wl)
3363{
3364#ifdef CONFIG_B43_HWRNG
3365        if (wl->rng_initialized)
3366                hwrng_unregister(&wl->rng);
3367#endif /* CONFIG_B43_HWRNG */
3368}
3369
3370static int b43_rng_init(struct b43_wl *wl)
3371{
3372        int err = 0;
3373
3374#ifdef CONFIG_B43_HWRNG
3375        snprintf(wl->rng_name, ARRAY_SIZE(wl->rng_name),
3376                 "%s_%s", KBUILD_MODNAME, wiphy_name(wl->hw->wiphy));
3377        wl->rng.name = wl->rng_name;
3378        wl->rng.data_read = b43_rng_read;
3379        wl->rng.priv = (unsigned long)wl;
3380        wl->rng_initialized = true;
3381        err = hwrng_register(&wl->rng);
3382        if (err) {
3383                wl->rng_initialized = false;
3384                b43err(wl, "Failed to register the random "
3385                       "number generator (%d)\n", err);
3386        }
3387#endif /* CONFIG_B43_HWRNG */
3388
3389        return err;
3390}
3391
3392static void b43_tx_work(struct work_struct *work)
3393{
3394        struct b43_wl *wl = container_of(work, struct b43_wl, tx_work);
3395        struct b43_wldev *dev;
3396        struct sk_buff *skb;
3397        int queue_num;
3398        int err = 0;
3399
3400        mutex_lock(&wl->mutex);
3401        dev = wl->current_dev;
3402        if (unlikely(!dev || b43_status(dev) < B43_STAT_STARTED)) {
3403                mutex_unlock(&wl->mutex);
3404                return;
3405        }
3406
3407        for (queue_num = 0; queue_num < B43_QOS_QUEUE_NUM; queue_num++) {
3408                while (skb_queue_len(&wl->tx_queue[queue_num])) {
3409                        skb = skb_dequeue(&wl->tx_queue[queue_num]);
3410                        if (b43_using_pio_transfers(dev))
3411                                err = b43_pio_tx(dev, skb);
3412                        else
3413                                err = b43_dma_tx(dev, skb);
3414                        if (err == -ENOSPC) {
3415                                wl->tx_queue_stopped[queue_num] = 1;
3416                                ieee80211_stop_queue(wl->hw, queue_num);
3417                                skb_queue_head(&wl->tx_queue[queue_num], skb);
3418                                break;
3419                        }
3420                        if (unlikely(err))
3421                                ieee80211_free_txskb(wl->hw, skb);
3422                        err = 0;
3423                }
3424
3425                if (!err)
3426                        wl->tx_queue_stopped[queue_num] = 0;
3427        }
3428
3429#if B43_DEBUG
3430        dev->tx_count++;
3431#endif
3432        mutex_unlock(&wl->mutex);
3433}
3434
3435static void b43_op_tx(struct ieee80211_hw *hw,
3436                      struct ieee80211_tx_control *control,
3437                      struct sk_buff *skb)
3438{
3439        struct b43_wl *wl = hw_to_b43_wl(hw);
3440
3441        if (unlikely(skb->len < 2 + 2 + 6)) {
3442                /* Too short, this can't be a valid frame. */
3443                ieee80211_free_txskb(hw, skb);
3444                return;
3445        }
3446        B43_WARN_ON(skb_shinfo(skb)->nr_frags);
3447
3448        skb_queue_tail(&wl->tx_queue[skb->queue_mapping], skb);
3449        if (!wl->tx_queue_stopped[skb->queue_mapping]) {
3450                ieee80211_queue_work(wl->hw, &wl->tx_work);
3451        } else {
3452                ieee80211_stop_queue(wl->hw, skb->queue_mapping);
3453        }
3454}
3455
3456static void b43_qos_params_upload(struct b43_wldev *dev,
3457                                  const struct ieee80211_tx_queue_params *p,
3458                                  u16 shm_offset)
3459{
3460        u16 params[B43_NR_QOSPARAMS];
3461        int bslots, tmp;
3462        unsigned int i;
3463
3464        if (!dev->qos_enabled)
3465                return;
3466
3467        bslots = b43_read16(dev, B43_MMIO_RNG) & p->cw_min;
3468
3469        memset(&params, 0, sizeof(params));
3470
3471        params[B43_QOSPARAM_TXOP] = p->txop * 32;
3472        params[B43_QOSPARAM_CWMIN] = p->cw_min;
3473        params[B43_QOSPARAM_CWMAX] = p->cw_max;
3474        params[B43_QOSPARAM_CWCUR] = p->cw_min;
3475        params[B43_QOSPARAM_AIFS] = p->aifs;
3476        params[B43_QOSPARAM_BSLOTS] = bslots;
3477        params[B43_QOSPARAM_REGGAP] = bslots + p->aifs;
3478
3479        for (i = 0; i < ARRAY_SIZE(params); i++) {
3480                if (i == B43_QOSPARAM_STATUS) {
3481                        tmp = b43_shm_read16(dev, B43_SHM_SHARED,
3482                                             shm_offset + (i * 2));
3483                        /* Mark the parameters as updated. */
3484                        tmp |= 0x100;
3485                        b43_shm_write16(dev, B43_SHM_SHARED,
3486                                        shm_offset + (i * 2),
3487                                        tmp);
3488                } else {
3489                        b43_shm_write16(dev, B43_SHM_SHARED,
3490                                        shm_offset + (i * 2),
3491                                        params[i]);
3492                }
3493        }
3494}
3495
3496/* Mapping of mac80211 queue numbers to b43 QoS SHM offsets. */
3497static const u16 b43_qos_shm_offsets[] = {
3498        /* [mac80211-queue-nr] = SHM_OFFSET, */
3499        [0] = B43_QOS_VOICE,
3500        [1] = B43_QOS_VIDEO,
3501        [2] = B43_QOS_BESTEFFORT,
3502        [3] = B43_QOS_BACKGROUND,
3503};
3504
3505/* Update all QOS parameters in hardware. */
3506static void b43_qos_upload_all(struct b43_wldev *dev)
3507{
3508        struct b43_wl *wl = dev->wl;
3509        struct b43_qos_params *params;
3510        unsigned int i;
3511
3512        if (!dev->qos_enabled)
3513                return;
3514
3515        BUILD_BUG_ON(ARRAY_SIZE(b43_qos_shm_offsets) !=
3516                     ARRAY_SIZE(wl->qos_params));
3517
3518        b43_mac_suspend(dev);
3519        for (i = 0; i < ARRAY_SIZE(wl->qos_params); i++) {
3520                params = &(wl->qos_params[i]);
3521                b43_qos_params_upload(dev, &(params->p),
3522                                      b43_qos_shm_offsets[i]);
3523        }
3524        b43_mac_enable(dev);
3525}
3526
3527static void b43_qos_clear(struct b43_wl *wl)
3528{
3529        struct b43_qos_params *params;
3530        unsigned int i;
3531
3532        /* Initialize QoS parameters to sane defaults. */
3533
3534        BUILD_BUG_ON(ARRAY_SIZE(b43_qos_shm_offsets) !=
3535                     ARRAY_SIZE(wl->qos_params));
3536
3537        for (i = 0; i < ARRAY_SIZE(wl->qos_params); i++) {
3538                params = &(wl->qos_params[i]);
3539
3540                switch (b43_qos_shm_offsets[i]) {
3541                case B43_QOS_VOICE:
3542                        params->p.txop = 0;
3543                        params->p.aifs = 2;
3544                        params->p.cw_min = 0x0001;
3545                        params->p.cw_max = 0x0001;
3546                        break;
3547                case B43_QOS_VIDEO:
3548                        params->p.txop = 0;
3549                        params->p.aifs = 2;
3550                        params->p.cw_min = 0x0001;
3551                        params->p.cw_max = 0x0001;
3552                        break;
3553                case B43_QOS_BESTEFFORT:
3554                        params->p.txop = 0;
3555                        params->p.aifs = 3;
3556                        params->p.cw_min = 0x0001;
3557                        params->p.cw_max = 0x03FF;
3558                        break;
3559                case B43_QOS_BACKGROUND:
3560                        params->p.txop = 0;
3561                        params->p.aifs = 7;
3562                        params->p.cw_min = 0x0001;
3563                        params->p.cw_max = 0x03FF;
3564                        break;
3565                default:
3566                        B43_WARN_ON(1);
3567                }
3568        }
3569}
3570
3571/* Initialize the core's QOS capabilities */
3572static void b43_qos_init(struct b43_wldev *dev)
3573{
3574        if (!dev->qos_enabled) {
3575                /* Disable QOS support. */
3576                b43_hf_write(dev, b43_hf_read(dev) & ~B43_HF_EDCF);
3577                b43_write16(dev, B43_MMIO_IFSCTL,
3578                            b43_read16(dev, B43_MMIO_IFSCTL)
3579                            & ~B43_MMIO_IFSCTL_USE_EDCF);
3580                b43dbg(dev->wl, "QoS disabled\n");
3581                return;
3582        }
3583
3584        /* Upload the current QOS parameters. */
3585        b43_qos_upload_all(dev);
3586
3587        /* Enable QOS support. */
3588        b43_hf_write(dev, b43_hf_read(dev) | B43_HF_EDCF);
3589        b43_write16(dev, B43_MMIO_IFSCTL,
3590                    b43_read16(dev, B43_MMIO_IFSCTL)
3591                    | B43_MMIO_IFSCTL_USE_EDCF);
3592        b43dbg(dev->wl, "QoS enabled\n");
3593}
3594
3595static int b43_op_conf_tx(struct ieee80211_hw *hw,
3596                          struct ieee80211_vif *vif, u16 _queue,
3597                          const struct ieee80211_tx_queue_params *params)
3598{
3599        struct b43_wl *wl = hw_to_b43_wl(hw);
3600        struct b43_wldev *dev;
3601        unsigned int queue = (unsigned int)_queue;
3602        int err = -ENODEV;
3603
3604        if (queue >= ARRAY_SIZE(wl->qos_params)) {
3605                /* Queue not available or don't support setting
3606                 * params on this queue. Return success to not
3607                 * confuse mac80211. */
3608                return 0;
3609        }
3610        BUILD_BUG_ON(ARRAY_SIZE(b43_qos_shm_offsets) !=
3611                     ARRAY_SIZE(wl->qos_params));
3612
3613        mutex_lock(&wl->mutex);
3614        dev = wl->current_dev;
3615        if (unlikely(!dev || (b43_status(dev) < B43_STAT_INITIALIZED)))
3616                goto out_unlock;
3617
3618        memcpy(&(wl->qos_params[queue].p), params, sizeof(*params));
3619        b43_mac_suspend(dev);
3620        b43_qos_params_upload(dev, &(wl->qos_params[queue].p),
3621                              b43_qos_shm_offsets[queue]);
3622        b43_mac_enable(dev);
3623        err = 0;
3624
3625out_unlock:
3626        mutex_unlock(&wl->mutex);
3627
3628        return err;
3629}
3630
3631static int b43_op_get_stats(struct ieee80211_hw *hw,
3632                            struct ieee80211_low_level_stats *stats)
3633{
3634        struct b43_wl *wl = hw_to_b43_wl(hw);
3635
3636        mutex_lock(&wl->mutex);
3637        memcpy(stats, &wl->ieee_stats, sizeof(*stats));
3638        mutex_unlock(&wl->mutex);
3639
3640        return 0;
3641}
3642
3643static u64 b43_op_get_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
3644{
3645        struct b43_wl *wl = hw_to_b43_wl(hw);
3646        struct b43_wldev *dev;
3647        u64 tsf;
3648
3649        mutex_lock(&wl->mutex);
3650        dev = wl->current_dev;
3651
3652        if (dev && (b43_status(dev) >= B43_STAT_INITIALIZED))
3653                b43_tsf_read(dev, &tsf);
3654        else
3655                tsf = 0;
3656
3657        mutex_unlock(&wl->mutex);
3658
3659        return tsf;
3660}
3661
3662static void b43_op_set_tsf(struct ieee80211_hw *hw,
3663                           struct ieee80211_vif *vif, u64 tsf)
3664{
3665        struct b43_wl *wl = hw_to_b43_wl(hw);
3666        struct b43_wldev *dev;
3667
3668        mutex_lock(&wl->mutex);
3669        dev = wl->current_dev;
3670
3671        if (dev && (b43_status(dev) >= B43_STAT_INITIALIZED))
3672                b43_tsf_write(dev, tsf);
3673
3674        mutex_unlock(&wl->mutex);
3675}
3676
3677static void b43_put_phy_into_reset(struct b43_wldev *dev)
3678{
3679        u32 tmp;
3680
3681        switch (dev->dev->bus_type) {
3682#ifdef CONFIG_B43_BCMA
3683        case B43_BUS_BCMA:
3684                b43err(dev->wl,
3685                       "Putting PHY into reset not supported on BCMA\n");
3686                break;
3687#endif
3688#ifdef CONFIG_B43_SSB
3689        case B43_BUS_SSB:
3690                tmp = ssb_read32(dev->dev->sdev, SSB_TMSLOW);
3691                tmp &= ~B43_TMSLOW_GMODE;
3692                tmp |= B43_TMSLOW_PHYRESET;
3693                tmp |= SSB_TMSLOW_FGC;
3694                ssb_write32(dev->dev->sdev, SSB_TMSLOW, tmp);
3695                msleep(1);
3696
3697                tmp = ssb_read32(dev->dev->sdev, SSB_TMSLOW);
3698                tmp &= ~SSB_TMSLOW_FGC;
3699                tmp |= B43_TMSLOW_PHYRESET;
3700                ssb_write32(dev->dev->sdev, SSB_TMSLOW, tmp);
3701                msleep(1);
3702
3703                break;
3704#endif
3705        }
3706}
3707
3708static const char *band_to_string(enum ieee80211_band band)
3709{
3710        switch (band) {
3711        case IEEE80211_BAND_5GHZ:
3712                return "5";
3713        case IEEE80211_BAND_2GHZ:
3714                return "2.4";
3715        default:
3716                break;
3717        }
3718        B43_WARN_ON(1);
3719        return "";
3720}
3721
3722/* Expects wl->mutex locked */
3723static int b43_switch_band(struct b43_wl *wl, struct ieee80211_channel *chan)
3724{
3725        struct b43_wldev *up_dev = NULL;
3726        struct b43_wldev *down_dev;
3727        struct b43_wldev *d;
3728        int err;
3729        bool uninitialized_var(gmode);
3730        int prev_status;
3731
3732        /* Find a device and PHY which supports the band. */
3733        list_for_each_entry(d, &wl->devlist, list) {
3734                switch (chan->band) {
3735                case IEEE80211_BAND_5GHZ:
3736                        if (d->phy.supports_5ghz) {
3737                                up_dev = d;
3738                                gmode = false;
3739                        }
3740                        break;
3741                case IEEE80211_BAND_2GHZ:
3742                        if (d->phy.supports_2ghz) {
3743                                up_dev = d;
3744                                gmode = true;
3745                        }
3746                        break;
3747                default:
3748                        B43_WARN_ON(1);
3749                        return -EINVAL;
3750                }
3751                if (up_dev)
3752                        break;
3753        }
3754        if (!up_dev) {
3755                b43err(wl, "Could not find a device for %s-GHz band operation\n",
3756                       band_to_string(chan->band));
3757                return -ENODEV;
3758        }
3759        if ((up_dev == wl->current_dev) &&
3760            (!!wl->current_dev->phy.gmode == !!gmode)) {
3761                /* This device is already running. */
3762                return 0;
3763        }
3764        b43dbg(wl, "Switching to %s-GHz band\n",
3765               band_to_string(chan->band));
3766        down_dev = wl->current_dev;
3767
3768        prev_status = b43_status(down_dev);
3769        /* Shutdown the currently running core. */
3770        if (prev_status >= B43_STAT_STARTED)
3771                down_dev = b43_wireless_core_stop(down_dev);
3772        if (prev_status >= B43_STAT_INITIALIZED)
3773                b43_wireless_core_exit(down_dev);
3774
3775        if (down_dev != up_dev) {
3776                /* We switch to a different core, so we put PHY into
3777                 * RESET on the old core. */
3778                b43_put_phy_into_reset(down_dev);
3779        }
3780
3781        /* Now start the new core. */
3782        up_dev->phy.gmode = gmode;
3783        if (prev_status >= B43_STAT_INITIALIZED) {
3784                err = b43_wireless_core_init(up_dev);
3785                if (err) {
3786                        b43err(wl, "Fatal: Could not initialize device for "
3787                               "selected %s-GHz band\n",
3788                               band_to_string(chan->band));
3789                        goto init_failure;
3790                }
3791        }
3792        if (prev_status >= B43_STAT_STARTED) {
3793                err = b43_wireless_core_start(up_dev);
3794                if (err) {
3795                        b43err(wl, "Fatal: Could not start device for "
3796                               "selected %s-GHz band\n",
3797                               band_to_string(chan->band));
3798                        b43_wireless_core_exit(up_dev);
3799                        goto init_failure;
3800                }
3801        }
3802        B43_WARN_ON(b43_status(up_dev) != prev_status);
3803
3804        wl->current_dev = up_dev;
3805
3806        return 0;
3807init_failure:
3808        /* Whoops, failed to init the new core. No core is operating now. */
3809        wl->current_dev = NULL;
3810        return err;
3811}
3812
3813/* Write the short and long frame retry limit values. */
3814static void b43_set_retry_limits(struct b43_wldev *dev,
3815                                 unsigned int short_retry,
3816                                 unsigned int long_retry)
3817{
3818        /* The retry limit is a 4-bit counter. Enforce this to avoid overflowing
3819         * the chip-internal counter. */
3820        short_retry = min(short_retry, (unsigned int)0xF);
3821        long_retry = min(long_retry, (unsigned int)0xF);
3822
3823        b43_shm_write16(dev, B43_SHM_SCRATCH, B43_SHM_SC_SRLIMIT,
3824                        short_retry);
3825        b43_shm_write16(dev, B43_SHM_SCRATCH, B43_SHM_SC_LRLIMIT,
3826                        long_retry);
3827}
3828
3829static int b43_op_config(struct ieee80211_hw *hw, u32 changed)
3830{
3831        struct b43_wl *wl = hw_to_b43_wl(hw);
3832        struct b43_wldev *dev;
3833        struct b43_phy *phy;
3834        struct ieee80211_conf *conf = &hw->conf;
3835        int antenna;
3836        int err = 0;
3837        bool reload_bss = false;
3838
3839        mutex_lock(&wl->mutex);
3840
3841        dev = wl->current_dev;
3842
3843        /* Switch the band (if necessary). This might change the active core. */
3844        err = b43_switch_band(wl, conf->channel);
3845        if (err)
3846                goto out_unlock_mutex;
3847
3848        /* Need to reload all settings if the core changed */
3849        if (dev != wl->current_dev) {
3850                dev = wl->current_dev;
3851                changed = ~0;
3852                reload_bss = true;
3853        }
3854
3855        phy = &dev->phy;
3856
3857        if (conf_is_ht(conf))
3858                phy->is_40mhz =
3859                        (conf_is_ht40_minus(conf) || conf_is_ht40_plus(conf));
3860        else
3861                phy->is_40mhz = false;
3862
3863        b43_mac_suspend(dev);
3864
3865        if (changed & IEEE80211_CONF_CHANGE_RETRY_LIMITS)
3866                b43_set_retry_limits(dev, conf->short_frame_max_tx_count,
3867                                          conf->long_frame_max_tx_count);
3868        changed &= ~IEEE80211_CONF_CHANGE_RETRY_LIMITS;
3869        if (!changed)
3870                goto out_mac_enable;
3871
3872        /* Switch to the requested channel.
3873         * The firmware takes care of races with the TX handler. */
3874        if (conf->channel->hw_value != phy->channel)
3875                b43_switch_channel(dev, conf->channel->hw_value);
3876
3877        dev->wl->radiotap_enabled = !!(conf->flags & IEEE80211_CONF_MONITOR);
3878
3879        /* Adjust the desired TX power level. */
3880        if (conf->power_level != 0) {
3881                if (conf->power_level != phy->desired_txpower) {
3882                        phy->desired_txpower = conf->power_level;
3883                        b43_phy_txpower_check(dev, B43_TXPWR_IGNORE_TIME |
3884                                                   B43_TXPWR_IGNORE_TSSI);
3885                }
3886        }
3887
3888        /* Antennas for RX and management frame TX. */
3889        antenna = B43_ANTENNA_DEFAULT;
3890        b43_mgmtframe_txantenna(dev, antenna);
3891        antenna = B43_ANTENNA_DEFAULT;
3892        if (phy->ops->set_rx_antenna)
3893                phy->ops->set_rx_antenna(dev, antenna);
3894
3895        if (wl->radio_enabled != phy->radio_on) {
3896                if (wl->radio_enabled) {
3897                        b43_software_rfkill(dev, false);
3898                        b43info(dev->wl, "Radio turned on by software\n");
3899                        if (!dev->radio_hw_enable) {
3900                                b43info(dev->wl, "The hardware RF-kill button "
3901                                        "still turns the radio physically off. "
3902                                        "Press the button to turn it on.\n");
3903                        }
3904                } else {
3905                        b43_software_rfkill(dev, true);
3906                        b43info(dev->wl, "Radio turned off by software\n");
3907                }
3908        }
3909
3910out_mac_enable:
3911        b43_mac_enable(dev);
3912out_unlock_mutex:
3913        mutex_unlock(&wl->mutex);
3914
3915        if (wl->vif && reload_bss)
3916                b43_op_bss_info_changed(hw, wl->vif, &wl->vif->bss_conf, ~0);
3917
3918        return err;
3919}
3920
3921static void b43_update_basic_rates(struct b43_wldev *dev, u32 brates)
3922{
3923        struct ieee80211_supported_band *sband =
3924                dev->wl->hw->wiphy->bands[b43_current_band(dev->wl)];
3925        struct ieee80211_rate *rate;
3926        int i;
3927        u16 basic, direct, offset, basic_offset, rateptr;
3928
3929        for (i = 0; i < sband->n_bitrates; i++) {
3930                rate = &sband->bitrates[i];
3931
3932                if (b43_is_cck_rate(rate->hw_value)) {
3933                        direct = B43_SHM_SH_CCKDIRECT;
3934                        basic = B43_SHM_SH_CCKBASIC;
3935                        offset = b43_plcp_get_ratecode_cck(rate->hw_value);
3936                        offset &= 0xF;
3937                } else {
3938                        direct = B43_SHM_SH_OFDMDIRECT;
3939                        basic = B43_SHM_SH_OFDMBASIC;
3940                        offset = b43_plcp_get_ratecode_ofdm(rate->hw_value);
3941                        offset &= 0xF;
3942                }
3943
3944                rate = ieee80211_get_response_rate(sband, brates, rate->bitrate);
3945
3946                if (b43_is_cck_rate(rate->hw_value)) {
3947                        basic_offset = b43_plcp_get_ratecode_cck(rate->hw_value);
3948                        basic_offset &= 0xF;
3949                } else {
3950                        basic_offset = b43_plcp_get_ratecode_ofdm(rate->hw_value);
3951                        basic_offset &= 0xF;
3952                }
3953
3954                /*
3955                 * Get the pointer that we need to point to
3956                 * from the direct map
3957                 */
3958                rateptr = b43_shm_read16(dev, B43_SHM_SHARED,
3959                                         direct + 2 * basic_offset);
3960                /* and write it to the basic map */
3961                b43_shm_write16(dev, B43_SHM_SHARED, basic + 2 * offset,
3962                                rateptr);
3963        }
3964}
3965
3966static void b43_op_bss_info_changed(struct ieee80211_hw *hw,
3967                                    struct ieee80211_vif *vif,
3968                                    struct ieee80211_bss_conf *conf,
3969                                    u32 changed)
3970{
3971        struct b43_wl *wl = hw_to_b43_wl(hw);
3972        struct b43_wldev *dev;
3973
3974        mutex_lock(&wl->mutex);
3975
3976        dev = wl->current_dev;
3977        if (!dev || b43_status(dev) < B43_STAT_STARTED)
3978                goto out_unlock_mutex;
3979
3980        B43_WARN_ON(wl->vif != vif);
3981
3982        if (changed & BSS_CHANGED_BSSID) {
3983                if (conf->bssid)
3984                        memcpy(wl->bssid, conf->bssid, ETH_ALEN);
3985                else
3986                        memset(wl->bssid, 0, ETH_ALEN);
3987        }
3988
3989        if (b43_status(dev) >= B43_STAT_INITIALIZED) {
3990                if (changed & BSS_CHANGED_BEACON &&
3991                    (b43_is_mode(wl, NL80211_IFTYPE_AP) ||
3992                     b43_is_mode(wl, NL80211_IFTYPE_MESH_POINT) ||
3993                     b43_is_mode(wl, NL80211_IFTYPE_ADHOC)))
3994                        b43_update_templates(wl);
3995
3996                if (changed & BSS_CHANGED_BSSID)
3997                        b43_write_mac_bssid_templates(dev);
3998        }
3999
4000        b43_mac_suspend(dev);
4001
4002        /* Update templates for AP/mesh mode. */
4003        if (changed & BSS_CHANGED_BEACON_INT &&
4004            (b43_is_mode(wl, NL80211_IFTYPE_AP) ||
4005             b43_is_mode(wl, NL80211_IFTYPE_MESH_POINT) ||
4006             b43_is_mode(wl, NL80211_IFTYPE_ADHOC)) &&
4007            conf->beacon_int)
4008                b43_set_beacon_int(dev, conf->beacon_int);
4009
4010        if (changed & BSS_CHANGED_BASIC_RATES)
4011                b43_update_basic_rates(dev, conf->basic_rates);
4012
4013        if (changed & BSS_CHANGED_ERP_SLOT) {
4014                if (conf->use_short_slot)
4015                        b43_short_slot_timing_enable(dev);
4016                else
4017                        b43_short_slot_timing_disable(dev);
4018        }
4019
4020        b43_mac_enable(dev);
4021out_unlock_mutex:
4022        mutex_unlock(&wl->mutex);
4023}
4024
4025static int b43_op_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
4026                          struct ieee80211_vif *vif, struct ieee80211_sta *sta,
4027                          struct ieee80211_key_conf *key)
4028{
4029        struct b43_wl *wl = hw_to_b43_wl(hw);
4030        struct b43_wldev *dev;
4031        u8 algorithm;
4032        u8 index;
4033        int err;
4034        static const u8 bcast_addr[ETH_ALEN] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
4035
4036        if (modparam_nohwcrypt)
4037                return -ENOSPC; /* User disabled HW-crypto */
4038
4039        if ((vif->type == NL80211_IFTYPE_ADHOC ||
4040             vif->type == NL80211_IFTYPE_MESH_POINT) &&
4041            (key->cipher == WLAN_CIPHER_SUITE_TKIP ||
4042             key->cipher == WLAN_CIPHER_SUITE_CCMP) &&
4043            !(key->flags & IEEE80211_KEY_FLAG_PAIRWISE)) {
4044                /*
4045                 * For now, disable hw crypto for the RSN IBSS group keys. This
4046                 * could be optimized in the future, but until that gets
4047                 * implemented, use of software crypto for group addressed
4048                 * frames is a acceptable to allow RSN IBSS to be used.
4049                 */
4050                return -EOPNOTSUPP;
4051        }
4052
4053        mutex_lock(&wl->mutex);
4054
4055        dev = wl->current_dev;
4056        err = -ENODEV;
4057        if (!dev || b43_status(dev) < B43_STAT_INITIALIZED)
4058                goto out_unlock;
4059
4060        if (dev->fw.pcm_request_failed || !dev->hwcrypto_enabled) {
4061                /* We don't have firmware for the crypto engine.
4062                 * Must use software-crypto. */
4063                err = -EOPNOTSUPP;
4064                goto out_unlock;
4065        }
4066
4067        err = -EINVAL;
4068        switch (key->cipher) {
4069        case WLAN_CIPHER_SUITE_WEP40:
4070                algorithm = B43_SEC_ALGO_WEP40;
4071                break;
4072        case WLAN_CIPHER_SUITE_WEP104:
4073                algorithm = B43_SEC_ALGO_WEP104;
4074                break;
4075        case WLAN_CIPHER_SUITE_TKIP:
4076                algorithm = B43_SEC_ALGO_TKIP;
4077                break;
4078        case WLAN_CIPHER_SUITE_CCMP:
4079                algorithm = B43_SEC_ALGO_AES;
4080                break;
4081        default:
4082                B43_WARN_ON(1);
4083                goto out_unlock;
4084        }
4085        index = (u8) (key->keyidx);
4086        if (index > 3)
4087                goto out_unlock;
4088
4089        switch (cmd) {
4090        case SET_KEY:
4091                if (algorithm == B43_SEC_ALGO_TKIP &&
4092                    (!(key->flags & IEEE80211_KEY_FLAG_PAIRWISE) ||
4093                    !modparam_hwtkip)) {
4094                        /* We support only pairwise key */
4095                        err = -EOPNOTSUPP;
4096                        goto out_unlock;
4097                }
4098
4099                if (key->flags & IEEE80211_KEY_FLAG_PAIRWISE) {
4100                        if (WARN_ON(!sta)) {
4101                                err = -EOPNOTSUPP;
4102                                goto out_unlock;
4103                        }
4104                        /* Pairwise key with an assigned MAC address. */
4105                        err = b43_key_write(dev, -1, algorithm,
4106                                            key->key, key->keylen,
4107                                            sta->addr, key);
4108                } else {
4109                        /* Group key */
4110                        err = b43_key_write(dev, index, algorithm,
4111                                            key->key, key->keylen, NULL, key);
4112                }
4113                if (err)
4114                        goto out_unlock;
4115
4116                if (algorithm == B43_SEC_ALGO_WEP40 ||
4117                    algorithm == B43_SEC_ALGO_WEP104) {
4118                        b43_hf_write(dev, b43_hf_read(dev) | B43_HF_USEDEFKEYS);
4119                } else {
4120                        b43_hf_write(dev,
4121                                     b43_hf_read(dev) & ~B43_HF_USEDEFKEYS);
4122                }
4123                key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV;
4124                if (algorithm == B43_SEC_ALGO_TKIP)
4125                        key->flags |= IEEE80211_KEY_FLAG_GENERATE_MMIC;
4126                break;
4127        case DISABLE_KEY: {
4128                err = b43_key_clear(dev, key->hw_key_idx);
4129                if (err)
4130                        goto out_unlock;
4131                break;
4132        }
4133        default:
4134                B43_WARN_ON(1);
4135        }
4136
4137out_unlock:
4138        if (!err) {
4139                b43dbg(wl, "%s hardware based encryption for keyidx: %d, "
4140                       "mac: %pM\n",
4141                       cmd == SET_KEY ? "Using" : "Disabling", key->keyidx,
4142                       sta ? sta->addr : bcast_addr);
4143                b43_dump_keymemory(dev);
4144        }
4145        mutex_unlock(&wl->mutex);
4146
4147        return err;
4148}
4149
4150static void b43_op_configure_filter(struct ieee80211_hw *hw,
4151                                    unsigned int changed, unsigned int *fflags,
4152                                    u64 multicast)
4153{
4154        struct b43_wl *wl = hw_to_b43_wl(hw);
4155        struct b43_wldev *dev;
4156
4157        mutex_lock(&wl->mutex);
4158        dev = wl->current_dev;
4159        if (!dev) {
4160                *fflags = 0;
4161                goto out_unlock;
4162        }
4163
4164        *fflags &= FIF_PROMISC_IN_BSS |
4165                  FIF_ALLMULTI |
4166                  FIF_FCSFAIL |
4167                  FIF_PLCPFAIL |
4168                  FIF_CONTROL |
4169                  FIF_OTHER_BSS |
4170                  FIF_BCN_PRBRESP_PROMISC;
4171
4172        changed &= FIF_PROMISC_IN_BSS |
4173                   FIF_ALLMULTI |
4174                   FIF_FCSFAIL |
4175                   FIF_PLCPFAIL |
4176                   FIF_CONTROL |
4177                   FIF_OTHER_BSS |
4178                   FIF_BCN_PRBRESP_PROMISC;
4179
4180        wl->filter_flags = *fflags;
4181
4182        if (changed && b43_status(dev) >= B43_STAT_INITIALIZED)
4183                b43_adjust_opmode(dev);
4184
4185out_unlock:
4186        mutex_unlock(&wl->mutex);
4187}
4188
4189/* Locking: wl->mutex
4190 * Returns the current dev. This might be different from the passed in dev,
4191 * because the core might be gone away while we unlocked the mutex. */
4192static struct b43_wldev * b43_wireless_core_stop(struct b43_wldev *dev)
4193{
4194        struct b43_wl *wl;
4195        struct b43_wldev *orig_dev;
4196        u32 mask;
4197        int queue_num;
4198
4199        if (!dev)
4200                return NULL;
4201        wl = dev->wl;
4202redo:
4203        if (!dev || b43_status(dev) < B43_STAT_STARTED)
4204                return dev;
4205
4206        /* Cancel work. Unlock to avoid deadlocks. */
4207        mutex_unlock(&wl->mutex);
4208        cancel_delayed_work_sync(&dev->periodic_work);
4209        cancel_work_sync(&wl->tx_work);
4210        mutex_lock(&wl->mutex);
4211        dev = wl->current_dev;
4212        if (!dev || b43_status(dev) < B43_STAT_STARTED) {
4213                /* Whoops, aliens ate up the device while we were unlocked. */
4214                return dev;
4215        }
4216
4217        /* Disable interrupts on the device. */
4218        b43_set_status(dev, B43_STAT_INITIALIZED);
4219        if (b43_bus_host_is_sdio(dev->dev)) {
4220                /* wl->mutex is locked. That is enough. */
4221                b43_write32(dev, B43_MMIO_GEN_IRQ_MASK, 0);
4222                b43_read32(dev, B43_MMIO_GEN_IRQ_MASK); /* Flush */
4223        } else {
4224                spin_lock_irq(&wl->hardirq_lock);
4225                b43_write32(dev, B43_MMIO_GEN_IRQ_MASK, 0);
4226                b43_read32(dev, B43_MMIO_GEN_IRQ_MASK); /* Flush */
4227                spin_unlock_irq(&wl->hardirq_lock);
4228        }
4229        /* Synchronize and free the interrupt handlers. Unlock to avoid deadlocks. */
4230        orig_dev = dev;
4231        mutex_unlock(&wl->mutex);
4232        if (b43_bus_host_is_sdio(dev->dev)) {
4233                b43_sdio_free_irq(dev);
4234        } else {
4235                synchronize_irq(dev->dev->irq);
4236                free_irq(dev->dev->irq, dev);
4237        }
4238        mutex_lock(&wl->mutex);
4239        dev = wl->current_dev;
4240        if (!dev)
4241                return dev;
4242        if (dev != orig_dev) {
4243                if (b43_status(dev) >= B43_STAT_STARTED)
4244                        goto redo;
4245                return dev;
4246        }
4247        mask = b43_read32(dev, B43_MMIO_GEN_IRQ_MASK);
4248        B43_WARN_ON(mask != 0xFFFFFFFF && mask);
4249
4250        /* Drain all TX queues. */
4251        for (queue_num = 0; queue_num < B43_QOS_QUEUE_NUM; queue_num++) {
4252                while (skb_queue_len(&wl->tx_queue[queue_num])) {
4253                        struct sk_buff *skb;
4254
4255                        skb = skb_dequeue(&wl->tx_queue[queue_num]);
4256                        ieee80211_free_txskb(wl->hw, skb);
4257                }
4258        }
4259
4260        b43_mac_suspend(dev);
4261        b43_leds_exit(dev);
4262        b43dbg(wl, "Wireless interface stopped\n");
4263
4264        return dev;
4265}
4266
4267/* Locking: wl->mutex */
4268static int b43_wireless_core_start(struct b43_wldev *dev)
4269{
4270        int err;
4271
4272        B43_WARN_ON(b43_status(dev) != B43_STAT_INITIALIZED);
4273
4274        drain_txstatus_queue(dev);
4275        if (b43_bus_host_is_sdio(dev->dev)) {
4276                err = b43_sdio_request_irq(dev, b43_sdio_interrupt_handler);
4277                if (err) {
4278                        b43err(dev->wl, "Cannot request SDIO IRQ\n");
4279                        goto out;
4280                }
4281        } else {
4282                err = request_threaded_irq(dev->dev->irq, b43_interrupt_handler,
4283                                           b43_interrupt_thread_handler,
4284                                           IRQF_SHARED, KBUILD_MODNAME, dev);
4285                if (err) {
4286                        b43err(dev->wl, "Cannot request IRQ-%d\n",
4287                               dev->dev->irq);
4288                        goto out;
4289                }
4290        }
4291
4292        /* We are ready to run. */
4293        ieee80211_wake_queues(dev->wl->hw);
4294        b43_set_status(dev, B43_STAT_STARTED);
4295
4296        /* Start data flow (TX/RX). */
4297        b43_mac_enable(dev);
4298        b43_write32(dev, B43_MMIO_GEN_IRQ_MASK, dev->irq_mask);
4299
4300        /* Start maintenance work */
4301        b43_periodic_tasks_setup(dev);
4302
4303        b43_leds_init(dev);
4304
4305        b43dbg(dev->wl, "Wireless interface started\n");
4306out:
4307        return err;
4308}
4309
4310static char *b43_phy_name(struct b43_wldev *dev, u8 phy_type)
4311{
4312        switch (phy_type) {
4313        case B43_PHYTYPE_A:
4314                return "A";
4315        case B43_PHYTYPE_B:
4316                return "B";
4317        case B43_PHYTYPE_G:
4318                return "G";
4319        case B43_PHYTYPE_N:
4320                return "N";
4321        case B43_PHYTYPE_LP:
4322                return "LP";
4323        case B43_PHYTYPE_SSLPN:
4324                return "SSLPN";
4325        case B43_PHYTYPE_HT:
4326                return "HT";
4327        case B43_PHYTYPE_LCN:
4328                return "LCN";
4329        case B43_PHYTYPE_LCNXN:
4330                return "LCNXN";
4331        case B43_PHYTYPE_LCN40:
4332                return "LCN40";
4333        case B43_PHYTYPE_AC:
4334                return "AC";
4335        }
4336        return "UNKNOWN";
4337}
4338
4339/* Get PHY and RADIO versioning numbers */
4340static int b43_phy_versioning(struct b43_wldev *dev)
4341{
4342        struct b43_phy *phy = &dev->phy;
4343        u32 tmp;
4344        u8 analog_type;
4345        u8 phy_type;
4346        u8 phy_rev;
4347        u16 radio_manuf;
4348        u16 radio_ver;
4349        u16 radio_rev;
4350        int unsupported = 0;
4351
4352        /* Get PHY versioning */
4353        tmp = b43_read16(dev, B43_MMIO_PHY_VER);
4354        analog_type = (tmp & B43_PHYVER_ANALOG) >> B43_PHYVER_ANALOG_SHIFT;
4355        phy_type = (tmp & B43_PHYVER_TYPE) >> B43_PHYVER_TYPE_SHIFT;
4356        phy_rev = (tmp & B43_PHYVER_VERSION);
4357        switch (phy_type) {
4358        case B43_PHYTYPE_A:
4359                if (phy_rev >= 4)
4360                        unsupported = 1;
4361                break;
4362        case B43_PHYTYPE_B:
4363                if (phy_rev != 2 && phy_rev != 4 && phy_rev != 6
4364                    && phy_rev != 7)
4365                        unsupported = 1;
4366                break;
4367        case B43_PHYTYPE_G:
4368                if (phy_rev > 9)
4369                        unsupported = 1;
4370                break;
4371#ifdef CONFIG_B43_PHY_N
4372        case B43_PHYTYPE_N:
4373                if (phy_rev > 9)
4374                        unsupported = 1;
4375                break;
4376#endif
4377#ifdef CONFIG_B43_PHY_LP
4378        case B43_PHYTYPE_LP:
4379                if (phy_rev > 2)
4380                        unsupported = 1;
4381                break;
4382#endif
4383#ifdef CONFIG_B43_PHY_HT
4384        case B43_PHYTYPE_HT:
4385                if (phy_rev > 1)
4386                        unsupported = 1;
4387                break;
4388#endif
4389#ifdef CONFIG_B43_PHY_LCN
4390        case B43_PHYTYPE_LCN:
4391                if (phy_rev > 1)
4392                        unsupported = 1;
4393                break;
4394#endif
4395        default:
4396                unsupported = 1;
4397        }
4398        if (unsupported) {
4399                b43err(dev->wl, "FOUND UNSUPPORTED PHY (Analog %u, Type %d (%s), Revision %u)\n",
4400                       analog_type, phy_type, b43_phy_name(dev, phy_type),
4401                       phy_rev);
4402                return -EOPNOTSUPP;
4403        }
4404        b43info(dev->wl, "Found PHY: Analog %u, Type %d (%s), Revision %u\n",
4405                analog_type, phy_type, b43_phy_name(dev, phy_type), phy_rev);
4406
4407        /* Get RADIO versioning */
4408        if (dev->dev->core_rev >= 24) {
4409                u16 radio24[3];
4410
4411                for (tmp = 0; tmp < 3; tmp++) {
4412                        b43_write16(dev, B43_MMIO_RADIO24_CONTROL, tmp);
4413                        radio24[tmp] = b43_read16(dev, B43_MMIO_RADIO24_DATA);
4414                }
4415
4416                /* Broadcom uses "id" for our "ver" and has separated "ver" */
4417                /* radio_ver = (radio24[0] & 0xF0) >> 4; */
4418
4419                radio_manuf = 0x17F;
4420                radio_ver = (radio24[2] << 8) | radio24[1];
4421                radio_rev = (radio24[0] & 0xF);
4422        } else {
4423                if (dev->dev->chip_id == 0x4317) {
4424                        if (dev->dev->chip_rev == 0)
4425                                tmp = 0x3205017F;
4426                        else if (dev->dev->chip_rev == 1)
4427                                tmp = 0x4205017F;
4428                        else
4429                                tmp = 0x5205017F;
4430                } else {
4431                        b43_write16(dev, B43_MMIO_RADIO_CONTROL,
4432                                    B43_RADIOCTL_ID);
4433                        tmp = b43_read16(dev, B43_MMIO_RADIO_DATA_LOW);
4434                        b43_write16(dev, B43_MMIO_RADIO_CONTROL,
4435                                    B43_RADIOCTL_ID);
4436                        tmp |= (u32)b43_read16(dev, B43_MMIO_RADIO_DATA_HIGH)
4437                                << 16;
4438                }
4439                radio_manuf = (tmp & 0x00000FFF);
4440                radio_ver = (tmp & 0x0FFFF000) >> 12;
4441                radio_rev = (tmp & 0xF0000000) >> 28;
4442        }
4443
4444        if (radio_manuf != 0x17F /* Broadcom */)
4445                unsupported = 1;
4446        switch (phy_type) {
4447        case B43_PHYTYPE_A:
4448                if (radio_ver != 0x2060)
4449                        unsupported = 1;
4450                if (radio_rev != 1)
4451                        unsupported = 1;
4452                if (radio_manuf != 0x17F)
4453                        unsupported = 1;
4454                break;
4455        case B43_PHYTYPE_B:
4456                if ((radio_ver & 0xFFF0) != 0x2050)
4457                        unsupported = 1;
4458                break;
4459        case B43_PHYTYPE_G:
4460                if (radio_ver != 0x2050)
4461                        unsupported = 1;
4462                break;
4463        case B43_PHYTYPE_N:
4464                if (radio_ver != 0x2055 && radio_ver != 0x2056)
4465                        unsupported = 1;
4466                break;
4467        case B43_PHYTYPE_LP:
4468                if (radio_ver != 0x2062 && radio_ver != 0x2063)
4469                        unsupported = 1;
4470                break;
4471        case B43_PHYTYPE_HT:
4472                if (radio_ver != 0x2059)
4473                        unsupported = 1;
4474                break;
4475        case B43_PHYTYPE_LCN:
4476                if (radio_ver != 0x2064)
4477                        unsupported = 1;
4478                break;
4479        default:
4480                B43_WARN_ON(1);
4481        }
4482        if (unsupported) {
4483                b43err(dev->wl, "FOUND UNSUPPORTED RADIO "
4484                       "(Manuf 0x%X, Version 0x%X, Revision %u)\n",
4485                       radio_manuf, radio_ver, radio_rev);
4486                return -EOPNOTSUPP;
4487        }
4488        b43dbg(dev->wl, "Found Radio: Manuf 0x%X, Version 0x%X, Revision %u\n",
4489               radio_manuf, radio_ver, radio_rev);
4490
4491        phy->radio_manuf = radio_manuf;
4492        phy->radio_ver = radio_ver;
4493        phy->radio_rev = radio_rev;
4494
4495        phy->analog = analog_type;
4496        phy->type = phy_type;
4497        phy->rev = phy_rev;
4498
4499        return 0;
4500}
4501
4502static void setup_struct_phy_for_init(struct b43_wldev *dev,
4503                                      struct b43_phy *phy)
4504{
4505        phy->hardware_power_control = !!modparam_hwpctl;
4506        phy->next_txpwr_check_time = jiffies;
4507        /* PHY TX errors counter. */
4508        atomic_set(&phy->txerr_cnt, B43_PHY_TX_BADNESS_LIMIT);
4509
4510#if B43_DEBUG
4511        phy->phy_locked = false;
4512        phy->radio_locked = false;
4513#endif
4514}
4515
4516static void setup_struct_wldev_for_init(struct b43_wldev *dev)
4517{
4518        dev->dfq_valid = false;
4519
4520        /* Assume the radio is enabled. If it's not enabled, the state will
4521         * immediately get fixed on the first periodic work run. */
4522        dev->radio_hw_enable = true;
4523
4524        /* Stats */
4525        memset(&dev->stats, 0, sizeof(dev->stats));
4526
4527        setup_struct_phy_for_init(dev, &dev->phy);
4528
4529        /* IRQ related flags */
4530        dev->irq_reason = 0;
4531        memset(dev->dma_reason, 0, sizeof(dev->dma_reason));
4532        dev->irq_mask = B43_IRQ_MASKTEMPLATE;
4533        if (b43_modparam_verbose < B43_VERBOSITY_DEBUG)
4534                dev->irq_mask &= ~B43_IRQ_PHY_TXERR;
4535
4536        dev->mac_suspended = 1;
4537
4538        /* Noise calculation context */
4539        memset(&dev->noisecalc, 0, sizeof(dev->noisecalc));
4540}
4541
4542static void b43_bluetooth_coext_enable(struct b43_wldev *dev)
4543{
4544        struct ssb_sprom *sprom = dev->dev->bus_sprom;
4545        u64 hf;
4546
4547        if (!modparam_btcoex)
4548                return;
4549        if (!(sprom->boardflags_lo & B43_BFL_BTCOEXIST))
4550                return;
4551        if (dev->phy.type != B43_PHYTYPE_B && !dev->phy.gmode)
4552                return;
4553
4554        hf = b43_hf_read(dev);
4555        if (sprom->boardflags_lo & B43_BFL_BTCMOD)
4556                hf |= B43_HF_BTCOEXALT;
4557        else
4558                hf |= B43_HF_BTCOEX;
4559        b43_hf_write(dev, hf);
4560}
4561
4562static void b43_bluetooth_coext_disable(struct b43_wldev *dev)
4563{
4564        if (!modparam_btcoex)
4565                return;
4566        //TODO
4567}
4568
4569static void b43_imcfglo_timeouts_workaround(struct b43_wldev *dev)
4570{
4571        struct ssb_bus *bus;
4572        u32 tmp;
4573
4574        if (dev->dev->bus_type != B43_BUS_SSB)
4575                return;
4576
4577        bus = dev->dev->sdev->bus;
4578
4579        if ((bus->chip_id == 0x4311 && bus->chip_rev == 2) ||
4580            (bus->chip_id == 0x4312)) {
4581                tmp = ssb_read32(dev->dev->sdev, SSB_IMCFGLO);
4582                tmp &= ~SSB_IMCFGLO_REQTO;
4583                tmp &= ~SSB_IMCFGLO_SERTO;
4584                tmp |= 0x3;
4585                ssb_write32(dev->dev->sdev, SSB_IMCFGLO, tmp);
4586                ssb_commit_settings(bus);
4587        }
4588}
4589
4590static void b43_set_synth_pu_delay(struct b43_wldev *dev, bool idle)
4591{
4592        u16 pu_delay;
4593
4594        /* The time value is in microseconds. */
4595        if (dev->phy.type == B43_PHYTYPE_A)
4596                pu_delay = 3700;
4597        else
4598                pu_delay = 1050;
4599        if (b43_is_mode(dev->wl, NL80211_IFTYPE_ADHOC) || idle)
4600                pu_delay = 500;
4601        if ((dev->phy.radio_ver == 0x2050) && (dev->phy.radio_rev == 8))
4602                pu_delay = max(pu_delay, (u16)2400);
4603
4604        b43_shm_write16(dev, B43_SHM_SHARED, B43_SHM_SH_SPUWKUP, pu_delay);
4605}
4606
4607/* Set the TSF CFP pre-TargetBeaconTransmissionTime. */
4608static void b43_set_pretbtt(struct b43_wldev *dev)
4609{
4610        u16 pretbtt;
4611
4612        /* The time value is in microseconds. */
4613        if (b43_is_mode(dev->wl, NL80211_IFTYPE_ADHOC)) {
4614                pretbtt = 2;
4615        } else {
4616                if (dev->phy.type == B43_PHYTYPE_A)
4617                        pretbtt = 120;
4618                else
4619                        pretbtt = 250;
4620        }
4621        b43_shm_write16(dev, B43_SHM_SHARED, B43_SHM_SH_PRETBTT, pretbtt);
4622        b43_write16(dev, B43_MMIO_TSF_CFP_PRETBTT, pretbtt);
4623}
4624
4625/* Shutdown a wireless core */
4626/* Locking: wl->mutex */
4627static void b43_wireless_core_exit(struct b43_wldev *dev)
4628{
4629        B43_WARN_ON(dev && b43_status(dev) > B43_STAT_INITIALIZED);
4630        if (!dev || b43_status(dev) != B43_STAT_INITIALIZED)
4631                return;
4632
4633        /* Unregister HW RNG driver */
4634        b43_rng_exit(dev->wl);
4635
4636        b43_set_status(dev, B43_STAT_UNINIT);
4637
4638        /* Stop the microcode PSM. */
4639        b43_maskset32(dev, B43_MMIO_MACCTL, ~B43_MACCTL_PSM_RUN,
4640                      B43_MACCTL_PSM_JMP0);
4641
4642        b43_dma_free(dev);
4643        b43_pio_free(dev);
4644        b43_chip_exit(dev);
4645        dev->phy.ops->switch_analog(dev, 0);
4646        if (dev->wl->current_beacon) {
4647                dev_kfree_skb_any(dev->wl->current_beacon);
4648                dev->wl->current_beacon = NULL;
4649        }
4650
4651        b43_device_disable(dev, 0);
4652        b43_bus_may_powerdown(dev);
4653}
4654
4655/* Initialize a wireless core */
4656static int b43_wireless_core_init(struct b43_wldev *dev)
4657{
4658        struct ssb_sprom *sprom = dev->dev->bus_sprom;
4659        struct b43_phy *phy = &dev->phy;
4660        int err;
4661        u64 hf;
4662
4663        B43_WARN_ON(b43_status(dev) != B43_STAT_UNINIT);
4664
4665        err = b43_bus_powerup(dev, 0);
4666        if (err)
4667                goto out;
4668        if (!b43_device_is_enabled(dev))
4669                b43_wireless_core_reset(dev, phy->gmode);
4670
4671        /* Reset all data structures. */
4672        setup_struct_wldev_for_init(dev);
4673        phy->ops->prepare_structs(dev);
4674
4675        /* Enable IRQ routing to this device. */
4676        switch (dev->dev->bus_type) {
4677#ifdef CONFIG_B43_BCMA
4678        case B43_BUS_BCMA:
4679                bcma_core_pci_irq_ctl(&dev->dev->bdev->bus->drv_pci[0],
4680                                      dev->dev->bdev, true);
4681                break;
4682#endif
4683#ifdef CONFIG_B43_SSB
4684        case B43_BUS_SSB:
4685                ssb_pcicore_dev_irqvecs_enable(&dev->dev->sdev->bus->pcicore,
4686                                               dev->dev->sdev);
4687                break;
4688#endif
4689        }
4690
4691        b43_imcfglo_timeouts_workaround(dev);
4692        b43_bluetooth_coext_disable(dev);
4693        if (phy->ops->prepare_hardware) {
4694                err = phy->ops->prepare_hardware(dev);
4695                if (err)
4696                        goto err_busdown;
4697        }
4698        err = b43_chip_init(dev);
4699        if (err)
4700                goto err_busdown;
4701        b43_shm_write16(dev, B43_SHM_SHARED,
4702                        B43_SHM_SH_WLCOREREV, dev->dev->core_rev);
4703        hf = b43_hf_read(dev);
4704        if (phy->type == B43_PHYTYPE_G) {
4705                hf |= B43_HF_SYMW;
4706                if (phy->rev == 1)
4707                        hf |= B43_HF_GDCW;
4708                if (sprom->boardflags_lo & B43_BFL_PACTRL)
4709                        hf |= B43_HF_OFDMPABOOST;
4710        }
4711        if (phy->radio_ver == 0x2050) {
4712                if (phy->radio_rev == 6)
4713                        hf |= B43_HF_4318TSSI;
4714                if (phy->radio_rev < 6)
4715                        hf |= B43_HF_VCORECALC;
4716        }
4717        if (sprom->boardflags_lo & B43_BFL_XTAL_NOSLOW)
4718                hf |= B43_HF_DSCRQ; /* Disable slowclock requests from ucode. */
4719#ifdef CONFIG_SSB_DRIVER_PCICORE
4720        if (dev->dev->bus_type == B43_BUS_SSB &&
4721            dev->dev->sdev->bus->bustype == SSB_BUSTYPE_PCI &&
4722            dev->dev->sdev->bus->pcicore.dev->id.revision <= 10)
4723                hf |= B43_HF_PCISCW; /* PCI slow clock workaround. */
4724#endif
4725        hf &= ~B43_HF_SKCFPUP;
4726        b43_hf_write(dev, hf);
4727
4728        b43_set_retry_limits(dev, B43_DEFAULT_SHORT_RETRY_LIMIT,
4729                             B43_DEFAULT_LONG_RETRY_LIMIT);
4730        b43_shm_write16(dev, B43_SHM_SHARED, B43_SHM_SH_SFFBLIM, 3);
4731        b43_shm_write16(dev, B43_SHM_SHARED, B43_SHM_SH_LFFBLIM, 2);
4732
4733        /* Disable sending probe responses from firmware.
4734         * Setting the MaxTime to one usec will always trigger
4735         * a timeout, so we never send any probe resp.
4736         * A timeout of zero is infinite. */
4737        b43_shm_write16(dev, B43_SHM_SHARED, B43_SHM_SH_PRMAXTIME, 1);
4738
4739        b43_rate_memory_init(dev);
4740        b43_set_phytxctl_defaults(dev);
4741
4742        /* Minimum Contention Window */
4743        if (phy->type == B43_PHYTYPE_B)
4744                b43_shm_write16(dev, B43_SHM_SCRATCH, B43_SHM_SC_MINCONT, 0x1F);
4745        else
4746                b43_shm_write16(dev, B43_SHM_SCRATCH, B43_SHM_SC_MINCONT, 0xF);
4747        /* Maximum Contention Window */
4748        b43_shm_write16(dev, B43_SHM_SCRATCH, B43_SHM_SC_MAXCONT, 0x3FF);
4749
4750        if (b43_bus_host_is_pcmcia(dev->dev) ||
4751            b43_bus_host_is_sdio(dev->dev)) {
4752                dev->__using_pio_transfers = true;
4753                err = b43_pio_init(dev);
4754        } else if (dev->use_pio) {
4755                b43warn(dev->wl, "Forced PIO by use_pio module parameter. "
4756                        "This should not be needed and will result in lower "
4757                        "performance.\n");
4758                dev->__using_pio_transfers = true;
4759                err = b43_pio_init(dev);
4760        } else {
4761                dev->__using_pio_transfers = false;
4762                err = b43_dma_init(dev);
4763        }
4764        if (err)
4765                goto err_chip_exit;
4766        b43_qos_init(dev);
4767        b43_set_synth_pu_delay(dev, 1);
4768        b43_bluetooth_coext_enable(dev);
4769
4770        b43_bus_powerup(dev, !(sprom->boardflags_lo & B43_BFL_XTAL_NOSLOW));
4771        b43_upload_card_macaddress(dev);
4772        b43_security_init(dev);
4773
4774        ieee80211_wake_queues(dev->wl->hw);
4775
4776        b43_set_status(dev, B43_STAT_INITIALIZED);
4777
4778        /* Register HW RNG driver */
4779        b43_rng_init(dev->wl);
4780
4781out:
4782        return err;
4783
4784err_chip_exit:
4785        b43_chip_exit(dev);
4786err_busdown:
4787        b43_bus_may_powerdown(dev);
4788        B43_WARN_ON(b43_status(dev) != B43_STAT_UNINIT);
4789        return err;
4790}
4791
4792static int b43_op_add_interface(struct ieee80211_hw *hw,
4793                                struct ieee80211_vif *vif)
4794{
4795        struct b43_wl *wl = hw_to_b43_wl(hw);
4796        struct b43_wldev *dev;
4797        int err = -EOPNOTSUPP;
4798
4799        /* TODO: allow WDS/AP devices to coexist */
4800
4801        if (vif->type != NL80211_IFTYPE_AP &&
4802            vif->type != NL80211_IFTYPE_MESH_POINT &&
4803            vif->type != NL80211_IFTYPE_STATION &&
4804            vif->type != NL80211_IFTYPE_WDS &&
4805            vif->type != NL80211_IFTYPE_ADHOC)
4806                return -EOPNOTSUPP;
4807
4808        mutex_lock(&wl->mutex);
4809        if (wl->operating)
4810                goto out_mutex_unlock;
4811
4812        b43dbg(wl, "Adding Interface type %d\n", vif->type);
4813
4814        dev = wl->current_dev;
4815        wl->operating = true;
4816        wl->vif = vif;
4817        wl->if_type = vif->type;
4818        memcpy(wl->mac_addr, vif->addr, ETH_ALEN);
4819
4820        b43_adjust_opmode(dev);
4821        b43_set_pretbtt(dev);
4822        b43_set_synth_pu_delay(dev, 0);
4823        b43_upload_card_macaddress(dev);
4824
4825        err = 0;
4826 out_mutex_unlock:
4827        mutex_unlock(&wl->mutex);
4828
4829        if (err == 0)
4830                b43_op_bss_info_changed(hw, vif, &vif->bss_conf, ~0);
4831
4832        return err;
4833}
4834
4835static void b43_op_remove_interface(struct ieee80211_hw *hw,
4836                                    struct ieee80211_vif *vif)
4837{
4838        struct b43_wl *wl = hw_to_b43_wl(hw);
4839        struct b43_wldev *dev = wl->current_dev;
4840
4841        b43dbg(wl, "Removing Interface type %d\n", vif->type);
4842
4843        mutex_lock(&wl->mutex);
4844
4845        B43_WARN_ON(!wl->operating);
4846        B43_WARN_ON(wl->vif != vif);
4847        wl->vif = NULL;
4848
4849        wl->operating = false;
4850
4851        b43_adjust_opmode(dev);
4852        memset(wl->mac_addr, 0, ETH_ALEN);
4853        b43_upload_card_macaddress(dev);
4854
4855        mutex_unlock(&wl->mutex);
4856}
4857
4858static int b43_op_start(struct ieee80211_hw *hw)
4859{
4860        struct b43_wl *wl = hw_to_b43_wl(hw);
4861        struct b43_wldev *dev = wl->current_dev;
4862        int did_init = 0;
4863        int err = 0;
4864
4865        /* Kill all old instance specific information to make sure
4866         * the card won't use it in the short timeframe between start
4867         * and mac80211 reconfiguring it. */
4868        memset(wl->bssid, 0, ETH_ALEN);
4869        memset(wl->mac_addr, 0, ETH_ALEN);
4870        wl->filter_flags = 0;
4871        wl->radiotap_enabled = false;
4872        b43_qos_clear(wl);
4873        wl->beacon0_uploaded = false;
4874        wl->beacon1_uploaded = false;
4875        wl->beacon_templates_virgin = true;
4876        wl->radio_enabled = true;
4877
4878        mutex_lock(&wl->mutex);
4879
4880        if (b43_status(dev) < B43_STAT_INITIALIZED) {
4881                err = b43_wireless_core_init(dev);
4882                if (err)
4883                        goto out_mutex_unlock;
4884                did_init = 1;
4885        }
4886
4887        if (b43_status(dev) < B43_STAT_STARTED) {
4888                err = b43_wireless_core_start(dev);
4889                if (err) {
4890                        if (did_init)
4891                                b43_wireless_core_exit(dev);
4892                        goto out_mutex_unlock;
4893                }
4894        }
4895
4896        /* XXX: only do if device doesn't support rfkill irq */
4897        wiphy_rfkill_start_polling(hw->wiphy);
4898
4899 out_mutex_unlock:
4900        mutex_unlock(&wl->mutex);
4901
4902        /*
4903         * Configuration may have been overwritten during initialization.
4904         * Reload the configuration, but only if initialization was
4905         * successful. Reloading the configuration after a failed init
4906         * may hang the system.
4907         */
4908        if (!err)
4909                b43_op_config(hw, ~0);
4910
4911        return err;
4912}
4913
4914static void b43_op_stop(struct ieee80211_hw *hw)
4915{
4916        struct b43_wl *wl = hw_to_b43_wl(hw);
4917        struct b43_wldev *dev = wl->current_dev;
4918
4919        cancel_work_sync(&(wl->beacon_update_trigger));
4920
4921        if (!dev)
4922                goto out;
4923
4924        mutex_lock(&wl->mutex);
4925        if (b43_status(dev) >= B43_STAT_STARTED) {
4926                dev = b43_wireless_core_stop(dev);
4927                if (!dev)
4928                        goto out_unlock;
4929        }
4930        b43_wireless_core_exit(dev);
4931        wl->radio_enabled = false;
4932
4933out_unlock:
4934        mutex_unlock(&wl->mutex);
4935out:
4936        cancel_work_sync(&(wl->txpower_adjust_work));
4937}
4938
4939static int b43_op_beacon_set_tim(struct ieee80211_hw *hw,
4940                                 struct ieee80211_sta *sta, bool set)
4941{
4942        struct b43_wl *wl = hw_to_b43_wl(hw);
4943
4944        /* FIXME: add locking */
4945        b43_update_templates(wl);
4946
4947        return 0;
4948}
4949
4950static void b43_op_sta_notify(struct ieee80211_hw *hw,
4951                              struct ieee80211_vif *vif,
4952                              enum sta_notify_cmd notify_cmd,
4953                              struct ieee80211_sta *sta)
4954{
4955        struct b43_wl *wl = hw_to_b43_wl(hw);
4956
4957        B43_WARN_ON(!vif || wl->vif != vif);
4958}
4959
4960static void b43_op_sw_scan_start_notifier(struct ieee80211_hw *hw)
4961{
4962        struct b43_wl *wl = hw_to_b43_wl(hw);
4963        struct b43_wldev *dev;
4964
4965        mutex_lock(&wl->mutex);
4966        dev = wl->current_dev;
4967        if (dev && (b43_status(dev) >= B43_STAT_INITIALIZED)) {
4968                /* Disable CFP update during scan on other channels. */
4969                b43_hf_write(dev, b43_hf_read(dev) | B43_HF_SKCFPUP);
4970        }
4971        mutex_unlock(&wl->mutex);
4972}
4973
4974static void b43_op_sw_scan_complete_notifier(struct ieee80211_hw *hw)
4975{