1/****************************************************************************** 2 * 3 * This file is provided under a dual BSD/GPLv2 license. When using or 4 * redistributing this file, you may do so under either license. 5 * 6 * GPL LICENSE SUMMARY 7 * 8 * Copyright(c) 2012 - 2014 Intel Corporation. All rights reserved. 9 * Copyright(c) 2013 - 2014 Intel Mobile Communications GmbH 10 * 11 * This program is free software; you can redistribute it and/or modify 12 * it under the terms of version 2 of the GNU General Public License as 13 * published by the Free Software Foundation. 14 * 15 * This program is distributed in the hope that it will be useful, but 16 * WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 18 * General Public License for more details. 19 * 20 * You should have received a copy of the GNU General Public License 21 * along with this program; if not, write to the Free Software 22 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110, 23 * USA 24 * 25 * The full GNU General Public License is included in this distribution 26 * in the file called COPYING. 27 * 28 * Contact Information: 29 * Intel Linux Wireless <ilw@linux.intel.com> 30 * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 31 * 32 * BSD LICENSE 33 * 34 * Copyright(c) 2012 - 2014 Intel Corporation. All rights reserved. 35 * Copyright(c) 2013 - 2014 Intel Mobile Communications GmbH 36 * All rights reserved. 37 * 38 * Redistribution and use in source and binary forms, with or without 39 * modification, are permitted provided that the following conditions 40 * are met: 41 * 42 * * Redistributions of source code must retain the above copyright 43 * notice, this list of conditions and the following disclaimer. 44 * * Redistributions in binary form must reproduce the above copyright 45 * notice, this list of conditions and the following disclaimer in 46 * the documentation and/or other materials provided with the 47 * distribution. 48 * * Neither the name Intel Corporation nor the names of its 49 * contributors may be used to endorse or promote products derived 50 * from this software without specific prior written permission. 51 * 52 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 53 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 54 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 55 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 56 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 57 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 58 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 59 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 60 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 61 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 62 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 63 * 64 *****************************************************************************/ 65#include <linux/kernel.h> 66#include <linux/slab.h> 67#include <linux/skbuff.h> 68#include <linux/netdevice.h> 69#include <linux/etherdevice.h> 70#include <linux/ip.h> 71#include <linux/if_arp.h> 72#include <net/mac80211.h> 73#include <net/ieee80211_radiotap.h> 74#include <net/tcp.h> 75 76#include "iwl-op-mode.h" 77#include "iwl-io.h" 78#include "mvm.h" 79#include "sta.h" 80#include "time-event.h" 81#include "iwl-eeprom-parse.h" 82#include "fw-api-scan.h" 83#include "iwl-phy-db.h" 84#include "testmode.h" 85#include "iwl-fw-error-dump.h" 86#include "iwl-prph.h" 87 88static const struct ieee80211_iface_limit iwl_mvm_limits[] = { 89 { 90 .max = 1, 91 .types = BIT(NL80211_IFTYPE_STATION), 92 }, 93 { 94 .max = 1, 95 .types = BIT(NL80211_IFTYPE_AP) | 96 BIT(NL80211_IFTYPE_P2P_CLIENT) | 97 BIT(NL80211_IFTYPE_P2P_GO), 98 }, 99 { 100 .max = 1, 101 .types = BIT(NL80211_IFTYPE_P2P_DEVICE), 102 }, 103}; 104 105static const struct ieee80211_iface_combination iwl_mvm_iface_combinations[] = { 106 { 107 .num_different_channels = 1, 108 .max_interfaces = 3, 109 .limits = iwl_mvm_limits, 110 .n_limits = ARRAY_SIZE(iwl_mvm_limits), 111 }, 112}; 113 114#ifdef CONFIG_PM_SLEEP 115static const struct nl80211_wowlan_tcp_data_token_feature 116iwl_mvm_wowlan_tcp_token_feature = { 117 .min_len = 0, 118 .max_len = 255, 119 .bufsize = IWL_WOWLAN_REMOTE_WAKE_MAX_TOKENS, 120}; 121 122static const struct wiphy_wowlan_tcp_support iwl_mvm_wowlan_tcp_support = { 123 .tok = &iwl_mvm_wowlan_tcp_token_feature, 124 .data_payload_max = IWL_WOWLAN_TCP_MAX_PACKET_LEN - 125 sizeof(struct ethhdr) - 126 sizeof(struct iphdr) - 127 sizeof(struct tcphdr), 128 .data_interval_max = 65535, /* __le16 in API */ 129 .wake_payload_max = IWL_WOWLAN_REMOTE_WAKE_MAX_PACKET_LEN - 130 sizeof(struct ethhdr) - 131 sizeof(struct iphdr) - 132 sizeof(struct tcphdr), 133 .seq = true, 134}; 135#endif 136 137#ifdef CONFIG_IWLWIFI_BCAST_FILTERING 138/* 139 * Use the reserved field to indicate magic values. 140 * these values will only be used internally by the driver, 141 * and won't make it to the fw (reserved will be 0). 142 * BC_FILTER_MAGIC_IP - configure the val of this attribute to 143 * be the vif's ip address. in case there is not a single 144 * ip address (0, or more than 1), this attribute will 145 * be skipped. 146 * BC_FILTER_MAGIC_MAC - set the val of this attribute to 147 * the LSB bytes of the vif's mac address 148 */ 149enum { 150 BC_FILTER_MAGIC_NONE = 0, 151 BC_FILTER_MAGIC_IP, 152 BC_FILTER_MAGIC_MAC, 153}; 154 155static const struct iwl_fw_bcast_filter iwl_mvm_default_bcast_filters[] = { 156 { 157 /* arp */ 158 .discard = 0, 159 .frame_type = BCAST_FILTER_FRAME_TYPE_ALL, 160 .attrs = { 161 { 162 /* frame type - arp, hw type - ethernet */ 163 .offset_type = 164 BCAST_FILTER_OFFSET_PAYLOAD_START, 165 .offset = sizeof(rfc1042_header), 166 .val = cpu_to_be32(0x08060001), 167 .mask = cpu_to_be32(0xffffffff), 168 }, 169 { 170 /* arp dest ip */ 171 .offset_type = 172 BCAST_FILTER_OFFSET_PAYLOAD_START, 173 .offset = sizeof(rfc1042_header) + 2 + 174 sizeof(struct arphdr) + 175 ETH_ALEN + sizeof(__be32) + 176 ETH_ALEN, 177 .mask = cpu_to_be32(0xffffffff), 178 /* mark it as special field */ 179 .reserved1 = cpu_to_le16(BC_FILTER_MAGIC_IP), 180 }, 181 }, 182 }, 183 { 184 /* dhcp offer bcast */ 185 .discard = 0, 186 .frame_type = BCAST_FILTER_FRAME_TYPE_IPV4, 187 .attrs = { 188 { 189 /* udp dest port - 68 (bootp client)*/ 190 .offset_type = BCAST_FILTER_OFFSET_IP_END, 191 .offset = offsetof(struct udphdr, dest), 192 .val = cpu_to_be32(0x00440000), 193 .mask = cpu_to_be32(0xffff0000), 194 }, 195 { 196 /* dhcp - lsb bytes of client hw address */ 197 .offset_type = BCAST_FILTER_OFFSET_IP_END, 198 .offset = 38, 199 .mask = cpu_to_be32(0xffffffff), 200 /* mark it as special field */ 201 .reserved1 = cpu_to_le16(BC_FILTER_MAGIC_MAC), 202 }, 203 }, 204 }, 205 /* last filter must be empty */ 206 {}, 207}; 208#endif 209 210void iwl_mvm_ref(struct iwl_mvm *mvm, enum iwl_mvm_ref_type ref_type) 211{ 212 if (!iwl_mvm_is_d0i3_supported(mvm)) 213 return; 214 215 IWL_DEBUG_RPM(mvm, "Take mvm reference - type %d\n", ref_type); 216 spin_lock_bh(&mvm->refs_lock); 217 mvm->refs[ref_type]++; 218 spin_unlock_bh(&mvm->refs_lock); 219 iwl_trans_ref(mvm->trans); 220} 221 222void iwl_mvm_unref(struct iwl_mvm *mvm, enum iwl_mvm_ref_type ref_type) 223{ 224 if (!iwl_mvm_is_d0i3_supported(mvm)) 225 return; 226 227 IWL_DEBUG_RPM(mvm, "Leave mvm reference - type %d\n", ref_type); 228 spin_lock_bh(&mvm->refs_lock); 229 WARN_ON(!mvm->refs[ref_type]--); 230 spin_unlock_bh(&mvm->refs_lock); 231 iwl_trans_unref(mvm->trans); 232} 233 234static void iwl_mvm_unref_all_except(struct iwl_mvm *mvm, 235 enum iwl_mvm_ref_type except_ref) 236{ 237 int i, j; 238 239 if (!iwl_mvm_is_d0i3_supported(mvm)) 240 return; 241 242 spin_lock_bh(&mvm->refs_lock); 243 for (i = 0; i < IWL_MVM_REF_COUNT; i++) { 244 if (except_ref == i || !mvm->refs[i]) 245 continue; 246 247 IWL_DEBUG_RPM(mvm, "Cleanup: remove mvm ref type %d (%d)\n", 248 i, mvm->refs[i]); 249 for (j = 0; j < mvm->refs[i]; j++) 250 iwl_trans_unref(mvm->trans); 251 mvm->refs[i] = 0; 252 } 253 spin_unlock_bh(&mvm->refs_lock); 254} 255 256int iwl_mvm_ref_sync(struct iwl_mvm *mvm, enum iwl_mvm_ref_type ref_type) 257{ 258 iwl_mvm_ref(mvm, ref_type); 259 260 if (!wait_event_timeout(mvm->d0i3_exit_waitq, 261 !test_bit(IWL_MVM_STATUS_IN_D0I3, &mvm->status), 262 HZ)) { 263 WARN_ON_ONCE(1); 264 iwl_mvm_unref(mvm, ref_type); 265 return -EIO; 266 } 267 268 return 0; 269} 270 271static void iwl_mvm_reset_phy_ctxts(struct iwl_mvm *mvm) 272{ 273 int i; 274 275 memset(mvm->phy_ctxts, 0, sizeof(mvm->phy_ctxts)); 276 for (i = 0; i < NUM_PHY_CTX; i++) { 277 mvm->phy_ctxts[i].id = i; 278 mvm->phy_ctxts[i].ref = 0; 279 } 280} 281 282int iwl_mvm_mac_setup_register(struct iwl_mvm *mvm) 283{ 284 struct ieee80211_hw *hw = mvm->hw; 285 int num_mac, ret, i; 286 287 /* Tell mac80211 our characteristics */ 288 hw->flags = IEEE80211_HW_SIGNAL_DBM | 289 IEEE80211_HW_SPECTRUM_MGMT | 290 IEEE80211_HW_REPORTS_TX_ACK_STATUS | 291 IEEE80211_HW_QUEUE_CONTROL | 292 IEEE80211_HW_WANT_MONITOR_VIF | 293 IEEE80211_HW_SUPPORTS_PS | 294 IEEE80211_HW_SUPPORTS_DYNAMIC_PS | 295 IEEE80211_HW_AMPDU_AGGREGATION | 296 IEEE80211_HW_TIMING_BEACON_ONLY | 297 IEEE80211_HW_CONNECTION_MONITOR | 298 IEEE80211_HW_CHANCTX_STA_CSA | 299 IEEE80211_HW_SUPPORTS_CLONED_SKBS; 300 301 hw->queues = mvm->first_agg_queue; 302 hw->offchannel_tx_hw_queue = IWL_MVM_OFFCHANNEL_QUEUE; 303 hw->radiotap_mcs_details |= IEEE80211_RADIOTAP_MCS_HAVE_FEC | 304 IEEE80211_RADIOTAP_MCS_HAVE_STBC; 305 hw->radiotap_vht_details |= IEEE80211_RADIOTAP_VHT_KNOWN_STBC; 306 hw->rate_control_algorithm = "iwl-mvm-rs"; 307 308 /* 309 * Enable 11w if advertised by firmware and software crypto 310 * is not enabled (as the firmware will interpret some mgmt 311 * packets, so enabling it with software crypto isn't safe) 312 */ 313 if (mvm->fw->ucode_capa.flags & IWL_UCODE_TLV_FLAGS_MFP && 314 !iwlwifi_mod_params.sw_crypto) 315 hw->flags |= IEEE80211_HW_MFP_CAPABLE; 316 317 if (mvm->fw->ucode_capa.flags & IWL_UCODE_TLV_FLAGS_UAPSD_SUPPORT && 318 IWL_UCODE_API(mvm->fw->ucode_ver) >= 9 && 319 !iwlwifi_mod_params.uapsd_disable) { 320 hw->flags |= IEEE80211_HW_SUPPORTS_UAPSD; 321 hw->uapsd_queues = IWL_MVM_UAPSD_QUEUES; 322 hw->uapsd_max_sp_len = IWL_UAPSD_MAX_SP; 323 } 324 325 if (mvm->fw->ucode_capa.api[0] & IWL_UCODE_TLV_API_LMAC_SCAN) 326 hw->flags |= IEEE80211_SINGLE_HW_SCAN_ON_ALL_BANDS; 327 328 hw->sta_data_size = sizeof(struct iwl_mvm_sta); 329 hw->vif_data_size = sizeof(struct iwl_mvm_vif); 330 hw->chanctx_data_size = sizeof(u16); 331 332 hw->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) | 333 BIT(NL80211_IFTYPE_P2P_CLIENT) | 334 BIT(NL80211_IFTYPE_AP) | 335 BIT(NL80211_IFTYPE_P2P_GO) | 336 BIT(NL80211_IFTYPE_P2P_DEVICE) | 337 BIT(NL80211_IFTYPE_ADHOC); 338 339 hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN; 340 hw->wiphy->regulatory_flags |= REGULATORY_CUSTOM_REG | 341 REGULATORY_DISABLE_BEACON_HINTS; 342 343 if (mvm->fw->ucode_capa.flags & IWL_UCODE_TLV_FLAGS_GO_UAPSD) 344 hw->wiphy->flags |= WIPHY_FLAG_AP_UAPSD; 345 346 if (mvm->fw->ucode_capa.api[0] & IWL_UCODE_TLV_API_CSA_FLOW) 347 hw->wiphy->flags |= WIPHY_FLAG_HAS_CHANNEL_SWITCH; 348 349 hw->wiphy->iface_combinations = iwl_mvm_iface_combinations; 350 hw->wiphy->n_iface_combinations = 351 ARRAY_SIZE(iwl_mvm_iface_combinations); 352 353 hw->wiphy->max_remain_on_channel_duration = 10000; 354 hw->max_listen_interval = IWL_CONN_MAX_LISTEN_INTERVAL; 355 356 /* Extract MAC address */ 357 memcpy(mvm->addresses[0].addr, mvm->nvm_data->hw_addr, ETH_ALEN); 358 hw->wiphy->addresses = mvm->addresses; 359 hw->wiphy->n_addresses = 1; 360 361 /* Extract additional MAC addresses if available */ 362 num_mac = (mvm->nvm_data->n_hw_addrs > 1) ? 363 min(IWL_MVM_MAX_ADDRESSES, mvm->nvm_data->n_hw_addrs) : 1; 364 365 for (i = 1; i < num_mac; i++) { 366 memcpy(mvm->addresses[i].addr, mvm->addresses[i-1].addr, 367 ETH_ALEN); 368 mvm->addresses[i].addr[5]++; 369 hw->wiphy->n_addresses++; 370 } 371 372 iwl_mvm_reset_phy_ctxts(mvm); 373 374 hw->wiphy->max_scan_ie_len = iwl_mvm_max_scan_ie_len(mvm, false); 375 376 hw->wiphy->max_scan_ssids = PROBE_OPTION_MAX; 377 378 if (mvm->nvm_data->bands[IEEE80211_BAND_2GHZ].n_channels) 379 hw->wiphy->bands[IEEE80211_BAND_2GHZ] = 380 &mvm->nvm_data->bands[IEEE80211_BAND_2GHZ]; 381 if (mvm->nvm_data->bands[IEEE80211_BAND_5GHZ].n_channels) 382 hw->wiphy->bands[IEEE80211_BAND_5GHZ] = 383 &mvm->nvm_data->bands[IEEE80211_BAND_5GHZ]; 384 385 hw->wiphy->hw_version = mvm->trans->hw_id; 386 387 if (iwlmvm_mod_params.power_scheme != IWL_POWER_SCHEME_CAM) 388 hw->wiphy->flags |= WIPHY_FLAG_PS_ON_BY_DEFAULT; 389 else 390 hw->wiphy->flags &= ~WIPHY_FLAG_PS_ON_BY_DEFAULT; 391 392 if (IWL_UCODE_API(mvm->fw->ucode_ver) >= 10) { 393 hw->wiphy->flags |= WIPHY_FLAG_SUPPORTS_SCHED_SCAN; 394 hw->wiphy->max_sched_scan_ssids = PROBE_OPTION_MAX; 395 hw->wiphy->max_match_sets = IWL_SCAN_MAX_PROFILES; 396 /* we create the 802.11 header and zero length SSID IE. */ 397 hw->wiphy->max_sched_scan_ie_len = 398 SCAN_OFFLOAD_PROBE_REQ_SIZE - 24 - 2; 399 } 400 401 hw->wiphy->features |= NL80211_FEATURE_P2P_GO_CTWIN | 402 NL80211_FEATURE_LOW_PRIORITY_SCAN | 403 NL80211_FEATURE_P2P_GO_OPPPS | 404 NL80211_FEATURE_DYNAMIC_SMPS | 405 NL80211_FEATURE_STATIC_SMPS; 406 407 if (mvm->fw->ucode_capa.capa[0] & 408 IWL_UCODE_TLV_CAPA_TXPOWER_INSERTION_SUPPORT) 409 hw->wiphy->features |= NL80211_FEATURE_TX_POWER_INSERTION; 410 if (mvm->fw->ucode_capa.capa[0] & 411 IWL_UCODE_TLV_CAPA_QUIET_PERIOD_SUPPORT) 412 hw->wiphy->features |= NL80211_FEATURE_QUIET; 413 414 if (mvm->fw->ucode_capa.capa[0] & 415 IWL_UCODE_TLV_CAPA_DS_PARAM_SET_IE_SUPPORT) 416 hw->wiphy->features |= 417 NL80211_FEATURE_DS_PARAM_SET_IE_IN_PROBES; 418 419 if (mvm->fw->ucode_capa.capa[0] & 420 IWL_UCODE_TLV_CAPA_WFA_TPC_REP_IE_SUPPORT) 421 hw->wiphy->features |= NL80211_FEATURE_WFA_TPC_IE_IN_PROBES; 422 423 mvm->rts_threshold = IEEE80211_MAX_RTS_THRESHOLD; 424 425 /* currently FW API supports only one optional cipher scheme */ 426 if (mvm->fw->cs[0].cipher) { 427 mvm->hw->n_cipher_schemes = 1; 428 mvm->hw->cipher_schemes = &mvm->fw->cs[0]; 429 } 430 431#ifdef CONFIG_PM_SLEEP 432 if (iwl_mvm_is_d0i3_supported(mvm) && 433 device_can_wakeup(mvm->trans->dev)) { 434 mvm->wowlan.flags = WIPHY_WOWLAN_ANY; 435 hw->wiphy->wowlan = &mvm->wowlan; 436 } else if (mvm->fw->img[IWL_UCODE_WOWLAN].sec[0].len && 437 mvm->trans->ops->d3_suspend && 438 mvm->trans->ops->d3_resume && 439 device_can_wakeup(mvm->trans->dev)) { 440 mvm->wowlan.flags = WIPHY_WOWLAN_MAGIC_PKT | 441 WIPHY_WOWLAN_DISCONNECT | 442 WIPHY_WOWLAN_EAP_IDENTITY_REQ | 443 WIPHY_WOWLAN_RFKILL_RELEASE; 444 if (!iwlwifi_mod_params.sw_crypto) 445 mvm->wowlan.flags |= WIPHY_WOWLAN_SUPPORTS_GTK_REKEY | 446 WIPHY_WOWLAN_GTK_REKEY_FAILURE | 447 WIPHY_WOWLAN_4WAY_HANDSHAKE; 448 449 mvm->wowlan.n_patterns = IWL_WOWLAN_MAX_PATTERNS; 450 mvm->wowlan.pattern_min_len = IWL_WOWLAN_MIN_PATTERN_LEN; 451 mvm->wowlan.pattern_max_len = IWL_WOWLAN_MAX_PATTERN_LEN; 452 mvm->wowlan.tcp = &iwl_mvm_wowlan_tcp_support; 453 hw->wiphy->wowlan = &mvm->wowlan; 454 } 455#endif 456 457#ifdef CONFIG_IWLWIFI_BCAST_FILTERING 458 /* assign default bcast filtering configuration */ 459 mvm->bcast_filters = iwl_mvm_default_bcast_filters; 460#endif 461 462 ret = iwl_mvm_leds_init(mvm); 463 if (ret) 464 return ret; 465 466 ret = ieee80211_register_hw(mvm->hw); 467 if (ret) 468 iwl_mvm_leds_exit(mvm); 469 470 return ret; 471} 472 473static bool iwl_mvm_defer_tx(struct iwl_mvm *mvm, 474 struct ieee80211_sta *sta, 475 struct sk_buff *skb) 476{ 477 struct iwl_mvm_sta *mvmsta; 478 bool defer = false; 479 480 /* 481 * double check the IN_D0I3 flag both before and after 482 * taking the spinlock, in order to prevent taking 483 * the spinlock when not needed. 484 */ 485 if (likely(!test_bit(IWL_MVM_STATUS_IN_D0I3, &mvm->status))) 486 return false; 487 488 spin_lock(&mvm->d0i3_tx_lock); 489 /* 490 * testing the flag again ensures the skb dequeue 491 * loop (on d0i3 exit) hasn't run yet. 492 */ 493 if (!test_bit(IWL_MVM_STATUS_IN_D0I3, &mvm->status)) 494 goto out; 495 496 mvmsta = iwl_mvm_sta_from_mac80211(sta); 497 if (mvmsta->sta_id == IWL_MVM_STATION_COUNT || 498 mvmsta->sta_id != mvm->d0i3_ap_sta_id) 499 goto out; 500 501 __skb_queue_tail(&mvm->d0i3_tx, skb); 502 ieee80211_stop_queues(mvm->hw); 503 504 /* trigger wakeup */ 505 iwl_mvm_ref(mvm, IWL_MVM_REF_TX); 506 iwl_mvm_unref(mvm, IWL_MVM_REF_TX); 507 508 defer = true; 509out: 510 spin_unlock(&mvm->d0i3_tx_lock); 511 return defer; 512} 513 514static void iwl_mvm_mac_tx(struct ieee80211_hw *hw, 515 struct ieee80211_tx_control *control, 516 struct sk_buff *skb) 517{ 518 struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw); 519 struct ieee80211_sta *sta = control->sta; 520 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); 521 struct ieee80211_hdr *hdr = (void *)skb->data; 522 523 if (iwl_mvm_is_radio_killed(mvm)) { 524 IWL_DEBUG_DROP(mvm, "Dropping - RF/CT KILL\n"); 525 goto drop; 526 } 527 528 if (IEEE80211_SKB_CB(skb)->hw_queue == IWL_MVM_OFFCHANNEL_QUEUE && 529 !test_bit(IWL_MVM_STATUS_ROC_RUNNING, &mvm->status) && 530 !test_bit(IWL_MVM_STATUS_ROC_AUX_RUNNING, &mvm->status)) 531 goto drop; 532 533 /* treat non-bufferable MMPDUs as broadcast if sta is sleeping */ 534 if (unlikely(info->flags & IEEE80211_TX_CTL_NO_PS_BUFFER && 535 ieee80211_is_mgmt(hdr->frame_control) && 536 !ieee80211_is_deauth(hdr->frame_control) && 537 !ieee80211_is_disassoc(hdr->frame_control) && 538 !ieee80211_is_action(hdr->frame_control))) 539 sta = NULL; 540 541 if (sta) { 542 if (iwl_mvm_defer_tx(mvm, sta, skb)) 543 return; 544 if (iwl_mvm_tx_skb(mvm, skb, sta)) 545 goto drop; 546 return; 547 } 548 549 if (iwl_mvm_tx_skb_non_sta(mvm, skb)) 550 goto drop; 551 return; 552 drop: 553 ieee80211_free_txskb(hw, skb); 554} 555 556static inline bool iwl_enable_rx_ampdu(const struct iwl_cfg *cfg) 557{ 558 if (iwlwifi_mod_params.disable_11n & IWL_DISABLE_HT_RXAGG) 559 return false; 560 return true; 561} 562 563static inline bool iwl_enable_tx_ampdu(const struct iwl_cfg *cfg) 564{ 565 if (iwlwifi_mod_params.disable_11n & IWL_DISABLE_HT_TXAGG) 566 return false; 567 if (iwlwifi_mod_params.disable_11n & IWL_ENABLE_HT_TXAGG) 568 return true; 569 570 /* enabled by default */ 571 return true; 572} 573 574static int iwl_mvm_mac_ampdu_action(struct ieee80211_hw *hw, 575 struct ieee80211_vif *vif, 576 enum ieee80211_ampdu_mlme_action action, 577 struct ieee80211_sta *sta, u16 tid, 578 u16 *ssn, u8 buf_size) 579{ 580 struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw); 581 int ret; 582 bool tx_agg_ref = false; 583 584 IWL_DEBUG_HT(mvm, "A-MPDU action on addr %pM tid %d: action %d\n", 585 sta->addr, tid, action); 586 587 if (!(mvm->nvm_data->sku_cap_11n_enable)) 588 return -EACCES; 589 590 /* return from D0i3 before starting a new Tx aggregation */ 591 switch (action) { 592 case IEEE80211_AMPDU_TX_START: 593 case IEEE80211_AMPDU_TX_STOP_CONT: 594 case IEEE80211_AMPDU_TX_STOP_FLUSH: 595 case IEEE80211_AMPDU_TX_STOP_FLUSH_CONT: 596 case IEEE80211_AMPDU_TX_OPERATIONAL: 597 /* 598 * for tx start, wait synchronously until D0i3 exit to 599 * get the correct sequence number for the tid. 600 * additionally, some other ampdu actions use direct 601 * target access, which is not handled automatically 602 * by the trans layer (unlike commands), so wait for 603 * d0i3 exit in these cases as well. 604 */ 605 ret = iwl_mvm_ref_sync(mvm, IWL_MVM_REF_TX_AGG); 606 if (ret) 607 return ret; 608 609 tx_agg_ref = true; 610 break; 611 default: 612 break; 613 } 614 615 mutex_lock(&mvm->mutex); 616 617 switch (action) { 618 case IEEE80211_AMPDU_RX_START: 619 if (!iwl_enable_rx_ampdu(mvm->cfg)) { 620 ret = -EINVAL; 621 break; 622 } 623 ret = iwl_mvm_sta_rx_agg(mvm, sta, tid, *ssn, true); 624 break; 625 case IEEE80211_AMPDU_RX_STOP: 626 ret = iwl_mvm_sta_rx_agg(mvm, sta, tid, 0, false); 627 break; 628 case IEEE80211_AMPDU_TX_START: 629 if (!iwl_enable_tx_ampdu(mvm->cfg)) { 630 ret = -EINVAL; 631 break; 632 } 633 ret = iwl_mvm_sta_tx_agg_start(mvm, vif, sta, tid, ssn); 634 break; 635 case IEEE80211_AMPDU_TX_STOP_CONT: 636 ret = iwl_mvm_sta_tx_agg_stop(mvm, vif, sta, tid); 637 break; 638 case IEEE80211_AMPDU_TX_STOP_FLUSH: 639 case IEEE80211_AMPDU_TX_STOP_FLUSH_CONT: 640 ret = iwl_mvm_sta_tx_agg_flush(mvm, vif, sta, tid); 641 break; 642 case IEEE80211_AMPDU_TX_OPERATIONAL: 643 ret = iwl_mvm_sta_tx_agg_oper(mvm, vif, sta, tid, buf_size); 644 break; 645 default: 646 WARN_ON_ONCE(1); 647 ret = -EINVAL; 648 break; 649 } 650 mutex_unlock(&mvm->mutex); 651 652 /* 653 * If the tid is marked as started, we won't use it for offloaded 654 * traffic on the next D0i3 entry. It's safe to unref. 655 */ 656 if (tx_agg_ref) 657 iwl_mvm_unref(mvm, IWL_MVM_REF_TX_AGG); 658 659 return ret; 660} 661 662static void iwl_mvm_cleanup_iterator(void *data, u8 *mac, 663 struct ieee80211_vif *vif) 664{ 665 struct iwl_mvm *mvm = data; 666 struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif); 667 668 mvmvif->uploaded = false; 669 mvmvif->ap_sta_id = IWL_MVM_STATION_COUNT; 670 671 /* does this make sense at all? */ 672 mvmvif->color++; 673 674 spin_lock_bh(&mvm->time_event_lock); 675 iwl_mvm_te_clear_data(mvm, &mvmvif->time_event_data); 676 spin_unlock_bh(&mvm->time_event_lock); 677 678 mvmvif->phy_ctxt = NULL; 679 memset(&mvmvif->bf_data, 0, sizeof(mvmvif->bf_data)); 680} 681 682#ifdef CONFIG_IWLWIFI_DEBUGFS 683void iwl_mvm_fw_error_dump(struct iwl_mvm *mvm) 684{ 685 static char *env[] = { "DRIVER=iwlwifi", "EVENT=error_dump", NULL }; 686 struct iwl_fw_error_dump_file *dump_file; 687 struct iwl_fw_error_dump_data *dump_data; 688 struct iwl_fw_error_dump_info *dump_info; 689 struct iwl_mvm_dump_ptrs *fw_error_dump; 690 const struct fw_img *img; 691 u32 sram_len, sram_ofs; 692 u32 file_len, rxf_len; 693 unsigned long flags; 694 int reg_val; 695 696 lockdep_assert_held(&mvm->mutex); 697 698 if (mvm->fw_error_dump) 699 return; 700 701 fw_error_dump = kzalloc(sizeof(*mvm->fw_error_dump), GFP_KERNEL); 702 if (!fw_error_dump) 703 return; 704 705 img = &mvm->fw->img[mvm->cur_ucode]; 706 sram_ofs = img->sec[IWL_UCODE_SECTION_DATA].offset; 707 sram_len = img->sec[IWL_UCODE_SECTION_DATA].len; 708 709 /* reading buffer size */ 710 reg_val = iwl_trans_read_prph(mvm->trans, RXF_SIZE_ADDR); 711 rxf_len = (reg_val & RXF_SIZE_BYTE_CNT_MSK) >> RXF_SIZE_BYTE_CND_POS; 712 713 /* the register holds the value divided by 128 */ 714 rxf_len = rxf_len << 7; 715 716 file_len = sizeof(*dump_file) + 717 sizeof(*dump_data) * 3 + 718 sram_len + 719 rxf_len + 720 sizeof(*dump_info); 721 722 dump_file = vzalloc(file_len); 723 if (!dump_file) { 724 kfree(fw_error_dump); 725 return; 726 } 727 728 fw_error_dump->op_mode_ptr = dump_file; 729 730 dump_file->barker = cpu_to_le32(IWL_FW_ERROR_DUMP_BARKER); 731 dump_data = (void *)dump_file->data; 732 733 dump_data->type = cpu_to_le32(IWL_FW_ERROR_DUMP_DEV_FW_INFO); 734 dump_data->len = cpu_to_le32(sizeof(*dump_info)); 735 dump_info = (void *) dump_data->data; 736 dump_info->device_family = 737 mvm->cfg->device_family == IWL_DEVICE_FAMILY_7000 ? 738 cpu_to_le32(IWL_FW_ERROR_DUMP_FAMILY_7) : 739 cpu_to_le32(IWL_FW_ERROR_DUMP_FAMILY_8); 740 memcpy(dump_info->fw_human_readable, mvm->fw->human_readable, 741 sizeof(dump_info->fw_human_readable)); 742 strncpy(dump_info->dev_human_readable, mvm->cfg->name, 743 sizeof(dump_info->dev_human_readable)); 744 strncpy(dump_info->bus_human_readable, mvm->dev->bus->name, 745 sizeof(dump_info->bus_human_readable)); 746 747 dump_data = iwl_fw_error_next_data(dump_data); 748 dump_data->type = cpu_to_le32(IWL_FW_ERROR_DUMP_RXF); 749 dump_data->len = cpu_to_le32(rxf_len); 750 751 if (iwl_trans_grab_nic_access(mvm->trans, false, &flags)) { 752 u32 *rxf = (void *)dump_data->data; 753 int i; 754 755 for (i = 0; i < (rxf_len / sizeof(u32)); i++) { 756 iwl_trans_write_prph(mvm->trans, 757 RXF_LD_FENCE_OFFSET_ADDR, 758 i * sizeof(u32)); 759 rxf[i] = iwl_trans_read_prph(mvm->trans, 760 RXF_FIFO_RD_FENCE_ADDR); 761 } 762 iwl_trans_release_nic_access(mvm->trans, &flags); 763 } 764 765 dump_data = iwl_fw_error_next_data(dump_data); 766 dump_data->type = cpu_to_le32(IWL_FW_ERROR_DUMP_SRAM); 767 dump_data->len = cpu_to_le32(sram_len); 768 iwl_trans_read_mem_bytes(mvm->trans, sram_ofs, dump_data->data, 769 sram_len); 770 771 fw_error_dump->trans_ptr = iwl_trans_dump_data(mvm->trans); 772 fw_error_dump->op_mode_len = file_len; 773 if (fw_error_dump->trans_ptr) 774 file_len += fw_error_dump->trans_ptr->len; 775 dump_file->file_len = cpu_to_le32(file_len); 776 mvm->fw_error_dump = fw_error_dump; 777 778 /* notify the userspace about the error we had */ 779 kobject_uevent_env(&mvm->hw->wiphy->dev.kobj, KOBJ_CHANGE, env); 780} 781#endif 782 783static void iwl_mvm_restart_cleanup(struct iwl_mvm *mvm) 784{ 785 iwl_mvm_fw_error_dump(mvm); 786 787 iwl_trans_stop_device(mvm->trans); 788 789 mvm->scan_status = IWL_MVM_SCAN_NONE; 790 mvm->ps_disabled = false; 791 mvm->calibrating = false; 792 793 /* just in case one was running */ 794 ieee80211_remain_on_channel_expired(mvm->hw); 795 796 ieee80211_iterate_active_interfaces_atomic( 797 mvm->hw, IEEE80211_IFACE_ITER_RESUME_ALL, 798 iwl_mvm_cleanup_iterator, mvm); 799 800 mvm->p2p_device_vif = NULL; 801 mvm->d0i3_ap_sta_id = IWL_MVM_STATION_COUNT; 802 803 iwl_mvm_reset_phy_ctxts(mvm); 804 memset(mvm->fw_key_table, 0, sizeof(mvm->fw_key_table)); 805 memset(mvm->sta_drained, 0, sizeof(mvm->sta_drained)); 806 memset(&mvm->last_bt_notif, 0, sizeof(mvm->last_bt_notif)); 807 memset(&mvm->last_bt_notif_old, 0, sizeof(mvm->last_bt_notif_old)); 808 memset(&mvm->last_bt_ci_cmd, 0, sizeof(mvm->last_bt_ci_cmd)); 809 memset(&mvm->last_bt_ci_cmd_old, 0, sizeof(mvm->last_bt_ci_cmd_old)); 810 memset(&mvm->bt_ack_kill_msk, 0, sizeof(mvm->bt_ack_kill_msk)); 811 memset(&mvm->bt_cts_kill_msk, 0, sizeof(mvm->bt_cts_kill_msk)); 812 813 ieee80211_wake_queues(mvm->hw); 814 815 /* cleanup all stale references (scan, roc), but keep the 816 * ucode_down ref until reconfig is complete */ 817 iwl_mvm_unref_all_except(mvm, IWL_MVM_REF_UCODE_DOWN); 818 819 /* clear any stale d0i3 state */ 820 clear_bit(IWL_MVM_STATUS_IN_D0I3, &mvm->status); 821 822 mvm->vif_count = 0; 823 mvm->rx_ba_sessions = 0; 824} 825 826int __iwl_mvm_mac_start(struct iwl_mvm *mvm) 827{ 828 int ret; 829 830 lockdep_assert_held(&mvm->mutex); 831 832 /* Clean up some internal and mac80211 state on restart */ 833 if (test_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status)) 834 iwl_mvm_restart_cleanup(mvm); 835 836 ret = iwl_mvm_up(mvm); 837 838 if (ret && test_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status)) { 839 /* Something went wrong - we need to finish some cleanup 840 * that normally iwl_mvm_mac_restart_complete() below 841 * would do. 842 */ 843 clear_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status); 844 iwl_mvm_d0i3_enable_tx(mvm, NULL); 845 } 846 847 return ret; 848} 849 850static int iwl_mvm_mac_start(struct ieee80211_hw *hw) 851{ 852 struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw); 853 int ret; 854 855 mutex_lock(&mvm->mutex); 856 ret = __iwl_mvm_mac_start(mvm); 857 mutex_unlock(&mvm->mutex); 858 859 return ret; 860} 861 862static void iwl_mvm_mac_restart_complete(struct ieee80211_hw *hw) 863{ 864 struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw); 865 int ret; 866 867 mutex_lock(&mvm->mutex); 868 869 clear_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status); 870 iwl_mvm_d0i3_enable_tx(mvm, NULL); 871 ret = iwl_mvm_update_quotas(mvm, NULL); 872 if (ret) 873 IWL_ERR(mvm, "Failed to update quotas after restart (%d)\n", 874 ret); 875 876 /* allow transport/FW low power modes */ 877 iwl_mvm_unref(mvm, IWL_MVM_REF_UCODE_DOWN); 878 879 mutex_unlock(&mvm->mutex); 880} 881 882void __iwl_mvm_mac_stop(struct iwl_mvm *mvm) 883{ 884 lockdep_assert_held(&mvm->mutex); 885 886 /* disallow low power states when the FW is down */ 887 iwl_mvm_ref(mvm, IWL_MVM_REF_UCODE_DOWN); 888 889 /* async_handlers_wk is now blocked */ 890 891 /* 892 * The work item could be running or queued if the 893 * ROC time event stops just as we get here. 894 */ 895 cancel_work_sync(&mvm->roc_done_wk); 896 897 iwl_trans_stop_device(mvm->trans); 898 899 iwl_mvm_async_handlers_purge(mvm); 900 /* async_handlers_list is empty and will stay empty: HW is stopped */ 901 902 /* the fw is stopped, the aux sta is dead: clean up driver state */ 903 iwl_mvm_del_aux_sta(mvm); 904 905 mvm->ucode_loaded = false; 906} 907 908static void iwl_mvm_mac_stop(struct ieee80211_hw *hw) 909{ 910 struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw); 911 912 flush_work(&mvm->d0i3_exit_work); 913 flush_work(&mvm->async_handlers_wk); 914 flush_work(&mvm->fw_error_dump_wk); 915 916 mutex_lock(&mvm->mutex); 917 __iwl_mvm_mac_stop(mvm); 918 mutex_unlock(&mvm->mutex); 919 920 /* 921 * The worker might have been waiting for the mutex, let it run and 922 * discover that its list is now empty. 923 */ 924 cancel_work_sync(&mvm->async_handlers_wk); 925} 926 927static struct iwl_mvm_phy_ctxt *iwl_mvm_get_free_phy_ctxt(struct iwl_mvm *mvm) 928{ 929 u16 i; 930 931 lockdep_assert_held(&mvm->mutex); 932 933 for (i = 0; i < NUM_PHY_CTX; i++) 934 if (!mvm->phy_ctxts[i].ref) 935 return &mvm->phy_ctxts[i]; 936 937 IWL_ERR(mvm, "No available PHY context\n"); 938 return NULL; 939} 940 941static int iwl_mvm_set_tx_power(struct iwl_mvm *mvm, struct ieee80211_vif *vif, 942 s8 tx_power) 943{ 944 /* FW is in charge of regulatory enforcement */ 945 struct iwl_reduce_tx_power_cmd reduce_txpwr_cmd = { 946 .mac_context_id = iwl_mvm_vif_from_mac80211(vif)->id, 947 .pwr_restriction = cpu_to_le16(tx_power), 948 }; 949 950 return iwl_mvm_send_cmd_pdu(mvm, REDUCE_TX_POWER_CMD, 0, 951 sizeof(reduce_txpwr_cmd), 952 &reduce_txpwr_cmd); 953} 954 955static int iwl_mvm_mac_add_interface(struct ieee80211_hw *hw, 956 struct ieee80211_vif *vif) 957{ 958 struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw); 959 struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif); 960 int ret; 961 962 /* 963 * make sure D0i3 exit is completed, otherwise a target access 964 * during tx queue configuration could be done when still in 965 * D0i3 state. 966 */ 967 ret = iwl_mvm_ref_sync(mvm, IWL_MVM_REF_ADD_IF); 968 if (ret) 969 return ret; 970 971 /* 972 * Not much to do here. The stack will not allow interface 973 * types or combinations that we didn't advertise, so we 974 * don't really have to check the types. 975 */ 976 977 mutex_lock(&mvm->mutex); 978 979 /* Allocate resources for the MAC context, and add it to the fw */ 980 ret = iwl_mvm_mac_ctxt_init(mvm, vif); 981 if (ret) 982 goto out_unlock; 983 984 /* Counting number of interfaces is needed for legacy PM */ 985 if (vif->type != NL80211_IFTYPE_P2P_DEVICE) 986 mvm->vif_count++; 987 988 /* 989 * The AP binding flow can be done only after the beacon 990 * template is configured (which happens only in the mac80211 991 * start_ap() flow), and adding the broadcast station can happen 992 * only after the binding. 993 * In addition, since modifying the MAC before adding a bcast 994 * station is not allowed by the FW, delay the adding of MAC context to 995 * the point where we can also add the bcast station. 996 * In short: there's not much we can do at this point, other than 997 * allocating resources :) 998 */ 999 if (vif->type == NL80211_IFTYPE_AP || 1000 vif->type == NL80211_IFTYPE_ADHOC) { 1001 ret = iwl_mvm_alloc_bcast_sta(mvm, vif); 1002 if (ret) { 1003 IWL_ERR(mvm, "Failed to allocate bcast sta\n"); 1004 goto out_release; 1005 } 1006 1007 iwl_mvm_vif_dbgfs_register(mvm, vif); 1008 goto out_unlock; 1009 } 1010 1011 ret = iwl_mvm_mac_ctxt_add(mvm, vif); 1012 if (ret) 1013 goto out_release; 1014 1015 ret = iwl_mvm_power_update_mac(mvm); 1016 if (ret) 1017 goto out_release; 1018 1019 /* beacon filtering */ 1020 ret = iwl_mvm_disable_beacon_filter(mvm, vif, 0); 1021 if (ret) 1022 goto out_remove_mac; 1023 1024 if (!mvm->bf_allowed_vif && 1025 vif->type == NL80211_IFTYPE_STATION && !vif->p2p) { 1026 mvm->bf_allowed_vif = mvmvif; 1027 vif->driver_flags |= IEEE80211_VIF_BEACON_FILTER | 1028 IEEE80211_VIF_SUPPORTS_CQM_RSSI; 1029 } 1030 1031 /* 1032 * P2P_DEVICE interface does not have a channel context assigned to it, 1033 * so a dedicated PHY context is allocated to it and the corresponding 1034 * MAC context is bound to it at this stage. 1035 */ 1036 if (vif->type == NL80211_IFTYPE_P2P_DEVICE) { 1037 1038 mvmvif->phy_ctxt = iwl_mvm_get_free_phy_ctxt(mvm); 1039 if (!mvmvif->phy_ctxt) { 1040 ret = -ENOSPC; 1041 goto out_free_bf; 1042 } 1043 1044 iwl_mvm_phy_ctxt_ref(mvm, mvmvif->phy_ctxt); 1045 ret = iwl_mvm_binding_add_vif(mvm, vif); 1046 if (ret) 1047 goto out_unref_phy; 1048 1049 ret = iwl_mvm_add_bcast_sta(mvm, vif); 1050 if (ret) 1051 goto out_unbind; 1052 1053 /* Save a pointer to p2p device vif, so it can later be used to 1054 * update the p2p device MAC when a GO is started/stopped */ 1055 mvm->p2p_device_vif = vif; 1056 } 1057 1058 iwl_mvm_vif_dbgfs_register(mvm, vif); 1059 goto out_unlock; 1060 1061 out_unbind: 1062 iwl_mvm_binding_remove_vif(mvm, vif); 1063 out_unref_phy: 1064 iwl_mvm_phy_ctxt_unref(mvm, mvmvif->phy_ctxt); 1065 out_free_bf: 1066 if (mvm->bf_allowed_vif == mvmvif) { 1067 mvm->bf_allowed_vif = NULL; 1068 vif->driver_flags &= ~(IEEE80211_VIF_BEACON_FILTER | 1069 IEEE80211_VIF_SUPPORTS_CQM_RSSI); 1070 } 1071 out_remove_mac: 1072 mvmvif->phy_ctxt = NULL; 1073 iwl_mvm_mac_ctxt_remove(mvm, vif); 1074 out_release: 1075 if (vif->type != NL80211_IFTYPE_P2P_DEVICE) 1076 mvm->vif_count--; 1077 1078 iwl_mvm_mac_ctxt_release(mvm, vif); 1079 out_unlock: 1080 mutex_unlock(&mvm->mutex); 1081 1082 iwl_mvm_unref(mvm, IWL_MVM_REF_ADD_IF); 1083 1084 return ret; 1085} 1086 1087static void iwl_mvm_prepare_mac_removal(struct iwl_mvm *mvm, 1088 struct ieee80211_vif *vif) 1089{ 1090 u32 tfd_msk = iwl_mvm_mac_get_queues_mask(mvm, vif); 1091 1092 if (tfd_msk) { 1093 mutex_lock(&mvm->mutex); 1094 iwl_mvm_flush_tx_path(mvm, tfd_msk, true); 1095 mutex_unlock(&mvm->mutex); 1096 } 1097 1098 if (vif->type == NL80211_IFTYPE_P2P_DEVICE) { 1099 /* 1100 * Flush the ROC worker which will flush the OFFCHANNEL queue. 1101 * We assume here that all the packets sent to the OFFCHANNEL 1102 * queue are sent in ROC session. 1103 */ 1104 flush_work(&mvm->roc_done_wk); 1105 } else { 1106 /* 1107 * By now, all the AC queues are empty. The AGG queues are 1108 * empty too. We already got all the Tx responses for all the 1109 * packets in the queues. The drain work can have been 1110 * triggered. Flush it. 1111 */ 1112 flush_work(&mvm->sta_drained_wk); 1113 } 1114} 1115 1116static void iwl_mvm_mac_remove_interface(struct ieee80211_hw *hw, 1117 struct ieee80211_vif *vif) 1118{ 1119 struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw); 1120 struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif); 1121 1122 iwl_mvm_prepare_mac_removal(mvm, vif); 1123 1124 mutex_lock(&mvm->mutex); 1125 1126 if (mvm->bf_allowed_vif == mvmvif) { 1127 mvm->bf_allowed_vif = NULL; 1128 vif->driver_flags &= ~(IEEE80211_VIF_BEACON_FILTER | 1129 IEEE80211_VIF_SUPPORTS_CQM_RSSI); 1130 } 1131 1132 iwl_mvm_vif_dbgfs_clean(mvm, vif); 1133 1134 /* 1135 * For AP/GO interface, the tear down of the resources allocated to the 1136 * interface is be handled as part of the stop_ap flow. 1137 */ 1138 if (vif->type == NL80211_IFTYPE_AP || 1139 vif->type == NL80211_IFTYPE_ADHOC) { 1140#ifdef CONFIG_NL80211_TESTMODE 1141 if (vif == mvm->noa_vif) { 1142 mvm->noa_vif = NULL; 1143 mvm->noa_duration = 0; 1144 } 1145#endif 1146 iwl_mvm_dealloc_bcast_sta(mvm, vif); 1147 goto out_release; 1148 } 1149 1150 if (vif->type == NL80211_IFTYPE_P2P_DEVICE) { 1151 mvm->p2p_device_vif = NULL; 1152 iwl_mvm_rm_bcast_sta(mvm, vif); 1153 iwl_mvm_binding_remove_vif(mvm, vif); 1154 iwl_mvm_phy_ctxt_unref(mvm, mvmvif->phy_ctxt); 1155 mvmvif->phy_ctxt = NULL; 1156 } 1157 1158 if (mvm->vif_count && vif->type != NL80211_IFTYPE_P2P_DEVICE) 1159 mvm->vif_count--; 1160 1161 iwl_mvm_power_update_mac(mvm); 1162 iwl_mvm_mac_ctxt_remove(mvm, vif); 1163 1164out_release: 1165 iwl_mvm_mac_ctxt_release(mvm, vif); 1166 mutex_unlock(&mvm->mutex); 1167} 1168 1169static int iwl_mvm_mac_config(struct ieee80211_hw *hw, u32 changed) 1170{ 1171 return 0; 1172} 1173 1174struct iwl_mvm_mc_iter_data { 1175 struct iwl_mvm *mvm; 1176 int port_id; 1177}; 1178 1179static void iwl_mvm_mc_iface_iterator(void *_data, u8 *mac, 1180 struct ieee80211_vif *vif) 1181{ 1182 struct iwl_mvm_mc_iter_data *data = _data; 1183 struct iwl_mvm *mvm = data->mvm; 1184 struct iwl_mcast_filter_cmd *cmd = mvm->mcast_filter_cmd; 1185 int ret, len; 1186 1187 /* if we don't have free ports, mcast frames will be dropped */ 1188 if (WARN_ON_ONCE(data->port_id >= MAX_PORT_ID_NUM)) 1189 return; 1190 1191 if (vif->type != NL80211_IFTYPE_STATION || 1192 !vif->bss_conf.assoc) 1193 return; 1194 1195 cmd->port_id = data->port_id++; 1196 memcpy(cmd->bssid, vif->bss_conf.bssid, ETH_ALEN); 1197 len = roundup(sizeof(*cmd) + cmd->count * ETH_ALEN, 4); 1198 1199 ret = iwl_mvm_send_cmd_pdu(mvm, MCAST_FILTER_CMD, CMD_ASYNC, len, cmd); 1200 if (ret) 1201 IWL_ERR(mvm, "mcast filter cmd error. ret=%d\n", ret); 1202} 1203 1204static void iwl_mvm_recalc_multicast(struct iwl_mvm *mvm) 1205{ 1206 struct iwl_mvm_mc_iter_data iter_data = { 1207 .mvm = mvm, 1208 }; 1209 1210 lockdep_assert_held(&mvm->mutex); 1211 1212 if (WARN_ON_ONCE(!mvm->mcast_filter_cmd)) 1213 return; 1214 1215 ieee80211_iterate_active_interfaces_atomic( 1216 mvm->hw, IEEE80211_IFACE_ITER_NORMAL, 1217 iwl_mvm_mc_iface_iterator, &iter_data); 1218} 1219 1220static u64 iwl_mvm_prepare_multicast(struct ieee80211_hw *hw, 1221 struct netdev_hw_addr_list *mc_list) 1222{ 1223 struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw); 1224 struct iwl_mcast_filter_cmd *cmd; 1225 struct netdev_hw_addr *addr; 1226 int addr_count; 1227 bool pass_all; 1228 int len; 1229 1230 addr_count = netdev_hw_addr_list_count(mc_list); 1231 pass_all = addr_count > MAX_MCAST_FILTERING_ADDRESSES || 1232 IWL_MVM_FW_MCAST_FILTER_PASS_ALL; 1233 if (pass_all) 1234 addr_count = 0; 1235 1236 len = roundup(sizeof(*cmd) + addr_count * ETH_ALEN, 4); 1237 cmd = kzalloc(len, GFP_ATOMIC); 1238 if (!cmd) 1239 return 0; 1240 1241 if (pass_all) { 1242 cmd->pass_all = 1; 1243 return (u64)(unsigned long)cmd; 1244 } 1245 1246 netdev_hw_addr_list_for_each(addr, mc_list) { 1247 IWL_DEBUG_MAC80211(mvm, "mcast addr (%d): %pM\n", 1248 cmd->count, addr->addr); 1249 memcpy(&cmd->addr_list[cmd->count * ETH_ALEN], 1250 addr->addr, ETH_ALEN); 1251 cmd->count++; 1252 } 1253 1254 return (u64)(unsigned long)cmd; 1255} 1256 1257static void iwl_mvm_configure_filter(struct ieee80211_hw *hw, 1258 unsigned int changed_flags, 1259 unsigned int *total_flags, 1260 u64 multicast) 1261{ 1262 struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw); 1263 struct iwl_mcast_filter_cmd *cmd = (void *)(unsigned long)multicast; 1264 1265 mutex_lock(&mvm->mutex); 1266 1267 /* replace previous configuration */ 1268 kfree(mvm->mcast_filter_cmd); 1269 mvm->mcast_filter_cmd = cmd; 1270 1271 if (!cmd) 1272 goto out; 1273 1274 iwl_mvm_recalc_multicast(mvm); 1275out: 1276 mutex_unlock(&mvm->mutex); 1277 *total_flags = 0; 1278} 1279 1280#ifdef CONFIG_IWLWIFI_BCAST_FILTERING 1281struct iwl_bcast_iter_data { 1282 struct iwl_mvm *mvm; 1283 struct iwl_bcast_filter_cmd *cmd; 1284 u8 current_filter; 1285}; 1286 1287static void 1288iwl_mvm_set_bcast_filter(struct ieee80211_vif *vif, 1289 const struct iwl_fw_bcast_filter *in_filter, 1290 struct iwl_fw_bcast_filter *out_filter) 1291{ 1292 struct iwl_fw_bcast_filter_attr *attr; 1293 int i; 1294 1295 memcpy(out_filter, in_filter, sizeof(*out_filter)); 1296 1297 for (i = 0; i < ARRAY_SIZE(out_filter->attrs); i++) { 1298 attr = &out_filter->attrs[i]; 1299 1300 if (!attr->mask) 1301 break; 1302 1303 switch (attr->reserved1) { 1304 case cpu_to_le16(BC_FILTER_MAGIC_IP): 1305 if (vif->bss_conf.arp_addr_cnt != 1) { 1306 attr->mask = 0; 1307 continue; 1308 } 1309 1310 attr->val = vif->bss_conf.arp_addr_list[0]; 1311 break; 1312 case cpu_to_le16(BC_FILTER_MAGIC_MAC): 1313 attr->val = *(__be32 *)&vif->addr[2]; 1314 break; 1315 default: 1316 break; 1317 } 1318 attr->reserved1 = 0; 1319 out_filter->num_attrs++; 1320 } 1321} 1322 1323static void iwl_mvm_bcast_filter_iterator(void *_data, u8 *mac, 1324 struct ieee80211_vif *vif) 1325{ 1326 struct iwl_bcast_iter_data *data = _data; 1327 struct iwl_mvm *mvm = data->mvm; 1328 struct iwl_bcast_filter_cmd *cmd = data->cmd; 1329 struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif); 1330 struct iwl_fw_bcast_mac *bcast_mac; 1331 int i; 1332 1333 if (WARN_ON(mvmvif->id >= ARRAY_SIZE(cmd->macs))) 1334 return; 1335 1336 bcast_mac = &cmd->macs[mvmvif->id]; 1337 1338 /* 1339 * enable filtering only for associated stations, but not for P2P 1340 * Clients 1341 */ 1342 if (vif->type != NL80211_IFTYPE_STATION || vif->p2p || 1343 !vif->bss_conf.assoc) 1344 return; 1345 1346 bcast_mac->default_discard = 1; 1347 1348 /* copy all configured filters */ 1349 for (i = 0; mvm->bcast_filters[i].attrs[0].mask; i++) { 1350 /* 1351 * Make sure we don't exceed our filters limit. 1352 * if there is still a valid filter to be configured, 1353 * be on the safe side and just allow bcast for this mac. 1354 */ 1355 if (WARN_ON_ONCE(data->current_filter >= 1356 ARRAY_SIZE(cmd->filters))) { 1357 bcast_mac->default_discard = 0; 1358 bcast_mac->attached_filters = 0; 1359 break; 1360 } 1361 1362 iwl_mvm_set_bcast_filter(vif, 1363 &mvm->bcast_filters[i], 1364 &cmd->filters[data->current_filter]); 1365 1366 /* skip current filter if it contains no attributes */ 1367 if (!cmd->filters[data->current_filter].num_attrs) 1368 continue; 1369 1370 /* attach the filter to current mac */ 1371 bcast_mac->attached_filters |= 1372 cpu_to_le16(BIT(data->current_filter)); 1373 1374 data->current_filter++; 1375 } 1376} 1377 1378bool iwl_mvm_bcast_filter_build_cmd(struct iwl_mvm *mvm, 1379 struct iwl_bcast_filter_cmd *cmd) 1380{ 1381 struct iwl_bcast_iter_data iter_data = { 1382 .mvm = mvm, 1383 .cmd = cmd, 1384 }; 1385 1386 memset(cmd, 0, sizeof(*cmd)); 1387 cmd->max_bcast_filters = ARRAY_SIZE(cmd->filters); 1388 cmd->max_macs = ARRAY_SIZE(cmd->macs); 1389 1390#ifdef CONFIG_IWLWIFI_DEBUGFS 1391 /* use debugfs filters/macs if override is configured */ 1392 if (mvm->dbgfs_bcast_filtering.override) { 1393 memcpy(cmd->filters, &mvm->dbgfs_bcast_filtering.cmd.filters, 1394 sizeof(cmd->filters)); 1395 memcpy(cmd->macs, &mvm->dbgfs_bcast_filtering.cmd.macs, 1396 sizeof(cmd->macs)); 1397 return true; 1398 } 1399#endif 1400 1401 /* if no filters are configured, do nothing */ 1402 if (!mvm->bcast_filters) 1403 return false; 1404 1405 /* configure and attach these filters for each associated sta vif */ 1406 ieee80211_iterate_active_interfaces( 1407 mvm->hw, IEEE80211_IFACE_ITER_NORMAL, 1408 iwl_mvm_bcast_filter_iterator, &iter_data); 1409 1410 return true; 1411} 1412static int iwl_mvm_configure_bcast_filter(struct iwl_mvm *mvm, 1413 struct ieee80211_vif *vif) 1414{ 1415 struct iwl_bcast_filter_cmd cmd; 1416 1417 if (!(mvm->fw->ucode_capa.flags & IWL_UCODE_TLV_FLAGS_BCAST_FILTERING)) 1418 return 0; 1419 1420 if (!iwl_mvm_bcast_filter_build_cmd(mvm, &cmd)) 1421 return 0; 1422 1423 return iwl_mvm_send_cmd_pdu(mvm, BCAST_FILTER_CMD, 0, 1424 sizeof(cmd), &cmd); 1425} 1426#else 1427static inline int iwl_mvm_configure_bcast_filter(struct iwl_mvm *mvm, 1428 struct ieee80211_vif *vif) 1429{ 1430 return 0; 1431} 1432#endif 1433 1434static void iwl_mvm_bss_info_changed_station(struct iwl_mvm *mvm, 1435 struct ieee80211_vif *vif, 1436 struct ieee80211_bss_conf *bss_conf, 1437 u32 changes) 1438{ 1439 struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif); 1440 int ret; 1441 1442 /* 1443 * Re-calculate the tsf id, as the master-slave relations depend on the 1444 * beacon interval, which was not known when the station interface was 1445 * added. 1446 */ 1447 if (changes & BSS_CHANGED_ASSOC && bss_conf->assoc) 1448 iwl_mvm_mac_ctxt_recalc_tsf_id(mvm, vif); 1449 1450 /* 1451 * If we're not associated yet, take the (new) BSSID before associating 1452 * so the firmware knows. If we're already associated, then use the old 1453 * BSSID here, and we'll send a cleared one later in the CHANGED_ASSOC 1454 * branch for disassociation below. 1455 */ 1456 if (changes & BSS_CHANGED_BSSID && !mvmvif->associated) 1457 memcpy(mvmvif->bssid, bss_conf->bssid, ETH_ALEN); 1458 1459 ret = iwl_mvm_mac_ctxt_changed(mvm, vif, false, mvmvif->bssid); 1460 if (ret) 1461 IWL_ERR(mvm, "failed to update MAC %pM\n", vif->addr); 1462 1463 /* after sending it once, adopt mac80211 data */ 1464 memcpy(mvmvif->bssid, bss_conf->bssid, ETH_ALEN); 1465 mvmvif->associated = bss_conf->assoc; 1466 1467 if (changes & BSS_CHANGED_ASSOC) { 1468 if (bss_conf->assoc) { 1469 /* add quota for this interface */ 1470 ret = iwl_mvm_update_quotas(mvm, NULL); 1471 if (ret) { 1472 IWL_ERR(mvm, "failed to update quotas\n"); 1473 return; 1474 } 1475 1476 if (test_bit(IWL_MVM_STATUS_IN_HW_RESTART, 1477 &mvm->status)) { 1478 /* 1479 * If we're restarting then the firmware will 1480 * obviously have lost synchronisation with 1481 * the AP. It will attempt to synchronise by 1482 * itself, but we can make it more reliable by 1483 * scheduling a session protection time event. 1484 * 1485 * The firmware needs to receive a beacon to 1486 * catch up with synchronisation, use 110% of 1487 * the beacon interval. 1488 * 1489 * Set a large maximum delay to allow for more 1490 * than a single interface. 1491 */ 1492 u32 dur = (11 * vif->bss_conf.beacon_int) / 10; 1493 iwl_mvm_protect_session(mvm, vif, dur, dur, 1494 5 * dur, false); 1495 } 1496 1497 iwl_mvm_sf_update(mvm, vif, false); 1498 iwl_mvm_power_vif_assoc(mvm, vif); 1499 if (vif->p2p) { 1500 iwl_mvm_ref(mvm, IWL_MVM_REF_P2P_CLIENT); 1501 iwl_mvm_update_smps(mvm, vif, 1502 IWL_MVM_SMPS_REQ_PROT, 1503 IEEE80211_SMPS_DYNAMIC); 1504 } 1505 } else if (mvmvif->ap_sta_id != IWL_MVM_STATION_COUNT) { 1506 /* 1507 * If update fails - SF might be running in associated 1508 * mode while disassociated - which is forbidden. 1509 */ 1510 WARN_ONCE(iwl_mvm_sf_update(mvm, vif, false), 1511 "Failed to update SF upon disassociation\n"); 1512 1513 /* remove AP station now that the MAC is unassoc */ 1514 ret = iwl_mvm_rm_sta_id(mvm, vif, mvmvif->ap_sta_id); 1515 if (ret) 1516 IWL_ERR(mvm, "failed to remove AP station\n"); 1517 1518 if (mvm->d0i3_ap_sta_id == mvmvif->ap_sta_id) 1519 mvm->d0i3_ap_sta_id = IWL_MVM_STATION_COUNT; 1520 mvmvif->ap_sta_id = IWL_MVM_STATION_COUNT; 1521 /* remove quota for this interface */ 1522 ret = iwl_mvm_update_quotas(mvm, NULL); 1523 if (ret) 1524 IWL_ERR(mvm, "failed to update quotas\n"); 1525 1526 if (vif->p2p) 1527 iwl_mvm_unref(mvm, IWL_MVM_REF_P2P_CLIENT); 1528 1529 /* this will take the cleared BSSID from bss_conf */ 1530 ret = iwl_mvm_mac_ctxt_changed(mvm, vif, false, NULL); 1531 if (ret) 1532 IWL_ERR(mvm, 1533 "failed to update MAC %pM (clear after unassoc)\n", 1534 vif->addr); 1535 } 1536 1537 iwl_mvm_recalc_multicast(mvm); 1538 iwl_mvm_configure_bcast_filter(mvm, vif); 1539 1540 /* reset rssi values */ 1541 mvmvif->bf_data.ave_beacon_signal = 0; 1542 1543 iwl_mvm_bt_coex_vif_change(mvm); 1544 iwl_mvm_update_smps(mvm, vif, IWL_MVM_SMPS_REQ_TT, 1545 IEEE80211_SMPS_AUTOMATIC); 1546 } else if (changes & BSS_CHANGED_BEACON_INFO) { 1547 /* 1548 * We received a beacon _after_ association so 1549 * remove the session protection. 1550 */ 1551 iwl_mvm_remove_time_event(mvm, mvmvif, 1552 &mvmvif->time_event_data); 1553 } 1554 1555 if (changes & BSS_CHANGED_BEACON_INFO) { 1556 iwl_mvm_sf_update(mvm, vif, false); 1557 WARN_ON(iwl_mvm_enable_beacon_filter(mvm, vif, 0)); 1558 } 1559 1560 if (changes & (BSS_CHANGED_PS | BSS_CHANGED_P2P_PS | BSS_CHANGED_QOS)) { 1561 ret = iwl_mvm_power_update_mac(mvm); 1562 if (ret) 1563 IWL_ERR(mvm, "failed to update power mode\n"); 1564 } 1565 1566 if (changes & BSS_CHANGED_TXPOWER) { 1567 IWL_DEBUG_CALIB(mvm, "Changing TX Power to %d\n", 1568 bss_conf->txpower); 1569 iwl_mvm_set_tx_power(mvm, vif, bss_conf->txpower); 1570 } 1571 1572 if (changes & BSS_CHANGED_CQM) { 1573 IWL_DEBUG_MAC80211(mvm, "cqm info_changed\n"); 1574 /* reset cqm events tracking */ 1575 mvmvif->bf_data.last_cqm_event = 0; 1576 if (mvmvif->bf_data.bf_enabled) { 1577 ret = iwl_mvm_enable_beacon_filter(mvm, vif, 0); 1578 if (ret) 1579 IWL_ERR(mvm, 1580 "failed to update CQM thresholds\n"); 1581 } 1582 } 1583 1584 if (changes & BSS_CHANGED_ARP_FILTER) { 1585 IWL_DEBUG_MAC80211(mvm, "arp filter changed\n"); 1586 iwl_mvm_configure_bcast_filter(mvm, vif); 1587 } 1588} 1589 1590static int iwl_mvm_start_ap_ibss(struct ieee80211_hw *hw, 1591 struct ieee80211_vif *vif) 1592{ 1593 struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw); 1594 struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif); 1595 int ret; 1596 1597 /* 1598 * iwl_mvm_mac_ctxt_add() might read directly from the device 1599 * (the system time), so make sure it is available. 1600 */ 1601 ret = iwl_mvm_ref_sync(mvm, IWL_MVM_REF_START_AP); 1602 if (ret) 1603 return ret; 1604 1605 mutex_lock(&mvm->mutex); 1606 1607 /* Send the beacon template */ 1608 ret = iwl_mvm_mac_ctxt_beacon_changed(mvm, vif); 1609 if (ret) 1610 goto out_unlock; 1611 1612 /* 1613 * Re-calculate the tsf id, as the master-slave relations depend on the 1614 * beacon interval, which was not known when the AP interface was added. 1615 */ 1616 if (vif->type == NL80211_IFTYPE_AP) 1617 iwl_mvm_mac_ctxt_recalc_tsf_id(mvm, vif); 1618 1619 /* Add the mac context */ 1620 ret = iwl_mvm_mac_ctxt_add(mvm, vif); 1621 if (ret) 1622 goto out_unlock; 1623 1624 /* Perform the binding */ 1625 ret = iwl_mvm_binding_add_vif(mvm, vif); 1626 if (ret) 1627 goto out_remove; 1628 1629 /* Send the bcast station. At this stage the TBTT and DTIM time events 1630 * are added and applied to the scheduler */ 1631 ret = iwl_mvm_send_add_bcast_sta(mvm, vif); 1632 if (ret) 1633 goto out_unbind; 1634 1635 /* must be set before quota calculations */ 1636 mvmvif->ap_ibss_active = true; 1637 1638 /* power updated needs to be done before quotas */ 1639 iwl_mvm_power_update_mac(mvm); 1640 1641 ret = iwl_mvm_update_quotas(mvm, NULL); 1642 if (ret) 1643 goto out_quota_failed; 1644 1645 /* Need to update the P2P Device MAC (only GO, IBSS is single vif) */ 1646 if (vif->p2p && mvm->p2p_device_vif) 1647 iwl_mvm_mac_ctxt_changed(mvm, mvm->p2p_device_vif, false, NULL); 1648 1649 iwl_mvm_ref(mvm, IWL_MVM_REF_AP_IBSS); 1650 1651 iwl_mvm_bt_coex_vif_change(mvm); 1652 1653 /* we don't support TDLS during DCM */ 1654 if (iwl_mvm_phy_ctx_count(mvm) > 1) 1655 iwl_mvm_teardown_tdls_peers(mvm); 1656 1657 mutex_unlock(&mvm->mutex); 1658 return 0; 1659 1660out_quota_failed: 1661 iwl_mvm_power_update_mac(mvm); 1662 mvmvif->ap_ibss_active = false; 1663 iwl_mvm_send_rm_bcast_sta(mvm, vif); 1664out_unbind: 1665 iwl_mvm_binding_remove_vif(mvm, vif); 1666out_remove: 1667 iwl_mvm_mac_ctxt_remove(mvm, vif); 1668out_unlock: 1669 mutex_unlock(&mvm->mutex); 1670 iwl_mvm_unref(mvm, IWL_MVM_REF_START_AP); 1671 return ret; 1672} 1673 1674static void iwl_mvm_stop_ap_ibss(struct ieee80211_hw *hw, 1675 struct ieee80211_vif *vif) 1676{ 1677 struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw); 1678 struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif); 1679 1680 iwl_mvm_prepare_mac_removal(mvm, vif); 1681 1682 mutex_lock(&mvm->mutex); 1683 1684 /* Handle AP stop while in CSA */ 1685 if (rcu_access_pointer(mvm->csa_vif) == vif) { 1686 iwl_mvm_remove_time_event(mvm, mvmvif, 1687 &mvmvif->time_event_data); 1688 RCU_INIT_POINTER(mvm->csa_vif, NULL); 1689 } 1690 1691 if (rcu_access_pointer(mvm->csa_tx_blocked_vif) == vif) { 1692 RCU_INIT_POINTER(mvm->csa_tx_blocked_vif, NULL); 1693 mvm->csa_tx_block_bcn_timeout = 0; 1694 } 1695 1696 mvmvif->ap_ibss_active = false; 1697 mvm->ap_last_beacon_gp2 = 0; 1698 1699 iwl_mvm_bt_coex_vif_change(mvm); 1700 1701 iwl_mvm_unref(mvm, IWL_MVM_REF_AP_IBSS); 1702 1703 /* Need to update the P2P Device MAC (only GO, IBSS is single vif) */ 1704 if (vif->p2p && mvm->p2p_device_vif) 1705 iwl_mvm_mac_ctxt_changed(mvm, mvm->p2p_device_vif, false, NULL); 1706 1707 iwl_mvm_update_quotas(mvm, NULL); 1708 iwl_mvm_send_rm_bcast_sta(mvm, vif); 1709 iwl_mvm_binding_remove_vif(mvm, vif); 1710 1711 iwl_mvm_power_update_mac(mvm); 1712 1713 iwl_mvm_mac_ctxt_remove(mvm, vif); 1714 1715 mutex_unlock(&mvm->mutex); 1716} 1717 1718static void 1719iwl_mvm_bss_info_changed_ap_ibss(struct iwl_mvm *mvm, 1720 struct ieee80211_vif *vif, 1721 struct ieee80211_bss_conf *bss_conf, 1722 u32 changes) 1723{ 1724 struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif); 1725 1726 /* Changes will be applied when the AP/IBSS is started */ 1727 if (!mvmvif->ap_ibss_active) 1728 return; 1729 1730 if (changes & (BSS_CHANGED_ERP_CTS_PROT | BSS_CHANGED_HT | 1731 BSS_CHANGED_BANDWIDTH | BSS_CHANGED_QOS) && 1732 iwl_mvm_mac_ctxt_changed(mvm, vif, false, NULL)) 1733 IWL_ERR(mvm, "failed to update MAC %pM\n", vif->addr); 1734 1735 /* Need to send a new beacon template to the FW */ 1736 if (changes & BSS_CHANGED_BEACON && 1737 iwl_mvm_mac_ctxt_beacon_changed(mvm, vif)) 1738 IWL_WARN(mvm, "Failed updating beacon data\n"); 1739 1740 if (changes & BSS_CHANGED_TXPOWER) { 1741 IWL_DEBUG_CALIB(mvm, "Changing TX Power to %d\n", 1742 bss_conf->txpower); 1743 iwl_mvm_set_tx_power(mvm, vif, bss_conf->txpower); 1744 } 1745 1746} 1747 1748static void iwl_mvm_bss_info_changed(struct ieee80211_hw *hw, 1749 struct ieee80211_vif *vif, 1750 struct ieee80211_bss_conf *bss_conf, 1751 u32 changes) 1752{ 1753 struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw); 1754 1755 /* 1756 * iwl_mvm_bss_info_changed_station() might call 1757 * iwl_mvm_protect_session(), which reads directly from 1758 * the device (the system time), so make sure it is available. 1759 */ 1760 if (iwl_mvm_ref_sync(mvm, IWL_MVM_REF_BSS_CHANGED)) 1761 return; 1762 1763 mutex_lock(&mvm->mutex); 1764 1765 if (changes & BSS_CHANGED_IDLE && !bss_conf->idle) 1766 iwl_mvm_scan_offload_stop(mvm, true); 1767 1768 switch (vif->type) { 1769 case NL80211_IFTYPE_STATION: 1770 iwl_mvm_bss_info_changed_station(mvm, vif, bss_conf, changes); 1771 break; 1772 case NL80211_IFTYPE_AP: 1773 case NL80211_IFTYPE_ADHOC: 1774 iwl_mvm_bss_info_changed_ap_ibss(mvm, vif, bss_conf, changes); 1775 break; 1776 default: 1777 /* shouldn't happen */ 1778 WARN_ON_ONCE(1); 1779 } 1780 1781 mutex_unlock(&mvm->mutex); 1782 iwl_mvm_unref(mvm, IWL_MVM_REF_BSS_CHANGED); 1783} 1784 1785static int iwl_mvm_cancel_scan_wait_notif(struct iwl_mvm *mvm, 1786 enum iwl_scan_status scan_type) 1787{ 1788 int ret; 1789 bool wait_for_handlers = false; 1790 1791 mutex_lock(&mvm->mutex); 1792 1793 if (mvm->scan_status != scan_type) { 1794 ret = 0; 1795 /* make sure there are no pending notifications */ 1796 wait_for_handlers = true; 1797 goto out; 1798 } 1799 1800 switch (scan_type) { 1801 case IWL_MVM_SCAN_SCHED: 1802 ret = iwl_mvm_scan_offload_stop(mvm, true); 1803 break; 1804 case IWL_MVM_SCAN_OS: 1805 ret = iwl_mvm_cancel_scan(mvm); 1806 break; 1807 case IWL_MVM_SCAN_NONE: 1808 default: 1809 WARN_ON_ONCE(1); 1810 ret = -EINVAL; 1811 break; 1812 } 1813 if (ret) 1814 goto out; 1815 1816 wait_for_handlers = true; 1817out: 1818 mutex_unlock(&mvm->mutex); 1819 1820 /* make sure we consume the completion notification */ 1821 if (wait_for_handlers) 1822 iwl_mvm_wait_for_async_handlers(mvm); 1823 1824 return ret; 1825} 1826static int iwl_mvm_mac_hw_scan(struct ieee80211_hw *hw, 1827 struct ieee80211_vif *vif, 1828 struct ieee80211_scan_request *hw_req) 1829{ 1830 struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw); 1831 struct cfg80211_scan_request *req = &hw_req->req; 1832 int ret; 1833 1834 if (req->n_channels == 0 || 1835 req->n_channels > mvm->fw->ucode_capa.n_scan_channels) 1836 return -EINVAL; 1837 1838 ret = iwl_mvm_cancel_scan_wait_notif(mvm, IWL_MVM_SCAN_SCHED); 1839 if (ret) 1840 return ret; 1841 1842 mutex_lock(&mvm->mutex); 1843 1844 if (mvm->scan_status != IWL_MVM_SCAN_NONE) { 1845 ret = -EBUSY; 1846 goto out; 1847 } 1848 1849 iwl_mvm_ref(mvm, IWL_MVM_REF_SCAN); 1850 1851 if (mvm->fw->ucode_capa.api[0] & IWL_UCODE_TLV_API_LMAC_SCAN) 1852 ret = iwl_mvm_unified_scan_lmac(mvm, vif, hw_req); 1853 else 1854 ret = iwl_mvm_scan_request(mvm, vif, req); 1855 1856 if (ret) 1857 iwl_mvm_unref(mvm, IWL_MVM_REF_SCAN); 1858out: 1859 mutex_unlock(&mvm->mutex); 1860 return ret; 1861} 1862 1863static void iwl_mvm_mac_cancel_hw_scan(struct ieee80211_hw *hw, 1864 struct ieee80211_vif *vif) 1865{ 1866 struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw); 1867 1868 mutex_lock(&mvm->mutex); 1869 1870 iwl_mvm_cancel_scan(mvm); 1871 1872 mutex_unlock(&mvm->mutex); 1873} 1874 1875static void 1876iwl_mvm_mac_allow_buffered_frames(struct ieee80211_hw *hw, 1877 struct ieee80211_sta *sta, u16 tids, 1878 int num_frames, 1879 enum ieee80211_frame_release_type reason, 1880 bool more_data) 1881{ 1882 struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw); 1883 1884 /* Called when we need to transmit (a) frame(s) from mac80211 */ 1885 1886 iwl_mvm_sta_modify_sleep_tx_count(mvm, sta, reason, num_frames, 1887 tids, more_data, false); 1888} 1889 1890static void 1891iwl_mvm_mac_release_buffered_frames(struct ieee80211_hw *hw, 1892 struct ieee80211_sta *sta, u16 tids, 1893 int num_frames, 1894 enum ieee80211_frame_release_type reason, 1895 bool more_data) 1896{ 1897 struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw); 1898 1899 /* Called when we need to transmit (a) frame(s) from agg queue */ 1900 1901 iwl_mvm_sta_modify_sleep_tx_count(mvm, sta, reason, num_frames, 1902 tids, more_data, true); 1903} 1904 1905static void iwl_mvm_mac_sta_notify(struct ieee80211_hw *hw, 1906 struct ieee80211_vif *vif, 1907 enum sta_notify_cmd cmd, 1908 struct ieee80211_sta *sta) 1909{ 1910 struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw); 1911 struct iwl_mvm_sta *mvmsta = iwl_mvm_sta_from_mac80211(sta); 1912 int tid; 1913 1914 switch (cmd) { 1915 case STA_NOTIFY_SLEEP: 1916 if (atomic_read(&mvm->pending_frames[mvmsta->sta_id]) > 0) 1917 ieee80211_sta_block_awake(hw, sta, true); 1918 spin_lock_bh(&mvmsta->lock); 1919 for (tid = 0; tid < IWL_MAX_TID_COUNT; tid++) { 1920 struct iwl_mvm_tid_data *tid_data; 1921 1922 tid_data = &mvmsta->tid_data[tid]; 1923 if (tid_data->state != IWL_AGG_ON && 1924 tid_data->state != IWL_EMPTYING_HW_QUEUE_DELBA) 1925 continue; 1926 if (iwl_mvm_tid_queued(tid_data) == 0) 1927 continue; 1928 ieee80211_sta_set_buffered(sta, tid, true); 1929 } 1930 spin_unlock_bh(&mvmsta->lock); 1931 /* 1932 * The fw updates the STA to be asleep. Tx packets on the Tx 1933 * queues to this station will not be transmitted. The fw will 1934 * send a Tx response with TX_STATUS_FAIL_DEST_PS. 1935 */ 1936 break; 1937 case STA_NOTIFY_AWAKE: 1938 if (WARN_ON(mvmsta->sta_id == IWL_MVM_STATION_COUNT)) 1939 break; 1940 iwl_mvm_sta_modify_ps_wake(mvm, sta); 1941 break; 1942 default: 1943 break; 1944 } 1945} 1946 1947static void iwl_mvm_sta_pre_rcu_remove(struct ieee80211_hw *hw, 1948 struct ieee80211_vif *vif, 1949 struct ieee80211_sta *sta) 1950{ 1951 struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw); 1952 struct iwl_mvm_sta *mvm_sta = (void *)sta->drv_priv; 1953 1954 /* 1955 * This is called before mac80211 does RCU synchronisation, 1956 * so here we already invalidate our internal RCU-protected 1957 * station pointer. The rest of the code will thus no longer 1958 * be able to find the station this way, and we don't rely 1959 * on further RCU synchronisation after the sta_state() 1960 * callback deleted the station. 1961 */ 1962 mutex_lock(&mvm->mutex); 1963 if (sta == rcu_access_pointer(mvm->fw_id_to_mac_id[mvm_sta->sta_id])) 1964 rcu_assign_pointer(mvm->fw_id_to_mac_id[mvm_sta->sta_id], 1965 ERR_PTR(-ENOENT)); 1966 mutex_unlock(&mvm->mutex); 1967} 1968 1969static int iwl_mvm_mac_sta_state(struct ieee80211_hw *hw, 1970 struct ieee80211_vif *vif, 1971 struct ieee80211_sta *sta, 1972 enum ieee80211_sta_state old_state, 1973 enum ieee80211_sta_state new_state) 1974{ 1975 struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw); 1976 struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif); 1977 int ret; 1978 1979 IWL_DEBUG_MAC80211(mvm, "station %pM state change %d->%d\n", 1980 sta->addr, old_state, new_state); 1981 1982 /* this would be a mac80211 bug ... but don't crash */ 1983 if (WARN_ON_ONCE(!mvmvif->phy_ctxt)) 1984 return -EINVAL; 1985 1986 /* if a STA is being removed, reuse its ID */ 1987 flush_work(&mvm->sta_drained_wk); 1988 1989 mutex_lock(&mvm->mutex); 1990 if (old_state == IEEE80211_STA_NOTEXIST && 1991 new_state == IEEE80211_STA_NONE) { 1992 /* 1993 * Firmware bug - it'll crash if the beacon interval is less 1994 * than 16. We can't avoid connecting at all, so refuse the 1995 * station state change, this will cause mac80211 to abandon 1996 * attempts to connect to this AP, and eventually wpa_s will 1997 * blacklist the AP... 1998 */ 1999 if (vif->type == NL80211_IFTYPE_STATION && 2000 vif->bss_conf.beacon_int < 16) { 2001 IWL_ERR(mvm, 2002 "AP %pM beacon interval is %d, refusing due to firmware bug!\n", 2003 sta->addr, vif->bss_conf.beacon_int); 2004 ret = -EINVAL; 2005 goto out_unlock; 2006 } 2007 2008 if (sta->tdls && 2009 (vif->p2p || 2010 iwl_mvm_tdls_sta_count(mvm, NULL) == 2011 IWL_MVM_TDLS_STA_COUNT || 2012 iwl_mvm_phy_ctx_count(mvm) > 1)) { 2013 IWL_DEBUG_MAC80211(mvm, "refusing TDLS sta\n"); 2014 ret = -EBUSY; 2015 goto out_unlock; 2016 } 2017 2018 ret = iwl_mvm_add_sta(mvm, vif, sta); 2019 if (sta->tdls && ret == 0) 2020 iwl_mvm_recalc_tdls_state(mvm, vif, true); 2021 } else if (old_state == IEEE80211_STA_NONE && 2022 new_state == IEEE80211_STA_AUTH) { 2023 /* 2024 * EBS may be disabled due to previous failures reported by FW. 2025 * Reset EBS status here assuming environment has been changed. 2026 */ 2027 mvm->last_ebs_successful = true; 2028 ret = 0; 2029 } else if (old_state == IEEE80211_STA_AUTH && 2030 new_state == IEEE80211_STA_ASSOC) { 2031 ret = iwl_mvm_update_sta(mvm, vif, sta); 2032 if (ret == 0) 2033 iwl_mvm_rs_rate_init(mvm, sta, 2034 mvmvif->phy_ctxt->channel->band, 2035 true); 2036 } else if (old_state == IEEE80211_STA_ASSOC && 2037 new_state == IEEE80211_STA_AUTHORIZED) { 2038 2039 /* we don't support TDLS during DCM */ 2040 if (iwl_mvm_phy_ctx_count(mvm) > 1) 2041 iwl_mvm_teardown_tdls_peers(mvm); 2042 2043 /* enable beacon filtering */ 2044 WARN_ON(iwl_mvm_enable_beacon_filter(mvm, vif, 0)); 2045 ret = 0; 2046 } else if (old_state == IEEE80211_STA_AUTHORIZED && 2047 new_state == IEEE80211_STA_ASSOC) { 2048 /* disable beacon filtering */ 2049 WARN_ON(iwl_mvm_disable_beacon_filter(mvm, vif, 0)); 2050 ret = 0; 2051 } else if (old_state == IEEE80211_STA_ASSOC && 2052 new_state == IEEE80211_STA_AUTH) { 2053 ret = 0; 2054 } else if (old_state == IEEE80211_STA_AUTH && 2055 new_state == IEEE80211_STA_NONE) { 2056 ret = 0; 2057 } else if (old_state == IEEE80211_STA_NONE && 2058 new_state == IEEE80211_STA_NOTEXIST) { 2059 ret = iwl_mvm_rm_sta(mvm, vif, sta); 2060 if (sta->tdls) 2061 iwl_mvm_recalc_tdls_state(mvm, vif, false); 2062 } else { 2063 ret = -EIO; 2064 } 2065 out_unlock: 2066 mutex_unlock(&mvm->mutex); 2067 2068 return ret; 2069} 2070 2071static int iwl_mvm_mac_set_rts_threshold(struct ieee80211_hw *hw, u32 value) 2072{ 2073 struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw); 2074 2075 mvm->rts_threshold = value; 2076 2077 return 0; 2078} 2079 2080static void iwl_mvm_sta_rc_update(struct ieee80211_hw *hw, 2081 struct ieee80211_vif *vif, 2082 struct ieee80211_sta *sta, u32 changed) 2083{ 2084 struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw); 2085 2086 if (vif->type == NL80211_IFTYPE_STATION && 2087 changed & IEEE80211_RC_NSS_CHANGED) 2088 iwl_mvm_sf_update(mvm, vif, false); 2089} 2090 2091static int iwl_mvm_mac_conf_tx(struct ieee80211_hw *hw, 2092 struct ieee80211_vif *vif, u16 ac, 2093 const struct ieee80211_tx_queue_params *params) 2094{ 2095 struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw); 2096 struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif); 2097 2098 mvmvif->queue_params[ac] = *params; 2099 2100 /* 2101 * No need to update right away, we'll get BSS_CHANGED_QOS 2102 * The exception is P2P_DEVICE interface which needs immediate update. 2103 */ 2104 if (vif->type == NL80211_IFTYPE_P2P_DEVICE) { 2105 int ret; 2106 2107 mutex_lock(&mvm->mutex); 2108 ret = iwl_mvm_mac_ctxt_changed(mvm, vif, false, NULL); 2109 mutex_unlock(&mvm->mutex); 2110 return ret; 2111 } 2112 return 0; 2113} 2114 2115static void iwl_mvm_mac_mgd_prepare_tx(struct ieee80211_hw *hw, 2116 struct ieee80211_vif *vif) 2117{ 2118 struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw); 2119 u32 duration = min(IWL_MVM_TE_SESSION_PROTECTION_MAX_TIME_MS, 2120 200 + vif->bss_conf.beacon_int); 2121 u32 min_duration = min(IWL_MVM_TE_SESSION_PROTECTION_MIN_TIME_MS, 2122 100 + vif->bss_conf.beacon_int); 2123 2124 if (WARN_ON_ONCE(vif->bss_conf.assoc)) 2125 return; 2126 2127 /* 2128 * iwl_mvm_protect_session() reads directly from the device 2129 * (the system time), so make sure it is available. 2130 */ 2131 if (iwl_mvm_ref_sync(mvm, IWL_MVM_REF_PREPARE_TX)) 2132 return; 2133 2134 mutex_lock(&mvm->mutex); 2135 /* Try really hard to protect the session and hear a beacon */ 2136 iwl_mvm_protect_session(mvm, vif, duration, min_duration, 500, false); 2137 mutex_unlock(&mvm->mutex); 2138 2139 iwl_mvm_unref(mvm, IWL_MVM_REF_PREPARE_TX); 2140} 2141 2142static int iwl_mvm_mac_sched_scan_start(struct ieee80211_hw *hw, 2143 struct ieee80211_vif *vif, 2144 struct cfg80211_sched_scan_request *req, 2145 struct ieee80211_scan_ies *ies) 2146{ 2147 struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw); 2148 int ret; 2149 2150 ret = iwl_mvm_cancel_scan_wait_notif(mvm, IWL_MVM_SCAN_OS); 2151 if (ret) 2152 return ret; 2153 2154 mutex_lock(&mvm->mutex); 2155 2156 /* Newest FW fixes sched scan while connected on another interface */ 2157 if (mvm->fw->ucode_capa.api[0] & IWL_UCODE_TLV_API_LMAC_SCAN) { 2158 if (!vif->bss_conf.idle) { 2159 ret = -EBUSY; 2160 goto out; 2161 } 2162 } else if (!iwl_mvm_is_idle(mvm)) { 2163 ret = -EBUSY; 2164 goto out; 2165 } 2166 2167 if (mvm->scan_status != IWL_MVM_SCAN_NONE) { 2168 ret = -EBUSY; 2169 goto out; 2170 } 2171 2172 mvm->scan_status = IWL_MVM_SCAN_SCHED; 2173 2174 if (!(mvm->fw->ucode_capa.api[0] & IWL_UCODE_TLV_API_LMAC_SCAN)) { 2175 ret = iwl_mvm_config_sched_scan(mvm, vif, req, ies); 2176 if (ret) 2177 goto err; 2178 } 2179 2180 ret = iwl_mvm_config_sched_scan_profiles(mvm, req); 2181 if (ret) 2182 goto err; 2183 2184 if (mvm->fw->ucode_capa.api[0] & IWL_UCODE_TLV_API_LMAC_SCAN) 2185 ret = iwl_mvm_unified_sched_scan_lmac(mvm, vif, req, ies); 2186 else 2187 ret = iwl_mvm_sched_scan_start(mvm, req); 2188 2189 if (!ret) 2190 goto out; 2191err: 2192 mvm->scan_status = IWL_MVM_SCAN_NONE; 2193out: 2194 mutex_unlock(&mvm->mutex); 2195 return ret; 2196} 2197 2198static int iwl_mvm_mac_sched_scan_stop(struct ieee80211_hw *hw, 2199 struct ieee80211_vif *vif) 2200{ 2201 struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw); 2202 int ret; 2203 2204 mutex_lock(&mvm->mutex); 2205 ret = iwl_mvm_scan_offload_stop(mvm, false); 2206 mutex_unlock(&mvm->mutex); 2207 iwl_mvm_wait_for_async_handlers(mvm); 2208 2209 return ret; 2210} 2211 2212static int iwl_mvm_mac_set_key(struct ieee80211_hw *hw, 2213 enum set_key_cmd cmd, 2214 struct ieee80211_vif *vif, 2215 struct ieee80211_sta *sta, 2216 struct ieee80211_key_conf *key) 2217{ 2218 struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw); 2219 int ret; 2220 2221 if (iwlwifi_mod_params.sw_crypto) { 2222 IWL_DEBUG_MAC80211(mvm, "leave - hwcrypto disabled\n"); 2223 return -EOPNOTSUPP; 2224 } 2225 2226 switch (key->cipher) { 2227 case WLAN_CIPHER_SUITE_TKIP: 2228 key->flags |= IEEE80211_KEY_FLAG_GENERATE_MMIC; 2229 /* fall-through */ 2230 case WLAN_CIPHER_SUITE_CCMP: 2231 key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV; 2232 break; 2233 case WLAN_CIPHER_SUITE_AES_CMAC: 2234 WARN_ON_ONCE(!(hw->flags & IEEE80211_HW_MFP_CAPABLE)); 2235 break; 2236 case WLAN_CIPHER_SUITE_WEP40: 2237 case WLAN_CIPHER_SUITE_WEP104: 2238 /* 2239 * Support for TX only, at least for now, so accept 2240 * the key and do nothing else. Then mac80211 will 2241 * pass it for TX but we don't have to use it for RX. 2242 */ 2243 return 0; 2244 default: 2245 /* currently FW supports only one optional cipher scheme */ 2246 if (hw->n_cipher_schemes && 2247 hw->cipher_schemes->cipher == key->cipher) 2248 key->flags |= IEEE80211_KEY_FLAG_PUT_IV_SPACE; 2249 else 2250 return -EOPNOTSUPP; 2251 } 2252 2253 mutex_lock(&mvm->mutex); 2254 2255 switch (cmd) { 2256 case SET_KEY: 2257 if ((vif->type == NL80211_IFTYPE_ADHOC || 2258 vif->type == NL80211_IFTYPE_AP) && !sta) { 2259 /* 2260 * GTK on AP interface is a TX-only key, return 0; 2261 * on IBSS they're per-station and because we're lazy 2262 * we don't support them for RX, so do the same. 2263 */ 2264 ret = 0; 2265 key->hw_key_idx = STA_KEY_IDX_INVALID; 2266 break; 2267 } 2268 2269 IWL_DEBUG_MAC80211(mvm, "set hwcrypto key\n"); 2270 ret = iwl_mvm_set_sta_key(mvm, vif, sta, key, false); 2271 if (ret) { 2272 IWL_WARN(mvm, "set key failed\n"); 2273 /* 2274 * can't add key for RX, but we don't need it 2275 * in the device for TX so still return 0 2276 */ 2277 key->hw_key_idx = STA_KEY_IDX_INVALID; 2278 ret = 0; 2279 } 2280 2281 break; 2282 case DISABLE_KEY: 2283 if (key->hw_key_idx == STA_KEY_IDX_INVALID) { 2284 ret = 0; 2285 break; 2286 } 2287 2288 IWL_DEBUG_MAC80211(mvm, "disable hwcrypto key\n"); 2289 ret = iwl_mvm_remove_sta_key(mvm, vif, sta, key); 2290 break; 2291 default: 2292 ret = -EINVAL; 2293 } 2294 2295 mutex_unlock(&mvm->mutex); 2296 return ret; 2297} 2298 2299static void iwl_mvm_mac_update_tkip_key(struct ieee80211_hw *hw, 2300 struct ieee80211_vif *vif, 2301 struct ieee80211_key_conf *keyconf, 2302 struct ieee80211_sta *sta, 2303 u32 iv32, u16 *phase1key) 2304{ 2305 struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw); 2306 2307 if (keyconf->hw_key_idx == STA_KEY_IDX_INVALID) 2308 return; 2309 2310 iwl_mvm_update_tkip_key(mvm, vif, keyconf, sta, iv32, phase1key); 2311} 2312 2313 2314static bool iwl_mvm_rx_aux_roc(struct iwl_notif_wait_data *notif_wait, 2315 struct iwl_rx_packet *pkt, void *data) 2316{ 2317 struct iwl_mvm *mvm = 2318 container_of(notif_wait, struct iwl_mvm, notif_wait); 2319 struct iwl_hs20_roc_res *resp; 2320 int resp_len = iwl_rx_packet_payload_len(pkt); 2321 struct iwl_mvm_time_event_data *te_data = data; 2322 2323 if (WARN_ON(pkt->hdr.cmd != HOT_SPOT_CMD)) 2324 return true; 2325 2326 if (WARN_ON_ONCE(resp_len != sizeof(*resp))) { 2327 IWL_ERR(mvm, "Invalid HOT_SPOT_CMD response\n"); 2328 return true; 2329 } 2330 2331 resp = (void *)pkt->data; 2332 2333 IWL_DEBUG_TE(mvm, 2334 "Aux ROC: Recieved response from ucode: status=%d uid=%d\n", 2335 resp->status, resp->event_unique_id); 2336 2337 te_data->uid = le32_to_cpu(resp->event_unique_id); 2338 IWL_DEBUG_TE(mvm, "TIME_EVENT_CMD response - UID = 0x%x\n", 2339 te_data->uid); 2340 2341 spin_lock_bh(&mvm->time_event_lock); 2342 list_add_tail(&te_data->list, &mvm->aux_roc_te_list); 2343 spin_unlock_bh(&mvm->time_event_lock); 2344 2345 return true; 2346} 2347 2348#define AUX_ROC_MAX_DELAY_ON_CHANNEL 5000 2349static int iwl_mvm_send_aux_roc_cmd(struct iwl_mvm *mvm, 2350 struct ieee80211_channel *channel, 2351 struct ieee80211_vif *vif, 2352 int duration) 2353{ 2354 int res, time_reg = DEVICE_SYSTEM_TIME_REG; 2355 struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif); 2356 struct iwl_mvm_time_event_data *te_data = &mvmvif->hs_time_event_data; 2357 static const u8 time_event_response[] = { HOT_SPOT_CMD }; 2358 struct iwl_notification_wait wait_time_event; 2359 struct iwl_hs20_roc_req aux_roc_req = { 2360 .action = cpu_to_le32(FW_CTXT_ACTION_ADD), 2361 .id_and_color = 2362 cpu_to_le32(FW_CMD_ID_AND_COLOR(MAC_INDEX_AUX, 0)), 2363 .sta_id_and_color = cpu_to_le32(mvm->aux_sta.sta_id), 2364 /* Set the channel info data */ 2365 .channel_info.band = (channel->band == IEEE80211_BAND_2GHZ) ? 2366 PHY_BAND_24 : PHY_BAND_5, 2367 .channel_info.channel = channel->hw_value, 2368 .channel_info.width = PHY_VHT_CHANNEL_MODE20, 2369 /* Set the time and duration */ 2370 .apply_time = cpu_to_le32(iwl_read_prph(mvm->trans, time_reg)), 2371 .apply_time_max_delay = 2372 cpu_to_le32(MSEC_TO_TU(AUX_ROC_MAX_DELAY_ON_CHANNEL)), 2373 .duration = cpu_to_le32(MSEC_TO_TU(duration)), 2374 }; 2375 2376 /* Set the node address */ 2377 memcpy(aux_roc_req.node_addr, vif->addr, ETH_ALEN); 2378 2379 lockdep_assert_held(&mvm->mutex); 2380 2381 spin_lock_bh(&mvm->time_event_lock); 2382 2383 if (WARN_ON(te_data->id == HOT_SPOT_CMD)) { 2384 spin_unlock_bh(&mvm->time_event_lock); 2385 return -EIO; 2386 } 2387 2388 te_data->vif = vif; 2389 te_data->duration = duration; 2390 te_data->id = HOT_SPOT_CMD; 2391 2392 spin_unlock_bh(&mvm->time_event_lock); 2393 2394 /* 2395 * Use a notification wait, which really just processes the 2396 * command response and doesn't wait for anything, in order 2397 * to be able to process the response and get the UID inside 2398 * the RX path. Using CMD_WANT_SKB doesn't work because it 2399 * stores the buffer and then wakes up this thread, by which 2400 * time another notification (that the time event started) 2401 * might already be processed unsuccessfully. 2402 */ 2403 iwl_init_notification_wait(&mvm->notif_wait, &wait_time_event, 2404 time_event_response, 2405 ARRAY_SIZE(time_event_response), 2406 iwl_mvm_rx_aux_roc, te_data); 2407 2408 res = iwl_mvm_send_cmd_pdu(mvm, HOT_SPOT_CMD, 0, sizeof(aux_roc_req), 2409 &aux_roc_req); 2410 2411 if (res) { 2412 IWL_ERR(mvm, "Couldn't send HOT_SPOT_CMD: %d\n", res); 2413 iwl_remove_notification(&mvm->notif_wait, &wait_time_event); 2414 goto out_clear_te; 2415 } 2416 2417 /* No need to wait for anything, so just pass 1 (0 isn't valid) */ 2418 res = iwl_wait_notification(&mvm->notif_wait, &wait_time_event, 1); 2419 /* should never fail */ 2420 WARN_ON_ONCE(res); 2421 2422 if (res) { 2423 out_clear_te: 2424 spin_lock_bh(&mvm->time_event_lock); 2425 iwl_mvm_te_clear_data(mvm, te_data); 2426 spin_unlock_bh(&mvm->time_event_lock); 2427 } 2428 2429 return res; 2430} 2431 2432static int iwl_mvm_roc(struct ieee80211_hw *hw, 2433 struct ieee80211_vif *vif, 2434 struct ieee80211_channel *channel, 2435 int duration, 2436 enum ieee80211_roc_type type) 2437{ 2438 struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw); 2439 struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif); 2440 struct cfg80211_chan_def chandef; 2441 struct iwl_mvm_phy_ctxt *phy_ctxt; 2442 int ret, i; 2443 2444 IWL_DEBUG_MAC80211(mvm, "enter (%d, %d, %d)\n", channel->hw_value, 2445 duration, type); 2446 2447 mutex_lock(&mvm->mutex); 2448 2449 switch (vif->type) { 2450 case NL80211_IFTYPE_STATION: 2451 if (mvm->fw->ucode_capa.capa[0] & 2452 IWL_UCODE_TLV_CAPA_HOTSPOT_SUPPORT) { 2453 /* Use aux roc framework (HS20) */ 2454 ret = iwl_mvm_send_aux_roc_cmd(mvm, channel, 2455 vif, duration); 2456 goto out_unlock; 2457 } 2458 IWL_ERR(mvm, "hotspot not supported\n"); 2459 ret = -EINVAL; 2460 goto out_unlock; 2461 case NL80211_IFTYPE_P2P_DEVICE: 2462 /* handle below */ 2463 break; 2464 default: 2465 IWL_ERR(mvm, "vif isn't P2P_DEVICE: %d\n", vif->type); 2466 ret = -EINVAL; 2467 goto out_unlock; 2468 } 2469 2470 for (i = 0; i < NUM_PHY_CTX; i++) { 2471 phy_ctxt = &mvm->phy_ctxts[i]; 2472 if (phy_ctxt->ref == 0 || mvmvif->phy_ctxt == phy_ctxt) 2473 continue; 2474 2475 if (phy_ctxt->ref && channel == phy_ctxt->channel) { 2476 /* 2477 * Unbind the P2P_DEVICE from the current PHY context, 2478 * and if the PHY context is not used remove it. 2479 */ 2480 ret = iwl_mvm_binding_remove_vif(mvm, vif); 2481 if (WARN(ret, "Failed unbinding P2P_DEVICE\n")) 2482 goto out_unlock; 2483 2484 iwl_mvm_phy_ctxt_unref(mvm, mvmvif->phy_ctxt); 2485 2486 /* Bind the P2P_DEVICE to the current PHY Context */ 2487 mvmvif->phy_ctxt = phy_ctxt; 2488 2489 ret = iwl_mvm_binding_add_vif(mvm, vif); 2490 if (WARN(ret, "Failed binding P2P_DEVICE\n")) 2491 goto out_unlock; 2492 2493 iwl_mvm_phy_ctxt_ref(mvm, mvmvif->phy_ctxt); 2494 goto schedule_time_event; 2495 } 2496 } 2497 2498 /* Need to update the PHY context only if the ROC channel changed */ 2499 if (channel == mvmvif->phy_ctxt->channel) 2500 goto schedule_time_event; 2501 2502 cfg80211_chandef_create(&chandef, channel, NL80211_CHAN_NO_HT); 2503 2504 /* 2505 * Change the PHY context configuration as it is currently referenced 2506 * only by the P2P Device MAC 2507 */ 2508 if (mvmvif->phy_ctxt->ref == 1) { 2509 ret = iwl_mvm_phy_ctxt_changed(mvm, mvmvif->phy_ctxt, 2510 &chandef, 1, 1); 2511 if (ret) 2512 goto out_unlock; 2513 } else { 2514 /* 2515 * The PHY context is shared with other MACs. Need to remove the 2516 * P2P Device from the binding, allocate an new PHY context and 2517 * create a new binding 2518 */ 2519 phy_ctxt = iwl_mvm_get_free_phy_ctxt(mvm); 2520 if (!phy_ctxt) { 2521 ret = -ENOSPC; 2522 goto out_unlock; 2523 } 2524 2525 ret = iwl_mvm_phy_ctxt_changed(mvm, phy_ctxt, &chandef, 2526 1, 1); 2527 if (ret) { 2528 IWL_ERR(mvm, "Failed to change PHY context\n"); 2529 goto out_unlock; 2530 } 2531 2532 /* Unbind the P2P_DEVICE from the current PHY context */ 2533 ret = iwl_mvm_binding_remove_vif(mvm, vif); 2534 if (WARN(ret, "Failed unbinding P2P_DEVICE\n")) 2535 goto out_unlock; 2536 2537 iwl_mvm_phy_ctxt_unref(mvm, mvmvif->phy_ctxt); 2538 2539 /* Bind the P2P_DEVICE to the new allocated PHY context */ 2540 mvmvif->phy_ctxt = phy_ctxt; 2541 2542 ret = iwl_mvm_binding_add_vif(mvm, vif); 2543 if (WARN(ret, "Failed binding P2P_DEVICE\n")) 2544 goto out_unlock; 2545 2546 iwl_mvm_phy_ctxt_ref(mvm, mvmvif->phy_ctxt); 2547 } 2548 2549schedule_time_event: 2550 /* Schedule the time events */ 2551 ret = iwl_mvm_start_p2p_roc(mvm, vif, duration, type); 2552 2553out_unlock: 2554 mutex_unlock(&mvm->mutex); 2555 IWL_DEBUG_MAC80211(mvm, "leave\n"); 2556 return ret; 2557} 2558 2559static int iwl_mvm_cancel_roc(struct ieee80211_hw *hw) 2560{ 2561 struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw); 2562 2563 IWL_DEBUG_MAC80211(mvm, "enter\n"); 2564 2565 mutex_lock(&mvm->mutex); 2566 iwl_mvm_stop_p2p_roc(mvm); 2567 mutex_unlock(&mvm->mutex); 2568 2569 IWL_DEBUG_MAC80211(mvm, "leave\n"); 2570 return 0; 2571} 2572 2573static int __iwl_mvm_add_chanctx(struct iwl_mvm *mvm, 2574 struct ieee80211_chanctx_conf *ctx) 2575{ 2576 u16 *phy_ctxt_id = (u16 *)ctx->drv_priv; 2577 struct iwl_mvm_phy_ctxt *phy_ctxt; 2578 int ret; 2579 2580 lockdep_assert_held(&mvm->mutex); 2581 2582 IWL_DEBUG_MAC80211(mvm, "Add channel context\n"); 2583 2584 phy_ctxt = iwl_mvm_get_free_phy_ctxt(mvm); 2585 if (!phy_ctxt) { 2586 ret = -ENOSPC; 2587 goto out; 2588 } 2589 2590 ret = iwl_mvm_phy_ctxt_changed(mvm, phy_ctxt, &ctx->min_def, 2591 ctx->rx_chains_static, 2592 ctx->rx_chains_dynamic); 2593 if (ret) { 2594 IWL_ERR(mvm, "Failed to add PHY context\n"); 2595 goto out; 2596 } 2597 2598 iwl_mvm_phy_ctxt_ref(mvm, phy_ctxt); 2599 *phy_ctxt_id = phy_ctxt->id; 2600out: 2601 return ret; 2602} 2603 2604static int iwl_mvm_add_chanctx(struct ieee80211_hw *hw, 2605 struct ieee80211_chanctx_conf *ctx) 2606{ 2607 struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw); 2608 int ret; 2609 2610 mutex_lock(&mvm->mutex); 2611 ret = __iwl_mvm_add_chanctx(mvm, ctx); 2612 mutex_unlock(&mvm->mutex); 2613 2614 return ret; 2615} 2616 2617static void __iwl_mvm_remove_chanctx(struct iwl_mvm *mvm, 2618 struct ieee80211_chanctx_conf *ctx) 2619{ 2620 u16 *phy_ctxt_id = (u16 *)ctx->drv_priv; 2621 struct iwl_mvm_phy_ctxt *phy_ctxt = &mvm->phy_ctxts[*phy_ctxt_id]; 2622 2623 lockdep_assert_held(&mvm->mutex); 2624 2625 iwl_mvm_phy_ctxt_unref(mvm, phy_ctxt); 2626} 2627 2628static void iwl_mvm_remove_chanctx(struct ieee80211_hw *hw, 2629 struct ieee80211_chanctx_conf *ctx) 2630{ 2631 struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw); 2632 2633 mutex_lock(&mvm->mutex); 2634 __iwl_mvm_remove_chanctx(mvm, ctx); 2635 mutex_unlock(&mvm->mutex); 2636} 2637 2638static void iwl_mvm_change_chanctx(struct ieee80211_hw *hw, 2639 struct ieee80211_chanctx_conf *ctx, 2640 u32 changed) 2641{ 2642 struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw); 2643 u16 *phy_ctxt_id = (u16 *)ctx->drv_priv; 2644 struct iwl_mvm_phy_ctxt *phy_ctxt = &mvm->phy_ctxts[*phy_ctxt_id]; 2645 2646 if (WARN_ONCE((phy_ctxt->ref > 1) && 2647 (changed & ~(IEEE80211_CHANCTX_CHANGE_WIDTH | 2648 IEEE80211_CHANCTX_CHANGE_RX_CHAINS | 2649 IEEE80211_CHANCTX_CHANGE_RADAR | 2650 IEEE80211_CHANCTX_CHANGE_MIN_WIDTH)), 2651 "Cannot change PHY. Ref=%d, changed=0x%X\n", 2652 phy_ctxt->ref, changed)) 2653 return; 2654 2655 mutex_lock(&mvm->mutex); 2656 iwl_mvm_bt_coex_vif_change(mvm); 2657 iwl_mvm_phy_ctxt_changed(mvm, phy_ctxt, &ctx->min_def, 2658 ctx->rx_chains_static, 2659 ctx->rx_chains_dynamic); 2660 mutex_unlock(&mvm->mutex); 2661} 2662 2663static int __iwl_mvm_assign_vif_chanctx(struct iwl_mvm *mvm, 2664 struct ieee80211_vif *vif, 2665 struct ieee80211_chanctx_conf *ctx, 2666 bool switching_chanctx) 2667{ 2668 u16 *phy_ctxt_id = (u16 *)ctx->drv_priv; 2669 struct iwl_mvm_phy_ctxt *phy_ctxt = &mvm->phy_ctxts[*phy_ctxt_id]; 2670 struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif); 2671 int ret; 2672 2673 lockdep_assert_held(&mvm->mutex); 2674 2675 mvmvif->phy_ctxt = phy_ctxt; 2676 2677 switch (vif->type) { 2678 case NL80211_IFTYPE_AP: 2679 /* Unless it's a CSA flow we have nothing to do here */ 2680 if (vif->csa_active) { 2681 mvmvif->ap_ibss_active = true; 2682 break; 2683 } 2684 case NL80211_IFTYPE_ADHOC: 2685 /* 2686 * The AP binding flow is handled as part of the start_ap flow 2687 * (in bss_info_changed), similarly for IBSS. 2688 */ 2689 ret = 0; 2690 goto out; 2691 case NL80211_IFTYPE_STATION: 2692 break; 2693 case NL80211_IFTYPE_MONITOR: 2694 /* always disable PS when a monitor interface is active */ 2695 mvmvif->ps_disabled = true; 2696 break; 2697 default: 2698 ret = -EINVAL; 2699 goto out; 2700 } 2701 2702 ret = iwl_mvm_binding_add_vif(mvm, vif); 2703 if (ret) 2704 goto out; 2705 2706 /* 2707 * Power state must be updated before quotas, 2708 * otherwise fw will complain. 2709 */ 2710 iwl_mvm_power_update_mac(mvm); 2711 2712 /* Setting the quota at this stage is only required for monitor 2713 * interfaces. For the other types, the bss_info changed flow 2714 * will handle quota settings. 2715 */ 2716 if (vif->type == NL80211_IFTYPE_MONITOR) { 2717 mvmvif->monitor_active = true; 2718 ret = iwl_mvm_update_quotas(mvm, NULL); 2719 if (ret) 2720 goto out_remove_binding; 2721 } 2722 2723 /* Handle binding during CSA */ 2724 if ((vif->type == NL80211_IFTYPE_AP) || 2725 (switching_chanctx && (vif->type == NL80211_IFTYPE_STATION))) { 2726 iwl_mvm_update_quotas(mvm, NULL); 2727 iwl_mvm_mac_ctxt_changed(mvm, vif, false, NULL); 2728 } 2729 2730 if (vif->csa_active && vif->type == NL80211_IFTYPE_STATION) { 2731 struct iwl_mvm_sta *mvmsta; 2732 2733 mvmsta = iwl_mvm_sta_from_staid_protected(mvm, 2734 mvmvif->ap_sta_id); 2735 2736 if (WARN_ON(!mvmsta)) 2737 goto out; 2738 2739 /* TODO: only re-enable after the first beacon */ 2740 iwl_mvm_sta_modify_disable_tx(mvm, mvmsta, false); 2741 } 2742 2743 goto out; 2744 2745out_remove_binding: 2746 iwl_mvm_binding_remove_vif(mvm, vif); 2747 iwl_mvm_power_update_mac(mvm); 2748out: 2749 if (ret) 2750 mvmvif->phy_ctxt = NULL; 2751 return ret; 2752} 2753static int iwl_mvm_assign_vif_chanctx(struct ieee80211_hw *hw, 2754 struct ieee80211_vif *vif, 2755 struct ieee80211_chanctx_conf *ctx) 2756{ 2757 struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw); 2758 int ret; 2759 2760 mutex_lock(&mvm->mutex); 2761 ret = __iwl_mvm_assign_vif_chanctx(mvm, vif, ctx, false); 2762 mutex_unlock(&mvm->mutex); 2763 2764 return ret; 2765} 2766 2767static void __iwl_mvm_unassign_vif_chanctx(struct iwl_mvm *mvm, 2768 struct ieee80211_vif *vif, 2769 struct ieee80211_chanctx_conf *ctx, 2770 bool switching_chanctx) 2771{ 2772 struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif); 2773 struct ieee80211_vif *disabled_vif = NULL; 2774 struct iwl_mvm_sta *mvmsta; 2775 2776 lockdep_assert_held(&mvm->mutex); 2777 2778 iwl_mvm_remove_time_event(mvm, mvmvif, &mvmvif->time_event_data); 2779 2780 switch (vif->type) { 2781 case NL80211_IFTYPE_ADHOC: 2782 goto out; 2783 case NL80211_IFTYPE_MONITOR: 2784 mvmvif->monitor_active = false; 2785 mvmvif->ps_disabled = false; 2786 break; 2787 case NL80211_IFTYPE_AP: 2788 /* This part is triggered only during CSA */ 2789 if (!vif->csa_active || !mvmvif->ap_ibss_active) 2790 goto out; 2791 2792 /* Set CS bit on all the stations */ 2793 iwl_mvm_modify_all_sta_disable_tx(mvm, mvmvif, true); 2794 2795 /* Save blocked iface, the timeout is set on the next beacon */ 2796 rcu_assign_pointer(mvm->csa_tx_blocked_vif, vif); 2797 2798 mvmvif->ap_ibss_active = false; 2799 break; 2800 case NL80211_IFTYPE_STATION: 2801 if (!switching_chanctx) 2802 break; 2803 2804 disabled_vif = vif; 2805 2806 mvmsta = iwl_mvm_sta_from_staid_protected(mvm, 2807 mvmvif->ap_sta_id); 2808 2809 if (!WARN_ON(!mvmsta)) 2810 iwl_mvm_sta_modify_disable_tx(mvm, mvmsta, true); 2811 2812 iwl_mvm_mac_ctxt_changed(mvm, vif, true, NULL); 2813 break; 2814 default: 2815 break; 2816 } 2817 2818 iwl_mvm_update_quotas(mvm, disabled_vif); 2819 iwl_mvm_binding_remove_vif(mvm, vif); 2820 2821out: 2822 mvmvif->phy_ctxt = NULL; 2823 iwl_mvm_power_update_mac(mvm); 2824} 2825 2826static void iwl_mvm_unassign_vif_chanctx(struct ieee80211_hw *hw, 2827 struct ieee80211_vif *vif, 2828 struct ieee80211_chanctx_conf *ctx) 2829{ 2830 struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw); 2831 2832 mutex_lock(&mvm->mutex); 2833 __iwl_mvm_unassign_vif_chanctx(mvm, vif, ctx, false); 2834 mutex_unlock(&mvm->mutex); 2835} 2836 2837static int iwl_mvm_switch_vif_chanctx(struct ieee80211_hw *hw, 2838 struct ieee80211_vif_chanctx_switch *vifs, 2839 int n_vifs, 2840 enum ieee80211_chanctx_switch_mode mode) 2841{ 2842 struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw); 2843 int ret; 2844 2845 /* we only support SWAP_CONTEXTS and with a single-vif right now */ 2846 if (mode != CHANCTX_SWMODE_SWAP_CONTEXTS || n_vifs > 1) 2847 return -EOPNOTSUPP; 2848 2849 mutex_lock(&mvm->mutex); 2850 __iwl_mvm_unassign_vif_chanctx(mvm, vifs[0].vif, vifs[0].old_ctx, true); 2851 __iwl_mvm_remove_chanctx(mvm, vifs[0].old_ctx); 2852 2853 ret = __iwl_mvm_add_chanctx(mvm, vifs[0].new_ctx); 2854 if (ret) { 2855 IWL_ERR(mvm, "failed to add new_ctx during channel switch\n"); 2856 goto out_reassign; 2857 } 2858 2859 ret = __iwl_mvm_assign_vif_chanctx(mvm, vifs[0].vif, vifs[0].new_ctx, 2860 true); 2861 if (ret) { 2862 IWL_ERR(mvm, 2863 "failed to assign new_ctx during channel switch\n"); 2864 goto out_remove; 2865 } 2866 2867 /* we don't support TDLS during DCM - can be caused by channel switch */ 2868 if (iwl_mvm_phy_ctx_count(mvm) > 1) 2869 iwl_mvm_teardown_tdls_peers(mvm); 2870 2871 goto out; 2872 2873out_remove: 2874 __iwl_mvm_remove_chanctx(mvm, vifs[0].new_ctx); 2875 2876out_reassign: 2877 ret = __iwl_mvm_add_chanctx(mvm, vifs[0].old_ctx); 2878 if (ret) { 2879 IWL_ERR(mvm, "failed to add old_ctx back after failure.\n"); 2880 goto out_restart; 2881 } 2882 2883 ret = __iwl_mvm_assign_vif_chanctx(mvm, vifs[0].vif, vifs[0].old_ctx, 2884 true); 2885 if (ret) { 2886 IWL_ERR(mvm, "failed to reassign old_ctx after failure.\n"); 2887 goto out_restart; 2888 } 2889 2890 goto out; 2891 2892out_restart: 2893 /* things keep failing, better restart the hw */ 2894 iwl_mvm_nic_restart(mvm, false); 2895 2896out: 2897 mutex_unlock(&mvm->mutex); 2898 return ret; 2899} 2900 2901static int iwl_mvm_set_tim(struct ieee80211_hw *hw, 2902 struct ieee80211_sta *sta, 2903 bool set) 2904{ 2905 struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw); 2906 struct iwl_mvm_sta *mvm_sta = (void *)sta->drv_priv; 2907 2908 if (!mvm_sta || !mvm_sta->vif) { 2909 IWL_ERR(mvm, "Station is not associated to a vif\n"); 2910 return -EINVAL; 2911 } 2912 2913 return iwl_mvm_mac_ctxt_beacon_changed(mvm, mvm_sta->vif); 2914} 2915 2916#ifdef CONFIG_NL80211_TESTMODE 2917static const struct nla_policy iwl_mvm_tm_policy[IWL_MVM_TM_ATTR_MAX + 1] = { 2918 [IWL_MVM_TM_ATTR_CMD] = { .type = NLA_U32 }, 2919 [IWL_MVM_TM_ATTR_NOA_DURATION] = { .type = NLA_U32 }, 2920 [IWL_MVM_TM_ATTR_BEACON_FILTER_STATE] = { .type = NLA_U32 }, 2921}; 2922 2923static int __iwl_mvm_mac_testmode_cmd(struct iwl_mvm *mvm, 2924 struct ieee80211_vif *vif, 2925 void *data, int len) 2926{ 2927 struct nlattr *tb[IWL_MVM_TM_ATTR_MAX + 1]; 2928 int err; 2929 u32 noa_duration; 2930 2931 err = nla_parse(tb, IWL_MVM_TM_ATTR_MAX, data, len, iwl_mvm_tm_policy); 2932 if (err) 2933 return err; 2934 2935 if (!tb[IWL_MVM_TM_ATTR_CMD]) 2936 return -EINVAL; 2937 2938 switch (nla_get_u32(tb[IWL_MVM_TM_ATTR_CMD])) { 2939 case IWL_MVM_TM_CMD_SET_NOA: 2940 if (!vif || vif->type != NL80211_IFTYPE_AP || !vif->p2p || 2941 !vif->bss_conf.enable_beacon || 2942 !tb[IWL_MVM_TM_ATTR_NOA_DURATION]) 2943 return -EINVAL; 2944 2945 noa_duration = nla_get_u32(tb[IWL_MVM_TM_ATTR_NOA_DURATION]); 2946 if (noa_duration >= vif->bss_conf.beacon_int) 2947 return -EINVAL; 2948 2949 mvm->noa_duration = noa_duration; 2950 mvm->noa_vif = vif; 2951 2952 return iwl_mvm_update_quotas(mvm, NULL); 2953 case IWL_MVM_TM_CMD_SET_BEACON_FILTER: 2954 /* must be associated client vif - ignore authorized */ 2955 if (!vif || vif->type != NL80211_IFTYPE_STATION || 2956 !vif->bss_conf.assoc || !vif->bss_conf.dtim_period || 2957 !tb[IWL_MVM_TM_ATTR_BEACON_FILTER_STATE]) 2958 return -EINVAL; 2959 2960 if (nla_get_u32(tb[IWL_MVM_TM_ATTR_BEACON_FILTER_STATE])) 2961 return iwl_mvm_enable_beacon_filter(mvm, vif, 0); 2962 return iwl_mvm_disable_beacon_filter(mvm, vif, 0); 2963 } 2964 2965 return -EOPNOTSUPP; 2966} 2967 2968static int iwl_mvm_mac_testmode_cmd(struct ieee80211_hw *hw, 2969 struct ieee80211_vif *vif, 2970 void *data, int len) 2971{ 2972 struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw); 2973 int err; 2974 2975 mutex_lock(&mvm->mutex); 2976 err = __iwl_mvm_mac_testmode_cmd(mvm, vif, data, len); 2977 mutex_unlock(&mvm->mutex); 2978 2979 return err; 2980} 2981#endif 2982 2983static void iwl_mvm_channel_switch_beacon(struct ieee80211_hw *hw, 2984 struct ieee80211_vif *vif, 2985 struct cfg80211_chan_def *chandef) 2986{ 2987 struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw); 2988 struct ieee80211_vif *csa_vif; 2989 2990 mutex_lock(&mvm->mutex); 2991 2992 csa_vif = rcu_dereference_protected(mvm->csa_vif, 2993 lockdep_is_held(&mvm->mutex)); 2994 if (WARN(csa_vif && csa_vif->csa_active, 2995 "Another CSA is already in progress")) 2996 goto out_unlock; 2997 2998 IWL_DEBUG_MAC80211(mvm, "CSA started to freq %d\n", 2999 chandef->center_freq1); 3000 rcu_assign_pointer(mvm->csa_vif, vif); 3001 3002out_unlock: 3003 mutex_unlock(&mvm->mutex); 3004} 3005 3006static void iwl_mvm_mac_flush(struct ieee80211_hw *hw, 3007 struct ieee80211_vif *vif, u32 queues, bool drop) 3008{ 3009 struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw); 3010 struct iwl_mvm_vif *mvmvif; 3011 struct iwl_mvm_sta *mvmsta; 3012 3013 if (!vif || vif->type != NL80211_IFTYPE_STATION) 3014 return; 3015 3016 mutex_lock(&mvm->mutex); 3017 mvmvif = iwl_mvm_vif_from_mac80211(vif); 3018 mvmsta = iwl_mvm_sta_from_staid_protected(mvm, mvmvif->ap_sta_id); 3019 3020 if (WARN_ON_ONCE(!mvmsta)) 3021 goto done; 3022 3023 if (drop) { 3024 if (iwl_mvm_flush_tx_path(mvm, mvmsta->tfd_queue_msk, true)) 3025 IWL_ERR(mvm, "flush request fail\n"); 3026 } else { 3027 iwl_trans_wait_tx_queue_empty(mvm->trans, 3028 mvmsta->tfd_queue_msk); 3029 } 3030done: 3031 mutex_unlock(&mvm->mutex); 3032} 3033 3034const struct ieee80211_ops iwl_mvm_hw_ops = { 3035 .tx = iwl_mvm_mac_tx, 3036 .ampdu_action = iwl_mvm_mac_ampdu_action, 3037 .start = iwl_mvm_mac_start, 3038 .restart_complete = iwl_mvm_mac_restart_complete, 3039 .stop = iwl_mvm_mac_stop, 3040 .add_interface = iwl_mvm_mac_add_interface, 3041 .remove_interface = iwl_mvm_mac_remove_interface, 3042 .config = iwl_mvm_mac_config, 3043 .prepare_multicast = iwl_mvm_prepare_multicast, 3044 .configure_filter = iwl_mvm_configure_filter, 3045 .bss_info_changed = iwl_mvm_bss_info_changed, 3046 .hw_scan = iwl_mvm_mac_hw_scan, 3047 .cancel_hw_scan = iwl_mvm_mac_cancel_hw_scan, 3048 .sta_pre_rcu_remove = iwl_mvm_sta_pre_rcu_remove, 3049 .sta_state = iwl_mvm_mac_sta_state, 3050 .sta_notify = iwl_mvm_mac_sta_notify, 3051 .allow_buffered_frames = iwl_mvm_mac_allow_buffered_frames, 3052 .release_buffered_frames = iwl_mvm_mac_release_buffered_frames, 3053 .set_rts_threshold = iwl_mvm_mac_set_rts_threshold, 3054 .sta_rc_update = iwl_mvm_sta_rc_update, 3055 .conf_tx = iwl_mvm_mac_conf_tx, 3056 .mgd_prepare_tx = iwl_mvm_mac_mgd_prepare_tx, 3057 .mgd_protect_tdls_discover = iwl_mvm_mac_mgd_protect_tdls_discover, 3058 .flush = iwl_mvm_mac_flush, 3059 .sched_scan_start = iwl_mvm_mac_sched_scan_start, 3060 .sched_scan_stop = iwl_mvm_mac_sched_scan_stop, 3061 .set_key = iwl_mvm_mac_set_key, 3062 .update_tkip_key = iwl_mvm_mac_update_tkip_key, 3063 .remain_on_channel = iwl_mvm_roc, 3064 .cancel_remain_on_channel = iwl_mvm_cancel_roc, 3065 .add_chanctx = iwl_mvm_add_chanctx, 3066 .remove_chanctx = iwl_mvm_remove_chanctx, 3067 .change_chanctx = iwl_mvm_change_chanctx, 3068 .assign_vif_chanctx = iwl_mvm_assign_vif_chanctx, 3069 .unassign_vif_chanctx = iwl_mvm_unassign_vif_chanctx, 3070 .switch_vif_chanctx = iwl_mvm_switch_vif_chanctx, 3071 3072 .start_ap = iwl_mvm_start_ap_ibss, 3073 .stop_ap = iwl_mvm_stop_ap_ibss, 3074 .join_ibss = iwl_mvm_start_ap_ibss, 3075 .leave_ibss = iwl_mvm_stop_ap_ibss, 3076 3077 .set_tim = iwl_mvm_set_tim, 3078 3079 .channel_switch_beacon = iwl_mvm_channel_switch_beacon, 3080 3081 CFG80211_TESTMODE_CMD(iwl_mvm_mac_testmode_cmd) 3082 3083#ifdef CONFIG_PM_SLEEP 3084 /* look at d3.c */ 3085 .suspend = iwl_mvm_suspend, 3086 .resume = iwl_mvm_resume, 3087 .set_wakeup = iwl_mvm_set_wakeup, 3088 .set_rekey_data = iwl_mvm_set_rekey_data, 3089#if IS_ENABLED(CONFIG_IPV6) 3090 .ipv6_addr_change = iwl_mvm_ipv6_addr_change, 3091#endif 3092 .set_default_unicast_key = iwl_mvm_set_default_unicast_key, 3093#endif 3094}; 3095