sta.c (38120B)
1// SPDX-License-Identifier: GPL-2.0-only 2/****************************************************************************** 3 * 4 * Copyright(c) 2003 - 2014 Intel Corporation. All rights reserved. 5 * 6 * Portions of this file are derived from the ipw3945 project, as well 7 * as portions of the ieee80211 subsystem header files. 8 *****************************************************************************/ 9#include <linux/etherdevice.h> 10#include <net/mac80211.h> 11#include "iwl-trans.h" 12#include "dev.h" 13#include "agn.h" 14 15const u8 iwl_bcast_addr[ETH_ALEN] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }; 16 17static int iwl_sta_ucode_activate(struct iwl_priv *priv, u8 sta_id) 18{ 19 lockdep_assert_held(&priv->sta_lock); 20 21 if (sta_id >= IWLAGN_STATION_COUNT) { 22 IWL_ERR(priv, "invalid sta_id %u\n", sta_id); 23 return -EINVAL; 24 } 25 if (!(priv->stations[sta_id].used & IWL_STA_DRIVER_ACTIVE)) 26 IWL_ERR(priv, "ACTIVATE a non DRIVER active station id %u " 27 "addr %pM\n", 28 sta_id, priv->stations[sta_id].sta.sta.addr); 29 30 if (priv->stations[sta_id].used & IWL_STA_UCODE_ACTIVE) { 31 IWL_DEBUG_ASSOC(priv, 32 "STA id %u addr %pM already present in uCode " 33 "(according to driver)\n", 34 sta_id, priv->stations[sta_id].sta.sta.addr); 35 } else { 36 priv->stations[sta_id].used |= IWL_STA_UCODE_ACTIVE; 37 IWL_DEBUG_ASSOC(priv, "Added STA id %u addr %pM to uCode\n", 38 sta_id, priv->stations[sta_id].sta.sta.addr); 39 } 40 return 0; 41} 42 43static void iwl_process_add_sta_resp(struct iwl_priv *priv, 44 struct iwl_rx_packet *pkt) 45{ 46 struct iwl_add_sta_resp *add_sta_resp = (void *)pkt->data; 47 48 IWL_DEBUG_INFO(priv, "Processing response for adding station\n"); 49 50 spin_lock_bh(&priv->sta_lock); 51 52 switch (add_sta_resp->status) { 53 case ADD_STA_SUCCESS_MSK: 54 IWL_DEBUG_INFO(priv, "REPLY_ADD_STA PASSED\n"); 55 break; 56 case ADD_STA_NO_ROOM_IN_TABLE: 57 IWL_ERR(priv, "Adding station failed, no room in table.\n"); 58 break; 59 case ADD_STA_NO_BLOCK_ACK_RESOURCE: 60 IWL_ERR(priv, 61 "Adding station failed, no block ack resource.\n"); 62 break; 63 case ADD_STA_MODIFY_NON_EXIST_STA: 64 IWL_ERR(priv, "Attempting to modify non-existing station\n"); 65 break; 66 default: 67 IWL_DEBUG_ASSOC(priv, "Received REPLY_ADD_STA:(0x%08X)\n", 68 add_sta_resp->status); 69 break; 70 } 71 72 spin_unlock_bh(&priv->sta_lock); 73} 74 75void iwl_add_sta_callback(struct iwl_priv *priv, struct iwl_rx_cmd_buffer *rxb) 76{ 77 struct iwl_rx_packet *pkt = rxb_addr(rxb); 78 79 iwl_process_add_sta_resp(priv, pkt); 80} 81 82int iwl_send_add_sta(struct iwl_priv *priv, 83 struct iwl_addsta_cmd *sta, u8 flags) 84{ 85 int ret = 0; 86 struct iwl_host_cmd cmd = { 87 .id = REPLY_ADD_STA, 88 .flags = flags, 89 .data = { sta, }, 90 .len = { sizeof(*sta), }, 91 }; 92 u8 sta_id __maybe_unused = sta->sta.sta_id; 93 struct iwl_rx_packet *pkt; 94 struct iwl_add_sta_resp *add_sta_resp; 95 96 IWL_DEBUG_INFO(priv, "Adding sta %u (%pM) %ssynchronously\n", 97 sta_id, sta->sta.addr, flags & CMD_ASYNC ? "a" : ""); 98 99 if (!(flags & CMD_ASYNC)) { 100 cmd.flags |= CMD_WANT_SKB; 101 might_sleep(); 102 } 103 104 ret = iwl_dvm_send_cmd(priv, &cmd); 105 106 if (ret || (flags & CMD_ASYNC)) 107 return ret; 108 109 pkt = cmd.resp_pkt; 110 add_sta_resp = (void *)pkt->data; 111 112 /* debug messages are printed in the handler */ 113 if (add_sta_resp->status == ADD_STA_SUCCESS_MSK) { 114 spin_lock_bh(&priv->sta_lock); 115 ret = iwl_sta_ucode_activate(priv, sta_id); 116 spin_unlock_bh(&priv->sta_lock); 117 } else { 118 ret = -EIO; 119 } 120 121 iwl_free_resp(&cmd); 122 123 return ret; 124} 125 126bool iwl_is_ht40_tx_allowed(struct iwl_priv *priv, 127 struct iwl_rxon_context *ctx, 128 struct ieee80211_sta *sta) 129{ 130 if (!ctx->ht.enabled || !ctx->ht.is_40mhz) 131 return false; 132 133#ifdef CONFIG_IWLWIFI_DEBUGFS 134 if (priv->disable_ht40) 135 return false; 136#endif 137 138 /* special case for RXON */ 139 if (!sta) 140 return true; 141 142 return sta->deflink.bandwidth >= IEEE80211_STA_RX_BW_40; 143} 144 145static void iwl_sta_calc_ht_flags(struct iwl_priv *priv, 146 struct ieee80211_sta *sta, 147 struct iwl_rxon_context *ctx, 148 __le32 *flags, __le32 *mask) 149{ 150 struct ieee80211_sta_ht_cap *sta_ht_inf = &sta->deflink.ht_cap; 151 152 *mask = STA_FLG_RTS_MIMO_PROT_MSK | 153 STA_FLG_MIMO_DIS_MSK | 154 STA_FLG_HT40_EN_MSK | 155 STA_FLG_MAX_AGG_SIZE_MSK | 156 STA_FLG_AGG_MPDU_DENSITY_MSK; 157 *flags = 0; 158 159 if (!sta || !sta_ht_inf->ht_supported) 160 return; 161 162 IWL_DEBUG_INFO(priv, "STA %pM SM PS mode: %s\n", 163 sta->addr, 164 (sta->smps_mode == IEEE80211_SMPS_STATIC) ? 165 "static" : 166 (sta->smps_mode == IEEE80211_SMPS_DYNAMIC) ? 167 "dynamic" : "disabled"); 168 169 switch (sta->smps_mode) { 170 case IEEE80211_SMPS_STATIC: 171 *flags |= STA_FLG_MIMO_DIS_MSK; 172 break; 173 case IEEE80211_SMPS_DYNAMIC: 174 *flags |= STA_FLG_RTS_MIMO_PROT_MSK; 175 break; 176 case IEEE80211_SMPS_OFF: 177 break; 178 default: 179 IWL_WARN(priv, "Invalid MIMO PS mode %d\n", sta->smps_mode); 180 break; 181 } 182 183 *flags |= cpu_to_le32( 184 (u32)sta_ht_inf->ampdu_factor << STA_FLG_MAX_AGG_SIZE_POS); 185 186 *flags |= cpu_to_le32( 187 (u32)sta_ht_inf->ampdu_density << STA_FLG_AGG_MPDU_DENSITY_POS); 188 189 if (iwl_is_ht40_tx_allowed(priv, ctx, sta)) 190 *flags |= STA_FLG_HT40_EN_MSK; 191} 192 193int iwl_sta_update_ht(struct iwl_priv *priv, struct iwl_rxon_context *ctx, 194 struct ieee80211_sta *sta) 195{ 196 u8 sta_id = iwl_sta_id(sta); 197 __le32 flags, mask; 198 struct iwl_addsta_cmd cmd; 199 200 if (WARN_ON_ONCE(sta_id == IWL_INVALID_STATION)) 201 return -EINVAL; 202 203 iwl_sta_calc_ht_flags(priv, sta, ctx, &flags, &mask); 204 205 spin_lock_bh(&priv->sta_lock); 206 priv->stations[sta_id].sta.station_flags &= ~mask; 207 priv->stations[sta_id].sta.station_flags |= flags; 208 spin_unlock_bh(&priv->sta_lock); 209 210 memset(&cmd, 0, sizeof(cmd)); 211 cmd.mode = STA_CONTROL_MODIFY_MSK; 212 cmd.station_flags_msk = mask; 213 cmd.station_flags = flags; 214 cmd.sta.sta_id = sta_id; 215 216 return iwl_send_add_sta(priv, &cmd, 0); 217} 218 219static void iwl_set_ht_add_station(struct iwl_priv *priv, u8 index, 220 struct ieee80211_sta *sta, 221 struct iwl_rxon_context *ctx) 222{ 223 __le32 flags, mask; 224 225 iwl_sta_calc_ht_flags(priv, sta, ctx, &flags, &mask); 226 227 lockdep_assert_held(&priv->sta_lock); 228 priv->stations[index].sta.station_flags &= ~mask; 229 priv->stations[index].sta.station_flags |= flags; 230} 231 232/* 233 * iwl_prep_station - Prepare station information for addition 234 * 235 * should be called with sta_lock held 236 */ 237u8 iwl_prep_station(struct iwl_priv *priv, struct iwl_rxon_context *ctx, 238 const u8 *addr, bool is_ap, struct ieee80211_sta *sta) 239{ 240 struct iwl_station_entry *station; 241 int i; 242 u8 sta_id = IWL_INVALID_STATION; 243 244 if (is_ap) 245 sta_id = ctx->ap_sta_id; 246 else if (is_broadcast_ether_addr(addr)) 247 sta_id = ctx->bcast_sta_id; 248 else 249 for (i = IWL_STA_ID; i < IWLAGN_STATION_COUNT; i++) { 250 if (ether_addr_equal(priv->stations[i].sta.sta.addr, 251 addr)) { 252 sta_id = i; 253 break; 254 } 255 256 if (!priv->stations[i].used && 257 sta_id == IWL_INVALID_STATION) 258 sta_id = i; 259 } 260 261 /* 262 * These two conditions have the same outcome, but keep them 263 * separate 264 */ 265 if (unlikely(sta_id == IWL_INVALID_STATION)) 266 return sta_id; 267 268 /* 269 * uCode is not able to deal with multiple requests to add a 270 * station. Keep track if one is in progress so that we do not send 271 * another. 272 */ 273 if (priv->stations[sta_id].used & IWL_STA_UCODE_INPROGRESS) { 274 IWL_DEBUG_INFO(priv, "STA %d already in process of being " 275 "added.\n", sta_id); 276 return sta_id; 277 } 278 279 if ((priv->stations[sta_id].used & IWL_STA_DRIVER_ACTIVE) && 280 (priv->stations[sta_id].used & IWL_STA_UCODE_ACTIVE) && 281 ether_addr_equal(priv->stations[sta_id].sta.sta.addr, addr)) { 282 IWL_DEBUG_ASSOC(priv, "STA %d (%pM) already added, not " 283 "adding again.\n", sta_id, addr); 284 return sta_id; 285 } 286 287 station = &priv->stations[sta_id]; 288 station->used = IWL_STA_DRIVER_ACTIVE; 289 IWL_DEBUG_ASSOC(priv, "Add STA to driver ID %d: %pM\n", 290 sta_id, addr); 291 priv->num_stations++; 292 293 /* Set up the REPLY_ADD_STA command to send to device */ 294 memset(&station->sta, 0, sizeof(struct iwl_addsta_cmd)); 295 memcpy(station->sta.sta.addr, addr, ETH_ALEN); 296 station->sta.mode = 0; 297 station->sta.sta.sta_id = sta_id; 298 station->sta.station_flags = ctx->station_flags; 299 station->ctxid = ctx->ctxid; 300 301 if (sta) { 302 struct iwl_station_priv *sta_priv; 303 304 sta_priv = (void *)sta->drv_priv; 305 sta_priv->ctx = ctx; 306 } 307 308 /* 309 * OK to call unconditionally, since local stations (IBSS BSSID 310 * STA and broadcast STA) pass in a NULL sta, and mac80211 311 * doesn't allow HT IBSS. 312 */ 313 iwl_set_ht_add_station(priv, sta_id, sta, ctx); 314 315 return sta_id; 316 317} 318 319#define STA_WAIT_TIMEOUT (HZ/2) 320 321/* 322 * iwl_add_station_common - 323 */ 324int iwl_add_station_common(struct iwl_priv *priv, struct iwl_rxon_context *ctx, 325 const u8 *addr, bool is_ap, 326 struct ieee80211_sta *sta, u8 *sta_id_r) 327{ 328 int ret = 0; 329 u8 sta_id; 330 struct iwl_addsta_cmd sta_cmd; 331 332 *sta_id_r = 0; 333 spin_lock_bh(&priv->sta_lock); 334 sta_id = iwl_prep_station(priv, ctx, addr, is_ap, sta); 335 if (sta_id == IWL_INVALID_STATION) { 336 IWL_ERR(priv, "Unable to prepare station %pM for addition\n", 337 addr); 338 spin_unlock_bh(&priv->sta_lock); 339 return -EINVAL; 340 } 341 342 /* 343 * uCode is not able to deal with multiple requests to add a 344 * station. Keep track if one is in progress so that we do not send 345 * another. 346 */ 347 if (priv->stations[sta_id].used & IWL_STA_UCODE_INPROGRESS) { 348 IWL_DEBUG_INFO(priv, "STA %d already in process of being " 349 "added.\n", sta_id); 350 spin_unlock_bh(&priv->sta_lock); 351 return -EEXIST; 352 } 353 354 if ((priv->stations[sta_id].used & IWL_STA_DRIVER_ACTIVE) && 355 (priv->stations[sta_id].used & IWL_STA_UCODE_ACTIVE)) { 356 IWL_DEBUG_ASSOC(priv, "STA %d (%pM) already added, not " 357 "adding again.\n", sta_id, addr); 358 spin_unlock_bh(&priv->sta_lock); 359 return -EEXIST; 360 } 361 362 priv->stations[sta_id].used |= IWL_STA_UCODE_INPROGRESS; 363 memcpy(&sta_cmd, &priv->stations[sta_id].sta, 364 sizeof(struct iwl_addsta_cmd)); 365 spin_unlock_bh(&priv->sta_lock); 366 367 /* Add station to device's station table */ 368 ret = iwl_send_add_sta(priv, &sta_cmd, 0); 369 if (ret) { 370 spin_lock_bh(&priv->sta_lock); 371 IWL_ERR(priv, "Adding station %pM failed.\n", 372 priv->stations[sta_id].sta.sta.addr); 373 priv->stations[sta_id].used &= ~IWL_STA_DRIVER_ACTIVE; 374 priv->stations[sta_id].used &= ~IWL_STA_UCODE_INPROGRESS; 375 spin_unlock_bh(&priv->sta_lock); 376 } 377 *sta_id_r = sta_id; 378 return ret; 379} 380 381/* 382 * iwl_sta_ucode_deactivate - deactivate ucode status for a station 383 */ 384static void iwl_sta_ucode_deactivate(struct iwl_priv *priv, u8 sta_id) 385{ 386 lockdep_assert_held(&priv->sta_lock); 387 388 /* Ucode must be active and driver must be non active */ 389 if ((priv->stations[sta_id].used & 390 (IWL_STA_UCODE_ACTIVE | IWL_STA_DRIVER_ACTIVE)) != 391 IWL_STA_UCODE_ACTIVE) 392 IWL_ERR(priv, "removed non active STA %u\n", sta_id); 393 394 priv->stations[sta_id].used &= ~IWL_STA_UCODE_ACTIVE; 395 396 memset(&priv->stations[sta_id], 0, sizeof(struct iwl_station_entry)); 397 IWL_DEBUG_ASSOC(priv, "Removed STA %u\n", sta_id); 398} 399 400static int iwl_send_remove_station(struct iwl_priv *priv, 401 const u8 *addr, int sta_id, 402 bool temporary) 403{ 404 struct iwl_rx_packet *pkt; 405 int ret; 406 struct iwl_rem_sta_cmd rm_sta_cmd; 407 struct iwl_rem_sta_resp *rem_sta_resp; 408 409 struct iwl_host_cmd cmd = { 410 .id = REPLY_REMOVE_STA, 411 .len = { sizeof(struct iwl_rem_sta_cmd), }, 412 .data = { &rm_sta_cmd, }, 413 }; 414 415 memset(&rm_sta_cmd, 0, sizeof(rm_sta_cmd)); 416 rm_sta_cmd.num_sta = 1; 417 memcpy(&rm_sta_cmd.addr, addr, ETH_ALEN); 418 419 cmd.flags |= CMD_WANT_SKB; 420 421 ret = iwl_dvm_send_cmd(priv, &cmd); 422 423 if (ret) 424 return ret; 425 426 pkt = cmd.resp_pkt; 427 rem_sta_resp = (void *)pkt->data; 428 429 switch (rem_sta_resp->status) { 430 case REM_STA_SUCCESS_MSK: 431 if (!temporary) { 432 spin_lock_bh(&priv->sta_lock); 433 iwl_sta_ucode_deactivate(priv, sta_id); 434 spin_unlock_bh(&priv->sta_lock); 435 } 436 IWL_DEBUG_ASSOC(priv, "REPLY_REMOVE_STA PASSED\n"); 437 break; 438 default: 439 ret = -EIO; 440 IWL_ERR(priv, "REPLY_REMOVE_STA failed\n"); 441 break; 442 } 443 444 iwl_free_resp(&cmd); 445 446 return ret; 447} 448 449/* 450 * iwl_remove_station - Remove driver's knowledge of station. 451 */ 452int iwl_remove_station(struct iwl_priv *priv, const u8 sta_id, 453 const u8 *addr) 454{ 455 u8 tid; 456 457 if (!iwl_is_ready(priv)) { 458 IWL_DEBUG_INFO(priv, 459 "Unable to remove station %pM, device not ready.\n", 460 addr); 461 /* 462 * It is typical for stations to be removed when we are 463 * going down. Return success since device will be down 464 * soon anyway 465 */ 466 return 0; 467 } 468 469 IWL_DEBUG_ASSOC(priv, "Removing STA from driver:%d %pM\n", 470 sta_id, addr); 471 472 if (WARN_ON(sta_id == IWL_INVALID_STATION)) 473 return -EINVAL; 474 475 spin_lock_bh(&priv->sta_lock); 476 477 if (!(priv->stations[sta_id].used & IWL_STA_DRIVER_ACTIVE)) { 478 IWL_DEBUG_INFO(priv, "Removing %pM but non DRIVER active\n", 479 addr); 480 goto out_err; 481 } 482 483 if (!(priv->stations[sta_id].used & IWL_STA_UCODE_ACTIVE)) { 484 IWL_DEBUG_INFO(priv, "Removing %pM but non UCODE active\n", 485 addr); 486 goto out_err; 487 } 488 489 if (priv->stations[sta_id].used & IWL_STA_LOCAL) { 490 kfree(priv->stations[sta_id].lq); 491 priv->stations[sta_id].lq = NULL; 492 } 493 494 for (tid = 0; tid < IWL_MAX_TID_COUNT; tid++) 495 memset(&priv->tid_data[sta_id][tid], 0, 496 sizeof(priv->tid_data[sta_id][tid])); 497 498 priv->stations[sta_id].used &= ~IWL_STA_DRIVER_ACTIVE; 499 500 priv->num_stations--; 501 502 if (WARN_ON(priv->num_stations < 0)) 503 priv->num_stations = 0; 504 505 spin_unlock_bh(&priv->sta_lock); 506 507 return iwl_send_remove_station(priv, addr, sta_id, false); 508out_err: 509 spin_unlock_bh(&priv->sta_lock); 510 return -EINVAL; 511} 512 513void iwl_deactivate_station(struct iwl_priv *priv, const u8 sta_id, 514 const u8 *addr) 515{ 516 u8 tid; 517 518 if (!iwl_is_ready(priv)) { 519 IWL_DEBUG_INFO(priv, 520 "Unable to remove station %pM, device not ready.\n", 521 addr); 522 return; 523 } 524 525 IWL_DEBUG_ASSOC(priv, "Deactivating STA: %pM (%d)\n", addr, sta_id); 526 527 if (WARN_ON_ONCE(sta_id == IWL_INVALID_STATION)) 528 return; 529 530 spin_lock_bh(&priv->sta_lock); 531 532 WARN_ON_ONCE(!(priv->stations[sta_id].used & IWL_STA_DRIVER_ACTIVE)); 533 534 for (tid = 0; tid < IWL_MAX_TID_COUNT; tid++) 535 memset(&priv->tid_data[sta_id][tid], 0, 536 sizeof(priv->tid_data[sta_id][tid])); 537 538 priv->stations[sta_id].used &= ~IWL_STA_DRIVER_ACTIVE; 539 priv->stations[sta_id].used &= ~IWL_STA_UCODE_INPROGRESS; 540 541 priv->num_stations--; 542 543 if (WARN_ON_ONCE(priv->num_stations < 0)) 544 priv->num_stations = 0; 545 546 spin_unlock_bh(&priv->sta_lock); 547} 548 549static void iwl_sta_fill_lq(struct iwl_priv *priv, struct iwl_rxon_context *ctx, 550 u8 sta_id, struct iwl_link_quality_cmd *link_cmd) 551{ 552 int i, r; 553 u32 rate_flags = 0; 554 __le32 rate_n_flags; 555 556 lockdep_assert_held(&priv->mutex); 557 558 memset(link_cmd, 0, sizeof(*link_cmd)); 559 560 /* Set up the rate scaling to start at selected rate, fall back 561 * all the way down to 1M in IEEE order, and then spin on 1M */ 562 if (priv->band == NL80211_BAND_5GHZ) 563 r = IWL_RATE_6M_INDEX; 564 else if (ctx && ctx->vif && ctx->vif->p2p) 565 r = IWL_RATE_6M_INDEX; 566 else 567 r = IWL_RATE_1M_INDEX; 568 569 if (r >= IWL_FIRST_CCK_RATE && r <= IWL_LAST_CCK_RATE) 570 rate_flags |= RATE_MCS_CCK_MSK; 571 572 rate_flags |= first_antenna(priv->nvm_data->valid_tx_ant) << 573 RATE_MCS_ANT_POS; 574 rate_n_flags = iwl_hw_set_rate_n_flags(iwl_rates[r].plcp, rate_flags); 575 for (i = 0; i < LINK_QUAL_MAX_RETRY_NUM; i++) 576 link_cmd->rs_table[i].rate_n_flags = rate_n_flags; 577 578 link_cmd->general_params.single_stream_ant_msk = 579 first_antenna(priv->nvm_data->valid_tx_ant); 580 581 link_cmd->general_params.dual_stream_ant_msk = 582 priv->nvm_data->valid_tx_ant & 583 ~first_antenna(priv->nvm_data->valid_tx_ant); 584 if (!link_cmd->general_params.dual_stream_ant_msk) { 585 link_cmd->general_params.dual_stream_ant_msk = ANT_AB; 586 } else if (num_of_ant(priv->nvm_data->valid_tx_ant) == 2) { 587 link_cmd->general_params.dual_stream_ant_msk = 588 priv->nvm_data->valid_tx_ant; 589 } 590 591 link_cmd->agg_params.agg_dis_start_th = 592 LINK_QUAL_AGG_DISABLE_START_DEF; 593 link_cmd->agg_params.agg_time_limit = 594 cpu_to_le16(LINK_QUAL_AGG_TIME_LIMIT_DEF); 595 596 link_cmd->sta_id = sta_id; 597} 598 599/* 600 * iwl_clear_ucode_stations - clear ucode station table bits 601 * 602 * This function clears all the bits in the driver indicating 603 * which stations are active in the ucode. Call when something 604 * other than explicit station management would cause this in 605 * the ucode, e.g. unassociated RXON. 606 */ 607void iwl_clear_ucode_stations(struct iwl_priv *priv, 608 struct iwl_rxon_context *ctx) 609{ 610 int i; 611 bool cleared = false; 612 613 IWL_DEBUG_INFO(priv, "Clearing ucode stations in driver\n"); 614 615 spin_lock_bh(&priv->sta_lock); 616 for (i = 0; i < IWLAGN_STATION_COUNT; i++) { 617 if (ctx && ctx->ctxid != priv->stations[i].ctxid) 618 continue; 619 620 if (priv->stations[i].used & IWL_STA_UCODE_ACTIVE) { 621 IWL_DEBUG_INFO(priv, 622 "Clearing ucode active for station %d\n", i); 623 priv->stations[i].used &= ~IWL_STA_UCODE_ACTIVE; 624 cleared = true; 625 } 626 } 627 spin_unlock_bh(&priv->sta_lock); 628 629 if (!cleared) 630 IWL_DEBUG_INFO(priv, 631 "No active stations found to be cleared\n"); 632} 633 634/* 635 * iwl_restore_stations() - Restore driver known stations to device 636 * 637 * All stations considered active by driver, but not present in ucode, is 638 * restored. 639 * 640 * Function sleeps. 641 */ 642void iwl_restore_stations(struct iwl_priv *priv, struct iwl_rxon_context *ctx) 643{ 644 struct iwl_addsta_cmd sta_cmd; 645 static const struct iwl_link_quality_cmd zero_lq = {}; 646 struct iwl_link_quality_cmd lq; 647 int i; 648 bool found = false; 649 int ret; 650 bool send_lq; 651 652 if (!iwl_is_ready(priv)) { 653 IWL_DEBUG_INFO(priv, 654 "Not ready yet, not restoring any stations.\n"); 655 return; 656 } 657 658 IWL_DEBUG_ASSOC(priv, "Restoring all known stations ... start.\n"); 659 spin_lock_bh(&priv->sta_lock); 660 for (i = 0; i < IWLAGN_STATION_COUNT; i++) { 661 if (ctx->ctxid != priv->stations[i].ctxid) 662 continue; 663 if ((priv->stations[i].used & IWL_STA_DRIVER_ACTIVE) && 664 !(priv->stations[i].used & IWL_STA_UCODE_ACTIVE)) { 665 IWL_DEBUG_ASSOC(priv, "Restoring sta %pM\n", 666 priv->stations[i].sta.sta.addr); 667 priv->stations[i].sta.mode = 0; 668 priv->stations[i].used |= IWL_STA_UCODE_INPROGRESS; 669 found = true; 670 } 671 } 672 673 for (i = 0; i < IWLAGN_STATION_COUNT; i++) { 674 if ((priv->stations[i].used & IWL_STA_UCODE_INPROGRESS)) { 675 memcpy(&sta_cmd, &priv->stations[i].sta, 676 sizeof(struct iwl_addsta_cmd)); 677 send_lq = false; 678 if (priv->stations[i].lq) { 679 if (priv->wowlan) 680 iwl_sta_fill_lq(priv, ctx, i, &lq); 681 else 682 memcpy(&lq, priv->stations[i].lq, 683 sizeof(struct iwl_link_quality_cmd)); 684 685 if (memcmp(&lq, &zero_lq, sizeof(lq))) 686 send_lq = true; 687 } 688 spin_unlock_bh(&priv->sta_lock); 689 ret = iwl_send_add_sta(priv, &sta_cmd, 0); 690 if (ret) { 691 spin_lock_bh(&priv->sta_lock); 692 IWL_ERR(priv, "Adding station %pM failed.\n", 693 priv->stations[i].sta.sta.addr); 694 priv->stations[i].used &= 695 ~IWL_STA_DRIVER_ACTIVE; 696 priv->stations[i].used &= 697 ~IWL_STA_UCODE_INPROGRESS; 698 continue; 699 } 700 /* 701 * Rate scaling has already been initialized, send 702 * current LQ command 703 */ 704 if (send_lq) 705 iwl_send_lq_cmd(priv, ctx, &lq, 0, true); 706 spin_lock_bh(&priv->sta_lock); 707 priv->stations[i].used &= ~IWL_STA_UCODE_INPROGRESS; 708 } 709 } 710 711 spin_unlock_bh(&priv->sta_lock); 712 if (!found) 713 IWL_DEBUG_INFO(priv, "Restoring all known stations .... " 714 "no stations to be restored.\n"); 715 else 716 IWL_DEBUG_INFO(priv, "Restoring all known stations .... " 717 "complete.\n"); 718} 719 720int iwl_get_free_ucode_key_offset(struct iwl_priv *priv) 721{ 722 int i; 723 724 for (i = 0; i < priv->sta_key_max_num; i++) 725 if (!test_and_set_bit(i, &priv->ucode_key_table)) 726 return i; 727 728 return WEP_INVALID_OFFSET; 729} 730 731void iwl_dealloc_bcast_stations(struct iwl_priv *priv) 732{ 733 int i; 734 735 spin_lock_bh(&priv->sta_lock); 736 for (i = 0; i < IWLAGN_STATION_COUNT; i++) { 737 if (!(priv->stations[i].used & IWL_STA_BCAST)) 738 continue; 739 740 priv->stations[i].used &= ~IWL_STA_UCODE_ACTIVE; 741 priv->num_stations--; 742 if (WARN_ON(priv->num_stations < 0)) 743 priv->num_stations = 0; 744 kfree(priv->stations[i].lq); 745 priv->stations[i].lq = NULL; 746 } 747 spin_unlock_bh(&priv->sta_lock); 748} 749 750#ifdef CONFIG_IWLWIFI_DEBUG 751static void iwl_dump_lq_cmd(struct iwl_priv *priv, 752 struct iwl_link_quality_cmd *lq) 753{ 754 int i; 755 IWL_DEBUG_RATE(priv, "lq station id 0x%x\n", lq->sta_id); 756 IWL_DEBUG_RATE(priv, "lq ant 0x%X 0x%X\n", 757 lq->general_params.single_stream_ant_msk, 758 lq->general_params.dual_stream_ant_msk); 759 760 for (i = 0; i < LINK_QUAL_MAX_RETRY_NUM; i++) 761 IWL_DEBUG_RATE(priv, "lq index %d 0x%X\n", 762 i, lq->rs_table[i].rate_n_flags); 763} 764#else 765static inline void iwl_dump_lq_cmd(struct iwl_priv *priv, 766 struct iwl_link_quality_cmd *lq) 767{ 768} 769#endif 770 771/* 772 * is_lq_table_valid() - Test one aspect of LQ cmd for validity 773 * 774 * It sometimes happens when a HT rate has been in use and we 775 * loose connectivity with AP then mac80211 will first tell us that the 776 * current channel is not HT anymore before removing the station. In such a 777 * scenario the RXON flags will be updated to indicate we are not 778 * communicating HT anymore, but the LQ command may still contain HT rates. 779 * Test for this to prevent driver from sending LQ command between the time 780 * RXON flags are updated and when LQ command is updated. 781 */ 782static bool is_lq_table_valid(struct iwl_priv *priv, 783 struct iwl_rxon_context *ctx, 784 struct iwl_link_quality_cmd *lq) 785{ 786 int i; 787 788 if (ctx->ht.enabled) 789 return true; 790 791 IWL_DEBUG_INFO(priv, "Channel %u is not an HT channel\n", 792 ctx->active.channel); 793 for (i = 0; i < LINK_QUAL_MAX_RETRY_NUM; i++) { 794 if (le32_to_cpu(lq->rs_table[i].rate_n_flags) & 795 RATE_MCS_HT_MSK) { 796 IWL_DEBUG_INFO(priv, 797 "index %d of LQ expects HT channel\n", 798 i); 799 return false; 800 } 801 } 802 return true; 803} 804 805/* 806 * iwl_send_lq_cmd() - Send link quality command 807 * @init: This command is sent as part of station initialization right 808 * after station has been added. 809 * 810 * The link quality command is sent as the last step of station creation. 811 * This is the special case in which init is set and we call a callback in 812 * this case to clear the state indicating that station creation is in 813 * progress. 814 */ 815int iwl_send_lq_cmd(struct iwl_priv *priv, struct iwl_rxon_context *ctx, 816 struct iwl_link_quality_cmd *lq, u8 flags, bool init) 817{ 818 int ret = 0; 819 struct iwl_host_cmd cmd = { 820 .id = REPLY_TX_LINK_QUALITY_CMD, 821 .len = { sizeof(struct iwl_link_quality_cmd), }, 822 .flags = flags, 823 .data = { lq, }, 824 }; 825 826 if (WARN_ON(lq->sta_id == IWL_INVALID_STATION)) 827 return -EINVAL; 828 829 830 spin_lock_bh(&priv->sta_lock); 831 if (!(priv->stations[lq->sta_id].used & IWL_STA_DRIVER_ACTIVE)) { 832 spin_unlock_bh(&priv->sta_lock); 833 return -EINVAL; 834 } 835 spin_unlock_bh(&priv->sta_lock); 836 837 iwl_dump_lq_cmd(priv, lq); 838 if (WARN_ON(init && (cmd.flags & CMD_ASYNC))) 839 return -EINVAL; 840 841 if (is_lq_table_valid(priv, ctx, lq)) 842 ret = iwl_dvm_send_cmd(priv, &cmd); 843 else 844 ret = -EINVAL; 845 846 if (cmd.flags & CMD_ASYNC) 847 return ret; 848 849 if (init) { 850 IWL_DEBUG_INFO(priv, "init LQ command complete, " 851 "clearing sta addition status for sta %d\n", 852 lq->sta_id); 853 spin_lock_bh(&priv->sta_lock); 854 priv->stations[lq->sta_id].used &= ~IWL_STA_UCODE_INPROGRESS; 855 spin_unlock_bh(&priv->sta_lock); 856 } 857 return ret; 858} 859 860 861static struct iwl_link_quality_cmd * 862iwl_sta_alloc_lq(struct iwl_priv *priv, struct iwl_rxon_context *ctx, 863 u8 sta_id) 864{ 865 struct iwl_link_quality_cmd *link_cmd; 866 867 link_cmd = kzalloc(sizeof(struct iwl_link_quality_cmd), GFP_KERNEL); 868 if (!link_cmd) { 869 IWL_ERR(priv, "Unable to allocate memory for LQ cmd.\n"); 870 return NULL; 871 } 872 873 iwl_sta_fill_lq(priv, ctx, sta_id, link_cmd); 874 875 return link_cmd; 876} 877 878/* 879 * iwlagn_add_bssid_station - Add the special IBSS BSSID station 880 * 881 * Function sleeps. 882 */ 883int iwlagn_add_bssid_station(struct iwl_priv *priv, 884 struct iwl_rxon_context *ctx, 885 const u8 *addr, u8 *sta_id_r) 886{ 887 int ret; 888 u8 sta_id; 889 struct iwl_link_quality_cmd *link_cmd; 890 891 if (sta_id_r) 892 *sta_id_r = IWL_INVALID_STATION; 893 894 ret = iwl_add_station_common(priv, ctx, addr, 0, NULL, &sta_id); 895 if (ret) { 896 IWL_ERR(priv, "Unable to add station %pM\n", addr); 897 return ret; 898 } 899 900 if (sta_id_r) 901 *sta_id_r = sta_id; 902 903 spin_lock_bh(&priv->sta_lock); 904 priv->stations[sta_id].used |= IWL_STA_LOCAL; 905 spin_unlock_bh(&priv->sta_lock); 906 907 /* Set up default rate scaling table in device's station table */ 908 link_cmd = iwl_sta_alloc_lq(priv, ctx, sta_id); 909 if (!link_cmd) { 910 IWL_ERR(priv, 911 "Unable to initialize rate scaling for station %pM.\n", 912 addr); 913 return -ENOMEM; 914 } 915 916 ret = iwl_send_lq_cmd(priv, ctx, link_cmd, 0, true); 917 if (ret) 918 IWL_ERR(priv, "Link quality command failed (%d)\n", ret); 919 920 spin_lock_bh(&priv->sta_lock); 921 priv->stations[sta_id].lq = link_cmd; 922 spin_unlock_bh(&priv->sta_lock); 923 924 return 0; 925} 926 927/* 928 * static WEP keys 929 * 930 * For each context, the device has a table of 4 static WEP keys 931 * (one for each key index) that is updated with the following 932 * commands. 933 */ 934 935static int iwl_send_static_wepkey_cmd(struct iwl_priv *priv, 936 struct iwl_rxon_context *ctx, 937 bool send_if_empty) 938{ 939 int i, not_empty = 0; 940 u8 buff[sizeof(struct iwl_wep_cmd) + 941 sizeof(struct iwl_wep_key) * WEP_KEYS_MAX]; 942 struct iwl_wep_cmd *wep_cmd = (struct iwl_wep_cmd *)buff; 943 size_t cmd_size = sizeof(struct iwl_wep_cmd); 944 struct iwl_host_cmd cmd = { 945 .id = ctx->wep_key_cmd, 946 .data = { wep_cmd, }, 947 }; 948 949 might_sleep(); 950 951 memset(wep_cmd, 0, cmd_size + 952 (sizeof(struct iwl_wep_key) * WEP_KEYS_MAX)); 953 954 for (i = 0; i < WEP_KEYS_MAX ; i++) { 955 wep_cmd->key[i].key_index = i; 956 if (ctx->wep_keys[i].key_size) { 957 wep_cmd->key[i].key_offset = i; 958 not_empty = 1; 959 } else { 960 wep_cmd->key[i].key_offset = WEP_INVALID_OFFSET; 961 } 962 963 wep_cmd->key[i].key_size = ctx->wep_keys[i].key_size; 964 memcpy(&wep_cmd->key[i].key[3], ctx->wep_keys[i].key, 965 ctx->wep_keys[i].key_size); 966 } 967 968 wep_cmd->global_key_type = WEP_KEY_WEP_TYPE; 969 wep_cmd->num_keys = WEP_KEYS_MAX; 970 971 cmd_size += sizeof(struct iwl_wep_key) * WEP_KEYS_MAX; 972 973 cmd.len[0] = cmd_size; 974 975 if (not_empty || send_if_empty) 976 return iwl_dvm_send_cmd(priv, &cmd); 977 else 978 return 0; 979} 980 981int iwl_restore_default_wep_keys(struct iwl_priv *priv, 982 struct iwl_rxon_context *ctx) 983{ 984 lockdep_assert_held(&priv->mutex); 985 986 return iwl_send_static_wepkey_cmd(priv, ctx, false); 987} 988 989int iwl_remove_default_wep_key(struct iwl_priv *priv, 990 struct iwl_rxon_context *ctx, 991 struct ieee80211_key_conf *keyconf) 992{ 993 int ret; 994 995 lockdep_assert_held(&priv->mutex); 996 997 IWL_DEBUG_WEP(priv, "Removing default WEP key: idx=%d\n", 998 keyconf->keyidx); 999 1000 memset(&ctx->wep_keys[keyconf->keyidx], 0, sizeof(ctx->wep_keys[0])); 1001 if (iwl_is_rfkill(priv)) { 1002 IWL_DEBUG_WEP(priv, 1003 "Not sending REPLY_WEPKEY command due to RFKILL.\n"); 1004 /* but keys in device are clear anyway so return success */ 1005 return 0; 1006 } 1007 ret = iwl_send_static_wepkey_cmd(priv, ctx, 1); 1008 IWL_DEBUG_WEP(priv, "Remove default WEP key: idx=%d ret=%d\n", 1009 keyconf->keyidx, ret); 1010 1011 return ret; 1012} 1013 1014int iwl_set_default_wep_key(struct iwl_priv *priv, 1015 struct iwl_rxon_context *ctx, 1016 struct ieee80211_key_conf *keyconf) 1017{ 1018 int ret; 1019 1020 lockdep_assert_held(&priv->mutex); 1021 1022 if (keyconf->keylen != WEP_KEY_LEN_128 && 1023 keyconf->keylen != WEP_KEY_LEN_64) { 1024 IWL_DEBUG_WEP(priv, 1025 "Bad WEP key length %d\n", keyconf->keylen); 1026 return -EINVAL; 1027 } 1028 1029 keyconf->hw_key_idx = IWLAGN_HW_KEY_DEFAULT; 1030 1031 ctx->wep_keys[keyconf->keyidx].key_size = keyconf->keylen; 1032 memcpy(&ctx->wep_keys[keyconf->keyidx].key, &keyconf->key, 1033 keyconf->keylen); 1034 1035 ret = iwl_send_static_wepkey_cmd(priv, ctx, false); 1036 IWL_DEBUG_WEP(priv, "Set default WEP key: len=%d idx=%d ret=%d\n", 1037 keyconf->keylen, keyconf->keyidx, ret); 1038 1039 return ret; 1040} 1041 1042/* 1043 * dynamic (per-station) keys 1044 * 1045 * The dynamic keys are a little more complicated. The device has 1046 * a key cache of up to STA_KEY_MAX_NUM/STA_KEY_MAX_NUM_PAN keys. 1047 * These are linked to stations by a table that contains an index 1048 * into the key table for each station/key index/{mcast,unicast}, 1049 * i.e. it's basically an array of pointers like this: 1050 * key_offset_t key_mapping[NUM_STATIONS][4][2]; 1051 * (it really works differently, but you can think of it as such) 1052 * 1053 * The key uploading and linking happens in the same command, the 1054 * add station command with STA_MODIFY_KEY_MASK. 1055 */ 1056 1057static u8 iwlagn_key_sta_id(struct iwl_priv *priv, 1058 struct ieee80211_vif *vif, 1059 struct ieee80211_sta *sta) 1060{ 1061 struct iwl_vif_priv *vif_priv = (void *)vif->drv_priv; 1062 1063 if (sta) 1064 return iwl_sta_id(sta); 1065 1066 /* 1067 * The device expects GTKs for station interfaces to be 1068 * installed as GTKs for the AP station. If we have no 1069 * station ID, then use the ap_sta_id in that case. 1070 */ 1071 if (vif->type == NL80211_IFTYPE_STATION && vif_priv->ctx) 1072 return vif_priv->ctx->ap_sta_id; 1073 1074 return IWL_INVALID_STATION; 1075} 1076 1077static int iwlagn_send_sta_key(struct iwl_priv *priv, 1078 struct ieee80211_key_conf *keyconf, 1079 u8 sta_id, u32 tkip_iv32, u16 *tkip_p1k, 1080 u32 cmd_flags) 1081{ 1082 __le16 key_flags; 1083 struct iwl_addsta_cmd sta_cmd; 1084 int i; 1085 1086 spin_lock_bh(&priv->sta_lock); 1087 memcpy(&sta_cmd, &priv->stations[sta_id].sta, sizeof(sta_cmd)); 1088 spin_unlock_bh(&priv->sta_lock); 1089 1090 key_flags = cpu_to_le16(keyconf->keyidx << STA_KEY_FLG_KEYID_POS); 1091 key_flags |= STA_KEY_FLG_MAP_KEY_MSK; 1092 1093 switch (keyconf->cipher) { 1094 case WLAN_CIPHER_SUITE_CCMP: 1095 key_flags |= STA_KEY_FLG_CCMP; 1096 memcpy(sta_cmd.key.key, keyconf->key, keyconf->keylen); 1097 break; 1098 case WLAN_CIPHER_SUITE_TKIP: 1099 key_flags |= STA_KEY_FLG_TKIP; 1100 sta_cmd.key.tkip_rx_tsc_byte2 = tkip_iv32; 1101 for (i = 0; i < 5; i++) 1102 sta_cmd.key.tkip_rx_ttak[i] = cpu_to_le16(tkip_p1k[i]); 1103 memcpy(sta_cmd.key.key, keyconf->key, keyconf->keylen); 1104 break; 1105 case WLAN_CIPHER_SUITE_WEP104: 1106 key_flags |= STA_KEY_FLG_KEY_SIZE_MSK; 1107 fallthrough; 1108 case WLAN_CIPHER_SUITE_WEP40: 1109 key_flags |= STA_KEY_FLG_WEP; 1110 memcpy(&sta_cmd.key.key[3], keyconf->key, keyconf->keylen); 1111 break; 1112 default: 1113 WARN_ON(1); 1114 return -EINVAL; 1115 } 1116 1117 if (!(keyconf->flags & IEEE80211_KEY_FLAG_PAIRWISE)) 1118 key_flags |= STA_KEY_MULTICAST_MSK; 1119 1120 /* key pointer (offset) */ 1121 sta_cmd.key.key_offset = keyconf->hw_key_idx; 1122 1123 sta_cmd.key.key_flags = key_flags; 1124 sta_cmd.mode = STA_CONTROL_MODIFY_MSK; 1125 sta_cmd.sta.modify_mask = STA_MODIFY_KEY_MASK; 1126 1127 return iwl_send_add_sta(priv, &sta_cmd, cmd_flags); 1128} 1129 1130void iwl_update_tkip_key(struct iwl_priv *priv, 1131 struct ieee80211_vif *vif, 1132 struct ieee80211_key_conf *keyconf, 1133 struct ieee80211_sta *sta, u32 iv32, u16 *phase1key) 1134{ 1135 u8 sta_id = iwlagn_key_sta_id(priv, vif, sta); 1136 1137 if (sta_id == IWL_INVALID_STATION) 1138 return; 1139 1140 if (iwl_scan_cancel(priv)) { 1141 /* cancel scan failed, just live w/ bad key and rely 1142 briefly on SW decryption */ 1143 return; 1144 } 1145 1146 iwlagn_send_sta_key(priv, keyconf, sta_id, 1147 iv32, phase1key, CMD_ASYNC); 1148} 1149 1150int iwl_remove_dynamic_key(struct iwl_priv *priv, 1151 struct iwl_rxon_context *ctx, 1152 struct ieee80211_key_conf *keyconf, 1153 struct ieee80211_sta *sta) 1154{ 1155 struct iwl_addsta_cmd sta_cmd; 1156 u8 sta_id = iwlagn_key_sta_id(priv, ctx->vif, sta); 1157 __le16 key_flags; 1158 1159 /* if station isn't there, neither is the key */ 1160 if (sta_id == IWL_INVALID_STATION) 1161 return -ENOENT; 1162 1163 spin_lock_bh(&priv->sta_lock); 1164 memcpy(&sta_cmd, &priv->stations[sta_id].sta, sizeof(sta_cmd)); 1165 if (!(priv->stations[sta_id].used & IWL_STA_UCODE_ACTIVE)) 1166 sta_id = IWL_INVALID_STATION; 1167 spin_unlock_bh(&priv->sta_lock); 1168 1169 if (sta_id == IWL_INVALID_STATION) 1170 return 0; 1171 1172 lockdep_assert_held(&priv->mutex); 1173 1174 ctx->key_mapping_keys--; 1175 1176 IWL_DEBUG_WEP(priv, "Remove dynamic key: idx=%d sta=%d\n", 1177 keyconf->keyidx, sta_id); 1178 1179 if (!test_and_clear_bit(keyconf->hw_key_idx, &priv->ucode_key_table)) 1180 IWL_ERR(priv, "offset %d not used in uCode key table.\n", 1181 keyconf->hw_key_idx); 1182 1183 key_flags = cpu_to_le16(keyconf->keyidx << STA_KEY_FLG_KEYID_POS); 1184 key_flags |= STA_KEY_FLG_MAP_KEY_MSK | STA_KEY_FLG_NO_ENC | 1185 STA_KEY_FLG_INVALID; 1186 1187 if (!(keyconf->flags & IEEE80211_KEY_FLAG_PAIRWISE)) 1188 key_flags |= STA_KEY_MULTICAST_MSK; 1189 1190 sta_cmd.key.key_flags = key_flags; 1191 sta_cmd.key.key_offset = keyconf->hw_key_idx; 1192 sta_cmd.sta.modify_mask = STA_MODIFY_KEY_MASK; 1193 sta_cmd.mode = STA_CONTROL_MODIFY_MSK; 1194 1195 return iwl_send_add_sta(priv, &sta_cmd, 0); 1196} 1197 1198int iwl_set_dynamic_key(struct iwl_priv *priv, 1199 struct iwl_rxon_context *ctx, 1200 struct ieee80211_key_conf *keyconf, 1201 struct ieee80211_sta *sta) 1202{ 1203 struct ieee80211_key_seq seq; 1204 u16 p1k[5]; 1205 int ret; 1206 u8 sta_id = iwlagn_key_sta_id(priv, ctx->vif, sta); 1207 const u8 *addr; 1208 1209 if (sta_id == IWL_INVALID_STATION) 1210 return -EINVAL; 1211 1212 lockdep_assert_held(&priv->mutex); 1213 1214 keyconf->hw_key_idx = iwl_get_free_ucode_key_offset(priv); 1215 if (keyconf->hw_key_idx == WEP_INVALID_OFFSET) 1216 return -ENOSPC; 1217 1218 ctx->key_mapping_keys++; 1219 1220 switch (keyconf->cipher) { 1221 case WLAN_CIPHER_SUITE_TKIP: 1222 if (sta) 1223 addr = sta->addr; 1224 else /* station mode case only */ 1225 addr = ctx->active.bssid_addr; 1226 1227 /* pre-fill phase 1 key into device cache */ 1228 ieee80211_get_key_rx_seq(keyconf, 0, &seq); 1229 ieee80211_get_tkip_rx_p1k(keyconf, addr, seq.tkip.iv32, p1k); 1230 ret = iwlagn_send_sta_key(priv, keyconf, sta_id, 1231 seq.tkip.iv32, p1k, 0); 1232 break; 1233 case WLAN_CIPHER_SUITE_CCMP: 1234 case WLAN_CIPHER_SUITE_WEP40: 1235 case WLAN_CIPHER_SUITE_WEP104: 1236 ret = iwlagn_send_sta_key(priv, keyconf, sta_id, 1237 0, NULL, 0); 1238 break; 1239 default: 1240 IWL_ERR(priv, "Unknown cipher %x\n", keyconf->cipher); 1241 ret = -EINVAL; 1242 } 1243 1244 if (ret) { 1245 ctx->key_mapping_keys--; 1246 clear_bit(keyconf->hw_key_idx, &priv->ucode_key_table); 1247 } 1248 1249 IWL_DEBUG_WEP(priv, "Set dynamic key: cipher=%x len=%d idx=%d sta=%pM ret=%d\n", 1250 keyconf->cipher, keyconf->keylen, keyconf->keyidx, 1251 sta ? sta->addr : NULL, ret); 1252 1253 return ret; 1254} 1255 1256/* 1257 * iwlagn_alloc_bcast_station - add broadcast station into driver's station table. 1258 * 1259 * This adds the broadcast station into the driver's station table 1260 * and marks it driver active, so that it will be restored to the 1261 * device at the next best time. 1262 */ 1263int iwlagn_alloc_bcast_station(struct iwl_priv *priv, 1264 struct iwl_rxon_context *ctx) 1265{ 1266 struct iwl_link_quality_cmd *link_cmd; 1267 u8 sta_id; 1268 1269 spin_lock_bh(&priv->sta_lock); 1270 sta_id = iwl_prep_station(priv, ctx, iwl_bcast_addr, false, NULL); 1271 if (sta_id == IWL_INVALID_STATION) { 1272 IWL_ERR(priv, "Unable to prepare broadcast station\n"); 1273 spin_unlock_bh(&priv->sta_lock); 1274 1275 return -EINVAL; 1276 } 1277 1278 priv->stations[sta_id].used |= IWL_STA_DRIVER_ACTIVE; 1279 priv->stations[sta_id].used |= IWL_STA_BCAST; 1280 spin_unlock_bh(&priv->sta_lock); 1281 1282 link_cmd = iwl_sta_alloc_lq(priv, ctx, sta_id); 1283 if (!link_cmd) { 1284 IWL_ERR(priv, 1285 "Unable to initialize rate scaling for bcast station.\n"); 1286 return -ENOMEM; 1287 } 1288 1289 spin_lock_bh(&priv->sta_lock); 1290 priv->stations[sta_id].lq = link_cmd; 1291 spin_unlock_bh(&priv->sta_lock); 1292 1293 return 0; 1294} 1295 1296/* 1297 * iwl_update_bcast_station - update broadcast station's LQ command 1298 * 1299 * Only used by iwlagn. Placed here to have all bcast station management 1300 * code together. 1301 */ 1302int iwl_update_bcast_station(struct iwl_priv *priv, 1303 struct iwl_rxon_context *ctx) 1304{ 1305 struct iwl_link_quality_cmd *link_cmd; 1306 u8 sta_id = ctx->bcast_sta_id; 1307 1308 link_cmd = iwl_sta_alloc_lq(priv, ctx, sta_id); 1309 if (!link_cmd) { 1310 IWL_ERR(priv, "Unable to initialize rate scaling for bcast station.\n"); 1311 return -ENOMEM; 1312 } 1313 1314 spin_lock_bh(&priv->sta_lock); 1315 if (priv->stations[sta_id].lq) 1316 kfree(priv->stations[sta_id].lq); 1317 else 1318 IWL_DEBUG_INFO(priv, "Bcast station rate scaling has not been initialized yet.\n"); 1319 priv->stations[sta_id].lq = link_cmd; 1320 spin_unlock_bh(&priv->sta_lock); 1321 1322 return 0; 1323} 1324 1325int iwl_update_bcast_stations(struct iwl_priv *priv) 1326{ 1327 struct iwl_rxon_context *ctx; 1328 int ret = 0; 1329 1330 for_each_context(priv, ctx) { 1331 ret = iwl_update_bcast_station(priv, ctx); 1332 if (ret) 1333 break; 1334 } 1335 1336 return ret; 1337} 1338 1339/* 1340 * iwl_sta_tx_modify_enable_tid - Enable Tx for this TID in station table 1341 */ 1342int iwl_sta_tx_modify_enable_tid(struct iwl_priv *priv, int sta_id, int tid) 1343{ 1344 struct iwl_addsta_cmd sta_cmd; 1345 1346 lockdep_assert_held(&priv->mutex); 1347 1348 /* Remove "disable" flag, to enable Tx for this TID */ 1349 spin_lock_bh(&priv->sta_lock); 1350 priv->stations[sta_id].sta.sta.modify_mask = STA_MODIFY_TID_DISABLE_TX; 1351 priv->stations[sta_id].sta.tid_disable_tx &= cpu_to_le16(~(1 << tid)); 1352 priv->stations[sta_id].sta.mode = STA_CONTROL_MODIFY_MSK; 1353 memcpy(&sta_cmd, &priv->stations[sta_id].sta, sizeof(struct iwl_addsta_cmd)); 1354 spin_unlock_bh(&priv->sta_lock); 1355 1356 return iwl_send_add_sta(priv, &sta_cmd, 0); 1357} 1358 1359int iwl_sta_rx_agg_start(struct iwl_priv *priv, struct ieee80211_sta *sta, 1360 int tid, u16 ssn) 1361{ 1362 int sta_id; 1363 struct iwl_addsta_cmd sta_cmd; 1364 1365 lockdep_assert_held(&priv->mutex); 1366 1367 sta_id = iwl_sta_id(sta); 1368 if (sta_id == IWL_INVALID_STATION) 1369 return -ENXIO; 1370 1371 spin_lock_bh(&priv->sta_lock); 1372 priv->stations[sta_id].sta.station_flags_msk = 0; 1373 priv->stations[sta_id].sta.sta.modify_mask = STA_MODIFY_ADDBA_TID_MSK; 1374 priv->stations[sta_id].sta.add_immediate_ba_tid = (u8)tid; 1375 priv->stations[sta_id].sta.add_immediate_ba_ssn = cpu_to_le16(ssn); 1376 priv->stations[sta_id].sta.mode = STA_CONTROL_MODIFY_MSK; 1377 memcpy(&sta_cmd, &priv->stations[sta_id].sta, sizeof(struct iwl_addsta_cmd)); 1378 spin_unlock_bh(&priv->sta_lock); 1379 1380 return iwl_send_add_sta(priv, &sta_cmd, 0); 1381} 1382 1383int iwl_sta_rx_agg_stop(struct iwl_priv *priv, struct ieee80211_sta *sta, 1384 int tid) 1385{ 1386 int sta_id; 1387 struct iwl_addsta_cmd sta_cmd; 1388 1389 lockdep_assert_held(&priv->mutex); 1390 1391 sta_id = iwl_sta_id(sta); 1392 if (sta_id == IWL_INVALID_STATION) { 1393 IWL_ERR(priv, "Invalid station for AGG tid %d\n", tid); 1394 return -ENXIO; 1395 } 1396 1397 spin_lock_bh(&priv->sta_lock); 1398 priv->stations[sta_id].sta.station_flags_msk = 0; 1399 priv->stations[sta_id].sta.sta.modify_mask = STA_MODIFY_DELBA_TID_MSK; 1400 priv->stations[sta_id].sta.remove_immediate_ba_tid = (u8)tid; 1401 priv->stations[sta_id].sta.mode = STA_CONTROL_MODIFY_MSK; 1402 memcpy(&sta_cmd, &priv->stations[sta_id].sta, sizeof(struct iwl_addsta_cmd)); 1403 spin_unlock_bh(&priv->sta_lock); 1404 1405 return iwl_send_add_sta(priv, &sta_cmd, 0); 1406} 1407 1408 1409 1410void iwl_sta_modify_sleep_tx_count(struct iwl_priv *priv, int sta_id, int cnt) 1411{ 1412 struct iwl_addsta_cmd cmd = { 1413 .mode = STA_CONTROL_MODIFY_MSK, 1414 .station_flags = STA_FLG_PWR_SAVE_MSK, 1415 .station_flags_msk = STA_FLG_PWR_SAVE_MSK, 1416 .sta.sta_id = sta_id, 1417 .sta.modify_mask = STA_MODIFY_SLEEP_TX_COUNT_MSK, 1418 .sleep_tx_count = cpu_to_le16(cnt), 1419 }; 1420 1421 iwl_send_add_sta(priv, &cmd, CMD_ASYNC); 1422}