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 <linux/devcoredump.h>
73#include <net/mac80211.h>
74#include <net/ieee80211_radiotap.h>
75#include <net/tcp.h>
76
77#include "iwl-op-mode.h"
78#include "iwl-io.h"
79#include "mvm.h"
80#include "sta.h"
81#include "time-event.h"
82#include "iwl-eeprom-parse.h"
83#include "fw-api-scan.h"
84#include "iwl-phy-db.h"
85#include "testmode.h"
86#include "iwl-fw-error-dump.h"
87#include "iwl-prph.h"
88#include "iwl-csr.h"
89#include "iwl-nvm-parse.h"
90
91static const struct ieee80211_iface_limit iwl_mvm_limits[] = {
92	{
93		.max = 1,
94		.types = BIT(NL80211_IFTYPE_STATION),
95	},
96	{
97		.max = 1,
98		.types = BIT(NL80211_IFTYPE_AP) |
99			BIT(NL80211_IFTYPE_P2P_CLIENT) |
100			BIT(NL80211_IFTYPE_P2P_GO),
101	},
102	{
103		.max = 1,
104		.types = BIT(NL80211_IFTYPE_P2P_DEVICE),
105	},
106};
107
108static const struct ieee80211_iface_combination iwl_mvm_iface_combinations[] = {
109	{
110		.num_different_channels = 2,
111		.max_interfaces = 3,
112		.limits = iwl_mvm_limits,
113		.n_limits = ARRAY_SIZE(iwl_mvm_limits),
114	},
115};
116
117#ifdef CONFIG_PM_SLEEP
118static const struct nl80211_wowlan_tcp_data_token_feature
119iwl_mvm_wowlan_tcp_token_feature = {
120	.min_len = 0,
121	.max_len = 255,
122	.bufsize = IWL_WOWLAN_REMOTE_WAKE_MAX_TOKENS,
123};
124
125static const struct wiphy_wowlan_tcp_support iwl_mvm_wowlan_tcp_support = {
126	.tok = &iwl_mvm_wowlan_tcp_token_feature,
127	.data_payload_max = IWL_WOWLAN_TCP_MAX_PACKET_LEN -
128			    sizeof(struct ethhdr) -
129			    sizeof(struct iphdr) -
130			    sizeof(struct tcphdr),
131	.data_interval_max = 65535, /* __le16 in API */
132	.wake_payload_max = IWL_WOWLAN_REMOTE_WAKE_MAX_PACKET_LEN -
133			    sizeof(struct ethhdr) -
134			    sizeof(struct iphdr) -
135			    sizeof(struct tcphdr),
136	.seq = true,
137};
138#endif
139
140#ifdef CONFIG_IWLWIFI_BCAST_FILTERING
141/*
142 * Use the reserved field to indicate magic values.
143 * these values will only be used internally by the driver,
144 * and won't make it to the fw (reserved will be 0).
145 * BC_FILTER_MAGIC_IP - configure the val of this attribute to
146 *	be the vif's ip address. in case there is not a single
147 *	ip address (0, or more than 1), this attribute will
148 *	be skipped.
149 * BC_FILTER_MAGIC_MAC - set the val of this attribute to
150 *	the LSB bytes of the vif's mac address
151 */
152enum {
153	BC_FILTER_MAGIC_NONE = 0,
154	BC_FILTER_MAGIC_IP,
155	BC_FILTER_MAGIC_MAC,
156};
157
158static const struct iwl_fw_bcast_filter iwl_mvm_default_bcast_filters[] = {
159	{
160		/* arp */
161		.discard = 0,
162		.frame_type = BCAST_FILTER_FRAME_TYPE_ALL,
163		.attrs = {
164			{
165				/* frame type - arp, hw type - ethernet */
166				.offset_type =
167					BCAST_FILTER_OFFSET_PAYLOAD_START,
168				.offset = sizeof(rfc1042_header),
169				.val = cpu_to_be32(0x08060001),
170				.mask = cpu_to_be32(0xffffffff),
171			},
172			{
173				/* arp dest ip */
174				.offset_type =
175					BCAST_FILTER_OFFSET_PAYLOAD_START,
176				.offset = sizeof(rfc1042_header) + 2 +
177					  sizeof(struct arphdr) +
178					  ETH_ALEN + sizeof(__be32) +
179					  ETH_ALEN,
180				.mask = cpu_to_be32(0xffffffff),
181				/* mark it as special field */
182				.reserved1 = cpu_to_le16(BC_FILTER_MAGIC_IP),
183			},
184		},
185	},
186	{
187		/* dhcp offer bcast */
188		.discard = 0,
189		.frame_type = BCAST_FILTER_FRAME_TYPE_IPV4,
190		.attrs = {
191			{
192				/* udp dest port - 68 (bootp client)*/
193				.offset_type = BCAST_FILTER_OFFSET_IP_END,
194				.offset = offsetof(struct udphdr, dest),
195				.val = cpu_to_be32(0x00440000),
196				.mask = cpu_to_be32(0xffff0000),
197			},
198			{
199				/* dhcp - lsb bytes of client hw address */
200				.offset_type = BCAST_FILTER_OFFSET_IP_END,
201				.offset = 38,
202				.mask = cpu_to_be32(0xffffffff),
203				/* mark it as special field */
204				.reserved1 = cpu_to_le16(BC_FILTER_MAGIC_MAC),
205			},
206		},
207	},
208	/* last filter must be empty */
209	{},
210};
211#endif
212
213void iwl_mvm_ref(struct iwl_mvm *mvm, enum iwl_mvm_ref_type ref_type)
214{
215	if (!iwl_mvm_is_d0i3_supported(mvm))
216		return;
217
218	IWL_DEBUG_RPM(mvm, "Take mvm reference - type %d\n", ref_type);
219	spin_lock_bh(&mvm->refs_lock);
220	mvm->refs[ref_type]++;
221	spin_unlock_bh(&mvm->refs_lock);
222	iwl_trans_ref(mvm->trans);
223}
224
225void iwl_mvm_unref(struct iwl_mvm *mvm, enum iwl_mvm_ref_type ref_type)
226{
227	if (!iwl_mvm_is_d0i3_supported(mvm))
228		return;
229
230	IWL_DEBUG_RPM(mvm, "Leave mvm reference - type %d\n", ref_type);
231	spin_lock_bh(&mvm->refs_lock);
232	WARN_ON(!mvm->refs[ref_type]--);
233	spin_unlock_bh(&mvm->refs_lock);
234	iwl_trans_unref(mvm->trans);
235}
236
237static void iwl_mvm_unref_all_except(struct iwl_mvm *mvm,
238				     enum iwl_mvm_ref_type except_ref)
239{
240	int i, j;
241
242	if (!iwl_mvm_is_d0i3_supported(mvm))
243		return;
244
245	spin_lock_bh(&mvm->refs_lock);
246	for (i = 0; i < IWL_MVM_REF_COUNT; i++) {
247		if (except_ref == i || !mvm->refs[i])
248			continue;
249
250		IWL_DEBUG_RPM(mvm, "Cleanup: remove mvm ref type %d (%d)\n",
251			      i, mvm->refs[i]);
252		for (j = 0; j < mvm->refs[i]; j++)
253			iwl_trans_unref(mvm->trans);
254		mvm->refs[i] = 0;
255	}
256	spin_unlock_bh(&mvm->refs_lock);
257}
258
259bool iwl_mvm_ref_taken(struct iwl_mvm *mvm)
260{
261	int i;
262	bool taken = false;
263
264	if (!iwl_mvm_is_d0i3_supported(mvm))
265		return true;
266
267	spin_lock_bh(&mvm->refs_lock);
268	for (i = 0; i < IWL_MVM_REF_COUNT; i++) {
269		if (mvm->refs[i]) {
270			taken = true;
271			break;
272		}
273	}
274	spin_unlock_bh(&mvm->refs_lock);
275
276	return taken;
277}
278
279int iwl_mvm_ref_sync(struct iwl_mvm *mvm, enum iwl_mvm_ref_type ref_type)
280{
281	iwl_mvm_ref(mvm, ref_type);
282
283	if (!wait_event_timeout(mvm->d0i3_exit_waitq,
284				!test_bit(IWL_MVM_STATUS_IN_D0I3, &mvm->status),
285				HZ)) {
286		WARN_ON_ONCE(1);
287		iwl_mvm_unref(mvm, ref_type);
288		return -EIO;
289	}
290
291	return 0;
292}
293
294static void iwl_mvm_reset_phy_ctxts(struct iwl_mvm *mvm)
295{
296	int i;
297
298	memset(mvm->phy_ctxts, 0, sizeof(mvm->phy_ctxts));
299	for (i = 0; i < NUM_PHY_CTX; i++) {
300		mvm->phy_ctxts[i].id = i;
301		mvm->phy_ctxts[i].ref = 0;
302	}
303}
304
305struct ieee80211_regdomain *iwl_mvm_get_regdomain(struct wiphy *wiphy,
306						  const char *alpha2,
307						  enum iwl_mcc_source src_id,
308						  bool *changed)
309{
310	struct ieee80211_regdomain *regd = NULL;
311	struct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy);
312	struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
313	struct iwl_mcc_update_resp *resp;
314
315	IWL_DEBUG_LAR(mvm, "Getting regdomain data for %s from FW\n", alpha2);
316
317	lockdep_assert_held(&mvm->mutex);
318
319	resp = iwl_mvm_update_mcc(mvm, alpha2, src_id);
320	if (IS_ERR_OR_NULL(resp)) {
321		IWL_DEBUG_LAR(mvm, "Could not get update from FW %d\n",
322			      PTR_RET(resp));
323		goto out;
324	}
325
326	if (changed)
327		*changed = (resp->status == MCC_RESP_NEW_CHAN_PROFILE);
328
329	regd = iwl_parse_nvm_mcc_info(mvm->trans->dev, mvm->cfg,
330				      __le32_to_cpu(resp->n_channels),
331				      resp->channels,
332				      __le16_to_cpu(resp->mcc));
333	/* Store the return source id */
334	src_id = resp->source_id;
335	kfree(resp);
336	if (IS_ERR_OR_NULL(regd)) {
337		IWL_DEBUG_LAR(mvm, "Could not get parse update from FW %d\n",
338			      PTR_RET(regd));
339		goto out;
340	}
341
342	IWL_DEBUG_LAR(mvm, "setting alpha2 from FW to %s (0x%x, 0x%x) src=%d\n",
343		      regd->alpha2, regd->alpha2[0], regd->alpha2[1], src_id);
344	mvm->lar_regdom_set = true;
345	mvm->mcc_src = src_id;
346
347out:
348	return regd;
349}
350
351void iwl_mvm_update_changed_regdom(struct iwl_mvm *mvm)
352{
353	bool changed;
354	struct ieee80211_regdomain *regd;
355
356	if (!iwl_mvm_is_lar_supported(mvm))
357		return;
358
359	regd = iwl_mvm_get_current_regdomain(mvm, &changed);
360	if (!IS_ERR_OR_NULL(regd)) {
361		/* only update the regulatory core if changed */
362		if (changed)
363			regulatory_set_wiphy_regd(mvm->hw->wiphy, regd);
364
365		kfree(regd);
366	}
367}
368
369struct ieee80211_regdomain *iwl_mvm_get_current_regdomain(struct iwl_mvm *mvm,
370							  bool *changed)
371{
372	return iwl_mvm_get_regdomain(mvm->hw->wiphy, "ZZ",
373				     iwl_mvm_is_wifi_mcc_supported(mvm) ?
374				     MCC_SOURCE_GET_CURRENT :
375				     MCC_SOURCE_OLD_FW, changed);
376}
377
378int iwl_mvm_init_fw_regd(struct iwl_mvm *mvm)
379{
380	enum iwl_mcc_source used_src;
381	struct ieee80211_regdomain *regd;
382	int ret;
383	bool changed;
384	const struct ieee80211_regdomain *r =
385			rtnl_dereference(mvm->hw->wiphy->regd);
386
387	if (!r)
388		return -ENOENT;
389
390	/* save the last source in case we overwrite it below */
391	used_src = mvm->mcc_src;
392	if (iwl_mvm_is_wifi_mcc_supported(mvm)) {
393		/* Notify the firmware we support wifi location updates */
394		regd = iwl_mvm_get_current_regdomain(mvm, NULL);
395		if (!IS_ERR_OR_NULL(regd))
396			kfree(regd);
397	}
398
399	/* Now set our last stored MCC and source */
400	regd = iwl_mvm_get_regdomain(mvm->hw->wiphy, r->alpha2, used_src,
401				     &changed);
402	if (IS_ERR_OR_NULL(regd))
403		return -EIO;
404
405	/* update cfg80211 if the regdomain was changed */
406	if (changed)
407		ret = regulatory_set_wiphy_regd_sync_rtnl(mvm->hw->wiphy, regd);
408	else
409		ret = 0;
410
411	kfree(regd);
412	return ret;
413}
414
415int iwl_mvm_mac_setup_register(struct iwl_mvm *mvm)
416{
417	struct ieee80211_hw *hw = mvm->hw;
418	int num_mac, ret, i;
419
420	/* Tell mac80211 our characteristics */
421	hw->flags = IEEE80211_HW_SIGNAL_DBM |
422		    IEEE80211_HW_SPECTRUM_MGMT |
423		    IEEE80211_HW_REPORTS_TX_ACK_STATUS |
424		    IEEE80211_HW_QUEUE_CONTROL |
425		    IEEE80211_HW_WANT_MONITOR_VIF |
426		    IEEE80211_HW_SUPPORTS_PS |
427		    IEEE80211_HW_SUPPORTS_DYNAMIC_PS |
428		    IEEE80211_HW_AMPDU_AGGREGATION |
429		    IEEE80211_HW_TIMING_BEACON_ONLY |
430		    IEEE80211_HW_CONNECTION_MONITOR |
431		    IEEE80211_HW_CHANCTX_STA_CSA |
432		    IEEE80211_HW_SUPPORTS_CLONED_SKBS;
433
434	hw->queues = mvm->first_agg_queue;
435	hw->offchannel_tx_hw_queue = IWL_MVM_OFFCHANNEL_QUEUE;
436	hw->radiotap_mcs_details |= IEEE80211_RADIOTAP_MCS_HAVE_FEC |
437				    IEEE80211_RADIOTAP_MCS_HAVE_STBC;
438	hw->radiotap_vht_details |= IEEE80211_RADIOTAP_VHT_KNOWN_STBC |
439		IEEE80211_RADIOTAP_VHT_KNOWN_BEAMFORMED;
440	hw->rate_control_algorithm = "iwl-mvm-rs";
441	hw->uapsd_queues = IWL_MVM_UAPSD_QUEUES;
442	hw->uapsd_max_sp_len = IWL_UAPSD_MAX_SP;
443
444	/*
445	 * Enable 11w if advertised by firmware and software crypto
446	 * is not enabled (as the firmware will interpret some mgmt
447	 * packets, so enabling it with software crypto isn't safe)
448	 */
449	if (mvm->fw->ucode_capa.flags & IWL_UCODE_TLV_FLAGS_MFP &&
450	    !iwlwifi_mod_params.sw_crypto)
451		hw->flags |= IEEE80211_HW_MFP_CAPABLE;
452
453	hw->flags |= IEEE80211_SINGLE_HW_SCAN_ON_ALL_BANDS;
454	hw->wiphy->features |=
455		NL80211_FEATURE_SCHED_SCAN_RANDOM_MAC_ADDR |
456		NL80211_FEATURE_SCAN_RANDOM_MAC_ADDR;
457
458	hw->sta_data_size = sizeof(struct iwl_mvm_sta);
459	hw->vif_data_size = sizeof(struct iwl_mvm_vif);
460	hw->chanctx_data_size = sizeof(u16);
461
462	hw->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) |
463		BIT(NL80211_IFTYPE_P2P_CLIENT) |
464		BIT(NL80211_IFTYPE_AP) |
465		BIT(NL80211_IFTYPE_P2P_GO) |
466		BIT(NL80211_IFTYPE_P2P_DEVICE) |
467		BIT(NL80211_IFTYPE_ADHOC);
468
469	hw->wiphy->flags |= WIPHY_FLAG_IBSS_RSN;
470	hw->wiphy->regulatory_flags |= REGULATORY_ENABLE_RELAX_NO_IR;
471	if (iwl_mvm_is_lar_supported(mvm))
472		hw->wiphy->regulatory_flags |= REGULATORY_WIPHY_SELF_MANAGED;
473	else
474		hw->wiphy->regulatory_flags |= REGULATORY_CUSTOM_REG |
475					       REGULATORY_DISABLE_BEACON_HINTS;
476
477	if (mvm->fw->ucode_capa.flags & IWL_UCODE_TLV_FLAGS_GO_UAPSD)
478		hw->wiphy->flags |= WIPHY_FLAG_AP_UAPSD;
479
480	hw->wiphy->flags |= WIPHY_FLAG_HAS_CHANNEL_SWITCH;
481
482	hw->wiphy->iface_combinations = iwl_mvm_iface_combinations;
483	hw->wiphy->n_iface_combinations =
484		ARRAY_SIZE(iwl_mvm_iface_combinations);
485
486	hw->wiphy->max_remain_on_channel_duration = 10000;
487	hw->max_listen_interval = IWL_CONN_MAX_LISTEN_INTERVAL;
488	/* we can compensate an offset of up to 3 channels = 15 MHz */
489	hw->wiphy->max_adj_channel_rssi_comp = 3 * 5;
490
491	/* Extract MAC address */
492	memcpy(mvm->addresses[0].addr, mvm->nvm_data->hw_addr, ETH_ALEN);
493	hw->wiphy->addresses = mvm->addresses;
494	hw->wiphy->n_addresses = 1;
495
496	/* Extract additional MAC addresses if available */
497	num_mac = (mvm->nvm_data->n_hw_addrs > 1) ?
498		min(IWL_MVM_MAX_ADDRESSES, mvm->nvm_data->n_hw_addrs) : 1;
499
500	for (i = 1; i < num_mac; i++) {
501		memcpy(mvm->addresses[i].addr, mvm->addresses[i-1].addr,
502		       ETH_ALEN);
503		mvm->addresses[i].addr[5]++;
504		hw->wiphy->n_addresses++;
505	}
506
507	iwl_mvm_reset_phy_ctxts(mvm);
508
509	hw->wiphy->max_scan_ie_len = iwl_mvm_max_scan_ie_len(mvm, false);
510
511	hw->wiphy->max_scan_ssids = PROBE_OPTION_MAX;
512
513	if (mvm->nvm_data->bands[IEEE80211_BAND_2GHZ].n_channels)
514		hw->wiphy->bands[IEEE80211_BAND_2GHZ] =
515			&mvm->nvm_data->bands[IEEE80211_BAND_2GHZ];
516	if (mvm->nvm_data->bands[IEEE80211_BAND_5GHZ].n_channels) {
517		hw->wiphy->bands[IEEE80211_BAND_5GHZ] =
518			&mvm->nvm_data->bands[IEEE80211_BAND_5GHZ];
519
520		if ((mvm->fw->ucode_capa.capa[0] &
521		     IWL_UCODE_TLV_CAPA_BEAMFORMER) &&
522		    (mvm->fw->ucode_capa.api[0] &
523		     IWL_UCODE_TLV_API_LQ_SS_PARAMS))
524			hw->wiphy->bands[IEEE80211_BAND_5GHZ]->vht_cap.cap |=
525				IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE;
526	}
527
528	hw->wiphy->hw_version = mvm->trans->hw_id;
529
530	if (iwlmvm_mod_params.power_scheme != IWL_POWER_SCHEME_CAM)
531		hw->wiphy->flags |= WIPHY_FLAG_PS_ON_BY_DEFAULT;
532	else
533		hw->wiphy->flags &= ~WIPHY_FLAG_PS_ON_BY_DEFAULT;
534
535	if (IWL_UCODE_API(mvm->fw->ucode_ver) >= 10) {
536		hw->wiphy->flags |= WIPHY_FLAG_SUPPORTS_SCHED_SCAN;
537		hw->wiphy->max_sched_scan_ssids = PROBE_OPTION_MAX;
538		hw->wiphy->max_match_sets = IWL_SCAN_MAX_PROFILES;
539		/* we create the 802.11 header and zero length SSID IE. */
540		hw->wiphy->max_sched_scan_ie_len =
541			SCAN_OFFLOAD_PROBE_REQ_SIZE - 24 - 2;
542	}
543
544	hw->wiphy->features |= NL80211_FEATURE_P2P_GO_CTWIN |
545			       NL80211_FEATURE_LOW_PRIORITY_SCAN |
546			       NL80211_FEATURE_P2P_GO_OPPPS |
547			       NL80211_FEATURE_DYNAMIC_SMPS |
548			       NL80211_FEATURE_STATIC_SMPS |
549			       NL80211_FEATURE_SUPPORTS_WMM_ADMISSION;
550
551	if (mvm->fw->ucode_capa.capa[0] &
552	    IWL_UCODE_TLV_CAPA_TXPOWER_INSERTION_SUPPORT)
553		hw->wiphy->features |= NL80211_FEATURE_TX_POWER_INSERTION;
554	if (mvm->fw->ucode_capa.capa[0] &
555	    IWL_UCODE_TLV_CAPA_QUIET_PERIOD_SUPPORT)
556		hw->wiphy->features |= NL80211_FEATURE_QUIET;
557
558	if (mvm->fw->ucode_capa.capa[0] &
559	    IWL_UCODE_TLV_CAPA_DS_PARAM_SET_IE_SUPPORT)
560		hw->wiphy->features |=
561			NL80211_FEATURE_DS_PARAM_SET_IE_IN_PROBES;
562
563	if (mvm->fw->ucode_capa.capa[0] &
564	    IWL_UCODE_TLV_CAPA_WFA_TPC_REP_IE_SUPPORT)
565		hw->wiphy->features |= NL80211_FEATURE_WFA_TPC_IE_IN_PROBES;
566
567	mvm->rts_threshold = IEEE80211_MAX_RTS_THRESHOLD;
568
569	/* currently FW API supports only one optional cipher scheme */
570	if (mvm->fw->cs[0].cipher) {
571		mvm->hw->n_cipher_schemes = 1;
572		mvm->hw->cipher_schemes = &mvm->fw->cs[0];
573	}
574
575#ifdef CONFIG_PM_SLEEP
576	if (iwl_mvm_is_d0i3_supported(mvm) &&
577	    device_can_wakeup(mvm->trans->dev)) {
578		mvm->wowlan.flags = WIPHY_WOWLAN_ANY;
579		hw->wiphy->wowlan = &mvm->wowlan;
580	}
581
582	if (mvm->fw->img[IWL_UCODE_WOWLAN].sec[0].len &&
583	    mvm->trans->ops->d3_suspend &&
584	    mvm->trans->ops->d3_resume &&
585	    device_can_wakeup(mvm->trans->dev)) {
586		mvm->wowlan.flags |= WIPHY_WOWLAN_MAGIC_PKT |
587				     WIPHY_WOWLAN_DISCONNECT |
588				     WIPHY_WOWLAN_EAP_IDENTITY_REQ |
589				     WIPHY_WOWLAN_RFKILL_RELEASE |
590				     WIPHY_WOWLAN_NET_DETECT;
591		if (!iwlwifi_mod_params.sw_crypto)
592			mvm->wowlan.flags |= WIPHY_WOWLAN_SUPPORTS_GTK_REKEY |
593					     WIPHY_WOWLAN_GTK_REKEY_FAILURE |
594					     WIPHY_WOWLAN_4WAY_HANDSHAKE;
595
596		mvm->wowlan.n_patterns = IWL_WOWLAN_MAX_PATTERNS;
597		mvm->wowlan.pattern_min_len = IWL_WOWLAN_MIN_PATTERN_LEN;
598		mvm->wowlan.pattern_max_len = IWL_WOWLAN_MAX_PATTERN_LEN;
599		mvm->wowlan.max_nd_match_sets = IWL_SCAN_MAX_PROFILES;
600		mvm->wowlan.tcp = &iwl_mvm_wowlan_tcp_support;
601		hw->wiphy->wowlan = &mvm->wowlan;
602	}
603#endif
604
605#ifdef CONFIG_IWLWIFI_BCAST_FILTERING
606	/* assign default bcast filtering configuration */
607	mvm->bcast_filters = iwl_mvm_default_bcast_filters;
608#endif
609
610	ret = iwl_mvm_leds_init(mvm);
611	if (ret)
612		return ret;
613
614	if (mvm->fw->ucode_capa.capa[0] & IWL_UCODE_TLV_CAPA_TDLS_SUPPORT) {
615		IWL_DEBUG_TDLS(mvm, "TDLS supported\n");
616		hw->wiphy->flags |= WIPHY_FLAG_SUPPORTS_TDLS;
617	}
618
619	if (mvm->fw->ucode_capa.capa[0] &
620	    IWL_UCODE_TLV_CAPA_TDLS_CHANNEL_SWITCH) {
621		IWL_DEBUG_TDLS(mvm, "TDLS channel switch supported\n");
622		hw->wiphy->features |= NL80211_FEATURE_TDLS_CHANNEL_SWITCH;
623	}
624
625	ret = ieee80211_register_hw(mvm->hw);
626	if (ret)
627		iwl_mvm_leds_exit(mvm);
628
629	return ret;
630}
631
632static bool iwl_mvm_defer_tx(struct iwl_mvm *mvm,
633			     struct ieee80211_sta *sta,
634			     struct sk_buff *skb)
635{
636	struct iwl_mvm_sta *mvmsta;
637	bool defer = false;
638
639	/*
640	 * double check the IN_D0I3 flag both before and after
641	 * taking the spinlock, in order to prevent taking
642	 * the spinlock when not needed.
643	 */
644	if (likely(!test_bit(IWL_MVM_STATUS_IN_D0I3, &mvm->status)))
645		return false;
646
647	spin_lock(&mvm->d0i3_tx_lock);
648	/*
649	 * testing the flag again ensures the skb dequeue
650	 * loop (on d0i3 exit) hasn't run yet.
651	 */
652	if (!test_bit(IWL_MVM_STATUS_IN_D0I3, &mvm->status))
653		goto out;
654
655	mvmsta = iwl_mvm_sta_from_mac80211(sta);
656	if (mvmsta->sta_id == IWL_MVM_STATION_COUNT ||
657	    mvmsta->sta_id != mvm->d0i3_ap_sta_id)
658		goto out;
659
660	__skb_queue_tail(&mvm->d0i3_tx, skb);
661	ieee80211_stop_queues(mvm->hw);
662
663	/* trigger wakeup */
664	iwl_mvm_ref(mvm, IWL_MVM_REF_TX);
665	iwl_mvm_unref(mvm, IWL_MVM_REF_TX);
666
667	defer = true;
668out:
669	spin_unlock(&mvm->d0i3_tx_lock);
670	return defer;
671}
672
673static void iwl_mvm_mac_tx(struct ieee80211_hw *hw,
674			   struct ieee80211_tx_control *control,
675			   struct sk_buff *skb)
676{
677	struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
678	struct ieee80211_sta *sta = control->sta;
679	struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
680	struct ieee80211_hdr *hdr = (void *)skb->data;
681
682	if (iwl_mvm_is_radio_killed(mvm)) {
683		IWL_DEBUG_DROP(mvm, "Dropping - RF/CT KILL\n");
684		goto drop;
685	}
686
687	if (IEEE80211_SKB_CB(skb)->hw_queue == IWL_MVM_OFFCHANNEL_QUEUE &&
688	    !test_bit(IWL_MVM_STATUS_ROC_RUNNING, &mvm->status) &&
689	    !test_bit(IWL_MVM_STATUS_ROC_AUX_RUNNING, &mvm->status))
690		goto drop;
691
692	/* treat non-bufferable MMPDUs as broadcast if sta is sleeping */
693	if (unlikely(info->flags & IEEE80211_TX_CTL_NO_PS_BUFFER &&
694		     ieee80211_is_mgmt(hdr->frame_control) &&
695		     !ieee80211_is_deauth(hdr->frame_control) &&
696		     !ieee80211_is_disassoc(hdr->frame_control) &&
697		     !ieee80211_is_action(hdr->frame_control)))
698		sta = NULL;
699
700	if (sta) {
701		if (iwl_mvm_defer_tx(mvm, sta, skb))
702			return;
703		if (iwl_mvm_tx_skb(mvm, skb, sta))
704			goto drop;
705		return;
706	}
707
708	if (iwl_mvm_tx_skb_non_sta(mvm, skb))
709		goto drop;
710	return;
711 drop:
712	ieee80211_free_txskb(hw, skb);
713}
714
715static inline bool iwl_enable_rx_ampdu(const struct iwl_cfg *cfg)
716{
717	if (iwlwifi_mod_params.disable_11n & IWL_DISABLE_HT_RXAGG)
718		return false;
719	return true;
720}
721
722static inline bool iwl_enable_tx_ampdu(const struct iwl_cfg *cfg)
723{
724	if (iwlwifi_mod_params.disable_11n & IWL_DISABLE_HT_TXAGG)
725		return false;
726	if (iwlwifi_mod_params.disable_11n & IWL_ENABLE_HT_TXAGG)
727		return true;
728
729	/* enabled by default */
730	return true;
731}
732
733static int iwl_mvm_mac_ampdu_action(struct ieee80211_hw *hw,
734				    struct ieee80211_vif *vif,
735				    enum ieee80211_ampdu_mlme_action action,
736				    struct ieee80211_sta *sta, u16 tid,
737				    u16 *ssn, u8 buf_size)
738{
739	struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
740	int ret;
741	bool tx_agg_ref = false;
742
743	IWL_DEBUG_HT(mvm, "A-MPDU action on addr %pM tid %d: action %d\n",
744		     sta->addr, tid, action);
745
746	if (!(mvm->nvm_data->sku_cap_11n_enable))
747		return -EACCES;
748
749	/* return from D0i3 before starting a new Tx aggregation */
750	switch (action) {
751	case IEEE80211_AMPDU_TX_START:
752	case IEEE80211_AMPDU_TX_STOP_CONT:
753	case IEEE80211_AMPDU_TX_STOP_FLUSH:
754	case IEEE80211_AMPDU_TX_STOP_FLUSH_CONT:
755	case IEEE80211_AMPDU_TX_OPERATIONAL:
756		/*
757		 * for tx start, wait synchronously until D0i3 exit to
758		 * get the correct sequence number for the tid.
759		 * additionally, some other ampdu actions use direct
760		 * target access, which is not handled automatically
761		 * by the trans layer (unlike commands), so wait for
762		 * d0i3 exit in these cases as well.
763		 */
764		ret = iwl_mvm_ref_sync(mvm, IWL_MVM_REF_TX_AGG);
765		if (ret)
766			return ret;
767
768		tx_agg_ref = true;
769		break;
770	default:
771		break;
772	}
773
774	mutex_lock(&mvm->mutex);
775
776	switch (action) {
777	case IEEE80211_AMPDU_RX_START:
778		if (!iwl_enable_rx_ampdu(mvm->cfg)) {
779			ret = -EINVAL;
780			break;
781		}
782		ret = iwl_mvm_sta_rx_agg(mvm, sta, tid, *ssn, true);
783		break;
784	case IEEE80211_AMPDU_RX_STOP:
785		ret = iwl_mvm_sta_rx_agg(mvm, sta, tid, 0, false);
786		break;
787	case IEEE80211_AMPDU_TX_START:
788		if (!iwl_enable_tx_ampdu(mvm->cfg)) {
789			ret = -EINVAL;
790			break;
791		}
792		ret = iwl_mvm_sta_tx_agg_start(mvm, vif, sta, tid, ssn);
793		break;
794	case IEEE80211_AMPDU_TX_STOP_CONT:
795		ret = iwl_mvm_sta_tx_agg_stop(mvm, vif, sta, tid);
796		break;
797	case IEEE80211_AMPDU_TX_STOP_FLUSH:
798	case IEEE80211_AMPDU_TX_STOP_FLUSH_CONT:
799		ret = iwl_mvm_sta_tx_agg_flush(mvm, vif, sta, tid);
800		break;
801	case IEEE80211_AMPDU_TX_OPERATIONAL:
802		ret = iwl_mvm_sta_tx_agg_oper(mvm, vif, sta, tid, buf_size);
803		break;
804	default:
805		WARN_ON_ONCE(1);
806		ret = -EINVAL;
807		break;
808	}
809	mutex_unlock(&mvm->mutex);
810
811	/*
812	 * If the tid is marked as started, we won't use it for offloaded
813	 * traffic on the next D0i3 entry. It's safe to unref.
814	 */
815	if (tx_agg_ref)
816		iwl_mvm_unref(mvm, IWL_MVM_REF_TX_AGG);
817
818	return ret;
819}
820
821static void iwl_mvm_cleanup_iterator(void *data, u8 *mac,
822				     struct ieee80211_vif *vif)
823{
824	struct iwl_mvm *mvm = data;
825	struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
826
827	mvmvif->uploaded = false;
828	mvmvif->ap_sta_id = IWL_MVM_STATION_COUNT;
829
830	spin_lock_bh(&mvm->time_event_lock);
831	iwl_mvm_te_clear_data(mvm, &mvmvif->time_event_data);
832	spin_unlock_bh(&mvm->time_event_lock);
833
834	mvmvif->phy_ctxt = NULL;
835	memset(&mvmvif->bf_data, 0, sizeof(mvmvif->bf_data));
836}
837
838static ssize_t iwl_mvm_read_coredump(char *buffer, loff_t offset, size_t count,
839				     const void *data, size_t datalen)
840{
841	const struct iwl_mvm_dump_ptrs *dump_ptrs = data;
842	ssize_t bytes_read;
843	ssize_t bytes_read_trans;
844
845	if (offset < dump_ptrs->op_mode_len) {
846		bytes_read = min_t(ssize_t, count,
847				   dump_ptrs->op_mode_len - offset);
848		memcpy(buffer, (u8 *)dump_ptrs->op_mode_ptr + offset,
849		       bytes_read);
850		offset += bytes_read;
851		count -= bytes_read;
852
853		if (count == 0)
854			return bytes_read;
855	} else {
856		bytes_read = 0;
857	}
858
859	if (!dump_ptrs->trans_ptr)
860		return bytes_read;
861
862	offset -= dump_ptrs->op_mode_len;
863	bytes_read_trans = min_t(ssize_t, count,
864				 dump_ptrs->trans_ptr->len - offset);
865	memcpy(buffer + bytes_read,
866	       (u8 *)dump_ptrs->trans_ptr->data + offset,
867	       bytes_read_trans);
868
869	return bytes_read + bytes_read_trans;
870}
871
872static void iwl_mvm_free_coredump(const void *data)
873{
874	const struct iwl_mvm_dump_ptrs *fw_error_dump = data;
875
876	vfree(fw_error_dump->op_mode_ptr);
877	vfree(fw_error_dump->trans_ptr);
878	kfree(fw_error_dump);
879}
880
881static void iwl_mvm_dump_fifos(struct iwl_mvm *mvm,
882			       struct iwl_fw_error_dump_data **dump_data)
883{
884	struct iwl_fw_error_dump_fifo *fifo_hdr;
885	u32 *fifo_data;
886	u32 fifo_len;
887	unsigned long flags;
888	int i, j;
889
890	if (!iwl_trans_grab_nic_access(mvm->trans, false, &flags))
891		return;
892
893	/* Pull RXF data from all RXFs */
894	for (i = 0; i < ARRAY_SIZE(mvm->shared_mem_cfg.rxfifo_size); i++) {
895		/*
896		 * Keep aside the additional offset that might be needed for
897		 * next RXF
898		 */
899		u32 offset_diff = RXF_DIFF_FROM_PREV * i;
900
901		fifo_hdr = (void *)(*dump_data)->data;
902		fifo_data = (void *)fifo_hdr->data;
903		fifo_len = mvm->shared_mem_cfg.rxfifo_size[i];
904
905		/* No need to try to read the data if the length is 0 */
906		if (fifo_len == 0)
907			continue;
908
909		/* Add a TLV for the RXF */
910		(*dump_data)->type = cpu_to_le32(IWL_FW_ERROR_DUMP_RXF);
911		(*dump_data)->len = cpu_to_le32(fifo_len + sizeof(*fifo_hdr));
912
913		fifo_hdr->fifo_num = cpu_to_le32(i);
914		fifo_hdr->available_bytes =
915			cpu_to_le32(iwl_trans_read_prph(mvm->trans,
916							RXF_RD_D_SPACE +
917							offset_diff));
918		fifo_hdr->wr_ptr =
919			cpu_to_le32(iwl_trans_read_prph(mvm->trans,
920							RXF_RD_WR_PTR +
921							offset_diff));
922		fifo_hdr->rd_ptr =
923			cpu_to_le32(iwl_trans_read_prph(mvm->trans,
924							RXF_RD_RD_PTR +
925							offset_diff));
926		fifo_hdr->fence_ptr =
927			cpu_to_le32(iwl_trans_read_prph(mvm->trans,
928							RXF_RD_FENCE_PTR +
929							offset_diff));
930		fifo_hdr->fence_mode =
931			cpu_to_le32(iwl_trans_read_prph(mvm->trans,
932							RXF_SET_FENCE_MODE +
933							offset_diff));
934
935		/* Lock fence */
936		iwl_trans_write_prph(mvm->trans,
937				     RXF_SET_FENCE_MODE + offset_diff, 0x1);
938		/* Set fence pointer to the same place like WR pointer */
939		iwl_trans_write_prph(mvm->trans,
940				     RXF_LD_WR2FENCE + offset_diff, 0x1);
941		/* Set fence offset */
942		iwl_trans_write_prph(mvm->trans,
943				     RXF_LD_FENCE_OFFSET_ADDR + offset_diff,
944				     0x0);
945
946		/* Read FIFO */
947		fifo_len /= sizeof(u32); /* Size in DWORDS */
948		for (j = 0; j < fifo_len; j++)
949			fifo_data[j] = iwl_trans_read_prph(mvm->trans,
950							 RXF_FIFO_RD_FENCE_INC +
951							 offset_diff);
952		*dump_data = iwl_fw_error_next_data(*dump_data);
953	}
954
955	/* Pull TXF data from all TXFs */
956	for (i = 0; i < ARRAY_SIZE(mvm->shared_mem_cfg.txfifo_size); i++) {
957		/* Mark the number of TXF we're pulling now */
958		iwl_trans_write_prph(mvm->trans, TXF_LARC_NUM, i);
959
960		fifo_hdr = (void *)(*dump_data)->data;
961		fifo_data = (void *)fifo_hdr->data;
962		fifo_len = mvm->shared_mem_cfg.txfifo_size[i];
963
964		/* No need to try to read the data if the length is 0 */
965		if (fifo_len == 0)
966			continue;
967
968		/* Add a TLV for the FIFO */
969		(*dump_data)->type = cpu_to_le32(IWL_FW_ERROR_DUMP_TXF);
970		(*dump_data)->len = cpu_to_le32(fifo_len + sizeof(*fifo_hdr));
971
972		fifo_hdr->fifo_num = cpu_to_le32(i);
973		fifo_hdr->available_bytes =
974			cpu_to_le32(iwl_trans_read_prph(mvm->trans,
975							TXF_FIFO_ITEM_CNT));
976		fifo_hdr->wr_ptr =
977			cpu_to_le32(iwl_trans_read_prph(mvm->trans,
978							TXF_WR_PTR));
979		fifo_hdr->rd_ptr =
980			cpu_to_le32(iwl_trans_read_prph(mvm->trans,
981							TXF_RD_PTR));
982		fifo_hdr->fence_ptr =
983			cpu_to_le32(iwl_trans_read_prph(mvm->trans,
984							TXF_FENCE_PTR));
985		fifo_hdr->fence_mode =
986			cpu_to_le32(iwl_trans_read_prph(mvm->trans,
987							TXF_LOCK_FENCE));
988
989		/* Set the TXF_READ_MODIFY_ADDR to TXF_WR_PTR */
990		iwl_trans_write_prph(mvm->trans, TXF_READ_MODIFY_ADDR,
991				     TXF_WR_PTR);
992
993		/* Dummy-read to advance the read pointer to the head */
994		iwl_trans_read_prph(mvm->trans, TXF_READ_MODIFY_DATA);
995
996		/* Read FIFO */
997		fifo_len /= sizeof(u32); /* Size in DWORDS */
998		for (j = 0; j < fifo_len; j++)
999			fifo_data[j] = iwl_trans_read_prph(mvm->trans,
1000							  TXF_READ_MODIFY_DATA);
1001		*dump_data = iwl_fw_error_next_data(*dump_data);
1002	}
1003
1004	iwl_trans_release_nic_access(mvm->trans, &flags);
1005}
1006
1007void iwl_mvm_free_fw_dump_desc(struct iwl_mvm *mvm)
1008{
1009	if (mvm->fw_dump_desc == &iwl_mvm_dump_desc_assert ||
1010	    !mvm->fw_dump_desc)
1011		return;
1012
1013	kfree(mvm->fw_dump_desc);
1014	mvm->fw_dump_desc = NULL;
1015}
1016
1017#define IWL8260_ICCM_OFFSET		0x44000 /* Only for B-step */
1018#define IWL8260_ICCM_LEN		0xC000 /* Only for B-step */
1019
1020void iwl_mvm_fw_error_dump(struct iwl_mvm *mvm)
1021{
1022	struct iwl_fw_error_dump_file *dump_file;
1023	struct iwl_fw_error_dump_data *dump_data;
1024	struct iwl_fw_error_dump_info *dump_info;
1025	struct iwl_fw_error_dump_mem *dump_mem;
1026	struct iwl_fw_error_dump_trigger_desc *dump_trig;
1027	struct iwl_mvm_dump_ptrs *fw_error_dump;
1028	u32 sram_len, sram_ofs;
1029	u32 file_len, fifo_data_len = 0;
1030	u32 smem_len = mvm->cfg->smem_len;
1031	u32 sram2_len = mvm->cfg->dccm2_len;
1032
1033	lockdep_assert_held(&mvm->mutex);
1034
1035	fw_error_dump = kzalloc(sizeof(*fw_error_dump), GFP_KERNEL);
1036	if (!fw_error_dump)
1037		return;
1038
1039	/* SRAM - include stack CCM if driver knows the values for it */
1040	if (!mvm->cfg->dccm_offset || !mvm->cfg->dccm_len) {
1041		const struct fw_img *img;
1042
1043		img = &mvm->fw->img[mvm->cur_ucode];
1044		sram_ofs = img->sec[IWL_UCODE_SECTION_DATA].offset;
1045		sram_len = img->sec[IWL_UCODE_SECTION_DATA].len;
1046	} else {
1047		sram_ofs = mvm->cfg->dccm_offset;
1048		sram_len = mvm->cfg->dccm_len;
1049	}
1050
1051	/* reading RXF/TXF sizes */
1052	if (test_bit(STATUS_FW_ERROR, &mvm->trans->status)) {
1053		struct iwl_mvm_shared_mem_cfg *mem_cfg = &mvm->shared_mem_cfg;
1054		int i;
1055
1056		fifo_data_len = 0;
1057
1058		/* Count RXF size */
1059		for (i = 0; i < ARRAY_SIZE(mem_cfg->rxfifo_size); i++) {
1060			if (!mem_cfg->rxfifo_size[i])
1061				continue;
1062
1063			/* Add header info */
1064			fifo_data_len += mem_cfg->rxfifo_size[i] +
1065					 sizeof(*dump_data) +
1066					 sizeof(struct iwl_fw_error_dump_fifo);
1067		}
1068
1069		for (i = 0; i < ARRAY_SIZE(mem_cfg->txfifo_size); i++) {
1070			if (!mem_cfg->txfifo_size[i])
1071				continue;
1072
1073			/* Add header info */
1074			fifo_data_len += mem_cfg->txfifo_size[i] +
1075					 sizeof(*dump_data) +
1076					 sizeof(struct iwl_fw_error_dump_fifo);
1077		}
1078	}
1079
1080	file_len = sizeof(*dump_file) +
1081		   sizeof(*dump_data) * 2 +
1082		   sram_len + sizeof(*dump_mem) +
1083		   fifo_data_len +
1084		   sizeof(*dump_info);
1085
1086	/*
1087	 * In 8000 HW family B-step include the ICCM (which resides separately)
1088	 */
1089	if (mvm->cfg->device_family == IWL_DEVICE_FAMILY_8000 &&
1090	    CSR_HW_REV_STEP(mvm->trans->hw_rev) == SILICON_B_STEP)
1091		file_len += sizeof(*dump_data) + sizeof(*dump_mem) +
1092			    IWL8260_ICCM_LEN;
1093
1094	if (mvm->fw_dump_desc)
1095		file_len += sizeof(*dump_data) + sizeof(*dump_trig) +
1096			    mvm->fw_dump_desc->len;
1097
1098	/* Make room for the SMEM, if it exists */
1099	if (smem_len)
1100		file_len += sizeof(*dump_data) + sizeof(*dump_mem) + smem_len;
1101
1102	/* Make room for the secondary SRAM, if it exists */
1103	if (sram2_len)
1104		file_len += sizeof(*dump_data) + sizeof(*dump_mem) + sram2_len;
1105
1106	dump_file = vzalloc(file_len);
1107	if (!dump_file) {
1108		kfree(fw_error_dump);
1109		iwl_mvm_free_fw_dump_desc(mvm);
1110		return;
1111	}
1112
1113	fw_error_dump->op_mode_ptr = dump_file;
1114
1115	dump_file->barker = cpu_to_le32(IWL_FW_ERROR_DUMP_BARKER);
1116	dump_data = (void *)dump_file->data;
1117
1118	dump_data->type = cpu_to_le32(IWL_FW_ERROR_DUMP_DEV_FW_INFO);
1119	dump_data->len = cpu_to_le32(sizeof(*dump_info));
1120	dump_info = (void *) dump_data->data;
1121	dump_info->device_family =
1122		mvm->cfg->device_family == IWL_DEVICE_FAMILY_7000 ?
1123			cpu_to_le32(IWL_FW_ERROR_DUMP_FAMILY_7) :
1124			cpu_to_le32(IWL_FW_ERROR_DUMP_FAMILY_8);
1125	dump_info->hw_step = cpu_to_le32(CSR_HW_REV_STEP(mvm->trans->hw_rev));
1126	memcpy(dump_info->fw_human_readable, mvm->fw->human_readable,
1127	       sizeof(dump_info->fw_human_readable));
1128	strncpy(dump_info->dev_human_readable, mvm->cfg->name,
1129		sizeof(dump_info->dev_human_readable));
1130	strncpy(dump_info->bus_human_readable, mvm->dev->bus->name,
1131		sizeof(dump_info->bus_human_readable));
1132
1133	dump_data = iwl_fw_error_next_data(dump_data);
1134	/* We only dump the FIFOs if the FW is in error state */
1135	if (test_bit(STATUS_FW_ERROR, &mvm->trans->status))
1136		iwl_mvm_dump_fifos(mvm, &dump_data);
1137
1138	if (mvm->fw_dump_desc) {
1139		dump_data->type = cpu_to_le32(IWL_FW_ERROR_DUMP_ERROR_INFO);
1140		dump_data->len = cpu_to_le32(sizeof(*dump_trig) +
1141					     mvm->fw_dump_desc->len);
1142		dump_trig = (void *)dump_data->data;
1143		memcpy(dump_trig, &mvm->fw_dump_desc->trig_desc,
1144		       sizeof(*dump_trig) + mvm->fw_dump_desc->len);
1145
1146		/* now we can free this copy */
1147		iwl_mvm_free_fw_dump_desc(mvm);
1148		dump_data = iwl_fw_error_next_data(dump_data);
1149	}
1150
1151	dump_data->type = cpu_to_le32(IWL_FW_ERROR_DUMP_MEM);
1152	dump_data->len = cpu_to_le32(sram_len + sizeof(*dump_mem));
1153	dump_mem = (void *)dump_data->data;
1154	dump_mem->type = cpu_to_le32(IWL_FW_ERROR_DUMP_MEM_SRAM);
1155	dump_mem->offset = cpu_to_le32(sram_ofs);
1156	iwl_trans_read_mem_bytes(mvm->trans, sram_ofs, dump_mem->data,
1157				 sram_len);
1158
1159	if (smem_len) {
1160		dump_data = iwl_fw_error_next_data(dump_data);
1161		dump_data->type = cpu_to_le32(IWL_FW_ERROR_DUMP_MEM);
1162		dump_data->len = cpu_to_le32(smem_len + sizeof(*dump_mem));
1163		dump_mem = (void *)dump_data->data;
1164		dump_mem->type = cpu_to_le32(IWL_FW_ERROR_DUMP_MEM_SMEM);
1165		dump_mem->offset = cpu_to_le32(mvm->cfg->smem_offset);
1166		iwl_trans_read_mem_bytes(mvm->trans, mvm->cfg->smem_offset,
1167					 dump_mem->data, smem_len);
1168	}
1169
1170	if (sram2_len) {
1171		dump_data = iwl_fw_error_next_data(dump_data);
1172		dump_data->type = cpu_to_le32(IWL_FW_ERROR_DUMP_MEM);
1173		dump_data->len = cpu_to_le32(sram2_len + sizeof(*dump_mem));
1174		dump_mem = (void *)dump_data->data;
1175		dump_mem->type = cpu_to_le32(IWL_FW_ERROR_DUMP_MEM_SRAM);
1176		dump_mem->offset = cpu_to_le32(mvm->cfg->dccm2_offset);
1177		iwl_trans_read_mem_bytes(mvm->trans, mvm->cfg->dccm2_offset,
1178					 dump_mem->data, sram2_len);
1179	}
1180
1181	if (mvm->cfg->device_family == IWL_DEVICE_FAMILY_8000 &&
1182	    CSR_HW_REV_STEP(mvm->trans->hw_rev) == SILICON_B_STEP) {
1183		dump_data = iwl_fw_error_next_data(dump_data);
1184		dump_data->type = cpu_to_le32(IWL_FW_ERROR_DUMP_MEM);
1185		dump_data->len = cpu_to_le32(IWL8260_ICCM_LEN +
1186					     sizeof(*dump_mem));
1187		dump_mem = (void *)dump_data->data;
1188		dump_mem->type = cpu_to_le32(IWL_FW_ERROR_DUMP_MEM_SRAM);
1189		dump_mem->offset = cpu_to_le32(IWL8260_ICCM_OFFSET);
1190		iwl_trans_read_mem_bytes(mvm->trans, IWL8260_ICCM_OFFSET,
1191					 dump_mem->data, IWL8260_ICCM_LEN);
1192	}
1193
1194	fw_error_dump->trans_ptr = iwl_trans_dump_data(mvm->trans);
1195	fw_error_dump->op_mode_len = file_len;
1196	if (fw_error_dump->trans_ptr)
1197		file_len += fw_error_dump->trans_ptr->len;
1198	dump_file->file_len = cpu_to_le32(file_len);
1199
1200	dev_coredumpm(mvm->trans->dev, THIS_MODULE, fw_error_dump, 0,
1201		      GFP_KERNEL, iwl_mvm_read_coredump, iwl_mvm_free_coredump);
1202
1203	clear_bit(IWL_MVM_STATUS_DUMPING_FW_LOG, &mvm->status);
1204}
1205
1206struct iwl_mvm_dump_desc iwl_mvm_dump_desc_assert = {
1207	.trig_desc = {
1208		.type = cpu_to_le32(FW_DBG_TRIGGER_FW_ASSERT),
1209	},
1210};
1211
1212static void iwl_mvm_restart_cleanup(struct iwl_mvm *mvm)
1213{
1214	/* clear the D3 reconfig, we only need it to avoid dumping a
1215	 * firmware coredump on reconfiguration, we shouldn't do that
1216	 * on D3->D0 transition
1217	 */
1218	if (!test_and_clear_bit(IWL_MVM_STATUS_D3_RECONFIG, &mvm->status)) {
1219		mvm->fw_dump_desc = &iwl_mvm_dump_desc_assert;
1220		iwl_mvm_fw_error_dump(mvm);
1221	}
1222
1223	/* cleanup all stale references (scan, roc), but keep the
1224	 * ucode_down ref until reconfig is complete
1225	 */
1226	iwl_mvm_unref_all_except(mvm, IWL_MVM_REF_UCODE_DOWN);
1227
1228	iwl_trans_stop_device(mvm->trans);
1229
1230	mvm->scan_status = IWL_MVM_SCAN_NONE;
1231	mvm->ps_disabled = false;
1232	mvm->calibrating = false;
1233
1234	/* just in case one was running */
1235	ieee80211_remain_on_channel_expired(mvm->hw);
1236
1237	ieee80211_iterate_active_interfaces_atomic(
1238		mvm->hw, IEEE80211_IFACE_ITER_RESUME_ALL,
1239		iwl_mvm_cleanup_iterator, mvm);
1240
1241	mvm->p2p_device_vif = NULL;
1242	mvm->d0i3_ap_sta_id = IWL_MVM_STATION_COUNT;
1243
1244	iwl_mvm_reset_phy_ctxts(mvm);
1245	memset(mvm->fw_key_table, 0, sizeof(mvm->fw_key_table));
1246	memset(mvm->sta_drained, 0, sizeof(mvm->sta_drained));
1247	memset(mvm->tfd_drained, 0, sizeof(mvm->tfd_drained));
1248	memset(&mvm->last_bt_notif, 0, sizeof(mvm->last_bt_notif));
1249	memset(&mvm->last_bt_notif_old, 0, sizeof(mvm->last_bt_notif_old));
1250	memset(&mvm->last_bt_ci_cmd, 0, sizeof(mvm->last_bt_ci_cmd));
1251	memset(&mvm->last_bt_ci_cmd_old, 0, sizeof(mvm->last_bt_ci_cmd_old));
1252	memset(&mvm->bt_ack_kill_msk, 0, sizeof(mvm->bt_ack_kill_msk));
1253	memset(&mvm->bt_cts_kill_msk, 0, sizeof(mvm->bt_cts_kill_msk));
1254
1255	ieee80211_wake_queues(mvm->hw);
1256
1257	/* clear any stale d0i3 state */
1258	clear_bit(IWL_MVM_STATUS_IN_D0I3, &mvm->status);
1259
1260	mvm->vif_count = 0;
1261	mvm->rx_ba_sessions = 0;
1262	mvm->fw_dbg_conf = FW_DBG_INVALID;
1263
1264	/* keep statistics ticking */
1265	iwl_mvm_accu_radio_stats(mvm);
1266}
1267
1268int __iwl_mvm_mac_start(struct iwl_mvm *mvm)
1269{
1270	int ret;
1271
1272	lockdep_assert_held(&mvm->mutex);
1273
1274	/* Clean up some internal and mac80211 state on restart */
1275	if (test_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status))
1276		iwl_mvm_restart_cleanup(mvm);
1277
1278	ret = iwl_mvm_up(mvm);
1279
1280	if (ret && test_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status)) {
1281		/* Something went wrong - we need to finish some cleanup
1282		 * that normally iwl_mvm_mac_restart_complete() below
1283		 * would do.
1284		 */
1285		clear_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status);
1286		iwl_mvm_d0i3_enable_tx(mvm, NULL);
1287	}
1288
1289	return ret;
1290}
1291
1292static int iwl_mvm_mac_start(struct ieee80211_hw *hw)
1293{
1294	struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
1295	int ret;
1296
1297	/* Some hw restart cleanups must not hold the mutex */
1298	if (test_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status)) {
1299		/*
1300		 * Make sure we are out of d0i3. This is needed
1301		 * to make sure the reference accounting is correct
1302		 * (and there is no stale d0i3_exit_work).
1303		 */
1304		wait_event_timeout(mvm->d0i3_exit_waitq,
1305				   !test_bit(IWL_MVM_STATUS_IN_D0I3,
1306					     &mvm->status),
1307				   HZ);
1308	}
1309
1310	mutex_lock(&mvm->mutex);
1311	ret = __iwl_mvm_mac_start(mvm);
1312	mutex_unlock(&mvm->mutex);
1313
1314	return ret;
1315}
1316
1317static void iwl_mvm_restart_complete(struct iwl_mvm *mvm)
1318{
1319	int ret;
1320
1321	mutex_lock(&mvm->mutex);
1322
1323	clear_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status);
1324	iwl_mvm_d0i3_enable_tx(mvm, NULL);
1325	ret = iwl_mvm_update_quotas(mvm, true, NULL);
1326	if (ret)
1327		IWL_ERR(mvm, "Failed to update quotas after restart (%d)\n",
1328			ret);
1329
1330	/* allow transport/FW low power modes */
1331	iwl_mvm_unref(mvm, IWL_MVM_REF_UCODE_DOWN);
1332
1333	/*
1334	 * If we have TDLS peers, remove them. We don't know the last seqno/PN
1335	 * of packets the FW sent out, so we must reconnect.
1336	 */
1337	iwl_mvm_teardown_tdls_peers(mvm);
1338
1339	mutex_unlock(&mvm->mutex);
1340}
1341
1342static void iwl_mvm_resume_complete(struct iwl_mvm *mvm)
1343{
1344	bool exit_now;
1345
1346	if (!iwl_mvm_is_d0i3_supported(mvm))
1347		return;
1348
1349	mutex_lock(&mvm->d0i3_suspend_mutex);
1350	__clear_bit(D0I3_DEFER_WAKEUP, &mvm->d0i3_suspend_flags);
1351	exit_now = __test_and_clear_bit(D0I3_PENDING_WAKEUP,
1352					&mvm->d0i3_suspend_flags);
1353	mutex_unlock(&mvm->d0i3_suspend_mutex);
1354
1355	if (exit_now) {
1356		IWL_DEBUG_RPM(mvm, "Run deferred d0i3 exit\n");
1357		_iwl_mvm_exit_d0i3(mvm);
1358	}
1359
1360	if (mvm->trans->d0i3_mode == IWL_D0I3_MODE_ON_SUSPEND)
1361		if (!wait_event_timeout(mvm->d0i3_exit_waitq,
1362					!test_bit(IWL_MVM_STATUS_IN_D0I3,
1363						  &mvm->status),
1364					HZ))
1365			WARN_ONCE(1, "D0i3 exit on resume timed out\n");
1366}
1367
1368static void
1369iwl_mvm_mac_reconfig_complete(struct ieee80211_hw *hw,
1370			      enum ieee80211_reconfig_type reconfig_type)
1371{
1372	struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
1373
1374	switch (reconfig_type) {
1375	case IEEE80211_RECONFIG_TYPE_RESTART:
1376		iwl_mvm_restart_complete(mvm);
1377		break;
1378	case IEEE80211_RECONFIG_TYPE_SUSPEND:
1379		iwl_mvm_resume_complete(mvm);
1380		break;
1381	}
1382}
1383
1384void __iwl_mvm_mac_stop(struct iwl_mvm *mvm)
1385{
1386	lockdep_assert_held(&mvm->mutex);
1387
1388	/* firmware counters are obviously reset now, but we shouldn't
1389	 * partially track so also clear the fw_reset_accu counters.
1390	 */
1391	memset(&mvm->accu_radio_stats, 0, sizeof(mvm->accu_radio_stats));
1392
1393	/*
1394	 * Disallow low power states when the FW is down by taking
1395	 * the UCODE_DOWN ref. in case of ongoing hw restart the
1396	 * ref is already taken, so don't take it again.
1397	 */
1398	if (!test_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status))
1399		iwl_mvm_ref(mvm, IWL_MVM_REF_UCODE_DOWN);
1400
1401	/* async_handlers_wk is now blocked */
1402
1403	/*
1404	 * The work item could be running or queued if the
1405	 * ROC time event stops just as we get here.
1406	 */
1407	flush_work(&mvm->roc_done_wk);
1408
1409	iwl_trans_stop_device(mvm->trans);
1410
1411	iwl_mvm_async_handlers_purge(mvm);
1412	/* async_handlers_list is empty and will stay empty: HW is stopped */
1413
1414	/* the fw is stopped, the aux sta is dead: clean up driver state */
1415	iwl_mvm_del_aux_sta(mvm);
1416
1417	/*
1418	 * Clear IN_HW_RESTART flag when stopping the hw (as restart_complete()
1419	 * won't be called in this case).
1420	 */
1421	clear_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status);
1422
1423	/* We shouldn't have any UIDs still set.  Loop over all the UIDs to
1424	 * make sure there's nothing left there and warn if any is found.
1425	 */
1426	if (mvm->fw->ucode_capa.capa[0] & IWL_UCODE_TLV_CAPA_UMAC_SCAN) {
1427		int i;
1428
1429		for (i = 0; i < IWL_MVM_MAX_SIMULTANEOUS_SCANS; i++) {
1430			if (WARN_ONCE(mvm->scan_uid[i],
1431				      "UMAC scan UID %d was not cleaned\n",
1432				      mvm->scan_uid[i]))
1433				mvm->scan_uid[i] = 0;
1434		}
1435	}
1436
1437	mvm->ucode_loaded = false;
1438}
1439
1440static void iwl_mvm_mac_stop(struct ieee80211_hw *hw)
1441{
1442	struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
1443
1444	flush_work(&mvm->d0i3_exit_work);
1445	flush_work(&mvm->async_handlers_wk);
1446	cancel_delayed_work_sync(&mvm->fw_dump_wk);
1447	iwl_mvm_free_fw_dump_desc(mvm);
1448
1449	mutex_lock(&mvm->mutex);
1450	__iwl_mvm_mac_stop(mvm);
1451	mutex_unlock(&mvm->mutex);
1452
1453	/*
1454	 * The worker might have been waiting for the mutex, let it run and
1455	 * discover that its list is now empty.
1456	 */
1457	cancel_work_sync(&mvm->async_handlers_wk);
1458}
1459
1460static struct iwl_mvm_phy_ctxt *iwl_mvm_get_free_phy_ctxt(struct iwl_mvm *mvm)
1461{
1462	u16 i;
1463
1464	lockdep_assert_held(&mvm->mutex);
1465
1466	for (i = 0; i < NUM_PHY_CTX; i++)
1467		if (!mvm->phy_ctxts[i].ref)
1468			return &mvm->phy_ctxts[i];
1469
1470	IWL_ERR(mvm, "No available PHY context\n");
1471	return NULL;
1472}
1473
1474static int iwl_mvm_set_tx_power_old(struct iwl_mvm *mvm,
1475				    struct ieee80211_vif *vif, s8 tx_power)
1476{
1477	/* FW is in charge of regulatory enforcement */
1478	struct iwl_reduce_tx_power_cmd reduce_txpwr_cmd = {
1479		.mac_context_id = iwl_mvm_vif_from_mac80211(vif)->id,
1480		.pwr_restriction = cpu_to_le16(tx_power),
1481	};
1482
1483	return iwl_mvm_send_cmd_pdu(mvm, REDUCE_TX_POWER_CMD, 0,
1484				    sizeof(reduce_txpwr_cmd),
1485				    &reduce_txpwr_cmd);
1486}
1487
1488static int iwl_mvm_set_tx_power(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
1489				s16 tx_power)
1490{
1491	struct iwl_dev_tx_power_cmd cmd = {
1492		.set_mode = 0,
1493		.mac_context_id =
1494			cpu_to_le32(iwl_mvm_vif_from_mac80211(vif)->id),
1495		.pwr_restriction = cpu_to_le16(8 * tx_power),
1496	};
1497
1498	if (!(mvm->fw->ucode_capa.api[0] & IWL_UCODE_TLV_API_TX_POWER_DEV))
1499		return iwl_mvm_set_tx_power_old(mvm, vif, tx_power);
1500
1501	if (tx_power == IWL_DEFAULT_MAX_TX_POWER)
1502		cmd.pwr_restriction = cpu_to_le16(IWL_DEV_MAX_TX_POWER);
1503
1504	return iwl_mvm_send_cmd_pdu(mvm, REDUCE_TX_POWER_CMD, 0,
1505				    sizeof(cmd), &cmd);
1506}
1507
1508static int iwl_mvm_mac_add_interface(struct ieee80211_hw *hw,
1509				     struct ieee80211_vif *vif)
1510{
1511	struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
1512	struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
1513	int ret;
1514
1515	mvmvif->mvm = mvm;
1516
1517	/*
1518	 * make sure D0i3 exit is completed, otherwise a target access
1519	 * during tx queue configuration could be done when still in
1520	 * D0i3 state.
1521	 */
1522	ret = iwl_mvm_ref_sync(mvm, IWL_MVM_REF_ADD_IF);
1523	if (ret)
1524		return ret;
1525
1526	/*
1527	 * Not much to do here. The stack will not allow interface
1528	 * types or combinations that we didn't advertise, so we
1529	 * don't really have to check the types.
1530	 */
1531
1532	mutex_lock(&mvm->mutex);
1533
1534	/* make sure that beacon statistics don't go backwards with FW reset */
1535	if (test_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status))
1536		mvmvif->beacon_stats.accu_num_beacons +=
1537			mvmvif->beacon_stats.num_beacons;
1538
1539	/* Allocate resources for the MAC context, and add it to the fw  */
1540	ret = iwl_mvm_mac_ctxt_init(mvm, vif);
1541	if (ret)
1542		goto out_unlock;
1543
1544	/* Counting number of interfaces is needed for legacy PM */
1545	if (vif->type != NL80211_IFTYPE_P2P_DEVICE)
1546		mvm->vif_count++;
1547
1548	/*
1549	 * The AP binding flow can be done only after the beacon
1550	 * template is configured (which happens only in the mac80211
1551	 * start_ap() flow), and adding the broadcast station can happen
1552	 * only after the binding.
1553	 * In addition, since modifying the MAC before adding a bcast
1554	 * station is not allowed by the FW, delay the adding of MAC context to
1555	 * the point where we can also add the bcast station.
1556	 * In short: there's not much we can do at this point, other than
1557	 * allocating resources :)
1558	 */
1559	if (vif->type == NL80211_IFTYPE_AP ||
1560	    vif->type == NL80211_IFTYPE_ADHOC) {
1561		ret = iwl_mvm_alloc_bcast_sta(mvm, vif);
1562		if (ret) {
1563			IWL_ERR(mvm, "Failed to allocate bcast sta\n");
1564			goto out_release;
1565		}
1566
1567		iwl_mvm_vif_dbgfs_register(mvm, vif);
1568		goto out_unlock;
1569	}
1570
1571	ret = iwl_mvm_mac_ctxt_add(mvm, vif);
1572	if (ret)
1573		goto out_release;
1574
1575	ret = iwl_mvm_power_update_mac(mvm);
1576	if (ret)
1577		goto out_remove_mac;
1578
1579	/* beacon filtering */
1580	ret = iwl_mvm_disable_beacon_filter(mvm, vif, 0);
1581	if (ret)
1582		goto out_remove_mac;
1583
1584	if (!mvm->bf_allowed_vif &&
1585	    vif->type == NL80211_IFTYPE_STATION && !vif->p2p) {
1586		mvm->bf_allowed_vif = mvmvif;
1587		vif->driver_flags |= IEEE80211_VIF_BEACON_FILTER |
1588				     IEEE80211_VIF_SUPPORTS_CQM_RSSI;
1589	}
1590
1591	/*
1592	 * P2P_DEVICE interface does not have a channel context assigned to it,
1593	 * so a dedicated PHY context is allocated to it and the corresponding
1594	 * MAC context is bound to it at this stage.
1595	 */
1596	if (vif->type == NL80211_IFTYPE_P2P_DEVICE) {
1597
1598		mvmvif->phy_ctxt = iwl_mvm_get_free_phy_ctxt(mvm);
1599		if (!mvmvif->phy_ctxt) {
1600			ret = -ENOSPC;
1601			goto out_free_bf;
1602		}
1603
1604		iwl_mvm_phy_ctxt_ref(mvm, mvmvif->phy_ctxt);
1605		ret = iwl_mvm_binding_add_vif(mvm, vif);
1606		if (ret)
1607			goto out_unref_phy;
1608
1609		ret = iwl_mvm_add_bcast_sta(mvm, vif);
1610		if (ret)
1611			goto out_unbind;
1612
1613		/* Save a pointer to p2p device vif, so it can later be used to
1614		 * update the p2p device MAC when a GO is started/stopped */
1615		mvm->p2p_device_vif = vif;
1616	}
1617
1618	iwl_mvm_vif_dbgfs_register(mvm, vif);
1619	goto out_unlock;
1620
1621 out_unbind:
1622	iwl_mvm_binding_remove_vif(mvm, vif);
1623 out_unref_phy:
1624	iwl_mvm_phy_ctxt_unref(mvm, mvmvif->phy_ctxt);
1625 out_free_bf:
1626	if (mvm->bf_allowed_vif == mvmvif) {
1627		mvm->bf_allowed_vif = NULL;
1628		vif->driver_flags &= ~(IEEE80211_VIF_BEACON_FILTER |
1629				       IEEE80211_VIF_SUPPORTS_CQM_RSSI);
1630	}
1631 out_remove_mac:
1632	mvmvif->phy_ctxt = NULL;
1633	iwl_mvm_mac_ctxt_remove(mvm, vif);
1634 out_release:
1635	if (vif->type != NL80211_IFTYPE_P2P_DEVICE)
1636		mvm->vif_count--;
1637
1638	iwl_mvm_mac_ctxt_release(mvm, vif);
1639 out_unlock:
1640	mutex_unlock(&mvm->mutex);
1641
1642	iwl_mvm_unref(mvm, IWL_MVM_REF_ADD_IF);
1643
1644	return ret;
1645}
1646
1647static void iwl_mvm_prepare_mac_removal(struct iwl_mvm *mvm,
1648					struct ieee80211_vif *vif)
1649{
1650	u32 tfd_msk = iwl_mvm_mac_get_queues_mask(vif);
1651
1652	if (tfd_msk) {
1653		/*
1654		 * mac80211 first removes all the stations of the vif and
1655		 * then removes the vif. When it removes a station it also
1656		 * flushes the AMPDU session. So by now, all the AMPDU sessions
1657		 * of all the stations of this vif are closed, and the queues
1658		 * of these AMPDU sessions are properly closed.
1659		 * We still need to take care of the shared queues of the vif.
1660		 * Flush them here.
1661		 */
1662		mutex_lock(&mvm->mutex);
1663		iwl_mvm_flush_tx_path(mvm, tfd_msk, true);
1664		mutex_unlock(&mvm->mutex);
1665
1666		/*
1667		 * There are transports that buffer a few frames in the host.
1668		 * For these, the flush above isn't enough since while we were
1669		 * flushing, the transport might have sent more frames to the
1670		 * device. To solve this, wait here until the transport is
1671		 * empty. Technically, this could have replaced the flush
1672		 * above, but flush is much faster than draining. So flush
1673		 * first, and drain to make sure we have no frames in the
1674		 * transport anymore.
1675		 * If a station still had frames on the shared queues, it is
1676		 * already marked as draining, so to complete the draining, we
1677		 * just need to wait until the transport is empty.
1678		 */
1679		iwl_trans_wait_tx_queue_empty(mvm->trans, tfd_msk);
1680	}
1681
1682	if (vif->type == NL80211_IFTYPE_P2P_DEVICE) {
1683		/*
1684		 * Flush the ROC worker which will flush the OFFCHANNEL queue.
1685		 * We assume here that all the packets sent to the OFFCHANNEL
1686		 * queue are sent in ROC session.
1687		 */
1688		flush_work(&mvm->roc_done_wk);
1689	} else {
1690		/*
1691		 * By now, all the AC queues are empty. The AGG queues are
1692		 * empty too. We already got all the Tx responses for all the
1693		 * packets in the queues. The drain work can have been
1694		 * triggered. Flush it.
1695		 */
1696		flush_work(&mvm->sta_drained_wk);
1697	}
1698}
1699
1700static void iwl_mvm_mac_remove_interface(struct ieee80211_hw *hw,
1701					 struct ieee80211_vif *vif)
1702{
1703	struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
1704	struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
1705
1706	iwl_mvm_prepare_mac_removal(mvm, vif);
1707
1708	mutex_lock(&mvm->mutex);
1709
1710	if (mvm->bf_allowed_vif == mvmvif) {
1711		mvm->bf_allowed_vif = NULL;
1712		vif->driver_flags &= ~(IEEE80211_VIF_BEACON_FILTER |
1713				       IEEE80211_VIF_SUPPORTS_CQM_RSSI);
1714	}
1715
1716	iwl_mvm_vif_dbgfs_clean(mvm, vif);
1717
1718	/*
1719	 * For AP/GO interface, the tear down of the resources allocated to the
1720	 * interface is be handled as part of the stop_ap flow.
1721	 */
1722	if (vif->type == NL80211_IFTYPE_AP ||
1723	    vif->type == NL80211_IFTYPE_ADHOC) {
1724#ifdef CONFIG_NL80211_TESTMODE
1725		if (vif == mvm->noa_vif) {
1726			mvm->noa_vif = NULL;
1727			mvm->noa_duration = 0;
1728		}
1729#endif
1730		iwl_mvm_dealloc_bcast_sta(mvm, vif);
1731		goto out_release;
1732	}
1733
1734	if (vif->type == NL80211_IFTYPE_P2P_DEVICE) {
1735		mvm->p2p_device_vif = NULL;
1736		iwl_mvm_rm_bcast_sta(mvm, vif);
1737		iwl_mvm_binding_remove_vif(mvm, vif);
1738		iwl_mvm_phy_ctxt_unref(mvm, mvmvif->phy_ctxt);
1739		mvmvif->phy_ctxt = NULL;
1740	}
1741
1742	if (mvm->vif_count && vif->type != NL80211_IFTYPE_P2P_DEVICE)
1743		mvm->vif_count--;
1744
1745	iwl_mvm_power_update_mac(mvm);
1746	iwl_mvm_mac_ctxt_remove(mvm, vif);
1747
1748out_release:
1749	iwl_mvm_mac_ctxt_release(mvm, vif);
1750	mutex_unlock(&mvm->mutex);
1751}
1752
1753static int iwl_mvm_mac_config(struct ieee80211_hw *hw, u32 changed)
1754{
1755	return 0;
1756}
1757
1758struct iwl_mvm_mc_iter_data {
1759	struct iwl_mvm *mvm;
1760	int port_id;
1761};
1762
1763static void iwl_mvm_mc_iface_iterator(void *_data, u8 *mac,
1764				      struct ieee80211_vif *vif)
1765{
1766	struct iwl_mvm_mc_iter_data *data = _data;
1767	struct iwl_mvm *mvm = data->mvm;
1768	struct iwl_mcast_filter_cmd *cmd = mvm->mcast_filter_cmd;
1769	int ret, len;
1770
1771	/* if we don't have free ports, mcast frames will be dropped */
1772	if (WARN_ON_ONCE(data->port_id >= MAX_PORT_ID_NUM))
1773		return;
1774
1775	if (vif->type != NL80211_IFTYPE_STATION ||
1776	    !vif->bss_conf.assoc)
1777		return;
1778
1779	cmd->port_id = data->port_id++;
1780	memcpy(cmd->bssid, vif->bss_conf.bssid, ETH_ALEN);
1781	len = roundup(sizeof(*cmd) + cmd->count * ETH_ALEN, 4);
1782
1783	ret = iwl_mvm_send_cmd_pdu(mvm, MCAST_FILTER_CMD, CMD_ASYNC, len, cmd);
1784	if (ret)
1785		IWL_ERR(mvm, "mcast filter cmd error. ret=%d\n", ret);
1786}
1787
1788static void iwl_mvm_recalc_multicast(struct iwl_mvm *mvm)
1789{
1790	struct iwl_mvm_mc_iter_data iter_data = {
1791		.mvm = mvm,
1792	};
1793
1794	lockdep_assert_held(&mvm->mutex);
1795
1796	if (WARN_ON_ONCE(!mvm->mcast_filter_cmd))
1797		return;
1798
1799	ieee80211_iterate_active_interfaces_atomic(
1800		mvm->hw, IEEE80211_IFACE_ITER_NORMAL,
1801		iwl_mvm_mc_iface_iterator, &iter_data);
1802}
1803
1804static u64 iwl_mvm_prepare_multicast(struct ieee80211_hw *hw,
1805				     struct netdev_hw_addr_list *mc_list)
1806{
1807	struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
1808	struct iwl_mcast_filter_cmd *cmd;
1809	struct netdev_hw_addr *addr;
1810	int addr_count;
1811	bool pass_all;
1812	int len;
1813
1814	addr_count = netdev_hw_addr_list_count(mc_list);
1815	pass_all = addr_count > MAX_MCAST_FILTERING_ADDRESSES ||
1816		   IWL_MVM_FW_MCAST_FILTER_PASS_ALL;
1817	if (pass_all)
1818		addr_count = 0;
1819
1820	len = roundup(sizeof(*cmd) + addr_count * ETH_ALEN, 4);
1821	cmd = kzalloc(len, GFP_ATOMIC);
1822	if (!cmd)
1823		return 0;
1824
1825	if (pass_all) {
1826		cmd->pass_all = 1;
1827		return (u64)(unsigned long)cmd;
1828	}
1829
1830	netdev_hw_addr_list_for_each(addr, mc_list) {
1831		IWL_DEBUG_MAC80211(mvm, "mcast addr (%d): %pM\n",
1832				   cmd->count, addr->addr);
1833		memcpy(&cmd->addr_list[cmd->count * ETH_ALEN],
1834		       addr->addr, ETH_ALEN);
1835		cmd->count++;
1836	}
1837
1838	return (u64)(unsigned long)cmd;
1839}
1840
1841static void iwl_mvm_configure_filter(struct ieee80211_hw *hw,
1842				     unsigned int changed_flags,
1843				     unsigned int *total_flags,
1844				     u64 multicast)
1845{
1846	struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
1847	struct iwl_mcast_filter_cmd *cmd = (void *)(unsigned long)multicast;
1848
1849	mutex_lock(&mvm->mutex);
1850
1851	/* replace previous configuration */
1852	kfree(mvm->mcast_filter_cmd);
1853	mvm->mcast_filter_cmd = cmd;
1854
1855	if (!cmd)
1856		goto out;
1857
1858	iwl_mvm_recalc_multicast(mvm);
1859out:
1860	mutex_unlock(&mvm->mutex);
1861	*total_flags = 0;
1862}
1863
1864#ifdef CONFIG_IWLWIFI_BCAST_FILTERING
1865struct iwl_bcast_iter_data {
1866	struct iwl_mvm *mvm;
1867	struct iwl_bcast_filter_cmd *cmd;
1868	u8 current_filter;
1869};
1870
1871static void
1872iwl_mvm_set_bcast_filter(struct ieee80211_vif *vif,
1873			 const struct iwl_fw_bcast_filter *in_filter,
1874			 struct iwl_fw_bcast_filter *out_filter)
1875{
1876	struct iwl_fw_bcast_filter_attr *attr;
1877	int i;
1878
1879	memcpy(out_filter, in_filter, sizeof(*out_filter));
1880
1881	for (i = 0; i < ARRAY_SIZE(out_filter->attrs); i++) {
1882		attr = &out_filter->attrs[i];
1883
1884		if (!attr->mask)
1885			break;
1886
1887		switch (attr->reserved1) {
1888		case cpu_to_le16(BC_FILTER_MAGIC_IP):
1889			if (vif->bss_conf.arp_addr_cnt != 1) {
1890				attr->mask = 0;
1891				continue;
1892			}
1893
1894			attr->val = vif->bss_conf.arp_addr_list[0];
1895			break;
1896		case cpu_to_le16(BC_FILTER_MAGIC_MAC):
1897			attr->val = *(__be32 *)&vif->addr[2];
1898			break;
1899		default:
1900			break;
1901		}
1902		attr->reserved1 = 0;
1903		out_filter->num_attrs++;
1904	}
1905}
1906
1907static void iwl_mvm_bcast_filter_iterator(void *_data, u8 *mac,
1908					  struct ieee80211_vif *vif)
1909{
1910	struct iwl_bcast_iter_data *data = _data;
1911	struct iwl_mvm *mvm = data->mvm;
1912	struct iwl_bcast_filter_cmd *cmd = data->cmd;
1913	struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
1914	struct iwl_fw_bcast_mac *bcast_mac;
1915	int i;
1916
1917	if (WARN_ON(mvmvif->id >= ARRAY_SIZE(cmd->macs)))
1918		return;
1919
1920	bcast_mac = &cmd->macs[mvmvif->id];
1921
1922	/*
1923	 * enable filtering only for associated stations, but not for P2P
1924	 * Clients
1925	 */
1926	if (vif->type != NL80211_IFTYPE_STATION || vif->p2p ||
1927	    !vif->bss_conf.assoc)
1928		return;
1929
1930	bcast_mac->default_discard = 1;
1931
1932	/* copy all configured filters */
1933	for (i = 0; mvm->bcast_filters[i].attrs[0].mask; i++) {
1934		/*
1935		 * Make sure we don't exceed our filters limit.
1936		 * if there is still a valid filter to be configured,
1937		 * be on the safe side and just allow bcast for this mac.
1938		 */
1939		if (WARN_ON_ONCE(data->current_filter >=
1940				 ARRAY_SIZE(cmd->filters))) {
1941			bcast_mac->default_discard = 0;
1942			bcast_mac->attached_filters = 0;
1943			break;
1944		}
1945
1946		iwl_mvm_set_bcast_filter(vif,
1947					 &mvm->bcast_filters[i],
1948					 &cmd->filters[data->current_filter]);
1949
1950		/* skip current filter if it contains no attributes */
1951		if (!cmd->filters[data->current_filter].num_attrs)
1952			continue;
1953
1954		/* attach the filter to current mac */
1955		bcast_mac->attached_filters |=
1956				cpu_to_le16(BIT(data->current_filter));
1957
1958		data->current_filter++;
1959	}
1960}
1961
1962bool iwl_mvm_bcast_filter_build_cmd(struct iwl_mvm *mvm,
1963				    struct iwl_bcast_filter_cmd *cmd)
1964{
1965	struct iwl_bcast_iter_data iter_data = {
1966		.mvm = mvm,
1967		.cmd = cmd,
1968	};
1969
1970	if (IWL_MVM_FW_BCAST_FILTER_PASS_ALL)
1971		return false;
1972
1973	memset(cmd, 0, sizeof(*cmd));
1974	cmd->max_bcast_filters = ARRAY_SIZE(cmd->filters);
1975	cmd->max_macs = ARRAY_SIZE(cmd->macs);
1976
1977#ifdef CONFIG_IWLWIFI_DEBUGFS
1978	/* use debugfs filters/macs if override is configured */
1979	if (mvm->dbgfs_bcast_filtering.override) {
1980		memcpy(cmd->filters, &mvm->dbgfs_bcast_filtering.cmd.filters,
1981		       sizeof(cmd->filters));
1982		memcpy(cmd->macs, &mvm->dbgfs_bcast_filtering.cmd.macs,
1983		       sizeof(cmd->macs));
1984		return true;
1985	}
1986#endif
1987
1988	/* if no filters are configured, do nothing */
1989	if (!mvm->bcast_filters)
1990		return false;
1991
1992	/* configure and attach these filters for each associated sta vif */
1993	ieee80211_iterate_active_interfaces(
1994		mvm->hw, IEEE80211_IFACE_ITER_NORMAL,
1995		iwl_mvm_bcast_filter_iterator, &iter_data);
1996
1997	return true;
1998}
1999static int iwl_mvm_configure_bcast_filter(struct iwl_mvm *mvm,
2000					  struct ieee80211_vif *vif)
2001{
2002	struct iwl_bcast_filter_cmd cmd;
2003
2004	if (!(mvm->fw->ucode_capa.flags & IWL_UCODE_TLV_FLAGS_BCAST_FILTERING))
2005		return 0;
2006
2007	if (!iwl_mvm_bcast_filter_build_cmd(mvm, &cmd))
2008		return 0;
2009
2010	return iwl_mvm_send_cmd_pdu(mvm, BCAST_FILTER_CMD, 0,
2011				    sizeof(cmd), &cmd);
2012}
2013#else
2014static inline int iwl_mvm_configure_bcast_filter(struct iwl_mvm *mvm,
2015						 struct ieee80211_vif *vif)
2016{
2017	return 0;
2018}
2019#endif
2020
2021static void iwl_mvm_bss_info_changed_station(struct iwl_mvm *mvm,
2022					     struct ieee80211_vif *vif,
2023					     struct ieee80211_bss_conf *bss_conf,
2024					     u32 changes)
2025{
2026	struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
2027	int ret;
2028
2029	/*
2030	 * Re-calculate the tsf id, as the master-slave relations depend on the
2031	 * beacon interval, which was not known when the station interface was
2032	 * added.
2033	 */
2034	if (changes & BSS_CHANGED_ASSOC && bss_conf->assoc)
2035		iwl_mvm_mac_ctxt_recalc_tsf_id(mvm, vif);
2036
2037	/*
2038	 * If we're not associated yet, take the (new) BSSID before associating
2039	 * so the firmware knows. If we're already associated, then use the old
2040	 * BSSID here, and we'll send a cleared one later in the CHANGED_ASSOC
2041	 * branch for disassociation below.
2042	 */
2043	if (changes & BSS_CHANGED_BSSID && !mvmvif->associated)
2044		memcpy(mvmvif->bssid, bss_conf->bssid, ETH_ALEN);
2045
2046	ret = iwl_mvm_mac_ctxt_changed(mvm, vif, false, mvmvif->bssid);
2047	if (ret)
2048		IWL_ERR(mvm, "failed to update MAC %pM\n", vif->addr);
2049
2050	/* after sending it once, adopt mac80211 data */
2051	memcpy(mvmvif->bssid, bss_conf->bssid, ETH_ALEN);
2052	mvmvif->associated = bss_conf->assoc;
2053
2054	if (changes & BSS_CHANGED_ASSOC) {
2055		if (bss_conf->assoc) {
2056			/* clear statistics to get clean beacon counter */
2057			iwl_mvm_request_statistics(mvm, true);
2058			memset(&mvmvif->beacon_stats, 0,
2059			       sizeof(mvmvif->beacon_stats));
2060
2061			/* add quota for this interface */
2062			ret = iwl_mvm_update_quotas(mvm, true, NULL);
2063			if (ret) {
2064				IWL_ERR(mvm, "failed to update quotas\n");
2065				return;
2066			}
2067
2068			if (test_bit(IWL_MVM_STATUS_IN_HW_RESTART,
2069				     &mvm->status)) {
2070				/*
2071				 * If we're restarting then the firmware will
2072				 * obviously have lost synchronisation with
2073				 * the AP. It will attempt to synchronise by
2074				 * itself, but we can make it more reliable by
2075				 * scheduling a session protection time event.
2076				 *
2077				 * The firmware needs to receive a beacon to
2078				 * catch up with synchronisation, use 110% of
2079				 * the beacon interval.
2080				 *
2081				 * Set a large maximum delay to allow for more
2082				 * than a single interface.
2083				 */
2084				u32 dur = (11 * vif->bss_conf.beacon_int) / 10;
2085				iwl_mvm_protect_session(mvm, vif, dur, dur,
2086							5 * dur, false);
2087			}
2088
2089			iwl_mvm_sf_update(mvm, vif, false);
2090			iwl_mvm_power_vif_assoc(mvm, vif);
2091			if (vif->p2p) {
2092				iwl_mvm_ref(mvm, IWL_MVM_REF_P2P_CLIENT);
2093				iwl_mvm_update_smps(mvm, vif,
2094						    IWL_MVM_SMPS_REQ_PROT,
2095						    IEEE80211_SMPS_DYNAMIC);
2096			}
2097		} else if (mvmvif->ap_sta_id != IWL_MVM_STATION_COUNT) {
2098			/*
2099			 * If update fails - SF might be running in associated
2100			 * mode while disassociated - which is forbidden.
2101			 */
2102			WARN_ONCE(iwl_mvm_sf_update(mvm, vif, false),
2103				  "Failed to update SF upon disassociation\n");
2104
2105			/* remove AP station now that the MAC is unassoc */
2106			ret = iwl_mvm_rm_sta_id(mvm, vif, mvmvif->ap_sta_id);
2107			if (ret)
2108				IWL_ERR(mvm, "failed to remove AP station\n");
2109
2110			if (mvm->d0i3_ap_sta_id == mvmvif->ap_sta_id)
2111				mvm->d0i3_ap_sta_id = IWL_MVM_STATION_COUNT;
2112			mvmvif->ap_sta_id = IWL_MVM_STATION_COUNT;
2113			/* remove quota for this interface */
2114			ret = iwl_mvm_update_quotas(mvm, false, NULL);
2115			if (ret)
2116				IWL_ERR(mvm, "failed to update quotas\n");
2117
2118			if (vif->p2p)
2119				iwl_mvm_unref(mvm, IWL_MVM_REF_P2P_CLIENT);
2120
2121			/* this will take the cleared BSSID from bss_conf */
2122			ret = iwl_mvm_mac_ctxt_changed(mvm, vif, false, NULL);
2123			if (ret)
2124				IWL_ERR(mvm,
2125					"failed to update MAC %pM (clear after unassoc)\n",
2126					vif->addr);
2127		}
2128
2129		iwl_mvm_recalc_multicast(mvm);
2130		iwl_mvm_configure_bcast_filter(mvm, vif);
2131
2132		/* reset rssi values */
2133		mvmvif->bf_data.ave_beacon_signal = 0;
2134
2135		iwl_mvm_bt_coex_vif_change(mvm);
2136		iwl_mvm_update_smps(mvm, vif, IWL_MVM_SMPS_REQ_TT,
2137				    IEEE80211_SMPS_AUTOMATIC);
2138	} else if (changes & BSS_CHANGED_BEACON_INFO) {
2139		/*
2140		 * We received a beacon _after_ association so
2141		 * remove the session protection.
2142		 */
2143		iwl_mvm_remove_time_event(mvm, mvmvif,
2144					  &mvmvif->time_event_data);
2145	}
2146
2147	if (changes & BSS_CHANGED_BEACON_INFO) {
2148		iwl_mvm_sf_update(mvm, vif, false);
2149		WARN_ON(iwl_mvm_enable_beacon_filter(mvm, vif, 0));
2150	}
2151
2152	if (changes & (BSS_CHANGED_PS | BSS_CHANGED_P2P_PS | BSS_CHANGED_QOS)) {
2153		ret = iwl_mvm_power_update_mac(mvm);
2154		if (ret)
2155			IWL_ERR(mvm, "failed to update power mode\n");
2156	}
2157
2158	if (changes & BSS_CHANGED_TXPOWER) {
2159		IWL_DEBUG_CALIB(mvm, "Changing TX Power to %d\n",
2160				bss_conf->txpower);
2161		iwl_mvm_set_tx_power(mvm, vif, bss_conf->txpower);
2162	}
2163
2164	if (changes & BSS_CHANGED_CQM) {
2165		IWL_DEBUG_MAC80211(mvm, "cqm info_changed\n");
2166		/* reset cqm events tracking */
2167		mvmvif->bf_data.last_cqm_event = 0;
2168		if (mvmvif->bf_data.bf_enabled) {
2169			ret = iwl_mvm_enable_beacon_filter(mvm, vif, 0);
2170			if (ret)
2171				IWL_ERR(mvm,
2172					"failed to update CQM thresholds\n");
2173		}
2174	}
2175
2176	if (changes & BSS_CHANGED_ARP_FILTER) {
2177		IWL_DEBUG_MAC80211(mvm, "arp filter changed\n");
2178		iwl_mvm_configure_bcast_filter(mvm, vif);
2179	}
2180}
2181
2182static int iwl_mvm_start_ap_ibss(struct ieee80211_hw *hw,
2183				 struct ieee80211_vif *vif)
2184{
2185	struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
2186	struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
2187	int ret;
2188
2189	/*
2190	 * iwl_mvm_mac_ctxt_add() might read directly from the device
2191	 * (the system time), so make sure it is available.
2192	 */
2193	ret = iwl_mvm_ref_sync(mvm, IWL_MVM_REF_START_AP);
2194	if (ret)
2195		return ret;
2196
2197	mutex_lock(&mvm->mutex);
2198
2199	/* Send the beacon template */
2200	ret = iwl_mvm_mac_ctxt_beacon_changed(mvm, vif);
2201	if (ret)
2202		goto out_unlock;
2203
2204	/*
2205	 * Re-calculate the tsf id, as the master-slave relations depend on the
2206	 * beacon interval, which was not known when the AP interface was added.
2207	 */
2208	if (vif->type == NL80211_IFTYPE_AP)
2209		iwl_mvm_mac_ctxt_recalc_tsf_id(mvm, vif);
2210
2211	/* Add the mac context */
2212	ret = iwl_mvm_mac_ctxt_add(mvm, vif);
2213	if (ret)
2214		goto out_unlock;
2215
2216	/* Perform the binding */
2217	ret = iwl_mvm_binding_add_vif(mvm, vif);
2218	if (ret)
2219		goto out_remove;
2220
2221	/* Send the bcast station. At this stage the TBTT and DTIM time events
2222	 * are added and applied to the scheduler */
2223	ret = iwl_mvm_send_add_bcast_sta(mvm, vif);
2224	if (ret)
2225		goto out_unbind;
2226
2227	/* must be set before quota calculations */
2228	mvmvif->ap_ibss_active = true;
2229
2230	/* power updated needs to be done before quotas */
2231	iwl_mvm_power_update_mac(mvm);
2232
2233	ret = iwl_mvm_update_quotas(mvm, false, NULL);
2234	if (ret)
2235		goto out_quota_failed;
2236
2237	/* Need to update the P2P Device MAC (only GO, IBSS is single vif) */
2238	if (vif->p2p && mvm->p2p_device_vif)
2239		iwl_mvm_mac_ctxt_changed(mvm, mvm->p2p_device_vif, false, NULL);
2240
2241	iwl_mvm_ref(mvm, IWL_MVM_REF_AP_IBSS);
2242
2243	iwl_mvm_bt_coex_vif_change(mvm);
2244
2245	/* we don't support TDLS during DCM */
2246	if (iwl_mvm_phy_ctx_count(mvm) > 1)
2247		iwl_mvm_teardown_tdls_peers(mvm);
2248
2249	goto out_unlock;
2250
2251out_quota_failed:
2252	iwl_mvm_power_update_mac(mvm);
2253	mvmvif->ap_ibss_active = false;
2254	iwl_mvm_send_rm_bcast_sta(mvm, vif);
2255out_unbind:
2256	iwl_mvm_binding_remove_vif(mvm, vif);
2257out_remove:
2258	iwl_mvm_mac_ctxt_remove(mvm, vif);
2259out_unlock:
2260	mutex_unlock(&mvm->mutex);
2261	iwl_mvm_unref(mvm, IWL_MVM_REF_START_AP);
2262	return ret;
2263}
2264
2265static void iwl_mvm_stop_ap_ibss(struct ieee80211_hw *hw,
2266				 struct ieee80211_vif *vif)
2267{
2268	struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
2269	struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
2270
2271	iwl_mvm_prepare_mac_removal(mvm, vif);
2272
2273	mutex_lock(&mvm->mutex);
2274
2275	/* Handle AP stop while in CSA */
2276	if (rcu_access_pointer(mvm->csa_vif) == vif) {
2277		iwl_mvm_remove_time_event(mvm, mvmvif,
2278					  &mvmvif->time_event_data);
2279		RCU_INIT_POINTER(mvm->csa_vif, NULL);
2280		mvmvif->csa_countdown = false;
2281	}
2282
2283	if (rcu_access_pointer(mvm->csa_tx_blocked_vif) == vif) {
2284		RCU_INIT_POINTER(mvm->csa_tx_blocked_vif, NULL);
2285		mvm->csa_tx_block_bcn_timeout = 0;
2286	}
2287
2288	mvmvif->ap_ibss_active = false;
2289	mvm->ap_last_beacon_gp2 = 0;
2290
2291	iwl_mvm_bt_coex_vif_change(mvm);
2292
2293	iwl_mvm_unref(mvm, IWL_MVM_REF_AP_IBSS);
2294
2295	/* Need to update the P2P Device MAC (only GO, IBSS is single vif) */
2296	if (vif->p2p && mvm->p2p_device_vif)
2297		iwl_mvm_mac_ctxt_changed(mvm, mvm->p2p_device_vif, false, NULL);
2298
2299	iwl_mvm_update_quotas(mvm, false, NULL);
2300	iwl_mvm_send_rm_bcast_sta(mvm, vif);
2301	iwl_mvm_binding_remove_vif(mvm, vif);
2302
2303	iwl_mvm_power_update_mac(mvm);
2304
2305	iwl_mvm_mac_ctxt_remove(mvm, vif);
2306
2307	mutex_unlock(&mvm->mutex);
2308}
2309
2310static void
2311iwl_mvm_bss_info_changed_ap_ibss(struct iwl_mvm *mvm,
2312				 struct ieee80211_vif *vif,
2313				 struct ieee80211_bss_conf *bss_conf,
2314				 u32 changes)
2315{
2316	struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
2317
2318	/* Changes will be applied when the AP/IBSS is started */
2319	if (!mvmvif->ap_ibss_active)
2320		return;
2321
2322	if (changes & (BSS_CHANGED_ERP_CTS_PROT | BSS_CHANGED_HT |
2323		       BSS_CHANGED_BANDWIDTH | BSS_CHANGED_QOS) &&
2324	    iwl_mvm_mac_ctxt_changed(mvm, vif, false, NULL))
2325		IWL_ERR(mvm, "failed to update MAC %pM\n", vif->addr);
2326
2327	/* Need to send a new beacon template to the FW */
2328	if (changes & BSS_CHANGED_BEACON &&
2329	    iwl_mvm_mac_ctxt_beacon_changed(mvm, vif))
2330		IWL_WARN(mvm, "Failed updating beacon data\n");
2331
2332	if (changes & BSS_CHANGED_TXPOWER) {
2333		IWL_DEBUG_CALIB(mvm, "Changing TX Power to %d\n",
2334				bss_conf->txpower);
2335		iwl_mvm_set_tx_power(mvm, vif, bss_conf->txpower);
2336	}
2337
2338}
2339
2340static void iwl_mvm_bss_info_changed(struct ieee80211_hw *hw,
2341				     struct ieee80211_vif *vif,
2342				     struct ieee80211_bss_conf *bss_conf,
2343				     u32 changes)
2344{
2345	struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
2346
2347	/*
2348	 * iwl_mvm_bss_info_changed_station() might call
2349	 * iwl_mvm_protect_session(), which reads directly from
2350	 * the device (the system time), so make sure it is available.
2351	 */
2352	if (iwl_mvm_ref_sync(mvm, IWL_MVM_REF_BSS_CHANGED))
2353		return;
2354
2355	mutex_lock(&mvm->mutex);
2356
2357	if (changes & BSS_CHANGED_IDLE && !bss_conf->idle)
2358		iwl_mvm_scan_offload_stop(mvm, true);
2359
2360	switch (vif->type) {
2361	case NL80211_IFTYPE_STATION:
2362		iwl_mvm_bss_info_changed_station(mvm, vif, bss_conf, changes);
2363		break;
2364	case NL80211_IFTYPE_AP:
2365	case NL80211_IFTYPE_ADHOC:
2366		iwl_mvm_bss_info_changed_ap_ibss(mvm, vif, bss_conf, changes);
2367		break;
2368	default:
2369		/* shouldn't happen */
2370		WARN_ON_ONCE(1);
2371	}
2372
2373	mutex_unlock(&mvm->mutex);
2374	iwl_mvm_unref(mvm, IWL_MVM_REF_BSS_CHANGED);
2375}
2376
2377static int iwl_mvm_cancel_scan_wait_notif(struct iwl_mvm *mvm,
2378					  enum iwl_scan_status scan_type)
2379{
2380	int ret;
2381	bool wait_for_handlers = false;
2382
2383	mutex_lock(&mvm->mutex);
2384
2385	if (mvm->scan_status != scan_type) {
2386		ret = 0;
2387		/* make sure there are no pending notifications */
2388		wait_for_handlers = true;
2389		goto out;
2390	}
2391
2392	switch (scan_type) {
2393	case IWL_MVM_SCAN_SCHED:
2394		ret = iwl_mvm_scan_offload_stop(mvm, true);
2395		break;
2396	case IWL_MVM_SCAN_OS:
2397		ret = iwl_mvm_cancel_scan(mvm);
2398		break;
2399	case IWL_MVM_SCAN_NONE:
2400	default:
2401		WARN_ON_ONCE(1);
2402		ret = -EINVAL;
2403		break;
2404	}
2405	if (ret)
2406		goto out;
2407
2408	wait_for_handlers = true;
2409out:
2410	mutex_unlock(&mvm->mutex);
2411
2412	/* make sure we consume the completion notification */
2413	if (wait_for_handlers)
2414		iwl_mvm_wait_for_async_handlers(mvm);
2415
2416	return ret;
2417}
2418static int iwl_mvm_mac_hw_scan(struct ieee80211_hw *hw,
2419			       struct ieee80211_vif *vif,
2420			       struct ieee80211_scan_request *hw_req)
2421{
2422	struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
2423	struct cfg80211_scan_request *req = &hw_req->req;
2424	int ret;
2425
2426	if (req->n_channels == 0 ||
2427	    req->n_channels > mvm->fw->ucode_capa.n_scan_channels)
2428		return -EINVAL;
2429
2430	if (!(mvm->fw->ucode_capa.capa[0] & IWL_UCODE_TLV_CAPA_UMAC_SCAN)) {
2431		ret = iwl_mvm_cancel_scan_wait_notif(mvm, IWL_MVM_SCAN_SCHED);
2432		if (ret)
2433			return ret;
2434	}
2435
2436	mutex_lock(&mvm->mutex);
2437
2438	if (iwl_mvm_is_lar_supported(mvm) && !mvm->lar_regdom_set) {
2439		IWL_ERR(mvm, "scan while LAR regdomain is not set\n");
2440		ret = -EBUSY;
2441		goto out;
2442	}
2443
2444	if (mvm->scan_status != IWL_MVM_SCAN_NONE) {
2445		ret = -EBUSY;
2446		goto out;
2447	}
2448
2449	iwl_mvm_ref(mvm, IWL_MVM_REF_SCAN);
2450
2451	if (mvm->fw->ucode_capa.capa[0] & IWL_UCODE_TLV_CAPA_UMAC_SCAN)
2452		ret = iwl_mvm_scan_umac(mvm, vif, hw_req);
2453	else
2454		ret = iwl_mvm_unified_scan_lmac(mvm, vif, hw_req);
2455
2456	if (ret)
2457		iwl_mvm_unref(mvm, IWL_MVM_REF_SCAN);
2458out:
2459	mutex_unlock(&mvm->mutex);
2460	return ret;
2461}
2462
2463static void iwl_mvm_mac_cancel_hw_scan(struct ieee80211_hw *hw,
2464				       struct ieee80211_vif *vif)
2465{
2466	struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
2467
2468	mutex_lock(&mvm->mutex);
2469
2470	/* Due to a race condition, it's possible that mac80211 asks
2471	 * us to stop a hw_scan when it's already stopped.  This can
2472	 * happen, for instance, if we stopped the scan ourselves,
2473	 * called ieee80211_scan_completed() and the userspace called
2474	 * cancel scan scan before ieee80211_scan_work() could run.
2475	 * To handle that, simply return if the scan is not running.
2476	*/
2477	/* FIXME: for now, we ignore this race for UMAC scans, since
2478	 * they don't set the scan_status.
2479	 */
2480	if ((mvm->scan_status == IWL_MVM_SCAN_OS) ||
2481	    (mvm->fw->ucode_capa.capa[0] & IWL_UCODE_TLV_CAPA_UMAC_SCAN))
2482		iwl_mvm_cancel_scan(mvm);
2483
2484	mutex_unlock(&mvm->mutex);
2485}
2486
2487static void
2488iwl_mvm_mac_allow_buffered_frames(struct ieee80211_hw *hw,
2489				  struct ieee80211_sta *sta, u16 tids,
2490				  int num_frames,
2491				  enum ieee80211_frame_release_type reason,
2492				  bool more_data)
2493{
2494	struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
2495
2496	/* Called when we need to transmit (a) frame(s) from mac80211 */
2497
2498	iwl_mvm_sta_modify_sleep_tx_count(mvm, sta, reason, num_frames,
2499					  tids, more_data, false);
2500}
2501
2502static void
2503iwl_mvm_mac_release_buffered_frames(struct ieee80211_hw *hw,
2504				    struct ieee80211_sta *sta, u16 tids,
2505				    int num_frames,
2506				    enum ieee80211_frame_release_type reason,
2507				    bool more_data)
2508{
2509	struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
2510
2511	/* Called when we need to transmit (a) frame(s) from agg queue */
2512
2513	iwl_mvm_sta_modify_sleep_tx_count(mvm, sta, reason, num_frames,
2514					  tids, more_data, true);
2515}
2516
2517static void iwl_mvm_mac_sta_notify(struct ieee80211_hw *hw,
2518				   struct ieee80211_vif *vif,
2519				   enum sta_notify_cmd cmd,
2520				   struct ieee80211_sta *sta)
2521{
2522	struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
2523	struct iwl_mvm_sta *mvmsta = iwl_mvm_sta_from_mac80211(sta);
2524	unsigned long txqs = 0, tids = 0;
2525	int tid;
2526
2527	spin_lock_bh(&mvmsta->lock);
2528	for (tid = 0; tid < IWL_MAX_TID_COUNT; tid++) {
2529		struct iwl_mvm_tid_data *tid_data = &mvmsta->tid_data[tid];
2530
2531		if (tid_data->state != IWL_AGG_ON &&
2532		    tid_data->state != IWL_EMPTYING_HW_QUEUE_DELBA)
2533			continue;
2534
2535		__set_bit(tid_data->txq_id, &txqs);
2536
2537		if (iwl_mvm_tid_queued(tid_data) == 0)
2538			continue;
2539
2540		__set_bit(tid, &tids);
2541	}
2542
2543	switch (cmd) {
2544	case STA_NOTIFY_SLEEP:
2545		if (atomic_read(&mvm->pending_frames[mvmsta->sta_id]) > 0)
2546			ieee80211_sta_block_awake(hw, sta, true);
2547
2548		for_each_set_bit(tid, &tids, IWL_MAX_TID_COUNT)
2549			ieee80211_sta_set_buffered(sta, tid, true);
2550
2551		if (txqs)
2552			iwl_trans_freeze_txq_timer(mvm->trans, txqs, true);
2553		/*
2554		 * The fw updates the STA to be asleep. Tx packets on the Tx
2555		 * queues to this station will not be transmitted. The fw will
2556		 * send a Tx response with TX_STATUS_FAIL_DEST_PS.
2557		 */
2558		break;
2559	case STA_NOTIFY_AWAKE:
2560		if (WARN_ON(mvmsta->sta_id == IWL_MVM_STATION_COUNT))
2561			break;
2562
2563		if (txqs)
2564			iwl_trans_freeze_txq_timer(mvm->trans, txqs, false);
2565		iwl_mvm_sta_modify_ps_wake(mvm, sta);
2566		break;
2567	default:
2568		break;
2569	}
2570	spin_unlock_bh(&mvmsta->lock);
2571}
2572
2573static void iwl_mvm_sta_pre_rcu_remove(struct ieee80211_hw *hw,
2574				       struct ieee80211_vif *vif,
2575				       struct ieee80211_sta *sta)
2576{
2577	struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
2578	struct iwl_mvm_sta *mvm_sta = iwl_mvm_sta_from_mac80211(sta);
2579
2580	/*
2581	 * This is called before mac80211 does RCU synchronisation,
2582	 * so here we already invalidate our internal RCU-protected
2583	 * station pointer. The rest of the code will thus no longer
2584	 * be able to find the station this way, and we don't rely
2585	 * on further RCU synchronisation after the sta_state()
2586	 * callback deleted the station.
2587	 */
2588	mutex_lock(&mvm->mutex);
2589	if (sta == rcu_access_pointer(mvm->fw_id_to_mac_id[mvm_sta->sta_id]))
2590		rcu_assign_pointer(mvm->fw_id_to_mac_id[mvm_sta->sta_id],
2591				   ERR_PTR(-ENOENT));
2592	mutex_unlock(&mvm->mutex);
2593}
2594
2595static void iwl_mvm_check_uapsd(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
2596				const u8 *bssid)
2597{
2598	if (!(mvm->fw->ucode_capa.flags & IWL_UCODE_TLV_FLAGS_UAPSD_SUPPORT))
2599		return;
2600
2601	if (iwlwifi_mod_params.uapsd_disable) {
2602		vif->driver_flags &= ~IEEE80211_VIF_SUPPORTS_UAPSD;
2603		return;
2604	}
2605
2606	vif->driver_flags |= IEEE80211_VIF_SUPPORTS_UAPSD;
2607}
2608
2609static int iwl_mvm_mac_sta_state(struct ieee80211_hw *hw,
2610				 struct ieee80211_vif *vif,
2611				 struct ieee80211_sta *sta,
2612				 enum ieee80211_sta_state old_state,
2613				 enum ieee80211_sta_state new_state)
2614{
2615	struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
2616	struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
2617	int ret;
2618
2619	IWL_DEBUG_MAC80211(mvm, "station %pM state change %d->%d\n",
2620			   sta->addr, old_state, new_state);
2621
2622	/* this would be a mac80211 bug ... but don't crash */
2623	if (WARN_ON_ONCE(!mvmvif->phy_ctxt))
2624		return -EINVAL;
2625
2626	/* if a STA is being removed, reuse its ID */
2627	flush_work(&mvm->sta_drained_wk);
2628
2629	mutex_lock(&mvm->mutex);
2630	if (old_state == IEEE80211_STA_NOTEXIST &&
2631	    new_state == IEEE80211_STA_NONE) {
2632		/*
2633		 * Firmware bug - it'll crash if the beacon interval is less
2634		 * than 16. We can't avoid connecting at all, so refuse the
2635		 * station state change, this will cause mac80211 to abandon
2636		 * attempts to connect to this AP, and eventually wpa_s will
2637		 * blacklist the AP...
2638		 */
2639		if (vif->type == NL80211_IFTYPE_STATION &&
2640		    vif->bss_conf.beacon_int < 16) {
2641			IWL_ERR(mvm,
2642				"AP %pM beacon interval is %d, refusing due to firmware bug!\n",
2643				sta->addr, vif->bss_conf.beacon_int);
2644			ret = -EINVAL;
2645			goto out_unlock;
2646		}
2647
2648		if (sta->tdls &&
2649		    (vif->p2p ||
2650		     iwl_mvm_tdls_sta_count(mvm, NULL) ==
2651						IWL_MVM_TDLS_STA_COUNT ||
2652		     iwl_mvm_phy_ctx_count(mvm) > 1)) {
2653			IWL_DEBUG_MAC80211(mvm, "refusing TDLS sta\n");
2654			ret = -EBUSY;
2655			goto out_unlock;
2656		}
2657
2658		ret = iwl_mvm_add_sta(mvm, vif, sta);
2659		if (sta->tdls && ret == 0)
2660			iwl_mvm_recalc_tdls_state(mvm, vif, true);
2661	} else if (old_state == IEEE80211_STA_NONE &&
2662		   new_state == IEEE80211_STA_AUTH) {
2663		/*
2664		 * EBS may be disabled due to previous failures reported by FW.
2665		 * Reset EBS status here assuming environment has been changed.
2666		 */
2667		mvm->last_ebs_successful = true;
2668		iwl_mvm_check_uapsd(mvm, vif, sta->addr);
2669		ret = 0;
2670	} else if (old_state == IEEE80211_STA_AUTH &&
2671		   new_state == IEEE80211_STA_ASSOC) {
2672		ret = iwl_mvm_update_sta(mvm, vif, sta);
2673		if (ret == 0)
2674			iwl_mvm_rs_rate_init(mvm, sta,
2675					     mvmvif->phy_ctxt->channel->band,
2676					     true);
2677	} else if (old_state == IEEE80211_STA_ASSOC &&
2678		   new_state == IEEE80211_STA_AUTHORIZED) {
2679
2680		/* we don't support TDLS during DCM */
2681		if (iwl_mvm_phy_ctx_count(mvm) > 1)
2682			iwl_mvm_teardown_tdls_peers(mvm);
2683
2684		/* enable beacon filtering */
2685		WARN_ON(iwl_mvm_enable_beacon_filter(mvm, vif, 0));
2686		ret = 0;
2687	} else if (old_state == IEEE80211_STA_AUTHORIZED &&
2688		   new_state == IEEE80211_STA_ASSOC) {
2689		/* disable beacon filtering */
2690		WARN_ON(iwl_mvm_disable_beacon_filter(mvm, vif, 0));
2691		ret = 0;
2692	} else if (old_state == IEEE80211_STA_ASSOC &&
2693		   new_state == IEEE80211_STA_AUTH) {
2694		ret = 0;
2695	} else if (old_state == IEEE80211_STA_AUTH &&
2696		   new_state == IEEE80211_STA_NONE) {
2697		ret = 0;
2698	} else if (old_state == IEEE80211_STA_NONE &&
2699		   new_state == IEEE80211_STA_NOTEXIST) {
2700		ret = iwl_mvm_rm_sta(mvm, vif, sta);
2701		if (sta->tdls)
2702			iwl_mvm_recalc_tdls_state(mvm, vif, false);
2703	} else {
2704		ret = -EIO;
2705	}
2706 out_unlock:
2707	mutex_unlock(&mvm->mutex);
2708
2709	if (sta->tdls && ret == 0) {
2710		if (old_state == IEEE80211_STA_NOTEXIST &&
2711		    new_state == IEEE80211_STA_NONE)
2712			ieee80211_reserve_tid(sta, IWL_MVM_TDLS_FW_TID);
2713		else if (old_state == IEEE80211_STA_NONE &&
2714			 new_state == IEEE80211_STA_NOTEXIST)
2715			ieee80211_unreserve_tid(sta, IWL_MVM_TDLS_FW_TID);
2716	}
2717
2718	return ret;
2719}
2720
2721static int iwl_mvm_mac_set_rts_threshold(struct ieee80211_hw *hw, u32 value)
2722{
2723	struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
2724
2725	mvm->rts_threshold = value;
2726
2727	return 0;
2728}
2729
2730static void iwl_mvm_sta_rc_update(struct ieee80211_hw *hw,
2731				  struct ieee80211_vif *vif,
2732				  struct ieee80211_sta *sta, u32 changed)
2733{
2734	struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
2735
2736	if (vif->type == NL80211_IFTYPE_STATION &&
2737	    changed & IEEE80211_RC_NSS_CHANGED)
2738		iwl_mvm_sf_update(mvm, vif, false);
2739}
2740
2741static int iwl_mvm_mac_conf_tx(struct ieee80211_hw *hw,
2742			       struct ieee80211_vif *vif, u16 ac,
2743			       const struct ieee80211_tx_queue_params *params)
2744{
2745	struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
2746	struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
2747
2748	mvmvif->queue_params[ac] = *params;
2749
2750	/*
2751	 * No need to update right away, we'll get BSS_CHANGED_QOS
2752	 * The exception is P2P_DEVICE interface which needs immediate update.
2753	 */
2754	if (vif->type == NL80211_IFTYPE_P2P_DEVICE) {
2755		int ret;
2756
2757		mutex_lock(&mvm->mutex);
2758		ret = iwl_mvm_mac_ctxt_changed(mvm, vif, false, NULL);
2759		mutex_unlock(&mvm->mutex);
2760		return ret;
2761	}
2762	return 0;
2763}
2764
2765static void iwl_mvm_mac_mgd_prepare_tx(struct ieee80211_hw *hw,
2766				      struct ieee80211_vif *vif)
2767{
2768	struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
2769	u32 duration = min(IWL_MVM_TE_SESSION_PROTECTION_MAX_TIME_MS,
2770			   200 + vif->bss_conf.beacon_int);
2771	u32 min_duration = min(IWL_MVM_TE_SESSION_PROTECTION_MIN_TIME_MS,
2772			       100 + vif->bss_conf.beacon_int);
2773
2774	if (WARN_ON_ONCE(vif->bss_conf.assoc))
2775		return;
2776
2777	/*
2778	 * iwl_mvm_protect_session() reads directly from the device
2779	 * (the system time), so make sure it is available.
2780	 */
2781	if (iwl_mvm_ref_sync(mvm, IWL_MVM_REF_PREPARE_TX))
2782		return;
2783
2784	mutex_lock(&mvm->mutex);
2785	/* Try really hard to protect the session and hear a beacon */
2786	iwl_mvm_protect_session(mvm, vif, duration, min_duration, 500, false);
2787	mutex_unlock(&mvm->mutex);
2788
2789	iwl_mvm_unref(mvm, IWL_MVM_REF_PREPARE_TX);
2790}
2791
2792static int iwl_mvm_mac_sched_scan_start(struct ieee80211_hw *hw,
2793					struct ieee80211_vif *vif,
2794					struct cfg80211_sched_scan_request *req,
2795					struct ieee80211_scan_ies *ies)
2796{
2797	struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
2798	int ret;
2799
2800	/* we don't support "match all" in the firmware */
2801	if (!req->n_match_sets)
2802		return -EOPNOTSUPP;
2803
2804	if (!(mvm->fw->ucode_capa.capa[0] & IWL_UCODE_TLV_CAPA_UMAC_SCAN)) {
2805		ret = iwl_mvm_cancel_scan_wait_notif(mvm, IWL_MVM_SCAN_OS);
2806		if (ret)
2807			return ret;
2808	}
2809
2810	mutex_lock(&mvm->mutex);
2811
2812	if (iwl_mvm_is_lar_supported(mvm) && !mvm->lar_regdom_set) {
2813		IWL_ERR(mvm, "sched-scan while LAR regdomain is not set\n");
2814		ret = -EBUSY;
2815		goto out;
2816	}
2817
2818	if (!vif->bss_conf.idle) {
2819		ret = -EBUSY;
2820		goto out;
2821	}
2822
2823	if (mvm->scan_status != IWL_MVM_SCAN_NONE) {
2824		ret = -EBUSY;
2825		goto out;
2826	}
2827
2828	ret = iwl_mvm_scan_offload_start(mvm, vif, req, ies);
2829	if (ret)
2830		mvm->scan_status = IWL_MVM_SCAN_NONE;
2831
2832out:
2833	mutex_unlock(&mvm->mutex);
2834	return ret;
2835}
2836
2837static int iwl_mvm_mac_sched_scan_stop(struct ieee80211_hw *hw,
2838				       struct ieee80211_vif *vif)
2839{
2840	struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
2841	int ret;
2842
2843	mutex_lock(&mvm->mutex);
2844
2845	/* Due to a race condition, it's possible that mac80211 asks
2846	 * us to stop a sched_scan when it's already stopped.  This
2847	 * can happen, for instance, if we stopped the scan ourselves,
2848	 * called ieee80211_sched_scan_stopped() and the userspace called
2849	 * stop sched scan scan before ieee80211_sched_scan_stopped_work()
2850	 * could run.  To handle this, simply return if the scan is
2851	 * not running.
2852	*/
2853	/* FIXME: for now, we ignore this race for UMAC scans, since
2854	 * they don't set the scan_status.
2855	 */
2856	if (mvm->scan_status != IWL_MVM_SCAN_SCHED &&
2857	    !(mvm->fw->ucode_capa.capa[0] & IWL_UCODE_TLV_CAPA_UMAC_SCAN)) {
2858		mutex_unlock(&mvm->mutex);
2859		return 0;
2860	}
2861
2862	ret = iwl_mvm_scan_offload_stop(mvm, false);
2863	mutex_unlock(&mvm->mutex);
2864	iwl_mvm_wait_for_async_handlers(mvm);
2865
2866	return ret;
2867}
2868
2869static int iwl_mvm_mac_set_key(struct ieee80211_hw *hw,
2870			       enum set_key_cmd cmd,
2871			       struct ieee80211_vif *vif,
2872			       struct ieee80211_sta *sta,
2873			       struct ieee80211_key_conf *key)
2874{
2875	struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
2876	int ret;
2877
2878	if (iwlwifi_mod_params.sw_crypto) {
2879		IWL_DEBUG_MAC80211(mvm, "leave - hwcrypto disabled\n");
2880		return -EOPNOTSUPP;
2881	}
2882
2883	switch (key->cipher) {
2884	case WLAN_CIPHER_SUITE_TKIP:
2885		key->flags |= IEEE80211_KEY_FLAG_GENERATE_MMIC;
2886		/* fall-through */
2887	case WLAN_CIPHER_SUITE_CCMP:
2888		key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV;
2889		break;
2890	case WLAN_CIPHER_SUITE_AES_CMAC:
2891		WARN_ON_ONCE(!(hw->flags & IEEE80211_HW_MFP_CAPABLE));
2892		break;
2893	case WLAN_CIPHER_SUITE_WEP40:
2894	case WLAN_CIPHER_SUITE_WEP104:
2895		/* For non-client mode, only use WEP keys for TX as we probably
2896		 * don't have a station yet anyway and would then have to keep
2897		 * track of the keys, linking them to each of the clients/peers
2898		 * as they appear. For now, don't do that, for performance WEP
2899		 * offload doesn't really matter much, but we need it for some
2900		 * other offload features in client mode.
2901		 */
2902		if (vif->type != NL80211_IFTYPE_STATION)
2903			return 0;
2904		break;
2905	default:
2906		/* currently FW supports only one optional cipher scheme */
2907		if (hw->n_cipher_schemes &&
2908		    hw->cipher_schemes->cipher == key->cipher)
2909			key->flags |= IEEE80211_KEY_FLAG_PUT_IV_SPACE;
2910		else
2911			return -EOPNOTSUPP;
2912	}
2913
2914	mutex_lock(&mvm->mutex);
2915
2916	switch (cmd) {
2917	case SET_KEY:
2918		if ((vif->type == NL80211_IFTYPE_ADHOC ||
2919		     vif->type == NL80211_IFTYPE_AP) && !sta) {
2920			/*
2921			 * GTK on AP interface is a TX-only key, return 0;
2922			 * on IBSS they're per-station and because we're lazy
2923			 * we don't support them for RX, so do the same.
2924			 */
2925			ret = 0;
2926			key->hw_key_idx = STA_KEY_IDX_INVALID;
2927			break;
2928		}
2929
2930		IWL_DEBUG_MAC80211(mvm, "set hwcrypto key\n");
2931		ret = iwl_mvm_set_sta_key(mvm, vif, sta, key, false);
2932		if (ret) {
2933			IWL_WARN(mvm, "set key failed\n");
2934			/*
2935			 * can't add key for RX, but we don't need it
2936			 * in the device for TX so still return 0
2937			 */
2938			key->hw_key_idx = STA_KEY_IDX_INVALID;
2939			ret = 0;
2940		}
2941
2942		break;
2943	case DISABLE_KEY:
2944		if (key->hw_key_idx == STA_KEY_IDX_INVALID) {
2945			ret = 0;
2946			break;
2947		}
2948
2949		IWL_DEBUG_MAC80211(mvm, "disable hwcrypto key\n");
2950		ret = iwl_mvm_remove_sta_key(mvm, vif, sta, key);
2951		break;
2952	default:
2953		ret = -EINVAL;
2954	}
2955
2956	mutex_unlock(&mvm->mutex);
2957	return ret;
2958}
2959
2960static void iwl_mvm_mac_update_tkip_key(struct ieee80211_hw *hw,
2961					struct ieee80211_vif *vif,
2962					struct ieee80211_key_conf *keyconf,
2963					struct ieee80211_sta *sta,
2964					u32 iv32, u16 *phase1key)
2965{
2966	struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
2967
2968	if (keyconf->hw_key_idx == STA_KEY_IDX_INVALID)
2969		return;
2970
2971	iwl_mvm_update_tkip_key(mvm, vif, keyconf, sta, iv32, phase1key);
2972}
2973
2974
2975static bool iwl_mvm_rx_aux_roc(struct iwl_notif_wait_data *notif_wait,
2976			       struct iwl_rx_packet *pkt, void *data)
2977{
2978	struct iwl_mvm *mvm =
2979		container_of(notif_wait, struct iwl_mvm, notif_wait);
2980	struct iwl_hs20_roc_res *resp;
2981	int resp_len = iwl_rx_packet_payload_len(pkt);
2982	struct iwl_mvm_time_event_data *te_data = data;
2983
2984	if (WARN_ON(pkt->hdr.cmd != HOT_SPOT_CMD))
2985		return true;
2986
2987	if (WARN_ON_ONCE(resp_len != sizeof(*resp))) {
2988		IWL_ERR(mvm, "Invalid HOT_SPOT_CMD response\n");
2989		return true;
2990	}
2991
2992	resp = (void *)pkt->data;
2993
2994	IWL_DEBUG_TE(mvm,
2995		     "Aux ROC: Recieved response from ucode: status=%d uid=%d\n",
2996		     resp->status, resp->event_unique_id);
2997
2998	te_data->uid = le32_to_cpu(resp->event_unique_id);
2999	IWL_DEBUG_TE(mvm, "TIME_EVENT_CMD response - UID = 0x%x\n",
3000		     te_data->uid);
3001
3002	spin_lock_bh(&mvm->time_event_lock);
3003	list_add_tail(&te_data->list, &mvm->aux_roc_te_list);
3004	spin_unlock_bh(&mvm->time_event_lock);
3005
3006	return true;
3007}
3008
3009#define AUX_ROC_MAX_DELAY_ON_CHANNEL 5000
3010static int iwl_mvm_send_aux_roc_cmd(struct iwl_mvm *mvm,
3011				    struct ieee80211_channel *channel,
3012				    struct ieee80211_vif *vif,
3013				    int duration)
3014{
3015	int res, time_reg = DEVICE_SYSTEM_TIME_REG;
3016	struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
3017	struct iwl_mvm_time_event_data *te_data = &mvmvif->hs_time_event_data;
3018	static const u8 time_event_response[] = { HOT_SPOT_CMD };
3019	struct iwl_notification_wait wait_time_event;
3020	struct iwl_hs20_roc_req aux_roc_req = {
3021		.action = cpu_to_le32(FW_CTXT_ACTION_ADD),
3022		.id_and_color =
3023			cpu_to_le32(FW_CMD_ID_AND_COLOR(MAC_INDEX_AUX, 0)),
3024		.sta_id_and_color = cpu_to_le32(mvm->aux_sta.sta_id),
3025		/* Set the channel info data */
3026		.channel_info.band = (channel->band == IEEE80211_BAND_2GHZ) ?
3027			PHY_BAND_24 : PHY_BAND_5,
3028		.channel_info.channel = channel->hw_value,
3029		.channel_info.width = PHY_VHT_CHANNEL_MODE20,
3030		/* Set the time and duration */
3031		.apply_time = cpu_to_le32(iwl_read_prph(mvm->trans, time_reg)),
3032		.apply_time_max_delay =
3033			cpu_to_le32(MSEC_TO_TU(AUX_ROC_MAX_DELAY_ON_CHANNEL)),
3034		.duration = cpu_to_le32(MSEC_TO_TU(duration)),
3035	 };
3036
3037	/* Set the node address */
3038	memcpy(aux_roc_req.node_addr, vif->addr, ETH_ALEN);
3039
3040	lockdep_assert_held(&mvm->mutex);
3041
3042	spin_lock_bh(&mvm->time_event_lock);
3043
3044	if (WARN_ON(te_data->id == HOT_SPOT_CMD)) {
3045		spin_unlock_bh(&mvm->time_event_lock);
3046		return -EIO;
3047	}
3048
3049	te_data->vif = vif;
3050	te_data->duration = duration;
3051	te_data->id = HOT_SPOT_CMD;
3052
3053	spin_unlock_bh(&mvm->time_event_lock);
3054
3055	/*
3056	 * Use a notification wait, which really just processes the
3057	 * command response and doesn't wait for anything, in order
3058	 * to be able to process the response and get the UID inside
3059	 * the RX path. Using CMD_WANT_SKB doesn't work because it
3060	 * stores the buffer and then wakes up this thread, by which
3061	 * time another notification (that the time event started)
3062	 * might already be processed unsuccessfully.
3063	 */
3064	iwl_init_notification_wait(&mvm->notif_wait, &wait_time_event,
3065				   time_event_response,
3066				   ARRAY_SIZE(time_event_response),
3067				   iwl_mvm_rx_aux_roc, te_data);
3068
3069	res = iwl_mvm_send_cmd_pdu(mvm, HOT_SPOT_CMD, 0, sizeof(aux_roc_req),
3070				   &aux_roc_req);
3071
3072	if (res) {
3073		IWL_ERR(mvm, "Couldn't send HOT_SPOT_CMD: %d\n", res);
3074		iwl_remove_notification(&mvm->notif_wait, &wait_time_event);
3075		goto out_clear_te;
3076	}
3077
3078	/* No need to wait for anything, so just pass 1 (0 isn't valid) */
3079	res = iwl_wait_notification(&mvm->notif_wait, &wait_time_event, 1);
3080	/* should never fail */
3081	WARN_ON_ONCE(res);
3082
3083	if (res) {
3084 out_clear_te:
3085		spin_lock_bh(&mvm->time_event_lock);
3086		iwl_mvm_te_clear_data(mvm, te_data);
3087		spin_unlock_bh(&mvm->time_event_lock);
3088	}
3089
3090	return res;
3091}
3092
3093static int iwl_mvm_roc(struct ieee80211_hw *hw,
3094		       struct ieee80211_vif *vif,
3095		       struct ieee80211_channel *channel,
3096		       int duration,
3097		       enum ieee80211_roc_type type)
3098{
3099	struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
3100	struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
3101	struct cfg80211_chan_def chandef;
3102	struct iwl_mvm_phy_ctxt *phy_ctxt;
3103	int ret, i;
3104
3105	IWL_DEBUG_MAC80211(mvm, "enter (%d, %d, %d)\n", channel->hw_value,
3106			   duration, type);
3107
3108	flush_work(&mvm->roc_done_wk);
3109
3110	mutex_lock(&mvm->mutex);
3111
3112	switch (vif->type) {
3113	case NL80211_IFTYPE_STATION:
3114		if (mvm->fw->ucode_capa.capa[0] &
3115		    IWL_UCODE_TLV_CAPA_HOTSPOT_SUPPORT) {
3116			/* Use aux roc framework (HS20) */
3117			ret = iwl_mvm_send_aux_roc_cmd(mvm, channel,
3118						       vif, duration);
3119			goto out_unlock;
3120		}
3121		IWL_ERR(mvm, "hotspot not supported\n");
3122		ret = -EINVAL;
3123		goto out_unlock;
3124	case NL80211_IFTYPE_P2P_DEVICE:
3125		/* handle below */
3126		break;
3127	default:
3128		IWL_ERR(mvm, "vif isn't P2P_DEVICE: %d\n", vif->type);
3129		ret = -EINVAL;
3130		goto out_unlock;
3131	}
3132
3133	for (i = 0; i < NUM_PHY_CTX; i++) {
3134		phy_ctxt = &mvm->phy_ctxts[i];
3135		if (phy_ctxt->ref == 0 || mvmvif->phy_ctxt == phy_ctxt)
3136			continue;
3137
3138		if (phy_ctxt->ref && channel == phy_ctxt->channel) {
3139			/*
3140			 * Unbind the P2P_DEVICE from the current PHY context,
3141			 * and if the PHY context is not used remove it.
3142			 */
3143			ret = iwl_mvm_binding_remove_vif(mvm, vif);
3144			if (WARN(ret, "Failed unbinding P2P_DEVICE\n"))
3145				goto out_unlock;
3146
3147			iwl_mvm_phy_ctxt_unref(mvm, mvmvif->phy_ctxt);
3148
3149			/* Bind the P2P_DEVICE to the current PHY Context */
3150			mvmvif->phy_ctxt = phy_ctxt;
3151
3152			ret = iwl_mvm_binding_add_vif(mvm, vif);
3153			if (WARN(ret, "Failed binding P2P_DEVICE\n"))
3154				goto out_unlock;
3155
3156			iwl_mvm_phy_ctxt_ref(mvm, mvmvif->phy_ctxt);
3157			goto schedule_time_event;
3158		}
3159	}
3160
3161	/* Need to update the PHY context only if the ROC channel changed */
3162	if (channel == mvmvif->phy_ctxt->channel)
3163		goto schedule_time_event;
3164
3165	cfg80211_chandef_create(&chandef, channel, NL80211_CHAN_NO_HT);
3166
3167	/*
3168	 * Change the PHY context configuration as it is currently referenced
3169	 * only by the P2P Device MAC
3170	 */
3171	if (mvmvif->phy_ctxt->ref == 1) {
3172		ret = iwl_mvm_phy_ctxt_changed(mvm, mvmvif->phy_ctxt,
3173					       &chandef, 1, 1);
3174		if (ret)
3175			goto out_unlock;
3176	} else {
3177		/*
3178		 * The PHY context is shared with other MACs. Need to remove the
3179		 * P2P Device from the binding, allocate an new PHY context and
3180		 * create a new binding
3181		 */
3182		phy_ctxt = iwl_mvm_get_free_phy_ctxt(mvm);
3183		if (!phy_ctxt) {
3184			ret = -ENOSPC;
3185			goto out_unlock;
3186		}
3187
3188		ret = iwl_mvm_phy_ctxt_changed(mvm, phy_ctxt, &chandef,
3189					       1, 1);
3190		if (ret) {
3191			IWL_ERR(mvm, "Failed to change PHY context\n");
3192			goto out_unlock;
3193		}
3194
3195		/* Unbind the P2P_DEVICE from the current PHY context */
3196		ret = iwl_mvm_binding_remove_vif(mvm, vif);
3197		if (WARN(ret, "Failed unbinding P2P_DEVICE\n"))
3198			goto out_unlock;
3199
3200		iwl_mvm_phy_ctxt_unref(mvm, mvmvif->phy_ctxt);
3201
3202		/* Bind the P2P_DEVICE to the new allocated PHY context */
3203		mvmvif->phy_ctxt = phy_ctxt;
3204
3205		ret = iwl_mvm_binding_add_vif(mvm, vif);
3206		if (WARN(ret, "Failed binding P2P_DEVICE\n"))
3207			goto out_unlock;
3208
3209		iwl_mvm_phy_ctxt_ref(mvm, mvmvif->phy_ctxt);
3210	}
3211
3212schedule_time_event:
3213	/* Schedule the time events */
3214	ret = iwl_mvm_start_p2p_roc(mvm, vif, duration, type);
3215
3216out_unlock:
3217	mutex_unlock(&mvm->mutex);
3218	IWL_DEBUG_MAC80211(mvm, "leave\n");
3219	return ret;
3220}
3221
3222static int iwl_mvm_cancel_roc(struct ieee80211_hw *hw)
3223{
3224	struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
3225
3226	IWL_DEBUG_MAC80211(mvm, "enter\n");
3227
3228	mutex_lock(&mvm->mutex);
3229	iwl_mvm_stop_roc(mvm);
3230	mutex_unlock(&mvm->mutex);
3231
3232	IWL_DEBUG_MAC80211(mvm, "leave\n");
3233	return 0;
3234}
3235
3236static int __iwl_mvm_add_chanctx(struct iwl_mvm *mvm,
3237				 struct ieee80211_chanctx_conf *ctx)
3238{
3239	u16 *phy_ctxt_id = (u16 *)ctx->drv_priv;
3240	struct iwl_mvm_phy_ctxt *phy_ctxt;
3241	int ret;
3242
3243	lockdep_assert_held(&mvm->mutex);
3244
3245	IWL_DEBUG_MAC80211(mvm, "Add channel context\n");
3246
3247	phy_ctxt = iwl_mvm_get_free_phy_ctxt(mvm);
3248	if (!phy_ctxt) {
3249		ret = -ENOSPC;
3250		goto out;
3251	}
3252
3253	ret = iwl_mvm_phy_ctxt_changed(mvm, phy_ctxt, &ctx->min_def,
3254				       ctx->rx_chains_static,
3255				       ctx->rx_chains_dynamic);
3256	if (ret) {
3257		IWL_ERR(mvm, "Failed to add PHY context\n");
3258		goto out;
3259	}
3260
3261	iwl_mvm_phy_ctxt_ref(mvm, phy_ctxt);
3262	*phy_ctxt_id = phy_ctxt->id;
3263out:
3264	return ret;
3265}
3266
3267static int iwl_mvm_add_chanctx(struct ieee80211_hw *hw,
3268			       struct ieee80211_chanctx_conf *ctx)
3269{
3270	struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
3271	int ret;
3272
3273	mutex_lock(&mvm->mutex);
3274	ret = __iwl_mvm_add_chanctx(mvm, ctx);
3275	mutex_unlock(&mvm->mutex);
3276
3277	return ret;
3278}
3279
3280static void __iwl_mvm_remove_chanctx(struct iwl_mvm *mvm,
3281				     struct ieee80211_chanctx_conf *ctx)
3282{
3283	u16 *phy_ctxt_id = (u16 *)ctx->drv_priv;
3284	struct iwl_mvm_phy_ctxt *phy_ctxt = &mvm->phy_ctxts[*phy_ctxt_id];
3285
3286	lockdep_assert_held(&mvm->mutex);
3287
3288	iwl_mvm_phy_ctxt_unref(mvm, phy_ctxt);
3289}
3290
3291static void iwl_mvm_remove_chanctx(struct ieee80211_hw *hw,
3292				   struct ieee80211_chanctx_conf *ctx)
3293{
3294	struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
3295
3296	mutex_lock(&mvm->mutex);
3297	__iwl_mvm_remove_chanctx(mvm, ctx);
3298	mutex_unlock(&mvm->mutex);
3299}
3300
3301static void iwl_mvm_change_chanctx(struct ieee80211_hw *hw,
3302				   struct ieee80211_chanctx_conf *ctx,
3303				   u32 changed)
3304{
3305	struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
3306	u16 *phy_ctxt_id = (u16 *)ctx->drv_priv;
3307	struct iwl_mvm_phy_ctxt *phy_ctxt = &mvm->phy_ctxts[*phy_ctxt_id];
3308
3309	if (WARN_ONCE((phy_ctxt->ref > 1) &&
3310		      (changed & ~(IEEE80211_CHANCTX_CHANGE_WIDTH |
3311				   IEEE80211_CHANCTX_CHANGE_RX_CHAINS |
3312				   IEEE80211_CHANCTX_CHANGE_RADAR |
3313				   IEEE80211_CHANCTX_CHANGE_MIN_WIDTH)),
3314		      "Cannot change PHY. Ref=%d, changed=0x%X\n",
3315		      phy_ctxt->ref, changed))
3316		return;
3317
3318	mutex_lock(&mvm->mutex);
3319	iwl_mvm_bt_coex_vif_change(mvm);
3320	iwl_mvm_phy_ctxt_changed(mvm, phy_ctxt, &ctx->min_def,
3321				 ctx->rx_chains_static,
3322				 ctx->rx_chains_dynamic);
3323	mutex_unlock(&mvm->mutex);
3324}
3325
3326static int __iwl_mvm_assign_vif_chanctx(struct iwl_mvm *mvm,
3327					struct ieee80211_vif *vif,
3328					struct ieee80211_chanctx_conf *ctx,
3329					bool switching_chanctx)
3330{
3331	u16 *phy_ctxt_id = (u16 *)ctx->drv_priv;
3332	struct iwl_mvm_phy_ctxt *phy_ctxt = &mvm->phy_ctxts[*phy_ctxt_id];
3333	struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
3334	int ret;
3335
3336	lockdep_assert_held(&mvm->mutex);
3337
3338	mvmvif->phy_ctxt = phy_ctxt;
3339
3340	switch (vif->type) {
3341	case NL80211_IFTYPE_AP:
3342		/* only needed if we're switching chanctx (i.e. during CSA) */
3343		if (switching_chanctx) {
3344			mvmvif->ap_ibss_active = true;
3345			break;
3346		}
3347	case NL80211_IFTYPE_ADHOC:
3348		/*
3349		 * The AP binding flow is handled as part of the start_ap flow
3350		 * (in bss_info_changed), similarly for IBSS.
3351		 */
3352		ret = 0;
3353		goto out;
3354	case NL80211_IFTYPE_STATION:
3355		break;
3356	case NL80211_IFTYPE_MONITOR:
3357		/* always disable PS when a monitor interface is active */
3358		mvmvif->ps_disabled = true;
3359		break;
3360	default:
3361		ret = -EINVAL;
3362		goto out;
3363	}
3364
3365	ret = iwl_mvm_binding_add_vif(mvm, vif);
3366	if (ret)
3367		goto out;
3368
3369	/*
3370	 * Power state must be updated before quotas,
3371	 * otherwise fw will complain.
3372	 */
3373	iwl_mvm_power_update_mac(mvm);
3374
3375	/* Setting the quota at this stage is only required for monitor
3376	 * interfaces. For the other types, the bss_info changed flow
3377	 * will handle quota settings.
3378	 */
3379	if (vif->type == NL80211_IFTYPE_MONITOR) {
3380		mvmvif->monitor_active = true;
3381		ret = iwl_mvm_update_quotas(mvm, false, NULL);
3382		if (ret)
3383			goto out_remove_binding;
3384	}
3385
3386	/* Handle binding during CSA */
3387	if (vif->type == NL80211_IFTYPE_AP) {
3388		iwl_mvm_update_quotas(mvm, false, NULL);
3389		iwl_mvm_mac_ctxt_changed(mvm, vif, false, NULL);
3390	}
3391
3392	if (switching_chanctx && vif->type == NL80211_IFTYPE_STATION) {
3393		u32 duration = 2 * vif->bss_conf.beacon_int;
3394
3395		/* iwl_mvm_protect_session() reads directly from the
3396		 * device (the system time), so make sure it is
3397		 * available.
3398		 */
3399		ret = iwl_mvm_ref_sync(mvm, IWL_MVM_REF_PROTECT_CSA);
3400		if (ret)
3401			goto out_remove_binding;
3402
3403		/* Protect the session to make sure we hear the first
3404		 * beacon on the new channel.
3405		 */
3406		iwl_mvm_protect_session(mvm, vif, duration, duration,
3407					vif->bss_conf.beacon_int / 2,
3408					true);
3409
3410		iwl_mvm_unref(mvm, IWL_MVM_REF_PROTECT_CSA);
3411
3412		iwl_mvm_update_quotas(mvm, false, NULL);
3413	}
3414
3415	goto out;
3416
3417out_remove_binding:
3418	iwl_mvm_binding_remove_vif(mvm, vif);
3419	iwl_mvm_power_update_mac(mvm);
3420out:
3421	if (ret)
3422		mvmvif->phy_ctxt = NULL;
3423	return ret;
3424}
3425static int iwl_mvm_assign_vif_chanctx(struct ieee80211_hw *hw,
3426				      struct ieee80211_vif *vif,
3427				      struct ieee80211_chanctx_conf *ctx)
3428{
3429	struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
3430	int ret;
3431
3432	mutex_lock(&mvm->mutex);
3433	ret = __iwl_mvm_assign_vif_chanctx(mvm, vif, ctx, false);
3434	mutex_unlock(&mvm->mutex);
3435
3436	return ret;
3437}
3438
3439static void __iwl_mvm_unassign_vif_chanctx(struct iwl_mvm *mvm,
3440					   struct ieee80211_vif *vif,
3441					   struct ieee80211_chanctx_conf *ctx,
3442					   bool switching_chanctx)
3443{
3444	struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
3445	struct ieee80211_vif *disabled_vif = NULL;
3446
3447	lockdep_assert_held(&mvm->mutex);
3448
3449	iwl_mvm_remove_time_event(mvm, mvmvif, &mvmvif->time_event_data);
3450
3451	switch (vif->type) {
3452	case NL80211_IFTYPE_ADHOC:
3453		goto out;
3454	case NL80211_IFTYPE_MONITOR:
3455		mvmvif->monitor_active = false;
3456		mvmvif->ps_disabled = false;
3457		break;
3458	case NL80211_IFTYPE_AP:
3459		/* This part is triggered only during CSA */
3460		if (!switching_chanctx || !mvmvif->ap_ibss_active)
3461			goto out;
3462
3463		mvmvif->csa_countdown = false;
3464
3465		/* Set CS bit on all the stations */
3466		iwl_mvm_modify_all_sta_disable_tx(mvm, mvmvif, true);
3467
3468		/* Save blocked iface, the timeout is set on the next beacon */
3469		rcu_assign_pointer(mvm->csa_tx_blocked_vif, vif);
3470
3471		mvmvif->ap_ibss_active = false;
3472		break;
3473	case NL80211_IFTYPE_STATION:
3474		if (!switching_chanctx)
3475			break;
3476
3477		disabled_vif = vif;
3478
3479		iwl_mvm_mac_ctxt_changed(mvm, vif, true, NULL);
3480		break;
3481	default:
3482		break;
3483	}
3484
3485	iwl_mvm_update_quotas(mvm, false, disabled_vif);
3486	iwl_mvm_binding_remove_vif(mvm, vif);
3487
3488out:
3489	mvmvif->phy_ctxt = NULL;
3490	iwl_mvm_power_update_mac(mvm);
3491}
3492
3493static void iwl_mvm_unassign_vif_chanctx(struct ieee80211_hw *hw,
3494					 struct ieee80211_vif *vif,
3495					 struct ieee80211_chanctx_conf *ctx)
3496{
3497	struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
3498
3499	mutex_lock(&mvm->mutex);
3500	__iwl_mvm_unassign_vif_chanctx(mvm, vif, ctx, false);
3501	mutex_unlock(&mvm->mutex);
3502}
3503
3504static int
3505iwl_mvm_switch_vif_chanctx_swap(struct iwl_mvm *mvm,
3506				struct ieee80211_vif_chanctx_switch *vifs)
3507{
3508	int ret;
3509
3510	mutex_lock(&mvm->mutex);
3511	__iwl_mvm_unassign_vif_chanctx(mvm, vifs[0].vif, vifs[0].old_ctx, true);
3512	__iwl_mvm_remove_chanctx(mvm, vifs[0].old_ctx);
3513
3514	ret = __iwl_mvm_add_chanctx(mvm, vifs[0].new_ctx);
3515	if (ret) {
3516		IWL_ERR(mvm, "failed to add new_ctx during channel switch\n");
3517		goto out_reassign;
3518	}
3519
3520	ret = __iwl_mvm_assign_vif_chanctx(mvm, vifs[0].vif, vifs[0].new_ctx,
3521					   true);
3522	if (ret) {
3523		IWL_ERR(mvm,
3524			"failed to assign new_ctx during channel switch\n");
3525		goto out_remove;
3526	}
3527
3528	/* we don't support TDLS during DCM - can be caused by channel switch */
3529	if (iwl_mvm_phy_ctx_count(mvm) > 1)
3530		iwl_mvm_teardown_tdls_peers(mvm);
3531
3532	goto out;
3533
3534out_remove:
3535	__iwl_mvm_remove_chanctx(mvm, vifs[0].new_ctx);
3536
3537out_reassign:
3538	if (__iwl_mvm_add_chanctx(mvm, vifs[0].old_ctx)) {
3539		IWL_ERR(mvm, "failed to add old_ctx back after failure.\n");
3540		goto out_restart;
3541	}
3542
3543	if (__iwl_mvm_assign_vif_chanctx(mvm, vifs[0].vif, vifs[0].old_ctx,
3544					 true)) {
3545		IWL_ERR(mvm, "failed to reassign old_ctx after failure.\n");
3546		goto out_restart;
3547	}
3548
3549	goto out;
3550
3551out_restart:
3552	/* things keep failing, better restart the hw */
3553	iwl_mvm_nic_restart(mvm, false);
3554
3555out:
3556	mutex_unlock(&mvm->mutex);
3557
3558	return ret;
3559}
3560
3561static int
3562iwl_mvm_switch_vif_chanctx_reassign(struct iwl_mvm *mvm,
3563				    struct ieee80211_vif_chanctx_switch *vifs)
3564{
3565	int ret;
3566
3567	mutex_lock(&mvm->mutex);
3568	__iwl_mvm_unassign_vif_chanctx(mvm, vifs[0].vif, vifs[0].old_ctx, true);
3569
3570	ret = __iwl_mvm_assign_vif_chanctx(mvm, vifs[0].vif, vifs[0].new_ctx,
3571					   true);
3572	if (ret) {
3573		IWL_ERR(mvm,
3574			"failed to assign new_ctx during channel switch\n");
3575		goto out_reassign;
3576	}
3577
3578	goto out;
3579
3580out_reassign:
3581	if (__iwl_mvm_assign_vif_chanctx(mvm, vifs[0].vif, vifs[0].old_ctx,
3582					 true)) {
3583		IWL_ERR(mvm, "failed to reassign old_ctx after failure.\n");
3584		goto out_restart;
3585	}
3586
3587	goto out;
3588
3589out_restart:
3590	/* things keep failing, better restart the hw */
3591	iwl_mvm_nic_restart(mvm, false);
3592
3593out:
3594	mutex_unlock(&mvm->mutex);
3595
3596	return ret;
3597}
3598
3599static int iwl_mvm_switch_vif_chanctx(struct ieee80211_hw *hw,
3600				      struct ieee80211_vif_chanctx_switch *vifs,
3601				      int n_vifs,
3602				      enum ieee80211_chanctx_switch_mode mode)
3603{
3604	struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
3605	int ret;
3606
3607	/* we only support a single-vif right now */
3608	if (n_vifs > 1)
3609		return -EOPNOTSUPP;
3610
3611	switch (mode) {
3612	case CHANCTX_SWMODE_SWAP_CONTEXTS:
3613		ret = iwl_mvm_switch_vif_chanctx_swap(mvm, vifs);
3614		break;
3615	case CHANCTX_SWMODE_REASSIGN_VIF:
3616		ret = iwl_mvm_switch_vif_chanctx_reassign(mvm, vifs);
3617		break;
3618	default:
3619		ret = -EOPNOTSUPP;
3620		break;
3621	}
3622
3623	return ret;
3624}
3625
3626static int iwl_mvm_set_tim(struct ieee80211_hw *hw,
3627			   struct ieee80211_sta *sta,
3628			   bool set)
3629{
3630	struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
3631	struct iwl_mvm_sta *mvm_sta = iwl_mvm_sta_from_mac80211(sta);
3632
3633	if (!mvm_sta || !mvm_sta->vif) {
3634		IWL_ERR(mvm, "Station is not associated to a vif\n");
3635		return -EINVAL;
3636	}
3637
3638	return iwl_mvm_mac_ctxt_beacon_changed(mvm, mvm_sta->vif);
3639}
3640
3641#ifdef CONFIG_NL80211_TESTMODE
3642static const struct nla_policy iwl_mvm_tm_policy[IWL_MVM_TM_ATTR_MAX + 1] = {
3643	[IWL_MVM_TM_ATTR_CMD] = { .type = NLA_U32 },
3644	[IWL_MVM_TM_ATTR_NOA_DURATION] = { .type = NLA_U32 },
3645	[IWL_MVM_TM_ATTR_BEACON_FILTER_STATE] = { .type = NLA_U32 },
3646};
3647
3648static int __iwl_mvm_mac_testmode_cmd(struct iwl_mvm *mvm,
3649				      struct ieee80211_vif *vif,
3650				      void *data, int len)
3651{
3652	struct nlattr *tb[IWL_MVM_TM_ATTR_MAX + 1];
3653	int err;
3654	u32 noa_duration;
3655
3656	err = nla_parse(tb, IWL_MVM_TM_ATTR_MAX, data, len, iwl_mvm_tm_policy);
3657	if (err)
3658		return err;
3659
3660	if (!tb[IWL_MVM_TM_ATTR_CMD])
3661		return -EINVAL;
3662
3663	switch (nla_get_u32(tb[IWL_MVM_TM_ATTR_CMD])) {
3664	case IWL_MVM_TM_CMD_SET_NOA:
3665		if (!vif || vif->type != NL80211_IFTYPE_AP || !vif->p2p ||
3666		    !vif->bss_conf.enable_beacon ||
3667		    !tb[IWL_MVM_TM_ATTR_NOA_DURATION])
3668			return -EINVAL;
3669
3670		noa_duration = nla_get_u32(tb[IWL_MVM_TM_ATTR_NOA_DURATION]);
3671		if (noa_duration >= vif->bss_conf.beacon_int)
3672			return -EINVAL;
3673
3674		mvm->noa_duration = noa_duration;
3675		mvm->noa_vif = vif;
3676
3677		return iwl_mvm_update_quotas(mvm, false, NULL);
3678	case IWL_MVM_TM_CMD_SET_BEACON_FILTER:
3679		/* must be associated client vif - ignore authorized */
3680		if (!vif || vif->type != NL80211_IFTYPE_STATION ||
3681		    !vif->bss_conf.assoc || !vif->bss_conf.dtim_period ||
3682		    !tb[IWL_MVM_TM_ATTR_BEACON_FILTER_STATE])
3683			return -EINVAL;
3684
3685		if (nla_get_u32(tb[IWL_MVM_TM_ATTR_BEACON_FILTER_STATE]))
3686			return iwl_mvm_enable_beacon_filter(mvm, vif, 0);
3687		return iwl_mvm_disable_beacon_filter(mvm, vif, 0);
3688	}
3689
3690	return -EOPNOTSUPP;
3691}
3692
3693static int iwl_mvm_mac_testmode_cmd(struct ieee80211_hw *hw,
3694				    struct ieee80211_vif *vif,
3695				    void *data, int len)
3696{
3697	struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
3698	int err;
3699
3700	mutex_lock(&mvm->mutex);
3701	err = __iwl_mvm_mac_testmode_cmd(mvm, vif, data, len);
3702	mutex_unlock(&mvm->mutex);
3703
3704	return err;
3705}
3706#endif
3707
3708static void iwl_mvm_channel_switch(struct ieee80211_hw *hw,
3709				   struct ieee80211_vif *vif,
3710				   struct ieee80211_channel_switch *chsw)
3711{
3712	/* By implementing this operation, we prevent mac80211 from
3713	 * starting its own channel switch timer, so that we can call
3714	 * ieee80211_chswitch_done() ourselves at the right time
3715	 * (which is when the absence time event starts).
3716	 */
3717
3718	IWL_DEBUG_MAC80211(IWL_MAC80211_GET_MVM(hw),
3719			   "dummy channel switch op\n");
3720}
3721
3722static int iwl_mvm_pre_channel_switch(struct ieee80211_hw *hw,
3723				      struct ieee80211_vif *vif,
3724				      struct ieee80211_channel_switch *chsw)
3725{
3726	struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
3727	struct ieee80211_vif *csa_vif;
3728	struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
3729	u32 apply_time;
3730	int ret;
3731
3732	mutex_lock(&mvm->mutex);
3733
3734	mvmvif->csa_failed = false;
3735
3736	IWL_DEBUG_MAC80211(mvm, "pre CSA to freq %d\n",
3737			   chsw->chandef.center_freq1);
3738
3739	iwl_fw_dbg_trigger_simple_stop(mvm, vif, FW_DBG_TRIGGER_CHANNEL_SWITCH);
3740
3741	switch (vif->type) {
3742	case NL80211_IFTYPE_AP:
3743		csa_vif =
3744			rcu_dereference_protected(mvm->csa_vif,
3745						  lockdep_is_held(&mvm->mutex));
3746		if (WARN_ONCE(csa_vif && csa_vif->csa_active,
3747			      "Another CSA is already in progress")) {
3748			ret = -EBUSY;
3749			goto out_unlock;
3750		}
3751
3752		rcu_assign_pointer(mvm->csa_vif, vif);
3753
3754		if (WARN_ONCE(mvmvif->csa_countdown,
3755			      "Previous CSA countdown didn't complete")) {
3756			ret = -EBUSY;
3757			goto out_unlock;
3758		}
3759
3760		break;
3761	case NL80211_IFTYPE_STATION:
3762		/* Schedule the time event to a bit before beacon 1,
3763		 * to make sure we're in the new channel when the
3764		 * GO/AP arrives.
3765		 */
3766		apply_time = chsw->device_timestamp +
3767			((vif->bss_conf.beacon_int * (chsw->count - 1) -
3768			  IWL_MVM_CHANNEL_SWITCH_TIME_CLIENT) * 1024);
3769
3770		if (chsw->block_tx)
3771			iwl_mvm_csa_client_absent(mvm, vif);
3772
3773		iwl_mvm_schedule_csa_period(mvm, vif, vif->bss_conf.beacon_int,
3774					    apply_time);
3775		if (mvmvif->bf_data.bf_enabled) {
3776			ret = iwl_mvm_disable_beacon_filter(mvm, vif, 0);
3777			if (ret)
3778				goto out_unlock;
3779		}
3780
3781		break;
3782	default:
3783		break;
3784	}
3785
3786	mvmvif->ps_disabled = true;
3787
3788	ret = iwl_mvm_power_update_ps(mvm);
3789	if (ret)
3790		goto out_unlock;
3791
3792	/* we won't be on this channel any longer */
3793	iwl_mvm_teardown_tdls_peers(mvm);
3794
3795out_unlock:
3796	mutex_unlock(&mvm->mutex);
3797
3798	return ret;
3799}
3800
3801static int iwl_mvm_post_channel_switch(struct ieee80211_hw *hw,
3802				       struct ieee80211_vif *vif)
3803{
3804	struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
3805	struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
3806	int ret;
3807
3808	mutex_lock(&mvm->mutex);
3809
3810	if (mvmvif->csa_failed) {
3811		mvmvif->csa_failed = false;
3812		ret = -EIO;
3813		goto out_unlock;
3814	}
3815
3816	if (vif->type == NL80211_IFTYPE_STATION) {
3817		struct iwl_mvm_sta *mvmsta;
3818
3819		mvmsta = iwl_mvm_sta_from_staid_protected(mvm,
3820							  mvmvif->ap_sta_id);
3821
3822		if (WARN_ON(!mvmsta)) {
3823			ret = -EIO;
3824			goto out_unlock;
3825		}
3826
3827		iwl_mvm_sta_modify_disable_tx(mvm, mvmsta, false);
3828
3829		iwl_mvm_mac_ctxt_changed(mvm, vif, false, NULL);
3830
3831		ret = iwl_mvm_enable_beacon_filter(mvm, vif, 0);
3832		if (ret)
3833			goto out_unlock;
3834
3835		iwl_mvm_stop_session_protection(mvm, vif);
3836	}
3837
3838	mvmvif->ps_disabled = false;
3839
3840	ret = iwl_mvm_power_update_ps(mvm);
3841
3842out_unlock:
3843	mutex_unlock(&mvm->mutex);
3844
3845	return ret;
3846}
3847
3848static void iwl_mvm_mac_flush(struct ieee80211_hw *hw,
3849			      struct ieee80211_vif *vif, u32 queues, bool drop)
3850{
3851	struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
3852	struct iwl_mvm_vif *mvmvif;
3853	struct iwl_mvm_sta *mvmsta;
3854	struct ieee80211_sta *sta;
3855	int i;
3856	u32 msk = 0;
3857
3858	if (!vif || vif->type != NL80211_IFTYPE_STATION)
3859		return;
3860
3861	mutex_lock(&mvm->mutex);
3862	mvmvif = iwl_mvm_vif_from_mac80211(vif);
3863
3864	/* flush the AP-station and all TDLS peers */
3865	for (i = 0; i < IWL_MVM_STATION_COUNT; i++) {
3866		sta = rcu_dereference_protected(mvm->fw_id_to_mac_id[i],
3867						lockdep_is_held(&mvm->mutex));
3868		if (IS_ERR_OR_NULL(sta))
3869			continue;
3870
3871		mvmsta = iwl_mvm_sta_from_mac80211(sta);
3872		if (mvmsta->vif != vif)
3873			continue;
3874
3875		/* make sure only TDLS peers or the AP are flushed */
3876		WARN_ON(i != mvmvif->ap_sta_id && !sta->tdls);
3877
3878		msk |= mvmsta->tfd_queue_msk;
3879	}
3880
3881	if (drop) {
3882		if (iwl_mvm_flush_tx_path(mvm, msk, true))
3883			IWL_ERR(mvm, "flush request fail\n");
3884		mutex_unlock(&mvm->mutex);
3885	} else {
3886		mutex_unlock(&mvm->mutex);
3887
3888		/* this can take a while, and we may need/want other operations
3889		 * to succeed while doing this, so do it without the mutex held
3890		 */
3891		iwl_trans_wait_tx_queue_empty(mvm->trans, msk);
3892	}
3893}
3894
3895static int iwl_mvm_mac_get_survey(struct ieee80211_hw *hw, int idx,
3896				  struct survey_info *survey)
3897{
3898	struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
3899	int ret;
3900
3901	memset(survey, 0, sizeof(*survey));
3902
3903	/* only support global statistics right now */
3904	if (idx != 0)
3905		return -ENOENT;
3906
3907	if (!(mvm->fw->ucode_capa.capa[0] &
3908			IWL_UCODE_TLV_CAPA_RADIO_BEACON_STATS))
3909		return -ENOENT;
3910
3911	mutex_lock(&mvm->mutex);
3912
3913	if (mvm->ucode_loaded) {
3914		ret = iwl_mvm_request_statistics(mvm, false);
3915		if (ret)
3916			goto out;
3917	}
3918
3919	survey->filled = SURVEY_INFO_TIME |
3920			 SURVEY_INFO_TIME_RX |
3921			 SURVEY_INFO_TIME_TX |
3922			 SURVEY_INFO_TIME_SCAN;
3923	survey->time = mvm->accu_radio_stats.on_time_rf +
3924		       mvm->radio_stats.on_time_rf;
3925	do_div(survey->time, USEC_PER_MSEC);
3926
3927	survey->time_rx = mvm->accu_radio_stats.rx_time +
3928			  mvm->radio_stats.rx_time;
3929	do_div(survey->time_rx, USEC_PER_MSEC);
3930
3931	survey->time_tx = mvm->accu_radio_stats.tx_time +
3932			  mvm->radio_stats.tx_time;
3933	do_div(survey->time_tx, USEC_PER_MSEC);
3934
3935	survey->time_scan = mvm->accu_radio_stats.on_time_scan +
3936			    mvm->radio_stats.on_time_scan;
3937	do_div(survey->time_scan, USEC_PER_MSEC);
3938
3939	ret = 0;
3940 out:
3941	mutex_unlock(&mvm->mutex);
3942	return ret;
3943}
3944
3945static void iwl_mvm_mac_sta_statistics(struct ieee80211_hw *hw,
3946				       struct ieee80211_vif *vif,
3947				       struct ieee80211_sta *sta,
3948				       struct station_info *sinfo)
3949{
3950	struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
3951	struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
3952	struct iwl_mvm_sta *mvmsta = iwl_mvm_sta_from_mac80211(sta);
3953
3954	if (!(mvm->fw->ucode_capa.capa[0] &
3955				IWL_UCODE_TLV_CAPA_RADIO_BEACON_STATS))
3956		return;
3957
3958	/* if beacon filtering isn't on mac80211 does it anyway */
3959	if (!(vif->driver_flags & IEEE80211_VIF_BEACON_FILTER))
3960		return;
3961
3962	if (!vif->bss_conf.assoc)
3963		return;
3964
3965	mutex_lock(&mvm->mutex);
3966
3967	if (mvmvif->ap_sta_id != mvmsta->sta_id)
3968		goto unlock;
3969
3970	if (iwl_mvm_request_statistics(mvm, false))
3971		goto unlock;
3972
3973	sinfo->rx_beacon = mvmvif->beacon_stats.num_beacons +
3974			   mvmvif->beacon_stats.accu_num_beacons;
3975	sinfo->filled |= BIT(NL80211_STA_INFO_BEACON_RX);
3976	if (mvmvif->beacon_stats.avg_signal) {
3977		/* firmware only reports a value after RXing a few beacons */
3978		sinfo->rx_beacon_signal_avg = mvmvif->beacon_stats.avg_signal;
3979		sinfo->filled |= BIT(NL80211_STA_INFO_BEACON_SIGNAL_AVG);
3980	}
3981 unlock:
3982	mutex_unlock(&mvm->mutex);
3983}
3984
3985static void iwl_mvm_mac_event_callback(struct ieee80211_hw *hw,
3986				       struct ieee80211_vif *vif,
3987				       const struct ieee80211_event *event)
3988{
3989#define CHECK_MLME_TRIGGER(_mvm, _trig, _buf, _cnt, _fmt...)	\
3990	do {							\
3991		if ((_cnt) && --(_cnt))				\
3992			break;					\
3993		iwl_mvm_fw_dbg_collect_trig(_mvm, _trig, _fmt);\
3994	} while (0)
3995
3996	struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
3997	struct iwl_fw_dbg_trigger_tlv *trig;
3998	struct iwl_fw_dbg_trigger_mlme *trig_mlme;
3999
4000	if (!iwl_fw_dbg_trigger_enabled(mvm->fw, FW_DBG_TRIGGER_MLME))
4001		return;
4002
4003	trig = iwl_fw_dbg_get_trigger(mvm->fw, FW_DBG_TRIGGER_MLME);
4004	trig_mlme = (void *)trig->data;
4005	if (!iwl_fw_dbg_trigger_check_stop(mvm, vif, trig))
4006		return;
4007
4008	if (event->u.mlme.data == ASSOC_EVENT) {
4009		if (event->u.mlme.status == MLME_DENIED)
4010			CHECK_MLME_TRIGGER(mvm, trig, buf,
4011					   trig_mlme->stop_assoc_denied,
4012					   "DENIED ASSOC: reason %d",
4013					    event->u.mlme.reason);
4014		else if (event->u.mlme.status == MLME_TIMEOUT)
4015			CHECK_MLME_TRIGGER(mvm, trig, buf,
4016					   trig_mlme->stop_assoc_timeout,
4017					   "ASSOC TIMEOUT");
4018	} else if (event->u.mlme.data == AUTH_EVENT) {
4019		if (event->u.mlme.status == MLME_DENIED)
4020			CHECK_MLME_TRIGGER(mvm, trig, buf,
4021					   trig_mlme->stop_auth_denied,
4022					   "DENIED AUTH: reason %d",
4023					   event->u.mlme.reason);
4024		else if (event->u.mlme.status == MLME_TIMEOUT)
4025			CHECK_MLME_TRIGGER(mvm, trig, buf,
4026					   trig_mlme->stop_auth_timeout,
4027					   "AUTH TIMEOUT");
4028	} else if (event->u.mlme.data == DEAUTH_RX_EVENT) {
4029		CHECK_MLME_TRIGGER(mvm, trig, buf,
4030				   trig_mlme->stop_rx_deauth,
4031				   "DEAUTH RX %d", event->u.mlme.reason);
4032	} else if (event->u.mlme.data == DEAUTH_TX_EVENT) {
4033		CHECK_MLME_TRIGGER(mvm, trig, buf,
4034				   trig_mlme->stop_tx_deauth,
4035				   "DEAUTH TX %d", event->u.mlme.reason);
4036	}
4037#undef CHECK_MLME_TRIGGER
4038}
4039
4040const struct ieee80211_ops iwl_mvm_hw_ops = {
4041	.tx = iwl_mvm_mac_tx,
4042	.ampdu_action = iwl_mvm_mac_ampdu_action,
4043	.start = iwl_mvm_mac_start,
4044	.reconfig_complete = iwl_mvm_mac_reconfig_complete,
4045	.stop = iwl_mvm_mac_stop,
4046	.add_interface = iwl_mvm_mac_add_interface,
4047	.remove_interface = iwl_mvm_mac_remove_interface,
4048	.config = iwl_mvm_mac_config,
4049	.prepare_multicast = iwl_mvm_prepare_multicast,
4050	.configure_filter = iwl_mvm_configure_filter,
4051	.bss_info_changed = iwl_mvm_bss_info_changed,
4052	.hw_scan = iwl_mvm_mac_hw_scan,
4053	.cancel_hw_scan = iwl_mvm_mac_cancel_hw_scan,
4054	.sta_pre_rcu_remove = iwl_mvm_sta_pre_rcu_remove,
4055	.sta_state = iwl_mvm_mac_sta_state,
4056	.sta_notify = iwl_mvm_mac_sta_notify,
4057	.allow_buffered_frames = iwl_mvm_mac_allow_buffered_frames,
4058	.release_buffered_frames = iwl_mvm_mac_release_buffered_frames,
4059	.set_rts_threshold = iwl_mvm_mac_set_rts_threshold,
4060	.sta_rc_update = iwl_mvm_sta_rc_update,
4061	.conf_tx = iwl_mvm_mac_conf_tx,
4062	.mgd_prepare_tx = iwl_mvm_mac_mgd_prepare_tx,
4063	.mgd_protect_tdls_discover = iwl_mvm_mac_mgd_protect_tdls_discover,
4064	.flush = iwl_mvm_mac_flush,
4065	.sched_scan_start = iwl_mvm_mac_sched_scan_start,
4066	.sched_scan_stop = iwl_mvm_mac_sched_scan_stop,
4067	.set_key = iwl_mvm_mac_set_key,
4068	.update_tkip_key = iwl_mvm_mac_update_tkip_key,
4069	.remain_on_channel = iwl_mvm_roc,
4070	.cancel_remain_on_channel = iwl_mvm_cancel_roc,
4071	.add_chanctx = iwl_mvm_add_chanctx,
4072	.remove_chanctx = iwl_mvm_remove_chanctx,
4073	.change_chanctx = iwl_mvm_change_chanctx,
4074	.assign_vif_chanctx = iwl_mvm_assign_vif_chanctx,
4075	.unassign_vif_chanctx = iwl_mvm_unassign_vif_chanctx,
4076	.switch_vif_chanctx = iwl_mvm_switch_vif_chanctx,
4077
4078	.start_ap = iwl_mvm_start_ap_ibss,
4079	.stop_ap = iwl_mvm_stop_ap_ibss,
4080	.join_ibss = iwl_mvm_start_ap_ibss,
4081	.leave_ibss = iwl_mvm_stop_ap_ibss,
4082
4083	.set_tim = iwl_mvm_set_tim,
4084
4085	.channel_switch = iwl_mvm_channel_switch,
4086	.pre_channel_switch = iwl_mvm_pre_channel_switch,
4087	.post_channel_switch = iwl_mvm_post_channel_switch,
4088
4089	.tdls_channel_switch = iwl_mvm_tdls_channel_switch,
4090	.tdls_cancel_channel_switch = iwl_mvm_tdls_cancel_channel_switch,
4091	.tdls_recv_channel_switch = iwl_mvm_tdls_recv_channel_switch,
4092
4093	.event_callback = iwl_mvm_mac_event_callback,
4094
4095	CFG80211_TESTMODE_CMD(iwl_mvm_mac_testmode_cmd)
4096
4097#ifdef CONFIG_PM_SLEEP
4098	/* look at d3.c */
4099	.suspend = iwl_mvm_suspend,
4100	.resume = iwl_mvm_resume,
4101	.set_wakeup = iwl_mvm_set_wakeup,
4102	.set_rekey_data = iwl_mvm_set_rekey_data,
4103#if IS_ENABLED(CONFIG_IPV6)
4104	.ipv6_addr_change = iwl_mvm_ipv6_addr_change,
4105#endif
4106	.set_default_unicast_key = iwl_mvm_set_default_unicast_key,
4107#endif
4108	.get_survey = iwl_mvm_mac_get_survey,
4109	.sta_statistics = iwl_mvm_mac_sta_statistics,
4110};
4111