cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

tx.c (40414B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/******************************************************************************
      3 *
      4 * Copyright(c) 2008 - 2014 Intel Corporation. All rights reserved.
      5 * Copyright (C) 2019 Intel Corporation
      6 *****************************************************************************/
      7
      8#include <linux/kernel.h>
      9#include <linux/module.h>
     10#include <linux/sched.h>
     11#include <linux/ieee80211.h>
     12#include "iwl-io.h"
     13#include "iwl-trans.h"
     14#include "iwl-agn-hw.h"
     15#include "dev.h"
     16#include "agn.h"
     17
     18static const u8 tid_to_ac[] = {
     19	IEEE80211_AC_BE,
     20	IEEE80211_AC_BK,
     21	IEEE80211_AC_BK,
     22	IEEE80211_AC_BE,
     23	IEEE80211_AC_VI,
     24	IEEE80211_AC_VI,
     25	IEEE80211_AC_VO,
     26	IEEE80211_AC_VO,
     27};
     28
     29static void iwlagn_tx_cmd_protection(struct iwl_priv *priv,
     30				     struct ieee80211_tx_info *info,
     31				     __le16 fc, __le32 *tx_flags)
     32{
     33	if (info->control.rates[0].flags & IEEE80211_TX_RC_USE_RTS_CTS ||
     34	    info->control.rates[0].flags & IEEE80211_TX_RC_USE_CTS_PROTECT ||
     35	    info->flags & IEEE80211_TX_CTL_AMPDU)
     36		*tx_flags |= TX_CMD_FLG_PROT_REQUIRE_MSK;
     37}
     38
     39/*
     40 * handle build REPLY_TX command notification.
     41 */
     42static void iwlagn_tx_cmd_build_basic(struct iwl_priv *priv,
     43				      struct sk_buff *skb,
     44				      struct iwl_tx_cmd *tx_cmd,
     45				      struct ieee80211_tx_info *info,
     46				      struct ieee80211_hdr *hdr, u8 sta_id)
     47{
     48	__le16 fc = hdr->frame_control;
     49	__le32 tx_flags = tx_cmd->tx_flags;
     50
     51	tx_cmd->stop_time.life_time = TX_CMD_LIFE_TIME_INFINITE;
     52
     53	if (!(info->flags & IEEE80211_TX_CTL_NO_ACK))
     54		tx_flags |= TX_CMD_FLG_ACK_MSK;
     55	else
     56		tx_flags &= ~TX_CMD_FLG_ACK_MSK;
     57
     58	if (ieee80211_is_probe_resp(fc))
     59		tx_flags |= TX_CMD_FLG_TSF_MSK;
     60	else if (ieee80211_is_back_req(fc))
     61		tx_flags |= TX_CMD_FLG_ACK_MSK | TX_CMD_FLG_IMM_BA_RSP_MASK;
     62	else if (info->band == NL80211_BAND_2GHZ &&
     63		 priv->lib->bt_params &&
     64		 priv->lib->bt_params->advanced_bt_coexist &&
     65		 (ieee80211_is_auth(fc) || ieee80211_is_assoc_req(fc) ||
     66		 ieee80211_is_reassoc_req(fc) ||
     67		 info->control.flags & IEEE80211_TX_CTRL_PORT_CTRL_PROTO))
     68		tx_flags |= TX_CMD_FLG_IGNORE_BT;
     69
     70
     71	tx_cmd->sta_id = sta_id;
     72	if (ieee80211_has_morefrags(fc))
     73		tx_flags |= TX_CMD_FLG_MORE_FRAG_MSK;
     74
     75	if (ieee80211_is_data_qos(fc)) {
     76		u8 *qc = ieee80211_get_qos_ctl(hdr);
     77		tx_cmd->tid_tspec = qc[0] & 0xf;
     78		tx_flags &= ~TX_CMD_FLG_SEQ_CTL_MSK;
     79	} else {
     80		tx_cmd->tid_tspec = IWL_TID_NON_QOS;
     81		if (info->flags & IEEE80211_TX_CTL_ASSIGN_SEQ)
     82			tx_flags |= TX_CMD_FLG_SEQ_CTL_MSK;
     83		else
     84			tx_flags &= ~TX_CMD_FLG_SEQ_CTL_MSK;
     85	}
     86
     87	iwlagn_tx_cmd_protection(priv, info, fc, &tx_flags);
     88
     89	tx_flags &= ~(TX_CMD_FLG_ANT_SEL_MSK);
     90	if (ieee80211_is_mgmt(fc)) {
     91		if (ieee80211_is_assoc_req(fc) || ieee80211_is_reassoc_req(fc))
     92			tx_cmd->timeout.pm_frame_timeout = cpu_to_le16(3);
     93		else
     94			tx_cmd->timeout.pm_frame_timeout = cpu_to_le16(2);
     95	} else {
     96		tx_cmd->timeout.pm_frame_timeout = 0;
     97	}
     98
     99	tx_cmd->driver_txop = 0;
    100	tx_cmd->tx_flags = tx_flags;
    101	tx_cmd->next_frame_len = 0;
    102}
    103
    104static void iwlagn_tx_cmd_build_rate(struct iwl_priv *priv,
    105				     struct iwl_tx_cmd *tx_cmd,
    106				     struct ieee80211_tx_info *info,
    107				     struct ieee80211_sta *sta,
    108				     __le16 fc)
    109{
    110	u32 rate_flags;
    111	int rate_idx;
    112	u8 rts_retry_limit;
    113	u8 data_retry_limit;
    114	u8 rate_plcp;
    115
    116	if (priv->wowlan) {
    117		rts_retry_limit = IWLAGN_LOW_RETRY_LIMIT;
    118		data_retry_limit = IWLAGN_LOW_RETRY_LIMIT;
    119	} else {
    120		/* Set retry limit on RTS packets */
    121		rts_retry_limit = IWLAGN_RTS_DFAULT_RETRY_LIMIT;
    122
    123		/* Set retry limit on DATA packets and Probe Responses*/
    124		if (ieee80211_is_probe_resp(fc)) {
    125			data_retry_limit = IWLAGN_MGMT_DFAULT_RETRY_LIMIT;
    126			rts_retry_limit =
    127				min(data_retry_limit, rts_retry_limit);
    128		} else if (ieee80211_is_back_req(fc))
    129			data_retry_limit = IWLAGN_BAR_DFAULT_RETRY_LIMIT;
    130		else
    131			data_retry_limit = IWLAGN_DEFAULT_TX_RETRY;
    132	}
    133
    134	tx_cmd->data_retry_limit = data_retry_limit;
    135	tx_cmd->rts_retry_limit = rts_retry_limit;
    136
    137	/* DATA packets will use the uCode station table for rate/antenna
    138	 * selection */
    139	if (ieee80211_is_data(fc)) {
    140		tx_cmd->initial_rate_index = 0;
    141		tx_cmd->tx_flags |= TX_CMD_FLG_STA_RATE_MSK;
    142		return;
    143	} else if (ieee80211_is_back_req(fc))
    144		tx_cmd->tx_flags |= TX_CMD_FLG_STA_RATE_MSK;
    145
    146	/**
    147	 * If the current TX rate stored in mac80211 has the MCS bit set, it's
    148	 * not really a TX rate.  Thus, we use the lowest supported rate for
    149	 * this band.  Also use the lowest supported rate if the stored rate
    150	 * index is invalid.
    151	 */
    152	rate_idx = info->control.rates[0].idx;
    153	if (info->control.rates[0].flags & IEEE80211_TX_RC_MCS ||
    154			(rate_idx < 0) || (rate_idx > IWL_RATE_COUNT_LEGACY))
    155		rate_idx = rate_lowest_index(
    156				&priv->nvm_data->bands[info->band], sta);
    157	/* For 5 GHZ band, remap mac80211 rate indices into driver indices */
    158	if (info->band == NL80211_BAND_5GHZ)
    159		rate_idx += IWL_FIRST_OFDM_RATE;
    160	/* Get PLCP rate for tx_cmd->rate_n_flags */
    161	rate_plcp = iwl_rates[rate_idx].plcp;
    162	/* Zero out flags for this packet */
    163	rate_flags = 0;
    164
    165	/* Set CCK flag as needed */
    166	if ((rate_idx >= IWL_FIRST_CCK_RATE) && (rate_idx <= IWL_LAST_CCK_RATE))
    167		rate_flags |= RATE_MCS_CCK_MSK;
    168
    169	/* Set up antennas */
    170	if (priv->lib->bt_params &&
    171	    priv->lib->bt_params->advanced_bt_coexist &&
    172	    priv->bt_full_concurrent) {
    173		/* operated as 1x1 in full concurrency mode */
    174		priv->mgmt_tx_ant = iwl_toggle_tx_ant(priv, priv->mgmt_tx_ant,
    175				first_antenna(priv->nvm_data->valid_tx_ant));
    176	} else
    177		priv->mgmt_tx_ant = iwl_toggle_tx_ant(
    178					priv, priv->mgmt_tx_ant,
    179					priv->nvm_data->valid_tx_ant);
    180	rate_flags |= iwl_ant_idx_to_flags(priv->mgmt_tx_ant);
    181
    182	/* Set the rate in the TX cmd */
    183	tx_cmd->rate_n_flags = iwl_hw_set_rate_n_flags(rate_plcp, rate_flags);
    184}
    185
    186static void iwlagn_tx_cmd_build_hwcrypto(struct iwl_priv *priv,
    187					 struct ieee80211_tx_info *info,
    188					 struct iwl_tx_cmd *tx_cmd,
    189					 struct sk_buff *skb_frag)
    190{
    191	struct ieee80211_key_conf *keyconf = info->control.hw_key;
    192
    193	switch (keyconf->cipher) {
    194	case WLAN_CIPHER_SUITE_CCMP:
    195		tx_cmd->sec_ctl = TX_CMD_SEC_CCM;
    196		memcpy(tx_cmd->key, keyconf->key, keyconf->keylen);
    197		if (info->flags & IEEE80211_TX_CTL_AMPDU)
    198			tx_cmd->tx_flags |= TX_CMD_FLG_AGG_CCMP_MSK;
    199		break;
    200
    201	case WLAN_CIPHER_SUITE_TKIP:
    202		tx_cmd->sec_ctl = TX_CMD_SEC_TKIP;
    203		ieee80211_get_tkip_p2k(keyconf, skb_frag, tx_cmd->key);
    204		break;
    205
    206	case WLAN_CIPHER_SUITE_WEP104:
    207		tx_cmd->sec_ctl |= TX_CMD_SEC_KEY128;
    208		fallthrough;
    209	case WLAN_CIPHER_SUITE_WEP40:
    210		tx_cmd->sec_ctl |= (TX_CMD_SEC_WEP |
    211			(keyconf->keyidx & TX_CMD_SEC_MSK) << TX_CMD_SEC_SHIFT);
    212
    213		memcpy(&tx_cmd->key[3], keyconf->key, keyconf->keylen);
    214
    215		IWL_DEBUG_TX(priv, "Configuring packet for WEP encryption "
    216			     "with key %d\n", keyconf->keyidx);
    217		break;
    218
    219	default:
    220		IWL_ERR(priv, "Unknown encode cipher %x\n", keyconf->cipher);
    221		break;
    222	}
    223}
    224
    225/**
    226 * iwl_sta_id_or_broadcast - return sta_id or broadcast sta
    227 * @context: the current context
    228 * @sta: mac80211 station
    229 *
    230 * In certain circumstances mac80211 passes a station pointer
    231 * that may be %NULL, for example during TX or key setup. In
    232 * that case, we need to use the broadcast station, so this
    233 * inline wraps that pattern.
    234 */
    235static int iwl_sta_id_or_broadcast(struct iwl_rxon_context *context,
    236				   struct ieee80211_sta *sta)
    237{
    238	int sta_id;
    239
    240	if (!sta)
    241		return context->bcast_sta_id;
    242
    243	sta_id = iwl_sta_id(sta);
    244
    245	/*
    246	 * mac80211 should not be passing a partially
    247	 * initialised station!
    248	 */
    249	WARN_ON(sta_id == IWL_INVALID_STATION);
    250
    251	return sta_id;
    252}
    253
    254/*
    255 * start REPLY_TX command process
    256 */
    257int iwlagn_tx_skb(struct iwl_priv *priv,
    258		  struct ieee80211_sta *sta,
    259		  struct sk_buff *skb)
    260{
    261	struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
    262	struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
    263	struct iwl_station_priv *sta_priv = NULL;
    264	struct iwl_rxon_context *ctx = &priv->contexts[IWL_RXON_CTX_BSS];
    265	struct iwl_device_tx_cmd *dev_cmd;
    266	struct iwl_tx_cmd *tx_cmd;
    267	__le16 fc;
    268	u8 hdr_len;
    269	u16 len, seq_number = 0;
    270	u8 sta_id, tid = IWL_MAX_TID_COUNT;
    271	bool is_agg = false, is_data_qos = false;
    272	int txq_id;
    273
    274	if (info->control.vif)
    275		ctx = iwl_rxon_ctx_from_vif(info->control.vif);
    276
    277	if (iwl_is_rfkill(priv)) {
    278		IWL_DEBUG_DROP(priv, "Dropping - RF KILL\n");
    279		goto drop_unlock_priv;
    280	}
    281
    282	fc = hdr->frame_control;
    283
    284#ifdef CONFIG_IWLWIFI_DEBUG
    285	if (ieee80211_is_auth(fc))
    286		IWL_DEBUG_TX(priv, "Sending AUTH frame\n");
    287	else if (ieee80211_is_assoc_req(fc))
    288		IWL_DEBUG_TX(priv, "Sending ASSOC frame\n");
    289	else if (ieee80211_is_reassoc_req(fc))
    290		IWL_DEBUG_TX(priv, "Sending REASSOC frame\n");
    291#endif
    292
    293	if (unlikely(ieee80211_is_probe_resp(fc))) {
    294		struct iwl_wipan_noa_data *noa_data =
    295			rcu_dereference(priv->noa_data);
    296
    297		if (noa_data &&
    298		    pskb_expand_head(skb, 0, noa_data->length,
    299				     GFP_ATOMIC) == 0) {
    300			skb_put_data(skb, noa_data->data, noa_data->length);
    301			hdr = (struct ieee80211_hdr *)skb->data;
    302		}
    303	}
    304
    305	hdr_len = ieee80211_hdrlen(fc);
    306
    307	/* For management frames use broadcast id to do not break aggregation */
    308	if (!ieee80211_is_data(fc))
    309		sta_id = ctx->bcast_sta_id;
    310	else {
    311		/* Find index into station table for destination station */
    312		sta_id = iwl_sta_id_or_broadcast(ctx, sta);
    313		if (sta_id == IWL_INVALID_STATION) {
    314			IWL_DEBUG_DROP(priv, "Dropping - INVALID STATION: %pM\n",
    315				       hdr->addr1);
    316			goto drop_unlock_priv;
    317		}
    318	}
    319
    320	if (sta)
    321		sta_priv = (void *)sta->drv_priv;
    322
    323	if (sta_priv && sta_priv->asleep &&
    324	    (info->flags & IEEE80211_TX_CTL_NO_PS_BUFFER)) {
    325		/*
    326		 * This sends an asynchronous command to the device,
    327		 * but we can rely on it being processed before the
    328		 * next frame is processed -- and the next frame to
    329		 * this station is the one that will consume this
    330		 * counter.
    331		 * For now set the counter to just 1 since we do not
    332		 * support uAPSD yet.
    333		 *
    334		 * FIXME: If we get two non-bufferable frames one
    335		 * after the other, we might only send out one of
    336		 * them because this is racy.
    337		 */
    338		iwl_sta_modify_sleep_tx_count(priv, sta_id, 1);
    339	}
    340
    341	dev_cmd = iwl_trans_alloc_tx_cmd(priv->trans);
    342
    343	if (unlikely(!dev_cmd))
    344		goto drop_unlock_priv;
    345
    346	dev_cmd->hdr.cmd = REPLY_TX;
    347	tx_cmd = (struct iwl_tx_cmd *) dev_cmd->payload;
    348
    349	/* Total # bytes to be transmitted */
    350	len = (u16)skb->len;
    351	tx_cmd->len = cpu_to_le16(len);
    352
    353	if (info->control.hw_key)
    354		iwlagn_tx_cmd_build_hwcrypto(priv, info, tx_cmd, skb);
    355
    356	/* TODO need this for burst mode later on */
    357	iwlagn_tx_cmd_build_basic(priv, skb, tx_cmd, info, hdr, sta_id);
    358
    359	iwlagn_tx_cmd_build_rate(priv, tx_cmd, info, sta, fc);
    360
    361	memset(&info->status, 0, sizeof(info->status));
    362	memset(info->driver_data, 0, sizeof(info->driver_data));
    363
    364	info->driver_data[0] = ctx;
    365	info->driver_data[1] = dev_cmd;
    366	/* From now on, we cannot access info->control */
    367
    368	spin_lock(&priv->sta_lock);
    369
    370	if (ieee80211_is_data_qos(fc) && !ieee80211_is_qos_nullfunc(fc)) {
    371		u8 *qc = NULL;
    372		struct iwl_tid_data *tid_data;
    373		qc = ieee80211_get_qos_ctl(hdr);
    374		tid = qc[0] & IEEE80211_QOS_CTL_TID_MASK;
    375		if (WARN_ON_ONCE(tid >= IWL_MAX_TID_COUNT))
    376			goto drop_unlock_sta;
    377		tid_data = &priv->tid_data[sta_id][tid];
    378
    379		/* aggregation is on for this <sta,tid> */
    380		if (info->flags & IEEE80211_TX_CTL_AMPDU &&
    381		    tid_data->agg.state != IWL_AGG_ON) {
    382			IWL_ERR(priv,
    383				"TX_CTL_AMPDU while not in AGG: Tx flags = 0x%08x, agg.state = %d\n",
    384				info->flags, tid_data->agg.state);
    385			IWL_ERR(priv, "sta_id = %d, tid = %d seq_num = %d\n",
    386				sta_id, tid,
    387				IEEE80211_SEQ_TO_SN(tid_data->seq_number));
    388			goto drop_unlock_sta;
    389		}
    390
    391		/* We can receive packets from the stack in IWL_AGG_{ON,OFF}
    392		 * only. Check this here.
    393		 */
    394		if (WARN_ONCE(tid_data->agg.state != IWL_AGG_ON &&
    395			      tid_data->agg.state != IWL_AGG_OFF,
    396			      "Tx while agg.state = %d\n", tid_data->agg.state))
    397			goto drop_unlock_sta;
    398
    399		seq_number = tid_data->seq_number;
    400		seq_number &= IEEE80211_SCTL_SEQ;
    401		hdr->seq_ctrl &= cpu_to_le16(IEEE80211_SCTL_FRAG);
    402		hdr->seq_ctrl |= cpu_to_le16(seq_number);
    403		seq_number += 0x10;
    404
    405		if (info->flags & IEEE80211_TX_CTL_AMPDU)
    406			is_agg = true;
    407		is_data_qos = true;
    408	}
    409
    410	/* Copy MAC header from skb into command buffer */
    411	memcpy(tx_cmd->hdr, hdr, hdr_len);
    412
    413	txq_id = info->hw_queue;
    414
    415	if (is_agg)
    416		txq_id = priv->tid_data[sta_id][tid].agg.txq_id;
    417	else if (info->flags & IEEE80211_TX_CTL_SEND_AFTER_DTIM) {
    418		/*
    419		 * The microcode will clear the more data
    420		 * bit in the last frame it transmits.
    421		 */
    422		hdr->frame_control |=
    423			cpu_to_le16(IEEE80211_FCTL_MOREDATA);
    424	}
    425
    426	WARN_ON_ONCE(is_agg &&
    427		     priv->queue_to_mac80211[txq_id] != info->hw_queue);
    428
    429	IWL_DEBUG_TX(priv, "TX to [%d|%d] Q:%d - seq: 0x%x\n", sta_id, tid,
    430		     txq_id, seq_number);
    431
    432	if (iwl_trans_tx(priv->trans, skb, dev_cmd, txq_id))
    433		goto drop_unlock_sta;
    434
    435	if (is_data_qos && !ieee80211_has_morefrags(fc))
    436		priv->tid_data[sta_id][tid].seq_number = seq_number;
    437
    438	spin_unlock(&priv->sta_lock);
    439
    440	/*
    441	 * Avoid atomic ops if it isn't an associated client.
    442	 * Also, if this is a packet for aggregation, don't
    443	 * increase the counter because the ucode will stop
    444	 * aggregation queues when their respective station
    445	 * goes to sleep.
    446	 */
    447	if (sta_priv && sta_priv->client && !is_agg)
    448		atomic_inc(&sta_priv->pending_frames);
    449
    450	return 0;
    451
    452drop_unlock_sta:
    453	if (dev_cmd)
    454		iwl_trans_free_tx_cmd(priv->trans, dev_cmd);
    455	spin_unlock(&priv->sta_lock);
    456drop_unlock_priv:
    457	return -1;
    458}
    459
    460static int iwlagn_alloc_agg_txq(struct iwl_priv *priv, int mq)
    461{
    462	int q;
    463
    464	for (q = IWLAGN_FIRST_AMPDU_QUEUE;
    465	     q < priv->trans->trans_cfg->base_params->num_of_queues; q++) {
    466		if (!test_and_set_bit(q, priv->agg_q_alloc)) {
    467			priv->queue_to_mac80211[q] = mq;
    468			return q;
    469		}
    470	}
    471
    472	return -ENOSPC;
    473}
    474
    475static void iwlagn_dealloc_agg_txq(struct iwl_priv *priv, int q)
    476{
    477	clear_bit(q, priv->agg_q_alloc);
    478	priv->queue_to_mac80211[q] = IWL_INVALID_MAC80211_QUEUE;
    479}
    480
    481int iwlagn_tx_agg_stop(struct iwl_priv *priv, struct ieee80211_vif *vif,
    482			struct ieee80211_sta *sta, u16 tid)
    483{
    484	struct iwl_tid_data *tid_data;
    485	int sta_id, txq_id;
    486	enum iwl_agg_state agg_state;
    487
    488	sta_id = iwl_sta_id(sta);
    489
    490	if (sta_id == IWL_INVALID_STATION) {
    491		IWL_ERR(priv, "Invalid station for AGG tid %d\n", tid);
    492		return -ENXIO;
    493	}
    494
    495	spin_lock_bh(&priv->sta_lock);
    496
    497	tid_data = &priv->tid_data[sta_id][tid];
    498	txq_id = tid_data->agg.txq_id;
    499
    500	switch (tid_data->agg.state) {
    501	case IWL_EMPTYING_HW_QUEUE_ADDBA:
    502		/*
    503		* This can happen if the peer stops aggregation
    504		* again before we've had a chance to drain the
    505		* queue we selected previously, i.e. before the
    506		* session was really started completely.
    507		*/
    508		IWL_DEBUG_HT(priv, "AGG stop before setup done\n");
    509		goto turn_off;
    510	case IWL_AGG_STARTING:
    511		/*
    512		 * This can happen when the session is stopped before
    513		 * we receive ADDBA response
    514		 */
    515		IWL_DEBUG_HT(priv, "AGG stop before AGG became operational\n");
    516		goto turn_off;
    517	case IWL_AGG_ON:
    518		break;
    519	default:
    520		IWL_WARN(priv,
    521			 "Stopping AGG while state not ON or starting for %d on %d (%d)\n",
    522			 sta_id, tid, tid_data->agg.state);
    523		spin_unlock_bh(&priv->sta_lock);
    524		return 0;
    525	}
    526
    527	tid_data->agg.ssn = IEEE80211_SEQ_TO_SN(tid_data->seq_number);
    528
    529	/* There are still packets for this RA / TID in the HW */
    530	if (!test_bit(txq_id, priv->agg_q_alloc)) {
    531		IWL_DEBUG_TX_QUEUES(priv,
    532			"stopping AGG on STA/TID %d/%d but hwq %d not used\n",
    533			sta_id, tid, txq_id);
    534	} else if (tid_data->agg.ssn != tid_data->next_reclaimed) {
    535		IWL_DEBUG_TX_QUEUES(priv,
    536				    "Can't proceed: ssn %d, next_recl = %d\n",
    537				    tid_data->agg.ssn,
    538				    tid_data->next_reclaimed);
    539		tid_data->agg.state = IWL_EMPTYING_HW_QUEUE_DELBA;
    540		spin_unlock_bh(&priv->sta_lock);
    541		return 0;
    542	}
    543
    544	IWL_DEBUG_TX_QUEUES(priv, "Can proceed: ssn = next_recl = %d\n",
    545			    tid_data->agg.ssn);
    546turn_off:
    547	agg_state = tid_data->agg.state;
    548	tid_data->agg.state = IWL_AGG_OFF;
    549
    550	spin_unlock_bh(&priv->sta_lock);
    551
    552	if (test_bit(txq_id, priv->agg_q_alloc)) {
    553		/*
    554		 * If the transport didn't know that we wanted to start
    555		 * agreggation, don't tell it that we want to stop them.
    556		 * This can happen when we don't get the addBA response on
    557		 * time, or we hadn't time to drain the AC queues.
    558		 */
    559		if (agg_state == IWL_AGG_ON)
    560			iwl_trans_txq_disable(priv->trans, txq_id, true);
    561		else
    562			IWL_DEBUG_TX_QUEUES(priv, "Don't disable tx agg: %d\n",
    563					    agg_state);
    564		iwlagn_dealloc_agg_txq(priv, txq_id);
    565	}
    566
    567	ieee80211_stop_tx_ba_cb_irqsafe(vif, sta->addr, tid);
    568
    569	return 0;
    570}
    571
    572int iwlagn_tx_agg_start(struct iwl_priv *priv, struct ieee80211_vif *vif,
    573			struct ieee80211_sta *sta, u16 tid, u16 *ssn)
    574{
    575	struct iwl_rxon_context *ctx = iwl_rxon_ctx_from_vif(vif);
    576	struct iwl_tid_data *tid_data;
    577	int sta_id, txq_id, ret;
    578
    579	IWL_DEBUG_HT(priv, "TX AGG request on ra = %pM tid = %d\n",
    580		     sta->addr, tid);
    581
    582	sta_id = iwl_sta_id(sta);
    583	if (sta_id == IWL_INVALID_STATION) {
    584		IWL_ERR(priv, "Start AGG on invalid station\n");
    585		return -ENXIO;
    586	}
    587	if (unlikely(tid >= IWL_MAX_TID_COUNT))
    588		return -EINVAL;
    589
    590	if (priv->tid_data[sta_id][tid].agg.state != IWL_AGG_OFF) {
    591		IWL_ERR(priv, "Start AGG when state is not IWL_AGG_OFF !\n");
    592		return -ENXIO;
    593	}
    594
    595	txq_id = iwlagn_alloc_agg_txq(priv, ctx->ac_to_queue[tid_to_ac[tid]]);
    596	if (txq_id < 0) {
    597		IWL_DEBUG_TX_QUEUES(priv,
    598			"No free aggregation queue for %pM/%d\n",
    599			sta->addr, tid);
    600		return txq_id;
    601	}
    602
    603	ret = iwl_sta_tx_modify_enable_tid(priv, sta_id, tid);
    604	if (ret)
    605		return ret;
    606
    607	spin_lock_bh(&priv->sta_lock);
    608	tid_data = &priv->tid_data[sta_id][tid];
    609	tid_data->agg.ssn = IEEE80211_SEQ_TO_SN(tid_data->seq_number);
    610	tid_data->agg.txq_id = txq_id;
    611
    612	*ssn = tid_data->agg.ssn;
    613
    614	if (*ssn == tid_data->next_reclaimed) {
    615		IWL_DEBUG_TX_QUEUES(priv, "Can proceed: ssn = next_recl = %d\n",
    616				    tid_data->agg.ssn);
    617		tid_data->agg.state = IWL_AGG_STARTING;
    618		ret = IEEE80211_AMPDU_TX_START_IMMEDIATE;
    619	} else {
    620		IWL_DEBUG_TX_QUEUES(priv, "Can't proceed: ssn %d, "
    621				    "next_reclaimed = %d\n",
    622				    tid_data->agg.ssn,
    623				    tid_data->next_reclaimed);
    624		tid_data->agg.state = IWL_EMPTYING_HW_QUEUE_ADDBA;
    625	}
    626	spin_unlock_bh(&priv->sta_lock);
    627
    628	return ret;
    629}
    630
    631int iwlagn_tx_agg_flush(struct iwl_priv *priv, struct ieee80211_vif *vif,
    632			struct ieee80211_sta *sta, u16 tid)
    633{
    634	struct iwl_tid_data *tid_data;
    635	enum iwl_agg_state agg_state;
    636	int sta_id, txq_id;
    637	sta_id = iwl_sta_id(sta);
    638
    639	/*
    640	 * First set the agg state to OFF to avoid calling
    641	 * ieee80211_stop_tx_ba_cb in iwlagn_check_ratid_empty.
    642	 */
    643	spin_lock_bh(&priv->sta_lock);
    644
    645	tid_data = &priv->tid_data[sta_id][tid];
    646	txq_id = tid_data->agg.txq_id;
    647	agg_state = tid_data->agg.state;
    648	IWL_DEBUG_TX_QUEUES(priv, "Flush AGG: sta %d tid %d q %d state %d\n",
    649			    sta_id, tid, txq_id, tid_data->agg.state);
    650
    651	tid_data->agg.state = IWL_AGG_OFF;
    652
    653	spin_unlock_bh(&priv->sta_lock);
    654
    655	if (iwlagn_txfifo_flush(priv, BIT(txq_id)))
    656		IWL_ERR(priv, "Couldn't flush the AGG queue\n");
    657
    658	if (test_bit(txq_id, priv->agg_q_alloc)) {
    659		/*
    660		 * If the transport didn't know that we wanted to start
    661		 * agreggation, don't tell it that we want to stop them.
    662		 * This can happen when we don't get the addBA response on
    663		 * time, or we hadn't time to drain the AC queues.
    664		 */
    665		if (agg_state == IWL_AGG_ON)
    666			iwl_trans_txq_disable(priv->trans, txq_id, true);
    667		else
    668			IWL_DEBUG_TX_QUEUES(priv, "Don't disable tx agg: %d\n",
    669					    agg_state);
    670		iwlagn_dealloc_agg_txq(priv, txq_id);
    671	}
    672
    673	return 0;
    674}
    675
    676int iwlagn_tx_agg_oper(struct iwl_priv *priv, struct ieee80211_vif *vif,
    677			struct ieee80211_sta *sta, u16 tid, u8 buf_size)
    678{
    679	struct iwl_station_priv *sta_priv = (void *) sta->drv_priv;
    680	struct iwl_rxon_context *ctx = iwl_rxon_ctx_from_vif(vif);
    681	int q, fifo;
    682	u16 ssn;
    683
    684	buf_size = min_t(int, buf_size, LINK_QUAL_AGG_FRAME_LIMIT_DEF);
    685
    686	spin_lock_bh(&priv->sta_lock);
    687	ssn = priv->tid_data[sta_priv->sta_id][tid].agg.ssn;
    688	q = priv->tid_data[sta_priv->sta_id][tid].agg.txq_id;
    689	priv->tid_data[sta_priv->sta_id][tid].agg.state = IWL_AGG_ON;
    690	spin_unlock_bh(&priv->sta_lock);
    691
    692	fifo = ctx->ac_to_fifo[tid_to_ac[tid]];
    693
    694	iwl_trans_txq_enable(priv->trans, q, fifo, sta_priv->sta_id, tid,
    695			     buf_size, ssn, 0);
    696
    697	/*
    698	 * If the limit is 0, then it wasn't initialised yet,
    699	 * use the default. We can do that since we take the
    700	 * minimum below, and we don't want to go above our
    701	 * default due to hardware restrictions.
    702	 */
    703	if (sta_priv->max_agg_bufsize == 0)
    704		sta_priv->max_agg_bufsize =
    705			LINK_QUAL_AGG_FRAME_LIMIT_DEF;
    706
    707	/*
    708	 * Even though in theory the peer could have different
    709	 * aggregation reorder buffer sizes for different sessions,
    710	 * our ucode doesn't allow for that and has a global limit
    711	 * for each station. Therefore, use the minimum of all the
    712	 * aggregation sessions and our default value.
    713	 */
    714	sta_priv->max_agg_bufsize =
    715		min(sta_priv->max_agg_bufsize, buf_size);
    716
    717	if (priv->hw_params.use_rts_for_aggregation) {
    718		/*
    719		 * switch to RTS/CTS if it is the prefer protection
    720		 * method for HT traffic
    721		 */
    722
    723		sta_priv->lq_sta.lq.general_params.flags |=
    724			LINK_QUAL_FLAGS_SET_STA_TLC_RTS_MSK;
    725	}
    726	priv->agg_tids_count++;
    727	IWL_DEBUG_HT(priv, "priv->agg_tids_count = %u\n",
    728		     priv->agg_tids_count);
    729
    730	sta_priv->lq_sta.lq.agg_params.agg_frame_cnt_limit =
    731		sta_priv->max_agg_bufsize;
    732
    733	IWL_DEBUG_HT(priv, "Tx aggregation enabled on ra = %pM tid = %d\n",
    734		 sta->addr, tid);
    735
    736	return iwl_send_lq_cmd(priv, ctx,
    737			&sta_priv->lq_sta.lq, CMD_ASYNC, false);
    738}
    739
    740static void iwlagn_check_ratid_empty(struct iwl_priv *priv, int sta_id, u8 tid)
    741{
    742	struct iwl_tid_data *tid_data = &priv->tid_data[sta_id][tid];
    743	enum iwl_rxon_context_id ctx;
    744	struct ieee80211_vif *vif;
    745	u8 *addr;
    746
    747	lockdep_assert_held(&priv->sta_lock);
    748
    749	addr = priv->stations[sta_id].sta.sta.addr;
    750	ctx = priv->stations[sta_id].ctxid;
    751	vif = priv->contexts[ctx].vif;
    752
    753	switch (priv->tid_data[sta_id][tid].agg.state) {
    754	case IWL_EMPTYING_HW_QUEUE_DELBA:
    755		/* There are no packets for this RA / TID in the HW any more */
    756		if (tid_data->agg.ssn == tid_data->next_reclaimed) {
    757			IWL_DEBUG_TX_QUEUES(priv,
    758				"Can continue DELBA flow ssn = next_recl = %d\n",
    759				tid_data->next_reclaimed);
    760			iwl_trans_txq_disable(priv->trans,
    761					      tid_data->agg.txq_id, true);
    762			iwlagn_dealloc_agg_txq(priv, tid_data->agg.txq_id);
    763			tid_data->agg.state = IWL_AGG_OFF;
    764			ieee80211_stop_tx_ba_cb_irqsafe(vif, addr, tid);
    765		}
    766		break;
    767	case IWL_EMPTYING_HW_QUEUE_ADDBA:
    768		/* There are no packets for this RA / TID in the HW any more */
    769		if (tid_data->agg.ssn == tid_data->next_reclaimed) {
    770			IWL_DEBUG_TX_QUEUES(priv,
    771				"Can continue ADDBA flow ssn = next_recl = %d\n",
    772				tid_data->next_reclaimed);
    773			tid_data->agg.state = IWL_AGG_STARTING;
    774			ieee80211_start_tx_ba_cb_irqsafe(vif, addr, tid);
    775		}
    776		break;
    777	default:
    778		break;
    779	}
    780}
    781
    782static void iwlagn_non_agg_tx_status(struct iwl_priv *priv,
    783				     struct iwl_rxon_context *ctx,
    784				     const u8 *addr1)
    785{
    786	struct ieee80211_sta *sta;
    787	struct iwl_station_priv *sta_priv;
    788
    789	rcu_read_lock();
    790	sta = ieee80211_find_sta(ctx->vif, addr1);
    791	if (sta) {
    792		sta_priv = (void *)sta->drv_priv;
    793		/* avoid atomic ops if this isn't a client */
    794		if (sta_priv->client &&
    795		    atomic_dec_return(&sta_priv->pending_frames) == 0)
    796			ieee80211_sta_block_awake(priv->hw, sta, false);
    797	}
    798	rcu_read_unlock();
    799}
    800
    801/*
    802 * translate ucode response to mac80211 tx status control values
    803 */
    804static void iwlagn_hwrate_to_tx_control(struct iwl_priv *priv, u32 rate_n_flags,
    805				  struct ieee80211_tx_info *info)
    806{
    807	struct ieee80211_tx_rate *r = &info->status.rates[0];
    808
    809	info->status.antenna =
    810		((rate_n_flags & RATE_MCS_ANT_ABC_MSK) >> RATE_MCS_ANT_POS);
    811	if (rate_n_flags & RATE_MCS_HT_MSK)
    812		r->flags |= IEEE80211_TX_RC_MCS;
    813	if (rate_n_flags & RATE_MCS_GF_MSK)
    814		r->flags |= IEEE80211_TX_RC_GREEN_FIELD;
    815	if (rate_n_flags & RATE_MCS_HT40_MSK)
    816		r->flags |= IEEE80211_TX_RC_40_MHZ_WIDTH;
    817	if (rate_n_flags & RATE_MCS_DUP_MSK)
    818		r->flags |= IEEE80211_TX_RC_DUP_DATA;
    819	if (rate_n_flags & RATE_MCS_SGI_MSK)
    820		r->flags |= IEEE80211_TX_RC_SHORT_GI;
    821	r->idx = iwlagn_hwrate_to_mac80211_idx(rate_n_flags, info->band);
    822}
    823
    824#ifdef CONFIG_IWLWIFI_DEBUG
    825const char *iwl_get_tx_fail_reason(u32 status)
    826{
    827#define TX_STATUS_FAIL(x) case TX_STATUS_FAIL_ ## x: return #x
    828#define TX_STATUS_POSTPONE(x) case TX_STATUS_POSTPONE_ ## x: return #x
    829
    830	switch (status & TX_STATUS_MSK) {
    831	case TX_STATUS_SUCCESS:
    832		return "SUCCESS";
    833	TX_STATUS_POSTPONE(DELAY);
    834	TX_STATUS_POSTPONE(FEW_BYTES);
    835	TX_STATUS_POSTPONE(BT_PRIO);
    836	TX_STATUS_POSTPONE(QUIET_PERIOD);
    837	TX_STATUS_POSTPONE(CALC_TTAK);
    838	TX_STATUS_FAIL(INTERNAL_CROSSED_RETRY);
    839	TX_STATUS_FAIL(SHORT_LIMIT);
    840	TX_STATUS_FAIL(LONG_LIMIT);
    841	TX_STATUS_FAIL(FIFO_UNDERRUN);
    842	TX_STATUS_FAIL(DRAIN_FLOW);
    843	TX_STATUS_FAIL(RFKILL_FLUSH);
    844	TX_STATUS_FAIL(LIFE_EXPIRE);
    845	TX_STATUS_FAIL(DEST_PS);
    846	TX_STATUS_FAIL(HOST_ABORTED);
    847	TX_STATUS_FAIL(BT_RETRY);
    848	TX_STATUS_FAIL(STA_INVALID);
    849	TX_STATUS_FAIL(FRAG_DROPPED);
    850	TX_STATUS_FAIL(TID_DISABLE);
    851	TX_STATUS_FAIL(FIFO_FLUSHED);
    852	TX_STATUS_FAIL(INSUFFICIENT_CF_POLL);
    853	TX_STATUS_FAIL(PASSIVE_NO_RX);
    854	TX_STATUS_FAIL(NO_BEACON_ON_RADAR);
    855	}
    856
    857	return "UNKNOWN";
    858
    859#undef TX_STATUS_FAIL
    860#undef TX_STATUS_POSTPONE
    861}
    862#endif /* CONFIG_IWLWIFI_DEBUG */
    863
    864static void iwlagn_count_agg_tx_err_status(struct iwl_priv *priv, u16 status)
    865{
    866	status &= AGG_TX_STATUS_MSK;
    867
    868	switch (status) {
    869	case AGG_TX_STATE_UNDERRUN_MSK:
    870		priv->reply_agg_tx_stats.underrun++;
    871		break;
    872	case AGG_TX_STATE_BT_PRIO_MSK:
    873		priv->reply_agg_tx_stats.bt_prio++;
    874		break;
    875	case AGG_TX_STATE_FEW_BYTES_MSK:
    876		priv->reply_agg_tx_stats.few_bytes++;
    877		break;
    878	case AGG_TX_STATE_ABORT_MSK:
    879		priv->reply_agg_tx_stats.abort++;
    880		break;
    881	case AGG_TX_STATE_LAST_SENT_TTL_MSK:
    882		priv->reply_agg_tx_stats.last_sent_ttl++;
    883		break;
    884	case AGG_TX_STATE_LAST_SENT_TRY_CNT_MSK:
    885		priv->reply_agg_tx_stats.last_sent_try++;
    886		break;
    887	case AGG_TX_STATE_LAST_SENT_BT_KILL_MSK:
    888		priv->reply_agg_tx_stats.last_sent_bt_kill++;
    889		break;
    890	case AGG_TX_STATE_SCD_QUERY_MSK:
    891		priv->reply_agg_tx_stats.scd_query++;
    892		break;
    893	case AGG_TX_STATE_TEST_BAD_CRC32_MSK:
    894		priv->reply_agg_tx_stats.bad_crc32++;
    895		break;
    896	case AGG_TX_STATE_RESPONSE_MSK:
    897		priv->reply_agg_tx_stats.response++;
    898		break;
    899	case AGG_TX_STATE_DUMP_TX_MSK:
    900		priv->reply_agg_tx_stats.dump_tx++;
    901		break;
    902	case AGG_TX_STATE_DELAY_TX_MSK:
    903		priv->reply_agg_tx_stats.delay_tx++;
    904		break;
    905	default:
    906		priv->reply_agg_tx_stats.unknown++;
    907		break;
    908	}
    909}
    910
    911static inline u32 iwlagn_get_scd_ssn(struct iwlagn_tx_resp *tx_resp)
    912{
    913	return le32_to_cpup((__le32 *)&tx_resp->status +
    914			    tx_resp->frame_count) & IEEE80211_MAX_SN;
    915}
    916
    917static void iwl_rx_reply_tx_agg(struct iwl_priv *priv,
    918				struct iwlagn_tx_resp *tx_resp)
    919{
    920	struct agg_tx_status *frame_status = &tx_resp->status;
    921	int tid = (tx_resp->ra_tid & IWLAGN_TX_RES_TID_MSK) >>
    922		IWLAGN_TX_RES_TID_POS;
    923	int sta_id = (tx_resp->ra_tid & IWLAGN_TX_RES_RA_MSK) >>
    924		IWLAGN_TX_RES_RA_POS;
    925	struct iwl_ht_agg *agg = &priv->tid_data[sta_id][tid].agg;
    926	u32 status = le16_to_cpu(tx_resp->status.status);
    927	int i;
    928
    929	WARN_ON(tid == IWL_TID_NON_QOS);
    930
    931	if (agg->wait_for_ba)
    932		IWL_DEBUG_TX_REPLY(priv,
    933			"got tx response w/o block-ack\n");
    934
    935	agg->rate_n_flags = le32_to_cpu(tx_resp->rate_n_flags);
    936	agg->wait_for_ba = (tx_resp->frame_count > 1);
    937
    938	/*
    939	 * If the BT kill count is non-zero, we'll get this
    940	 * notification again.
    941	 */
    942	if (tx_resp->bt_kill_count && tx_resp->frame_count == 1 &&
    943	    priv->lib->bt_params &&
    944	    priv->lib->bt_params->advanced_bt_coexist) {
    945		IWL_DEBUG_COEX(priv, "receive reply tx w/ bt_kill\n");
    946	}
    947
    948	if (tx_resp->frame_count == 1)
    949		return;
    950
    951	IWL_DEBUG_TX_REPLY(priv, "TXQ %d initial_rate 0x%x ssn %d frm_cnt %d\n",
    952			   agg->txq_id,
    953			   le32_to_cpu(tx_resp->rate_n_flags),
    954			   iwlagn_get_scd_ssn(tx_resp), tx_resp->frame_count);
    955
    956	/* Construct bit-map of pending frames within Tx window */
    957	for (i = 0; i < tx_resp->frame_count; i++) {
    958		u16 fstatus = le16_to_cpu(frame_status[i].status);
    959		u8 retry_cnt = (fstatus & AGG_TX_TRY_MSK) >> AGG_TX_TRY_POS;
    960
    961		if (status & AGG_TX_STATUS_MSK)
    962			iwlagn_count_agg_tx_err_status(priv, fstatus);
    963
    964		if (status & (AGG_TX_STATE_FEW_BYTES_MSK |
    965			      AGG_TX_STATE_ABORT_MSK))
    966			continue;
    967
    968		if (status & AGG_TX_STATUS_MSK || retry_cnt > 1)
    969			IWL_DEBUG_TX_REPLY(priv,
    970					   "%d: status %s (0x%04x), try-count (0x%01x)\n",
    971					   i,
    972					   iwl_get_agg_tx_fail_reason(fstatus),
    973					   fstatus & AGG_TX_STATUS_MSK,
    974					   retry_cnt);
    975	}
    976}
    977
    978#ifdef CONFIG_IWLWIFI_DEBUG
    979#define AGG_TX_STATE_FAIL(x) case AGG_TX_STATE_ ## x: return #x
    980
    981const char *iwl_get_agg_tx_fail_reason(u16 status)
    982{
    983	status &= AGG_TX_STATUS_MSK;
    984	switch (status) {
    985	case AGG_TX_STATE_TRANSMITTED:
    986		return "SUCCESS";
    987		AGG_TX_STATE_FAIL(UNDERRUN_MSK);
    988		AGG_TX_STATE_FAIL(BT_PRIO_MSK);
    989		AGG_TX_STATE_FAIL(FEW_BYTES_MSK);
    990		AGG_TX_STATE_FAIL(ABORT_MSK);
    991		AGG_TX_STATE_FAIL(LAST_SENT_TTL_MSK);
    992		AGG_TX_STATE_FAIL(LAST_SENT_TRY_CNT_MSK);
    993		AGG_TX_STATE_FAIL(LAST_SENT_BT_KILL_MSK);
    994		AGG_TX_STATE_FAIL(SCD_QUERY_MSK);
    995		AGG_TX_STATE_FAIL(TEST_BAD_CRC32_MSK);
    996		AGG_TX_STATE_FAIL(RESPONSE_MSK);
    997		AGG_TX_STATE_FAIL(DUMP_TX_MSK);
    998		AGG_TX_STATE_FAIL(DELAY_TX_MSK);
    999	}
   1000
   1001	return "UNKNOWN";
   1002}
   1003#endif /* CONFIG_IWLWIFI_DEBUG */
   1004
   1005static void iwlagn_count_tx_err_status(struct iwl_priv *priv, u16 status)
   1006{
   1007	status &= TX_STATUS_MSK;
   1008
   1009	switch (status) {
   1010	case TX_STATUS_POSTPONE_DELAY:
   1011		priv->reply_tx_stats.pp_delay++;
   1012		break;
   1013	case TX_STATUS_POSTPONE_FEW_BYTES:
   1014		priv->reply_tx_stats.pp_few_bytes++;
   1015		break;
   1016	case TX_STATUS_POSTPONE_BT_PRIO:
   1017		priv->reply_tx_stats.pp_bt_prio++;
   1018		break;
   1019	case TX_STATUS_POSTPONE_QUIET_PERIOD:
   1020		priv->reply_tx_stats.pp_quiet_period++;
   1021		break;
   1022	case TX_STATUS_POSTPONE_CALC_TTAK:
   1023		priv->reply_tx_stats.pp_calc_ttak++;
   1024		break;
   1025	case TX_STATUS_FAIL_INTERNAL_CROSSED_RETRY:
   1026		priv->reply_tx_stats.int_crossed_retry++;
   1027		break;
   1028	case TX_STATUS_FAIL_SHORT_LIMIT:
   1029		priv->reply_tx_stats.short_limit++;
   1030		break;
   1031	case TX_STATUS_FAIL_LONG_LIMIT:
   1032		priv->reply_tx_stats.long_limit++;
   1033		break;
   1034	case TX_STATUS_FAIL_FIFO_UNDERRUN:
   1035		priv->reply_tx_stats.fifo_underrun++;
   1036		break;
   1037	case TX_STATUS_FAIL_DRAIN_FLOW:
   1038		priv->reply_tx_stats.drain_flow++;
   1039		break;
   1040	case TX_STATUS_FAIL_RFKILL_FLUSH:
   1041		priv->reply_tx_stats.rfkill_flush++;
   1042		break;
   1043	case TX_STATUS_FAIL_LIFE_EXPIRE:
   1044		priv->reply_tx_stats.life_expire++;
   1045		break;
   1046	case TX_STATUS_FAIL_DEST_PS:
   1047		priv->reply_tx_stats.dest_ps++;
   1048		break;
   1049	case TX_STATUS_FAIL_HOST_ABORTED:
   1050		priv->reply_tx_stats.host_abort++;
   1051		break;
   1052	case TX_STATUS_FAIL_BT_RETRY:
   1053		priv->reply_tx_stats.bt_retry++;
   1054		break;
   1055	case TX_STATUS_FAIL_STA_INVALID:
   1056		priv->reply_tx_stats.sta_invalid++;
   1057		break;
   1058	case TX_STATUS_FAIL_FRAG_DROPPED:
   1059		priv->reply_tx_stats.frag_drop++;
   1060		break;
   1061	case TX_STATUS_FAIL_TID_DISABLE:
   1062		priv->reply_tx_stats.tid_disable++;
   1063		break;
   1064	case TX_STATUS_FAIL_FIFO_FLUSHED:
   1065		priv->reply_tx_stats.fifo_flush++;
   1066		break;
   1067	case TX_STATUS_FAIL_INSUFFICIENT_CF_POLL:
   1068		priv->reply_tx_stats.insuff_cf_poll++;
   1069		break;
   1070	case TX_STATUS_FAIL_PASSIVE_NO_RX:
   1071		priv->reply_tx_stats.fail_hw_drop++;
   1072		break;
   1073	case TX_STATUS_FAIL_NO_BEACON_ON_RADAR:
   1074		priv->reply_tx_stats.sta_color_mismatch++;
   1075		break;
   1076	default:
   1077		priv->reply_tx_stats.unknown++;
   1078		break;
   1079	}
   1080}
   1081
   1082static void iwlagn_set_tx_status(struct iwl_priv *priv,
   1083				 struct ieee80211_tx_info *info,
   1084				 struct iwlagn_tx_resp *tx_resp)
   1085{
   1086	u16 status = le16_to_cpu(tx_resp->status.status);
   1087
   1088	info->flags &= ~IEEE80211_TX_CTL_AMPDU;
   1089
   1090	info->status.rates[0].count = tx_resp->failure_frame + 1;
   1091	info->flags |= iwl_tx_status_to_mac80211(status);
   1092	iwlagn_hwrate_to_tx_control(priv, le32_to_cpu(tx_resp->rate_n_flags),
   1093				    info);
   1094	if (!iwl_is_tx_success(status))
   1095		iwlagn_count_tx_err_status(priv, status);
   1096}
   1097
   1098static void iwl_check_abort_status(struct iwl_priv *priv,
   1099			    u8 frame_count, u32 status)
   1100{
   1101	if (frame_count == 1 && status == TX_STATUS_FAIL_RFKILL_FLUSH) {
   1102		IWL_ERR(priv, "Tx flush command to flush out all frames\n");
   1103		if (!test_bit(STATUS_EXIT_PENDING, &priv->status))
   1104			queue_work(priv->workqueue, &priv->tx_flush);
   1105	}
   1106}
   1107
   1108void iwlagn_rx_reply_tx(struct iwl_priv *priv, struct iwl_rx_cmd_buffer *rxb)
   1109{
   1110	struct iwl_rx_packet *pkt = rxb_addr(rxb);
   1111	u16 sequence = le16_to_cpu(pkt->hdr.sequence);
   1112	int txq_id = SEQ_TO_QUEUE(sequence);
   1113	int cmd_index __maybe_unused = SEQ_TO_INDEX(sequence);
   1114	struct iwlagn_tx_resp *tx_resp = (void *)pkt->data;
   1115	struct ieee80211_hdr *hdr;
   1116	u32 status = le16_to_cpu(tx_resp->status.status);
   1117	u16 ssn = iwlagn_get_scd_ssn(tx_resp);
   1118	int tid;
   1119	int sta_id;
   1120	int freed;
   1121	struct ieee80211_tx_info *info;
   1122	struct sk_buff_head skbs;
   1123	struct sk_buff *skb;
   1124	struct iwl_rxon_context *ctx;
   1125	bool is_agg = (txq_id >= IWLAGN_FIRST_AMPDU_QUEUE);
   1126
   1127	tid = (tx_resp->ra_tid & IWLAGN_TX_RES_TID_MSK) >>
   1128		IWLAGN_TX_RES_TID_POS;
   1129	sta_id = (tx_resp->ra_tid & IWLAGN_TX_RES_RA_MSK) >>
   1130		IWLAGN_TX_RES_RA_POS;
   1131
   1132	spin_lock_bh(&priv->sta_lock);
   1133
   1134	if (is_agg) {
   1135		WARN_ON_ONCE(sta_id >= IWLAGN_STATION_COUNT ||
   1136			     tid >= IWL_MAX_TID_COUNT);
   1137		if (txq_id != priv->tid_data[sta_id][tid].agg.txq_id)
   1138			IWL_ERR(priv, "txq_id mismatch: %d %d\n", txq_id,
   1139				priv->tid_data[sta_id][tid].agg.txq_id);
   1140		iwl_rx_reply_tx_agg(priv, tx_resp);
   1141	}
   1142
   1143	__skb_queue_head_init(&skbs);
   1144
   1145	if (tx_resp->frame_count == 1) {
   1146		u16 next_reclaimed = le16_to_cpu(tx_resp->seq_ctl);
   1147		next_reclaimed = IEEE80211_SEQ_TO_SN(next_reclaimed + 0x10);
   1148
   1149		if (is_agg) {
   1150			/* If this is an aggregation queue, we can rely on the
   1151			 * ssn since the wifi sequence number corresponds to
   1152			 * the index in the TFD ring (%256).
   1153			 * The seq_ctl is the sequence control of the packet
   1154			 * to which this Tx response relates. But if there is a
   1155			 * hole in the bitmap of the BA we received, this Tx
   1156			 * response may allow to reclaim the hole and all the
   1157			 * subsequent packets that were already acked.
   1158			 * In that case, seq_ctl != ssn, and the next packet
   1159			 * to be reclaimed will be ssn and not seq_ctl.
   1160			 */
   1161			next_reclaimed = ssn;
   1162		}
   1163
   1164		if (tid != IWL_TID_NON_QOS) {
   1165			priv->tid_data[sta_id][tid].next_reclaimed =
   1166				next_reclaimed;
   1167			IWL_DEBUG_TX_REPLY(priv, "Next reclaimed packet:%d\n",
   1168						  next_reclaimed);
   1169			iwlagn_check_ratid_empty(priv, sta_id, tid);
   1170		}
   1171
   1172		iwl_trans_reclaim(priv->trans, txq_id, ssn, &skbs);
   1173
   1174		freed = 0;
   1175
   1176		/* process frames */
   1177		skb_queue_walk(&skbs, skb) {
   1178			hdr = (struct ieee80211_hdr *)skb->data;
   1179
   1180			if (!ieee80211_is_data_qos(hdr->frame_control))
   1181				priv->last_seq_ctl = tx_resp->seq_ctl;
   1182
   1183			info = IEEE80211_SKB_CB(skb);
   1184			ctx = info->driver_data[0];
   1185			iwl_trans_free_tx_cmd(priv->trans,
   1186					      info->driver_data[1]);
   1187
   1188			memset(&info->status, 0, sizeof(info->status));
   1189
   1190			if (status == TX_STATUS_FAIL_PASSIVE_NO_RX &&
   1191			    ctx->vif &&
   1192			    ctx->vif->type == NL80211_IFTYPE_STATION) {
   1193				/* block and stop all queues */
   1194				priv->passive_no_rx = true;
   1195				IWL_DEBUG_TX_QUEUES(priv,
   1196					"stop all queues: passive channel\n");
   1197				ieee80211_stop_queues(priv->hw);
   1198
   1199				IWL_DEBUG_TX_REPLY(priv,
   1200					   "TXQ %d status %s (0x%08x) "
   1201					   "rate_n_flags 0x%x retries %d\n",
   1202					   txq_id,
   1203					   iwl_get_tx_fail_reason(status),
   1204					   status,
   1205					   le32_to_cpu(tx_resp->rate_n_flags),
   1206					   tx_resp->failure_frame);
   1207
   1208				IWL_DEBUG_TX_REPLY(priv,
   1209					   "FrameCnt = %d, idx=%d\n",
   1210					   tx_resp->frame_count, cmd_index);
   1211			}
   1212
   1213			/* check if BAR is needed */
   1214			if (is_agg && !iwl_is_tx_success(status))
   1215				info->flags |= IEEE80211_TX_STAT_AMPDU_NO_BACK;
   1216			iwlagn_set_tx_status(priv, IEEE80211_SKB_CB(skb),
   1217				     tx_resp);
   1218			if (!is_agg)
   1219				iwlagn_non_agg_tx_status(priv, ctx, hdr->addr1);
   1220
   1221			freed++;
   1222		}
   1223
   1224		if (tid != IWL_TID_NON_QOS) {
   1225			priv->tid_data[sta_id][tid].next_reclaimed =
   1226				next_reclaimed;
   1227			IWL_DEBUG_TX_REPLY(priv, "Next reclaimed packet:%d\n",
   1228					   next_reclaimed);
   1229		}
   1230
   1231		if (!is_agg && freed != 1)
   1232			IWL_ERR(priv, "Q: %d, freed %d\n", txq_id, freed);
   1233
   1234		IWL_DEBUG_TX_REPLY(priv, "TXQ %d status %s (0x%08x)\n", txq_id,
   1235				   iwl_get_tx_fail_reason(status), status);
   1236
   1237		IWL_DEBUG_TX_REPLY(priv,
   1238				   "\t\t\t\tinitial_rate 0x%x retries %d, idx=%d ssn=%d seq_ctl=0x%x\n",
   1239				   le32_to_cpu(tx_resp->rate_n_flags),
   1240				   tx_resp->failure_frame,
   1241				   SEQ_TO_INDEX(sequence), ssn,
   1242				   le16_to_cpu(tx_resp->seq_ctl));
   1243	}
   1244
   1245	iwl_check_abort_status(priv, tx_resp->frame_count, status);
   1246	spin_unlock_bh(&priv->sta_lock);
   1247
   1248	while (!skb_queue_empty(&skbs)) {
   1249		skb = __skb_dequeue(&skbs);
   1250		ieee80211_tx_status(priv->hw, skb);
   1251	}
   1252}
   1253
   1254/*
   1255 * iwlagn_rx_reply_compressed_ba - Handler for REPLY_COMPRESSED_BA
   1256 *
   1257 * Handles block-acknowledge notification from device, which reports success
   1258 * of frames sent via aggregation.
   1259 */
   1260void iwlagn_rx_reply_compressed_ba(struct iwl_priv *priv,
   1261				   struct iwl_rx_cmd_buffer *rxb)
   1262{
   1263	struct iwl_rx_packet *pkt = rxb_addr(rxb);
   1264	struct iwl_compressed_ba_resp *ba_resp = (void *)pkt->data;
   1265	struct iwl_ht_agg *agg;
   1266	struct sk_buff_head reclaimed_skbs;
   1267	struct sk_buff *skb;
   1268	int sta_id;
   1269	int tid;
   1270	int freed;
   1271
   1272	/* "flow" corresponds to Tx queue */
   1273	u16 scd_flow = le16_to_cpu(ba_resp->scd_flow);
   1274
   1275	/* "ssn" is start of block-ack Tx window, corresponds to index
   1276	 * (in Tx queue's circular buffer) of first TFD/frame in window */
   1277	u16 ba_resp_scd_ssn = le16_to_cpu(ba_resp->scd_ssn);
   1278
   1279	if (scd_flow >= priv->trans->trans_cfg->base_params->num_of_queues) {
   1280		IWL_ERR(priv,
   1281			"BUG_ON scd_flow is bigger than number of queues\n");
   1282		return;
   1283	}
   1284
   1285	sta_id = ba_resp->sta_id;
   1286	tid = ba_resp->tid;
   1287	agg = &priv->tid_data[sta_id][tid].agg;
   1288
   1289	spin_lock_bh(&priv->sta_lock);
   1290
   1291	if (unlikely(!agg->wait_for_ba)) {
   1292		if (unlikely(ba_resp->bitmap))
   1293			IWL_ERR(priv, "Received BA when not expected\n");
   1294		spin_unlock_bh(&priv->sta_lock);
   1295		return;
   1296	}
   1297
   1298	if (unlikely(scd_flow != agg->txq_id)) {
   1299		/*
   1300		 * FIXME: this is a uCode bug which need to be addressed,
   1301		 * log the information and return for now.
   1302		 * Since it is can possibly happen very often and in order
   1303		 * not to fill the syslog, don't use IWL_ERR or IWL_WARN
   1304		 */
   1305		IWL_DEBUG_TX_QUEUES(priv,
   1306				    "Bad queue mapping txq_id=%d, agg_txq[sta:%d,tid:%d]=%d\n",
   1307				    scd_flow, sta_id, tid, agg->txq_id);
   1308		spin_unlock_bh(&priv->sta_lock);
   1309		return;
   1310	}
   1311
   1312	__skb_queue_head_init(&reclaimed_skbs);
   1313
   1314	/* Release all TFDs before the SSN, i.e. all TFDs in front of
   1315	 * block-ack window (we assume that they've been successfully
   1316	 * transmitted ... if not, it's too late anyway). */
   1317	iwl_trans_reclaim(priv->trans, scd_flow, ba_resp_scd_ssn,
   1318			  &reclaimed_skbs);
   1319
   1320	IWL_DEBUG_TX_REPLY(priv, "REPLY_COMPRESSED_BA [%d] Received from %pM, "
   1321			   "sta_id = %d\n",
   1322			   agg->wait_for_ba,
   1323			   (u8 *) &ba_resp->sta_addr_lo32,
   1324			   ba_resp->sta_id);
   1325	IWL_DEBUG_TX_REPLY(priv, "TID = %d, SeqCtl = %d, bitmap = 0x%llx, "
   1326			   "scd_flow = %d, scd_ssn = %d sent:%d, acked:%d\n",
   1327			   ba_resp->tid, le16_to_cpu(ba_resp->seq_ctl),
   1328			   (unsigned long long)le64_to_cpu(ba_resp->bitmap),
   1329			   scd_flow, ba_resp_scd_ssn, ba_resp->txed,
   1330			   ba_resp->txed_2_done);
   1331
   1332	/* Mark that the expected block-ack response arrived */
   1333	agg->wait_for_ba = false;
   1334
   1335	/* Sanity check values reported by uCode */
   1336	if (ba_resp->txed_2_done > ba_resp->txed) {
   1337		IWL_DEBUG_TX_REPLY(priv,
   1338			"bogus sent(%d) and ack(%d) count\n",
   1339			ba_resp->txed, ba_resp->txed_2_done);
   1340		/*
   1341		 * set txed_2_done = txed,
   1342		 * so it won't impact rate scale
   1343		 */
   1344		ba_resp->txed = ba_resp->txed_2_done;
   1345	}
   1346
   1347	priv->tid_data[sta_id][tid].next_reclaimed = ba_resp_scd_ssn;
   1348
   1349	iwlagn_check_ratid_empty(priv, sta_id, tid);
   1350	freed = 0;
   1351
   1352	skb_queue_walk(&reclaimed_skbs, skb) {
   1353		struct ieee80211_hdr *hdr = (void *)skb->data;
   1354		struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
   1355
   1356		if (ieee80211_is_data_qos(hdr->frame_control))
   1357			freed++;
   1358		else
   1359			WARN_ON_ONCE(1);
   1360
   1361		iwl_trans_free_tx_cmd(priv->trans, info->driver_data[1]);
   1362
   1363		memset(&info->status, 0, sizeof(info->status));
   1364		/* Packet was transmitted successfully, failures come as single
   1365		 * frames because before failing a frame the firmware transmits
   1366		 * it without aggregation at least once.
   1367		 */
   1368		info->flags |= IEEE80211_TX_STAT_ACK;
   1369
   1370		if (freed == 1) {
   1371			/* this is the first skb we deliver in this batch */
   1372			/* put the rate scaling data there */
   1373			info = IEEE80211_SKB_CB(skb);
   1374			memset(&info->status, 0, sizeof(info->status));
   1375			info->flags |= IEEE80211_TX_STAT_AMPDU;
   1376			info->status.ampdu_ack_len = ba_resp->txed_2_done;
   1377			info->status.ampdu_len = ba_resp->txed;
   1378			iwlagn_hwrate_to_tx_control(priv, agg->rate_n_flags,
   1379						    info);
   1380		}
   1381	}
   1382
   1383	spin_unlock_bh(&priv->sta_lock);
   1384
   1385	while (!skb_queue_empty(&reclaimed_skbs)) {
   1386		skb = __skb_dequeue(&reclaimed_skbs);
   1387		ieee80211_tx_status(priv->hw, skb);
   1388	}
   1389}