[go: nahoru, domu]

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