mac80211_if.c revision b0c359b2f68e982ac9334a5f2c04c3a67dee4d50
1/* 2 * Copyright (c) 2010 Broadcom Corporation 3 * 4 * Permission to use, copy, modify, and/or distribute this software for any 5 * purpose with or without fee is hereby granted, provided that the above 6 * copyright notice and this permission notice appear in all copies. 7 * 8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY 11 * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION 13 * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN 14 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 15 */ 16 17#define __UNDEF_NO_VERSION__ 18#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt 19 20#include <linux/etherdevice.h> 21#include <linux/sched.h> 22#include <linux/firmware.h> 23#include <linux/interrupt.h> 24#include <linux/module.h> 25#include <linux/bcma/bcma.h> 26#include <net/mac80211.h> 27#include <defs.h> 28#include "nicpci.h" 29#include "phy/phy_int.h" 30#include "d11.h" 31#include "channel.h" 32#include "scb.h" 33#include "pub.h" 34#include "ucode_loader.h" 35#include "mac80211_if.h" 36#include "main.h" 37 38#define N_TX_QUEUES 4 /* #tx queues on mac80211<->driver interface */ 39 40/* Flags we support */ 41#define MAC_FILTERS (FIF_PROMISC_IN_BSS | \ 42 FIF_ALLMULTI | \ 43 FIF_FCSFAIL | \ 44 FIF_CONTROL | \ 45 FIF_OTHER_BSS | \ 46 FIF_BCN_PRBRESP_PROMISC | \ 47 FIF_PSPOLL) 48 49#define CHAN2GHZ(channel, freqency, chflags) { \ 50 .band = IEEE80211_BAND_2GHZ, \ 51 .center_freq = (freqency), \ 52 .hw_value = (channel), \ 53 .flags = chflags, \ 54 .max_antenna_gain = 0, \ 55 .max_power = 19, \ 56} 57 58#define CHAN5GHZ(channel, chflags) { \ 59 .band = IEEE80211_BAND_5GHZ, \ 60 .center_freq = 5000 + 5*(channel), \ 61 .hw_value = (channel), \ 62 .flags = chflags, \ 63 .max_antenna_gain = 0, \ 64 .max_power = 21, \ 65} 66 67#define RATE(rate100m, _flags) { \ 68 .bitrate = (rate100m), \ 69 .flags = (_flags), \ 70 .hw_value = (rate100m / 5), \ 71} 72 73struct firmware_hdr { 74 __le32 offset; 75 __le32 len; 76 __le32 idx; 77}; 78 79static const char * const brcms_firmwares[MAX_FW_IMAGES] = { 80 "brcm/bcm43xx", 81 NULL 82}; 83 84static int n_adapters_found; 85 86MODULE_AUTHOR("Broadcom Corporation"); 87MODULE_DESCRIPTION("Broadcom 802.11n wireless LAN driver."); 88MODULE_SUPPORTED_DEVICE("Broadcom 802.11n WLAN cards"); 89MODULE_LICENSE("Dual BSD/GPL"); 90 91 92/* recognized BCMA Core IDs */ 93static struct bcma_device_id brcms_coreid_table[] = { 94 BCMA_CORE(BCMA_MANUF_BCM, BCMA_CORE_80211, 23, BCMA_ANY_CLASS), 95 BCMA_CORE(BCMA_MANUF_BCM, BCMA_CORE_80211, 24, BCMA_ANY_CLASS), 96 BCMA_CORETABLE_END 97}; 98MODULE_DEVICE_TABLE(bcma, brcms_coreid_table); 99 100#ifdef DEBUG 101static int msglevel = 0xdeadbeef; 102module_param(msglevel, int, 0); 103#endif /* DEBUG */ 104 105static struct ieee80211_channel brcms_2ghz_chantable[] = { 106 CHAN2GHZ(1, 2412, IEEE80211_CHAN_NO_HT40MINUS), 107 CHAN2GHZ(2, 2417, IEEE80211_CHAN_NO_HT40MINUS), 108 CHAN2GHZ(3, 2422, IEEE80211_CHAN_NO_HT40MINUS), 109 CHAN2GHZ(4, 2427, IEEE80211_CHAN_NO_HT40MINUS), 110 CHAN2GHZ(5, 2432, 0), 111 CHAN2GHZ(6, 2437, 0), 112 CHAN2GHZ(7, 2442, 0), 113 CHAN2GHZ(8, 2447, IEEE80211_CHAN_NO_HT40PLUS), 114 CHAN2GHZ(9, 2452, IEEE80211_CHAN_NO_HT40PLUS), 115 CHAN2GHZ(10, 2457, IEEE80211_CHAN_NO_HT40PLUS), 116 CHAN2GHZ(11, 2462, IEEE80211_CHAN_NO_HT40PLUS), 117 CHAN2GHZ(12, 2467, 118 IEEE80211_CHAN_PASSIVE_SCAN | IEEE80211_CHAN_NO_IBSS | 119 IEEE80211_CHAN_NO_HT40PLUS), 120 CHAN2GHZ(13, 2472, 121 IEEE80211_CHAN_PASSIVE_SCAN | IEEE80211_CHAN_NO_IBSS | 122 IEEE80211_CHAN_NO_HT40PLUS), 123 CHAN2GHZ(14, 2484, 124 IEEE80211_CHAN_PASSIVE_SCAN | IEEE80211_CHAN_NO_IBSS | 125 IEEE80211_CHAN_NO_HT40PLUS | IEEE80211_CHAN_NO_HT40MINUS) 126}; 127 128static struct ieee80211_channel brcms_5ghz_nphy_chantable[] = { 129 /* UNII-1 */ 130 CHAN5GHZ(36, IEEE80211_CHAN_NO_HT40MINUS), 131 CHAN5GHZ(40, IEEE80211_CHAN_NO_HT40PLUS), 132 CHAN5GHZ(44, IEEE80211_CHAN_NO_HT40MINUS), 133 CHAN5GHZ(48, IEEE80211_CHAN_NO_HT40PLUS), 134 /* UNII-2 */ 135 CHAN5GHZ(52, 136 IEEE80211_CHAN_RADAR | IEEE80211_CHAN_NO_IBSS | 137 IEEE80211_CHAN_PASSIVE_SCAN | IEEE80211_CHAN_NO_HT40MINUS), 138 CHAN5GHZ(56, 139 IEEE80211_CHAN_RADAR | IEEE80211_CHAN_NO_IBSS | 140 IEEE80211_CHAN_PASSIVE_SCAN | IEEE80211_CHAN_NO_HT40PLUS), 141 CHAN5GHZ(60, 142 IEEE80211_CHAN_RADAR | IEEE80211_CHAN_NO_IBSS | 143 IEEE80211_CHAN_PASSIVE_SCAN | IEEE80211_CHAN_NO_HT40MINUS), 144 CHAN5GHZ(64, 145 IEEE80211_CHAN_RADAR | IEEE80211_CHAN_NO_IBSS | 146 IEEE80211_CHAN_PASSIVE_SCAN | IEEE80211_CHAN_NO_HT40PLUS), 147 /* MID */ 148 CHAN5GHZ(100, 149 IEEE80211_CHAN_RADAR | IEEE80211_CHAN_NO_IBSS | 150 IEEE80211_CHAN_PASSIVE_SCAN | IEEE80211_CHAN_NO_HT40MINUS), 151 CHAN5GHZ(104, 152 IEEE80211_CHAN_RADAR | IEEE80211_CHAN_NO_IBSS | 153 IEEE80211_CHAN_PASSIVE_SCAN | IEEE80211_CHAN_NO_HT40PLUS), 154 CHAN5GHZ(108, 155 IEEE80211_CHAN_RADAR | IEEE80211_CHAN_NO_IBSS | 156 IEEE80211_CHAN_PASSIVE_SCAN | IEEE80211_CHAN_NO_HT40MINUS), 157 CHAN5GHZ(112, 158 IEEE80211_CHAN_RADAR | IEEE80211_CHAN_NO_IBSS | 159 IEEE80211_CHAN_PASSIVE_SCAN | IEEE80211_CHAN_NO_HT40PLUS), 160 CHAN5GHZ(116, 161 IEEE80211_CHAN_RADAR | IEEE80211_CHAN_NO_IBSS | 162 IEEE80211_CHAN_PASSIVE_SCAN | IEEE80211_CHAN_NO_HT40MINUS), 163 CHAN5GHZ(120, 164 IEEE80211_CHAN_RADAR | IEEE80211_CHAN_NO_IBSS | 165 IEEE80211_CHAN_PASSIVE_SCAN | IEEE80211_CHAN_NO_HT40PLUS), 166 CHAN5GHZ(124, 167 IEEE80211_CHAN_RADAR | IEEE80211_CHAN_NO_IBSS | 168 IEEE80211_CHAN_PASSIVE_SCAN | IEEE80211_CHAN_NO_HT40MINUS), 169 CHAN5GHZ(128, 170 IEEE80211_CHAN_RADAR | IEEE80211_CHAN_NO_IBSS | 171 IEEE80211_CHAN_PASSIVE_SCAN | IEEE80211_CHAN_NO_HT40PLUS), 172 CHAN5GHZ(132, 173 IEEE80211_CHAN_RADAR | IEEE80211_CHAN_NO_IBSS | 174 IEEE80211_CHAN_PASSIVE_SCAN | IEEE80211_CHAN_NO_HT40MINUS), 175 CHAN5GHZ(136, 176 IEEE80211_CHAN_RADAR | IEEE80211_CHAN_NO_IBSS | 177 IEEE80211_CHAN_PASSIVE_SCAN | IEEE80211_CHAN_NO_HT40PLUS), 178 CHAN5GHZ(140, 179 IEEE80211_CHAN_RADAR | IEEE80211_CHAN_NO_IBSS | 180 IEEE80211_CHAN_PASSIVE_SCAN | IEEE80211_CHAN_NO_HT40PLUS | 181 IEEE80211_CHAN_NO_HT40MINUS), 182 /* UNII-3 */ 183 CHAN5GHZ(149, IEEE80211_CHAN_NO_HT40MINUS), 184 CHAN5GHZ(153, IEEE80211_CHAN_NO_HT40PLUS), 185 CHAN5GHZ(157, IEEE80211_CHAN_NO_HT40MINUS), 186 CHAN5GHZ(161, IEEE80211_CHAN_NO_HT40PLUS), 187 CHAN5GHZ(165, IEEE80211_CHAN_NO_HT40PLUS | IEEE80211_CHAN_NO_HT40MINUS) 188}; 189 190/* 191 * The rate table is used for both 2.4G and 5G rates. The 192 * latter being a subset as it does not support CCK rates. 193 */ 194static struct ieee80211_rate legacy_ratetable[] = { 195 RATE(10, 0), 196 RATE(20, IEEE80211_RATE_SHORT_PREAMBLE), 197 RATE(55, IEEE80211_RATE_SHORT_PREAMBLE), 198 RATE(110, IEEE80211_RATE_SHORT_PREAMBLE), 199 RATE(60, 0), 200 RATE(90, 0), 201 RATE(120, 0), 202 RATE(180, 0), 203 RATE(240, 0), 204 RATE(360, 0), 205 RATE(480, 0), 206 RATE(540, 0), 207}; 208 209static const struct ieee80211_supported_band brcms_band_2GHz_nphy_template = { 210 .band = IEEE80211_BAND_2GHZ, 211 .channels = brcms_2ghz_chantable, 212 .n_channels = ARRAY_SIZE(brcms_2ghz_chantable), 213 .bitrates = legacy_ratetable, 214 .n_bitrates = ARRAY_SIZE(legacy_ratetable), 215 .ht_cap = { 216 /* from include/linux/ieee80211.h */ 217 .cap = IEEE80211_HT_CAP_GRN_FLD | 218 IEEE80211_HT_CAP_SGI_20 | IEEE80211_HT_CAP_SGI_40, 219 .ht_supported = true, 220 .ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K, 221 .ampdu_density = AMPDU_DEF_MPDU_DENSITY, 222 .mcs = { 223 /* placeholders for now */ 224 .rx_mask = {0xff, 0xff, 0, 0, 0, 0, 0, 0, 0, 0}, 225 .rx_highest = cpu_to_le16(500), 226 .tx_params = IEEE80211_HT_MCS_TX_DEFINED} 227 } 228}; 229 230static const struct ieee80211_supported_band brcms_band_5GHz_nphy_template = { 231 .band = IEEE80211_BAND_5GHZ, 232 .channels = brcms_5ghz_nphy_chantable, 233 .n_channels = ARRAY_SIZE(brcms_5ghz_nphy_chantable), 234 .bitrates = legacy_ratetable + BRCMS_LEGACY_5G_RATE_OFFSET, 235 .n_bitrates = ARRAY_SIZE(legacy_ratetable) - 236 BRCMS_LEGACY_5G_RATE_OFFSET, 237 .ht_cap = { 238 .cap = IEEE80211_HT_CAP_GRN_FLD | IEEE80211_HT_CAP_SGI_20 | 239 IEEE80211_HT_CAP_SGI_40, 240 .ht_supported = true, 241 .ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K, 242 .ampdu_density = AMPDU_DEF_MPDU_DENSITY, 243 .mcs = { 244 /* placeholders for now */ 245 .rx_mask = {0xff, 0xff, 0, 0, 0, 0, 0, 0, 0, 0}, 246 .rx_highest = cpu_to_le16(500), 247 .tx_params = IEEE80211_HT_MCS_TX_DEFINED} 248 } 249}; 250 251/* flags the given rate in rateset as requested */ 252static void brcms_set_basic_rate(struct brcm_rateset *rs, u16 rate, bool is_br) 253{ 254 u32 i; 255 256 for (i = 0; i < rs->count; i++) { 257 if (rate != (rs->rates[i] & 0x7f)) 258 continue; 259 260 if (is_br) 261 rs->rates[i] |= BRCMS_RATE_FLAG; 262 else 263 rs->rates[i] &= BRCMS_RATE_MASK; 264 return; 265 } 266} 267 268static void brcms_ops_tx(struct ieee80211_hw *hw, struct sk_buff *skb) 269{ 270 struct brcms_info *wl = hw->priv; 271 272 spin_lock_bh(&wl->lock); 273 if (!wl->pub->up) { 274 wiphy_err(wl->wiphy, "ops->tx called while down\n"); 275 kfree_skb(skb); 276 goto done; 277 } 278 brcms_c_sendpkt_mac80211(wl->wlc, skb, hw); 279 done: 280 spin_unlock_bh(&wl->lock); 281} 282 283static int brcms_ops_start(struct ieee80211_hw *hw) 284{ 285 struct brcms_info *wl = hw->priv; 286 bool blocked; 287 int err; 288 289 ieee80211_wake_queues(hw); 290 spin_lock_bh(&wl->lock); 291 blocked = brcms_rfkill_set_hw_state(wl); 292 spin_unlock_bh(&wl->lock); 293 if (!blocked) 294 wiphy_rfkill_stop_polling(wl->pub->ieee_hw->wiphy); 295 296 spin_lock_bh(&wl->lock); 297 /* avoid acknowledging frames before a non-monitor device is added */ 298 wl->mute_tx = true; 299 300 if (!wl->pub->up) 301 err = brcms_up(wl); 302 else 303 err = -ENODEV; 304 spin_unlock_bh(&wl->lock); 305 306 if (err != 0) 307 wiphy_err(hw->wiphy, "%s: brcms_up() returned %d\n", __func__, 308 err); 309 return err; 310} 311 312static void brcms_ops_stop(struct ieee80211_hw *hw) 313{ 314 struct brcms_info *wl = hw->priv; 315 int status; 316 317 ieee80211_stop_queues(hw); 318 319 if (wl->wlc == NULL) 320 return; 321 322 spin_lock_bh(&wl->lock); 323 status = brcms_c_chipmatch(wl->wlc->hw->vendorid, 324 wl->wlc->hw->deviceid); 325 spin_unlock_bh(&wl->lock); 326 if (!status) { 327 wiphy_err(wl->wiphy, 328 "wl: brcms_ops_stop: chipmatch failed\n"); 329 return; 330 } 331 332 /* put driver in down state */ 333 spin_lock_bh(&wl->lock); 334 brcms_down(wl); 335 spin_unlock_bh(&wl->lock); 336} 337 338static int 339brcms_ops_add_interface(struct ieee80211_hw *hw, struct ieee80211_vif *vif) 340{ 341 struct brcms_info *wl = hw->priv; 342 343 /* Just STA for now */ 344 if (vif->type != NL80211_IFTYPE_STATION) { 345 wiphy_err(hw->wiphy, "%s: Attempt to add type %d, only" 346 " STA for now\n", __func__, vif->type); 347 return -EOPNOTSUPP; 348 } 349 350 wl->mute_tx = false; 351 brcms_c_mute(wl->wlc, false); 352 353 return 0; 354} 355 356static void 357brcms_ops_remove_interface(struct ieee80211_hw *hw, struct ieee80211_vif *vif) 358{ 359} 360 361static int brcms_ops_config(struct ieee80211_hw *hw, u32 changed) 362{ 363 struct ieee80211_conf *conf = &hw->conf; 364 struct brcms_info *wl = hw->priv; 365 int err = 0; 366 int new_int; 367 struct wiphy *wiphy = hw->wiphy; 368 369 spin_lock_bh(&wl->lock); 370 if (changed & IEEE80211_CONF_CHANGE_LISTEN_INTERVAL) { 371 brcms_c_set_beacon_listen_interval(wl->wlc, 372 conf->listen_interval); 373 } 374 if (changed & IEEE80211_CONF_CHANGE_MONITOR) 375 wiphy_dbg(wiphy, "%s: change monitor mode: %s\n", 376 __func__, conf->flags & IEEE80211_CONF_MONITOR ? 377 "true" : "false"); 378 if (changed & IEEE80211_CONF_CHANGE_PS) 379 wiphy_err(wiphy, "%s: change power-save mode: %s (implement)\n", 380 __func__, conf->flags & IEEE80211_CONF_PS ? 381 "true" : "false"); 382 383 if (changed & IEEE80211_CONF_CHANGE_POWER) { 384 err = brcms_c_set_tx_power(wl->wlc, conf->power_level); 385 if (err < 0) { 386 wiphy_err(wiphy, "%s: Error setting power_level\n", 387 __func__); 388 goto config_out; 389 } 390 new_int = brcms_c_get_tx_power(wl->wlc); 391 if (new_int != conf->power_level) 392 wiphy_err(wiphy, "%s: Power level req != actual, %d %d" 393 "\n", __func__, conf->power_level, 394 new_int); 395 } 396 if (changed & IEEE80211_CONF_CHANGE_CHANNEL) { 397 if (conf->channel_type == NL80211_CHAN_HT20 || 398 conf->channel_type == NL80211_CHAN_NO_HT) 399 err = brcms_c_set_channel(wl->wlc, 400 conf->channel->hw_value); 401 else 402 err = -ENOTSUPP; 403 } 404 if (changed & IEEE80211_CONF_CHANGE_RETRY_LIMITS) 405 err = brcms_c_set_rate_limit(wl->wlc, 406 conf->short_frame_max_tx_count, 407 conf->long_frame_max_tx_count); 408 409 config_out: 410 spin_unlock_bh(&wl->lock); 411 return err; 412} 413 414static void 415brcms_ops_bss_info_changed(struct ieee80211_hw *hw, 416 struct ieee80211_vif *vif, 417 struct ieee80211_bss_conf *info, u32 changed) 418{ 419 struct brcms_info *wl = hw->priv; 420 struct wiphy *wiphy = hw->wiphy; 421 422 if (changed & BSS_CHANGED_ASSOC) { 423 /* association status changed (associated/disassociated) 424 * also implies a change in the AID. 425 */ 426 wiphy_err(wiphy, "%s: %s: %sassociated\n", KBUILD_MODNAME, 427 __func__, info->assoc ? "" : "dis"); 428 spin_lock_bh(&wl->lock); 429 brcms_c_associate_upd(wl->wlc, info->assoc); 430 spin_unlock_bh(&wl->lock); 431 } 432 if (changed & BSS_CHANGED_ERP_SLOT) { 433 s8 val; 434 435 /* slot timing changed */ 436 if (info->use_short_slot) 437 val = 1; 438 else 439 val = 0; 440 spin_lock_bh(&wl->lock); 441 brcms_c_set_shortslot_override(wl->wlc, val); 442 spin_unlock_bh(&wl->lock); 443 } 444 445 if (changed & BSS_CHANGED_HT) { 446 /* 802.11n parameters changed */ 447 u16 mode = info->ht_operation_mode; 448 449 spin_lock_bh(&wl->lock); 450 brcms_c_protection_upd(wl->wlc, BRCMS_PROT_N_CFG, 451 mode & IEEE80211_HT_OP_MODE_PROTECTION); 452 brcms_c_protection_upd(wl->wlc, BRCMS_PROT_N_NONGF, 453 mode & IEEE80211_HT_OP_MODE_NON_GF_STA_PRSNT); 454 brcms_c_protection_upd(wl->wlc, BRCMS_PROT_N_OBSS, 455 mode & IEEE80211_HT_OP_MODE_NON_HT_STA_PRSNT); 456 spin_unlock_bh(&wl->lock); 457 } 458 if (changed & BSS_CHANGED_BASIC_RATES) { 459 struct ieee80211_supported_band *bi; 460 u32 br_mask, i; 461 u16 rate; 462 struct brcm_rateset rs; 463 int error; 464 465 /* retrieve the current rates */ 466 spin_lock_bh(&wl->lock); 467 brcms_c_get_current_rateset(wl->wlc, &rs); 468 spin_unlock_bh(&wl->lock); 469 470 br_mask = info->basic_rates; 471 bi = hw->wiphy->bands[brcms_c_get_curband(wl->wlc)]; 472 for (i = 0; i < bi->n_bitrates; i++) { 473 /* convert to internal rate value */ 474 rate = (bi->bitrates[i].bitrate << 1) / 10; 475 476 /* set/clear basic rate flag */ 477 brcms_set_basic_rate(&rs, rate, br_mask & 1); 478 br_mask >>= 1; 479 } 480 481 /* update the rate set */ 482 spin_lock_bh(&wl->lock); 483 error = brcms_c_set_rateset(wl->wlc, &rs); 484 spin_unlock_bh(&wl->lock); 485 if (error) 486 wiphy_err(wiphy, "changing basic rates failed: %d\n", 487 error); 488 } 489 if (changed & BSS_CHANGED_BEACON_INT) { 490 /* Beacon interval changed */ 491 spin_lock_bh(&wl->lock); 492 brcms_c_set_beacon_period(wl->wlc, info->beacon_int); 493 spin_unlock_bh(&wl->lock); 494 } 495 if (changed & BSS_CHANGED_BSSID) { 496 /* BSSID changed, for whatever reason (IBSS and managed mode) */ 497 spin_lock_bh(&wl->lock); 498 brcms_c_set_addrmatch(wl->wlc, RCM_BSSID_OFFSET, info->bssid); 499 spin_unlock_bh(&wl->lock); 500 } 501 if (changed & BSS_CHANGED_BEACON) 502 /* Beacon data changed, retrieve new beacon (beaconing modes) */ 503 wiphy_err(wiphy, "%s: beacon changed\n", __func__); 504 505 if (changed & BSS_CHANGED_BEACON_ENABLED) { 506 /* Beaconing should be enabled/disabled (beaconing modes) */ 507 wiphy_err(wiphy, "%s: Beacon enabled: %s\n", __func__, 508 info->enable_beacon ? "true" : "false"); 509 } 510 511 if (changed & BSS_CHANGED_CQM) { 512 /* Connection quality monitor config changed */ 513 wiphy_err(wiphy, "%s: cqm change: threshold %d, hys %d " 514 " (implement)\n", __func__, info->cqm_rssi_thold, 515 info->cqm_rssi_hyst); 516 } 517 518 if (changed & BSS_CHANGED_IBSS) { 519 /* IBSS join status changed */ 520 wiphy_err(wiphy, "%s: IBSS joined: %s (implement)\n", __func__, 521 info->ibss_joined ? "true" : "false"); 522 } 523 524 if (changed & BSS_CHANGED_ARP_FILTER) { 525 /* Hardware ARP filter address list or state changed */ 526 wiphy_err(wiphy, "%s: arp filtering: enabled %s, count %d" 527 " (implement)\n", __func__, info->arp_filter_enabled ? 528 "true" : "false", info->arp_addr_cnt); 529 } 530 531 if (changed & BSS_CHANGED_QOS) { 532 /* 533 * QoS for this association was enabled/disabled. 534 * Note that it is only ever disabled for station mode. 535 */ 536 wiphy_err(wiphy, "%s: qos enabled: %s (implement)\n", __func__, 537 info->qos ? "true" : "false"); 538 } 539 return; 540} 541 542static void 543brcms_ops_configure_filter(struct ieee80211_hw *hw, 544 unsigned int changed_flags, 545 unsigned int *total_flags, u64 multicast) 546{ 547 struct brcms_info *wl = hw->priv; 548 struct wiphy *wiphy = hw->wiphy; 549 550 changed_flags &= MAC_FILTERS; 551 *total_flags &= MAC_FILTERS; 552 553 if (changed_flags & FIF_PROMISC_IN_BSS) 554 wiphy_dbg(wiphy, "FIF_PROMISC_IN_BSS\n"); 555 if (changed_flags & FIF_ALLMULTI) 556 wiphy_dbg(wiphy, "FIF_ALLMULTI\n"); 557 if (changed_flags & FIF_FCSFAIL) 558 wiphy_dbg(wiphy, "FIF_FCSFAIL\n"); 559 if (changed_flags & FIF_CONTROL) 560 wiphy_dbg(wiphy, "FIF_CONTROL\n"); 561 if (changed_flags & FIF_OTHER_BSS) 562 wiphy_dbg(wiphy, "FIF_OTHER_BSS\n"); 563 if (changed_flags & FIF_PSPOLL) 564 wiphy_dbg(wiphy, "FIF_PSPOLL\n"); 565 if (changed_flags & FIF_BCN_PRBRESP_PROMISC) 566 wiphy_dbg(wiphy, "FIF_BCN_PRBRESP_PROMISC\n"); 567 568 spin_lock_bh(&wl->lock); 569 brcms_c_mac_promisc(wl->wlc, *total_flags); 570 spin_unlock_bh(&wl->lock); 571 return; 572} 573 574static void brcms_ops_sw_scan_start(struct ieee80211_hw *hw) 575{ 576 struct brcms_info *wl = hw->priv; 577 spin_lock_bh(&wl->lock); 578 brcms_c_scan_start(wl->wlc); 579 spin_unlock_bh(&wl->lock); 580 return; 581} 582 583static void brcms_ops_sw_scan_complete(struct ieee80211_hw *hw) 584{ 585 struct brcms_info *wl = hw->priv; 586 spin_lock_bh(&wl->lock); 587 brcms_c_scan_stop(wl->wlc); 588 spin_unlock_bh(&wl->lock); 589 return; 590} 591 592static int 593brcms_ops_conf_tx(struct ieee80211_hw *hw, struct ieee80211_vif *vif, u16 queue, 594 const struct ieee80211_tx_queue_params *params) 595{ 596 struct brcms_info *wl = hw->priv; 597 598 spin_lock_bh(&wl->lock); 599 brcms_c_wme_setparams(wl->wlc, queue, params, true); 600 spin_unlock_bh(&wl->lock); 601 602 return 0; 603} 604 605static int 606brcms_ops_sta_add(struct ieee80211_hw *hw, struct ieee80211_vif *vif, 607 struct ieee80211_sta *sta) 608{ 609 struct brcms_info *wl = hw->priv; 610 struct scb *scb = &wl->wlc->pri_scb; 611 612 brcms_c_init_scb(scb); 613 614 wl->pub->global_ampdu = &(scb->scb_ampdu); 615 wl->pub->global_ampdu->scb = scb; 616 wl->pub->global_ampdu->max_pdu = 16; 617 618 /* 619 * minstrel_ht initiates addBA on our behalf by calling 620 * ieee80211_start_tx_ba_session() 621 */ 622 return 0; 623} 624 625static int 626brcms_ops_ampdu_action(struct ieee80211_hw *hw, 627 struct ieee80211_vif *vif, 628 enum ieee80211_ampdu_mlme_action action, 629 struct ieee80211_sta *sta, u16 tid, u16 *ssn, 630 u8 buf_size) 631{ 632 struct brcms_info *wl = hw->priv; 633 struct scb *scb = &wl->wlc->pri_scb; 634 int status; 635 636 if (WARN_ON(scb->magic != SCB_MAGIC)) 637 return -EIDRM; 638 switch (action) { 639 case IEEE80211_AMPDU_RX_START: 640 break; 641 case IEEE80211_AMPDU_RX_STOP: 642 break; 643 case IEEE80211_AMPDU_TX_START: 644 spin_lock_bh(&wl->lock); 645 status = brcms_c_aggregatable(wl->wlc, tid); 646 spin_unlock_bh(&wl->lock); 647 if (!status) { 648 wiphy_err(wl->wiphy, "START: tid %d is not agg\'able\n", 649 tid); 650 return -EINVAL; 651 } 652 ieee80211_start_tx_ba_cb_irqsafe(vif, sta->addr, tid); 653 break; 654 655 case IEEE80211_AMPDU_TX_STOP: 656 spin_lock_bh(&wl->lock); 657 brcms_c_ampdu_flush(wl->wlc, sta, tid); 658 spin_unlock_bh(&wl->lock); 659 ieee80211_stop_tx_ba_cb_irqsafe(vif, sta->addr, tid); 660 break; 661 case IEEE80211_AMPDU_TX_OPERATIONAL: 662 /* 663 * BA window size from ADDBA response ('buf_size') defines how 664 * many outstanding MPDUs are allowed for the BA stream by 665 * recipient and traffic class. 'ampdu_factor' gives maximum 666 * AMPDU size. 667 */ 668 spin_lock_bh(&wl->lock); 669 brcms_c_ampdu_tx_operational(wl->wlc, tid, buf_size, 670 (1 << (IEEE80211_HT_MAX_AMPDU_FACTOR + 671 sta->ht_cap.ampdu_factor)) - 1); 672 spin_unlock_bh(&wl->lock); 673 /* Power save wakeup */ 674 break; 675 default: 676 wiphy_err(wl->wiphy, "%s: Invalid command, ignoring\n", 677 __func__); 678 } 679 680 return 0; 681} 682 683static void brcms_ops_rfkill_poll(struct ieee80211_hw *hw) 684{ 685 struct brcms_info *wl = hw->priv; 686 bool blocked; 687 688 spin_lock_bh(&wl->lock); 689 blocked = brcms_c_check_radio_disabled(wl->wlc); 690 spin_unlock_bh(&wl->lock); 691 692 wiphy_rfkill_set_hw_state(wl->pub->ieee_hw->wiphy, blocked); 693} 694 695static void brcms_ops_flush(struct ieee80211_hw *hw, bool drop) 696{ 697 struct brcms_info *wl = hw->priv; 698 699 no_printk("%s: drop = %s\n", __func__, drop ? "true" : "false"); 700 701 /* wait for packet queue and dma fifos to run empty */ 702 spin_lock_bh(&wl->lock); 703 brcms_c_wait_for_tx_completion(wl->wlc, drop); 704 spin_unlock_bh(&wl->lock); 705} 706 707static const struct ieee80211_ops brcms_ops = { 708 .tx = brcms_ops_tx, 709 .start = brcms_ops_start, 710 .stop = brcms_ops_stop, 711 .add_interface = brcms_ops_add_interface, 712 .remove_interface = brcms_ops_remove_interface, 713 .config = brcms_ops_config, 714 .bss_info_changed = brcms_ops_bss_info_changed, 715 .configure_filter = brcms_ops_configure_filter, 716 .sw_scan_start = brcms_ops_sw_scan_start, 717 .sw_scan_complete = brcms_ops_sw_scan_complete, 718 .conf_tx = brcms_ops_conf_tx, 719 .sta_add = brcms_ops_sta_add, 720 .ampdu_action = brcms_ops_ampdu_action, 721 .rfkill_poll = brcms_ops_rfkill_poll, 722 .flush = brcms_ops_flush, 723}; 724 725/* 726 * is called in brcms_bcma_probe() context, therefore no locking required. 727 */ 728static int brcms_set_hint(struct brcms_info *wl, char *abbrev) 729{ 730 return regulatory_hint(wl->pub->ieee_hw->wiphy, abbrev); 731} 732 733void brcms_dpc(unsigned long data) 734{ 735 struct brcms_info *wl; 736 737 wl = (struct brcms_info *) data; 738 739 spin_lock_bh(&wl->lock); 740 741 /* call the common second level interrupt handler */ 742 if (wl->pub->up) { 743 if (wl->resched) { 744 unsigned long flags; 745 746 spin_lock_irqsave(&wl->isr_lock, flags); 747 brcms_c_intrsupd(wl->wlc); 748 spin_unlock_irqrestore(&wl->isr_lock, flags); 749 } 750 751 wl->resched = brcms_c_dpc(wl->wlc, true); 752 } 753 754 /* brcms_c_dpc() may bring the driver down */ 755 if (!wl->pub->up) 756 goto done; 757 758 /* re-schedule dpc */ 759 if (wl->resched) 760 tasklet_schedule(&wl->tasklet); 761 else 762 /* re-enable interrupts */ 763 brcms_intrson(wl); 764 765 done: 766 spin_unlock_bh(&wl->lock); 767} 768 769/* 770 * Precondition: Since this function is called in brcms_pci_probe() context, 771 * no locking is required. 772 */ 773static int brcms_request_fw(struct brcms_info *wl, struct pci_dev *pdev) 774{ 775 int status; 776 struct device *device = &pdev->dev; 777 char fw_name[100]; 778 int i; 779 780 memset(&wl->fw, 0, sizeof(struct brcms_firmware)); 781 for (i = 0; i < MAX_FW_IMAGES; i++) { 782 if (brcms_firmwares[i] == NULL) 783 break; 784 sprintf(fw_name, "%s-%d.fw", brcms_firmwares[i], 785 UCODE_LOADER_API_VER); 786 status = request_firmware(&wl->fw.fw_bin[i], fw_name, device); 787 if (status) { 788 wiphy_err(wl->wiphy, "%s: fail to load firmware %s\n", 789 KBUILD_MODNAME, fw_name); 790 return status; 791 } 792 sprintf(fw_name, "%s_hdr-%d.fw", brcms_firmwares[i], 793 UCODE_LOADER_API_VER); 794 status = request_firmware(&wl->fw.fw_hdr[i], fw_name, device); 795 if (status) { 796 wiphy_err(wl->wiphy, "%s: fail to load firmware %s\n", 797 KBUILD_MODNAME, fw_name); 798 return status; 799 } 800 wl->fw.hdr_num_entries[i] = 801 wl->fw.fw_hdr[i]->size / (sizeof(struct firmware_hdr)); 802 } 803 wl->fw.fw_cnt = i; 804 return brcms_ucode_data_init(wl, &wl->ucode); 805} 806 807/* 808 * Precondition: Since this function is called in brcms_pci_probe() context, 809 * no locking is required. 810 */ 811static void brcms_release_fw(struct brcms_info *wl) 812{ 813 int i; 814 for (i = 0; i < MAX_FW_IMAGES; i++) { 815 release_firmware(wl->fw.fw_bin[i]); 816 release_firmware(wl->fw.fw_hdr[i]); 817 } 818} 819 820/** 821 * This function frees the WL per-device resources. 822 * 823 * This function frees resources owned by the WL device pointed to 824 * by the wl parameter. 825 * 826 * precondition: can both be called locked and unlocked 827 * 828 */ 829static void brcms_free(struct brcms_info *wl) 830{ 831 struct brcms_timer *t, *next; 832 833 /* free ucode data */ 834 if (wl->fw.fw_cnt) 835 brcms_ucode_data_free(&wl->ucode); 836 if (wl->irq) 837 free_irq(wl->irq, wl); 838 839 /* kill dpc */ 840 tasklet_kill(&wl->tasklet); 841 842 if (wl->pub) 843 brcms_c_module_unregister(wl->pub, "linux", wl); 844 845 /* free common resources */ 846 if (wl->wlc) { 847 brcms_c_detach(wl->wlc); 848 wl->wlc = NULL; 849 wl->pub = NULL; 850 } 851 852 /* virtual interface deletion is deferred so we cannot spinwait */ 853 854 /* wait for all pending callbacks to complete */ 855 while (atomic_read(&wl->callbacks) > 0) 856 schedule(); 857 858 /* free timers */ 859 for (t = wl->timers; t; t = next) { 860 next = t->next; 861#ifdef DEBUG 862 kfree(t->name); 863#endif 864 kfree(t); 865 } 866} 867 868/* 869* called from both kernel as from this kernel module (error flow on attach) 870* precondition: perimeter lock is not acquired. 871*/ 872static void brcms_remove(struct bcma_device *pdev) 873{ 874 struct ieee80211_hw *hw = bcma_get_drvdata(pdev); 875 struct brcms_info *wl = hw->priv; 876 877 if (wl->wlc) { 878 wiphy_rfkill_set_hw_state(wl->pub->ieee_hw->wiphy, false); 879 wiphy_rfkill_stop_polling(wl->pub->ieee_hw->wiphy); 880 ieee80211_unregister_hw(hw); 881 } 882 883 brcms_free(wl); 884 885 bcma_set_drvdata(pdev, NULL); 886 ieee80211_free_hw(hw); 887} 888 889static irqreturn_t brcms_isr(int irq, void *dev_id) 890{ 891 struct brcms_info *wl; 892 bool ours, wantdpc; 893 894 wl = (struct brcms_info *) dev_id; 895 896 spin_lock(&wl->isr_lock); 897 898 /* call common first level interrupt handler */ 899 ours = brcms_c_isr(wl->wlc, &wantdpc); 900 if (ours) { 901 /* if more to do... */ 902 if (wantdpc) { 903 904 /* ...and call the second level interrupt handler */ 905 /* schedule dpc */ 906 tasklet_schedule(&wl->tasklet); 907 } 908 } 909 910 spin_unlock(&wl->isr_lock); 911 912 return IRQ_RETVAL(ours); 913} 914 915/* 916 * is called in brcms_pci_probe() context, therefore no locking required. 917 */ 918static int ieee_hw_rate_init(struct ieee80211_hw *hw) 919{ 920 struct brcms_info *wl = hw->priv; 921 struct brcms_c_info *wlc = wl->wlc; 922 struct ieee80211_supported_band *band; 923 int has_5g = 0; 924 u16 phy_type; 925 926 hw->wiphy->bands[IEEE80211_BAND_2GHZ] = NULL; 927 hw->wiphy->bands[IEEE80211_BAND_5GHZ] = NULL; 928 929 phy_type = brcms_c_get_phy_type(wl->wlc, 0); 930 if (phy_type == PHY_TYPE_N || phy_type == PHY_TYPE_LCN) { 931 band = &wlc->bandstate[BAND_2G_INDEX]->band; 932 *band = brcms_band_2GHz_nphy_template; 933 if (phy_type == PHY_TYPE_LCN) { 934 /* Single stream */ 935 band->ht_cap.mcs.rx_mask[1] = 0; 936 band->ht_cap.mcs.rx_highest = cpu_to_le16(72); 937 } 938 hw->wiphy->bands[IEEE80211_BAND_2GHZ] = band; 939 } else { 940 return -EPERM; 941 } 942 943 /* Assume all bands use the same phy. True for 11n devices. */ 944 if (wl->pub->_nbands > 1) { 945 has_5g++; 946 if (phy_type == PHY_TYPE_N || phy_type == PHY_TYPE_LCN) { 947 band = &wlc->bandstate[BAND_5G_INDEX]->band; 948 *band = brcms_band_5GHz_nphy_template; 949 hw->wiphy->bands[IEEE80211_BAND_5GHZ] = band; 950 } else { 951 return -EPERM; 952 } 953 } 954 return 0; 955} 956 957/* 958 * is called in brcms_pci_probe() context, therefore no locking required. 959 */ 960static int ieee_hw_init(struct ieee80211_hw *hw) 961{ 962 hw->flags = IEEE80211_HW_SIGNAL_DBM 963 /* | IEEE80211_HW_CONNECTION_MONITOR What is this? */ 964 | IEEE80211_HW_REPORTS_TX_ACK_STATUS 965 | IEEE80211_HW_AMPDU_AGGREGATION; 966 967 hw->extra_tx_headroom = brcms_c_get_header_len(); 968 hw->queues = N_TX_QUEUES; 969 hw->max_rates = 2; /* Primary rate and 1 fallback rate */ 970 971 /* channel change time is dependent on chip and band */ 972 hw->channel_change_time = 7 * 1000; 973 hw->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION); 974 975 hw->rate_control_algorithm = "minstrel_ht"; 976 977 hw->sta_data_size = 0; 978 return ieee_hw_rate_init(hw); 979} 980 981/** 982 * attach to the WL device. 983 * 984 * Attach to the WL device identified by vendor and device parameters. 985 * regs is a host accessible memory address pointing to WL device registers. 986 * 987 * brcms_attach is not defined as static because in the case where no bus 988 * is defined, wl_attach will never be called, and thus, gcc will issue 989 * a warning that this function is defined but not used if we declare 990 * it as static. 991 * 992 * 993 * is called in brcms_bcma_probe() context, therefore no locking required. 994 */ 995static struct brcms_info *brcms_attach(struct bcma_device *pdev) 996{ 997 struct brcms_info *wl = NULL; 998 int unit, err; 999 struct ieee80211_hw *hw; 1000 u8 perm[ETH_ALEN]; 1001 1002 unit = n_adapters_found; 1003 err = 0; 1004 1005 if (unit < 0) 1006 return NULL; 1007 1008 /* allocate private info */ 1009 hw = bcma_get_drvdata(pdev); 1010 if (hw != NULL) 1011 wl = hw->priv; 1012 if (WARN_ON(hw == NULL) || WARN_ON(wl == NULL)) 1013 return NULL; 1014 wl->wiphy = hw->wiphy; 1015 1016 atomic_set(&wl->callbacks, 0); 1017 1018 /* setup the bottom half handler */ 1019 tasklet_init(&wl->tasklet, brcms_dpc, (unsigned long) wl); 1020 1021 spin_lock_init(&wl->lock); 1022 spin_lock_init(&wl->isr_lock); 1023 1024 /* prepare ucode */ 1025 if (brcms_request_fw(wl, pdev->bus->host_pci) < 0) { 1026 wiphy_err(wl->wiphy, "%s: Failed to find firmware usually in " 1027 "%s\n", KBUILD_MODNAME, "/lib/firmware/brcm"); 1028 brcms_release_fw(wl); 1029 brcms_remove(pdev); 1030 return NULL; 1031 } 1032 1033 /* common load-time initialization */ 1034 wl->wlc = brcms_c_attach((void *)wl, pdev, unit, false, &err); 1035 brcms_release_fw(wl); 1036 if (!wl->wlc) { 1037 wiphy_err(wl->wiphy, "%s: attach() failed with code %d\n", 1038 KBUILD_MODNAME, err); 1039 goto fail; 1040 } 1041 wl->pub = brcms_c_pub(wl->wlc); 1042 1043 wl->pub->ieee_hw = hw; 1044 1045 /* register our interrupt handler */ 1046 if (request_irq(pdev->bus->host_pci->irq, brcms_isr, 1047 IRQF_SHARED, KBUILD_MODNAME, wl)) { 1048 wiphy_err(wl->wiphy, "wl%d: request_irq() failed\n", unit); 1049 goto fail; 1050 } 1051 wl->irq = pdev->bus->host_pci->irq; 1052 1053 /* register module */ 1054 brcms_c_module_register(wl->pub, "linux", wl, NULL); 1055 1056 if (ieee_hw_init(hw)) { 1057 wiphy_err(wl->wiphy, "wl%d: %s: ieee_hw_init failed!\n", unit, 1058 __func__); 1059 goto fail; 1060 } 1061 1062 memcpy(perm, &wl->pub->cur_etheraddr, ETH_ALEN); 1063 if (WARN_ON(!is_valid_ether_addr(perm))) 1064 goto fail; 1065 SET_IEEE80211_PERM_ADDR(hw, perm); 1066 1067 err = ieee80211_register_hw(hw); 1068 if (err) 1069 wiphy_err(wl->wiphy, "%s: ieee80211_register_hw failed, status" 1070 "%d\n", __func__, err); 1071 1072 if (wl->pub->srom_ccode[0]) 1073 err = brcms_set_hint(wl, wl->pub->srom_ccode); 1074 else 1075 err = brcms_set_hint(wl, "US"); 1076 if (err) 1077 wiphy_err(wl->wiphy, "%s: regulatory_hint failed, status %d\n", 1078 __func__, err); 1079 1080 n_adapters_found++; 1081 return wl; 1082 1083fail: 1084 brcms_free(wl); 1085 return NULL; 1086} 1087 1088 1089 1090/** 1091 * determines if a device is a WL device, and if so, attaches it. 1092 * 1093 * This function determines if a device pointed to by pdev is a WL device, 1094 * and if so, performs a brcms_attach() on it. 1095 * 1096 * Perimeter lock is initialized in the course of this function. 1097 */ 1098static int __devinit brcms_bcma_probe(struct bcma_device *pdev) 1099{ 1100 struct brcms_info *wl; 1101 struct ieee80211_hw *hw; 1102 1103 dev_info(&pdev->dev, "mfg %x core %x rev %d class %d irq %d\n", 1104 pdev->id.manuf, pdev->id.id, pdev->id.rev, pdev->id.class, 1105 pdev->bus->host_pci->irq); 1106 1107 if ((pdev->id.manuf != BCMA_MANUF_BCM) || 1108 (pdev->id.id != BCMA_CORE_80211)) 1109 return -ENODEV; 1110 1111 hw = ieee80211_alloc_hw(sizeof(struct brcms_info), &brcms_ops); 1112 if (!hw) { 1113 pr_err("%s: ieee80211_alloc_hw failed\n", __func__); 1114 return -ENOMEM; 1115 } 1116 1117 SET_IEEE80211_DEV(hw, &pdev->dev); 1118 1119 bcma_set_drvdata(pdev, hw); 1120 1121 memset(hw->priv, 0, sizeof(*wl)); 1122 1123 wl = brcms_attach(pdev); 1124 if (!wl) { 1125 pr_err("%s: brcms_attach failed!\n", __func__); 1126 return -ENODEV; 1127 } 1128 return 0; 1129} 1130 1131static int brcms_suspend(struct bcma_device *pdev) 1132{ 1133 struct brcms_info *wl; 1134 struct ieee80211_hw *hw; 1135 1136 hw = bcma_get_drvdata(pdev); 1137 wl = hw->priv; 1138 if (!wl) { 1139 pr_err("%s: %s: no driver private struct!\n", KBUILD_MODNAME, 1140 __func__); 1141 return -ENODEV; 1142 } 1143 1144 /* only need to flag hw is down for proper resume */ 1145 spin_lock_bh(&wl->lock); 1146 wl->pub->hw_up = false; 1147 spin_unlock_bh(&wl->lock); 1148 1149 pr_debug("brcms_suspend ok\n"); 1150 1151 return 0; 1152} 1153 1154static int brcms_resume(struct bcma_device *pdev) 1155{ 1156 pr_debug("brcms_resume ok\n"); 1157 return 0; 1158} 1159 1160static struct bcma_driver brcms_bcma_driver = { 1161 .name = KBUILD_MODNAME, 1162 .probe = brcms_bcma_probe, 1163 .suspend = brcms_suspend, 1164 .resume = brcms_resume, 1165 .remove = __devexit_p(brcms_remove), 1166 .id_table = brcms_coreid_table, 1167}; 1168 1169/** 1170 * This is the main entry point for the brcmsmac driver. 1171 * 1172 * This function is scheduled upon module initialization and 1173 * does the driver registration, which result in brcms_bcma_probe() 1174 * call resulting in the driver bringup. 1175 */ 1176static void brcms_driver_init(struct work_struct *work) 1177{ 1178 int error; 1179 1180 error = bcma_driver_register(&brcms_bcma_driver); 1181 if (error) 1182 pr_err("%s: register returned %d\n", __func__, error); 1183} 1184 1185static DECLARE_WORK(brcms_driver_work, brcms_driver_init); 1186 1187static int __init brcms_module_init(void) 1188{ 1189#ifdef DEBUG 1190 if (msglevel != 0xdeadbeef) 1191 brcm_msg_level = msglevel; 1192#endif 1193 if (!schedule_work(&brcms_driver_work)) 1194 return -EBUSY; 1195 1196 return 0; 1197} 1198 1199/** 1200 * This function unloads the brcmsmac driver from the system. 1201 * 1202 * This function unconditionally unloads the brcmsmac driver module from the 1203 * system. 1204 * 1205 */ 1206static void __exit brcms_module_exit(void) 1207{ 1208 cancel_work_sync(&brcms_driver_work); 1209 bcma_driver_unregister(&brcms_bcma_driver); 1210} 1211 1212module_init(brcms_module_init); 1213module_exit(brcms_module_exit); 1214 1215/* 1216 * precondition: perimeter lock has been acquired 1217 */ 1218void brcms_txflowcontrol(struct brcms_info *wl, struct brcms_if *wlif, 1219 bool state, int prio) 1220{ 1221 wiphy_err(wl->wiphy, "Shouldn't be here %s\n", __func__); 1222} 1223 1224/* 1225 * precondition: perimeter lock has been acquired 1226 */ 1227void brcms_init(struct brcms_info *wl) 1228{ 1229 BCMMSG(wl->pub->ieee_hw->wiphy, "wl%d\n", wl->pub->unit); 1230 brcms_reset(wl); 1231 brcms_c_init(wl->wlc, wl->mute_tx); 1232} 1233 1234/* 1235 * precondition: perimeter lock has been acquired 1236 */ 1237uint brcms_reset(struct brcms_info *wl) 1238{ 1239 BCMMSG(wl->pub->ieee_hw->wiphy, "wl%d\n", wl->pub->unit); 1240 brcms_c_reset(wl->wlc); 1241 1242 /* dpc will not be rescheduled */ 1243 wl->resched = false; 1244 1245 return 0; 1246} 1247 1248void brcms_fatal_error(struct brcms_info *wl) 1249{ 1250 wiphy_err(wl->wlc->wiphy, "wl%d: fatal error, reinitializing\n", 1251 wl->wlc->pub->unit); 1252 brcms_reset(wl); 1253 ieee80211_restart_hw(wl->pub->ieee_hw); 1254} 1255 1256/* 1257 * These are interrupt on/off entry points. Disable interrupts 1258 * during interrupt state transition. 1259 */ 1260void brcms_intrson(struct brcms_info *wl) 1261{ 1262 unsigned long flags; 1263 1264 spin_lock_irqsave(&wl->isr_lock, flags); 1265 brcms_c_intrson(wl->wlc); 1266 spin_unlock_irqrestore(&wl->isr_lock, flags); 1267} 1268 1269u32 brcms_intrsoff(struct brcms_info *wl) 1270{ 1271 unsigned long flags; 1272 u32 status; 1273 1274 spin_lock_irqsave(&wl->isr_lock, flags); 1275 status = brcms_c_intrsoff(wl->wlc); 1276 spin_unlock_irqrestore(&wl->isr_lock, flags); 1277 return status; 1278} 1279 1280void brcms_intrsrestore(struct brcms_info *wl, u32 macintmask) 1281{ 1282 unsigned long flags; 1283 1284 spin_lock_irqsave(&wl->isr_lock, flags); 1285 brcms_c_intrsrestore(wl->wlc, macintmask); 1286 spin_unlock_irqrestore(&wl->isr_lock, flags); 1287} 1288 1289/* 1290 * precondition: perimeter lock has been acquired 1291 */ 1292int brcms_up(struct brcms_info *wl) 1293{ 1294 int error = 0; 1295 1296 if (wl->pub->up) 1297 return 0; 1298 1299 error = brcms_c_up(wl->wlc); 1300 1301 return error; 1302} 1303 1304/* 1305 * precondition: perimeter lock has been acquired 1306 */ 1307void brcms_down(struct brcms_info *wl) 1308{ 1309 uint callbacks, ret_val = 0; 1310 1311 /* call common down function */ 1312 ret_val = brcms_c_down(wl->wlc); 1313 callbacks = atomic_read(&wl->callbacks) - ret_val; 1314 1315 /* wait for down callbacks to complete */ 1316 spin_unlock_bh(&wl->lock); 1317 1318 /* For HIGH_only driver, it's important to actually schedule other work, 1319 * not just spin wait since everything runs at schedule level 1320 */ 1321 SPINWAIT((atomic_read(&wl->callbacks) > callbacks), 100 * 1000); 1322 1323 spin_lock_bh(&wl->lock); 1324} 1325 1326/* 1327* precondition: perimeter lock is not acquired 1328 */ 1329static void _brcms_timer(struct work_struct *work) 1330{ 1331 struct brcms_timer *t = container_of(work, struct brcms_timer, 1332 dly_wrk.work); 1333 1334 spin_lock_bh(&t->wl->lock); 1335 1336 if (t->set) { 1337 if (t->periodic) { 1338 atomic_inc(&t->wl->callbacks); 1339 ieee80211_queue_delayed_work(t->wl->pub->ieee_hw, 1340 &t->dly_wrk, 1341 msecs_to_jiffies(t->ms)); 1342 } else { 1343 t->set = false; 1344 } 1345 1346 t->fn(t->arg); 1347 } 1348 1349 atomic_dec(&t->wl->callbacks); 1350 1351 spin_unlock_bh(&t->wl->lock); 1352} 1353 1354/* 1355 * Adds a timer to the list. Caller supplies a timer function. 1356 * Is called from wlc. 1357 * 1358 * precondition: perimeter lock has been acquired 1359 */ 1360struct brcms_timer *brcms_init_timer(struct brcms_info *wl, 1361 void (*fn) (void *arg), 1362 void *arg, const char *name) 1363{ 1364 struct brcms_timer *t; 1365 1366 t = kzalloc(sizeof(struct brcms_timer), GFP_ATOMIC); 1367 if (!t) 1368 return NULL; 1369 1370 INIT_DELAYED_WORK(&t->dly_wrk, _brcms_timer); 1371 t->wl = wl; 1372 t->fn = fn; 1373 t->arg = arg; 1374 t->next = wl->timers; 1375 wl->timers = t; 1376 1377#ifdef DEBUG 1378 t->name = kmalloc(strlen(name) + 1, GFP_ATOMIC); 1379 if (t->name) 1380 strcpy(t->name, name); 1381#endif 1382 1383 return t; 1384} 1385 1386/* 1387 * adds only the kernel timer since it's going to be more accurate 1388 * as well as it's easier to make it periodic 1389 * 1390 * precondition: perimeter lock has been acquired 1391 */ 1392void brcms_add_timer(struct brcms_timer *t, uint ms, int periodic) 1393{ 1394 struct ieee80211_hw *hw = t->wl->pub->ieee_hw; 1395 1396#ifdef DEBUG 1397 if (t->set) 1398 wiphy_err(hw->wiphy, "%s: Already set. Name: %s, per %d\n", 1399 __func__, t->name, periodic); 1400#endif 1401 t->ms = ms; 1402 t->periodic = (bool) periodic; 1403 t->set = true; 1404 1405 atomic_inc(&t->wl->callbacks); 1406 1407 ieee80211_queue_delayed_work(hw, &t->dly_wrk, msecs_to_jiffies(ms)); 1408} 1409 1410/* 1411 * return true if timer successfully deleted, false if still pending 1412 * 1413 * precondition: perimeter lock has been acquired 1414 */ 1415bool brcms_del_timer(struct brcms_timer *t) 1416{ 1417 if (t->set) { 1418 t->set = false; 1419 if (!cancel_delayed_work(&t->dly_wrk)) 1420 return false; 1421 1422 atomic_dec(&t->wl->callbacks); 1423 } 1424 1425 return true; 1426} 1427 1428/* 1429 * precondition: perimeter lock has been acquired 1430 */ 1431void brcms_free_timer(struct brcms_timer *t) 1432{ 1433 struct brcms_info *wl = t->wl; 1434 struct brcms_timer *tmp; 1435 1436 /* delete the timer in case it is active */ 1437 brcms_del_timer(t); 1438 1439 if (wl->timers == t) { 1440 wl->timers = wl->timers->next; 1441#ifdef DEBUG 1442 kfree(t->name); 1443#endif 1444 kfree(t); 1445 return; 1446 1447 } 1448 1449 tmp = wl->timers; 1450 while (tmp) { 1451 if (tmp->next == t) { 1452 tmp->next = t->next; 1453#ifdef DEBUG 1454 kfree(t->name); 1455#endif 1456 kfree(t); 1457 return; 1458 } 1459 tmp = tmp->next; 1460 } 1461 1462} 1463 1464/* 1465 * precondition: perimeter lock has been acquired 1466 */ 1467int brcms_ucode_init_buf(struct brcms_info *wl, void **pbuf, u32 idx) 1468{ 1469 int i, entry; 1470 const u8 *pdata; 1471 struct firmware_hdr *hdr; 1472 for (i = 0; i < wl->fw.fw_cnt; i++) { 1473 hdr = (struct firmware_hdr *)wl->fw.fw_hdr[i]->data; 1474 for (entry = 0; entry < wl->fw.hdr_num_entries[i]; 1475 entry++, hdr++) { 1476 u32 len = le32_to_cpu(hdr->len); 1477 if (le32_to_cpu(hdr->idx) == idx) { 1478 pdata = wl->fw.fw_bin[i]->data + 1479 le32_to_cpu(hdr->offset); 1480 *pbuf = kmemdup(pdata, len, GFP_ATOMIC); 1481 if (*pbuf == NULL) 1482 goto fail; 1483 1484 return 0; 1485 } 1486 } 1487 } 1488 wiphy_err(wl->wiphy, "ERROR: ucode buf tag:%d can not be found!\n", 1489 idx); 1490 *pbuf = NULL; 1491fail: 1492 return -ENODATA; 1493} 1494 1495/* 1496 * Precondition: Since this function is called in brcms_bcma_probe() context, 1497 * no locking is required. 1498 */ 1499int brcms_ucode_init_uint(struct brcms_info *wl, size_t *n_bytes, u32 idx) 1500{ 1501 int i, entry; 1502 const u8 *pdata; 1503 struct firmware_hdr *hdr; 1504 for (i = 0; i < wl->fw.fw_cnt; i++) { 1505 hdr = (struct firmware_hdr *)wl->fw.fw_hdr[i]->data; 1506 for (entry = 0; entry < wl->fw.hdr_num_entries[i]; 1507 entry++, hdr++) { 1508 if (le32_to_cpu(hdr->idx) == idx) { 1509 pdata = wl->fw.fw_bin[i]->data + 1510 le32_to_cpu(hdr->offset); 1511 if (le32_to_cpu(hdr->len) != 4) { 1512 wiphy_err(wl->wiphy, 1513 "ERROR: fw hdr len\n"); 1514 return -ENOMSG; 1515 } 1516 *n_bytes = le32_to_cpu(*((__le32 *) pdata)); 1517 return 0; 1518 } 1519 } 1520 } 1521 wiphy_err(wl->wiphy, "ERROR: ucode tag:%d can not be found!\n", idx); 1522 return -ENOMSG; 1523} 1524 1525/* 1526 * precondition: can both be called locked and unlocked 1527 */ 1528void brcms_ucode_free_buf(void *p) 1529{ 1530 kfree(p); 1531} 1532 1533/* 1534 * checks validity of all firmware images loaded from user space 1535 * 1536 * Precondition: Since this function is called in brcms_bcma_probe() context, 1537 * no locking is required. 1538 */ 1539int brcms_check_firmwares(struct brcms_info *wl) 1540{ 1541 int i; 1542 int entry; 1543 int rc = 0; 1544 const struct firmware *fw; 1545 const struct firmware *fw_hdr; 1546 struct firmware_hdr *ucode_hdr; 1547 for (i = 0; i < MAX_FW_IMAGES && rc == 0; i++) { 1548 fw = wl->fw.fw_bin[i]; 1549 fw_hdr = wl->fw.fw_hdr[i]; 1550 if (fw == NULL && fw_hdr == NULL) { 1551 break; 1552 } else if (fw == NULL || fw_hdr == NULL) { 1553 wiphy_err(wl->wiphy, "%s: invalid bin/hdr fw\n", 1554 __func__); 1555 rc = -EBADF; 1556 } else if (fw_hdr->size % sizeof(struct firmware_hdr)) { 1557 wiphy_err(wl->wiphy, "%s: non integral fw hdr file " 1558 "size %zu/%zu\n", __func__, fw_hdr->size, 1559 sizeof(struct firmware_hdr)); 1560 rc = -EBADF; 1561 } else if (fw->size < MIN_FW_SIZE || fw->size > MAX_FW_SIZE) { 1562 wiphy_err(wl->wiphy, "%s: out of bounds fw file size " 1563 "%zu\n", __func__, fw->size); 1564 rc = -EBADF; 1565 } else { 1566 /* check if ucode section overruns firmware image */ 1567 ucode_hdr = (struct firmware_hdr *)fw_hdr->data; 1568 for (entry = 0; entry < wl->fw.hdr_num_entries[i] && 1569 !rc; entry++, ucode_hdr++) { 1570 if (le32_to_cpu(ucode_hdr->offset) + 1571 le32_to_cpu(ucode_hdr->len) > 1572 fw->size) { 1573 wiphy_err(wl->wiphy, 1574 "%s: conflicting bin/hdr\n", 1575 __func__); 1576 rc = -EBADF; 1577 } 1578 } 1579 } 1580 } 1581 if (rc == 0 && wl->fw.fw_cnt != i) { 1582 wiphy_err(wl->wiphy, "%s: invalid fw_cnt=%d\n", __func__, 1583 wl->fw.fw_cnt); 1584 rc = -EBADF; 1585 } 1586 return rc; 1587} 1588 1589/* 1590 * precondition: perimeter lock has been acquired 1591 */ 1592bool brcms_rfkill_set_hw_state(struct brcms_info *wl) 1593{ 1594 bool blocked = brcms_c_check_radio_disabled(wl->wlc); 1595 1596 spin_unlock_bh(&wl->lock); 1597 wiphy_rfkill_set_hw_state(wl->pub->ieee_hw->wiphy, blocked); 1598 if (blocked) 1599 wiphy_rfkill_start_polling(wl->pub->ieee_hw->wiphy); 1600 spin_lock_bh(&wl->lock); 1601 return blocked; 1602} 1603 1604/* 1605 * precondition: perimeter lock has been acquired 1606 */ 1607void brcms_msleep(struct brcms_info *wl, uint ms) 1608{ 1609 spin_unlock_bh(&wl->lock); 1610 msleep(ms); 1611 spin_lock_bh(&wl->lock); 1612} 1613