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/ieee80211.h>
66#include <linux/etherdevice.h>
67
68#include "iwl-trans.h"
69#include "iwl-eeprom-parse.h"
70#include "mvm.h"
71#include "sta.h"
72
73/*
74 * Sets most of the Tx cmd's fields
75 */
76void iwl_mvm_set_tx_cmd(struct iwl_mvm *mvm, struct sk_buff *skb,
77			struct iwl_tx_cmd *tx_cmd,
78			struct ieee80211_tx_info *info, u8 sta_id)
79{
80	struct ieee80211_hdr *hdr = (void *)skb->data;
81	__le16 fc = hdr->frame_control;
82	u32 tx_flags = le32_to_cpu(tx_cmd->tx_flags);
83	u32 len = skb->len + FCS_LEN;
84	u8 ac;
85
86	if (!(info->flags & IEEE80211_TX_CTL_NO_ACK))
87		tx_flags |= TX_CMD_FLG_ACK;
88	else
89		tx_flags &= ~TX_CMD_FLG_ACK;
90
91	if (ieee80211_is_probe_resp(fc))
92		tx_flags |= TX_CMD_FLG_TSF;
93
94	if (ieee80211_has_morefrags(fc))
95		tx_flags |= TX_CMD_FLG_MORE_FRAG;
96
97	if (ieee80211_is_data_qos(fc)) {
98		u8 *qc = ieee80211_get_qos_ctl(hdr);
99		tx_cmd->tid_tspec = qc[0] & 0xf;
100		tx_flags &= ~TX_CMD_FLG_SEQ_CTL;
101	} else if (ieee80211_is_back_req(fc)) {
102		struct ieee80211_bar *bar = (void *)skb->data;
103		u16 control = le16_to_cpu(bar->control);
104
105		tx_flags |= TX_CMD_FLG_ACK | TX_CMD_FLG_BAR;
106		tx_cmd->tid_tspec = (control &
107				     IEEE80211_BAR_CTRL_TID_INFO_MASK) >>
108			IEEE80211_BAR_CTRL_TID_INFO_SHIFT;
109		WARN_ON_ONCE(tx_cmd->tid_tspec >= IWL_MAX_TID_COUNT);
110	} else {
111		tx_cmd->tid_tspec = IWL_TID_NON_QOS;
112		if (info->flags & IEEE80211_TX_CTL_ASSIGN_SEQ)
113			tx_flags |= TX_CMD_FLG_SEQ_CTL;
114		else
115			tx_flags &= ~TX_CMD_FLG_SEQ_CTL;
116	}
117
118	/* Default to 0 (BE) when tid_spec is set to IWL_TID_NON_QOS */
119	if (tx_cmd->tid_tspec < IWL_MAX_TID_COUNT)
120		ac = tid_to_mac80211_ac[tx_cmd->tid_tspec];
121	else
122		ac = tid_to_mac80211_ac[0];
123
124	tx_flags |= iwl_mvm_bt_coex_tx_prio(mvm, hdr, info, ac) <<
125			TX_CMD_FLG_BT_PRIO_POS;
126
127	if (ieee80211_is_mgmt(fc)) {
128		if (ieee80211_is_assoc_req(fc) || ieee80211_is_reassoc_req(fc))
129			tx_cmd->pm_frame_timeout = cpu_to_le16(3);
130		else
131			tx_cmd->pm_frame_timeout = cpu_to_le16(2);
132
133		/* The spec allows Action frames in A-MPDU, we don't support
134		 * it
135		 */
136		WARN_ON_ONCE(info->flags & IEEE80211_TX_CTL_AMPDU);
137	} else if (info->control.flags & IEEE80211_TX_CTRL_PORT_CTRL_PROTO) {
138		tx_cmd->pm_frame_timeout = cpu_to_le16(2);
139	} else {
140		tx_cmd->pm_frame_timeout = 0;
141	}
142
143	if (ieee80211_is_data(fc) && len > mvm->rts_threshold &&
144	    !is_multicast_ether_addr(ieee80211_get_DA(hdr)))
145		tx_flags |= TX_CMD_FLG_PROT_REQUIRE;
146
147	if ((mvm->fw->ucode_capa.capa[0] &
148	     IWL_UCODE_TLV_CAPA_TXPOWER_INSERTION_SUPPORT) &&
149	    ieee80211_action_contains_tpc(skb))
150		tx_flags |= TX_CMD_FLG_WRITE_TX_POWER;
151
152	tx_cmd->tx_flags = cpu_to_le32(tx_flags);
153	/* Total # bytes to be transmitted */
154	tx_cmd->len = cpu_to_le16((u16)skb->len);
155	tx_cmd->next_frame_len = 0;
156	tx_cmd->life_time = cpu_to_le32(TX_CMD_LIFE_TIME_INFINITE);
157	tx_cmd->sta_id = sta_id;
158}
159
160/*
161 * Sets the fields in the Tx cmd that are rate related
162 */
163void iwl_mvm_set_tx_cmd_rate(struct iwl_mvm *mvm, struct iwl_tx_cmd *tx_cmd,
164			    struct ieee80211_tx_info *info,
165			    struct ieee80211_sta *sta, __le16 fc)
166{
167	u32 rate_flags;
168	int rate_idx;
169	u8 rate_plcp;
170
171	/* Set retry limit on RTS packets */
172	tx_cmd->rts_retry_limit = IWL_RTS_DFAULT_RETRY_LIMIT;
173
174	/* Set retry limit on DATA packets and Probe Responses*/
175	if (ieee80211_is_probe_resp(fc)) {
176		tx_cmd->data_retry_limit = IWL_MGMT_DFAULT_RETRY_LIMIT;
177		tx_cmd->rts_retry_limit =
178			min(tx_cmd->data_retry_limit, tx_cmd->rts_retry_limit);
179	} else if (ieee80211_is_back_req(fc)) {
180		tx_cmd->data_retry_limit = IWL_BAR_DFAULT_RETRY_LIMIT;
181	} else {
182		tx_cmd->data_retry_limit = IWL_DEFAULT_TX_RETRY;
183	}
184
185	/*
186	 * for data packets, rate info comes from the table inside the fw. This
187	 * table is controlled by LINK_QUALITY commands
188	 */
189
190	if (ieee80211_is_data(fc) && sta) {
191		tx_cmd->initial_rate_index = 0;
192		tx_cmd->tx_flags |= cpu_to_le32(TX_CMD_FLG_STA_RATE);
193		return;
194	} else if (ieee80211_is_back_req(fc)) {
195		tx_cmd->tx_flags |=
196			cpu_to_le32(TX_CMD_FLG_ACK | TX_CMD_FLG_BAR);
197	}
198
199	/* HT rate doesn't make sense for a non data frame */
200	WARN_ONCE(info->control.rates[0].flags & IEEE80211_TX_RC_MCS,
201		  "Got an HT rate (flags:0x%x/mcs:%d) for a non data frame (fc:0x%x)\n",
202		  info->control.rates[0].flags,
203		  info->control.rates[0].idx,
204		  le16_to_cpu(fc));
205
206	rate_idx = info->control.rates[0].idx;
207	/* if the rate isn't a well known legacy rate, take the lowest one */
208	if (rate_idx < 0 || rate_idx > IWL_RATE_COUNT_LEGACY)
209		rate_idx = rate_lowest_index(
210				&mvm->nvm_data->bands[info->band], sta);
211
212	/* For 5 GHZ band, remap mac80211 rate indices into driver indices */
213	if (info->band == IEEE80211_BAND_5GHZ)
214		rate_idx += IWL_FIRST_OFDM_RATE;
215
216	/* For 2.4 GHZ band, check that there is no need to remap */
217	BUILD_BUG_ON(IWL_FIRST_CCK_RATE != 0);
218
219	/* Get PLCP rate for tx_cmd->rate_n_flags */
220	rate_plcp = iwl_mvm_mac80211_idx_to_hwrate(rate_idx);
221
222	mvm->mgmt_last_antenna_idx =
223		iwl_mvm_next_antenna(mvm, iwl_mvm_get_valid_tx_ant(mvm),
224				     mvm->mgmt_last_antenna_idx);
225
226	if (info->band == IEEE80211_BAND_2GHZ &&
227	    !iwl_mvm_bt_coex_is_shared_ant_avail(mvm))
228		rate_flags = mvm->cfg->non_shared_ant << RATE_MCS_ANT_POS;
229	else
230		rate_flags =
231			BIT(mvm->mgmt_last_antenna_idx) << RATE_MCS_ANT_POS;
232
233	/* Set CCK flag as needed */
234	if ((rate_idx >= IWL_FIRST_CCK_RATE) && (rate_idx <= IWL_LAST_CCK_RATE))
235		rate_flags |= RATE_MCS_CCK_MSK;
236
237	/* Set the rate in the TX cmd */
238	tx_cmd->rate_n_flags = cpu_to_le32((u32)rate_plcp | rate_flags);
239}
240
241/*
242 * Sets the fields in the Tx cmd that are crypto related
243 */
244void iwl_mvm_set_tx_cmd_crypto(struct iwl_mvm *mvm,
245			       struct ieee80211_tx_info *info,
246			       struct iwl_tx_cmd *tx_cmd,
247			       struct sk_buff *skb_frag)
248{
249	struct ieee80211_key_conf *keyconf = info->control.hw_key;
250
251	switch (keyconf->cipher) {
252	case WLAN_CIPHER_SUITE_CCMP:
253		tx_cmd->sec_ctl = TX_CMD_SEC_CCM;
254		memcpy(tx_cmd->key, keyconf->key, keyconf->keylen);
255		if (info->flags & IEEE80211_TX_CTL_AMPDU)
256			tx_cmd->tx_flags |= cpu_to_le32(TX_CMD_FLG_CCMP_AGG);
257		break;
258
259	case WLAN_CIPHER_SUITE_TKIP:
260		tx_cmd->sec_ctl = TX_CMD_SEC_TKIP;
261		ieee80211_get_tkip_p2k(keyconf, skb_frag, tx_cmd->key);
262		break;
263
264	case WLAN_CIPHER_SUITE_WEP104:
265		tx_cmd->sec_ctl |= TX_CMD_SEC_KEY128;
266		/* fall through */
267	case WLAN_CIPHER_SUITE_WEP40:
268		tx_cmd->sec_ctl |= TX_CMD_SEC_WEP |
269			((keyconf->keyidx << TX_CMD_SEC_WEP_KEY_IDX_POS) &
270			  TX_CMD_SEC_WEP_KEY_IDX_MSK);
271
272		memcpy(&tx_cmd->key[3], keyconf->key, keyconf->keylen);
273		break;
274	default:
275		tx_cmd->sec_ctl |= TX_CMD_SEC_EXT;
276	}
277}
278
279/*
280 * Allocates and sets the Tx cmd the driver data pointers in the skb
281 */
282static struct iwl_device_cmd *
283iwl_mvm_set_tx_params(struct iwl_mvm *mvm, struct sk_buff *skb,
284		      struct ieee80211_sta *sta, u8 sta_id)
285{
286	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
287	struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
288	struct iwl_device_cmd *dev_cmd;
289	struct iwl_tx_cmd *tx_cmd;
290
291	dev_cmd = iwl_trans_alloc_tx_cmd(mvm->trans);
292
293	if (unlikely(!dev_cmd))
294		return NULL;
295
296	memset(dev_cmd, 0, sizeof(*dev_cmd));
297	dev_cmd->hdr.cmd = TX_CMD;
298	tx_cmd = (struct iwl_tx_cmd *)dev_cmd->payload;
299
300	if (info->control.hw_key)
301		iwl_mvm_set_tx_cmd_crypto(mvm, info, tx_cmd, skb);
302
303	iwl_mvm_set_tx_cmd(mvm, skb, tx_cmd, info, sta_id);
304
305	iwl_mvm_set_tx_cmd_rate(mvm, tx_cmd, info, sta, hdr->frame_control);
306
307	memset(&info->status, 0, sizeof(info->status));
308
309	info->driver_data[0] = NULL;
310	info->driver_data[1] = dev_cmd;
311
312	return dev_cmd;
313}
314
315int iwl_mvm_tx_skb_non_sta(struct iwl_mvm *mvm, struct sk_buff *skb)
316{
317	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
318	struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
319	struct iwl_device_cmd *dev_cmd;
320	struct iwl_tx_cmd *tx_cmd;
321	u8 sta_id;
322
323	if (WARN_ON_ONCE(info->flags & IEEE80211_TX_CTL_AMPDU))
324		return -1;
325
326	if (WARN_ON_ONCE(info->flags & IEEE80211_TX_CTL_SEND_AFTER_DTIM &&
327			 (!info->control.vif ||
328			  info->hw_queue != info->control.vif->cab_queue)))
329		return -1;
330
331	/*
332	 * IWL_MVM_OFFCHANNEL_QUEUE is used for ROC packets that can be used
333	 * in 2 different types of vifs, P2P & STATION. P2P uses the offchannel
334	 * queue. STATION (HS2.0) uses the auxiliary context of the FW,
335	 * and hence needs to be sent on the aux queue
336	 */
337	if (IEEE80211_SKB_CB(skb)->hw_queue == IWL_MVM_OFFCHANNEL_QUEUE &&
338	    info->control.vif->type == NL80211_IFTYPE_STATION)
339		IEEE80211_SKB_CB(skb)->hw_queue = mvm->aux_queue;
340
341	/*
342	 * If the interface on which frame is sent is the P2P_DEVICE
343	 * or an AP/GO interface use the broadcast station associated
344	 * with it; otherwise use the AUX station.
345	 */
346	if (info->control.vif &&
347	    (info->control.vif->type == NL80211_IFTYPE_P2P_DEVICE ||
348	     info->control.vif->type == NL80211_IFTYPE_AP)) {
349		struct iwl_mvm_vif *mvmvif =
350			iwl_mvm_vif_from_mac80211(info->control.vif);
351		sta_id = mvmvif->bcast_sta.sta_id;
352	} else {
353		sta_id = mvm->aux_sta.sta_id;
354	}
355
356	IWL_DEBUG_TX(mvm, "station Id %d, queue=%d\n", sta_id, info->hw_queue);
357
358	dev_cmd = iwl_mvm_set_tx_params(mvm, skb, NULL, sta_id);
359	if (!dev_cmd)
360		return -1;
361
362	/* From now on, we cannot access info->control */
363	tx_cmd = (struct iwl_tx_cmd *)dev_cmd->payload;
364
365	/* Copy MAC header from skb into command buffer */
366	memcpy(tx_cmd->hdr, hdr, ieee80211_hdrlen(hdr->frame_control));
367
368	if (iwl_trans_tx(mvm->trans, skb, dev_cmd, info->hw_queue)) {
369		iwl_trans_free_tx_cmd(mvm->trans, dev_cmd);
370		return -1;
371	}
372
373	/*
374	 * Increase the pending frames counter, so that later when a reply comes
375	 * in and the counter is decreased - we don't start getting negative
376	 * values.
377	 * Note that we don't need to make sure it isn't agg'd, since we're
378	 * TXing non-sta
379	 */
380	atomic_inc(&mvm->pending_frames[sta_id]);
381
382	return 0;
383}
384
385/*
386 * Sets the fields in the Tx cmd that are crypto related
387 */
388int iwl_mvm_tx_skb(struct iwl_mvm *mvm, struct sk_buff *skb,
389		   struct ieee80211_sta *sta)
390{
391	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
392	struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
393	struct iwl_mvm_sta *mvmsta;
394	struct iwl_device_cmd *dev_cmd;
395	struct iwl_tx_cmd *tx_cmd;
396	__le16 fc;
397	u16 seq_number = 0;
398	u8 tid = IWL_MAX_TID_COUNT;
399	u8 txq_id = info->hw_queue;
400	bool is_data_qos = false, is_ampdu = false;
401
402	mvmsta = iwl_mvm_sta_from_mac80211(sta);
403	fc = hdr->frame_control;
404
405	if (WARN_ON_ONCE(!mvmsta))
406		return -1;
407
408	if (WARN_ON_ONCE(mvmsta->sta_id == IWL_MVM_STATION_COUNT))
409		return -1;
410
411	dev_cmd = iwl_mvm_set_tx_params(mvm, skb, sta, mvmsta->sta_id);
412	if (!dev_cmd)
413		goto drop;
414
415	tx_cmd = (struct iwl_tx_cmd *)dev_cmd->payload;
416	/* From now on, we cannot access info->control */
417
418	/*
419	 * we handle that entirely ourselves -- for uAPSD the firmware
420	 * will always send a notification, and for PS-Poll responses
421	 * we'll notify mac80211 when getting frame status
422	 */
423	info->flags &= ~IEEE80211_TX_STATUS_EOSP;
424
425	spin_lock(&mvmsta->lock);
426
427	if (ieee80211_is_data_qos(fc) && !ieee80211_is_qos_nullfunc(fc)) {
428		u8 *qc = NULL;
429		qc = ieee80211_get_qos_ctl(hdr);
430		tid = qc[0] & IEEE80211_QOS_CTL_TID_MASK;
431		if (WARN_ON_ONCE(tid >= IWL_MAX_TID_COUNT))
432			goto drop_unlock_sta;
433
434		seq_number = mvmsta->tid_data[tid].seq_number;
435		seq_number &= IEEE80211_SCTL_SEQ;
436		hdr->seq_ctrl &= cpu_to_le16(IEEE80211_SCTL_FRAG);
437		hdr->seq_ctrl |= cpu_to_le16(seq_number);
438		is_data_qos = true;
439		is_ampdu = info->flags & IEEE80211_TX_CTL_AMPDU;
440	}
441
442	/* Copy MAC header from skb into command buffer */
443	memcpy(tx_cmd->hdr, hdr, ieee80211_hdrlen(fc));
444
445	WARN_ON_ONCE(info->flags & IEEE80211_TX_CTL_SEND_AFTER_DTIM);
446
447	if (sta->tdls) {
448		/* default to TID 0 for non-QoS packets */
449		u8 tdls_tid = tid == IWL_MAX_TID_COUNT ? 0 : tid;
450
451		txq_id = mvmsta->hw_queue[tid_to_mac80211_ac[tdls_tid]];
452	}
453
454	if (is_ampdu) {
455		if (WARN_ON_ONCE(mvmsta->tid_data[tid].state != IWL_AGG_ON))
456			goto drop_unlock_sta;
457		txq_id = mvmsta->tid_data[tid].txq_id;
458	}
459
460	IWL_DEBUG_TX(mvm, "TX to [%d|%d] Q:%d - seq: 0x%x\n", mvmsta->sta_id,
461		     tid, txq_id, IEEE80211_SEQ_TO_SN(seq_number));
462
463	if (iwl_trans_tx(mvm->trans, skb, dev_cmd, txq_id))
464		goto drop_unlock_sta;
465
466	if (is_data_qos && !ieee80211_has_morefrags(fc))
467		mvmsta->tid_data[tid].seq_number = seq_number + 0x10;
468
469	spin_unlock(&mvmsta->lock);
470
471	if (txq_id < mvm->first_agg_queue)
472		atomic_inc(&mvm->pending_frames[mvmsta->sta_id]);
473
474	return 0;
475
476drop_unlock_sta:
477	iwl_trans_free_tx_cmd(mvm->trans, dev_cmd);
478	spin_unlock(&mvmsta->lock);
479drop:
480	return -1;
481}
482
483static void iwl_mvm_check_ratid_empty(struct iwl_mvm *mvm,
484				      struct ieee80211_sta *sta, u8 tid)
485{
486	struct iwl_mvm_sta *mvmsta = iwl_mvm_sta_from_mac80211(sta);
487	struct iwl_mvm_tid_data *tid_data = &mvmsta->tid_data[tid];
488	struct ieee80211_vif *vif = mvmsta->vif;
489
490	lockdep_assert_held(&mvmsta->lock);
491
492	if ((tid_data->state == IWL_AGG_ON ||
493	     tid_data->state == IWL_EMPTYING_HW_QUEUE_DELBA) &&
494	    iwl_mvm_tid_queued(tid_data) == 0) {
495		/*
496		 * Now that this aggregation queue is empty tell mac80211 so it
497		 * knows we no longer have frames buffered for the station on
498		 * this TID (for the TIM bitmap calculation.)
499		 */
500		ieee80211_sta_set_buffered(sta, tid, false);
501	}
502
503	if (tid_data->ssn != tid_data->next_reclaimed)
504		return;
505
506	switch (tid_data->state) {
507	case IWL_EMPTYING_HW_QUEUE_ADDBA:
508		IWL_DEBUG_TX_QUEUES(mvm,
509				    "Can continue addBA flow ssn = next_recl = %d\n",
510				    tid_data->next_reclaimed);
511		tid_data->state = IWL_AGG_STARTING;
512		ieee80211_start_tx_ba_cb_irqsafe(vif, sta->addr, tid);
513		break;
514
515	case IWL_EMPTYING_HW_QUEUE_DELBA:
516		IWL_DEBUG_TX_QUEUES(mvm,
517				    "Can continue DELBA flow ssn = next_recl = %d\n",
518				    tid_data->next_reclaimed);
519		iwl_mvm_disable_txq(mvm, tid_data->txq_id, CMD_ASYNC);
520		tid_data->state = IWL_AGG_OFF;
521		/*
522		 * we can't hold the mutex - but since we are after a sequence
523		 * point (call to iwl_mvm_disable_txq(), so we don't even need
524		 * a memory barrier.
525		 */
526		mvm->queue_to_mac80211[tid_data->txq_id] =
527					IWL_INVALID_MAC80211_QUEUE;
528		ieee80211_stop_tx_ba_cb_irqsafe(vif, sta->addr, tid);
529		break;
530
531	default:
532		break;
533	}
534}
535
536#ifdef CONFIG_IWLWIFI_DEBUG
537const char *iwl_mvm_get_tx_fail_reason(u32 status)
538{
539#define TX_STATUS_FAIL(x) case TX_STATUS_FAIL_ ## x: return #x
540#define TX_STATUS_POSTPONE(x) case TX_STATUS_POSTPONE_ ## x: return #x
541
542	switch (status & TX_STATUS_MSK) {
543	case TX_STATUS_SUCCESS:
544		return "SUCCESS";
545	TX_STATUS_POSTPONE(DELAY);
546	TX_STATUS_POSTPONE(FEW_BYTES);
547	TX_STATUS_POSTPONE(BT_PRIO);
548	TX_STATUS_POSTPONE(QUIET_PERIOD);
549	TX_STATUS_POSTPONE(CALC_TTAK);
550	TX_STATUS_FAIL(INTERNAL_CROSSED_RETRY);
551	TX_STATUS_FAIL(SHORT_LIMIT);
552	TX_STATUS_FAIL(LONG_LIMIT);
553	TX_STATUS_FAIL(UNDERRUN);
554	TX_STATUS_FAIL(DRAIN_FLOW);
555	TX_STATUS_FAIL(RFKILL_FLUSH);
556	TX_STATUS_FAIL(LIFE_EXPIRE);
557	TX_STATUS_FAIL(DEST_PS);
558	TX_STATUS_FAIL(HOST_ABORTED);
559	TX_STATUS_FAIL(BT_RETRY);
560	TX_STATUS_FAIL(STA_INVALID);
561	TX_STATUS_FAIL(FRAG_DROPPED);
562	TX_STATUS_FAIL(TID_DISABLE);
563	TX_STATUS_FAIL(FIFO_FLUSHED);
564	TX_STATUS_FAIL(SMALL_CF_POLL);
565	TX_STATUS_FAIL(FW_DROP);
566	TX_STATUS_FAIL(STA_COLOR_MISMATCH);
567	}
568
569	return "UNKNOWN";
570
571#undef TX_STATUS_FAIL
572#undef TX_STATUS_POSTPONE
573}
574#endif /* CONFIG_IWLWIFI_DEBUG */
575
576void iwl_mvm_hwrate_to_tx_rate(u32 rate_n_flags,
577			       enum ieee80211_band band,
578			       struct ieee80211_tx_rate *r)
579{
580	if (rate_n_flags & RATE_HT_MCS_GF_MSK)
581		r->flags |= IEEE80211_TX_RC_GREEN_FIELD;
582	switch (rate_n_flags & RATE_MCS_CHAN_WIDTH_MSK) {
583	case RATE_MCS_CHAN_WIDTH_20:
584		break;
585	case RATE_MCS_CHAN_WIDTH_40:
586		r->flags |= IEEE80211_TX_RC_40_MHZ_WIDTH;
587		break;
588	case RATE_MCS_CHAN_WIDTH_80:
589		r->flags |= IEEE80211_TX_RC_80_MHZ_WIDTH;
590		break;
591	case RATE_MCS_CHAN_WIDTH_160:
592		r->flags |= IEEE80211_TX_RC_160_MHZ_WIDTH;
593		break;
594	}
595	if (rate_n_flags & RATE_MCS_SGI_MSK)
596		r->flags |= IEEE80211_TX_RC_SHORT_GI;
597	if (rate_n_flags & RATE_MCS_HT_MSK) {
598		r->flags |= IEEE80211_TX_RC_MCS;
599		r->idx = rate_n_flags & RATE_HT_MCS_INDEX_MSK;
600	} else if (rate_n_flags & RATE_MCS_VHT_MSK) {
601		ieee80211_rate_set_vht(
602			r, rate_n_flags & RATE_VHT_MCS_RATE_CODE_MSK,
603			((rate_n_flags & RATE_VHT_MCS_NSS_MSK) >>
604						RATE_VHT_MCS_NSS_POS) + 1);
605		r->flags |= IEEE80211_TX_RC_VHT_MCS;
606	} else {
607		r->idx = iwl_mvm_legacy_rate_to_mac80211_idx(rate_n_flags,
608							     band);
609	}
610}
611
612/**
613 * translate ucode response to mac80211 tx status control values
614 */
615static void iwl_mvm_hwrate_to_tx_status(u32 rate_n_flags,
616					struct ieee80211_tx_info *info)
617{
618	struct ieee80211_tx_rate *r = &info->status.rates[0];
619
620	info->status.antenna =
621		((rate_n_flags & RATE_MCS_ANT_ABC_MSK) >> RATE_MCS_ANT_POS);
622	iwl_mvm_hwrate_to_tx_rate(rate_n_flags, info->band, r);
623}
624
625static void iwl_mvm_rx_tx_cmd_single(struct iwl_mvm *mvm,
626				     struct iwl_rx_packet *pkt)
627{
628	struct ieee80211_sta *sta;
629	u16 sequence = le16_to_cpu(pkt->hdr.sequence);
630	int txq_id = SEQ_TO_QUEUE(sequence);
631	struct iwl_mvm_tx_resp *tx_resp = (void *)pkt->data;
632	int sta_id = IWL_MVM_TX_RES_GET_RA(tx_resp->ra_tid);
633	int tid = IWL_MVM_TX_RES_GET_TID(tx_resp->ra_tid);
634	u32 status = le16_to_cpu(tx_resp->status.status);
635	u16 ssn = iwl_mvm_get_scd_ssn(tx_resp);
636	struct iwl_mvm_sta *mvmsta;
637	struct sk_buff_head skbs;
638	u8 skb_freed = 0;
639	u16 next_reclaimed, seq_ctl;
640
641	__skb_queue_head_init(&skbs);
642
643	seq_ctl = le16_to_cpu(tx_resp->seq_ctl);
644
645	/* we can free until ssn % q.n_bd not inclusive */
646	iwl_trans_reclaim(mvm->trans, txq_id, ssn, &skbs);
647
648	while (!skb_queue_empty(&skbs)) {
649		struct sk_buff *skb = __skb_dequeue(&skbs);
650		struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
651
652		skb_freed++;
653
654		iwl_trans_free_tx_cmd(mvm->trans, info->driver_data[1]);
655
656		memset(&info->status, 0, sizeof(info->status));
657
658		info->flags &= ~IEEE80211_TX_CTL_AMPDU;
659
660		/* inform mac80211 about what happened with the frame */
661		switch (status & TX_STATUS_MSK) {
662		case TX_STATUS_SUCCESS:
663		case TX_STATUS_DIRECT_DONE:
664			info->flags |= IEEE80211_TX_STAT_ACK;
665			break;
666		case TX_STATUS_FAIL_DEST_PS:
667			info->flags |= IEEE80211_TX_STAT_TX_FILTERED;
668			break;
669		default:
670			break;
671		}
672
673		info->status.rates[0].count = tx_resp->failure_frame + 1;
674		iwl_mvm_hwrate_to_tx_status(le32_to_cpu(tx_resp->initial_rate),
675					    info);
676		info->status.status_driver_data[1] =
677			(void *)(uintptr_t)le32_to_cpu(tx_resp->initial_rate);
678
679		/* Single frame failure in an AMPDU queue => send BAR */
680		if (txq_id >= mvm->first_agg_queue &&
681		    !(info->flags & IEEE80211_TX_STAT_ACK) &&
682		    !(info->flags & IEEE80211_TX_STAT_TX_FILTERED))
683			info->flags |= IEEE80211_TX_STAT_AMPDU_NO_BACK;
684
685		/* W/A FW bug: seq_ctl is wrong when the status isn't success */
686		if (status != TX_STATUS_SUCCESS) {
687			struct ieee80211_hdr *hdr = (void *)skb->data;
688			seq_ctl = le16_to_cpu(hdr->seq_ctrl);
689		}
690
691		/*
692		 * TODO: this is not accurate if we are freeing more than one
693		 * packet.
694		 */
695		info->status.tx_time =
696			le16_to_cpu(tx_resp->wireless_media_time);
697		BUILD_BUG_ON(ARRAY_SIZE(info->status.status_driver_data) < 1);
698		info->status.status_driver_data[0] =
699				(void *)(uintptr_t)tx_resp->reduced_tpc;
700
701		ieee80211_tx_status(mvm->hw, skb);
702	}
703
704	if (txq_id >= mvm->first_agg_queue) {
705		/* If this is an aggregation queue, we use the ssn since:
706		 * ssn = wifi seq_num % 256.
707		 * The seq_ctl is the sequence control of the packet to which
708		 * this Tx response relates. But if there is a hole in the
709		 * bitmap of the BA we received, this Tx response may allow to
710		 * reclaim the hole and all the subsequent packets that were
711		 * already acked. In that case, seq_ctl != ssn, and the next
712		 * packet to be reclaimed will be ssn and not seq_ctl. In that
713		 * case, several packets will be reclaimed even if
714		 * frame_count = 1.
715		 *
716		 * The ssn is the index (% 256) of the latest packet that has
717		 * treated (acked / dropped) + 1.
718		 */
719		next_reclaimed = ssn;
720	} else {
721		/* The next packet to be reclaimed is the one after this one */
722		next_reclaimed = IEEE80211_SEQ_TO_SN(seq_ctl + 0x10);
723	}
724
725	IWL_DEBUG_TX_REPLY(mvm,
726			   "TXQ %d status %s (0x%08x)\n",
727			   txq_id, iwl_mvm_get_tx_fail_reason(status), status);
728
729	IWL_DEBUG_TX_REPLY(mvm,
730			   "\t\t\t\tinitial_rate 0x%x retries %d, idx=%d ssn=%d next_reclaimed=0x%x seq_ctl=0x%x\n",
731			   le32_to_cpu(tx_resp->initial_rate),
732			   tx_resp->failure_frame, SEQ_TO_INDEX(sequence),
733			   ssn, next_reclaimed, seq_ctl);
734
735	rcu_read_lock();
736
737	sta = rcu_dereference(mvm->fw_id_to_mac_id[sta_id]);
738	/*
739	 * sta can't be NULL otherwise it'd mean that the sta has been freed in
740	 * the firmware while we still have packets for it in the Tx queues.
741	 */
742	if (WARN_ON_ONCE(!sta))
743		goto out;
744
745	if (!IS_ERR(sta)) {
746		mvmsta = iwl_mvm_sta_from_mac80211(sta);
747
748		if (tid != IWL_TID_NON_QOS) {
749			struct iwl_mvm_tid_data *tid_data =
750				&mvmsta->tid_data[tid];
751
752			spin_lock_bh(&mvmsta->lock);
753			tid_data->next_reclaimed = next_reclaimed;
754			IWL_DEBUG_TX_REPLY(mvm, "Next reclaimed packet:%d\n",
755					   next_reclaimed);
756			iwl_mvm_check_ratid_empty(mvm, sta, tid);
757			spin_unlock_bh(&mvmsta->lock);
758		}
759
760		if (mvmsta->next_status_eosp) {
761			mvmsta->next_status_eosp = false;
762			ieee80211_sta_eosp(sta);
763		}
764	} else {
765		mvmsta = NULL;
766	}
767
768	/*
769	 * If the txq is not an AMPDU queue, there is no chance we freed
770	 * several skbs. Check that out...
771	 */
772	if (txq_id >= mvm->first_agg_queue)
773		goto out;
774
775	/* We can't free more than one frame at once on a shared queue */
776	WARN_ON(skb_freed > 1);
777
778	/* If we have still frames for this STA nothing to do here */
779	if (!atomic_sub_and_test(skb_freed, &mvm->pending_frames[sta_id]))
780		goto out;
781
782	if (mvmsta && mvmsta->vif->type == NL80211_IFTYPE_AP) {
783
784		/*
785		 * If there are no pending frames for this STA and
786		 * the tx to this station is not disabled, notify
787		 * mac80211 that this station can now wake up in its
788		 * STA table.
789		 * If mvmsta is not NULL, sta is valid.
790		 */
791
792		spin_lock_bh(&mvmsta->lock);
793
794		if (!mvmsta->disable_tx)
795			ieee80211_sta_block_awake(mvm->hw, sta, false);
796
797		spin_unlock_bh(&mvmsta->lock);
798	}
799
800	if (PTR_ERR(sta) == -EBUSY || PTR_ERR(sta) == -ENOENT) {
801		/*
802		 * We are draining and this was the last packet - pre_rcu_remove
803		 * has been called already. We might be after the
804		 * synchronize_net already.
805		 * Don't rely on iwl_mvm_rm_sta to see the empty Tx queues.
806		 */
807		set_bit(sta_id, mvm->sta_drained);
808		schedule_work(&mvm->sta_drained_wk);
809	}
810
811out:
812	rcu_read_unlock();
813}
814
815#ifdef CONFIG_IWLWIFI_DEBUG
816#define AGG_TX_STATE_(x) case AGG_TX_STATE_ ## x: return #x
817static const char *iwl_get_agg_tx_status(u16 status)
818{
819	switch (status & AGG_TX_STATE_STATUS_MSK) {
820	AGG_TX_STATE_(TRANSMITTED);
821	AGG_TX_STATE_(UNDERRUN);
822	AGG_TX_STATE_(BT_PRIO);
823	AGG_TX_STATE_(FEW_BYTES);
824	AGG_TX_STATE_(ABORT);
825	AGG_TX_STATE_(LAST_SENT_TTL);
826	AGG_TX_STATE_(LAST_SENT_TRY_CNT);
827	AGG_TX_STATE_(LAST_SENT_BT_KILL);
828	AGG_TX_STATE_(SCD_QUERY);
829	AGG_TX_STATE_(TEST_BAD_CRC32);
830	AGG_TX_STATE_(RESPONSE);
831	AGG_TX_STATE_(DUMP_TX);
832	AGG_TX_STATE_(DELAY_TX);
833	}
834
835	return "UNKNOWN";
836}
837
838static void iwl_mvm_rx_tx_cmd_agg_dbg(struct iwl_mvm *mvm,
839				      struct iwl_rx_packet *pkt)
840{
841	struct iwl_mvm_tx_resp *tx_resp = (void *)pkt->data;
842	struct agg_tx_status *frame_status = &tx_resp->status;
843	int i;
844
845	for (i = 0; i < tx_resp->frame_count; i++) {
846		u16 fstatus = le16_to_cpu(frame_status[i].status);
847
848		IWL_DEBUG_TX_REPLY(mvm,
849				   "status %s (0x%04x), try-count (%d) seq (0x%x)\n",
850				   iwl_get_agg_tx_status(fstatus),
851				   fstatus & AGG_TX_STATE_STATUS_MSK,
852				   (fstatus & AGG_TX_STATE_TRY_CNT_MSK) >>
853					AGG_TX_STATE_TRY_CNT_POS,
854				   le16_to_cpu(frame_status[i].sequence));
855	}
856}
857#else
858static void iwl_mvm_rx_tx_cmd_agg_dbg(struct iwl_mvm *mvm,
859				      struct iwl_rx_packet *pkt)
860{}
861#endif /* CONFIG_IWLWIFI_DEBUG */
862
863static void iwl_mvm_rx_tx_cmd_agg(struct iwl_mvm *mvm,
864				  struct iwl_rx_packet *pkt)
865{
866	struct iwl_mvm_tx_resp *tx_resp = (void *)pkt->data;
867	int sta_id = IWL_MVM_TX_RES_GET_RA(tx_resp->ra_tid);
868	int tid = IWL_MVM_TX_RES_GET_TID(tx_resp->ra_tid);
869	u16 sequence = le16_to_cpu(pkt->hdr.sequence);
870	struct ieee80211_sta *sta;
871
872	if (WARN_ON_ONCE(SEQ_TO_QUEUE(sequence) < mvm->first_agg_queue))
873		return;
874
875	if (WARN_ON_ONCE(tid == IWL_TID_NON_QOS))
876		return;
877
878	iwl_mvm_rx_tx_cmd_agg_dbg(mvm, pkt);
879
880	rcu_read_lock();
881
882	sta = rcu_dereference(mvm->fw_id_to_mac_id[sta_id]);
883
884	if (!WARN_ON_ONCE(IS_ERR_OR_NULL(sta))) {
885		struct iwl_mvm_sta *mvmsta = iwl_mvm_sta_from_mac80211(sta);
886		mvmsta->tid_data[tid].rate_n_flags =
887			le32_to_cpu(tx_resp->initial_rate);
888		mvmsta->tid_data[tid].reduced_tpc = tx_resp->reduced_tpc;
889		mvmsta->tid_data[tid].tx_time =
890			le16_to_cpu(tx_resp->wireless_media_time);
891	}
892
893	rcu_read_unlock();
894}
895
896int iwl_mvm_rx_tx_cmd(struct iwl_mvm *mvm, struct iwl_rx_cmd_buffer *rxb,
897		      struct iwl_device_cmd *cmd)
898{
899	struct iwl_rx_packet *pkt = rxb_addr(rxb);
900	struct iwl_mvm_tx_resp *tx_resp = (void *)pkt->data;
901
902	if (tx_resp->frame_count == 1)
903		iwl_mvm_rx_tx_cmd_single(mvm, pkt);
904	else
905		iwl_mvm_rx_tx_cmd_agg(mvm, pkt);
906
907	return 0;
908}
909
910static void iwl_mvm_tx_info_from_ba_notif(struct ieee80211_tx_info *info,
911					  struct iwl_mvm_ba_notif *ba_notif,
912					  struct iwl_mvm_tid_data *tid_data)
913{
914	info->flags |= IEEE80211_TX_STAT_AMPDU;
915	info->status.ampdu_ack_len = ba_notif->txed_2_done;
916	info->status.ampdu_len = ba_notif->txed;
917	iwl_mvm_hwrate_to_tx_status(tid_data->rate_n_flags,
918				    info);
919	/* TODO: not accounted if the whole A-MPDU failed */
920	info->status.tx_time = tid_data->tx_time;
921	info->status.status_driver_data[0] =
922		(void *)(uintptr_t)tid_data->reduced_tpc;
923	info->status.status_driver_data[1] =
924		(void *)(uintptr_t)tid_data->rate_n_flags;
925}
926
927int iwl_mvm_rx_ba_notif(struct iwl_mvm *mvm, struct iwl_rx_cmd_buffer *rxb,
928			struct iwl_device_cmd *cmd)
929{
930	struct iwl_rx_packet *pkt = rxb_addr(rxb);
931	struct iwl_mvm_ba_notif *ba_notif = (void *)pkt->data;
932	struct sk_buff_head reclaimed_skbs;
933	struct iwl_mvm_tid_data *tid_data;
934	struct ieee80211_sta *sta;
935	struct iwl_mvm_sta *mvmsta;
936	struct sk_buff *skb;
937	int sta_id, tid, freed;
938	/* "flow" corresponds to Tx queue */
939	u16 scd_flow = le16_to_cpu(ba_notif->scd_flow);
940	/* "ssn" is start of block-ack Tx window, corresponds to index
941	 * (in Tx queue's circular buffer) of first TFD/frame in window */
942	u16 ba_resp_scd_ssn = le16_to_cpu(ba_notif->scd_ssn);
943
944	sta_id = ba_notif->sta_id;
945	tid = ba_notif->tid;
946
947	if (WARN_ONCE(sta_id >= IWL_MVM_STATION_COUNT ||
948		      tid >= IWL_MAX_TID_COUNT,
949		      "sta_id %d tid %d", sta_id, tid))
950		return 0;
951
952	rcu_read_lock();
953
954	sta = rcu_dereference(mvm->fw_id_to_mac_id[sta_id]);
955
956	/* Reclaiming frames for a station that has been deleted ? */
957	if (WARN_ON_ONCE(IS_ERR_OR_NULL(sta))) {
958		rcu_read_unlock();
959		return 0;
960	}
961
962	mvmsta = iwl_mvm_sta_from_mac80211(sta);
963	tid_data = &mvmsta->tid_data[tid];
964
965	if (tid_data->txq_id != scd_flow) {
966		IWL_ERR(mvm,
967			"invalid BA notification: Q %d, tid %d, flow %d\n",
968			tid_data->txq_id, tid, scd_flow);
969		rcu_read_unlock();
970		return 0;
971	}
972
973	spin_lock_bh(&mvmsta->lock);
974
975	__skb_queue_head_init(&reclaimed_skbs);
976
977	/*
978	 * Release all TFDs before the SSN, i.e. all TFDs in front of
979	 * block-ack window (we assume that they've been successfully
980	 * transmitted ... if not, it's too late anyway).
981	 */
982	iwl_trans_reclaim(mvm->trans, scd_flow, ba_resp_scd_ssn,
983			  &reclaimed_skbs);
984
985	IWL_DEBUG_TX_REPLY(mvm,
986			   "BA_NOTIFICATION Received from %pM, sta_id = %d\n",
987			   (u8 *)&ba_notif->sta_addr_lo32,
988			   ba_notif->sta_id);
989	IWL_DEBUG_TX_REPLY(mvm,
990			   "TID = %d, SeqCtl = %d, bitmap = 0x%llx, scd_flow = %d, scd_ssn = %d sent:%d, acked:%d\n",
991			   ba_notif->tid, le16_to_cpu(ba_notif->seq_ctl),
992			   (unsigned long long)le64_to_cpu(ba_notif->bitmap),
993			   scd_flow, ba_resp_scd_ssn, ba_notif->txed,
994			   ba_notif->txed_2_done);
995
996	tid_data->next_reclaimed = ba_resp_scd_ssn;
997
998	iwl_mvm_check_ratid_empty(mvm, sta, tid);
999
1000	freed = 0;
1001
1002	skb_queue_walk(&reclaimed_skbs, skb) {
1003		struct ieee80211_hdr *hdr = (void *)skb->data;
1004		struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
1005
1006		if (ieee80211_is_data_qos(hdr->frame_control))
1007			freed++;
1008		else
1009			WARN_ON_ONCE(1);
1010
1011		iwl_trans_free_tx_cmd(mvm->trans, info->driver_data[1]);
1012
1013		memset(&info->status, 0, sizeof(info->status));
1014		/* Packet was transmitted successfully, failures come as single
1015		 * frames because before failing a frame the firmware transmits
1016		 * it without aggregation at least once.
1017		 */
1018		info->flags |= IEEE80211_TX_STAT_ACK;
1019
1020		/* this is the first skb we deliver in this batch */
1021		/* put the rate scaling data there */
1022		if (freed == 1)
1023			iwl_mvm_tx_info_from_ba_notif(info, ba_notif, tid_data);
1024	}
1025
1026	spin_unlock_bh(&mvmsta->lock);
1027
1028	/* We got a BA notif with 0 acked or scd_ssn didn't progress which is
1029	 * possible (i.e. first MPDU in the aggregation wasn't acked)
1030	 * Still it's important to update RS about sent vs. acked.
1031	 */
1032	if (skb_queue_empty(&reclaimed_skbs)) {
1033		struct ieee80211_tx_info ba_info = {};
1034		struct ieee80211_chanctx_conf *chanctx_conf = NULL;
1035
1036		if (mvmsta->vif)
1037			chanctx_conf =
1038				rcu_dereference(mvmsta->vif->chanctx_conf);
1039
1040		if (WARN_ON_ONCE(!chanctx_conf))
1041			goto out;
1042
1043		ba_info.band = chanctx_conf->def.chan->band;
1044		iwl_mvm_tx_info_from_ba_notif(&ba_info, ba_notif, tid_data);
1045
1046		IWL_DEBUG_TX_REPLY(mvm, "No reclaim. Update rs directly\n");
1047		iwl_mvm_rs_tx_status(mvm, sta, tid, &ba_info);
1048	}
1049
1050out:
1051	rcu_read_unlock();
1052
1053	while (!skb_queue_empty(&reclaimed_skbs)) {
1054		skb = __skb_dequeue(&reclaimed_skbs);
1055		ieee80211_tx_status(mvm->hw, skb);
1056	}
1057
1058	return 0;
1059}
1060
1061/*
1062 * Note that there are transports that buffer frames before they reach
1063 * the firmware. This means that after flush_tx_path is called, the
1064 * queue might not be empty. The race-free way to handle this is to:
1065 * 1) set the station as draining
1066 * 2) flush the Tx path
1067 * 3) wait for the transport queues to be empty
1068 */
1069int iwl_mvm_flush_tx_path(struct iwl_mvm *mvm, u32 tfd_msk, bool sync)
1070{
1071	int ret;
1072	struct iwl_tx_path_flush_cmd flush_cmd = {
1073		.queues_ctl = cpu_to_le32(tfd_msk),
1074		.flush_ctl = cpu_to_le16(DUMP_TX_FIFO_FLUSH),
1075	};
1076
1077	u32 flags = sync ? 0 : CMD_ASYNC;
1078
1079	ret = iwl_mvm_send_cmd_pdu(mvm, TXPATH_FLUSH, flags,
1080				   sizeof(flush_cmd), &flush_cmd);
1081	if (ret)
1082		IWL_ERR(mvm, "Failed to send flush command (%d)\n", ret);
1083	return ret;
1084}
1085