linux/drivers/net/wireless/intel/iwlwifi/dvm/tx.c
<<
>>
Prefs
   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}
1390