tx.c 52.9 KB
Newer Older
1
/******************************************************************************
2 3 4 5 6
 *
 * This file is provided under a dual BSD/GPLv2 license.  When using or
 * redistributing this file, you may do so under either license.
 *
 * GPL LICENSE SUMMARY
7
 *
8
 * Copyright(c) 2003 - 2014 Intel Corporation. All rights reserved.
9
 * Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH
10
 * Copyright(c) 2016 - 2017 Intel Deutschland GmbH
11
 * Copyright(c) 2018 - 2020 Intel Corporation
12 13 14 15 16 17 18 19 20 21 22
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of version 2 of the GNU General Public License as
 * published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
 * more details.
 *
 * The full GNU General Public License is included in this distribution in the
23
 * file called COPYING.
24 25
 *
 * Contact Information:
26
 *  Intel Linux Wireless <linuxwifi@intel.com>
27 28
 * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
 *
29 30 31 32 33
 * BSD LICENSE
 *
 * Copyright(c) 2003 - 2014 Intel Corporation. All rights reserved.
 * Copyright(c) 2013 - 2015 Intel Mobile Communications GmbH
 * Copyright(c) 2016 - 2017 Intel Deutschland GmbH
34
 * Copyright(c) 2018 - 2020 Intel Corporation
35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 *  * Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *  * Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 *  * Neither the name Intel Corporation nor the names of its
 *    contributors may be used to endorse or promote products derived
 *    from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
63
 *****************************************************************************/
64
#include <linux/etherdevice.h>
65
#include <linux/ieee80211.h>
66
#include <linux/slab.h>
67
#include <linux/sched.h>
68 69
#include <net/ip6_checksum.h>
#include <net/tso.h>
70

71 72 73
#include "iwl-debug.h"
#include "iwl-csr.h"
#include "iwl-prph.h"
74
#include "iwl-io.h"
75
#include "iwl-scd.h"
76
#include "iwl-op-mode.h"
77
#include "internal.h"
J
Johannes Berg 已提交
78
#include "fw/api/tx.h"
79

80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
/*************** DMA-QUEUE-GENERAL-FUNCTIONS  *****
 * DMA services
 *
 * Theory of operation
 *
 * A Tx or Rx queue resides in host DRAM, and is comprised of a circular buffer
 * of buffer descriptors, each of which points to one or more data buffers for
 * the device to read from or fill.  Driver and device exchange status of each
 * queue via "read" and "write" pointers.  Driver keeps minimum of 2 empty
 * entries in each circular buffer, to protect against confusing empty and full
 * queue states.
 *
 * The device reads or writes the data in the queues via the device's several
 * DMA/FIFO channels.  Each queue is mapped to a single DMA channel.
 *
 * For Tx queue, there are low mark and high mark limits. If, after queuing
 * the packet for Tx, free space become < low mark, Tx queue stopped. When
 * reclaiming packets (on 'tx done IRQ), if free space become > high mark,
 * Tx queue resumed.
 *
 ***************************************************/
101

102

103 104
int iwl_pcie_alloc_dma_ptr(struct iwl_trans *trans,
			   struct iwl_dma_ptr *ptr, size_t size)
105 106 107 108 109 110 111 112 113 114 115 116
{
	if (WARN_ON(ptr->addr))
		return -EINVAL;

	ptr->addr = dma_alloc_coherent(trans->dev, size,
				       &ptr->dma, GFP_KERNEL);
	if (!ptr->addr)
		return -ENOMEM;
	ptr->size = size;
	return 0;
}

117
void iwl_pcie_free_dma_ptr(struct iwl_trans *trans, struct iwl_dma_ptr *ptr)
118 119 120 121 122 123 124 125
{
	if (unlikely(!ptr->addr))
		return;

	dma_free_coherent(trans->dev, ptr->size, ptr->addr, ptr->dma);
	memset(ptr, 0, sizeof(*ptr));
}

126 127
/*
 * iwl_pcie_txq_inc_wr_ptr - Send new write index to hardware
128
 */
129 130
static void iwl_pcie_txq_inc_wr_ptr(struct iwl_trans *trans,
				    struct iwl_txq *txq)
131 132
{
	u32 reg = 0;
133
	int txq_id = txq->id;
134

135
	lockdep_assert_held(&txq->lock);
136

137 138 139 140 141 142
	/*
	 * explicitly wake up the NIC if:
	 * 1. shadow registers aren't enabled
	 * 2. NIC is woken up for CMD regardless of shadow outside this function
	 * 3. there is a chance that the NIC is asleep
	 */
143
	if (!trans->trans_cfg->base_params->shadow_reg_enable &&
144
	    txq_id != trans->txqs.cmd.q_id &&
145
	    test_bit(STATUS_TPOWER_PMI, &trans->status)) {
W
Wey-Yi Guy 已提交
146
		/*
147 148 149
		 * wake up nic if it's powered down ...
		 * uCode will wake up, and interrupt us again, so next
		 * time we'll skip this part.
W
Wey-Yi Guy 已提交
150
		 */
151 152 153 154 155 156
		reg = iwl_read32(trans, CSR_UCODE_DRV_GP1);

		if (reg & CSR_UCODE_DRV_GP1_BIT_MAC_SLEEP) {
			IWL_DEBUG_INFO(trans, "Tx queue %d requesting wakeup, GP1 = 0x%x\n",
				       txq_id, reg);
			iwl_set_bit(trans, CSR_GP_CNTRL,
157
				    CSR_GP_CNTRL_REG_FLAG_MAC_ACCESS_REQ);
158
			txq->need_update = true;
159 160
			return;
		}
W
Wey-Yi Guy 已提交
161
	}
162 163 164 165 166

	/*
	 * if not in power-save mode, uCode will never sleep when we're
	 * trying to tx (during RFKILL, we're not trying to tx).
	 */
167
	IWL_DEBUG_TX(trans, "Q:%d WR: 0x%x\n", txq_id, txq->write_ptr);
168 169
	if (!txq->block)
		iwl_write32(trans, HBUS_TARG_WRPTR,
170
			    txq->write_ptr | (txq_id << 8));
171
}
172

173 174 175 176
void iwl_pcie_txq_check_wrptrs(struct iwl_trans *trans)
{
	int i;

177
	for (i = 0; i < trans->trans_cfg->base_params->num_of_queues; i++) {
178
		struct iwl_txq *txq = trans->txqs.txq[i];
179

180
		if (!test_bit(i, trans->txqs.queue_used))
181 182
			continue;

183
		spin_lock_bh(&txq->lock);
184
		if (txq->need_update) {
185
			iwl_pcie_txq_inc_wr_ptr(trans, txq);
186
			txq->need_update = false;
187
		}
188
		spin_unlock_bh(&txq->lock);
189
	}
190 191
}

192 193
static inline void iwl_pcie_tfd_set_tb(struct iwl_trans *trans, void *tfd,
				       u8 idx, dma_addr_t addr, u16 len)
J
Johannes Berg 已提交
194
{
195 196
	struct iwl_tfd *tfd_fh = (void *)tfd;
	struct iwl_tfd_tb *tb = &tfd_fh->tbs[idx];
197

198
	u16 hi_n_len = len << 4;
J
Johannes Berg 已提交
199

200 201
	put_unaligned_le32(addr, &tb->lo);
	hi_n_len |= iwl_get_dma_hi_addr(addr);
J
Johannes Berg 已提交
202

203
	tb->hi_n_len = cpu_to_le16(hi_n_len);
204

205
	tfd_fh->num_tbs = idx + 1;
J
Johannes Berg 已提交
206 207
}

208
static int iwl_pcie_txq_build_tfd(struct iwl_trans *trans, struct iwl_txq *txq,
209
				  dma_addr_t addr, u16 len, bool reset)
J
Johannes Berg 已提交
210
{
211
	void *tfd;
J
Johannes Berg 已提交
212 213
	u32 num_tbs;

214
	tfd = txq->tfds + trans->txqs.tfd.size * txq->write_ptr;
J
Johannes Berg 已提交
215

216
	if (reset)
217
		memset(tfd, 0, trans->txqs.tfd.size);
218

219
	num_tbs = iwl_txq_gen1_tfd_get_num_tbs(trans, tfd);
220

221
	/* Each TFD can point to a maximum max_tbs Tx buffers */
222
	if (num_tbs >= trans->txqs.tfd.max_tbs) {
223
		IWL_ERR(trans, "Error can not send more than %d chunks\n",
224
			trans->txqs.tfd.max_tbs);
225 226 227
		return -EINVAL;
	}

228 229
	if (WARN(addr & ~IWL_TX_DMA_MASK,
		 "Unaligned address = %llx\n", (unsigned long long)addr))
230 231
		return -EINVAL;

232
	iwl_pcie_tfd_set_tb(trans, tfd, num_tbs, addr, len);
233

J
Johannes Berg 已提交
234
	return num_tbs;
235 236
}

237 238 239 240 241 242
static void iwl_pcie_clear_cmd_in_flight(struct iwl_trans *trans)
{
	struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);

	lockdep_assert_held(&trans_pcie->reg_lock);

243
	if (!trans->trans_cfg->base_params->apmg_wake_up_wa)
244 245 246 247 248 249
		return;
	if (WARN_ON(!trans_pcie->cmd_hold_nic_awake))
		return;

	trans_pcie->cmd_hold_nic_awake = false;
	__iwl_trans_pcie_clear_bit(trans, CSR_GP_CNTRL,
250
				   CSR_GP_CNTRL_REG_FLAG_MAC_ACCESS_REQ);
251 252
}

253 254 255 256 257 258
/*
 * iwl_pcie_txq_unmap -  Unmap any remaining DMA mappings and free skb's
 */
static void iwl_pcie_txq_unmap(struct iwl_trans *trans, int txq_id)
{
	struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
259
	struct iwl_txq *txq = trans->txqs.txq[txq_id];
260 261

	spin_lock_bh(&txq->lock);
262
	while (txq->write_ptr != txq->read_ptr) {
263
		IWL_DEBUG_TX_REPLY(trans, "Q %d Free %d\n",
264
				   txq_id, txq->read_ptr);
265

266
		if (txq_id != trans->txqs.cmd.q_id) {
267
			struct sk_buff *skb = txq->entries[txq->read_ptr].skb;
268 269 270 271

			if (WARN_ON_ONCE(!skb))
				continue;

272
			iwl_txq_free_tso_page(trans, skb);
273
		}
274
		iwl_txq_free_tfd(trans, txq);
275
		txq->read_ptr = iwl_txq_inc_wrap(trans, txq->read_ptr);
276

277
		if (txq->read_ptr == txq->write_ptr) {
278 279 280
			unsigned long flags;

			spin_lock_irqsave(&trans_pcie->reg_lock, flags);
281
			if (txq_id == trans->txqs.cmd.q_id)
282 283 284
				iwl_pcie_clear_cmd_in_flight(trans);
			spin_unlock_irqrestore(&trans_pcie->reg_lock, flags);
		}
285
	}
286 287 288 289 290 291 292

	while (!skb_queue_empty(&txq->overflow_q)) {
		struct sk_buff *skb = __skb_dequeue(&txq->overflow_q);

		iwl_op_mode_free_skb(trans->op_mode, skb);
	}

293
	spin_unlock_bh(&txq->lock);
294 295 296

	/* just in case - this queue may have been stopped */
	iwl_wake_queue(trans, txq);
297 298 299 300 301 302 303 304 305 306 307 308
}

/*
 * iwl_pcie_txq_free - Deallocate DMA queue.
 * @txq: Transmit queue to deallocate.
 *
 * Empty queue by removing and destroying all BD's.
 * Free all buffers.
 * 0-fill, but do not free "txq" descriptor structure.
 */
static void iwl_pcie_txq_free(struct iwl_trans *trans, int txq_id)
{
309
	struct iwl_txq *txq = trans->txqs.txq[txq_id];
310 311 312 313 314 315 316 317 318
	struct device *dev = trans->dev;
	int i;

	if (WARN_ON(!txq))
		return;

	iwl_pcie_txq_unmap(trans, txq_id);

	/* De-alloc array of command/tx buffers */
319
	if (txq_id == trans->txqs.cmd.q_id)
320
		for (i = 0; i < txq->n_window; i++) {
321 322
			kfree_sensitive(txq->entries[i].cmd);
			kfree_sensitive(txq->entries[i].free_buf);
323 324 325
		}

	/* De-alloc circular buffer of TFDs */
326 327
	if (txq->tfds) {
		dma_free_coherent(dev,
328
				  trans->txqs.tfd.size *
329
				  trans->trans_cfg->base_params->max_tfd_queue_size,
330 331
				  txq->tfds, txq->dma_addr);
		txq->dma_addr = 0;
332
		txq->tfds = NULL;
333 334

		dma_free_coherent(dev,
335
				  sizeof(*txq->first_tb_bufs) * txq->n_window,
336
				  txq->first_tb_bufs, txq->first_tb_dma);
337 338 339 340 341 342 343 344 345 346 347 348 349 350
	}

	kfree(txq->entries);
	txq->entries = NULL;

	del_timer_sync(&txq->stuck_timer);

	/* 0-fill queue descriptor structure */
	memset(txq, 0, sizeof(*txq));
}

void iwl_pcie_tx_start(struct iwl_trans *trans, u32 scd_base_addr)
{
	struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
351
	int nq = trans->trans_cfg->base_params->num_of_queues;
352 353
	int chan;
	u32 reg_val;
354 355
	int clear_dwords = (SCD_TRANS_TBL_OFFSET_QUEUE(nq) -
				SCD_CONTEXT_MEM_LOWER_BOUND) / sizeof(u32);
356 357

	/* make sure all queue are not stopped/used */
358 359 360
	memset(trans->txqs.queue_stopped, 0,
	       sizeof(trans->txqs.queue_stopped));
	memset(trans->txqs.queue_used, 0, sizeof(trans->txqs.queue_used));
361 362 363 364 365 366 367

	trans_pcie->scd_base_addr =
		iwl_read_prph(trans, SCD_SRAM_BASE_ADDR);

	WARN_ON(scd_base_addr != 0 &&
		scd_base_addr != trans_pcie->scd_base_addr);

368 369 370 371
	/* reset context data, TX status and translation data */
	iwl_trans_write_mem(trans, trans_pcie->scd_base_addr +
				   SCD_CONTEXT_MEM_LOWER_BOUND,
			    NULL, clear_dwords);
372 373

	iwl_write_prph(trans, SCD_DRAM_BASE_ADDR,
374
		       trans->txqs.scd_bc_tbls.dma >> 10);
375 376 377 378

	/* The chain extension of the SCD doesn't work well. This feature is
	 * enabled by default by the HW, so we need to disable it manually.
	 */
379
	if (trans->trans_cfg->base_params->scd_chain_ext_wa)
380
		iwl_write_prph(trans, SCD_CHAINEXT_EN, 0);
381

382 383 384
	iwl_trans_ac_txq_enable(trans, trans->txqs.cmd.q_id,
				trans->txqs.cmd.fifo,
				trans->txqs.cmd.wdg_timeout);
385 386

	/* Activate all Tx DMA/FIFO channels */
387
	iwl_scd_activate_fifos(trans);
388 389 390 391 392 393 394 395 396 397 398 399 400

	/* Enable DMA channel */
	for (chan = 0; chan < FH_TCSR_CHNL_NUM; chan++)
		iwl_write_direct32(trans, FH_TCSR_CHNL_TX_CONFIG_REG(chan),
				   FH_TCSR_TX_CONFIG_REG_VAL_DMA_CHNL_ENABLE |
				   FH_TCSR_TX_CONFIG_REG_VAL_DMA_CREDIT_ENABLE);

	/* Update FH chicken bits */
	reg_val = iwl_read_direct32(trans, FH_TX_CHICKEN_BITS_REG);
	iwl_write_direct32(trans, FH_TX_CHICKEN_BITS_REG,
			   reg_val | FH_TX_CHICKEN_BITS_SCD_AUTO_RETRY_EN);

	/* Enable L1-Active */
401
	if (trans->trans_cfg->device_family < IWL_DEVICE_FAMILY_8000)
402 403
		iwl_clear_bits_prph(trans, APMG_PCIDEV_STT_REG,
				    APMG_PCIDEV_STT_VAL_L1_ACT_DIS);
404 405
}

406 407 408 409 410
void iwl_trans_pcie_tx_reset(struct iwl_trans *trans)
{
	struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
	int txq_id;

411 412 413 414
	/*
	 * we should never get here in gen2 trans mode return early to avoid
	 * having invalid accesses
	 */
415
	if (WARN_ON_ONCE(trans->trans_cfg->gen2))
416 417
		return;

418
	for (txq_id = 0; txq_id < trans->trans_cfg->base_params->num_of_queues;
419
	     txq_id++) {
420
		struct iwl_txq *txq = trans->txqs.txq[txq_id];
421
		if (trans->trans_cfg->use_tfh)
422 423
			iwl_write_direct64(trans,
					   FH_MEM_CBBC_QUEUE(trans, txq_id),
424
					   txq->dma_addr);
425 426 427
		else
			iwl_write_direct32(trans,
					   FH_MEM_CBBC_QUEUE(trans, txq_id),
428
					   txq->dma_addr >> 8);
429
		iwl_pcie_txq_unmap(trans, txq_id);
430 431
		txq->read_ptr = 0;
		txq->write_ptr = 0;
432 433 434 435 436 437
	}

	/* Tell NIC where to find the "keep warm" buffer */
	iwl_write_direct32(trans, FH_KW_MEM_ADDR_REG,
			   trans_pcie->kw.dma >> 4);

438 439 440 441 442 443
	/*
	 * Send 0 as the scd_base_addr since the device may have be reset
	 * while we were in WoWLAN in which case SCD_SRAM_BASE_ADDR will
	 * contain garbage.
	 */
	iwl_pcie_tx_start(trans, 0);
444 445
}

446 447 448 449 450 451 452 453 454
static void iwl_pcie_tx_stop_fh(struct iwl_trans *trans)
{
	struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
	unsigned long flags;
	int ch, ret;
	u32 mask = 0;

	spin_lock(&trans_pcie->irq_lock);

455
	if (!iwl_trans_grab_nic_access(trans, &flags))
456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476
		goto out;

	/* Stop each Tx DMA channel */
	for (ch = 0; ch < FH_TCSR_CHNL_NUM; ch++) {
		iwl_write32(trans, FH_TCSR_CHNL_TX_CONFIG_REG(ch), 0x0);
		mask |= FH_TSSR_TX_STATUS_REG_MSK_CHNL_IDLE(ch);
	}

	/* Wait for DMA channels to be idle */
	ret = iwl_poll_bit(trans, FH_TSSR_TX_STATUS_REG, mask, mask, 5000);
	if (ret < 0)
		IWL_ERR(trans,
			"Failing on timeout while stopping DMA channel %d [0x%08x]\n",
			ch, iwl_read32(trans, FH_TSSR_TX_STATUS_REG));

	iwl_trans_release_nic_access(trans, &flags);

out:
	spin_unlock(&trans_pcie->irq_lock);
}

477 478 479 480 481 482
/*
 * iwl_pcie_tx_stop - Stop all Tx DMA channels
 */
int iwl_pcie_tx_stop(struct iwl_trans *trans)
{
	struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
483
	int txq_id;
484 485

	/* Turn off all Tx DMA fifos */
486
	iwl_scd_deactivate_fifos(trans);
487

488 489
	/* Turn off all Tx DMA channels */
	iwl_pcie_tx_stop_fh(trans);
490

491 492 493 494 495
	/*
	 * This function can be called before the op_mode disabled the
	 * queues. This happens when we have an rfkill interrupt.
	 * Since we stop Tx altogether - mark the queues as stopped.
	 */
496 497 498
	memset(trans->txqs.queue_stopped, 0,
	       sizeof(trans->txqs.queue_stopped));
	memset(trans->txqs.queue_used, 0, sizeof(trans->txqs.queue_used));
499 500

	/* This can happen: start_hw, stop_device */
501
	if (!trans_pcie->txq_memory)
502 503 504
		return 0;

	/* Unmap DMA from host system and free skb's */
505
	for (txq_id = 0; txq_id < trans->trans_cfg->base_params->num_of_queues;
506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521
	     txq_id++)
		iwl_pcie_txq_unmap(trans, txq_id);

	return 0;
}

/*
 * iwl_trans_tx_free - Free TXQ Context
 *
 * Destroy all TX DMA queues and structures
 */
void iwl_pcie_tx_free(struct iwl_trans *trans)
{
	int txq_id;
	struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);

522
	memset(trans->txqs.queue_used, 0, sizeof(trans->txqs.queue_used));
523

524
	/* Tx queues */
525
	if (trans_pcie->txq_memory) {
526
		for (txq_id = 0;
527
		     txq_id < trans->trans_cfg->base_params->num_of_queues;
528
		     txq_id++) {
529
			iwl_pcie_txq_free(trans, txq_id);
530
			trans->txqs.txq[txq_id] = NULL;
531
		}
532 533
	}

534 535
	kfree(trans_pcie->txq_memory);
	trans_pcie->txq_memory = NULL;
536 537 538

	iwl_pcie_free_dma_ptr(trans, &trans_pcie->kw);

539
	iwl_pcie_free_dma_ptr(trans, &trans->txqs.scd_bc_tbls);
540 541 542 543 544 545 546 547 548 549 550
}

/*
 * iwl_pcie_tx_alloc - allocate TX context
 * Allocate all Tx DMA structures and initialize them
 */
static int iwl_pcie_tx_alloc(struct iwl_trans *trans)
{
	int ret;
	int txq_id, slots_num;
	struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
551
	u16 bc_tbls_size = trans->trans_cfg->base_params->num_of_queues;
552

553 554 555 556
	if (WARN_ON(trans->trans_cfg->device_family >= IWL_DEVICE_FAMILY_AX210))
		return -EINVAL;

	bc_tbls_size *= sizeof(struct iwlagn_scd_bc_tbl);
557 558 559

	/*It is not allowed to alloc twice, so warn when this happens.
	 * We cannot rely on the previous allocation, so free and fail */
560
	if (WARN_ON(trans_pcie->txq_memory)) {
561 562 563 564
		ret = -EINVAL;
		goto error;
	}

565
	ret = iwl_pcie_alloc_dma_ptr(trans, &trans->txqs.scd_bc_tbls,
566
				     bc_tbls_size);
567 568 569 570 571 572 573 574 575 576 577 578
	if (ret) {
		IWL_ERR(trans, "Scheduler BC Table allocation failed\n");
		goto error;
	}

	/* Alloc keep-warm buffer */
	ret = iwl_pcie_alloc_dma_ptr(trans, &trans_pcie->kw, IWL_KW_SIZE);
	if (ret) {
		IWL_ERR(trans, "Keep Warm allocation failed\n");
		goto error;
	}

579
	trans_pcie->txq_memory =
580
		kcalloc(trans->trans_cfg->base_params->num_of_queues,
581
			sizeof(struct iwl_txq), GFP_KERNEL);
582
	if (!trans_pcie->txq_memory) {
583
		IWL_ERR(trans, "Not enough memory for txq\n");
584
		ret = -ENOMEM;
585 586 587 588
		goto error;
	}

	/* Alloc and init all Tx queues, including the command queue (#4/#9) */
589
	for (txq_id = 0; txq_id < trans->trans_cfg->base_params->num_of_queues;
590
	     txq_id++) {
591
		bool cmd_queue = (txq_id == trans->txqs.cmd.q_id);
592

593
		if (cmd_queue)
594
			slots_num = max_t(u32, IWL_CMD_QUEUE_SIZE,
595 596
					  trans->cfg->min_txq_size);
		else
597
			slots_num = max_t(u32, IWL_DEFAULT_QUEUE_SIZE,
598
					  trans->cfg->min_256_ba_txq_size);
599
		trans->txqs.txq[txq_id] = &trans_pcie->txq_memory[txq_id];
600 601
		ret = iwl_txq_alloc(trans, trans->txqs.txq[txq_id], slots_num,
				    cmd_queue);
602 603 604 605
		if (ret) {
			IWL_ERR(trans, "Tx %d queue alloc failed\n", txq_id);
			goto error;
		}
606
		trans->txqs.txq[txq_id]->id = txq_id;
607 608 609 610 611 612 613 614 615
	}

	return 0;

error:
	iwl_pcie_tx_free(trans);

	return ret;
}
616

617 618 619 620 621 622 623
int iwl_pcie_tx_init(struct iwl_trans *trans)
{
	struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
	int ret;
	int txq_id, slots_num;
	bool alloc = false;

624
	if (!trans_pcie->txq_memory) {
625 626 627 628 629 630
		ret = iwl_pcie_tx_alloc(trans);
		if (ret)
			goto error;
		alloc = true;
	}

631
	spin_lock(&trans_pcie->irq_lock);
632 633

	/* Turn off all Tx DMA fifos */
634
	iwl_scd_deactivate_fifos(trans);
635 636 637 638 639

	/* Tell NIC where to find the "keep warm" buffer */
	iwl_write_direct32(trans, FH_KW_MEM_ADDR_REG,
			   trans_pcie->kw.dma >> 4);

640
	spin_unlock(&trans_pcie->irq_lock);
641 642

	/* Alloc and init all Tx queues, including the command queue (#4/#9) */
643
	for (txq_id = 0; txq_id < trans->trans_cfg->base_params->num_of_queues;
644
	     txq_id++) {
645
		bool cmd_queue = (txq_id == trans->txqs.cmd.q_id);
646

647
		if (cmd_queue)
648
			slots_num = max_t(u32, IWL_CMD_QUEUE_SIZE,
649 650
					  trans->cfg->min_txq_size);
		else
651
			slots_num = max_t(u32, IWL_DEFAULT_QUEUE_SIZE,
652
					  trans->cfg->min_256_ba_txq_size);
653 654
		ret = iwl_txq_init(trans, trans->txqs.txq[txq_id], slots_num,
				   cmd_queue);
655 656 657 658 659
		if (ret) {
			IWL_ERR(trans, "Tx %d queue init failed\n", txq_id);
			goto error;
		}

660 661 662 663 664 665 666
		/*
		 * Tell nic where to find circular buffer of TFDs for a
		 * given Tx queue, and enable the DMA channel used for that
		 * queue.
		 * Circular buffer (TFD queue in DRAM) physical base address
		 */
		iwl_write_direct32(trans, FH_MEM_CBBC_QUEUE(trans, txq_id),
667
				   trans->txqs.txq[txq_id]->dma_addr >> 8);
668
	}
669

670
	iwl_set_bits_prph(trans, SCD_GP_CTRL, SCD_GP_CTRL_AUTO_ACTIVE_MODE);
671
	if (trans->trans_cfg->base_params->num_of_queues > 20)
672 673 674
		iwl_set_bits_prph(trans, SCD_GP_CTRL,
				  SCD_GP_CTRL_ENABLE_31_QUEUES);

675 676 677 678 679 680 681 682
	return 0;
error:
	/*Upon error, free only if we allocated something */
	if (alloc)
		iwl_pcie_tx_free(trans);
	return ret;
}

683 684
static int iwl_pcie_set_cmd_in_flight(struct iwl_trans *trans,
				      const struct iwl_host_cmd *cmd)
685 686 687 688 689 690
{
	struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
	int ret;

	lockdep_assert_held(&trans_pcie->reg_lock);

691
	/* Make sure the NIC is still alive in the bus */
692 693
	if (test_bit(STATUS_TRANS_DEAD, &trans->status))
		return -ENODEV;
694

695 696 697 698 699 700
	/*
	 * wake up the NIC to make sure that the firmware will see the host
	 * command - we will let the NIC sleep once all the host commands
	 * returned. This needs to be done only on NICs that have
	 * apmg_wake_up_wa set.
	 */
701
	if (trans->trans_cfg->base_params->apmg_wake_up_wa &&
702
	    !trans_pcie->cmd_hold_nic_awake) {
703
		__iwl_trans_pcie_set_bit(trans, CSR_GP_CNTRL,
704
					 CSR_GP_CNTRL_REG_FLAG_MAC_ACCESS_REQ);
705 706

		ret = iwl_poll_bit(trans, CSR_GP_CNTRL,
707 708
				   CSR_GP_CNTRL_REG_VAL_MAC_ACCESS_EN,
				   (CSR_GP_CNTRL_REG_FLAG_MAC_CLOCK_READY |
709 710 711 712
				    CSR_GP_CNTRL_REG_FLAG_GOING_TO_SLEEP),
				   15000);
		if (ret < 0) {
			__iwl_trans_pcie_clear_bit(trans, CSR_GP_CNTRL,
713
					CSR_GP_CNTRL_REG_FLAG_MAC_ACCESS_REQ);
714 715 716
			IWL_ERR(trans, "Failed to wake NIC for hcmd\n");
			return -EIO;
		}
717
		trans_pcie->cmd_hold_nic_awake = true;
718 719 720 721 722
	}

	return 0;
}

723 724 725 726 727 728 729
/*
 * iwl_pcie_cmdq_reclaim - Reclaim TX command queue entries already Tx'd
 *
 * When FW advances 'R' index, all entries between old and new 'R' index
 * need to be reclaimed. As result, some free space forms.  If there is
 * enough free space (> low mark), wake the stack that feeds us.
 */
730
static void iwl_pcie_cmdq_reclaim(struct iwl_trans *trans, int txq_id, int idx)
731
{
732
	struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
733
	struct iwl_txq *txq = trans->txqs.txq[txq_id];
734
	unsigned long flags;
735
	int nfreed = 0;
736
	u16 r;
737

738
	lockdep_assert_held(&txq->lock);
739

740 741
	idx = iwl_txq_get_cmd_index(txq, idx);
	r = iwl_txq_get_cmd_index(txq, txq->read_ptr);
742

743
	if (idx >= trans->trans_cfg->base_params->max_tfd_queue_size ||
744
	    (!iwl_txq_used(txq, idx))) {
745
		WARN_ONCE(test_bit(txq_id, trans->txqs.queue_used),
S
Sara Sharon 已提交
746 747
			  "%s: Read index for DMA queue txq id (%d), index %d is out of range [0-%d] %d %d.\n",
			  __func__, txq_id, idx,
748
			  trans->trans_cfg->base_params->max_tfd_queue_size,
S
Sara Sharon 已提交
749
			  txq->write_ptr, txq->read_ptr);
750 751
		return;
	}
752

753 754 755
	for (idx = iwl_txq_inc_wrap(trans, idx); r != idx;
	     r = iwl_txq_inc_wrap(trans, r)) {
		txq->read_ptr = iwl_txq_inc_wrap(trans, txq->read_ptr);
756

757 758
		if (nfreed++ > 0) {
			IWL_ERR(trans, "HCMD skipped: index (%d) %d %d\n",
759
				idx, txq->write_ptr, r);
L
Liad Kaufman 已提交
760
			iwl_force_nmi(trans);
761 762 763
		}
	}

764
	if (txq->read_ptr == txq->write_ptr) {
765
		spin_lock_irqsave(&trans_pcie->reg_lock, flags);
766
		iwl_pcie_clear_cmd_in_flight(trans);
767 768 769
		spin_unlock_irqrestore(&trans_pcie->reg_lock, flags);
	}

770
	iwl_txq_progress(txq);
771 772
}

773
static int iwl_pcie_txq_set_ratid_map(struct iwl_trans *trans, u16 ra_tid,
774
				 u16 txq_id)
775
{
776
	struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
777 778 779 780 781 782
	u32 tbl_dw_addr;
	u32 tbl_dw;
	u16 scd_q2ratid;

	scd_q2ratid = ra_tid & SCD_QUEUE_RA_TID_MAP_RATID_MSK;

783
	tbl_dw_addr = trans_pcie->scd_base_addr +
784 785
			SCD_TRANS_TBL_OFFSET_QUEUE(txq_id);

786
	tbl_dw = iwl_trans_read_mem32(trans, tbl_dw_addr);
787 788 789 790 791 792

	if (txq_id & 0x1)
		tbl_dw = (scd_q2ratid << 16) | (tbl_dw & 0x0000FFFF);
	else
		tbl_dw = scd_q2ratid | (tbl_dw & 0xFFFF0000);

793
	iwl_trans_write_mem32(trans, tbl_dw_addr, tbl_dw);
794 795 796 797

	return 0;
}

798 799 800 801
/* Receiver address (actually, Rx station's index into station table),
 * combined with Traffic ID (QOS priority), in format used by Tx Scheduler */
#define BUILD_RAxTID(sta_id, tid)	(((sta_id) << 4) + (tid))

802
bool iwl_trans_pcie_txq_enable(struct iwl_trans *trans, int txq_id, u16 ssn,
803 804
			       const struct iwl_trans_txq_scd_cfg *cfg,
			       unsigned int wdg_timeout)
805
{
806
	struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
807
	struct iwl_txq *txq = trans->txqs.txq[txq_id];
808
	int fifo = -1;
809
	bool scd_bug = false;
810

811
	if (test_and_set_bit(txq_id, trans->txqs.queue_used))
812
		WARN_ONCE(1, "queue %d already used - expect issues", txq_id);
813

814 815
	txq->wd_timeout = msecs_to_jiffies(wdg_timeout);

816 817
	if (cfg) {
		fifo = cfg->fifo;
818

819
		/* Disable the scheduler prior configuring the cmd queue */
820
		if (txq_id == trans->txqs.cmd.q_id &&
821
		    trans_pcie->scd_set_active)
822 823
			iwl_scd_enable_set_active(trans, 0);

824 825
		/* Stop this Tx queue before configuring it */
		iwl_scd_txq_set_inactive(trans, txq_id);
826

827
		/* Set this queue as a chain-building queue unless it is CMD */
828
		if (txq_id != trans->txqs.cmd.q_id)
829
			iwl_scd_txq_set_chain(trans, txq_id);
830

831
		if (cfg->aggregate) {
832
			u16 ra_tid = BUILD_RAxTID(cfg->sta_id, cfg->tid);
833

834 835
			/* Map receiver-address / traffic-ID to this queue */
			iwl_pcie_txq_set_ratid_map(trans, ra_tid, txq_id);
836

837 838
			/* enable aggregations for the queue */
			iwl_scd_txq_enable_agg(trans, txq_id);
839
			txq->ampdu = true;
840 841 842 843 844 845 846 847
		} else {
			/*
			 * disable aggregations for the queue, this will also
			 * make the ra_tid mapping configuration irrelevant
			 * since it is now a non-AGG queue.
			 */
			iwl_scd_txq_disable_agg(trans, txq_id);

848
			ssn = txq->read_ptr;
849
		}
850 851 852 853 854 855 856 857 858 859 860 861
	} else {
		/*
		 * If we need to move the SCD write pointer by steps of
		 * 0x40, 0x80 or 0xc0, it gets stuck. Avoids this and let
		 * the op_mode know by returning true later.
		 * Do this only in case cfg is NULL since this trick can
		 * be done only if we have DQA enabled which is true for mvm
		 * only. And mvm never sets a cfg pointer.
		 * This is really ugly, but this is the easiest way out for
		 * this sad hardware issue.
		 * This bug has been fixed on devices 9000 and up.
		 */
862
		scd_bug = !trans->trans_cfg->mq_rx_supported &&
863 864 865 866
			!((ssn - txq->write_ptr) & 0x3f) &&
			(ssn != txq->write_ptr);
		if (scd_bug)
			ssn++;
867
	}
868 869 870

	/* Place first TFD at index corresponding to start sequence number.
	 * Assumes that ssn_idx is valid (!= 0xFFF) */
871 872
	txq->read_ptr = (ssn & 0xff);
	txq->write_ptr = (ssn & 0xff);
873 874
	iwl_write_direct32(trans, HBUS_TARG_WRPTR,
			   (ssn & 0xff) | (txq_id << 8));
875

876 877
	if (cfg) {
		u8 frame_limit = cfg->frame_limit;
878

879 880 881 882 883 884 885
		iwl_write_prph(trans, SCD_QUEUE_RDPTR(txq_id), ssn);

		/* Set up Tx window size and frame limit for this queue */
		iwl_trans_write_mem32(trans, trans_pcie->scd_base_addr +
				SCD_CONTEXT_QUEUE_OFFSET(txq_id), 0);
		iwl_trans_write_mem32(trans,
			trans_pcie->scd_base_addr +
886
			SCD_CONTEXT_QUEUE_OFFSET(txq_id) + sizeof(u32),
887 888
			SCD_QUEUE_CTX_REG2_VAL(WIN_SIZE, frame_limit) |
			SCD_QUEUE_CTX_REG2_VAL(FRAME_LIMIT, frame_limit));
889 890 891 892 893 894 895

		/* Set up status area in SRAM, map to Tx DMA/FIFO, activate */
		iwl_write_prph(trans, SCD_QUEUE_STATUS_BITS(txq_id),
			       (1 << SCD_QUEUE_STTS_REG_POS_ACTIVE) |
			       (cfg->fifo << SCD_QUEUE_STTS_REG_POS_TXF) |
			       (1 << SCD_QUEUE_STTS_REG_POS_WSL) |
			       SCD_QUEUE_STTS_REG_MSK);
896 897

		/* enable the scheduler for this queue (only) */
898
		if (txq_id == trans->txqs.cmd.q_id &&
899
		    trans_pcie->scd_set_active)
900
			iwl_scd_enable_set_active(trans, BIT(txq_id));
901 902 903 904 905 906 907 908

		IWL_DEBUG_TX_QUEUES(trans,
				    "Activate queue %d on FIFO %d WrPtr: %d\n",
				    txq_id, fifo, ssn & 0xff);
	} else {
		IWL_DEBUG_TX_QUEUES(trans,
				    "Activate queue %d WrPtr: %d\n",
				    txq_id, ssn & 0xff);
909
	}
910 911

	return scd_bug;
912 913
}

914 915 916
void iwl_trans_pcie_txq_set_shared_mode(struct iwl_trans *trans, u32 txq_id,
					bool shared_mode)
{
917
	struct iwl_txq *txq = trans->txqs.txq[txq_id];
918 919 920 921

	txq->ampdu = !shared_mode;
}

922 923
void iwl_trans_pcie_txq_disable(struct iwl_trans *trans, int txq_id,
				bool configure_scd)
924
{
925
	struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
926 927 928
	u32 stts_addr = trans_pcie->scd_base_addr +
			SCD_TX_STTS_QUEUE_OFFSET(txq_id);
	static const u32 zero_val[4] = {};
929

930 931
	trans->txqs.txq[txq_id]->frozen_expiry_remainder = 0;
	trans->txqs.txq[txq_id]->frozen = false;
932

933 934 935 936 937 938
	/*
	 * Upon HW Rfkill - we stop the device, and then stop the queues
	 * in the op_mode. Just for the sake of the simplicity of the op_mode,
	 * allow the op_mode to call txq_disable after it already called
	 * stop_device.
	 */
939
	if (!test_and_clear_bit(txq_id, trans->txqs.queue_used)) {
940 941
		WARN_ONCE(test_bit(STATUS_DEVICE_ENABLED, &trans->status),
			  "queue %d not used", txq_id);
942
		return;
943 944
	}

945 946
	if (configure_scd) {
		iwl_scd_txq_set_inactive(trans, txq_id);
947

948 949 950
		iwl_trans_write_mem(trans, stts_addr, (void *)zero_val,
				    ARRAY_SIZE(zero_val));
	}
951

952
	iwl_pcie_txq_unmap(trans, txq_id);
953
	trans->txqs.txq[txq_id]->ampdu = false;
954

955
	IWL_DEBUG_TX_QUEUES(trans, "Deactivate queue %d\n", txq_id);
956 957
}

958 959
/*************** HOST COMMAND QUEUE FUNCTIONS   *****/

960
/*
961
 * iwl_pcie_enqueue_hcmd - enqueue a uCode command
962
 * @priv: device private data point
963
 * @cmd: a pointer to the ucode command structure
964
 *
965 966
 * The function returns < 0 values to indicate the operation
 * failed. On success, it returns the index (>= 0) of command in the
967 968
 * command queue.
 */
969 970
static int iwl_pcie_enqueue_hcmd(struct iwl_trans *trans,
				 struct iwl_host_cmd *cmd)
971
{
972
	struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
973
	struct iwl_txq *txq = trans->txqs.txq[trans->txqs.cmd.q_id];
J
Johannes Berg 已提交
974 975
	struct iwl_device_cmd *out_cmd;
	struct iwl_cmd_meta *out_meta;
976
	unsigned long flags;
977
	void *dup_buf = NULL;
978
	dma_addr_t phys_addr;
979
	int idx;
980
	u16 copy_size, cmd_size, tb0_size;
981
	bool had_nocopy = false;
982
	u8 group_id = iwl_cmd_groupid(cmd->id);
983
	int i, ret;
984
	u32 cmd_pos;
985 986
	const u8 *cmddata[IWL_MAX_CMD_TBS_PER_TFD];
	u16 cmdlen[IWL_MAX_CMD_TBS_PER_TFD];
987

988 989 990 991 992
	if (WARN(!trans->wide_cmd_header &&
		 group_id > IWL_ALWAYS_LONG_GROUP,
		 "unsupported wide command %#x\n", cmd->id))
		return -EINVAL;

993 994 995 996 997 998 999
	if (group_id != 0) {
		copy_size = sizeof(struct iwl_cmd_header_wide);
		cmd_size = sizeof(struct iwl_cmd_header_wide);
	} else {
		copy_size = sizeof(struct iwl_cmd_header);
		cmd_size = sizeof(struct iwl_cmd_header);
	}
1000 1001

	/* need one for the header if the first is NOCOPY */
1002
	BUILD_BUG_ON(IWL_MAX_CMD_TBS_PER_TFD > IWL_NUM_OF_TBS - 1);
1003

1004
	for (i = 0; i < IWL_MAX_CMD_TBS_PER_TFD; i++) {
1005 1006 1007
		cmddata[i] = cmd->data[i];
		cmdlen[i] = cmd->len[i];

1008 1009
		if (!cmd->len[i])
			continue;
1010

1011 1012 1013
		/* need at least IWL_FIRST_TB_SIZE copied */
		if (copy_size < IWL_FIRST_TB_SIZE) {
			int copy = IWL_FIRST_TB_SIZE - copy_size;
1014 1015 1016 1017 1018 1019 1020 1021

			if (copy > cmdlen[i])
				copy = cmdlen[i];
			cmdlen[i] -= copy;
			cmddata[i] += copy;
			copy_size += copy;
		}

1022 1023
		if (cmd->dataflags[i] & IWL_HCMD_DFL_NOCOPY) {
			had_nocopy = true;
1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040
			if (WARN_ON(cmd->dataflags[i] & IWL_HCMD_DFL_DUP)) {
				idx = -EINVAL;
				goto free_dup_buf;
			}
		} else if (cmd->dataflags[i] & IWL_HCMD_DFL_DUP) {
			/*
			 * This is also a chunk that isn't copied
			 * to the static buffer so set had_nocopy.
			 */
			had_nocopy = true;

			/* only allowed once */
			if (WARN_ON(dup_buf)) {
				idx = -EINVAL;
				goto free_dup_buf;
			}

1041
			dup_buf = kmemdup(cmddata[i], cmdlen[i],
1042 1043 1044
					  GFP_ATOMIC);
			if (!dup_buf)
				return -ENOMEM;
1045 1046
		} else {
			/* NOCOPY must not be followed by normal! */
1047 1048 1049 1050
			if (WARN_ON(had_nocopy)) {
				idx = -EINVAL;
				goto free_dup_buf;
			}
1051
			copy_size += cmdlen[i];
1052 1053 1054
		}
		cmd_size += cmd->len[i];
	}
1055

1056 1057
	/*
	 * If any of the command structures end up being larger than
1058 1059 1060
	 * the TFD_MAX_PAYLOAD_SIZE and they aren't dynamically
	 * allocated into separate TFDs, then we will need to
	 * increase the size of the buffers.
1061
	 */
1062 1063
	if (WARN(copy_size > TFD_MAX_PAYLOAD_SIZE,
		 "Command %s (%#x) is too large (%d bytes)\n",
1064 1065
		 iwl_get_cmd_string(trans, cmd->id),
		 cmd->id, copy_size)) {
1066 1067 1068
		idx = -EINVAL;
		goto free_dup_buf;
	}
1069

1070
	spin_lock_bh(&txq->lock);
1071

1072
	if (iwl_txq_space(trans, txq) < ((cmd->flags & CMD_ASYNC) ? 2 : 1)) {
1073
		spin_unlock_bh(&txq->lock);
1074

1075
		IWL_ERR(trans, "No space in command queue\n");
1076
		iwl_op_mode_cmd_queue_full(trans->op_mode);
1077 1078
		idx = -ENOSPC;
		goto free_dup_buf;
1079 1080
	}

1081
	idx = iwl_txq_get_cmd_index(txq, txq->write_ptr);
1082 1083
	out_cmd = txq->entries[idx].cmd;
	out_meta = &txq->entries[idx].meta;
J
Johannes Berg 已提交
1084

1085
	memset(out_meta, 0, sizeof(*out_meta));	/* re-initialize to NULL */
J
Johannes Berg 已提交
1086 1087
	if (cmd->flags & CMD_WANT_SKB)
		out_meta->source = cmd;
1088

1089
	/* set up the header */
1090 1091 1092 1093 1094 1095 1096 1097 1098
	if (group_id != 0) {
		out_cmd->hdr_wide.cmd = iwl_cmd_opcode(cmd->id);
		out_cmd->hdr_wide.group_id = group_id;
		out_cmd->hdr_wide.version = iwl_cmd_version(cmd->id);
		out_cmd->hdr_wide.length =
			cpu_to_le16(cmd_size -
				    sizeof(struct iwl_cmd_header_wide));
		out_cmd->hdr_wide.reserved = 0;
		out_cmd->hdr_wide.sequence =
1099
			cpu_to_le16(QUEUE_TO_SEQ(trans->txqs.cmd.q_id) |
1100
						 INDEX_TO_SEQ(txq->write_ptr));
1101 1102 1103 1104 1105 1106

		cmd_pos = sizeof(struct iwl_cmd_header_wide);
		copy_size = sizeof(struct iwl_cmd_header_wide);
	} else {
		out_cmd->hdr.cmd = iwl_cmd_opcode(cmd->id);
		out_cmd->hdr.sequence =
1107
			cpu_to_le16(QUEUE_TO_SEQ(trans->txqs.cmd.q_id) |
1108
						 INDEX_TO_SEQ(txq->write_ptr));
1109 1110 1111 1112 1113
		out_cmd->hdr.group_id = 0;

		cmd_pos = sizeof(struct iwl_cmd_header);
		copy_size = sizeof(struct iwl_cmd_header);
	}
1114 1115

	/* and copy the data that needs to be copied */
1116
	for (i = 0; i < IWL_MAX_CMD_TBS_PER_TFD; i++) {
1117
		int copy;
1118

1119
		if (!cmd->len[i])
1120
			continue;
1121 1122 1123

		/* copy everything if not nocopy/dup */
		if (!(cmd->dataflags[i] & (IWL_HCMD_DFL_NOCOPY |
1124
					   IWL_HCMD_DFL_DUP))) {
1125 1126 1127 1128 1129
			copy = cmd->len[i];

			memcpy((u8 *)out_cmd + cmd_pos, cmd->data[i], copy);
			cmd_pos += copy;
			copy_size += copy;
1130 1131 1132 1133
			continue;
		}

		/*
1134 1135
		 * Otherwise we need at least IWL_FIRST_TB_SIZE copied
		 * in total (for bi-directional DMA), but copy up to what
1136 1137 1138 1139 1140 1141 1142 1143
		 * we can fit into the payload for debug dump purposes.
		 */
		copy = min_t(int, TFD_MAX_PAYLOAD_SIZE - cmd_pos, cmd->len[i]);

		memcpy((u8 *)out_cmd + cmd_pos, cmd->data[i], copy);
		cmd_pos += copy;

		/* However, treat copy_size the proper way, we need it below */
1144 1145
		if (copy_size < IWL_FIRST_TB_SIZE) {
			copy = IWL_FIRST_TB_SIZE - copy_size;
1146 1147 1148 1149

			if (copy > cmd->len[i])
				copy = cmd->len[i];
			copy_size += copy;
1150
		}
1151 1152
	}

J
Johannes Berg 已提交
1153
	IWL_DEBUG_HC(trans,
1154
		     "Sending command %s (%.2x.%.2x), seq: 0x%04X, %d bytes at %d[%d]:%d\n",
1155
		     iwl_get_cmd_string(trans, cmd->id),
1156 1157
		     group_id, out_cmd->hdr.cmd,
		     le16_to_cpu(out_cmd->hdr.sequence),
1158
		     cmd_size, txq->write_ptr, idx, trans->txqs.cmd.q_id);
1159

1160 1161 1162
	/* start the TFD with the minimum copy bytes */
	tb0_size = min_t(int, copy_size, IWL_FIRST_TB_SIZE);
	memcpy(&txq->first_tb_bufs[idx], &out_cmd->hdr, tb0_size);
1163
	iwl_pcie_txq_build_tfd(trans, txq,
1164
			       iwl_txq_get_first_tb_dma(txq, idx),
1165
			       tb0_size, true);
1166 1167

	/* map first command fragment, if any remains */
1168
	if (copy_size > tb0_size) {
1169
		phys_addr = dma_map_single(trans->dev,
1170 1171
					   ((u8 *)&out_cmd->hdr) + tb0_size,
					   copy_size - tb0_size,
1172 1173
					   DMA_TO_DEVICE);
		if (dma_mapping_error(trans->dev, phys_addr)) {
1174 1175
			iwl_txq_gen1_tfd_unmap(trans, out_meta, txq,
					       txq->write_ptr);
1176 1177 1178
			idx = -ENOMEM;
			goto out;
		}
1179

1180
		iwl_pcie_txq_build_tfd(trans, txq, phys_addr,
1181
				       copy_size - tb0_size, false);
J
Johannes Berg 已提交
1182 1183
	}

1184
	/* map the remaining (adjusted) nocopy/dup fragments */
1185
	for (i = 0; i < IWL_MAX_CMD_TBS_PER_TFD; i++) {
1186
		const void *data = cmddata[i];
1187

1188
		if (!cmdlen[i])
1189
			continue;
1190 1191
		if (!(cmd->dataflags[i] & (IWL_HCMD_DFL_NOCOPY |
					   IWL_HCMD_DFL_DUP)))
1192
			continue;
1193 1194 1195
		if (cmd->dataflags[i] & IWL_HCMD_DFL_DUP)
			data = dup_buf;
		phys_addr = dma_map_single(trans->dev, (void *)data,
1196
					   cmdlen[i], DMA_TO_DEVICE);
1197
		if (dma_mapping_error(trans->dev, phys_addr)) {
1198 1199
			iwl_txq_gen1_tfd_unmap(trans, out_meta, txq,
					       txq->write_ptr);
1200 1201 1202 1203
			idx = -ENOMEM;
			goto out;
		}

1204
		iwl_pcie_txq_build_tfd(trans, txq, phys_addr, cmdlen[i], false);
1205
	}
R
Reinette Chatre 已提交
1206

1207
	BUILD_BUG_ON(IWL_TFH_NUM_TBS > sizeof(out_meta->tbs) * BITS_PER_BYTE);
1208
	out_meta->flags = cmd->flags;
1209
	if (WARN_ON_ONCE(txq->entries[idx].free_buf))
1210
		kfree_sensitive(txq->entries[idx].free_buf);
1211
	txq->entries[idx].free_buf = dup_buf;
J
Johannes Berg 已提交
1212

1213
	trace_iwlwifi_dev_hcmd(trans->dev, cmd, cmd_size, &out_cmd->hdr_wide);
R
Reinette Chatre 已提交
1214

1215
	/* start timer if queue currently empty */
1216
	if (txq->read_ptr == txq->write_ptr && txq->wd_timeout)
1217
		mod_timer(&txq->stuck_timer, jiffies + txq->wd_timeout);
1218

1219
	spin_lock_irqsave(&trans_pcie->reg_lock, flags);
1220
	ret = iwl_pcie_set_cmd_in_flight(trans, cmd);
1221 1222 1223 1224
	if (ret < 0) {
		idx = ret;
		spin_unlock_irqrestore(&trans_pcie->reg_lock, flags);
		goto out;
1225 1226
	}

1227
	/* Increment and update queue's write index */
1228
	txq->write_ptr = iwl_txq_inc_wrap(trans, txq->write_ptr);
1229
	iwl_pcie_txq_inc_wr_ptr(trans, txq);
1230

1231 1232
	spin_unlock_irqrestore(&trans_pcie->reg_lock, flags);

J
Johannes Berg 已提交
1233
 out:
1234
	spin_unlock_bh(&txq->lock);
1235 1236 1237
 free_dup_buf:
	if (idx < 0)
		kfree(dup_buf);
1238
	return idx;
1239 1240
}

1241 1242
/*
 * iwl_pcie_hcmd_complete - Pull unused buffers off the queue and reclaim them
1243 1244
 * @rxb: Rx buffer to reclaim
 */
1245
void iwl_pcie_hcmd_complete(struct iwl_trans *trans,
1246
			    struct iwl_rx_cmd_buffer *rxb)
1247
{
Z
Zhu Yi 已提交
1248
	struct iwl_rx_packet *pkt = rxb_addr(rxb);
1249
	u16 sequence = le16_to_cpu(pkt->hdr.sequence);
1250
	u8 group_id;
1251
	u32 cmd_id;
1252 1253 1254
	int txq_id = SEQ_TO_QUEUE(sequence);
	int index = SEQ_TO_INDEX(sequence);
	int cmd_index;
J
Johannes Berg 已提交
1255 1256
	struct iwl_device_cmd *cmd;
	struct iwl_cmd_meta *meta;
1257
	struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
1258
	struct iwl_txq *txq = trans->txqs.txq[trans->txqs.cmd.q_id];
1259 1260 1261 1262

	/* If a Tx command is being handled and it isn't in the actual
	 * command queue then there a command routing bug has been introduced
	 * in the queue management code. */
1263
	if (WARN(txq_id != trans->txqs.cmd.q_id,
1264
		 "wrong command queue %d (should be %d), sequence 0x%X readp=%d writep=%d\n",
1265
		 txq_id, trans->txqs.cmd.q_id, sequence, txq->read_ptr,
1266
		 txq->write_ptr)) {
1267
		iwl_print_hex_error(trans, pkt, 32);
1268
		return;
1269
	}
1270

1271
	spin_lock_bh(&txq->lock);
1272

1273
	cmd_index = iwl_txq_get_cmd_index(txq, index);
1274 1275
	cmd = txq->entries[cmd_index].cmd;
	meta = &txq->entries[cmd_index].meta;
1276
	group_id = cmd->hdr.group_id;
1277
	cmd_id = iwl_cmd_id(cmd->hdr.cmd, group_id, 0);
1278

1279
	iwl_txq_gen1_tfd_unmap(trans, meta, txq, index);
R
Reinette Chatre 已提交
1280

1281
	/* Input error checking is done when commands are added to queue. */
J
Johannes Berg 已提交
1282
	if (meta->flags & CMD_WANT_SKB) {
1283
		struct page *p = rxb_steal_page(rxb);
1284 1285 1286

		meta->source->resp_pkt = pkt;
		meta->source->_rx_page_addr = (unsigned long)page_address(p);
1287
		meta->source->_rx_page_order = trans_pcie->rx_page_order;
1288
	}
1289

1290 1291 1292
	if (meta->flags & CMD_WANT_ASYNC_CALLBACK)
		iwl_op_mode_async_cb(trans->op_mode, cmd);

1293
	iwl_pcie_cmdq_reclaim(trans, txq_id, index);
1294

J
Johannes Berg 已提交
1295
	if (!(meta->flags & CMD_ASYNC)) {
1296
		if (!test_bit(STATUS_SYNC_HCMD_ACTIVE, &trans->status)) {
1297 1298
			IWL_WARN(trans,
				 "HCMD_ACTIVE already clear for command %s\n",
1299
				 iwl_get_cmd_string(trans, cmd_id));
1300
		}
1301
		clear_bit(STATUS_SYNC_HCMD_ACTIVE, &trans->status);
1302
		IWL_DEBUG_INFO(trans, "Clearing HCMD_ACTIVE for command %s\n",
1303
			       iwl_get_cmd_string(trans, cmd_id));
1304
		wake_up(&trans_pcie->wait_command_queue);
1305
	}
1306

Z
Zhu Yi 已提交
1307
	meta->flags = 0;
1308

1309
	spin_unlock_bh(&txq->lock);
1310
}
1311

1312
#define HOST_COMPLETE_TIMEOUT	(2 * HZ)
1313

1314 1315
static int iwl_pcie_send_hcmd_async(struct iwl_trans *trans,
				    struct iwl_host_cmd *cmd)
1316 1317 1318 1319 1320 1321 1322
{
	int ret;

	/* An asynchronous command can not expect an SKB to be set. */
	if (WARN_ON(cmd->flags & CMD_WANT_SKB))
		return -EINVAL;

1323
	ret = iwl_pcie_enqueue_hcmd(trans, cmd);
1324
	if (ret < 0) {
1325
		IWL_ERR(trans,
1326
			"Error sending %s: enqueue_hcmd failed: %d\n",
1327
			iwl_get_cmd_string(trans, cmd->id), ret);
1328 1329 1330 1331 1332
		return ret;
	}
	return 0;
}

1333 1334
static int iwl_pcie_send_hcmd_sync(struct iwl_trans *trans,
				   struct iwl_host_cmd *cmd)
1335
{
1336
	struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans);
1337
	struct iwl_txq *txq = trans->txqs.txq[trans->txqs.cmd.q_id];
1338 1339 1340
	int cmd_idx;
	int ret;

1341
	IWL_DEBUG_INFO(trans, "Attempting to send sync command %s\n",
1342
		       iwl_get_cmd_string(trans, cmd->id));
1343

1344 1345
	if (WARN(test_and_set_bit(STATUS_SYNC_HCMD_ACTIVE,
				  &trans->status),
1346
		 "Command %s: a command is already active!\n",
1347
		 iwl_get_cmd_string(trans, cmd->id)))
1348 1349
		return -EIO;

1350
	IWL_DEBUG_INFO(trans, "Setting HCMD_ACTIVE for command %s\n",
1351
		       iwl_get_cmd_string(trans, cmd->id));
1352

1353
	cmd_idx = iwl_pcie_enqueue_hcmd(trans, cmd);
1354 1355
	if (cmd_idx < 0) {
		ret = cmd_idx;
1356
		clear_bit(STATUS_SYNC_HCMD_ACTIVE, &trans->status);
1357
		IWL_ERR(trans,
1358
			"Error sending %s: enqueue_hcmd failed: %d\n",
1359
			iwl_get_cmd_string(trans, cmd->id), ret);
1360 1361 1362
		return ret;
	}

1363 1364 1365 1366
	ret = wait_event_timeout(trans_pcie->wait_command_queue,
				 !test_bit(STATUS_SYNC_HCMD_ACTIVE,
					   &trans->status),
				 HOST_COMPLETE_TIMEOUT);
1367
	if (!ret) {
1368
		IWL_ERR(trans, "Error sending %s: time out after %dms.\n",
1369
			iwl_get_cmd_string(trans, cmd->id),
1370
			jiffies_to_msecs(HOST_COMPLETE_TIMEOUT));
1371

1372
		IWL_ERR(trans, "Current CMD queue read_ptr %d write_ptr %d\n",
1373
			txq->read_ptr, txq->write_ptr);
1374

1375
		clear_bit(STATUS_SYNC_HCMD_ACTIVE, &trans->status);
1376
		IWL_DEBUG_INFO(trans, "Clearing HCMD_ACTIVE for command %s\n",
1377
			       iwl_get_cmd_string(trans, cmd->id));
1378
		ret = -ETIMEDOUT;
1379

1380
		iwl_trans_pcie_sync_nmi(trans);
1381
		goto cancel;
1382 1383
	}

1384
	if (test_bit(STATUS_FW_ERROR, &trans->status)) {
1385
		iwl_trans_pcie_dump_regs(trans);
1386
		IWL_ERR(trans, "FW error in SYNC CMD %s\n",
1387
			iwl_get_cmd_string(trans, cmd->id));
1388
		dump_stack();
1389 1390 1391 1392
		ret = -EIO;
		goto cancel;
	}

1393
	if (!(cmd->flags & CMD_SEND_IN_RFKILL) &&
1394
	    test_bit(STATUS_RFKILL_OPMODE, &trans->status)) {
1395 1396 1397 1398 1399
		IWL_DEBUG_RF_KILL(trans, "RFKILL in SYNC CMD... no rsp\n");
		ret = -ERFKILL;
		goto cancel;
	}

1400
	if ((cmd->flags & CMD_WANT_SKB) && !cmd->resp_pkt) {
1401
		IWL_ERR(trans, "Error: Response NULL in '%s'\n",
1402
			iwl_get_cmd_string(trans, cmd->id));
1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416
		ret = -EIO;
		goto cancel;
	}

	return 0;

cancel:
	if (cmd->flags & CMD_WANT_SKB) {
		/*
		 * Cancel the CMD_WANT_SKB flag for the cmd in the
		 * TX cmd queue. Otherwise in case the cmd comes
		 * in later, it will possibly set an invalid
		 * address (cmd->meta.source).
		 */
1417
		txq->entries[cmd_idx].meta.flags &= ~CMD_WANT_SKB;
1418
	}
1419

1420 1421 1422
	if (cmd->resp_pkt) {
		iwl_free_resp(cmd);
		cmd->resp_pkt = NULL;
1423 1424 1425 1426 1427
	}

	return ret;
}

1428
int iwl_trans_pcie_send_hcmd(struct iwl_trans *trans, struct iwl_host_cmd *cmd)
1429
{
1430
	/* Make sure the NIC is still alive in the bus */
1431 1432
	if (test_bit(STATUS_TRANS_DEAD, &trans->status))
		return -ENODEV;
1433

1434
	if (!(cmd->flags & CMD_SEND_IN_RFKILL) &&
1435
	    test_bit(STATUS_RFKILL_OPMODE, &trans->status)) {
1436 1437
		IWL_DEBUG_RF_KILL(trans, "Dropping CMD 0x%x: RF KILL\n",
				  cmd->id);
1438
		return -ERFKILL;
1439
	}
1440

1441
	if (cmd->flags & CMD_ASYNC)
1442
		return iwl_pcie_send_hcmd_async(trans, cmd);
1443

1444
	/* We still can fail on RFKILL that can be asserted while we wait */
1445
	return iwl_pcie_send_hcmd_sync(trans, cmd);
1446 1447
}

1448 1449
static int iwl_fill_data_tbs(struct iwl_trans *trans, struct sk_buff *skb,
			     struct iwl_txq *txq, u8 hdr_len,
1450
			     struct iwl_cmd_meta *out_meta)
1451
{
1452
	u16 head_tb_len;
1453 1454 1455 1456 1457 1458
	int i;

	/*
	 * Set up TFD's third entry to point directly to remainder
	 * of skb's head, if any
	 */
1459
	head_tb_len = skb_headlen(skb) - hdr_len;
1460

1461 1462 1463 1464 1465
	if (head_tb_len > 0) {
		dma_addr_t tb_phys = dma_map_single(trans->dev,
						    skb->data + hdr_len,
						    head_tb_len, DMA_TO_DEVICE);
		if (unlikely(dma_mapping_error(trans->dev, tb_phys)))
1466
			return -EINVAL;
1467 1468
		trace_iwlwifi_dev_tx_tb(trans->dev, skb, skb->data + hdr_len,
					tb_phys, head_tb_len);
1469
		iwl_pcie_txq_build_tfd(trans, txq, tb_phys, head_tb_len, false);
1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483
	}

	/* set up the remaining entries to point to the data */
	for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
		const skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
		dma_addr_t tb_phys;
		int tb_idx;

		if (!skb_frag_size(frag))
			continue;

		tb_phys = skb_frag_dma_map(trans->dev, frag, 0,
					   skb_frag_size(frag), DMA_TO_DEVICE);

1484
		if (unlikely(dma_mapping_error(trans->dev, tb_phys)))
1485
			return -EINVAL;
1486 1487
		trace_iwlwifi_dev_tx_tb(trans->dev, skb, skb_frag_address(frag),
					tb_phys, skb_frag_size(frag));
1488 1489
		tb_idx = iwl_pcie_txq_build_tfd(trans, txq, tb_phys,
						skb_frag_size(frag), false);
1490 1491
		if (tb_idx < 0)
			return tb_idx;
1492

1493
		out_meta->tbs |= BIT(tb_idx);
1494 1495 1496 1497 1498
	}

	return 0;
}

1499
#ifdef CONFIG_INET
1500 1501 1502
static int iwl_fill_data_tbs_amsdu(struct iwl_trans *trans, struct sk_buff *skb,
				   struct iwl_txq *txq, u8 hdr_len,
				   struct iwl_cmd_meta *out_meta,
1503 1504
				   struct iwl_device_tx_cmd *dev_cmd,
				   u16 tb1_len)
1505
{
1506
	struct iwl_tx_cmd *tx_cmd = (void *)dev_cmd->payload;
1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520
	struct ieee80211_hdr *hdr = (void *)skb->data;
	unsigned int snap_ip_tcp_hdrlen, ip_hdrlen, total_len, hdr_room;
	unsigned int mss = skb_shinfo(skb)->gso_size;
	u16 length, iv_len, amsdu_pad;
	u8 *start_hdr;
	struct iwl_tso_hdr_page *hdr_page;
	struct tso_t tso;

	/* if the packet is protected, then it must be CCMP or GCMP */
	BUILD_BUG_ON(IEEE80211_CCMP_HDR_LEN != IEEE80211_GCMP_HDR_LEN);
	iv_len = ieee80211_has_protected(hdr->frame_control) ?
		IEEE80211_CCMP_HDR_LEN : 0;

	trace_iwlwifi_dev_tx(trans->dev, skb,
1521
			     iwl_txq_get_tfd(trans, txq, txq->write_ptr),
1522
			     trans->txqs.tfd.size,
1523
			     &dev_cmd->hdr, IWL_FIRST_TB_SIZE + tb1_len, 0);
1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534

	ip_hdrlen = skb_transport_header(skb) - skb_network_header(skb);
	snap_ip_tcp_hdrlen = 8 + ip_hdrlen + tcp_hdrlen(skb);
	total_len = skb->len - snap_ip_tcp_hdrlen - hdr_len - iv_len;
	amsdu_pad = 0;

	/* total amount of header we may need for this A-MSDU */
	hdr_room = DIV_ROUND_UP(total_len, mss) *
		(3 + snap_ip_tcp_hdrlen + sizeof(struct ethhdr)) + iv_len;

	/* Our device supports 9 segments at most, it will fit in 1 page */
1535
	hdr_page = get_page_hdr(trans, hdr_room, skb);
1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548
	if (!hdr_page)
		return -ENOMEM;

	start_hdr = hdr_page->pos;
	memcpy(hdr_page->pos, skb->data + hdr_len, iv_len);
	hdr_page->pos += iv_len;

	/*
	 * Pull the ieee80211 header + IV to be able to use TSO core,
	 * we will restore it for the tx_status flow.
	 */
	skb_pull(skb, hdr_len + iv_len);

1549 1550 1551 1552 1553 1554 1555
	/*
	 * Remove the length of all the headers that we don't actually
	 * have in the MPDU by themselves, but that we duplicate into
	 * all the different MSDUs inside the A-MSDU.
	 */
	le16_add_cpu(&tx_cmd->len, -snap_ip_tcp_hdrlen);

1556 1557 1558 1559 1560 1561 1562 1563 1564
	tso_start(skb, &tso);

	while (total_len) {
		/* this is the data left for this subframe */
		unsigned int data_left =
			min_t(unsigned int, mss, total_len);
		struct sk_buff *csum_skb = NULL;
		unsigned int hdr_tb_len;
		dma_addr_t hdr_tb_phys;
E
Emmanuel Grumbach 已提交
1565
		u8 *subf_hdrs_start = hdr_page->pos;
1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594

		total_len -= data_left;

		memset(hdr_page->pos, 0, amsdu_pad);
		hdr_page->pos += amsdu_pad;
		amsdu_pad = (4 - (sizeof(struct ethhdr) + snap_ip_tcp_hdrlen +
				  data_left)) & 0x3;
		ether_addr_copy(hdr_page->pos, ieee80211_get_DA(hdr));
		hdr_page->pos += ETH_ALEN;
		ether_addr_copy(hdr_page->pos, ieee80211_get_SA(hdr));
		hdr_page->pos += ETH_ALEN;

		length = snap_ip_tcp_hdrlen + data_left;
		*((__be16 *)hdr_page->pos) = cpu_to_be16(length);
		hdr_page->pos += sizeof(length);

		/*
		 * This will copy the SNAP as well which will be considered
		 * as MAC header.
		 */
		tso_build_hdr(skb, hdr_page->pos, &tso, data_left, !total_len);

		hdr_page->pos += snap_ip_tcp_hdrlen;

		hdr_tb_len = hdr_page->pos - start_hdr;
		hdr_tb_phys = dma_map_single(trans->dev, start_hdr,
					     hdr_tb_len, DMA_TO_DEVICE);
		if (unlikely(dma_mapping_error(trans->dev, hdr_tb_phys))) {
			dev_kfree_skb(csum_skb);
1595
			return -EINVAL;
1596 1597 1598
		}
		iwl_pcie_txq_build_tfd(trans, txq, hdr_tb_phys,
				       hdr_tb_len, false);
1599
		trace_iwlwifi_dev_tx_tb(trans->dev, skb, start_hdr,
1600
					hdr_tb_phys, hdr_tb_len);
1601 1602
		/* add this subframe's headers' length to the tx_cmd */
		le16_add_cpu(&tx_cmd->len, hdr_page->pos - subf_hdrs_start);
1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616

		/* prepare the start_hdr for the next subframe */
		start_hdr = hdr_page->pos;

		/* put the payload */
		while (data_left) {
			unsigned int size = min_t(unsigned int, tso.size,
						  data_left);
			dma_addr_t tb_phys;

			tb_phys = dma_map_single(trans->dev, tso.data,
						 size, DMA_TO_DEVICE);
			if (unlikely(dma_mapping_error(trans->dev, tb_phys))) {
				dev_kfree_skb(csum_skb);
1617
				return -EINVAL;
1618 1619 1620 1621
			}

			iwl_pcie_txq_build_tfd(trans, txq, tb_phys,
					       size, false);
1622
			trace_iwlwifi_dev_tx_tb(trans->dev, skb, tso.data,
1623
						tb_phys, size);
1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638

			data_left -= size;
			tso_build_data(skb, &tso, size);
		}
	}

	/* re -add the WiFi header and IV */
	skb_push(skb, hdr_len + iv_len);

	return 0;
}
#else /* CONFIG_INET */
static int iwl_fill_data_tbs_amsdu(struct iwl_trans *trans, struct sk_buff *skb,
				   struct iwl_txq *txq, u8 hdr_len,
				   struct iwl_cmd_meta *out_meta,
1639 1640
				   struct iwl_device_tx_cmd *dev_cmd,
				   u16 tb1_len)
1641 1642 1643 1644 1645 1646 1647 1648
{
	/* No A-MSDU without CONFIG_INET */
	WARN_ON(1);

	return -1;
}
#endif /* CONFIG_INET */

1649
int iwl_trans_pcie_tx(struct iwl_trans *trans, struct sk_buff *skb,
1650
		      struct iwl_device_tx_cmd *dev_cmd, int txq_id)
1651
{
J
Johannes Berg 已提交
1652
	struct ieee80211_hdr *hdr;
1653 1654 1655
	struct iwl_tx_cmd *tx_cmd = (struct iwl_tx_cmd *)dev_cmd->payload;
	struct iwl_cmd_meta *out_meta;
	struct iwl_txq *txq;
1656 1657
	dma_addr_t tb0_phys, tb1_phys, scratch_phys;
	void *tb1_addr;
1658
	void *tfd;
1659
	u16 len, tb1_len;
1660
	bool wait_write_ptr;
J
Johannes Berg 已提交
1661 1662
	__le16 fc;
	u8 hdr_len;
1663
	u16 wifi_seq;
1664
	bool amsdu;
1665

1666
	txq = trans->txqs.txq[txq_id];
1667

1668
	if (WARN_ONCE(!test_bit(txq_id, trans->txqs.queue_used),
1669
		      "TX on unused queue %d\n", txq_id))
1670
		return -EINVAL;
1671

J
Johannes Berg 已提交
1672
	if (skb_is_nonlinear(skb) &&
1673
	    skb_shinfo(skb)->nr_frags > IWL_TRANS_MAX_FRAGS(trans) &&
J
Johannes Berg 已提交
1674 1675 1676 1677 1678 1679 1680 1681 1682 1683
	    __skb_linearize(skb))
		return -ENOMEM;

	/* mac80211 always puts the full header into the SKB's head,
	 * so there's no need to check if it's readable there
	 */
	hdr = (struct ieee80211_hdr *)skb->data;
	fc = hdr->frame_control;
	hdr_len = ieee80211_hdrlen(fc);

1684
	spin_lock(&txq->lock);
1685

1686 1687
	if (iwl_txq_space(trans, txq) < txq->high_mark) {
		iwl_txq_stop(trans, txq);
1688 1689

		/* don't put the packet on the ring, if there is no room */
1690
		if (unlikely(iwl_txq_space(trans, txq) < 3)) {
1691
			struct iwl_device_tx_cmd **dev_cmd_ptr;
1692 1693

			dev_cmd_ptr = (void *)((u8 *)skb->cb +
1694
					       trans->txqs.dev_cmd_offs);
1695

1696
			*dev_cmd_ptr = dev_cmd;
1697 1698 1699 1700 1701 1702 1703
			__skb_queue_tail(&txq->overflow_q, skb);

			spin_unlock(&txq->lock);
			return 0;
		}
	}

1704 1705 1706 1707 1708
	/* In AGG mode, the index in the ring must correspond to the WiFi
	 * sequence number. This is a HW requirements to help the SCD to parse
	 * the BA.
	 * Check here that the packets are in the right place on the ring.
	 */
1709
	wifi_seq = IEEE80211_SEQ_TO_SN(le16_to_cpu(hdr->seq_ctrl));
1710
	WARN_ONCE(txq->ampdu &&
1711
		  (wifi_seq & 0xff) != txq->write_ptr,
1712
		  "Q: %d WiFi Seq %d tfdNum %d",
1713
		  txq_id, wifi_seq, txq->write_ptr);
1714 1715

	/* Set up driver data for this TFD */
1716 1717
	txq->entries[txq->write_ptr].skb = skb;
	txq->entries[txq->write_ptr].cmd = dev_cmd;
1718 1719 1720

	dev_cmd->hdr.sequence =
		cpu_to_le16((u16)(QUEUE_TO_SEQ(txq_id) |
1721
			    INDEX_TO_SEQ(txq->write_ptr)));
1722

1723
	tb0_phys = iwl_txq_get_first_tb_dma(txq, txq->write_ptr);
1724 1725 1726 1727 1728 1729
	scratch_phys = tb0_phys + sizeof(struct iwl_cmd_header) +
		       offsetof(struct iwl_tx_cmd, scratch);

	tx_cmd->dram_lsb_ptr = cpu_to_le32(scratch_phys);
	tx_cmd->dram_msb_ptr = iwl_get_dma_hi_addr(scratch_phys);

1730
	/* Set up first empty entry in queue's array of Tx/cmd buffers */
1731
	out_meta = &txq->entries[txq->write_ptr].meta;
J
Johannes Berg 已提交
1732
	out_meta->flags = 0;
1733

1734
	/*
1735 1736 1737 1738
	 * The second TB (tb1) points to the remainder of the TX command
	 * and the 802.11 header - dword aligned size
	 * (This calculation modifies the TX command, so do it before the
	 * setup of the first TB)
1739
	 */
1740
	len = sizeof(struct iwl_tx_cmd) + sizeof(struct iwl_cmd_header) +
1741
	      hdr_len - IWL_FIRST_TB_SIZE;
1742 1743 1744 1745
	/* do not align A-MSDU to dword as the subframe header aligns it */
	amsdu = ieee80211_is_data_qos(fc) &&
		(*ieee80211_get_qos_ctl(hdr) &
		 IEEE80211_QOS_CTL_A_MSDU_PRESENT);
E
Emmanuel Grumbach 已提交
1746
	if (!amsdu) {
1747 1748 1749
		tb1_len = ALIGN(len, 4);
		/* Tell NIC about any 2-byte padding after MAC header */
		if (tb1_len != len)
J
Johannes Berg 已提交
1750
			tx_cmd->tx_flags |= cpu_to_le32(TX_CMD_FLG_MH_PAD);
1751 1752 1753
	} else {
		tb1_len = len;
	}
1754

1755 1756 1757 1758
	/*
	 * The first TB points to bi-directional DMA data, we'll
	 * memcpy the data into it later.
	 */
1759
	iwl_pcie_txq_build_tfd(trans, txq, tb0_phys,
1760
			       IWL_FIRST_TB_SIZE, true);
1761

1762
	/* there must be data left over for TB1 or this code must be changed */
1763
	BUILD_BUG_ON(sizeof(struct iwl_tx_cmd) < IWL_FIRST_TB_SIZE);
1764 1765

	/* map the data for TB1 */
1766
	tb1_addr = ((u8 *)&dev_cmd->hdr) + IWL_FIRST_TB_SIZE;
1767 1768 1769
	tb1_phys = dma_map_single(trans->dev, tb1_addr, tb1_len, DMA_TO_DEVICE);
	if (unlikely(dma_mapping_error(trans->dev, tb1_phys)))
		goto out_err;
1770
	iwl_pcie_txq_build_tfd(trans, txq, tb1_phys, tb1_len, false);
1771

1772
	trace_iwlwifi_dev_tx(trans->dev, skb,
1773
			     iwl_txq_get_tfd(trans, txq, txq->write_ptr),
1774
			     trans->txqs.tfd.size,
1775 1776 1777
			     &dev_cmd->hdr, IWL_FIRST_TB_SIZE + tb1_len,
			     hdr_len);

1778 1779 1780 1781 1782 1783 1784
	/*
	 * If gso_size wasn't set, don't give the frame "amsdu treatment"
	 * (adding subframes, etc.).
	 * This can happen in some testing flows when the amsdu was already
	 * pre-built, and we just need to send the resulting skb.
	 */
	if (amsdu && skb_shinfo(skb)->gso_size) {
1785 1786 1787 1788
		if (unlikely(iwl_fill_data_tbs_amsdu(trans, skb, txq, hdr_len,
						     out_meta, dev_cmd,
						     tb1_len)))
			goto out_err;
1789
	} else {
1790 1791
		struct sk_buff *frag;

1792 1793 1794 1795
		if (unlikely(iwl_fill_data_tbs(trans, skb, txq, hdr_len,
					       out_meta)))
			goto out_err;

1796 1797 1798 1799 1800
		skb_walk_frags(skb, frag) {
			if (unlikely(iwl_fill_data_tbs(trans, frag, txq, 0,
						       out_meta)))
				goto out_err;
		}
1801
	}
J
Johannes Berg 已提交
1802

1803
	/* building the A-MSDU might have changed this data, so memcpy it now */
1804
	memcpy(&txq->first_tb_bufs[txq->write_ptr], dev_cmd, IWL_FIRST_TB_SIZE);
1805

1806
	tfd = iwl_txq_get_tfd(trans, txq, txq->write_ptr);
1807
	/* Set up entry for this TFD in Tx byte-count array */
1808 1809 1810
	iwl_txq_gen1_update_byte_cnt_tbl(trans, txq, le16_to_cpu(tx_cmd->len),
					 iwl_txq_gen1_tfd_get_num_tbs(trans,
								      tfd));
1811

1812
	wait_write_ptr = ieee80211_has_morefrags(fc);
1813

1814
	/* start timer if queue currently empty */
1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826
	if (txq->read_ptr == txq->write_ptr && txq->wd_timeout) {
		/*
		 * If the TXQ is active, then set the timer, if not,
		 * set the timer in remainder so that the timer will
		 * be armed with the right value when the station will
		 * wake up.
		 */
		if (!txq->frozen)
			mod_timer(&txq->stuck_timer,
				  jiffies + txq->wd_timeout);
		else
			txq->frozen_expiry_remainder = txq->wd_timeout;
1827
	}
1828 1829

	/* Tell device the write index *just past* this latest filled TFD */
1830
	txq->write_ptr = iwl_txq_inc_wrap(trans, txq->write_ptr);
1831 1832
	if (!wait_write_ptr)
		iwl_pcie_txq_inc_wr_ptr(trans, txq);
1833 1834 1835

	/*
	 * At this point the frame is "transmitted" successfully
1836
	 * and we will get a TX status notification eventually.
1837 1838 1839 1840
	 */
	spin_unlock(&txq->lock);
	return 0;
out_err:
1841
	iwl_txq_gen1_tfd_unmap(trans, out_meta, txq, txq->write_ptr);
1842 1843
	spin_unlock(&txq->lock);
	return -1;
1844
}