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
66#include <linux/etherdevice.h>
67#include <net/mac80211.h>
68#include "iwl-io.h"
69#include "iwl-prph.h"
70#include "fw-api.h"
71#include "mvm.h"
72#include "time-event.h"
73
74const u8 iwl_mvm_ac_to_tx_fifo[] = {
75	IWL_MVM_TX_FIFO_VO,
76	IWL_MVM_TX_FIFO_VI,
77	IWL_MVM_TX_FIFO_BE,
78	IWL_MVM_TX_FIFO_BK,
79};
80
81struct iwl_mvm_mac_iface_iterator_data {
82	struct iwl_mvm *mvm;
83	struct ieee80211_vif *vif;
84	unsigned long available_mac_ids[BITS_TO_LONGS(NUM_MAC_INDEX_DRIVER)];
85	unsigned long available_tsf_ids[BITS_TO_LONGS(NUM_TSF_IDS)];
86	enum iwl_tsf_id preferred_tsf;
87	bool found_vif;
88};
89
90struct iwl_mvm_hw_queues_iface_iterator_data {
91	struct ieee80211_vif *exclude_vif;
92	unsigned long used_hw_queues;
93};
94
95static void iwl_mvm_mac_tsf_id_iter(void *_data, u8 *mac,
96				    struct ieee80211_vif *vif)
97{
98	struct iwl_mvm_mac_iface_iterator_data *data = _data;
99	struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
100	u16 min_bi;
101
102	/* Skip the interface for which we are trying to assign a tsf_id  */
103	if (vif == data->vif)
104		return;
105
106	/*
107	 * The TSF is a hardware/firmware resource, there are 4 and
108	 * the driver should assign and free them as needed. However,
109	 * there are cases where 2 MACs should share the same TSF ID
110	 * for the purpose of clock sync, an optimization to avoid
111	 * clock drift causing overlapping TBTTs/DTIMs for a GO and
112	 * client in the system.
113	 *
114	 * The firmware will decide according to the MAC type which
115	 * will be the master and slave. Clients that need to sync
116	 * with a remote station will be the master, and an AP or GO
117	 * will be the slave.
118	 *
119	 * Depending on the new interface type it can be slaved to
120	 * or become the master of an existing interface.
121	 */
122	switch (data->vif->type) {
123	case NL80211_IFTYPE_STATION:
124		/*
125		 * The new interface is a client, so if the one we're iterating
126		 * is an AP, and the beacon interval of the AP is a multiple or
127		 * divisor of the beacon interval of the client, the same TSF
128		 * should be used to avoid drift between the new client and
129		 * existing AP. The existing AP will get drift updates from the
130		 * new client context in this case.
131		 */
132		if (vif->type != NL80211_IFTYPE_AP ||
133		    data->preferred_tsf != NUM_TSF_IDS ||
134		    !test_bit(mvmvif->tsf_id, data->available_tsf_ids))
135			break;
136
137		min_bi = min(data->vif->bss_conf.beacon_int,
138			     vif->bss_conf.beacon_int);
139
140		if (!min_bi)
141			break;
142
143		if ((data->vif->bss_conf.beacon_int -
144		     vif->bss_conf.beacon_int) % min_bi == 0) {
145			data->preferred_tsf = mvmvif->tsf_id;
146			return;
147		}
148		break;
149
150	case NL80211_IFTYPE_AP:
151		/*
152		 * The new interface is AP/GO, so if its beacon interval is a
153		 * multiple or a divisor of the beacon interval of an existing
154		 * interface, it should get drift updates from an existing
155		 * client or use the same TSF as an existing GO. There's no
156		 * drift between TSFs internally but if they used different
157		 * TSFs then a new client MAC could update one of them and
158		 * cause drift that way.
159		 */
160		if ((vif->type != NL80211_IFTYPE_AP &&
161		     vif->type != NL80211_IFTYPE_STATION) ||
162		    data->preferred_tsf != NUM_TSF_IDS ||
163		    !test_bit(mvmvif->tsf_id, data->available_tsf_ids))
164			break;
165
166		min_bi = min(data->vif->bss_conf.beacon_int,
167			     vif->bss_conf.beacon_int);
168
169		if (!min_bi)
170			break;
171
172		if ((data->vif->bss_conf.beacon_int -
173		     vif->bss_conf.beacon_int) % min_bi == 0) {
174			data->preferred_tsf = mvmvif->tsf_id;
175			return;
176		}
177		break;
178	default:
179		/*
180		 * For all other interface types there's no need to
181		 * take drift into account. Either they're exclusive
182		 * like IBSS and monitor, or we don't care much about
183		 * their TSF (like P2P Device), but we won't be able
184		 * to share the TSF resource.
185		 */
186		break;
187	}
188
189	/*
190	 * Unless we exited above, we can't share the TSF resource
191	 * that the virtual interface we're iterating over is using
192	 * with the new one, so clear the available bit and if this
193	 * was the preferred one, reset that as well.
194	 */
195	__clear_bit(mvmvif->tsf_id, data->available_tsf_ids);
196
197	if (data->preferred_tsf == mvmvif->tsf_id)
198		data->preferred_tsf = NUM_TSF_IDS;
199}
200
201/*
202 * Get the mask of the queues used by the vif
203 */
204u32 iwl_mvm_mac_get_queues_mask(struct ieee80211_vif *vif)
205{
206	u32 qmask = 0, ac;
207
208	if (vif->type == NL80211_IFTYPE_P2P_DEVICE)
209		return BIT(IWL_MVM_OFFCHANNEL_QUEUE);
210
211	for (ac = 0; ac < IEEE80211_NUM_ACS; ac++) {
212		if (vif->hw_queue[ac] != IEEE80211_INVAL_HW_QUEUE)
213			qmask |= BIT(vif->hw_queue[ac]);
214	}
215
216	if (vif->type == NL80211_IFTYPE_AP)
217		qmask |= BIT(vif->cab_queue);
218
219	return qmask;
220}
221
222static void iwl_mvm_iface_hw_queues_iter(void *_data, u8 *mac,
223					 struct ieee80211_vif *vif)
224{
225	struct iwl_mvm_hw_queues_iface_iterator_data *data = _data;
226
227	/* exclude the given vif */
228	if (vif == data->exclude_vif)
229		return;
230
231	data->used_hw_queues |= iwl_mvm_mac_get_queues_mask(vif);
232}
233
234static void iwl_mvm_mac_sta_hw_queues_iter(void *_data,
235					   struct ieee80211_sta *sta)
236{
237	struct iwl_mvm_hw_queues_iface_iterator_data *data = _data;
238	struct iwl_mvm_sta *mvmsta = iwl_mvm_sta_from_mac80211(sta);
239
240	/* Mark the queues used by the sta */
241	data->used_hw_queues |= mvmsta->tfd_queue_msk;
242}
243
244unsigned long iwl_mvm_get_used_hw_queues(struct iwl_mvm *mvm,
245					 struct ieee80211_vif *exclude_vif)
246{
247	u8 sta_id;
248	struct iwl_mvm_hw_queues_iface_iterator_data data = {
249		.exclude_vif = exclude_vif,
250		.used_hw_queues =
251			BIT(IWL_MVM_OFFCHANNEL_QUEUE) |
252			BIT(mvm->aux_queue) |
253			BIT(IWL_MVM_CMD_QUEUE),
254	};
255
256	lockdep_assert_held(&mvm->mutex);
257
258	/* mark all VIF used hw queues */
259	ieee80211_iterate_active_interfaces_atomic(
260		mvm->hw, IEEE80211_IFACE_ITER_RESUME_ALL,
261		iwl_mvm_iface_hw_queues_iter, &data);
262
263	/* don't assign the same hw queues as TDLS stations */
264	ieee80211_iterate_stations_atomic(mvm->hw,
265					  iwl_mvm_mac_sta_hw_queues_iter,
266					  &data);
267
268	/*
269	 * Some TDLS stations may be removed but are in the process of being
270	 * drained. Don't touch their queues.
271	 */
272	for_each_set_bit(sta_id, mvm->sta_drained, IWL_MVM_STATION_COUNT)
273		data.used_hw_queues |= mvm->tfd_drained[sta_id];
274
275	return data.used_hw_queues;
276}
277
278static void iwl_mvm_mac_iface_iterator(void *_data, u8 *mac,
279				       struct ieee80211_vif *vif)
280{
281	struct iwl_mvm_mac_iface_iterator_data *data = _data;
282	struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
283
284	/* Iterator may already find the interface being added -- skip it */
285	if (vif == data->vif) {
286		data->found_vif = true;
287		return;
288	}
289
290	/* Mark MAC IDs as used by clearing the available bit, and
291	 * (below) mark TSFs as used if their existing use is not
292	 * compatible with the new interface type.
293	 * No locking or atomic bit operations are needed since the
294	 * data is on the stack of the caller function.
295	 */
296	__clear_bit(mvmvif->id, data->available_mac_ids);
297
298	/* find a suitable tsf_id */
299	iwl_mvm_mac_tsf_id_iter(_data, mac, vif);
300}
301
302void iwl_mvm_mac_ctxt_recalc_tsf_id(struct iwl_mvm *mvm,
303				    struct ieee80211_vif *vif)
304{
305	struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
306	struct iwl_mvm_mac_iface_iterator_data data = {
307		.mvm = mvm,
308		.vif = vif,
309		.available_tsf_ids = { (1 << NUM_TSF_IDS) - 1 },
310		/* no preference yet */
311		.preferred_tsf = NUM_TSF_IDS,
312	};
313
314	ieee80211_iterate_active_interfaces_atomic(
315		mvm->hw, IEEE80211_IFACE_ITER_RESUME_ALL,
316		iwl_mvm_mac_tsf_id_iter, &data);
317
318	if (data.preferred_tsf != NUM_TSF_IDS)
319		mvmvif->tsf_id = data.preferred_tsf;
320	else if (!test_bit(mvmvif->tsf_id, data.available_tsf_ids))
321		mvmvif->tsf_id = find_first_bit(data.available_tsf_ids,
322						NUM_TSF_IDS);
323}
324
325static int iwl_mvm_mac_ctxt_allocate_resources(struct iwl_mvm *mvm,
326					       struct ieee80211_vif *vif)
327{
328	struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
329	struct iwl_mvm_mac_iface_iterator_data data = {
330		.mvm = mvm,
331		.vif = vif,
332		.available_mac_ids = { (1 << NUM_MAC_INDEX_DRIVER) - 1 },
333		.available_tsf_ids = { (1 << NUM_TSF_IDS) - 1 },
334		/* no preference yet */
335		.preferred_tsf = NUM_TSF_IDS,
336		.found_vif = false,
337	};
338	u32 ac;
339	int ret, i;
340	unsigned long used_hw_queues;
341
342	/*
343	 * Allocate a MAC ID and a TSF for this MAC, along with the queues
344	 * and other resources.
345	 */
346
347	/*
348	 * Before the iterator, we start with all MAC IDs and TSFs available.
349	 *
350	 * During iteration, all MAC IDs are cleared that are in use by other
351	 * virtual interfaces, and all TSF IDs are cleared that can't be used
352	 * by this new virtual interface because they're used by an interface
353	 * that can't share it with the new one.
354	 * At the same time, we check if there's a preferred TSF in the case
355	 * that we should share it with another interface.
356	 */
357
358	/* Currently, MAC ID 0 should be used only for the managed/IBSS vif */
359	switch (vif->type) {
360	case NL80211_IFTYPE_ADHOC:
361		break;
362	case NL80211_IFTYPE_STATION:
363		if (!vif->p2p)
364			break;
365		/* fall through */
366	default:
367		__clear_bit(0, data.available_mac_ids);
368	}
369
370	ieee80211_iterate_active_interfaces_atomic(
371		mvm->hw, IEEE80211_IFACE_ITER_RESUME_ALL,
372		iwl_mvm_mac_iface_iterator, &data);
373
374	used_hw_queues = iwl_mvm_get_used_hw_queues(mvm, vif);
375
376	/*
377	 * In the case we're getting here during resume, it's similar to
378	 * firmware restart, and with RESUME_ALL the iterator will find
379	 * the vif being added already.
380	 * We don't want to reassign any IDs in either case since doing
381	 * so would probably assign different IDs (as interfaces aren't
382	 * necessarily added in the same order), but the old IDs were
383	 * preserved anyway, so skip ID assignment for both resume and
384	 * recovery.
385	 */
386	if (data.found_vif)
387		return 0;
388
389	/* Therefore, in recovery, we can't get here */
390	if (WARN_ON_ONCE(test_bit(IWL_MVM_STATUS_IN_HW_RESTART, &mvm->status)))
391		return -EBUSY;
392
393	mvmvif->id = find_first_bit(data.available_mac_ids,
394				    NUM_MAC_INDEX_DRIVER);
395	if (mvmvif->id == NUM_MAC_INDEX_DRIVER) {
396		IWL_ERR(mvm, "Failed to init MAC context - no free ID!\n");
397		ret = -EIO;
398		goto exit_fail;
399	}
400
401	if (data.preferred_tsf != NUM_TSF_IDS)
402		mvmvif->tsf_id = data.preferred_tsf;
403	else
404		mvmvif->tsf_id = find_first_bit(data.available_tsf_ids,
405						NUM_TSF_IDS);
406	if (mvmvif->tsf_id == NUM_TSF_IDS) {
407		IWL_ERR(mvm, "Failed to init MAC context - no free TSF!\n");
408		ret = -EIO;
409		goto exit_fail;
410	}
411
412	mvmvif->color = 0;
413
414	INIT_LIST_HEAD(&mvmvif->time_event_data.list);
415	mvmvif->time_event_data.id = TE_MAX;
416
417	/* No need to allocate data queues to P2P Device MAC.*/
418	if (vif->type == NL80211_IFTYPE_P2P_DEVICE) {
419		for (ac = 0; ac < IEEE80211_NUM_ACS; ac++)
420			vif->hw_queue[ac] = IEEE80211_INVAL_HW_QUEUE;
421
422		return 0;
423	}
424
425	/* Find available queues, and allocate them to the ACs */
426	for (ac = 0; ac < IEEE80211_NUM_ACS; ac++) {
427		u8 queue = find_first_zero_bit(&used_hw_queues,
428					       mvm->first_agg_queue);
429
430		if (queue >= mvm->first_agg_queue) {
431			IWL_ERR(mvm, "Failed to allocate queue\n");
432			ret = -EIO;
433			goto exit_fail;
434		}
435
436		__set_bit(queue, &used_hw_queues);
437		vif->hw_queue[ac] = queue;
438	}
439
440	/* Allocate the CAB queue for softAP and GO interfaces */
441	if (vif->type == NL80211_IFTYPE_AP) {
442		u8 queue = find_first_zero_bit(&used_hw_queues,
443					       mvm->first_agg_queue);
444
445		if (queue >= mvm->first_agg_queue) {
446			IWL_ERR(mvm, "Failed to allocate cab queue\n");
447			ret = -EIO;
448			goto exit_fail;
449		}
450
451		vif->cab_queue = queue;
452	} else {
453		vif->cab_queue = IEEE80211_INVAL_HW_QUEUE;
454	}
455
456	mvmvif->bcast_sta.sta_id = IWL_MVM_STATION_COUNT;
457	mvmvif->ap_sta_id = IWL_MVM_STATION_COUNT;
458
459	for (i = 0; i < NUM_IWL_MVM_SMPS_REQ; i++)
460		mvmvif->smps_requests[i] = IEEE80211_SMPS_AUTOMATIC;
461
462	return 0;
463
464exit_fail:
465	memset(mvmvif, 0, sizeof(struct iwl_mvm_vif));
466	memset(vif->hw_queue, IEEE80211_INVAL_HW_QUEUE, sizeof(vif->hw_queue));
467	vif->cab_queue = IEEE80211_INVAL_HW_QUEUE;
468	return ret;
469}
470
471int iwl_mvm_mac_ctxt_init(struct iwl_mvm *mvm, struct ieee80211_vif *vif)
472{
473	unsigned int wdg_timeout =
474		iwl_mvm_get_wd_timeout(mvm, vif, false, false);
475	u32 ac;
476	int ret;
477
478	lockdep_assert_held(&mvm->mutex);
479
480	ret = iwl_mvm_mac_ctxt_allocate_resources(mvm, vif);
481	if (ret)
482		return ret;
483
484	switch (vif->type) {
485	case NL80211_IFTYPE_P2P_DEVICE:
486		iwl_mvm_enable_ac_txq(mvm, IWL_MVM_OFFCHANNEL_QUEUE,
487				      IWL_MVM_TX_FIFO_VO, wdg_timeout);
488		break;
489	case NL80211_IFTYPE_AP:
490		iwl_mvm_enable_ac_txq(mvm, vif->cab_queue,
491				      IWL_MVM_TX_FIFO_MCAST, wdg_timeout);
492		/* fall through */
493	default:
494		for (ac = 0; ac < IEEE80211_NUM_ACS; ac++)
495			iwl_mvm_enable_ac_txq(mvm, vif->hw_queue[ac],
496					      iwl_mvm_ac_to_tx_fifo[ac],
497					      wdg_timeout);
498		break;
499	}
500
501	return 0;
502}
503
504void iwl_mvm_mac_ctxt_release(struct iwl_mvm *mvm, struct ieee80211_vif *vif)
505{
506	int ac;
507
508	lockdep_assert_held(&mvm->mutex);
509
510	switch (vif->type) {
511	case NL80211_IFTYPE_P2P_DEVICE:
512		iwl_mvm_disable_txq(mvm, IWL_MVM_OFFCHANNEL_QUEUE, 0);
513		break;
514	case NL80211_IFTYPE_AP:
515		iwl_mvm_disable_txq(mvm, vif->cab_queue, 0);
516		/* fall through */
517	default:
518		for (ac = 0; ac < IEEE80211_NUM_ACS; ac++)
519			iwl_mvm_disable_txq(mvm, vif->hw_queue[ac], 0);
520	}
521}
522
523static void iwl_mvm_ack_rates(struct iwl_mvm *mvm,
524			      struct ieee80211_vif *vif,
525			      enum ieee80211_band band,
526			      u8 *cck_rates, u8 *ofdm_rates)
527{
528	struct ieee80211_supported_band *sband;
529	unsigned long basic = vif->bss_conf.basic_rates;
530	int lowest_present_ofdm = 100;
531	int lowest_present_cck = 100;
532	u8 cck = 0;
533	u8 ofdm = 0;
534	int i;
535
536	sband = mvm->hw->wiphy->bands[band];
537
538	for_each_set_bit(i, &basic, BITS_PER_LONG) {
539		int hw = sband->bitrates[i].hw_value;
540		if (hw >= IWL_FIRST_OFDM_RATE) {
541			ofdm |= BIT(hw - IWL_FIRST_OFDM_RATE);
542			if (lowest_present_ofdm > hw)
543				lowest_present_ofdm = hw;
544		} else {
545			BUILD_BUG_ON(IWL_FIRST_CCK_RATE != 0);
546
547			cck |= BIT(hw);
548			if (lowest_present_cck > hw)
549				lowest_present_cck = hw;
550		}
551	}
552
553	/*
554	 * Now we've got the basic rates as bitmaps in the ofdm and cck
555	 * variables. This isn't sufficient though, as there might not
556	 * be all the right rates in the bitmap. E.g. if the only basic
557	 * rates are 5.5 Mbps and 11 Mbps, we still need to add 1 Mbps
558	 * and 6 Mbps because the 802.11-2007 standard says in 9.6:
559	 *
560	 *    [...] a STA responding to a received frame shall transmit
561	 *    its Control Response frame [...] at the highest rate in the
562	 *    BSSBasicRateSet parameter that is less than or equal to the
563	 *    rate of the immediately previous frame in the frame exchange
564	 *    sequence ([...]) and that is of the same modulation class
565	 *    ([...]) as the received frame. If no rate contained in the
566	 *    BSSBasicRateSet parameter meets these conditions, then the
567	 *    control frame sent in response to a received frame shall be
568	 *    transmitted at the highest mandatory rate of the PHY that is
569	 *    less than or equal to the rate of the received frame, and
570	 *    that is of the same modulation class as the received frame.
571	 *
572	 * As a consequence, we need to add all mandatory rates that are
573	 * lower than all of the basic rates to these bitmaps.
574	 */
575
576	if (IWL_RATE_24M_INDEX < lowest_present_ofdm)
577		ofdm |= IWL_RATE_BIT_MSK(24) >> IWL_FIRST_OFDM_RATE;
578	if (IWL_RATE_12M_INDEX < lowest_present_ofdm)
579		ofdm |= IWL_RATE_BIT_MSK(12) >> IWL_FIRST_OFDM_RATE;
580	/* 6M already there or needed so always add */
581	ofdm |= IWL_RATE_BIT_MSK(6) >> IWL_FIRST_OFDM_RATE;
582
583	/*
584	 * CCK is a bit more complex with DSSS vs. HR/DSSS vs. ERP.
585	 * Note, however:
586	 *  - if no CCK rates are basic, it must be ERP since there must
587	 *    be some basic rates at all, so they're OFDM => ERP PHY
588	 *    (or we're in 5 GHz, and the cck bitmap will never be used)
589	 *  - if 11M is a basic rate, it must be ERP as well, so add 5.5M
590	 *  - if 5.5M is basic, 1M and 2M are mandatory
591	 *  - if 2M is basic, 1M is mandatory
592	 *  - if 1M is basic, that's the only valid ACK rate.
593	 * As a consequence, it's not as complicated as it sounds, just add
594	 * any lower rates to the ACK rate bitmap.
595	 */
596	if (IWL_RATE_11M_INDEX < lowest_present_cck)
597		cck |= IWL_RATE_BIT_MSK(11) >> IWL_FIRST_CCK_RATE;
598	if (IWL_RATE_5M_INDEX < lowest_present_cck)
599		cck |= IWL_RATE_BIT_MSK(5) >> IWL_FIRST_CCK_RATE;
600	if (IWL_RATE_2M_INDEX < lowest_present_cck)
601		cck |= IWL_RATE_BIT_MSK(2) >> IWL_FIRST_CCK_RATE;
602	/* 1M already there or needed so always add */
603	cck |= IWL_RATE_BIT_MSK(1) >> IWL_FIRST_CCK_RATE;
604
605	*cck_rates = cck;
606	*ofdm_rates = ofdm;
607}
608
609static void iwl_mvm_mac_ctxt_set_ht_flags(struct iwl_mvm *mvm,
610					 struct ieee80211_vif *vif,
611					 struct iwl_mac_ctx_cmd *cmd)
612{
613	/* for both sta and ap, ht_operation_mode hold the protection_mode */
614	u8 protection_mode = vif->bss_conf.ht_operation_mode &
615				 IEEE80211_HT_OP_MODE_PROTECTION;
616	/* The fw does not distinguish between ht and fat */
617	u32 ht_flag = MAC_PROT_FLG_HT_PROT | MAC_PROT_FLG_FAT_PROT;
618
619	IWL_DEBUG_RATE(mvm, "protection mode set to %d\n", protection_mode);
620	/*
621	 * See section 9.23.3.1 of IEEE 80211-2012.
622	 * Nongreenfield HT STAs Present is not supported.
623	 */
624	switch (protection_mode) {
625	case IEEE80211_HT_OP_MODE_PROTECTION_NONE:
626		break;
627	case IEEE80211_HT_OP_MODE_PROTECTION_NONMEMBER:
628	case IEEE80211_HT_OP_MODE_PROTECTION_NONHT_MIXED:
629		cmd->protection_flags |= cpu_to_le32(ht_flag);
630		break;
631	case IEEE80211_HT_OP_MODE_PROTECTION_20MHZ:
632		/* Protect when channel wider than 20MHz */
633		if (vif->bss_conf.chandef.width > NL80211_CHAN_WIDTH_20)
634			cmd->protection_flags |= cpu_to_le32(ht_flag);
635		break;
636	default:
637		IWL_ERR(mvm, "Illegal protection mode %d\n",
638			protection_mode);
639		break;
640	}
641}
642
643static void iwl_mvm_mac_ctxt_cmd_common(struct iwl_mvm *mvm,
644					struct ieee80211_vif *vif,
645					struct iwl_mac_ctx_cmd *cmd,
646					const u8 *bssid_override,
647					u32 action)
648{
649	struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
650	struct ieee80211_chanctx_conf *chanctx;
651	bool ht_enabled = !!(vif->bss_conf.ht_operation_mode &
652			     IEEE80211_HT_OP_MODE_PROTECTION);
653	u8 cck_ack_rates, ofdm_ack_rates;
654	const u8 *bssid = bssid_override ?: vif->bss_conf.bssid;
655	int i;
656
657	cmd->id_and_color = cpu_to_le32(FW_CMD_ID_AND_COLOR(mvmvif->id,
658							    mvmvif->color));
659	cmd->action = cpu_to_le32(action);
660
661	switch (vif->type) {
662	case NL80211_IFTYPE_STATION:
663		if (vif->p2p)
664			cmd->mac_type = cpu_to_le32(FW_MAC_TYPE_P2P_STA);
665		else
666			cmd->mac_type = cpu_to_le32(FW_MAC_TYPE_BSS_STA);
667		break;
668	case NL80211_IFTYPE_AP:
669		cmd->mac_type = cpu_to_le32(FW_MAC_TYPE_GO);
670		break;
671	case NL80211_IFTYPE_MONITOR:
672		cmd->mac_type = cpu_to_le32(FW_MAC_TYPE_LISTENER);
673		break;
674	case NL80211_IFTYPE_P2P_DEVICE:
675		cmd->mac_type = cpu_to_le32(FW_MAC_TYPE_P2P_DEVICE);
676		break;
677	case NL80211_IFTYPE_ADHOC:
678		cmd->mac_type = cpu_to_le32(FW_MAC_TYPE_IBSS);
679		break;
680	default:
681		WARN_ON_ONCE(1);
682	}
683
684	cmd->tsf_id = cpu_to_le32(mvmvif->tsf_id);
685
686	memcpy(cmd->node_addr, vif->addr, ETH_ALEN);
687
688	if (bssid)
689		memcpy(cmd->bssid_addr, bssid, ETH_ALEN);
690	else
691		eth_broadcast_addr(cmd->bssid_addr);
692
693	rcu_read_lock();
694	chanctx = rcu_dereference(vif->chanctx_conf);
695	iwl_mvm_ack_rates(mvm, vif, chanctx ? chanctx->def.chan->band
696					    : IEEE80211_BAND_2GHZ,
697			  &cck_ack_rates, &ofdm_ack_rates);
698	rcu_read_unlock();
699
700	cmd->cck_rates = cpu_to_le32((u32)cck_ack_rates);
701	cmd->ofdm_rates = cpu_to_le32((u32)ofdm_ack_rates);
702
703	cmd->cck_short_preamble =
704		cpu_to_le32(vif->bss_conf.use_short_preamble ?
705			    MAC_FLG_SHORT_PREAMBLE : 0);
706	cmd->short_slot =
707		cpu_to_le32(vif->bss_conf.use_short_slot ?
708			    MAC_FLG_SHORT_SLOT : 0);
709
710	for (i = 0; i < IEEE80211_NUM_ACS; i++) {
711		u8 txf = iwl_mvm_ac_to_tx_fifo[i];
712
713		cmd->ac[txf].cw_min =
714			cpu_to_le16(mvmvif->queue_params[i].cw_min);
715		cmd->ac[txf].cw_max =
716			cpu_to_le16(mvmvif->queue_params[i].cw_max);
717		cmd->ac[txf].edca_txop =
718			cpu_to_le16(mvmvif->queue_params[i].txop * 32);
719		cmd->ac[txf].aifsn = mvmvif->queue_params[i].aifs;
720		cmd->ac[txf].fifos_mask = BIT(txf);
721	}
722
723	/* in AP mode, the MCAST FIFO takes the EDCA params from VO */
724	if (vif->type == NL80211_IFTYPE_AP)
725		cmd->ac[IWL_MVM_TX_FIFO_VO].fifos_mask |=
726			BIT(IWL_MVM_TX_FIFO_MCAST);
727
728	if (vif->bss_conf.qos)
729		cmd->qos_flags |= cpu_to_le32(MAC_QOS_FLG_UPDATE_EDCA);
730
731	if (vif->bss_conf.use_cts_prot)
732		cmd->protection_flags |= cpu_to_le32(MAC_PROT_FLG_TGG_PROTECT);
733
734	IWL_DEBUG_RATE(mvm, "use_cts_prot %d, ht_operation_mode %d\n",
735		       vif->bss_conf.use_cts_prot,
736		       vif->bss_conf.ht_operation_mode);
737	if (vif->bss_conf.chandef.width != NL80211_CHAN_WIDTH_20_NOHT)
738		cmd->qos_flags |= cpu_to_le32(MAC_QOS_FLG_TGN);
739	if (ht_enabled)
740		iwl_mvm_mac_ctxt_set_ht_flags(mvm, vif, cmd);
741
742	cmd->filter_flags = cpu_to_le32(MAC_FILTER_ACCEPT_GRP);
743}
744
745static int iwl_mvm_mac_ctxt_send_cmd(struct iwl_mvm *mvm,
746				     struct iwl_mac_ctx_cmd *cmd)
747{
748	int ret = iwl_mvm_send_cmd_pdu(mvm, MAC_CONTEXT_CMD, 0,
749				       sizeof(*cmd), cmd);
750	if (ret)
751		IWL_ERR(mvm, "Failed to send MAC context (action:%d): %d\n",
752			le32_to_cpu(cmd->action), ret);
753	return ret;
754}
755
756static int iwl_mvm_mac_ctxt_cmd_sta(struct iwl_mvm *mvm,
757				    struct ieee80211_vif *vif,
758				    u32 action, bool force_assoc_off,
759				    const u8 *bssid_override)
760{
761	struct iwl_mac_ctx_cmd cmd = {};
762	struct iwl_mac_data_sta *ctxt_sta;
763
764	WARN_ON(vif->type != NL80211_IFTYPE_STATION);
765
766	/* Fill the common data for all mac context types */
767	iwl_mvm_mac_ctxt_cmd_common(mvm, vif, &cmd, bssid_override, action);
768
769	if (vif->p2p) {
770		struct ieee80211_p2p_noa_attr *noa =
771			&vif->bss_conf.p2p_noa_attr;
772
773		cmd.p2p_sta.ctwin = cpu_to_le32(noa->oppps_ctwindow &
774					IEEE80211_P2P_OPPPS_CTWINDOW_MASK);
775		ctxt_sta = &cmd.p2p_sta.sta;
776	} else {
777		ctxt_sta = &cmd.sta;
778	}
779
780	/* We need the dtim_period to set the MAC as associated */
781	if (vif->bss_conf.assoc && vif->bss_conf.dtim_period &&
782	    !force_assoc_off) {
783		u32 dtim_offs;
784
785		/*
786		 * The DTIM count counts down, so when it is N that means N
787		 * more beacon intervals happen until the DTIM TBTT. Therefore
788		 * add this to the current time. If that ends up being in the
789		 * future, the firmware will handle it.
790		 *
791		 * Also note that the system_timestamp (which we get here as
792		 * "sync_device_ts") and TSF timestamp aren't at exactly the
793		 * same offset in the frame -- the TSF is at the first symbol
794		 * of the TSF, the system timestamp is at signal acquisition
795		 * time. This means there's an offset between them of at most
796		 * a few hundred microseconds (24 * 8 bits + PLCP time gives
797		 * 384us in the longest case), this is currently not relevant
798		 * as the firmware wakes up around 2ms before the TBTT.
799		 */
800		dtim_offs = vif->bss_conf.sync_dtim_count *
801				vif->bss_conf.beacon_int;
802		/* convert TU to usecs */
803		dtim_offs *= 1024;
804
805		ctxt_sta->dtim_tsf =
806			cpu_to_le64(vif->bss_conf.sync_tsf + dtim_offs);
807		ctxt_sta->dtim_time =
808			cpu_to_le32(vif->bss_conf.sync_device_ts + dtim_offs);
809
810		IWL_DEBUG_INFO(mvm, "DTIM TBTT is 0x%llx/0x%x, offset %d\n",
811			       le64_to_cpu(ctxt_sta->dtim_tsf),
812			       le32_to_cpu(ctxt_sta->dtim_time),
813			       dtim_offs);
814
815		ctxt_sta->is_assoc = cpu_to_le32(1);
816	} else {
817		ctxt_sta->is_assoc = cpu_to_le32(0);
818
819		/* Allow beacons to pass through as long as we are not
820		 * associated, or we do not have dtim period information.
821		 */
822		cmd.filter_flags |= cpu_to_le32(MAC_FILTER_IN_BEACON);
823	}
824
825	ctxt_sta->bi = cpu_to_le32(vif->bss_conf.beacon_int);
826	ctxt_sta->bi_reciprocal =
827		cpu_to_le32(iwl_mvm_reciprocal(vif->bss_conf.beacon_int));
828	ctxt_sta->dtim_interval = cpu_to_le32(vif->bss_conf.beacon_int *
829					      vif->bss_conf.dtim_period);
830	ctxt_sta->dtim_reciprocal =
831		cpu_to_le32(iwl_mvm_reciprocal(vif->bss_conf.beacon_int *
832					       vif->bss_conf.dtim_period));
833
834	ctxt_sta->listen_interval = cpu_to_le32(mvm->hw->conf.listen_interval);
835	ctxt_sta->assoc_id = cpu_to_le32(vif->bss_conf.aid);
836
837	return iwl_mvm_mac_ctxt_send_cmd(mvm, &cmd);
838}
839
840static int iwl_mvm_mac_ctxt_cmd_listener(struct iwl_mvm *mvm,
841					 struct ieee80211_vif *vif,
842					 u32 action)
843{
844	struct iwl_mac_ctx_cmd cmd = {};
845
846	WARN_ON(vif->type != NL80211_IFTYPE_MONITOR);
847
848	iwl_mvm_mac_ctxt_cmd_common(mvm, vif, &cmd, NULL, action);
849
850	cmd.filter_flags = cpu_to_le32(MAC_FILTER_IN_PROMISC |
851				       MAC_FILTER_IN_CONTROL_AND_MGMT |
852				       MAC_FILTER_IN_BEACON |
853				       MAC_FILTER_IN_PROBE_REQUEST |
854				       MAC_FILTER_IN_CRC32);
855	mvm->hw->flags |= IEEE80211_HW_RX_INCLUDES_FCS;
856
857	return iwl_mvm_mac_ctxt_send_cmd(mvm, &cmd);
858}
859
860static int iwl_mvm_mac_ctxt_cmd_ibss(struct iwl_mvm *mvm,
861				     struct ieee80211_vif *vif,
862				     u32 action)
863{
864	struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
865	struct iwl_mac_ctx_cmd cmd = {};
866
867	WARN_ON(vif->type != NL80211_IFTYPE_ADHOC);
868
869	iwl_mvm_mac_ctxt_cmd_common(mvm, vif, &cmd, NULL, action);
870
871	cmd.filter_flags = cpu_to_le32(MAC_FILTER_IN_BEACON |
872				       MAC_FILTER_IN_PROBE_REQUEST);
873
874	/* cmd.ibss.beacon_time/cmd.ibss.beacon_tsf are curently ignored */
875	cmd.ibss.bi = cpu_to_le32(vif->bss_conf.beacon_int);
876	cmd.ibss.bi_reciprocal =
877		cpu_to_le32(iwl_mvm_reciprocal(vif->bss_conf.beacon_int));
878
879	/* TODO: Assumes that the beacon id == mac context id */
880	cmd.ibss.beacon_template = cpu_to_le32(mvmvif->id);
881
882	return iwl_mvm_mac_ctxt_send_cmd(mvm, &cmd);
883}
884
885struct iwl_mvm_go_iterator_data {
886	bool go_active;
887};
888
889static void iwl_mvm_go_iterator(void *_data, u8 *mac, struct ieee80211_vif *vif)
890{
891	struct iwl_mvm_go_iterator_data *data = _data;
892	struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
893
894	if (vif->type == NL80211_IFTYPE_AP && vif->p2p &&
895	    mvmvif->ap_ibss_active)
896		data->go_active = true;
897}
898
899static int iwl_mvm_mac_ctxt_cmd_p2p_device(struct iwl_mvm *mvm,
900					   struct ieee80211_vif *vif,
901					   u32 action)
902{
903	struct iwl_mac_ctx_cmd cmd = {};
904	struct iwl_mvm_go_iterator_data data = {};
905
906	WARN_ON(vif->type != NL80211_IFTYPE_P2P_DEVICE);
907
908	iwl_mvm_mac_ctxt_cmd_common(mvm, vif, &cmd, NULL, action);
909
910	cmd.protection_flags |= cpu_to_le32(MAC_PROT_FLG_TGG_PROTECT);
911
912	/* Override the filter flags to accept only probe requests */
913	cmd.filter_flags = cpu_to_le32(MAC_FILTER_IN_PROBE_REQUEST);
914
915	/*
916	 * This flag should be set to true when the P2P Device is
917	 * discoverable and there is at least another active P2P GO. Settings
918	 * this flag will allow the P2P Device to be discoverable on other
919	 * channels in addition to its listen channel.
920	 * Note that this flag should not be set in other cases as it opens the
921	 * Rx filters on all MAC and increases the number of interrupts.
922	 */
923	ieee80211_iterate_active_interfaces_atomic(
924		mvm->hw, IEEE80211_IFACE_ITER_RESUME_ALL,
925		iwl_mvm_go_iterator, &data);
926
927	cmd.p2p_dev.is_disc_extended = cpu_to_le32(data.go_active ? 1 : 0);
928	return iwl_mvm_mac_ctxt_send_cmd(mvm, &cmd);
929}
930
931static void iwl_mvm_mac_ctxt_set_tim(struct iwl_mvm *mvm,
932				     struct iwl_mac_beacon_cmd *beacon_cmd,
933				     u8 *beacon, u32 frame_size)
934{
935	u32 tim_idx;
936	struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *)beacon;
937
938	/* The index is relative to frame start but we start looking at the
939	 * variable-length part of the beacon. */
940	tim_idx = mgmt->u.beacon.variable - beacon;
941
942	/* Parse variable-length elements of beacon to find WLAN_EID_TIM */
943	while ((tim_idx < (frame_size - 2)) &&
944			(beacon[tim_idx] != WLAN_EID_TIM))
945		tim_idx += beacon[tim_idx+1] + 2;
946
947	/* If TIM field was found, set variables */
948	if ((tim_idx < (frame_size - 1)) && (beacon[tim_idx] == WLAN_EID_TIM)) {
949		beacon_cmd->tim_idx = cpu_to_le32(tim_idx);
950		beacon_cmd->tim_size = cpu_to_le32((u32)beacon[tim_idx+1]);
951	} else {
952		IWL_WARN(mvm, "Unable to find TIM Element in beacon\n");
953	}
954}
955
956static int iwl_mvm_mac_ctxt_send_beacon(struct iwl_mvm *mvm,
957					struct ieee80211_vif *vif,
958					struct sk_buff *beacon)
959{
960	struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
961	struct iwl_host_cmd cmd = {
962		.id = BEACON_TEMPLATE_CMD,
963		.flags = CMD_ASYNC,
964	};
965	struct iwl_mac_beacon_cmd beacon_cmd = {};
966	struct ieee80211_tx_info *info;
967	u32 beacon_skb_len;
968	u32 rate, tx_flags;
969
970	if (WARN_ON(!beacon))
971		return -EINVAL;
972
973	beacon_skb_len = beacon->len;
974
975	/* TODO: for now the beacon template id is set to be the mac context id.
976	 * Might be better to handle it as another resource ... */
977	beacon_cmd.template_id = cpu_to_le32((u32)mvmvif->id);
978	info = IEEE80211_SKB_CB(beacon);
979
980	/* Set up TX command fields */
981	beacon_cmd.tx.len = cpu_to_le16((u16)beacon_skb_len);
982	beacon_cmd.tx.sta_id = mvmvif->bcast_sta.sta_id;
983	beacon_cmd.tx.life_time = cpu_to_le32(TX_CMD_LIFE_TIME_INFINITE);
984	tx_flags = TX_CMD_FLG_SEQ_CTL | TX_CMD_FLG_TSF;
985	tx_flags |=
986		iwl_mvm_bt_coex_tx_prio(mvm, (void *)beacon->data, info, 0) <<
987						TX_CMD_FLG_BT_PRIO_POS;
988	beacon_cmd.tx.tx_flags = cpu_to_le32(tx_flags);
989
990	mvm->mgmt_last_antenna_idx =
991		iwl_mvm_next_antenna(mvm, iwl_mvm_get_valid_tx_ant(mvm),
992				     mvm->mgmt_last_antenna_idx);
993
994	beacon_cmd.tx.rate_n_flags =
995		cpu_to_le32(BIT(mvm->mgmt_last_antenna_idx) <<
996			    RATE_MCS_ANT_POS);
997
998	if (info->band == IEEE80211_BAND_5GHZ || vif->p2p) {
999		rate = IWL_FIRST_OFDM_RATE;
1000	} else {
1001		rate = IWL_FIRST_CCK_RATE;
1002		beacon_cmd.tx.rate_n_flags |= cpu_to_le32(RATE_MCS_CCK_MSK);
1003	}
1004	beacon_cmd.tx.rate_n_flags |=
1005		cpu_to_le32(iwl_mvm_mac80211_idx_to_hwrate(rate));
1006
1007	/* Set up TX beacon command fields */
1008	if (vif->type == NL80211_IFTYPE_AP)
1009		iwl_mvm_mac_ctxt_set_tim(mvm, &beacon_cmd,
1010					 beacon->data,
1011					 beacon_skb_len);
1012
1013	/* Submit command */
1014	cmd.len[0] = sizeof(beacon_cmd);
1015	cmd.data[0] = &beacon_cmd;
1016	cmd.dataflags[0] = 0;
1017	cmd.len[1] = beacon_skb_len;
1018	cmd.data[1] = beacon->data;
1019	cmd.dataflags[1] = IWL_HCMD_DFL_DUP;
1020
1021	return iwl_mvm_send_cmd(mvm, &cmd);
1022}
1023
1024/* The beacon template for the AP/GO/IBSS has changed and needs update */
1025int iwl_mvm_mac_ctxt_beacon_changed(struct iwl_mvm *mvm,
1026				    struct ieee80211_vif *vif)
1027{
1028	struct sk_buff *beacon;
1029	int ret;
1030
1031	WARN_ON(vif->type != NL80211_IFTYPE_AP &&
1032		vif->type != NL80211_IFTYPE_ADHOC);
1033
1034	beacon = ieee80211_beacon_get_template(mvm->hw, vif, NULL);
1035	if (!beacon)
1036		return -ENOMEM;
1037
1038	ret = iwl_mvm_mac_ctxt_send_beacon(mvm, vif, beacon);
1039	dev_kfree_skb(beacon);
1040	return ret;
1041}
1042
1043struct iwl_mvm_mac_ap_iterator_data {
1044	struct iwl_mvm *mvm;
1045	struct ieee80211_vif *vif;
1046	u32 beacon_device_ts;
1047	u16 beacon_int;
1048};
1049
1050/* Find the beacon_device_ts and beacon_int for a managed interface */
1051static void iwl_mvm_mac_ap_iterator(void *_data, u8 *mac,
1052				    struct ieee80211_vif *vif)
1053{
1054	struct iwl_mvm_mac_ap_iterator_data *data = _data;
1055
1056	if (vif->type != NL80211_IFTYPE_STATION || !vif->bss_conf.assoc)
1057		return;
1058
1059	/* Station client has higher priority over P2P client*/
1060	if (vif->p2p && data->beacon_device_ts)
1061		return;
1062
1063	data->beacon_device_ts = vif->bss_conf.sync_device_ts;
1064	data->beacon_int = vif->bss_conf.beacon_int;
1065}
1066
1067/*
1068 * Fill the specific data for mac context of type AP of P2P GO
1069 */
1070static void iwl_mvm_mac_ctxt_cmd_fill_ap(struct iwl_mvm *mvm,
1071					 struct ieee80211_vif *vif,
1072					 struct iwl_mac_data_ap *ctxt_ap,
1073					 bool add)
1074{
1075	struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
1076	struct iwl_mvm_mac_ap_iterator_data data = {
1077		.mvm = mvm,
1078		.vif = vif,
1079		.beacon_device_ts = 0
1080	};
1081
1082	ctxt_ap->bi = cpu_to_le32(vif->bss_conf.beacon_int);
1083	ctxt_ap->bi_reciprocal =
1084		cpu_to_le32(iwl_mvm_reciprocal(vif->bss_conf.beacon_int));
1085	ctxt_ap->dtim_interval = cpu_to_le32(vif->bss_conf.beacon_int *
1086					     vif->bss_conf.dtim_period);
1087	ctxt_ap->dtim_reciprocal =
1088		cpu_to_le32(iwl_mvm_reciprocal(vif->bss_conf.beacon_int *
1089					       vif->bss_conf.dtim_period));
1090
1091	ctxt_ap->mcast_qid = cpu_to_le32(vif->cab_queue);
1092
1093	/*
1094	 * Only set the beacon time when the MAC is being added, when we
1095	 * just modify the MAC then we should keep the time -- the firmware
1096	 * can otherwise have a "jumping" TBTT.
1097	 */
1098	if (add) {
1099		/*
1100		 * If there is a station/P2P client interface which is
1101		 * associated, set the AP's TBTT far enough from the station's
1102		 * TBTT. Otherwise, set it to the current system time
1103		 */
1104		ieee80211_iterate_active_interfaces_atomic(
1105			mvm->hw, IEEE80211_IFACE_ITER_RESUME_ALL,
1106			iwl_mvm_mac_ap_iterator, &data);
1107
1108		if (data.beacon_device_ts) {
1109			u32 rand = (prandom_u32() % (64 - 36)) + 36;
1110			mvmvif->ap_beacon_time = data.beacon_device_ts +
1111				ieee80211_tu_to_usec(data.beacon_int * rand /
1112						     100);
1113		} else {
1114			mvmvif->ap_beacon_time =
1115				iwl_read_prph(mvm->trans,
1116					      DEVICE_SYSTEM_TIME_REG);
1117		}
1118	}
1119
1120	ctxt_ap->beacon_time = cpu_to_le32(mvmvif->ap_beacon_time);
1121	ctxt_ap->beacon_tsf = 0; /* unused */
1122
1123	/* TODO: Assume that the beacon id == mac context id */
1124	ctxt_ap->beacon_template = cpu_to_le32(mvmvif->id);
1125}
1126
1127static int iwl_mvm_mac_ctxt_cmd_ap(struct iwl_mvm *mvm,
1128				   struct ieee80211_vif *vif,
1129				   u32 action)
1130{
1131	struct iwl_mac_ctx_cmd cmd = {};
1132
1133	WARN_ON(vif->type != NL80211_IFTYPE_AP || vif->p2p);
1134
1135	/* Fill the common data for all mac context types */
1136	iwl_mvm_mac_ctxt_cmd_common(mvm, vif, &cmd, NULL, action);
1137
1138	/*
1139	 * pass probe requests and beacons from other APs (needed
1140	 * for ht protection)
1141	 */
1142	cmd.filter_flags |= cpu_to_le32(MAC_FILTER_IN_PROBE_REQUEST |
1143					MAC_FILTER_IN_BEACON);
1144
1145	/* Fill the data specific for ap mode */
1146	iwl_mvm_mac_ctxt_cmd_fill_ap(mvm, vif, &cmd.ap,
1147				     action == FW_CTXT_ACTION_ADD);
1148
1149	return iwl_mvm_mac_ctxt_send_cmd(mvm, &cmd);
1150}
1151
1152static int iwl_mvm_mac_ctxt_cmd_go(struct iwl_mvm *mvm,
1153				   struct ieee80211_vif *vif,
1154				   u32 action)
1155{
1156	struct iwl_mac_ctx_cmd cmd = {};
1157	struct ieee80211_p2p_noa_attr *noa = &vif->bss_conf.p2p_noa_attr;
1158
1159	WARN_ON(vif->type != NL80211_IFTYPE_AP || !vif->p2p);
1160
1161	/* Fill the common data for all mac context types */
1162	iwl_mvm_mac_ctxt_cmd_common(mvm, vif, &cmd, NULL, action);
1163
1164	/*
1165	 * pass probe requests and beacons from other APs (needed
1166	 * for ht protection)
1167	 */
1168	cmd.filter_flags |= cpu_to_le32(MAC_FILTER_IN_PROBE_REQUEST |
1169					MAC_FILTER_IN_BEACON);
1170
1171	/* Fill the data specific for GO mode */
1172	iwl_mvm_mac_ctxt_cmd_fill_ap(mvm, vif, &cmd.go.ap,
1173				     action == FW_CTXT_ACTION_ADD);
1174
1175	cmd.go.ctwin = cpu_to_le32(noa->oppps_ctwindow &
1176					IEEE80211_P2P_OPPPS_CTWINDOW_MASK);
1177	cmd.go.opp_ps_enabled =
1178			cpu_to_le32(!!(noa->oppps_ctwindow &
1179					IEEE80211_P2P_OPPPS_ENABLE_BIT));
1180
1181	return iwl_mvm_mac_ctxt_send_cmd(mvm, &cmd);
1182}
1183
1184static int iwl_mvm_mac_ctx_send(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
1185				u32 action, bool force_assoc_off,
1186				const u8 *bssid_override)
1187{
1188	switch (vif->type) {
1189	case NL80211_IFTYPE_STATION:
1190		return iwl_mvm_mac_ctxt_cmd_sta(mvm, vif, action,
1191						force_assoc_off,
1192						bssid_override);
1193		break;
1194	case NL80211_IFTYPE_AP:
1195		if (!vif->p2p)
1196			return iwl_mvm_mac_ctxt_cmd_ap(mvm, vif, action);
1197		else
1198			return iwl_mvm_mac_ctxt_cmd_go(mvm, vif, action);
1199		break;
1200	case NL80211_IFTYPE_MONITOR:
1201		return iwl_mvm_mac_ctxt_cmd_listener(mvm, vif, action);
1202	case NL80211_IFTYPE_P2P_DEVICE:
1203		return iwl_mvm_mac_ctxt_cmd_p2p_device(mvm, vif, action);
1204	case NL80211_IFTYPE_ADHOC:
1205		return iwl_mvm_mac_ctxt_cmd_ibss(mvm, vif, action);
1206	default:
1207		break;
1208	}
1209
1210	return -EOPNOTSUPP;
1211}
1212
1213int iwl_mvm_mac_ctxt_add(struct iwl_mvm *mvm, struct ieee80211_vif *vif)
1214{
1215	struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
1216	int ret;
1217
1218	if (WARN_ONCE(mvmvif->uploaded, "Adding active MAC %pM/%d\n",
1219		      vif->addr, ieee80211_vif_type_p2p(vif)))
1220		return -EIO;
1221
1222	ret = iwl_mvm_mac_ctx_send(mvm, vif, FW_CTXT_ACTION_ADD,
1223				   true, NULL);
1224	if (ret)
1225		return ret;
1226
1227	/* will only do anything at resume from D3 time */
1228	iwl_mvm_set_last_nonqos_seq(mvm, vif);
1229
1230	mvmvif->uploaded = true;
1231	return 0;
1232}
1233
1234int iwl_mvm_mac_ctxt_changed(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
1235			     bool force_assoc_off, const u8 *bssid_override)
1236{
1237	struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
1238
1239	if (WARN_ONCE(!mvmvif->uploaded, "Changing inactive MAC %pM/%d\n",
1240		      vif->addr, ieee80211_vif_type_p2p(vif)))
1241		return -EIO;
1242
1243	return iwl_mvm_mac_ctx_send(mvm, vif, FW_CTXT_ACTION_MODIFY,
1244				    force_assoc_off, bssid_override);
1245}
1246
1247int iwl_mvm_mac_ctxt_remove(struct iwl_mvm *mvm, struct ieee80211_vif *vif)
1248{
1249	struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
1250	struct iwl_mac_ctx_cmd cmd;
1251	int ret;
1252
1253	if (WARN_ONCE(!mvmvif->uploaded, "Removing inactive MAC %pM/%d\n",
1254		      vif->addr, ieee80211_vif_type_p2p(vif)))
1255		return -EIO;
1256
1257	memset(&cmd, 0, sizeof(cmd));
1258
1259	cmd.id_and_color = cpu_to_le32(FW_CMD_ID_AND_COLOR(mvmvif->id,
1260							   mvmvif->color));
1261	cmd.action = cpu_to_le32(FW_CTXT_ACTION_REMOVE);
1262
1263	ret = iwl_mvm_send_cmd_pdu(mvm, MAC_CONTEXT_CMD, 0,
1264				   sizeof(cmd), &cmd);
1265	if (ret) {
1266		IWL_ERR(mvm, "Failed to remove MAC context: %d\n", ret);
1267		return ret;
1268	}
1269
1270	mvmvif->uploaded = false;
1271
1272	if (vif->type == NL80211_IFTYPE_MONITOR)
1273		mvm->hw->flags &= ~IEEE80211_HW_RX_INCLUDES_FCS;
1274
1275	return 0;
1276}
1277
1278static void iwl_mvm_csa_count_down(struct iwl_mvm *mvm,
1279				   struct ieee80211_vif *csa_vif, u32 gp2,
1280				   bool tx_success)
1281{
1282	struct iwl_mvm_vif *mvmvif =
1283			iwl_mvm_vif_from_mac80211(csa_vif);
1284
1285	/* Don't start to countdown from a failed beacon */
1286	if (!tx_success && !mvmvif->csa_countdown)
1287		return;
1288
1289	mvmvif->csa_countdown = true;
1290
1291	if (!ieee80211_csa_is_complete(csa_vif)) {
1292		int c = ieee80211_csa_update_counter(csa_vif);
1293
1294		iwl_mvm_mac_ctxt_beacon_changed(mvm, csa_vif);
1295		if (csa_vif->p2p &&
1296		    !iwl_mvm_te_scheduled(&mvmvif->time_event_data) && gp2 &&
1297		    tx_success) {
1298			u32 rel_time = (c + 1) *
1299				       csa_vif->bss_conf.beacon_int -
1300				       IWL_MVM_CHANNEL_SWITCH_TIME_GO;
1301			u32 apply_time = gp2 + rel_time * 1024;
1302
1303			iwl_mvm_schedule_csa_period(mvm, csa_vif,
1304					 IWL_MVM_CHANNEL_SWITCH_TIME_GO -
1305					 IWL_MVM_CHANNEL_SWITCH_MARGIN,
1306					 apply_time);
1307		}
1308	} else if (!iwl_mvm_te_scheduled(&mvmvif->time_event_data)) {
1309		/* we don't have CSA NoA scheduled yet, switch now */
1310		ieee80211_csa_finish(csa_vif);
1311		RCU_INIT_POINTER(mvm->csa_vif, NULL);
1312	}
1313}
1314
1315int iwl_mvm_rx_beacon_notif(struct iwl_mvm *mvm,
1316			    struct iwl_rx_cmd_buffer *rxb,
1317			    struct iwl_device_cmd *cmd)
1318{
1319	struct iwl_rx_packet *pkt = rxb_addr(rxb);
1320	struct iwl_extended_beacon_notif *beacon = (void *)pkt->data;
1321	struct iwl_mvm_tx_resp *beacon_notify_hdr;
1322	struct ieee80211_vif *csa_vif;
1323	struct ieee80211_vif *tx_blocked_vif;
1324	u16 status;
1325
1326	lockdep_assert_held(&mvm->mutex);
1327
1328	beacon_notify_hdr = &beacon->beacon_notify_hdr;
1329	mvm->ap_last_beacon_gp2 = le32_to_cpu(beacon->gp2);
1330
1331	status = le16_to_cpu(beacon_notify_hdr->status.status) & TX_STATUS_MSK;
1332	IWL_DEBUG_RX(mvm,
1333		     "beacon status %#x retries:%d tsf:0x%16llX gp2:0x%X rate:%d\n",
1334		     status, beacon_notify_hdr->failure_frame,
1335		     le64_to_cpu(beacon->tsf),
1336		     mvm->ap_last_beacon_gp2,
1337		     le32_to_cpu(beacon_notify_hdr->initial_rate));
1338
1339	csa_vif = rcu_dereference_protected(mvm->csa_vif,
1340					    lockdep_is_held(&mvm->mutex));
1341	if (unlikely(csa_vif && csa_vif->csa_active))
1342		iwl_mvm_csa_count_down(mvm, csa_vif, mvm->ap_last_beacon_gp2,
1343				       (status == TX_STATUS_SUCCESS));
1344
1345	tx_blocked_vif = rcu_dereference_protected(mvm->csa_tx_blocked_vif,
1346						lockdep_is_held(&mvm->mutex));
1347	if (unlikely(tx_blocked_vif)) {
1348		struct iwl_mvm_vif *mvmvif =
1349			iwl_mvm_vif_from_mac80211(tx_blocked_vif);
1350
1351		/*
1352		 * The channel switch is started and we have blocked the
1353		 * stations. If this is the first beacon (the timeout wasn't
1354		 * set), set the unblock timeout, otherwise countdown
1355		 */
1356		if (!mvm->csa_tx_block_bcn_timeout)
1357			mvm->csa_tx_block_bcn_timeout =
1358				IWL_MVM_CS_UNBLOCK_TX_TIMEOUT;
1359		else
1360			mvm->csa_tx_block_bcn_timeout--;
1361
1362		/* Check if the timeout is expired, and unblock tx */
1363		if (mvm->csa_tx_block_bcn_timeout == 0) {
1364			iwl_mvm_modify_all_sta_disable_tx(mvm, mvmvif, false);
1365			RCU_INIT_POINTER(mvm->csa_tx_blocked_vif, NULL);
1366		}
1367	}
1368
1369	return 0;
1370}
1371
1372static void iwl_mvm_beacon_loss_iterator(void *_data, u8 *mac,
1373					 struct ieee80211_vif *vif)
1374{
1375	struct iwl_missed_beacons_notif *missed_beacons = _data;
1376	struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
1377	struct iwl_mvm *mvm = mvmvif->mvm;
1378	struct iwl_fw_dbg_trigger_missed_bcon *bcon_trig;
1379	struct iwl_fw_dbg_trigger_tlv *trigger;
1380	u32 stop_trig_missed_bcon, stop_trig_missed_bcon_since_rx;
1381	u32 rx_missed_bcon, rx_missed_bcon_since_rx;
1382
1383	if (mvmvif->id != (u16)le32_to_cpu(missed_beacons->mac_id))
1384		return;
1385
1386	rx_missed_bcon = le32_to_cpu(missed_beacons->consec_missed_beacons);
1387	rx_missed_bcon_since_rx =
1388		le32_to_cpu(missed_beacons->consec_missed_beacons_since_last_rx);
1389	/*
1390	 * TODO: the threshold should be adjusted based on latency conditions,
1391	 * and/or in case of a CS flow on one of the other AP vifs.
1392	 */
1393	if (le32_to_cpu(missed_beacons->consec_missed_beacons_since_last_rx) >
1394	     IWL_MVM_MISSED_BEACONS_THRESHOLD)
1395		ieee80211_beacon_loss(vif);
1396
1397	if (!iwl_fw_dbg_trigger_enabled(mvm->fw,
1398					FW_DBG_TRIGGER_MISSED_BEACONS))
1399		return;
1400
1401	trigger = iwl_fw_dbg_get_trigger(mvm->fw,
1402					 FW_DBG_TRIGGER_MISSED_BEACONS);
1403	bcon_trig = (void *)trigger->data;
1404	stop_trig_missed_bcon = le32_to_cpu(bcon_trig->stop_consec_missed_bcon);
1405	stop_trig_missed_bcon_since_rx =
1406		le32_to_cpu(bcon_trig->stop_consec_missed_bcon_since_rx);
1407
1408	/* TODO: implement start trigger */
1409
1410	if (!iwl_fw_dbg_trigger_check_stop(mvm, vif, trigger))
1411		return;
1412
1413	if (rx_missed_bcon_since_rx >= stop_trig_missed_bcon_since_rx ||
1414	    rx_missed_bcon >= stop_trig_missed_bcon)
1415		iwl_mvm_fw_dbg_collect_trig(mvm, trigger, NULL);
1416}
1417
1418int iwl_mvm_rx_missed_beacons_notif(struct iwl_mvm *mvm,
1419				    struct iwl_rx_cmd_buffer *rxb,
1420				    struct iwl_device_cmd *cmd)
1421{
1422	struct iwl_rx_packet *pkt = rxb_addr(rxb);
1423	struct iwl_missed_beacons_notif *mb = (void *)pkt->data;
1424
1425	IWL_DEBUG_INFO(mvm,
1426		       "missed bcn mac_id=%u, consecutive=%u (%u, %u, %u)\n",
1427		       le32_to_cpu(mb->mac_id),
1428		       le32_to_cpu(mb->consec_missed_beacons),
1429		       le32_to_cpu(mb->consec_missed_beacons_since_last_rx),
1430		       le32_to_cpu(mb->num_recvd_beacons),
1431		       le32_to_cpu(mb->num_expected_beacons));
1432
1433	ieee80211_iterate_active_interfaces_atomic(mvm->hw,
1434						   IEEE80211_IFACE_ITER_NORMAL,
1435						   iwl_mvm_beacon_loss_iterator,
1436						   mb);
1437	return 0;
1438}
1439