Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v3.1 2659 lines 74 kB view raw
1/****************************************************************************** 2 * 3 * GPL LICENSE SUMMARY 4 * 5 * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved. 6 * 7 * This program is free software; you can redistribute it and/or modify 8 * it under the terms of version 2 of the GNU General Public License as 9 * published by the Free Software Foundation. 10 * 11 * This program is distributed in the hope that it will be useful, but 12 * WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 * General Public License for more details. 15 * 16 * You should have received a copy of the GNU General Public License 17 * along with this program; if not, write to the Free Software 18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110, 19 * USA 20 * 21 * The full GNU General Public License is included in this distribution 22 * in the file called LICENSE.GPL. 23 * 24 * Contact Information: 25 * Intel Linux Wireless <ilw@linux.intel.com> 26 * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 27 *****************************************************************************/ 28 29#include <linux/kernel.h> 30#include <linux/module.h> 31#include <linux/etherdevice.h> 32#include <linux/sched.h> 33#include <linux/slab.h> 34#include <net/mac80211.h> 35 36#include "iwl-eeprom.h" 37#include "iwl-dev.h" 38#include "iwl-debug.h" 39#include "iwl-core.h" 40#include "iwl-io.h" 41#include "iwl-power.h" 42#include "iwl-sta.h" 43#include "iwl-helpers.h" 44 45 46MODULE_DESCRIPTION("iwl-legacy: common functions for 3945 and 4965"); 47MODULE_VERSION(IWLWIFI_VERSION); 48MODULE_AUTHOR(DRV_COPYRIGHT " " DRV_AUTHOR); 49MODULE_LICENSE("GPL"); 50 51/* 52 * set bt_coex_active to true, uCode will do kill/defer 53 * every time the priority line is asserted (BT is sending signals on the 54 * priority line in the PCIx). 55 * set bt_coex_active to false, uCode will ignore the BT activity and 56 * perform the normal operation 57 * 58 * User might experience transmit issue on some platform due to WiFi/BT 59 * co-exist problem. The possible behaviors are: 60 * Able to scan and finding all the available AP 61 * Not able to associate with any AP 62 * On those platforms, WiFi communication can be restored by set 63 * "bt_coex_active" module parameter to "false" 64 * 65 * default: bt_coex_active = true (BT_COEX_ENABLE) 66 */ 67static bool bt_coex_active = true; 68module_param(bt_coex_active, bool, S_IRUGO); 69MODULE_PARM_DESC(bt_coex_active, "enable wifi/bluetooth co-exist"); 70 71u32 iwlegacy_debug_level; 72EXPORT_SYMBOL(iwlegacy_debug_level); 73 74const u8 iwlegacy_bcast_addr[ETH_ALEN] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }; 75EXPORT_SYMBOL(iwlegacy_bcast_addr); 76 77 78/* This function both allocates and initializes hw and priv. */ 79struct ieee80211_hw *iwl_legacy_alloc_all(struct iwl_cfg *cfg) 80{ 81 struct iwl_priv *priv; 82 /* mac80211 allocates memory for this device instance, including 83 * space for this driver's private structure */ 84 struct ieee80211_hw *hw; 85 86 hw = ieee80211_alloc_hw(sizeof(struct iwl_priv), 87 cfg->ops->ieee80211_ops); 88 if (hw == NULL) { 89 pr_err("%s: Can not allocate network device\n", 90 cfg->name); 91 goto out; 92 } 93 94 priv = hw->priv; 95 priv->hw = hw; 96 97out: 98 return hw; 99} 100EXPORT_SYMBOL(iwl_legacy_alloc_all); 101 102#define MAX_BIT_RATE_40_MHZ 150 /* Mbps */ 103#define MAX_BIT_RATE_20_MHZ 72 /* Mbps */ 104static void iwl_legacy_init_ht_hw_capab(const struct iwl_priv *priv, 105 struct ieee80211_sta_ht_cap *ht_info, 106 enum ieee80211_band band) 107{ 108 u16 max_bit_rate = 0; 109 u8 rx_chains_num = priv->hw_params.rx_chains_num; 110 u8 tx_chains_num = priv->hw_params.tx_chains_num; 111 112 ht_info->cap = 0; 113 memset(&ht_info->mcs, 0, sizeof(ht_info->mcs)); 114 115 ht_info->ht_supported = true; 116 117 ht_info->cap |= IEEE80211_HT_CAP_SGI_20; 118 max_bit_rate = MAX_BIT_RATE_20_MHZ; 119 if (priv->hw_params.ht40_channel & BIT(band)) { 120 ht_info->cap |= IEEE80211_HT_CAP_SUP_WIDTH_20_40; 121 ht_info->cap |= IEEE80211_HT_CAP_SGI_40; 122 ht_info->mcs.rx_mask[4] = 0x01; 123 max_bit_rate = MAX_BIT_RATE_40_MHZ; 124 } 125 126 if (priv->cfg->mod_params->amsdu_size_8K) 127 ht_info->cap |= IEEE80211_HT_CAP_MAX_AMSDU; 128 129 ht_info->ampdu_factor = CFG_HT_RX_AMPDU_FACTOR_DEF; 130 ht_info->ampdu_density = CFG_HT_MPDU_DENSITY_DEF; 131 132 ht_info->mcs.rx_mask[0] = 0xFF; 133 if (rx_chains_num >= 2) 134 ht_info->mcs.rx_mask[1] = 0xFF; 135 if (rx_chains_num >= 3) 136 ht_info->mcs.rx_mask[2] = 0xFF; 137 138 /* Highest supported Rx data rate */ 139 max_bit_rate *= rx_chains_num; 140 WARN_ON(max_bit_rate & ~IEEE80211_HT_MCS_RX_HIGHEST_MASK); 141 ht_info->mcs.rx_highest = cpu_to_le16(max_bit_rate); 142 143 /* Tx MCS capabilities */ 144 ht_info->mcs.tx_params = IEEE80211_HT_MCS_TX_DEFINED; 145 if (tx_chains_num != rx_chains_num) { 146 ht_info->mcs.tx_params |= IEEE80211_HT_MCS_TX_RX_DIFF; 147 ht_info->mcs.tx_params |= ((tx_chains_num - 1) << 148 IEEE80211_HT_MCS_TX_MAX_STREAMS_SHIFT); 149 } 150} 151 152/** 153 * iwl_legacy_init_geos - Initialize mac80211's geo/channel info based from eeprom 154 */ 155int iwl_legacy_init_geos(struct iwl_priv *priv) 156{ 157 struct iwl_channel_info *ch; 158 struct ieee80211_supported_band *sband; 159 struct ieee80211_channel *channels; 160 struct ieee80211_channel *geo_ch; 161 struct ieee80211_rate *rates; 162 int i = 0; 163 s8 max_tx_power = 0; 164 165 if (priv->bands[IEEE80211_BAND_2GHZ].n_bitrates || 166 priv->bands[IEEE80211_BAND_5GHZ].n_bitrates) { 167 IWL_DEBUG_INFO(priv, "Geography modes already initialized.\n"); 168 set_bit(STATUS_GEO_CONFIGURED, &priv->status); 169 return 0; 170 } 171 172 channels = kzalloc(sizeof(struct ieee80211_channel) * 173 priv->channel_count, GFP_KERNEL); 174 if (!channels) 175 return -ENOMEM; 176 177 rates = kzalloc((sizeof(struct ieee80211_rate) * IWL_RATE_COUNT_LEGACY), 178 GFP_KERNEL); 179 if (!rates) { 180 kfree(channels); 181 return -ENOMEM; 182 } 183 184 /* 5.2GHz channels start after the 2.4GHz channels */ 185 sband = &priv->bands[IEEE80211_BAND_5GHZ]; 186 sband->channels = &channels[ARRAY_SIZE(iwlegacy_eeprom_band_1)]; 187 /* just OFDM */ 188 sband->bitrates = &rates[IWL_FIRST_OFDM_RATE]; 189 sband->n_bitrates = IWL_RATE_COUNT_LEGACY - IWL_FIRST_OFDM_RATE; 190 191 if (priv->cfg->sku & IWL_SKU_N) 192 iwl_legacy_init_ht_hw_capab(priv, &sband->ht_cap, 193 IEEE80211_BAND_5GHZ); 194 195 sband = &priv->bands[IEEE80211_BAND_2GHZ]; 196 sband->channels = channels; 197 /* OFDM & CCK */ 198 sband->bitrates = rates; 199 sband->n_bitrates = IWL_RATE_COUNT_LEGACY; 200 201 if (priv->cfg->sku & IWL_SKU_N) 202 iwl_legacy_init_ht_hw_capab(priv, &sband->ht_cap, 203 IEEE80211_BAND_2GHZ); 204 205 priv->ieee_channels = channels; 206 priv->ieee_rates = rates; 207 208 for (i = 0; i < priv->channel_count; i++) { 209 ch = &priv->channel_info[i]; 210 211 if (!iwl_legacy_is_channel_valid(ch)) 212 continue; 213 214 sband = &priv->bands[ch->band]; 215 216 geo_ch = &sband->channels[sband->n_channels++]; 217 218 geo_ch->center_freq = 219 ieee80211_channel_to_frequency(ch->channel, ch->band); 220 geo_ch->max_power = ch->max_power_avg; 221 geo_ch->max_antenna_gain = 0xff; 222 geo_ch->hw_value = ch->channel; 223 224 if (iwl_legacy_is_channel_valid(ch)) { 225 if (!(ch->flags & EEPROM_CHANNEL_IBSS)) 226 geo_ch->flags |= IEEE80211_CHAN_NO_IBSS; 227 228 if (!(ch->flags & EEPROM_CHANNEL_ACTIVE)) 229 geo_ch->flags |= IEEE80211_CHAN_PASSIVE_SCAN; 230 231 if (ch->flags & EEPROM_CHANNEL_RADAR) 232 geo_ch->flags |= IEEE80211_CHAN_RADAR; 233 234 geo_ch->flags |= ch->ht40_extension_channel; 235 236 if (ch->max_power_avg > max_tx_power) 237 max_tx_power = ch->max_power_avg; 238 } else { 239 geo_ch->flags |= IEEE80211_CHAN_DISABLED; 240 } 241 242 IWL_DEBUG_INFO(priv, "Channel %d Freq=%d[%sGHz] %s flag=0x%X\n", 243 ch->channel, geo_ch->center_freq, 244 iwl_legacy_is_channel_a_band(ch) ? "5.2" : "2.4", 245 geo_ch->flags & IEEE80211_CHAN_DISABLED ? 246 "restricted" : "valid", 247 geo_ch->flags); 248 } 249 250 priv->tx_power_device_lmt = max_tx_power; 251 priv->tx_power_user_lmt = max_tx_power; 252 priv->tx_power_next = max_tx_power; 253 254 if ((priv->bands[IEEE80211_BAND_5GHZ].n_channels == 0) && 255 priv->cfg->sku & IWL_SKU_A) { 256 IWL_INFO(priv, "Incorrectly detected BG card as ABG. " 257 "Please send your PCI ID 0x%04X:0x%04X to maintainer.\n", 258 priv->pci_dev->device, 259 priv->pci_dev->subsystem_device); 260 priv->cfg->sku &= ~IWL_SKU_A; 261 } 262 263 IWL_INFO(priv, "Tunable channels: %d 802.11bg, %d 802.11a channels\n", 264 priv->bands[IEEE80211_BAND_2GHZ].n_channels, 265 priv->bands[IEEE80211_BAND_5GHZ].n_channels); 266 267 set_bit(STATUS_GEO_CONFIGURED, &priv->status); 268 269 return 0; 270} 271EXPORT_SYMBOL(iwl_legacy_init_geos); 272 273/* 274 * iwl_legacy_free_geos - undo allocations in iwl_legacy_init_geos 275 */ 276void iwl_legacy_free_geos(struct iwl_priv *priv) 277{ 278 kfree(priv->ieee_channels); 279 kfree(priv->ieee_rates); 280 clear_bit(STATUS_GEO_CONFIGURED, &priv->status); 281} 282EXPORT_SYMBOL(iwl_legacy_free_geos); 283 284static bool iwl_legacy_is_channel_extension(struct iwl_priv *priv, 285 enum ieee80211_band band, 286 u16 channel, u8 extension_chan_offset) 287{ 288 const struct iwl_channel_info *ch_info; 289 290 ch_info = iwl_legacy_get_channel_info(priv, band, channel); 291 if (!iwl_legacy_is_channel_valid(ch_info)) 292 return false; 293 294 if (extension_chan_offset == IEEE80211_HT_PARAM_CHA_SEC_ABOVE) 295 return !(ch_info->ht40_extension_channel & 296 IEEE80211_CHAN_NO_HT40PLUS); 297 else if (extension_chan_offset == IEEE80211_HT_PARAM_CHA_SEC_BELOW) 298 return !(ch_info->ht40_extension_channel & 299 IEEE80211_CHAN_NO_HT40MINUS); 300 301 return false; 302} 303 304bool iwl_legacy_is_ht40_tx_allowed(struct iwl_priv *priv, 305 struct iwl_rxon_context *ctx, 306 struct ieee80211_sta_ht_cap *ht_cap) 307{ 308 if (!ctx->ht.enabled || !ctx->ht.is_40mhz) 309 return false; 310 311 /* 312 * We do not check for IEEE80211_HT_CAP_SUP_WIDTH_20_40 313 * the bit will not set if it is pure 40MHz case 314 */ 315 if (ht_cap && !ht_cap->ht_supported) 316 return false; 317 318#ifdef CONFIG_IWLWIFI_LEGACY_DEBUGFS 319 if (priv->disable_ht40) 320 return false; 321#endif 322 323 return iwl_legacy_is_channel_extension(priv, priv->band, 324 le16_to_cpu(ctx->staging.channel), 325 ctx->ht.extension_chan_offset); 326} 327EXPORT_SYMBOL(iwl_legacy_is_ht40_tx_allowed); 328 329static u16 iwl_legacy_adjust_beacon_interval(u16 beacon_val, u16 max_beacon_val) 330{ 331 u16 new_val; 332 u16 beacon_factor; 333 334 /* 335 * If mac80211 hasn't given us a beacon interval, program 336 * the default into the device. 337 */ 338 if (!beacon_val) 339 return DEFAULT_BEACON_INTERVAL; 340 341 /* 342 * If the beacon interval we obtained from the peer 343 * is too large, we'll have to wake up more often 344 * (and in IBSS case, we'll beacon too much) 345 * 346 * For example, if max_beacon_val is 4096, and the 347 * requested beacon interval is 7000, we'll have to 348 * use 3500 to be able to wake up on the beacons. 349 * 350 * This could badly influence beacon detection stats. 351 */ 352 353 beacon_factor = (beacon_val + max_beacon_val) / max_beacon_val; 354 new_val = beacon_val / beacon_factor; 355 356 if (!new_val) 357 new_val = max_beacon_val; 358 359 return new_val; 360} 361 362int 363iwl_legacy_send_rxon_timing(struct iwl_priv *priv, struct iwl_rxon_context *ctx) 364{ 365 u64 tsf; 366 s32 interval_tm, rem; 367 struct ieee80211_conf *conf = NULL; 368 u16 beacon_int; 369 struct ieee80211_vif *vif = ctx->vif; 370 371 conf = iwl_legacy_ieee80211_get_hw_conf(priv->hw); 372 373 lockdep_assert_held(&priv->mutex); 374 375 memset(&ctx->timing, 0, sizeof(struct iwl_rxon_time_cmd)); 376 377 ctx->timing.timestamp = cpu_to_le64(priv->timestamp); 378 ctx->timing.listen_interval = cpu_to_le16(conf->listen_interval); 379 380 beacon_int = vif ? vif->bss_conf.beacon_int : 0; 381 382 /* 383 * TODO: For IBSS we need to get atim_window from mac80211, 384 * for now just always use 0 385 */ 386 ctx->timing.atim_window = 0; 387 388 beacon_int = iwl_legacy_adjust_beacon_interval(beacon_int, 389 priv->hw_params.max_beacon_itrvl * TIME_UNIT); 390 ctx->timing.beacon_interval = cpu_to_le16(beacon_int); 391 392 tsf = priv->timestamp; /* tsf is modifed by do_div: copy it */ 393 interval_tm = beacon_int * TIME_UNIT; 394 rem = do_div(tsf, interval_tm); 395 ctx->timing.beacon_init_val = cpu_to_le32(interval_tm - rem); 396 397 ctx->timing.dtim_period = vif ? (vif->bss_conf.dtim_period ?: 1) : 1; 398 399 IWL_DEBUG_ASSOC(priv, 400 "beacon interval %d beacon timer %d beacon tim %d\n", 401 le16_to_cpu(ctx->timing.beacon_interval), 402 le32_to_cpu(ctx->timing.beacon_init_val), 403 le16_to_cpu(ctx->timing.atim_window)); 404 405 return iwl_legacy_send_cmd_pdu(priv, ctx->rxon_timing_cmd, 406 sizeof(ctx->timing), &ctx->timing); 407} 408EXPORT_SYMBOL(iwl_legacy_send_rxon_timing); 409 410void 411iwl_legacy_set_rxon_hwcrypto(struct iwl_priv *priv, 412 struct iwl_rxon_context *ctx, 413 int hw_decrypt) 414{ 415 struct iwl_legacy_rxon_cmd *rxon = &ctx->staging; 416 417 if (hw_decrypt) 418 rxon->filter_flags &= ~RXON_FILTER_DIS_DECRYPT_MSK; 419 else 420 rxon->filter_flags |= RXON_FILTER_DIS_DECRYPT_MSK; 421 422} 423EXPORT_SYMBOL(iwl_legacy_set_rxon_hwcrypto); 424 425/* validate RXON structure is valid */ 426int 427iwl_legacy_check_rxon_cmd(struct iwl_priv *priv, struct iwl_rxon_context *ctx) 428{ 429 struct iwl_legacy_rxon_cmd *rxon = &ctx->staging; 430 bool error = false; 431 432 if (rxon->flags & RXON_FLG_BAND_24G_MSK) { 433 if (rxon->flags & RXON_FLG_TGJ_NARROW_BAND_MSK) { 434 IWL_WARN(priv, "check 2.4G: wrong narrow\n"); 435 error = true; 436 } 437 if (rxon->flags & RXON_FLG_RADAR_DETECT_MSK) { 438 IWL_WARN(priv, "check 2.4G: wrong radar\n"); 439 error = true; 440 } 441 } else { 442 if (!(rxon->flags & RXON_FLG_SHORT_SLOT_MSK)) { 443 IWL_WARN(priv, "check 5.2G: not short slot!\n"); 444 error = true; 445 } 446 if (rxon->flags & RXON_FLG_CCK_MSK) { 447 IWL_WARN(priv, "check 5.2G: CCK!\n"); 448 error = true; 449 } 450 } 451 if ((rxon->node_addr[0] | rxon->bssid_addr[0]) & 0x1) { 452 IWL_WARN(priv, "mac/bssid mcast!\n"); 453 error = true; 454 } 455 456 /* make sure basic rates 6Mbps and 1Mbps are supported */ 457 if ((rxon->ofdm_basic_rates & IWL_RATE_6M_MASK) == 0 && 458 (rxon->cck_basic_rates & IWL_RATE_1M_MASK) == 0) { 459 IWL_WARN(priv, "neither 1 nor 6 are basic\n"); 460 error = true; 461 } 462 463 if (le16_to_cpu(rxon->assoc_id) > 2007) { 464 IWL_WARN(priv, "aid > 2007\n"); 465 error = true; 466 } 467 468 if ((rxon->flags & (RXON_FLG_CCK_MSK | RXON_FLG_SHORT_SLOT_MSK)) 469 == (RXON_FLG_CCK_MSK | RXON_FLG_SHORT_SLOT_MSK)) { 470 IWL_WARN(priv, "CCK and short slot\n"); 471 error = true; 472 } 473 474 if ((rxon->flags & (RXON_FLG_CCK_MSK | RXON_FLG_AUTO_DETECT_MSK)) 475 == (RXON_FLG_CCK_MSK | RXON_FLG_AUTO_DETECT_MSK)) { 476 IWL_WARN(priv, "CCK and auto detect"); 477 error = true; 478 } 479 480 if ((rxon->flags & (RXON_FLG_AUTO_DETECT_MSK | 481 RXON_FLG_TGG_PROTECT_MSK)) == 482 RXON_FLG_TGG_PROTECT_MSK) { 483 IWL_WARN(priv, "TGg but no auto-detect\n"); 484 error = true; 485 } 486 487 if (error) 488 IWL_WARN(priv, "Tuning to channel %d\n", 489 le16_to_cpu(rxon->channel)); 490 491 if (error) { 492 IWL_ERR(priv, "Invalid RXON\n"); 493 return -EINVAL; 494 } 495 return 0; 496} 497EXPORT_SYMBOL(iwl_legacy_check_rxon_cmd); 498 499/** 500 * iwl_legacy_full_rxon_required - check if full RXON (vs RXON_ASSOC) cmd is needed 501 * @priv: staging_rxon is compared to active_rxon 502 * 503 * If the RXON structure is changing enough to require a new tune, 504 * or is clearing the RXON_FILTER_ASSOC_MSK, then return 1 to indicate that 505 * a new tune (full RXON command, rather than RXON_ASSOC cmd) is required. 506 */ 507int iwl_legacy_full_rxon_required(struct iwl_priv *priv, 508 struct iwl_rxon_context *ctx) 509{ 510 const struct iwl_legacy_rxon_cmd *staging = &ctx->staging; 511 const struct iwl_legacy_rxon_cmd *active = &ctx->active; 512 513#define CHK(cond) \ 514 if ((cond)) { \ 515 IWL_DEBUG_INFO(priv, "need full RXON - " #cond "\n"); \ 516 return 1; \ 517 } 518 519#define CHK_NEQ(c1, c2) \ 520 if ((c1) != (c2)) { \ 521 IWL_DEBUG_INFO(priv, "need full RXON - " \ 522 #c1 " != " #c2 " - %d != %d\n", \ 523 (c1), (c2)); \ 524 return 1; \ 525 } 526 527 /* These items are only settable from the full RXON command */ 528 CHK(!iwl_legacy_is_associated_ctx(ctx)); 529 CHK(compare_ether_addr(staging->bssid_addr, active->bssid_addr)); 530 CHK(compare_ether_addr(staging->node_addr, active->node_addr)); 531 CHK(compare_ether_addr(staging->wlap_bssid_addr, 532 active->wlap_bssid_addr)); 533 CHK_NEQ(staging->dev_type, active->dev_type); 534 CHK_NEQ(staging->channel, active->channel); 535 CHK_NEQ(staging->air_propagation, active->air_propagation); 536 CHK_NEQ(staging->ofdm_ht_single_stream_basic_rates, 537 active->ofdm_ht_single_stream_basic_rates); 538 CHK_NEQ(staging->ofdm_ht_dual_stream_basic_rates, 539 active->ofdm_ht_dual_stream_basic_rates); 540 CHK_NEQ(staging->assoc_id, active->assoc_id); 541 542 /* flags, filter_flags, ofdm_basic_rates, and cck_basic_rates can 543 * be updated with the RXON_ASSOC command -- however only some 544 * flag transitions are allowed using RXON_ASSOC */ 545 546 /* Check if we are not switching bands */ 547 CHK_NEQ(staging->flags & RXON_FLG_BAND_24G_MSK, 548 active->flags & RXON_FLG_BAND_24G_MSK); 549 550 /* Check if we are switching association toggle */ 551 CHK_NEQ(staging->filter_flags & RXON_FILTER_ASSOC_MSK, 552 active->filter_flags & RXON_FILTER_ASSOC_MSK); 553 554#undef CHK 555#undef CHK_NEQ 556 557 return 0; 558} 559EXPORT_SYMBOL(iwl_legacy_full_rxon_required); 560 561u8 iwl_legacy_get_lowest_plcp(struct iwl_priv *priv, 562 struct iwl_rxon_context *ctx) 563{ 564 /* 565 * Assign the lowest rate -- should really get this from 566 * the beacon skb from mac80211. 567 */ 568 if (ctx->staging.flags & RXON_FLG_BAND_24G_MSK) 569 return IWL_RATE_1M_PLCP; 570 else 571 return IWL_RATE_6M_PLCP; 572} 573EXPORT_SYMBOL(iwl_legacy_get_lowest_plcp); 574 575static void _iwl_legacy_set_rxon_ht(struct iwl_priv *priv, 576 struct iwl_ht_config *ht_conf, 577 struct iwl_rxon_context *ctx) 578{ 579 struct iwl_legacy_rxon_cmd *rxon = &ctx->staging; 580 581 if (!ctx->ht.enabled) { 582 rxon->flags &= ~(RXON_FLG_CHANNEL_MODE_MSK | 583 RXON_FLG_CTRL_CHANNEL_LOC_HI_MSK | 584 RXON_FLG_HT40_PROT_MSK | 585 RXON_FLG_HT_PROT_MSK); 586 return; 587 } 588 589 rxon->flags |= cpu_to_le32(ctx->ht.protection << 590 RXON_FLG_HT_OPERATING_MODE_POS); 591 592 /* Set up channel bandwidth: 593 * 20 MHz only, 20/40 mixed or pure 40 if ht40 ok */ 594 /* clear the HT channel mode before set the mode */ 595 rxon->flags &= ~(RXON_FLG_CHANNEL_MODE_MSK | 596 RXON_FLG_CTRL_CHANNEL_LOC_HI_MSK); 597 if (iwl_legacy_is_ht40_tx_allowed(priv, ctx, NULL)) { 598 /* pure ht40 */ 599 if (ctx->ht.protection == 600 IEEE80211_HT_OP_MODE_PROTECTION_20MHZ) { 601 rxon->flags |= RXON_FLG_CHANNEL_MODE_PURE_40; 602 /* Note: control channel is opposite of extension channel */ 603 switch (ctx->ht.extension_chan_offset) { 604 case IEEE80211_HT_PARAM_CHA_SEC_ABOVE: 605 rxon->flags &= 606 ~RXON_FLG_CTRL_CHANNEL_LOC_HI_MSK; 607 break; 608 case IEEE80211_HT_PARAM_CHA_SEC_BELOW: 609 rxon->flags |= 610 RXON_FLG_CTRL_CHANNEL_LOC_HI_MSK; 611 break; 612 } 613 } else { 614 /* Note: control channel is opposite of extension channel */ 615 switch (ctx->ht.extension_chan_offset) { 616 case IEEE80211_HT_PARAM_CHA_SEC_ABOVE: 617 rxon->flags &= 618 ~(RXON_FLG_CTRL_CHANNEL_LOC_HI_MSK); 619 rxon->flags |= RXON_FLG_CHANNEL_MODE_MIXED; 620 break; 621 case IEEE80211_HT_PARAM_CHA_SEC_BELOW: 622 rxon->flags |= 623 RXON_FLG_CTRL_CHANNEL_LOC_HI_MSK; 624 rxon->flags |= RXON_FLG_CHANNEL_MODE_MIXED; 625 break; 626 case IEEE80211_HT_PARAM_CHA_SEC_NONE: 627 default: 628 /* channel location only valid if in Mixed mode */ 629 IWL_ERR(priv, 630 "invalid extension channel offset\n"); 631 break; 632 } 633 } 634 } else { 635 rxon->flags |= RXON_FLG_CHANNEL_MODE_LEGACY; 636 } 637 638 if (priv->cfg->ops->hcmd->set_rxon_chain) 639 priv->cfg->ops->hcmd->set_rxon_chain(priv, ctx); 640 641 IWL_DEBUG_ASSOC(priv, "rxon flags 0x%X operation mode :0x%X " 642 "extension channel offset 0x%x\n", 643 le32_to_cpu(rxon->flags), ctx->ht.protection, 644 ctx->ht.extension_chan_offset); 645} 646 647void iwl_legacy_set_rxon_ht(struct iwl_priv *priv, struct iwl_ht_config *ht_conf) 648{ 649 struct iwl_rxon_context *ctx; 650 651 for_each_context(priv, ctx) 652 _iwl_legacy_set_rxon_ht(priv, ht_conf, ctx); 653} 654EXPORT_SYMBOL(iwl_legacy_set_rxon_ht); 655 656/* Return valid, unused, channel for a passive scan to reset the RF */ 657u8 iwl_legacy_get_single_channel_number(struct iwl_priv *priv, 658 enum ieee80211_band band) 659{ 660 const struct iwl_channel_info *ch_info; 661 int i; 662 u8 channel = 0; 663 u8 min, max; 664 struct iwl_rxon_context *ctx; 665 666 if (band == IEEE80211_BAND_5GHZ) { 667 min = 14; 668 max = priv->channel_count; 669 } else { 670 min = 0; 671 max = 14; 672 } 673 674 for (i = min; i < max; i++) { 675 bool busy = false; 676 677 for_each_context(priv, ctx) { 678 busy = priv->channel_info[i].channel == 679 le16_to_cpu(ctx->staging.channel); 680 if (busy) 681 break; 682 } 683 684 if (busy) 685 continue; 686 687 channel = priv->channel_info[i].channel; 688 ch_info = iwl_legacy_get_channel_info(priv, band, channel); 689 if (iwl_legacy_is_channel_valid(ch_info)) 690 break; 691 } 692 693 return channel; 694} 695EXPORT_SYMBOL(iwl_legacy_get_single_channel_number); 696 697/** 698 * iwl_legacy_set_rxon_channel - Set the band and channel values in staging RXON 699 * @ch: requested channel as a pointer to struct ieee80211_channel 700 701 * NOTE: Does not commit to the hardware; it sets appropriate bit fields 702 * in the staging RXON flag structure based on the ch->band 703 */ 704int 705iwl_legacy_set_rxon_channel(struct iwl_priv *priv, struct ieee80211_channel *ch, 706 struct iwl_rxon_context *ctx) 707{ 708 enum ieee80211_band band = ch->band; 709 u16 channel = ch->hw_value; 710 711 if ((le16_to_cpu(ctx->staging.channel) == channel) && 712 (priv->band == band)) 713 return 0; 714 715 ctx->staging.channel = cpu_to_le16(channel); 716 if (band == IEEE80211_BAND_5GHZ) 717 ctx->staging.flags &= ~RXON_FLG_BAND_24G_MSK; 718 else 719 ctx->staging.flags |= RXON_FLG_BAND_24G_MSK; 720 721 priv->band = band; 722 723 IWL_DEBUG_INFO(priv, "Staging channel set to %d [%d]\n", channel, band); 724 725 return 0; 726} 727EXPORT_SYMBOL(iwl_legacy_set_rxon_channel); 728 729void iwl_legacy_set_flags_for_band(struct iwl_priv *priv, 730 struct iwl_rxon_context *ctx, 731 enum ieee80211_band band, 732 struct ieee80211_vif *vif) 733{ 734 if (band == IEEE80211_BAND_5GHZ) { 735 ctx->staging.flags &= 736 ~(RXON_FLG_BAND_24G_MSK | RXON_FLG_AUTO_DETECT_MSK 737 | RXON_FLG_CCK_MSK); 738 ctx->staging.flags |= RXON_FLG_SHORT_SLOT_MSK; 739 } else { 740 /* Copied from iwl_post_associate() */ 741 if (vif && vif->bss_conf.use_short_slot) 742 ctx->staging.flags |= RXON_FLG_SHORT_SLOT_MSK; 743 else 744 ctx->staging.flags &= ~RXON_FLG_SHORT_SLOT_MSK; 745 746 ctx->staging.flags |= RXON_FLG_BAND_24G_MSK; 747 ctx->staging.flags |= RXON_FLG_AUTO_DETECT_MSK; 748 ctx->staging.flags &= ~RXON_FLG_CCK_MSK; 749 } 750} 751EXPORT_SYMBOL(iwl_legacy_set_flags_for_band); 752 753/* 754 * initialize rxon structure with default values from eeprom 755 */ 756void iwl_legacy_connection_init_rx_config(struct iwl_priv *priv, 757 struct iwl_rxon_context *ctx) 758{ 759 const struct iwl_channel_info *ch_info; 760 761 memset(&ctx->staging, 0, sizeof(ctx->staging)); 762 763 if (!ctx->vif) { 764 ctx->staging.dev_type = ctx->unused_devtype; 765 } else 766 switch (ctx->vif->type) { 767 768 case NL80211_IFTYPE_STATION: 769 ctx->staging.dev_type = ctx->station_devtype; 770 ctx->staging.filter_flags = RXON_FILTER_ACCEPT_GRP_MSK; 771 break; 772 773 case NL80211_IFTYPE_ADHOC: 774 ctx->staging.dev_type = ctx->ibss_devtype; 775 ctx->staging.flags = RXON_FLG_SHORT_PREAMBLE_MSK; 776 ctx->staging.filter_flags = RXON_FILTER_BCON_AWARE_MSK | 777 RXON_FILTER_ACCEPT_GRP_MSK; 778 break; 779 780 default: 781 IWL_ERR(priv, "Unsupported interface type %d\n", 782 ctx->vif->type); 783 break; 784 } 785 786#if 0 787 /* TODO: Figure out when short_preamble would be set and cache from 788 * that */ 789 if (!hw_to_local(priv->hw)->short_preamble) 790 ctx->staging.flags &= ~RXON_FLG_SHORT_PREAMBLE_MSK; 791 else 792 ctx->staging.flags |= RXON_FLG_SHORT_PREAMBLE_MSK; 793#endif 794 795 ch_info = iwl_legacy_get_channel_info(priv, priv->band, 796 le16_to_cpu(ctx->active.channel)); 797 798 if (!ch_info) 799 ch_info = &priv->channel_info[0]; 800 801 ctx->staging.channel = cpu_to_le16(ch_info->channel); 802 priv->band = ch_info->band; 803 804 iwl_legacy_set_flags_for_band(priv, ctx, priv->band, ctx->vif); 805 806 ctx->staging.ofdm_basic_rates = 807 (IWL_OFDM_RATES_MASK >> IWL_FIRST_OFDM_RATE) & 0xFF; 808 ctx->staging.cck_basic_rates = 809 (IWL_CCK_RATES_MASK >> IWL_FIRST_CCK_RATE) & 0xF; 810 811 /* clear both MIX and PURE40 mode flag */ 812 ctx->staging.flags &= ~(RXON_FLG_CHANNEL_MODE_MIXED | 813 RXON_FLG_CHANNEL_MODE_PURE_40); 814 if (ctx->vif) 815 memcpy(ctx->staging.node_addr, ctx->vif->addr, ETH_ALEN); 816 817 ctx->staging.ofdm_ht_single_stream_basic_rates = 0xff; 818 ctx->staging.ofdm_ht_dual_stream_basic_rates = 0xff; 819} 820EXPORT_SYMBOL(iwl_legacy_connection_init_rx_config); 821 822void iwl_legacy_set_rate(struct iwl_priv *priv) 823{ 824 const struct ieee80211_supported_band *hw = NULL; 825 struct ieee80211_rate *rate; 826 struct iwl_rxon_context *ctx; 827 int i; 828 829 hw = iwl_get_hw_mode(priv, priv->band); 830 if (!hw) { 831 IWL_ERR(priv, "Failed to set rate: unable to get hw mode\n"); 832 return; 833 } 834 835 priv->active_rate = 0; 836 837 for (i = 0; i < hw->n_bitrates; i++) { 838 rate = &(hw->bitrates[i]); 839 if (rate->hw_value < IWL_RATE_COUNT_LEGACY) 840 priv->active_rate |= (1 << rate->hw_value); 841 } 842 843 IWL_DEBUG_RATE(priv, "Set active_rate = %0x\n", priv->active_rate); 844 845 for_each_context(priv, ctx) { 846 ctx->staging.cck_basic_rates = 847 (IWL_CCK_BASIC_RATES_MASK >> IWL_FIRST_CCK_RATE) & 0xF; 848 849 ctx->staging.ofdm_basic_rates = 850 (IWL_OFDM_BASIC_RATES_MASK >> IWL_FIRST_OFDM_RATE) & 0xFF; 851 } 852} 853EXPORT_SYMBOL(iwl_legacy_set_rate); 854 855void iwl_legacy_chswitch_done(struct iwl_priv *priv, bool is_success) 856{ 857 struct iwl_rxon_context *ctx = &priv->contexts[IWL_RXON_CTX_BSS]; 858 859 if (test_bit(STATUS_EXIT_PENDING, &priv->status)) 860 return; 861 862 if (test_and_clear_bit(STATUS_CHANNEL_SWITCH_PENDING, &priv->status)) 863 ieee80211_chswitch_done(ctx->vif, is_success); 864} 865EXPORT_SYMBOL(iwl_legacy_chswitch_done); 866 867void iwl_legacy_rx_csa(struct iwl_priv *priv, struct iwl_rx_mem_buffer *rxb) 868{ 869 struct iwl_rx_packet *pkt = rxb_addr(rxb); 870 struct iwl_csa_notification *csa = &(pkt->u.csa_notif); 871 872 struct iwl_rxon_context *ctx = &priv->contexts[IWL_RXON_CTX_BSS]; 873 struct iwl_legacy_rxon_cmd *rxon = (void *)&ctx->active; 874 875 if (!test_bit(STATUS_CHANNEL_SWITCH_PENDING, &priv->status)) 876 return; 877 878 if (!le32_to_cpu(csa->status) && csa->channel == priv->switch_channel) { 879 rxon->channel = csa->channel; 880 ctx->staging.channel = csa->channel; 881 IWL_DEBUG_11H(priv, "CSA notif: channel %d\n", 882 le16_to_cpu(csa->channel)); 883 iwl_legacy_chswitch_done(priv, true); 884 } else { 885 IWL_ERR(priv, "CSA notif (fail) : channel %d\n", 886 le16_to_cpu(csa->channel)); 887 iwl_legacy_chswitch_done(priv, false); 888 } 889} 890EXPORT_SYMBOL(iwl_legacy_rx_csa); 891 892#ifdef CONFIG_IWLWIFI_LEGACY_DEBUG 893void iwl_legacy_print_rx_config_cmd(struct iwl_priv *priv, 894 struct iwl_rxon_context *ctx) 895{ 896 struct iwl_legacy_rxon_cmd *rxon = &ctx->staging; 897 898 IWL_DEBUG_RADIO(priv, "RX CONFIG:\n"); 899 iwl_print_hex_dump(priv, IWL_DL_RADIO, (u8 *) rxon, sizeof(*rxon)); 900 IWL_DEBUG_RADIO(priv, "u16 channel: 0x%x\n", 901 le16_to_cpu(rxon->channel)); 902 IWL_DEBUG_RADIO(priv, "u32 flags: 0x%08X\n", le32_to_cpu(rxon->flags)); 903 IWL_DEBUG_RADIO(priv, "u32 filter_flags: 0x%08x\n", 904 le32_to_cpu(rxon->filter_flags)); 905 IWL_DEBUG_RADIO(priv, "u8 dev_type: 0x%x\n", rxon->dev_type); 906 IWL_DEBUG_RADIO(priv, "u8 ofdm_basic_rates: 0x%02x\n", 907 rxon->ofdm_basic_rates); 908 IWL_DEBUG_RADIO(priv, "u8 cck_basic_rates: 0x%02x\n", 909 rxon->cck_basic_rates); 910 IWL_DEBUG_RADIO(priv, "u8[6] node_addr: %pM\n", rxon->node_addr); 911 IWL_DEBUG_RADIO(priv, "u8[6] bssid_addr: %pM\n", rxon->bssid_addr); 912 IWL_DEBUG_RADIO(priv, "u16 assoc_id: 0x%x\n", 913 le16_to_cpu(rxon->assoc_id)); 914} 915EXPORT_SYMBOL(iwl_legacy_print_rx_config_cmd); 916#endif 917/** 918 * iwl_legacy_irq_handle_error - called for HW or SW error interrupt from card 919 */ 920void iwl_legacy_irq_handle_error(struct iwl_priv *priv) 921{ 922 /* Set the FW error flag -- cleared on iwl_down */ 923 set_bit(STATUS_FW_ERROR, &priv->status); 924 925 /* Cancel currently queued command. */ 926 clear_bit(STATUS_HCMD_ACTIVE, &priv->status); 927 928 IWL_ERR(priv, "Loaded firmware version: %s\n", 929 priv->hw->wiphy->fw_version); 930 931 priv->cfg->ops->lib->dump_nic_error_log(priv); 932 if (priv->cfg->ops->lib->dump_fh) 933 priv->cfg->ops->lib->dump_fh(priv, NULL, false); 934#ifdef CONFIG_IWLWIFI_LEGACY_DEBUG 935 if (iwl_legacy_get_debug_level(priv) & IWL_DL_FW_ERRORS) 936 iwl_legacy_print_rx_config_cmd(priv, 937 &priv->contexts[IWL_RXON_CTX_BSS]); 938#endif 939 940 wake_up(&priv->wait_command_queue); 941 942 /* Keep the restart process from trying to send host 943 * commands by clearing the INIT status bit */ 944 clear_bit(STATUS_READY, &priv->status); 945 946 if (!test_bit(STATUS_EXIT_PENDING, &priv->status)) { 947 IWL_DEBUG(priv, IWL_DL_FW_ERRORS, 948 "Restarting adapter due to uCode error.\n"); 949 950 if (priv->cfg->mod_params->restart_fw) 951 queue_work(priv->workqueue, &priv->restart); 952 } 953} 954EXPORT_SYMBOL(iwl_legacy_irq_handle_error); 955 956static int iwl_legacy_apm_stop_master(struct iwl_priv *priv) 957{ 958 int ret = 0; 959 960 /* stop device's busmaster DMA activity */ 961 iwl_legacy_set_bit(priv, CSR_RESET, CSR_RESET_REG_FLAG_STOP_MASTER); 962 963 ret = iwl_poll_bit(priv, CSR_RESET, CSR_RESET_REG_FLAG_MASTER_DISABLED, 964 CSR_RESET_REG_FLAG_MASTER_DISABLED, 100); 965 if (ret) 966 IWL_WARN(priv, "Master Disable Timed Out, 100 usec\n"); 967 968 IWL_DEBUG_INFO(priv, "stop master\n"); 969 970 return ret; 971} 972 973void iwl_legacy_apm_stop(struct iwl_priv *priv) 974{ 975 IWL_DEBUG_INFO(priv, "Stop card, put in low power state\n"); 976 977 /* Stop device's DMA activity */ 978 iwl_legacy_apm_stop_master(priv); 979 980 /* Reset the entire device */ 981 iwl_legacy_set_bit(priv, CSR_RESET, CSR_RESET_REG_FLAG_SW_RESET); 982 983 udelay(10); 984 985 /* 986 * Clear "initialization complete" bit to move adapter from 987 * D0A* (powered-up Active) --> D0U* (Uninitialized) state. 988 */ 989 iwl_legacy_clear_bit(priv, CSR_GP_CNTRL, 990 CSR_GP_CNTRL_REG_FLAG_INIT_DONE); 991} 992EXPORT_SYMBOL(iwl_legacy_apm_stop); 993 994 995/* 996 * Start up NIC's basic functionality after it has been reset 997 * (e.g. after platform boot, or shutdown via iwl_legacy_apm_stop()) 998 * NOTE: This does not load uCode nor start the embedded processor 999 */ 1000int iwl_legacy_apm_init(struct iwl_priv *priv) 1001{ 1002 int ret = 0; 1003 u16 lctl; 1004 1005 IWL_DEBUG_INFO(priv, "Init card's basic functions\n"); 1006 1007 /* 1008 * Use "set_bit" below rather than "write", to preserve any hardware 1009 * bits already set by default after reset. 1010 */ 1011 1012 /* Disable L0S exit timer (platform NMI Work/Around) */ 1013 iwl_legacy_set_bit(priv, CSR_GIO_CHICKEN_BITS, 1014 CSR_GIO_CHICKEN_BITS_REG_BIT_DIS_L0S_EXIT_TIMER); 1015 1016 /* 1017 * Disable L0s without affecting L1; 1018 * don't wait for ICH L0s (ICH bug W/A) 1019 */ 1020 iwl_legacy_set_bit(priv, CSR_GIO_CHICKEN_BITS, 1021 CSR_GIO_CHICKEN_BITS_REG_BIT_L1A_NO_L0S_RX); 1022 1023 /* Set FH wait threshold to maximum (HW error during stress W/A) */ 1024 iwl_legacy_set_bit(priv, CSR_DBG_HPET_MEM_REG, 1025 CSR_DBG_HPET_MEM_REG_VAL); 1026 1027 /* 1028 * Enable HAP INTA (interrupt from management bus) to 1029 * wake device's PCI Express link L1a -> L0s 1030 * NOTE: This is no-op for 3945 (non-existent bit) 1031 */ 1032 iwl_legacy_set_bit(priv, CSR_HW_IF_CONFIG_REG, 1033 CSR_HW_IF_CONFIG_REG_BIT_HAP_WAKE_L1A); 1034 1035 /* 1036 * HW bug W/A for instability in PCIe bus L0->L0S->L1 transition. 1037 * Check if BIOS (or OS) enabled L1-ASPM on this device. 1038 * If so (likely), disable L0S, so device moves directly L0->L1; 1039 * costs negligible amount of power savings. 1040 * If not (unlikely), enable L0S, so there is at least some 1041 * power savings, even without L1. 1042 */ 1043 if (priv->cfg->base_params->set_l0s) { 1044 lctl = iwl_legacy_pcie_link_ctl(priv); 1045 if ((lctl & PCI_CFG_LINK_CTRL_VAL_L1_EN) == 1046 PCI_CFG_LINK_CTRL_VAL_L1_EN) { 1047 /* L1-ASPM enabled; disable(!) L0S */ 1048 iwl_legacy_set_bit(priv, CSR_GIO_REG, 1049 CSR_GIO_REG_VAL_L0S_ENABLED); 1050 IWL_DEBUG_POWER(priv, "L1 Enabled; Disabling L0S\n"); 1051 } else { 1052 /* L1-ASPM disabled; enable(!) L0S */ 1053 iwl_legacy_clear_bit(priv, CSR_GIO_REG, 1054 CSR_GIO_REG_VAL_L0S_ENABLED); 1055 IWL_DEBUG_POWER(priv, "L1 Disabled; Enabling L0S\n"); 1056 } 1057 } 1058 1059 /* Configure analog phase-lock-loop before activating to D0A */ 1060 if (priv->cfg->base_params->pll_cfg_val) 1061 iwl_legacy_set_bit(priv, CSR_ANA_PLL_CFG, 1062 priv->cfg->base_params->pll_cfg_val); 1063 1064 /* 1065 * Set "initialization complete" bit to move adapter from 1066 * D0U* --> D0A* (powered-up active) state. 1067 */ 1068 iwl_legacy_set_bit(priv, CSR_GP_CNTRL, CSR_GP_CNTRL_REG_FLAG_INIT_DONE); 1069 1070 /* 1071 * Wait for clock stabilization; once stabilized, access to 1072 * device-internal resources is supported, e.g. iwl_legacy_write_prph() 1073 * and accesses to uCode SRAM. 1074 */ 1075 ret = iwl_poll_bit(priv, CSR_GP_CNTRL, 1076 CSR_GP_CNTRL_REG_FLAG_MAC_CLOCK_READY, 1077 CSR_GP_CNTRL_REG_FLAG_MAC_CLOCK_READY, 25000); 1078 if (ret < 0) { 1079 IWL_DEBUG_INFO(priv, "Failed to init the card\n"); 1080 goto out; 1081 } 1082 1083 /* 1084 * Enable DMA and BSM (if used) clocks, wait for them to stabilize. 1085 * BSM (Boostrap State Machine) is only in 3945 and 4965. 1086 * 1087 * Write to "CLK_EN_REG"; "1" bits enable clocks, while "0" bits 1088 * do not disable clocks. This preserves any hardware bits already 1089 * set by default in "CLK_CTRL_REG" after reset. 1090 */ 1091 if (priv->cfg->base_params->use_bsm) 1092 iwl_legacy_write_prph(priv, APMG_CLK_EN_REG, 1093 APMG_CLK_VAL_DMA_CLK_RQT | APMG_CLK_VAL_BSM_CLK_RQT); 1094 else 1095 iwl_legacy_write_prph(priv, APMG_CLK_EN_REG, 1096 APMG_CLK_VAL_DMA_CLK_RQT); 1097 udelay(20); 1098 1099 /* Disable L1-Active */ 1100 iwl_legacy_set_bits_prph(priv, APMG_PCIDEV_STT_REG, 1101 APMG_PCIDEV_STT_VAL_L1_ACT_DIS); 1102 1103out: 1104 return ret; 1105} 1106EXPORT_SYMBOL(iwl_legacy_apm_init); 1107 1108 1109int iwl_legacy_set_tx_power(struct iwl_priv *priv, s8 tx_power, bool force) 1110{ 1111 int ret; 1112 s8 prev_tx_power; 1113 bool defer; 1114 struct iwl_rxon_context *ctx = &priv->contexts[IWL_RXON_CTX_BSS]; 1115 1116 lockdep_assert_held(&priv->mutex); 1117 1118 if (priv->tx_power_user_lmt == tx_power && !force) 1119 return 0; 1120 1121 if (!priv->cfg->ops->lib->send_tx_power) 1122 return -EOPNOTSUPP; 1123 1124 /* 0 dBm mean 1 milliwatt */ 1125 if (tx_power < 0) { 1126 IWL_WARN(priv, 1127 "Requested user TXPOWER %d below 1 mW.\n", 1128 tx_power); 1129 return -EINVAL; 1130 } 1131 1132 if (tx_power > priv->tx_power_device_lmt) { 1133 IWL_WARN(priv, 1134 "Requested user TXPOWER %d above upper limit %d.\n", 1135 tx_power, priv->tx_power_device_lmt); 1136 return -EINVAL; 1137 } 1138 1139 if (!iwl_legacy_is_ready_rf(priv)) 1140 return -EIO; 1141 1142 /* scan complete and commit_rxon use tx_power_next value, 1143 * it always need to be updated for newest request */ 1144 priv->tx_power_next = tx_power; 1145 1146 /* do not set tx power when scanning or channel changing */ 1147 defer = test_bit(STATUS_SCANNING, &priv->status) || 1148 memcmp(&ctx->active, &ctx->staging, sizeof(ctx->staging)); 1149 if (defer && !force) { 1150 IWL_DEBUG_INFO(priv, "Deferring tx power set\n"); 1151 return 0; 1152 } 1153 1154 prev_tx_power = priv->tx_power_user_lmt; 1155 priv->tx_power_user_lmt = tx_power; 1156 1157 ret = priv->cfg->ops->lib->send_tx_power(priv); 1158 1159 /* if fail to set tx_power, restore the orig. tx power */ 1160 if (ret) { 1161 priv->tx_power_user_lmt = prev_tx_power; 1162 priv->tx_power_next = prev_tx_power; 1163 } 1164 return ret; 1165} 1166EXPORT_SYMBOL(iwl_legacy_set_tx_power); 1167 1168void iwl_legacy_send_bt_config(struct iwl_priv *priv) 1169{ 1170 struct iwl_bt_cmd bt_cmd = { 1171 .lead_time = BT_LEAD_TIME_DEF, 1172 .max_kill = BT_MAX_KILL_DEF, 1173 .kill_ack_mask = 0, 1174 .kill_cts_mask = 0, 1175 }; 1176 1177 if (!bt_coex_active) 1178 bt_cmd.flags = BT_COEX_DISABLE; 1179 else 1180 bt_cmd.flags = BT_COEX_ENABLE; 1181 1182 IWL_DEBUG_INFO(priv, "BT coex %s\n", 1183 (bt_cmd.flags == BT_COEX_DISABLE) ? "disable" : "active"); 1184 1185 if (iwl_legacy_send_cmd_pdu(priv, REPLY_BT_CONFIG, 1186 sizeof(struct iwl_bt_cmd), &bt_cmd)) 1187 IWL_ERR(priv, "failed to send BT Coex Config\n"); 1188} 1189EXPORT_SYMBOL(iwl_legacy_send_bt_config); 1190 1191int iwl_legacy_send_statistics_request(struct iwl_priv *priv, u8 flags, bool clear) 1192{ 1193 struct iwl_statistics_cmd statistics_cmd = { 1194 .configuration_flags = 1195 clear ? IWL_STATS_CONF_CLEAR_STATS : 0, 1196 }; 1197 1198 if (flags & CMD_ASYNC) 1199 return iwl_legacy_send_cmd_pdu_async(priv, REPLY_STATISTICS_CMD, 1200 sizeof(struct iwl_statistics_cmd), 1201 &statistics_cmd, NULL); 1202 else 1203 return iwl_legacy_send_cmd_pdu(priv, REPLY_STATISTICS_CMD, 1204 sizeof(struct iwl_statistics_cmd), 1205 &statistics_cmd); 1206} 1207EXPORT_SYMBOL(iwl_legacy_send_statistics_request); 1208 1209void iwl_legacy_rx_pm_sleep_notif(struct iwl_priv *priv, 1210 struct iwl_rx_mem_buffer *rxb) 1211{ 1212#ifdef CONFIG_IWLWIFI_LEGACY_DEBUG 1213 struct iwl_rx_packet *pkt = rxb_addr(rxb); 1214 struct iwl_sleep_notification *sleep = &(pkt->u.sleep_notif); 1215 IWL_DEBUG_RX(priv, "sleep mode: %d, src: %d\n", 1216 sleep->pm_sleep_mode, sleep->pm_wakeup_src); 1217#endif 1218} 1219EXPORT_SYMBOL(iwl_legacy_rx_pm_sleep_notif); 1220 1221void iwl_legacy_rx_pm_debug_statistics_notif(struct iwl_priv *priv, 1222 struct iwl_rx_mem_buffer *rxb) 1223{ 1224 struct iwl_rx_packet *pkt = rxb_addr(rxb); 1225 u32 len = le32_to_cpu(pkt->len_n_flags) & FH_RSCSR_FRAME_SIZE_MSK; 1226 IWL_DEBUG_RADIO(priv, "Dumping %d bytes of unhandled " 1227 "notification for %s:\n", len, 1228 iwl_legacy_get_cmd_string(pkt->hdr.cmd)); 1229 iwl_print_hex_dump(priv, IWL_DL_RADIO, pkt->u.raw, len); 1230} 1231EXPORT_SYMBOL(iwl_legacy_rx_pm_debug_statistics_notif); 1232 1233void iwl_legacy_rx_reply_error(struct iwl_priv *priv, 1234 struct iwl_rx_mem_buffer *rxb) 1235{ 1236 struct iwl_rx_packet *pkt = rxb_addr(rxb); 1237 1238 IWL_ERR(priv, "Error Reply type 0x%08X cmd %s (0x%02X) " 1239 "seq 0x%04X ser 0x%08X\n", 1240 le32_to_cpu(pkt->u.err_resp.error_type), 1241 iwl_legacy_get_cmd_string(pkt->u.err_resp.cmd_id), 1242 pkt->u.err_resp.cmd_id, 1243 le16_to_cpu(pkt->u.err_resp.bad_cmd_seq_num), 1244 le32_to_cpu(pkt->u.err_resp.error_info)); 1245} 1246EXPORT_SYMBOL(iwl_legacy_rx_reply_error); 1247 1248void iwl_legacy_clear_isr_stats(struct iwl_priv *priv) 1249{ 1250 memset(&priv->isr_stats, 0, sizeof(priv->isr_stats)); 1251} 1252 1253int iwl_legacy_mac_conf_tx(struct ieee80211_hw *hw, u16 queue, 1254 const struct ieee80211_tx_queue_params *params) 1255{ 1256 struct iwl_priv *priv = hw->priv; 1257 struct iwl_rxon_context *ctx; 1258 unsigned long flags; 1259 int q; 1260 1261 IWL_DEBUG_MAC80211(priv, "enter\n"); 1262 1263 if (!iwl_legacy_is_ready_rf(priv)) { 1264 IWL_DEBUG_MAC80211(priv, "leave - RF not ready\n"); 1265 return -EIO; 1266 } 1267 1268 if (queue >= AC_NUM) { 1269 IWL_DEBUG_MAC80211(priv, "leave - queue >= AC_NUM %d\n", queue); 1270 return 0; 1271 } 1272 1273 q = AC_NUM - 1 - queue; 1274 1275 spin_lock_irqsave(&priv->lock, flags); 1276 1277 for_each_context(priv, ctx) { 1278 ctx->qos_data.def_qos_parm.ac[q].cw_min = 1279 cpu_to_le16(params->cw_min); 1280 ctx->qos_data.def_qos_parm.ac[q].cw_max = 1281 cpu_to_le16(params->cw_max); 1282 ctx->qos_data.def_qos_parm.ac[q].aifsn = params->aifs; 1283 ctx->qos_data.def_qos_parm.ac[q].edca_txop = 1284 cpu_to_le16((params->txop * 32)); 1285 1286 ctx->qos_data.def_qos_parm.ac[q].reserved1 = 0; 1287 } 1288 1289 spin_unlock_irqrestore(&priv->lock, flags); 1290 1291 IWL_DEBUG_MAC80211(priv, "leave\n"); 1292 return 0; 1293} 1294EXPORT_SYMBOL(iwl_legacy_mac_conf_tx); 1295 1296int iwl_legacy_mac_tx_last_beacon(struct ieee80211_hw *hw) 1297{ 1298 struct iwl_priv *priv = hw->priv; 1299 1300 return priv->ibss_manager == IWL_IBSS_MANAGER; 1301} 1302EXPORT_SYMBOL_GPL(iwl_legacy_mac_tx_last_beacon); 1303 1304static int 1305iwl_legacy_set_mode(struct iwl_priv *priv, struct iwl_rxon_context *ctx) 1306{ 1307 iwl_legacy_connection_init_rx_config(priv, ctx); 1308 1309 if (priv->cfg->ops->hcmd->set_rxon_chain) 1310 priv->cfg->ops->hcmd->set_rxon_chain(priv, ctx); 1311 1312 return iwl_legacy_commit_rxon(priv, ctx); 1313} 1314 1315static int iwl_legacy_setup_interface(struct iwl_priv *priv, 1316 struct iwl_rxon_context *ctx) 1317{ 1318 struct ieee80211_vif *vif = ctx->vif; 1319 int err; 1320 1321 lockdep_assert_held(&priv->mutex); 1322 1323 /* 1324 * This variable will be correct only when there's just 1325 * a single context, but all code using it is for hardware 1326 * that supports only one context. 1327 */ 1328 priv->iw_mode = vif->type; 1329 1330 ctx->is_active = true; 1331 1332 err = iwl_legacy_set_mode(priv, ctx); 1333 if (err) { 1334 if (!ctx->always_active) 1335 ctx->is_active = false; 1336 return err; 1337 } 1338 1339 return 0; 1340} 1341 1342int 1343iwl_legacy_mac_add_interface(struct ieee80211_hw *hw, struct ieee80211_vif *vif) 1344{ 1345 struct iwl_priv *priv = hw->priv; 1346 struct iwl_vif_priv *vif_priv = (void *)vif->drv_priv; 1347 struct iwl_rxon_context *tmp, *ctx = NULL; 1348 int err; 1349 1350 IWL_DEBUG_MAC80211(priv, "enter: type %d, addr %pM\n", 1351 vif->type, vif->addr); 1352 1353 mutex_lock(&priv->mutex); 1354 1355 if (!iwl_legacy_is_ready_rf(priv)) { 1356 IWL_WARN(priv, "Try to add interface when device not ready\n"); 1357 err = -EINVAL; 1358 goto out; 1359 } 1360 1361 for_each_context(priv, tmp) { 1362 u32 possible_modes = 1363 tmp->interface_modes | tmp->exclusive_interface_modes; 1364 1365 if (tmp->vif) { 1366 /* check if this busy context is exclusive */ 1367 if (tmp->exclusive_interface_modes & 1368 BIT(tmp->vif->type)) { 1369 err = -EINVAL; 1370 goto out; 1371 } 1372 continue; 1373 } 1374 1375 if (!(possible_modes & BIT(vif->type))) 1376 continue; 1377 1378 /* have maybe usable context w/o interface */ 1379 ctx = tmp; 1380 break; 1381 } 1382 1383 if (!ctx) { 1384 err = -EOPNOTSUPP; 1385 goto out; 1386 } 1387 1388 vif_priv->ctx = ctx; 1389 ctx->vif = vif; 1390 1391 err = iwl_legacy_setup_interface(priv, ctx); 1392 if (!err) 1393 goto out; 1394 1395 ctx->vif = NULL; 1396 priv->iw_mode = NL80211_IFTYPE_STATION; 1397 out: 1398 mutex_unlock(&priv->mutex); 1399 1400 IWL_DEBUG_MAC80211(priv, "leave\n"); 1401 return err; 1402} 1403EXPORT_SYMBOL(iwl_legacy_mac_add_interface); 1404 1405static void iwl_legacy_teardown_interface(struct iwl_priv *priv, 1406 struct ieee80211_vif *vif, 1407 bool mode_change) 1408{ 1409 struct iwl_rxon_context *ctx = iwl_legacy_rxon_ctx_from_vif(vif); 1410 1411 lockdep_assert_held(&priv->mutex); 1412 1413 if (priv->scan_vif == vif) { 1414 iwl_legacy_scan_cancel_timeout(priv, 200); 1415 iwl_legacy_force_scan_end(priv); 1416 } 1417 1418 if (!mode_change) { 1419 iwl_legacy_set_mode(priv, ctx); 1420 if (!ctx->always_active) 1421 ctx->is_active = false; 1422 } 1423} 1424 1425void iwl_legacy_mac_remove_interface(struct ieee80211_hw *hw, 1426 struct ieee80211_vif *vif) 1427{ 1428 struct iwl_priv *priv = hw->priv; 1429 struct iwl_rxon_context *ctx = iwl_legacy_rxon_ctx_from_vif(vif); 1430 1431 IWL_DEBUG_MAC80211(priv, "enter\n"); 1432 1433 mutex_lock(&priv->mutex); 1434 1435 WARN_ON(ctx->vif != vif); 1436 ctx->vif = NULL; 1437 1438 iwl_legacy_teardown_interface(priv, vif, false); 1439 1440 memset(priv->bssid, 0, ETH_ALEN); 1441 mutex_unlock(&priv->mutex); 1442 1443 IWL_DEBUG_MAC80211(priv, "leave\n"); 1444 1445} 1446EXPORT_SYMBOL(iwl_legacy_mac_remove_interface); 1447 1448int iwl_legacy_alloc_txq_mem(struct iwl_priv *priv) 1449{ 1450 if (!priv->txq) 1451 priv->txq = kzalloc( 1452 sizeof(struct iwl_tx_queue) * 1453 priv->cfg->base_params->num_of_queues, 1454 GFP_KERNEL); 1455 if (!priv->txq) { 1456 IWL_ERR(priv, "Not enough memory for txq\n"); 1457 return -ENOMEM; 1458 } 1459 return 0; 1460} 1461EXPORT_SYMBOL(iwl_legacy_alloc_txq_mem); 1462 1463void iwl_legacy_txq_mem(struct iwl_priv *priv) 1464{ 1465 kfree(priv->txq); 1466 priv->txq = NULL; 1467} 1468EXPORT_SYMBOL(iwl_legacy_txq_mem); 1469 1470#ifdef CONFIG_IWLWIFI_LEGACY_DEBUGFS 1471 1472#define IWL_TRAFFIC_DUMP_SIZE (IWL_TRAFFIC_ENTRY_SIZE * IWL_TRAFFIC_ENTRIES) 1473 1474void iwl_legacy_reset_traffic_log(struct iwl_priv *priv) 1475{ 1476 priv->tx_traffic_idx = 0; 1477 priv->rx_traffic_idx = 0; 1478 if (priv->tx_traffic) 1479 memset(priv->tx_traffic, 0, IWL_TRAFFIC_DUMP_SIZE); 1480 if (priv->rx_traffic) 1481 memset(priv->rx_traffic, 0, IWL_TRAFFIC_DUMP_SIZE); 1482} 1483 1484int iwl_legacy_alloc_traffic_mem(struct iwl_priv *priv) 1485{ 1486 u32 traffic_size = IWL_TRAFFIC_DUMP_SIZE; 1487 1488 if (iwlegacy_debug_level & IWL_DL_TX) { 1489 if (!priv->tx_traffic) { 1490 priv->tx_traffic = 1491 kzalloc(traffic_size, GFP_KERNEL); 1492 if (!priv->tx_traffic) 1493 return -ENOMEM; 1494 } 1495 } 1496 if (iwlegacy_debug_level & IWL_DL_RX) { 1497 if (!priv->rx_traffic) { 1498 priv->rx_traffic = 1499 kzalloc(traffic_size, GFP_KERNEL); 1500 if (!priv->rx_traffic) 1501 return -ENOMEM; 1502 } 1503 } 1504 iwl_legacy_reset_traffic_log(priv); 1505 return 0; 1506} 1507EXPORT_SYMBOL(iwl_legacy_alloc_traffic_mem); 1508 1509void iwl_legacy_free_traffic_mem(struct iwl_priv *priv) 1510{ 1511 kfree(priv->tx_traffic); 1512 priv->tx_traffic = NULL; 1513 1514 kfree(priv->rx_traffic); 1515 priv->rx_traffic = NULL; 1516} 1517EXPORT_SYMBOL(iwl_legacy_free_traffic_mem); 1518 1519void iwl_legacy_dbg_log_tx_data_frame(struct iwl_priv *priv, 1520 u16 length, struct ieee80211_hdr *header) 1521{ 1522 __le16 fc; 1523 u16 len; 1524 1525 if (likely(!(iwlegacy_debug_level & IWL_DL_TX))) 1526 return; 1527 1528 if (!priv->tx_traffic) 1529 return; 1530 1531 fc = header->frame_control; 1532 if (ieee80211_is_data(fc)) { 1533 len = (length > IWL_TRAFFIC_ENTRY_SIZE) 1534 ? IWL_TRAFFIC_ENTRY_SIZE : length; 1535 memcpy((priv->tx_traffic + 1536 (priv->tx_traffic_idx * IWL_TRAFFIC_ENTRY_SIZE)), 1537 header, len); 1538 priv->tx_traffic_idx = 1539 (priv->tx_traffic_idx + 1) % IWL_TRAFFIC_ENTRIES; 1540 } 1541} 1542EXPORT_SYMBOL(iwl_legacy_dbg_log_tx_data_frame); 1543 1544void iwl_legacy_dbg_log_rx_data_frame(struct iwl_priv *priv, 1545 u16 length, struct ieee80211_hdr *header) 1546{ 1547 __le16 fc; 1548 u16 len; 1549 1550 if (likely(!(iwlegacy_debug_level & IWL_DL_RX))) 1551 return; 1552 1553 if (!priv->rx_traffic) 1554 return; 1555 1556 fc = header->frame_control; 1557 if (ieee80211_is_data(fc)) { 1558 len = (length > IWL_TRAFFIC_ENTRY_SIZE) 1559 ? IWL_TRAFFIC_ENTRY_SIZE : length; 1560 memcpy((priv->rx_traffic + 1561 (priv->rx_traffic_idx * IWL_TRAFFIC_ENTRY_SIZE)), 1562 header, len); 1563 priv->rx_traffic_idx = 1564 (priv->rx_traffic_idx + 1) % IWL_TRAFFIC_ENTRIES; 1565 } 1566} 1567EXPORT_SYMBOL(iwl_legacy_dbg_log_rx_data_frame); 1568 1569const char *iwl_legacy_get_mgmt_string(int cmd) 1570{ 1571 switch (cmd) { 1572 IWL_CMD(MANAGEMENT_ASSOC_REQ); 1573 IWL_CMD(MANAGEMENT_ASSOC_RESP); 1574 IWL_CMD(MANAGEMENT_REASSOC_REQ); 1575 IWL_CMD(MANAGEMENT_REASSOC_RESP); 1576 IWL_CMD(MANAGEMENT_PROBE_REQ); 1577 IWL_CMD(MANAGEMENT_PROBE_RESP); 1578 IWL_CMD(MANAGEMENT_BEACON); 1579 IWL_CMD(MANAGEMENT_ATIM); 1580 IWL_CMD(MANAGEMENT_DISASSOC); 1581 IWL_CMD(MANAGEMENT_AUTH); 1582 IWL_CMD(MANAGEMENT_DEAUTH); 1583 IWL_CMD(MANAGEMENT_ACTION); 1584 default: 1585 return "UNKNOWN"; 1586 1587 } 1588} 1589 1590const char *iwl_legacy_get_ctrl_string(int cmd) 1591{ 1592 switch (cmd) { 1593 IWL_CMD(CONTROL_BACK_REQ); 1594 IWL_CMD(CONTROL_BACK); 1595 IWL_CMD(CONTROL_PSPOLL); 1596 IWL_CMD(CONTROL_RTS); 1597 IWL_CMD(CONTROL_CTS); 1598 IWL_CMD(CONTROL_ACK); 1599 IWL_CMD(CONTROL_CFEND); 1600 IWL_CMD(CONTROL_CFENDACK); 1601 default: 1602 return "UNKNOWN"; 1603 1604 } 1605} 1606 1607void iwl_legacy_clear_traffic_stats(struct iwl_priv *priv) 1608{ 1609 memset(&priv->tx_stats, 0, sizeof(struct traffic_stats)); 1610 memset(&priv->rx_stats, 0, sizeof(struct traffic_stats)); 1611} 1612 1613/* 1614 * if CONFIG_IWLWIFI_LEGACY_DEBUGFS defined, 1615 * iwl_legacy_update_stats function will 1616 * record all the MGMT, CTRL and DATA pkt for both TX and Rx pass 1617 * Use debugFs to display the rx/rx_statistics 1618 * if CONFIG_IWLWIFI_LEGACY_DEBUGFS not being defined, then no MGMT and CTRL 1619 * information will be recorded, but DATA pkt still will be recorded 1620 * for the reason of iwl_led.c need to control the led blinking based on 1621 * number of tx and rx data. 1622 * 1623 */ 1624void 1625iwl_legacy_update_stats(struct iwl_priv *priv, bool is_tx, __le16 fc, u16 len) 1626{ 1627 struct traffic_stats *stats; 1628 1629 if (is_tx) 1630 stats = &priv->tx_stats; 1631 else 1632 stats = &priv->rx_stats; 1633 1634 if (ieee80211_is_mgmt(fc)) { 1635 switch (fc & cpu_to_le16(IEEE80211_FCTL_STYPE)) { 1636 case cpu_to_le16(IEEE80211_STYPE_ASSOC_REQ): 1637 stats->mgmt[MANAGEMENT_ASSOC_REQ]++; 1638 break; 1639 case cpu_to_le16(IEEE80211_STYPE_ASSOC_RESP): 1640 stats->mgmt[MANAGEMENT_ASSOC_RESP]++; 1641 break; 1642 case cpu_to_le16(IEEE80211_STYPE_REASSOC_REQ): 1643 stats->mgmt[MANAGEMENT_REASSOC_REQ]++; 1644 break; 1645 case cpu_to_le16(IEEE80211_STYPE_REASSOC_RESP): 1646 stats->mgmt[MANAGEMENT_REASSOC_RESP]++; 1647 break; 1648 case cpu_to_le16(IEEE80211_STYPE_PROBE_REQ): 1649 stats->mgmt[MANAGEMENT_PROBE_REQ]++; 1650 break; 1651 case cpu_to_le16(IEEE80211_STYPE_PROBE_RESP): 1652 stats->mgmt[MANAGEMENT_PROBE_RESP]++; 1653 break; 1654 case cpu_to_le16(IEEE80211_STYPE_BEACON): 1655 stats->mgmt[MANAGEMENT_BEACON]++; 1656 break; 1657 case cpu_to_le16(IEEE80211_STYPE_ATIM): 1658 stats->mgmt[MANAGEMENT_ATIM]++; 1659 break; 1660 case cpu_to_le16(IEEE80211_STYPE_DISASSOC): 1661 stats->mgmt[MANAGEMENT_DISASSOC]++; 1662 break; 1663 case cpu_to_le16(IEEE80211_STYPE_AUTH): 1664 stats->mgmt[MANAGEMENT_AUTH]++; 1665 break; 1666 case cpu_to_le16(IEEE80211_STYPE_DEAUTH): 1667 stats->mgmt[MANAGEMENT_DEAUTH]++; 1668 break; 1669 case cpu_to_le16(IEEE80211_STYPE_ACTION): 1670 stats->mgmt[MANAGEMENT_ACTION]++; 1671 break; 1672 } 1673 } else if (ieee80211_is_ctl(fc)) { 1674 switch (fc & cpu_to_le16(IEEE80211_FCTL_STYPE)) { 1675 case cpu_to_le16(IEEE80211_STYPE_BACK_REQ): 1676 stats->ctrl[CONTROL_BACK_REQ]++; 1677 break; 1678 case cpu_to_le16(IEEE80211_STYPE_BACK): 1679 stats->ctrl[CONTROL_BACK]++; 1680 break; 1681 case cpu_to_le16(IEEE80211_STYPE_PSPOLL): 1682 stats->ctrl[CONTROL_PSPOLL]++; 1683 break; 1684 case cpu_to_le16(IEEE80211_STYPE_RTS): 1685 stats->ctrl[CONTROL_RTS]++; 1686 break; 1687 case cpu_to_le16(IEEE80211_STYPE_CTS): 1688 stats->ctrl[CONTROL_CTS]++; 1689 break; 1690 case cpu_to_le16(IEEE80211_STYPE_ACK): 1691 stats->ctrl[CONTROL_ACK]++; 1692 break; 1693 case cpu_to_le16(IEEE80211_STYPE_CFEND): 1694 stats->ctrl[CONTROL_CFEND]++; 1695 break; 1696 case cpu_to_le16(IEEE80211_STYPE_CFENDACK): 1697 stats->ctrl[CONTROL_CFENDACK]++; 1698 break; 1699 } 1700 } else { 1701 /* data */ 1702 stats->data_cnt++; 1703 stats->data_bytes += len; 1704 } 1705} 1706EXPORT_SYMBOL(iwl_legacy_update_stats); 1707#endif 1708 1709int iwl_legacy_force_reset(struct iwl_priv *priv, bool external) 1710{ 1711 struct iwl_force_reset *force_reset; 1712 1713 if (test_bit(STATUS_EXIT_PENDING, &priv->status)) 1714 return -EINVAL; 1715 1716 force_reset = &priv->force_reset; 1717 force_reset->reset_request_count++; 1718 if (!external) { 1719 if (force_reset->last_force_reset_jiffies && 1720 time_after(force_reset->last_force_reset_jiffies + 1721 force_reset->reset_duration, jiffies)) { 1722 IWL_DEBUG_INFO(priv, "force reset rejected\n"); 1723 force_reset->reset_reject_count++; 1724 return -EAGAIN; 1725 } 1726 } 1727 force_reset->reset_success_count++; 1728 force_reset->last_force_reset_jiffies = jiffies; 1729 1730 /* 1731 * if the request is from external(ex: debugfs), 1732 * then always perform the request in regardless the module 1733 * parameter setting 1734 * if the request is from internal (uCode error or driver 1735 * detect failure), then fw_restart module parameter 1736 * need to be check before performing firmware reload 1737 */ 1738 1739 if (!external && !priv->cfg->mod_params->restart_fw) { 1740 IWL_DEBUG_INFO(priv, "Cancel firmware reload based on " 1741 "module parameter setting\n"); 1742 return 0; 1743 } 1744 1745 IWL_ERR(priv, "On demand firmware reload\n"); 1746 1747 /* Set the FW error flag -- cleared on iwl_down */ 1748 set_bit(STATUS_FW_ERROR, &priv->status); 1749 wake_up(&priv->wait_command_queue); 1750 /* 1751 * Keep the restart process from trying to send host 1752 * commands by clearing the INIT status bit 1753 */ 1754 clear_bit(STATUS_READY, &priv->status); 1755 queue_work(priv->workqueue, &priv->restart); 1756 1757 return 0; 1758} 1759 1760int 1761iwl_legacy_mac_change_interface(struct ieee80211_hw *hw, 1762 struct ieee80211_vif *vif, 1763 enum nl80211_iftype newtype, bool newp2p) 1764{ 1765 struct iwl_priv *priv = hw->priv; 1766 struct iwl_rxon_context *ctx = iwl_legacy_rxon_ctx_from_vif(vif); 1767 struct iwl_rxon_context *tmp; 1768 u32 interface_modes; 1769 int err; 1770 1771 newtype = ieee80211_iftype_p2p(newtype, newp2p); 1772 1773 mutex_lock(&priv->mutex); 1774 1775 if (!ctx->vif || !iwl_legacy_is_ready_rf(priv)) { 1776 /* 1777 * Huh? But wait ... this can maybe happen when 1778 * we're in the middle of a firmware restart! 1779 */ 1780 err = -EBUSY; 1781 goto out; 1782 } 1783 1784 interface_modes = ctx->interface_modes | ctx->exclusive_interface_modes; 1785 1786 if (!(interface_modes & BIT(newtype))) { 1787 err = -EBUSY; 1788 goto out; 1789 } 1790 1791 if (ctx->exclusive_interface_modes & BIT(newtype)) { 1792 for_each_context(priv, tmp) { 1793 if (ctx == tmp) 1794 continue; 1795 1796 if (!tmp->vif) 1797 continue; 1798 1799 /* 1800 * The current mode switch would be exclusive, but 1801 * another context is active ... refuse the switch. 1802 */ 1803 err = -EBUSY; 1804 goto out; 1805 } 1806 } 1807 1808 /* success */ 1809 iwl_legacy_teardown_interface(priv, vif, true); 1810 vif->type = newtype; 1811 vif->p2p = newp2p; 1812 err = iwl_legacy_setup_interface(priv, ctx); 1813 WARN_ON(err); 1814 /* 1815 * We've switched internally, but submitting to the 1816 * device may have failed for some reason. Mask this 1817 * error, because otherwise mac80211 will not switch 1818 * (and set the interface type back) and we'll be 1819 * out of sync with it. 1820 */ 1821 err = 0; 1822 1823 out: 1824 mutex_unlock(&priv->mutex); 1825 return err; 1826} 1827EXPORT_SYMBOL(iwl_legacy_mac_change_interface); 1828 1829/* 1830 * On every watchdog tick we check (latest) time stamp. If it does not 1831 * change during timeout period and queue is not empty we reset firmware. 1832 */ 1833static int iwl_legacy_check_stuck_queue(struct iwl_priv *priv, int cnt) 1834{ 1835 struct iwl_tx_queue *txq = &priv->txq[cnt]; 1836 struct iwl_queue *q = &txq->q; 1837 unsigned long timeout; 1838 int ret; 1839 1840 if (q->read_ptr == q->write_ptr) { 1841 txq->time_stamp = jiffies; 1842 return 0; 1843 } 1844 1845 timeout = txq->time_stamp + 1846 msecs_to_jiffies(priv->cfg->base_params->wd_timeout); 1847 1848 if (time_after(jiffies, timeout)) { 1849 IWL_ERR(priv, "Queue %d stuck for %u ms.\n", 1850 q->id, priv->cfg->base_params->wd_timeout); 1851 ret = iwl_legacy_force_reset(priv, false); 1852 return (ret == -EAGAIN) ? 0 : 1; 1853 } 1854 1855 return 0; 1856} 1857 1858/* 1859 * Making watchdog tick be a quarter of timeout assure we will 1860 * discover the queue hung between timeout and 1.25*timeout 1861 */ 1862#define IWL_WD_TICK(timeout) ((timeout) / 4) 1863 1864/* 1865 * Watchdog timer callback, we check each tx queue for stuck, if if hung 1866 * we reset the firmware. If everything is fine just rearm the timer. 1867 */ 1868void iwl_legacy_bg_watchdog(unsigned long data) 1869{ 1870 struct iwl_priv *priv = (struct iwl_priv *)data; 1871 int cnt; 1872 unsigned long timeout; 1873 1874 if (test_bit(STATUS_EXIT_PENDING, &priv->status)) 1875 return; 1876 1877 timeout = priv->cfg->base_params->wd_timeout; 1878 if (timeout == 0) 1879 return; 1880 1881 /* monitor and check for stuck cmd queue */ 1882 if (iwl_legacy_check_stuck_queue(priv, priv->cmd_queue)) 1883 return; 1884 1885 /* monitor and check for other stuck queues */ 1886 if (iwl_legacy_is_any_associated(priv)) { 1887 for (cnt = 0; cnt < priv->hw_params.max_txq_num; cnt++) { 1888 /* skip as we already checked the command queue */ 1889 if (cnt == priv->cmd_queue) 1890 continue; 1891 if (iwl_legacy_check_stuck_queue(priv, cnt)) 1892 return; 1893 } 1894 } 1895 1896 mod_timer(&priv->watchdog, jiffies + 1897 msecs_to_jiffies(IWL_WD_TICK(timeout))); 1898} 1899EXPORT_SYMBOL(iwl_legacy_bg_watchdog); 1900 1901void iwl_legacy_setup_watchdog(struct iwl_priv *priv) 1902{ 1903 unsigned int timeout = priv->cfg->base_params->wd_timeout; 1904 1905 if (timeout) 1906 mod_timer(&priv->watchdog, 1907 jiffies + msecs_to_jiffies(IWL_WD_TICK(timeout))); 1908 else 1909 del_timer(&priv->watchdog); 1910} 1911EXPORT_SYMBOL(iwl_legacy_setup_watchdog); 1912 1913/* 1914 * extended beacon time format 1915 * time in usec will be changed into a 32-bit value in extended:internal format 1916 * the extended part is the beacon counts 1917 * the internal part is the time in usec within one beacon interval 1918 */ 1919u32 1920iwl_legacy_usecs_to_beacons(struct iwl_priv *priv, 1921 u32 usec, u32 beacon_interval) 1922{ 1923 u32 quot; 1924 u32 rem; 1925 u32 interval = beacon_interval * TIME_UNIT; 1926 1927 if (!interval || !usec) 1928 return 0; 1929 1930 quot = (usec / interval) & 1931 (iwl_legacy_beacon_time_mask_high(priv, 1932 priv->hw_params.beacon_time_tsf_bits) >> 1933 priv->hw_params.beacon_time_tsf_bits); 1934 rem = (usec % interval) & iwl_legacy_beacon_time_mask_low(priv, 1935 priv->hw_params.beacon_time_tsf_bits); 1936 1937 return (quot << priv->hw_params.beacon_time_tsf_bits) + rem; 1938} 1939EXPORT_SYMBOL(iwl_legacy_usecs_to_beacons); 1940 1941/* base is usually what we get from ucode with each received frame, 1942 * the same as HW timer counter counting down 1943 */ 1944__le32 iwl_legacy_add_beacon_time(struct iwl_priv *priv, u32 base, 1945 u32 addon, u32 beacon_interval) 1946{ 1947 u32 base_low = base & iwl_legacy_beacon_time_mask_low(priv, 1948 priv->hw_params.beacon_time_tsf_bits); 1949 u32 addon_low = addon & iwl_legacy_beacon_time_mask_low(priv, 1950 priv->hw_params.beacon_time_tsf_bits); 1951 u32 interval = beacon_interval * TIME_UNIT; 1952 u32 res = (base & iwl_legacy_beacon_time_mask_high(priv, 1953 priv->hw_params.beacon_time_tsf_bits)) + 1954 (addon & iwl_legacy_beacon_time_mask_high(priv, 1955 priv->hw_params.beacon_time_tsf_bits)); 1956 1957 if (base_low > addon_low) 1958 res += base_low - addon_low; 1959 else if (base_low < addon_low) { 1960 res += interval + base_low - addon_low; 1961 res += (1 << priv->hw_params.beacon_time_tsf_bits); 1962 } else 1963 res += (1 << priv->hw_params.beacon_time_tsf_bits); 1964 1965 return cpu_to_le32(res); 1966} 1967EXPORT_SYMBOL(iwl_legacy_add_beacon_time); 1968 1969#ifdef CONFIG_PM 1970 1971int iwl_legacy_pci_suspend(struct device *device) 1972{ 1973 struct pci_dev *pdev = to_pci_dev(device); 1974 struct iwl_priv *priv = pci_get_drvdata(pdev); 1975 1976 /* 1977 * This function is called when system goes into suspend state 1978 * mac80211 will call iwl_mac_stop() from the mac80211 suspend function 1979 * first but since iwl_mac_stop() has no knowledge of who the caller is, 1980 * it will not call apm_ops.stop() to stop the DMA operation. 1981 * Calling apm_ops.stop here to make sure we stop the DMA. 1982 */ 1983 iwl_legacy_apm_stop(priv); 1984 1985 return 0; 1986} 1987EXPORT_SYMBOL(iwl_legacy_pci_suspend); 1988 1989int iwl_legacy_pci_resume(struct device *device) 1990{ 1991 struct pci_dev *pdev = to_pci_dev(device); 1992 struct iwl_priv *priv = pci_get_drvdata(pdev); 1993 bool hw_rfkill = false; 1994 1995 /* 1996 * We disable the RETRY_TIMEOUT register (0x41) to keep 1997 * PCI Tx retries from interfering with C3 CPU state. 1998 */ 1999 pci_write_config_byte(pdev, PCI_CFG_RETRY_TIMEOUT, 0x00); 2000 2001 iwl_legacy_enable_interrupts(priv); 2002 2003 if (!(iwl_read32(priv, CSR_GP_CNTRL) & 2004 CSR_GP_CNTRL_REG_FLAG_HW_RF_KILL_SW)) 2005 hw_rfkill = true; 2006 2007 if (hw_rfkill) 2008 set_bit(STATUS_RF_KILL_HW, &priv->status); 2009 else 2010 clear_bit(STATUS_RF_KILL_HW, &priv->status); 2011 2012 wiphy_rfkill_set_hw_state(priv->hw->wiphy, hw_rfkill); 2013 2014 return 0; 2015} 2016EXPORT_SYMBOL(iwl_legacy_pci_resume); 2017 2018const struct dev_pm_ops iwl_legacy_pm_ops = { 2019 .suspend = iwl_legacy_pci_suspend, 2020 .resume = iwl_legacy_pci_resume, 2021 .freeze = iwl_legacy_pci_suspend, 2022 .thaw = iwl_legacy_pci_resume, 2023 .poweroff = iwl_legacy_pci_suspend, 2024 .restore = iwl_legacy_pci_resume, 2025}; 2026EXPORT_SYMBOL(iwl_legacy_pm_ops); 2027 2028#endif /* CONFIG_PM */ 2029 2030static void 2031iwl_legacy_update_qos(struct iwl_priv *priv, struct iwl_rxon_context *ctx) 2032{ 2033 if (test_bit(STATUS_EXIT_PENDING, &priv->status)) 2034 return; 2035 2036 if (!ctx->is_active) 2037 return; 2038 2039 ctx->qos_data.def_qos_parm.qos_flags = 0; 2040 2041 if (ctx->qos_data.qos_active) 2042 ctx->qos_data.def_qos_parm.qos_flags |= 2043 QOS_PARAM_FLG_UPDATE_EDCA_MSK; 2044 2045 if (ctx->ht.enabled) 2046 ctx->qos_data.def_qos_parm.qos_flags |= QOS_PARAM_FLG_TGN_MSK; 2047 2048 IWL_DEBUG_QOS(priv, "send QoS cmd with Qos active=%d FLAGS=0x%X\n", 2049 ctx->qos_data.qos_active, 2050 ctx->qos_data.def_qos_parm.qos_flags); 2051 2052 iwl_legacy_send_cmd_pdu_async(priv, ctx->qos_cmd, 2053 sizeof(struct iwl_qosparam_cmd), 2054 &ctx->qos_data.def_qos_parm, NULL); 2055} 2056 2057/** 2058 * iwl_legacy_mac_config - mac80211 config callback 2059 */ 2060int iwl_legacy_mac_config(struct ieee80211_hw *hw, u32 changed) 2061{ 2062 struct iwl_priv *priv = hw->priv; 2063 const struct iwl_channel_info *ch_info; 2064 struct ieee80211_conf *conf = &hw->conf; 2065 struct ieee80211_channel *channel = conf->channel; 2066 struct iwl_ht_config *ht_conf = &priv->current_ht_config; 2067 struct iwl_rxon_context *ctx; 2068 unsigned long flags = 0; 2069 int ret = 0; 2070 u16 ch; 2071 int scan_active = 0; 2072 bool ht_changed[NUM_IWL_RXON_CTX] = {}; 2073 2074 if (WARN_ON(!priv->cfg->ops->legacy)) 2075 return -EOPNOTSUPP; 2076 2077 mutex_lock(&priv->mutex); 2078 2079 IWL_DEBUG_MAC80211(priv, "enter to channel %d changed 0x%X\n", 2080 channel->hw_value, changed); 2081 2082 if (unlikely(test_bit(STATUS_SCANNING, &priv->status))) { 2083 scan_active = 1; 2084 IWL_DEBUG_MAC80211(priv, "scan active\n"); 2085 } 2086 2087 if (changed & (IEEE80211_CONF_CHANGE_SMPS | 2088 IEEE80211_CONF_CHANGE_CHANNEL)) { 2089 /* mac80211 uses static for non-HT which is what we want */ 2090 priv->current_ht_config.smps = conf->smps_mode; 2091 2092 /* 2093 * Recalculate chain counts. 2094 * 2095 * If monitor mode is enabled then mac80211 will 2096 * set up the SM PS mode to OFF if an HT channel is 2097 * configured. 2098 */ 2099 if (priv->cfg->ops->hcmd->set_rxon_chain) 2100 for_each_context(priv, ctx) 2101 priv->cfg->ops->hcmd->set_rxon_chain(priv, ctx); 2102 } 2103 2104 /* during scanning mac80211 will delay channel setting until 2105 * scan finish with changed = 0 2106 */ 2107 if (!changed || (changed & IEEE80211_CONF_CHANGE_CHANNEL)) { 2108 if (scan_active) 2109 goto set_ch_out; 2110 2111 ch = channel->hw_value; 2112 ch_info = iwl_legacy_get_channel_info(priv, channel->band, ch); 2113 if (!iwl_legacy_is_channel_valid(ch_info)) { 2114 IWL_DEBUG_MAC80211(priv, "leave - invalid channel\n"); 2115 ret = -EINVAL; 2116 goto set_ch_out; 2117 } 2118 2119 if (priv->iw_mode == NL80211_IFTYPE_ADHOC && 2120 !iwl_legacy_is_channel_ibss(ch_info)) { 2121 IWL_DEBUG_MAC80211(priv, "leave - not IBSS channel\n"); 2122 ret = -EINVAL; 2123 goto set_ch_out; 2124 } 2125 2126 spin_lock_irqsave(&priv->lock, flags); 2127 2128 for_each_context(priv, ctx) { 2129 /* Configure HT40 channels */ 2130 if (ctx->ht.enabled != conf_is_ht(conf)) { 2131 ctx->ht.enabled = conf_is_ht(conf); 2132 ht_changed[ctx->ctxid] = true; 2133 } 2134 if (ctx->ht.enabled) { 2135 if (conf_is_ht40_minus(conf)) { 2136 ctx->ht.extension_chan_offset = 2137 IEEE80211_HT_PARAM_CHA_SEC_BELOW; 2138 ctx->ht.is_40mhz = true; 2139 } else if (conf_is_ht40_plus(conf)) { 2140 ctx->ht.extension_chan_offset = 2141 IEEE80211_HT_PARAM_CHA_SEC_ABOVE; 2142 ctx->ht.is_40mhz = true; 2143 } else { 2144 ctx->ht.extension_chan_offset = 2145 IEEE80211_HT_PARAM_CHA_SEC_NONE; 2146 ctx->ht.is_40mhz = false; 2147 } 2148 } else 2149 ctx->ht.is_40mhz = false; 2150 2151 /* 2152 * Default to no protection. Protection mode will 2153 * later be set from BSS config in iwl_ht_conf 2154 */ 2155 ctx->ht.protection = 2156 IEEE80211_HT_OP_MODE_PROTECTION_NONE; 2157 2158 /* if we are switching from ht to 2.4 clear flags 2159 * from any ht related info since 2.4 does not 2160 * support ht */ 2161 if ((le16_to_cpu(ctx->staging.channel) != ch)) 2162 ctx->staging.flags = 0; 2163 2164 iwl_legacy_set_rxon_channel(priv, channel, ctx); 2165 iwl_legacy_set_rxon_ht(priv, ht_conf); 2166 2167 iwl_legacy_set_flags_for_band(priv, ctx, channel->band, 2168 ctx->vif); 2169 } 2170 2171 spin_unlock_irqrestore(&priv->lock, flags); 2172 2173 if (priv->cfg->ops->legacy->update_bcast_stations) 2174 ret = 2175 priv->cfg->ops->legacy->update_bcast_stations(priv); 2176 2177 set_ch_out: 2178 /* The list of supported rates and rate mask can be different 2179 * for each band; since the band may have changed, reset 2180 * the rate mask to what mac80211 lists */ 2181 iwl_legacy_set_rate(priv); 2182 } 2183 2184 if (changed & (IEEE80211_CONF_CHANGE_PS | 2185 IEEE80211_CONF_CHANGE_IDLE)) { 2186 ret = iwl_legacy_power_update_mode(priv, false); 2187 if (ret) 2188 IWL_DEBUG_MAC80211(priv, "Error setting sleep level\n"); 2189 } 2190 2191 if (changed & IEEE80211_CONF_CHANGE_POWER) { 2192 IWL_DEBUG_MAC80211(priv, "TX Power old=%d new=%d\n", 2193 priv->tx_power_user_lmt, conf->power_level); 2194 2195 iwl_legacy_set_tx_power(priv, conf->power_level, false); 2196 } 2197 2198 if (!iwl_legacy_is_ready(priv)) { 2199 IWL_DEBUG_MAC80211(priv, "leave - not ready\n"); 2200 goto out; 2201 } 2202 2203 if (scan_active) 2204 goto out; 2205 2206 for_each_context(priv, ctx) { 2207 if (memcmp(&ctx->active, &ctx->staging, sizeof(ctx->staging))) 2208 iwl_legacy_commit_rxon(priv, ctx); 2209 else 2210 IWL_DEBUG_INFO(priv, 2211 "Not re-sending same RXON configuration.\n"); 2212 if (ht_changed[ctx->ctxid]) 2213 iwl_legacy_update_qos(priv, ctx); 2214 } 2215 2216out: 2217 IWL_DEBUG_MAC80211(priv, "leave\n"); 2218 mutex_unlock(&priv->mutex); 2219 return ret; 2220} 2221EXPORT_SYMBOL(iwl_legacy_mac_config); 2222 2223void iwl_legacy_mac_reset_tsf(struct ieee80211_hw *hw) 2224{ 2225 struct iwl_priv *priv = hw->priv; 2226 unsigned long flags; 2227 /* IBSS can only be the IWL_RXON_CTX_BSS context */ 2228 struct iwl_rxon_context *ctx = &priv->contexts[IWL_RXON_CTX_BSS]; 2229 2230 if (WARN_ON(!priv->cfg->ops->legacy)) 2231 return; 2232 2233 mutex_lock(&priv->mutex); 2234 IWL_DEBUG_MAC80211(priv, "enter\n"); 2235 2236 spin_lock_irqsave(&priv->lock, flags); 2237 memset(&priv->current_ht_config, 0, sizeof(struct iwl_ht_config)); 2238 spin_unlock_irqrestore(&priv->lock, flags); 2239 2240 spin_lock_irqsave(&priv->lock, flags); 2241 2242 /* new association get rid of ibss beacon skb */ 2243 if (priv->beacon_skb) 2244 dev_kfree_skb(priv->beacon_skb); 2245 2246 priv->beacon_skb = NULL; 2247 2248 priv->timestamp = 0; 2249 2250 spin_unlock_irqrestore(&priv->lock, flags); 2251 2252 iwl_legacy_scan_cancel_timeout(priv, 100); 2253 if (!iwl_legacy_is_ready_rf(priv)) { 2254 IWL_DEBUG_MAC80211(priv, "leave - not ready\n"); 2255 mutex_unlock(&priv->mutex); 2256 return; 2257 } 2258 2259 /* we are restarting association process 2260 * clear RXON_FILTER_ASSOC_MSK bit 2261 */ 2262 ctx->staging.filter_flags &= ~RXON_FILTER_ASSOC_MSK; 2263 iwl_legacy_commit_rxon(priv, ctx); 2264 2265 iwl_legacy_set_rate(priv); 2266 2267 mutex_unlock(&priv->mutex); 2268 2269 IWL_DEBUG_MAC80211(priv, "leave\n"); 2270} 2271EXPORT_SYMBOL(iwl_legacy_mac_reset_tsf); 2272 2273static void iwl_legacy_ht_conf(struct iwl_priv *priv, 2274 struct ieee80211_vif *vif) 2275{ 2276 struct iwl_ht_config *ht_conf = &priv->current_ht_config; 2277 struct ieee80211_sta *sta; 2278 struct ieee80211_bss_conf *bss_conf = &vif->bss_conf; 2279 struct iwl_rxon_context *ctx = iwl_legacy_rxon_ctx_from_vif(vif); 2280 2281 IWL_DEBUG_ASSOC(priv, "enter:\n"); 2282 2283 if (!ctx->ht.enabled) 2284 return; 2285 2286 ctx->ht.protection = 2287 bss_conf->ht_operation_mode & IEEE80211_HT_OP_MODE_PROTECTION; 2288 ctx->ht.non_gf_sta_present = 2289 !!(bss_conf->ht_operation_mode & 2290 IEEE80211_HT_OP_MODE_NON_GF_STA_PRSNT); 2291 2292 ht_conf->single_chain_sufficient = false; 2293 2294 switch (vif->type) { 2295 case NL80211_IFTYPE_STATION: 2296 rcu_read_lock(); 2297 sta = ieee80211_find_sta(vif, bss_conf->bssid); 2298 if (sta) { 2299 struct ieee80211_sta_ht_cap *ht_cap = &sta->ht_cap; 2300 int maxstreams; 2301 2302 maxstreams = (ht_cap->mcs.tx_params & 2303 IEEE80211_HT_MCS_TX_MAX_STREAMS_MASK) 2304 >> IEEE80211_HT_MCS_TX_MAX_STREAMS_SHIFT; 2305 maxstreams += 1; 2306 2307 if ((ht_cap->mcs.rx_mask[1] == 0) && 2308 (ht_cap->mcs.rx_mask[2] == 0)) 2309 ht_conf->single_chain_sufficient = true; 2310 if (maxstreams <= 1) 2311 ht_conf->single_chain_sufficient = true; 2312 } else { 2313 /* 2314 * If at all, this can only happen through a race 2315 * when the AP disconnects us while we're still 2316 * setting up the connection, in that case mac80211 2317 * will soon tell us about that. 2318 */ 2319 ht_conf->single_chain_sufficient = true; 2320 } 2321 rcu_read_unlock(); 2322 break; 2323 case NL80211_IFTYPE_ADHOC: 2324 ht_conf->single_chain_sufficient = true; 2325 break; 2326 default: 2327 break; 2328 } 2329 2330 IWL_DEBUG_ASSOC(priv, "leave\n"); 2331} 2332 2333static inline void iwl_legacy_set_no_assoc(struct iwl_priv *priv, 2334 struct ieee80211_vif *vif) 2335{ 2336 struct iwl_rxon_context *ctx = iwl_legacy_rxon_ctx_from_vif(vif); 2337 2338 /* 2339 * inform the ucode that there is no longer an 2340 * association and that no more packets should be 2341 * sent 2342 */ 2343 ctx->staging.filter_flags &= ~RXON_FILTER_ASSOC_MSK; 2344 ctx->staging.assoc_id = 0; 2345 iwl_legacy_commit_rxon(priv, ctx); 2346} 2347 2348static void iwl_legacy_beacon_update(struct ieee80211_hw *hw, 2349 struct ieee80211_vif *vif) 2350{ 2351 struct iwl_priv *priv = hw->priv; 2352 unsigned long flags; 2353 __le64 timestamp; 2354 struct sk_buff *skb = ieee80211_beacon_get(hw, vif); 2355 2356 if (!skb) 2357 return; 2358 2359 IWL_DEBUG_MAC80211(priv, "enter\n"); 2360 2361 lockdep_assert_held(&priv->mutex); 2362 2363 if (!priv->beacon_ctx) { 2364 IWL_ERR(priv, "update beacon but no beacon context!\n"); 2365 dev_kfree_skb(skb); 2366 return; 2367 } 2368 2369 spin_lock_irqsave(&priv->lock, flags); 2370 2371 if (priv->beacon_skb) 2372 dev_kfree_skb(priv->beacon_skb); 2373 2374 priv->beacon_skb = skb; 2375 2376 timestamp = ((struct ieee80211_mgmt *)skb->data)->u.beacon.timestamp; 2377 priv->timestamp = le64_to_cpu(timestamp); 2378 2379 IWL_DEBUG_MAC80211(priv, "leave\n"); 2380 spin_unlock_irqrestore(&priv->lock, flags); 2381 2382 if (!iwl_legacy_is_ready_rf(priv)) { 2383 IWL_DEBUG_MAC80211(priv, "leave - RF not ready\n"); 2384 return; 2385 } 2386 2387 priv->cfg->ops->legacy->post_associate(priv); 2388} 2389 2390void iwl_legacy_mac_bss_info_changed(struct ieee80211_hw *hw, 2391 struct ieee80211_vif *vif, 2392 struct ieee80211_bss_conf *bss_conf, 2393 u32 changes) 2394{ 2395 struct iwl_priv *priv = hw->priv; 2396 struct iwl_rxon_context *ctx = iwl_legacy_rxon_ctx_from_vif(vif); 2397 int ret; 2398 2399 if (WARN_ON(!priv->cfg->ops->legacy)) 2400 return; 2401 2402 IWL_DEBUG_MAC80211(priv, "changes = 0x%X\n", changes); 2403 2404 mutex_lock(&priv->mutex); 2405 2406 if (!iwl_legacy_is_alive(priv)) { 2407 mutex_unlock(&priv->mutex); 2408 return; 2409 } 2410 2411 if (changes & BSS_CHANGED_QOS) { 2412 unsigned long flags; 2413 2414 spin_lock_irqsave(&priv->lock, flags); 2415 ctx->qos_data.qos_active = bss_conf->qos; 2416 iwl_legacy_update_qos(priv, ctx); 2417 spin_unlock_irqrestore(&priv->lock, flags); 2418 } 2419 2420 if (changes & BSS_CHANGED_BEACON_ENABLED) { 2421 /* 2422 * the add_interface code must make sure we only ever 2423 * have a single interface that could be beaconing at 2424 * any time. 2425 */ 2426 if (vif->bss_conf.enable_beacon) 2427 priv->beacon_ctx = ctx; 2428 else 2429 priv->beacon_ctx = NULL; 2430 } 2431 2432 if (changes & BSS_CHANGED_BSSID) { 2433 IWL_DEBUG_MAC80211(priv, "BSSID %pM\n", bss_conf->bssid); 2434 2435 /* 2436 * If there is currently a HW scan going on in the 2437 * background then we need to cancel it else the RXON 2438 * below/in post_associate will fail. 2439 */ 2440 if (iwl_legacy_scan_cancel_timeout(priv, 100)) { 2441 IWL_WARN(priv, 2442 "Aborted scan still in progress after 100ms\n"); 2443 IWL_DEBUG_MAC80211(priv, 2444 "leaving - scan abort failed.\n"); 2445 mutex_unlock(&priv->mutex); 2446 return; 2447 } 2448 2449 /* mac80211 only sets assoc when in STATION mode */ 2450 if (vif->type == NL80211_IFTYPE_ADHOC || bss_conf->assoc) { 2451 memcpy(ctx->staging.bssid_addr, 2452 bss_conf->bssid, ETH_ALEN); 2453 2454 /* currently needed in a few places */ 2455 memcpy(priv->bssid, bss_conf->bssid, ETH_ALEN); 2456 } else { 2457 ctx->staging.filter_flags &= 2458 ~RXON_FILTER_ASSOC_MSK; 2459 } 2460 2461 } 2462 2463 /* 2464 * This needs to be after setting the BSSID in case 2465 * mac80211 decides to do both changes at once because 2466 * it will invoke post_associate. 2467 */ 2468 if (vif->type == NL80211_IFTYPE_ADHOC && changes & BSS_CHANGED_BEACON) 2469 iwl_legacy_beacon_update(hw, vif); 2470 2471 if (changes & BSS_CHANGED_ERP_PREAMBLE) { 2472 IWL_DEBUG_MAC80211(priv, "ERP_PREAMBLE %d\n", 2473 bss_conf->use_short_preamble); 2474 if (bss_conf->use_short_preamble) 2475 ctx->staging.flags |= RXON_FLG_SHORT_PREAMBLE_MSK; 2476 else 2477 ctx->staging.flags &= ~RXON_FLG_SHORT_PREAMBLE_MSK; 2478 } 2479 2480 if (changes & BSS_CHANGED_ERP_CTS_PROT) { 2481 IWL_DEBUG_MAC80211(priv, 2482 "ERP_CTS %d\n", bss_conf->use_cts_prot); 2483 if (bss_conf->use_cts_prot && 2484 (priv->band != IEEE80211_BAND_5GHZ)) 2485 ctx->staging.flags |= RXON_FLG_TGG_PROTECT_MSK; 2486 else 2487 ctx->staging.flags &= ~RXON_FLG_TGG_PROTECT_MSK; 2488 if (bss_conf->use_cts_prot) 2489 ctx->staging.flags |= RXON_FLG_SELF_CTS_EN; 2490 else 2491 ctx->staging.flags &= ~RXON_FLG_SELF_CTS_EN; 2492 } 2493 2494 if (changes & BSS_CHANGED_BASIC_RATES) { 2495 /* XXX use this information 2496 * 2497 * To do that, remove code from iwl_legacy_set_rate() and put something 2498 * like this here: 2499 * 2500 if (A-band) 2501 ctx->staging.ofdm_basic_rates = 2502 bss_conf->basic_rates; 2503 else 2504 ctx->staging.ofdm_basic_rates = 2505 bss_conf->basic_rates >> 4; 2506 ctx->staging.cck_basic_rates = 2507 bss_conf->basic_rates & 0xF; 2508 */ 2509 } 2510 2511 if (changes & BSS_CHANGED_HT) { 2512 iwl_legacy_ht_conf(priv, vif); 2513 2514 if (priv->cfg->ops->hcmd->set_rxon_chain) 2515 priv->cfg->ops->hcmd->set_rxon_chain(priv, ctx); 2516 } 2517 2518 if (changes & BSS_CHANGED_ASSOC) { 2519 IWL_DEBUG_MAC80211(priv, "ASSOC %d\n", bss_conf->assoc); 2520 if (bss_conf->assoc) { 2521 priv->timestamp = bss_conf->timestamp; 2522 2523 if (!iwl_legacy_is_rfkill(priv)) 2524 priv->cfg->ops->legacy->post_associate(priv); 2525 } else 2526 iwl_legacy_set_no_assoc(priv, vif); 2527 } 2528 2529 if (changes && iwl_legacy_is_associated_ctx(ctx) && bss_conf->aid) { 2530 IWL_DEBUG_MAC80211(priv, "Changes (%#x) while associated\n", 2531 changes); 2532 ret = iwl_legacy_send_rxon_assoc(priv, ctx); 2533 if (!ret) { 2534 /* Sync active_rxon with latest change. */ 2535 memcpy((void *)&ctx->active, 2536 &ctx->staging, 2537 sizeof(struct iwl_legacy_rxon_cmd)); 2538 } 2539 } 2540 2541 if (changes & BSS_CHANGED_BEACON_ENABLED) { 2542 if (vif->bss_conf.enable_beacon) { 2543 memcpy(ctx->staging.bssid_addr, 2544 bss_conf->bssid, ETH_ALEN); 2545 memcpy(priv->bssid, bss_conf->bssid, ETH_ALEN); 2546 priv->cfg->ops->legacy->config_ap(priv); 2547 } else 2548 iwl_legacy_set_no_assoc(priv, vif); 2549 } 2550 2551 if (changes & BSS_CHANGED_IBSS) { 2552 ret = priv->cfg->ops->legacy->manage_ibss_station(priv, vif, 2553 bss_conf->ibss_joined); 2554 if (ret) 2555 IWL_ERR(priv, "failed to %s IBSS station %pM\n", 2556 bss_conf->ibss_joined ? "add" : "remove", 2557 bss_conf->bssid); 2558 } 2559 2560 mutex_unlock(&priv->mutex); 2561 2562 IWL_DEBUG_MAC80211(priv, "leave\n"); 2563} 2564EXPORT_SYMBOL(iwl_legacy_mac_bss_info_changed); 2565 2566irqreturn_t iwl_legacy_isr(int irq, void *data) 2567{ 2568 struct iwl_priv *priv = data; 2569 u32 inta, inta_mask; 2570 u32 inta_fh; 2571 unsigned long flags; 2572 if (!priv) 2573 return IRQ_NONE; 2574 2575 spin_lock_irqsave(&priv->lock, flags); 2576 2577 /* Disable (but don't clear!) interrupts here to avoid 2578 * back-to-back ISRs and sporadic interrupts from our NIC. 2579 * If we have something to service, the tasklet will re-enable ints. 2580 * If we *don't* have something, we'll re-enable before leaving here. */ 2581 inta_mask = iwl_read32(priv, CSR_INT_MASK); /* just for debug */ 2582 iwl_write32(priv, CSR_INT_MASK, 0x00000000); 2583 2584 /* Discover which interrupts are active/pending */ 2585 inta = iwl_read32(priv, CSR_INT); 2586 inta_fh = iwl_read32(priv, CSR_FH_INT_STATUS); 2587 2588 /* Ignore interrupt if there's nothing in NIC to service. 2589 * This may be due to IRQ shared with another device, 2590 * or due to sporadic interrupts thrown from our NIC. */ 2591 if (!inta && !inta_fh) { 2592 IWL_DEBUG_ISR(priv, 2593 "Ignore interrupt, inta == 0, inta_fh == 0\n"); 2594 goto none; 2595 } 2596 2597 if ((inta == 0xFFFFFFFF) || ((inta & 0xFFFFFFF0) == 0xa5a5a5a0)) { 2598 /* Hardware disappeared. It might have already raised 2599 * an interrupt */ 2600 IWL_WARN(priv, "HARDWARE GONE?? INTA == 0x%08x\n", inta); 2601 goto unplugged; 2602 } 2603 2604 IWL_DEBUG_ISR(priv, "ISR inta 0x%08x, enabled 0x%08x, fh 0x%08x\n", 2605 inta, inta_mask, inta_fh); 2606 2607 inta &= ~CSR_INT_BIT_SCD; 2608 2609 /* iwl_irq_tasklet() will service interrupts and re-enable them */ 2610 if (likely(inta || inta_fh)) 2611 tasklet_schedule(&priv->irq_tasklet); 2612 2613unplugged: 2614 spin_unlock_irqrestore(&priv->lock, flags); 2615 return IRQ_HANDLED; 2616 2617none: 2618 /* re-enable interrupts here since we don't have anything to service. */ 2619 /* only Re-enable if disabled by irq */ 2620 if (test_bit(STATUS_INT_ENABLED, &priv->status)) 2621 iwl_legacy_enable_interrupts(priv); 2622 spin_unlock_irqrestore(&priv->lock, flags); 2623 return IRQ_NONE; 2624} 2625EXPORT_SYMBOL(iwl_legacy_isr); 2626 2627/* 2628 * iwl_legacy_tx_cmd_protection: Set rts/cts. 3945 and 4965 only share this 2629 * function. 2630 */ 2631void iwl_legacy_tx_cmd_protection(struct iwl_priv *priv, 2632 struct ieee80211_tx_info *info, 2633 __le16 fc, __le32 *tx_flags) 2634{ 2635 if (info->control.rates[0].flags & IEEE80211_TX_RC_USE_RTS_CTS) { 2636 *tx_flags |= TX_CMD_FLG_RTS_MSK; 2637 *tx_flags &= ~TX_CMD_FLG_CTS_MSK; 2638 *tx_flags |= TX_CMD_FLG_FULL_TXOP_PROT_MSK; 2639 2640 if (!ieee80211_is_mgmt(fc)) 2641 return; 2642 2643 switch (fc & cpu_to_le16(IEEE80211_FCTL_STYPE)) { 2644 case cpu_to_le16(IEEE80211_STYPE_AUTH): 2645 case cpu_to_le16(IEEE80211_STYPE_DEAUTH): 2646 case cpu_to_le16(IEEE80211_STYPE_ASSOC_REQ): 2647 case cpu_to_le16(IEEE80211_STYPE_REASSOC_REQ): 2648 *tx_flags &= ~TX_CMD_FLG_RTS_MSK; 2649 *tx_flags |= TX_CMD_FLG_CTS_MSK; 2650 break; 2651 } 2652 } else if (info->control.rates[0].flags & 2653 IEEE80211_TX_RC_USE_CTS_PROTECT) { 2654 *tx_flags &= ~TX_CMD_FLG_RTS_MSK; 2655 *tx_flags |= TX_CMD_FLG_CTS_MSK; 2656 *tx_flags |= TX_CMD_FLG_FULL_TXOP_PROT_MSK; 2657 } 2658} 2659EXPORT_SYMBOL(iwl_legacy_tx_cmd_protection);