1 // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause 2 /* 3 * Copyright (C) 2003-2014, 2018-2021, 2023-2025 Intel Corporation 4 * Copyright (C) 2013-2015 Intel Mobile Communications GmbH 5 * Copyright (C) 2016-2017 Intel Deutschland GmbH 6 */ 7 #include <linux/etherdevice.h> 8 #include <linux/ieee80211.h> 9 #include <linux/dmapool.h> 10 #include <linux/slab.h> 11 #include <linux/sched.h> 12 #include <linux/tcp.h> 13 #include <net/ip6_checksum.h> 14 #include <net/tso.h> 15 16 #include "fw/api/commands.h" 17 #include "fw/api/datapath.h" 18 #include "fw/api/debug.h" 19 #include "iwl-fh.h" 20 #include "iwl-debug.h" 21 #include "iwl-csr.h" 22 #include "iwl-prph.h" 23 #include "iwl-io.h" 24 #include "iwl-scd.h" 25 #include "iwl-op-mode.h" 26 #include "internal.h" 27 #include "fw/api/tx.h" 28 #include "pcie/utils.h" 29 30 /*************** DMA-QUEUE-GENERAL-FUNCTIONS ***** 31 * DMA services 32 * 33 * Theory of operation 34 * 35 * A Tx or Rx queue resides in host DRAM, and is comprised of a circular buffer 36 * of buffer descriptors, each of which points to one or more data buffers for 37 * the device to read from or fill. Driver and device exchange status of each 38 * queue via "read" and "write" pointers. Driver keeps minimum of 2 empty 39 * entries in each circular buffer, to protect against confusing empty and full 40 * queue states. 41 * 42 * The device reads or writes the data in the queues via the device's several 43 * DMA/FIFO channels. Each queue is mapped to a single DMA channel. 44 * 45 * For Tx queue, there are low mark and high mark limits. If, after queuing 46 * the packet for Tx, free space become < low mark, Tx queue stopped. When 47 * reclaiming packets (on 'tx done IRQ), if free space become > high mark, 48 * Tx queue resumed. 49 * 50 ***************************************************/ 51 52 53 int iwl_pcie_alloc_dma_ptr(struct iwl_trans *trans, 54 struct iwl_dma_ptr *ptr, size_t size) 55 { 56 if (WARN_ON(ptr->addr)) 57 return -EINVAL; 58 59 ptr->addr = dma_alloc_coherent(trans->dev, size, 60 &ptr->dma, GFP_KERNEL); 61 if (!ptr->addr) 62 return -ENOMEM; 63 ptr->size = size; 64 return 0; 65 } 66 67 void iwl_pcie_free_dma_ptr(struct iwl_trans *trans, struct iwl_dma_ptr *ptr) 68 { 69 if (unlikely(!ptr->addr)) 70 return; 71 72 dma_free_coherent(trans->dev, ptr->size, ptr->addr, ptr->dma); 73 memset(ptr, 0, sizeof(*ptr)); 74 } 75 76 /* 77 * iwl_pcie_txq_inc_wr_ptr - Send new write index to hardware 78 */ 79 static void iwl_pcie_txq_inc_wr_ptr(struct iwl_trans *trans, 80 struct iwl_txq *txq) 81 { 82 u32 reg = 0; 83 int txq_id = txq->id; 84 85 lockdep_assert_held(&txq->lock); 86 87 /* 88 * explicitly wake up the NIC if: 89 * 1. shadow registers aren't enabled 90 * 2. NIC is woken up for CMD regardless of shadow outside this function 91 * 3. there is a chance that the NIC is asleep 92 */ 93 if (!trans->mac_cfg->base->shadow_reg_enable && 94 txq_id != trans->conf.cmd_queue && 95 test_bit(STATUS_TPOWER_PMI, &trans->status)) { 96 /* 97 * wake up nic if it's powered down ... 98 * uCode will wake up, and interrupt us again, so next 99 * time we'll skip this part. 100 */ 101 reg = iwl_read32(trans, CSR_UCODE_DRV_GP1); 102 103 if (reg & CSR_UCODE_DRV_GP1_BIT_MAC_SLEEP) { 104 IWL_DEBUG_INFO(trans, "Tx queue %d requesting wakeup, GP1 = 0x%x\n", 105 txq_id, reg); 106 iwl_set_bit(trans, CSR_GP_CNTRL, 107 CSR_GP_CNTRL_REG_FLAG_MAC_ACCESS_REQ); 108 txq->need_update = true; 109 return; 110 } 111 } 112 113 /* 114 * if not in power-save mode, uCode will never sleep when we're 115 * trying to tx (during RFKILL, we're not trying to tx). 116 */ 117 IWL_DEBUG_TX(trans, "Q:%d WR: 0x%x\n", txq_id, txq->write_ptr); 118 if (!txq->block) 119 iwl_write32(trans, HBUS_TARG_WRPTR, 120 txq->write_ptr | (txq_id << 8)); 121 } 122 123 void iwl_pcie_txq_check_wrptrs(struct iwl_trans *trans) 124 { 125 struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); 126 int i; 127 128 for (i = 0; i < trans->mac_cfg->base->num_of_queues; i++) { 129 struct iwl_txq *txq = trans_pcie->txqs.txq[i]; 130 131 if (!test_bit(i, trans_pcie->txqs.queue_used)) 132 continue; 133 134 spin_lock_bh(&txq->lock); 135 if (txq->need_update) { 136 iwl_pcie_txq_inc_wr_ptr(trans, txq); 137 txq->need_update = false; 138 } 139 spin_unlock_bh(&txq->lock); 140 } 141 } 142 143 static inline void iwl_pcie_gen1_tfd_set_tb(struct iwl_tfd *tfd, 144 u8 idx, dma_addr_t addr, u16 len) 145 { 146 struct iwl_tfd_tb *tb = &tfd->tbs[idx]; 147 u16 hi_n_len = len << 4; 148 149 put_unaligned_le32(addr, &tb->lo); 150 hi_n_len |= iwl_get_dma_hi_addr(addr); 151 152 tb->hi_n_len = cpu_to_le16(hi_n_len); 153 154 tfd->num_tbs = idx + 1; 155 } 156 157 static inline u8 iwl_txq_gen1_tfd_get_num_tbs(struct iwl_tfd *tfd) 158 { 159 return tfd->num_tbs & 0x1f; 160 } 161 162 static int iwl_pcie_txq_build_tfd(struct iwl_trans *trans, struct iwl_txq *txq, 163 dma_addr_t addr, u16 len, bool reset) 164 { 165 struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); 166 void *tfd; 167 u32 num_tbs; 168 169 tfd = (u8 *)txq->tfds + trans_pcie->txqs.tfd.size * txq->write_ptr; 170 171 if (reset) 172 memset(tfd, 0, trans_pcie->txqs.tfd.size); 173 174 num_tbs = iwl_txq_gen1_tfd_get_num_tbs(tfd); 175 176 /* Each TFD can point to a maximum max_tbs Tx buffers */ 177 if (num_tbs >= trans_pcie->txqs.tfd.max_tbs) { 178 IWL_ERR(trans, "Error can not send more than %d chunks\n", 179 trans_pcie->txqs.tfd.max_tbs); 180 return -EINVAL; 181 } 182 183 if (WARN(addr & ~IWL_TX_DMA_MASK, 184 "Unaligned address = %llx\n", (unsigned long long)addr)) 185 return -EINVAL; 186 187 iwl_pcie_gen1_tfd_set_tb(tfd, num_tbs, addr, len); 188 189 return num_tbs; 190 } 191 192 static void iwl_pcie_clear_cmd_in_flight(struct iwl_trans *trans) 193 { 194 struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); 195 196 if (!trans->mac_cfg->base->apmg_wake_up_wa) 197 return; 198 199 spin_lock(&trans_pcie->reg_lock); 200 201 if (WARN_ON(!trans_pcie->cmd_hold_nic_awake)) { 202 spin_unlock(&trans_pcie->reg_lock); 203 return; 204 } 205 206 trans_pcie->cmd_hold_nic_awake = false; 207 iwl_trans_clear_bit(trans, CSR_GP_CNTRL, 208 CSR_GP_CNTRL_REG_FLAG_MAC_ACCESS_REQ); 209 spin_unlock(&trans_pcie->reg_lock); 210 } 211 212 static void iwl_pcie_free_and_unmap_tso_page(struct iwl_trans *trans, 213 struct page *page) 214 { 215 struct iwl_tso_page_info *info = IWL_TSO_PAGE_INFO(page_address(page)); 216 217 /* Decrease internal use count and unmap/free page if needed */ 218 if (refcount_dec_and_test(&info->use_count)) { 219 dma_unmap_page(trans->dev, info->dma_addr, PAGE_SIZE, 220 DMA_TO_DEVICE); 221 222 __free_page(page); 223 } 224 } 225 226 void iwl_pcie_free_tso_pages(struct iwl_trans *trans, struct sk_buff *skb, 227 struct iwl_cmd_meta *cmd_meta) 228 { 229 struct page **page_ptr; 230 struct page *next; 231 232 page_ptr = (void *)((u8 *)skb->cb + trans->conf.cb_data_offs); 233 next = *page_ptr; 234 *page_ptr = NULL; 235 236 while (next) { 237 struct iwl_tso_page_info *info; 238 struct page *tmp = next; 239 240 info = IWL_TSO_PAGE_INFO(page_address(next)); 241 next = info->next; 242 243 /* Unmap the scatter gather list that is on the last page */ 244 if (!next && cmd_meta->sg_offset) { 245 struct sg_table *sgt; 246 247 sgt = (void *)((u8 *)page_address(tmp) + 248 cmd_meta->sg_offset); 249 250 dma_unmap_sgtable(trans->dev, sgt, DMA_TO_DEVICE, 0); 251 } 252 253 iwl_pcie_free_and_unmap_tso_page(trans, tmp); 254 } 255 } 256 257 static inline dma_addr_t 258 iwl_txq_gen1_tfd_tb_get_addr(struct iwl_tfd *tfd, u8 idx) 259 { 260 struct iwl_tfd_tb *tb = &tfd->tbs[idx]; 261 dma_addr_t addr; 262 dma_addr_t hi_len; 263 264 addr = get_unaligned_le32(&tb->lo); 265 266 if (sizeof(dma_addr_t) <= sizeof(u32)) 267 return addr; 268 269 hi_len = le16_to_cpu(tb->hi_n_len) & 0xF; 270 271 /* 272 * shift by 16 twice to avoid warnings on 32-bit 273 * (where this code never runs anyway due to the 274 * if statement above) 275 */ 276 return addr | ((hi_len << 16) << 16); 277 } 278 279 static void iwl_txq_set_tfd_invalid_gen1(struct iwl_trans *trans, 280 struct iwl_tfd *tfd) 281 { 282 struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); 283 284 tfd->num_tbs = 0; 285 286 iwl_pcie_gen1_tfd_set_tb(tfd, 0, trans_pcie->invalid_tx_cmd.dma, 287 trans_pcie->invalid_tx_cmd.size); 288 } 289 290 static void iwl_txq_gen1_tfd_unmap(struct iwl_trans *trans, 291 struct iwl_cmd_meta *meta, 292 struct iwl_txq *txq, int index) 293 { 294 struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); 295 int i, num_tbs; 296 struct iwl_tfd *tfd = iwl_txq_get_tfd(trans, txq, index); 297 298 /* Sanity check on number of chunks */ 299 num_tbs = iwl_txq_gen1_tfd_get_num_tbs(tfd); 300 301 if (num_tbs > trans_pcie->txqs.tfd.max_tbs) { 302 IWL_ERR(trans, "Too many chunks: %i\n", num_tbs); 303 /* @todo issue fatal error, it is quite serious situation */ 304 return; 305 } 306 307 /* TB1 is mapped directly, the rest is the TSO page and SG list. */ 308 if (meta->sg_offset) 309 num_tbs = 2; 310 311 /* first TB is never freed - it's the bidirectional DMA data */ 312 313 for (i = 1; i < num_tbs; i++) { 314 if (meta->tbs & BIT(i)) 315 dma_unmap_page(trans->dev, 316 iwl_txq_gen1_tfd_tb_get_addr(tfd, i), 317 iwl_txq_gen1_tfd_tb_get_len(trans, 318 tfd, i), 319 DMA_TO_DEVICE); 320 else 321 dma_unmap_single(trans->dev, 322 iwl_txq_gen1_tfd_tb_get_addr(tfd, i), 323 iwl_txq_gen1_tfd_tb_get_len(trans, 324 tfd, i), 325 DMA_TO_DEVICE); 326 } 327 328 meta->tbs = 0; 329 330 iwl_txq_set_tfd_invalid_gen1(trans, tfd); 331 } 332 333 /** 334 * iwl_txq_free_tfd - Free all chunks referenced by TFD [txq->q.read_ptr] 335 * @trans: transport private data 336 * @txq: tx queue 337 * @read_ptr: the TXQ read_ptr to free 338 * 339 * Does NOT advance any TFD circular buffer read/write indexes 340 * Does NOT free the TFD itself (which is within circular buffer) 341 */ 342 static void iwl_txq_free_tfd(struct iwl_trans *trans, struct iwl_txq *txq, 343 int read_ptr) 344 { 345 /* rd_ptr is bounded by TFD_QUEUE_SIZE_MAX and 346 * idx is bounded by n_window 347 */ 348 int idx = iwl_txq_get_cmd_index(txq, read_ptr); 349 struct sk_buff *skb; 350 351 lockdep_assert_held(&txq->reclaim_lock); 352 353 if (!txq->entries) 354 return; 355 356 /* We have only q->n_window txq->entries, but we use 357 * TFD_QUEUE_SIZE_MAX tfds 358 */ 359 if (trans->mac_cfg->gen2) 360 iwl_txq_gen2_tfd_unmap(trans, &txq->entries[idx].meta, 361 iwl_txq_get_tfd(trans, txq, read_ptr)); 362 else 363 iwl_txq_gen1_tfd_unmap(trans, &txq->entries[idx].meta, 364 txq, read_ptr); 365 366 /* free SKB */ 367 skb = txq->entries[idx].skb; 368 369 /* Can be called from irqs-disabled context 370 * If skb is not NULL, it means that the whole queue is being 371 * freed and that the queue is not empty - free the skb 372 */ 373 if (skb) { 374 iwl_op_mode_free_skb(trans->op_mode, skb); 375 txq->entries[idx].skb = NULL; 376 } 377 } 378 379 /* 380 * iwl_pcie_txq_unmap - Unmap any remaining DMA mappings and free skb's 381 */ 382 static void iwl_pcie_txq_unmap(struct iwl_trans *trans, int txq_id) 383 { 384 struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); 385 struct iwl_txq *txq = trans_pcie->txqs.txq[txq_id]; 386 387 if (!txq) { 388 IWL_ERR(trans, "Trying to free a queue that wasn't allocated?\n"); 389 return; 390 } 391 392 spin_lock_bh(&txq->reclaim_lock); 393 spin_lock(&txq->lock); 394 while (txq->write_ptr != txq->read_ptr) { 395 IWL_DEBUG_TX_REPLY(trans, "Q %d Free %d\n", 396 txq_id, txq->read_ptr); 397 398 if (txq_id != trans->conf.cmd_queue) { 399 struct sk_buff *skb = txq->entries[txq->read_ptr].skb; 400 struct iwl_cmd_meta *cmd_meta = 401 &txq->entries[txq->read_ptr].meta; 402 403 if (WARN_ON_ONCE(!skb)) 404 continue; 405 406 iwl_pcie_free_tso_pages(trans, skb, cmd_meta); 407 } 408 iwl_txq_free_tfd(trans, txq, txq->read_ptr); 409 txq->read_ptr = iwl_txq_inc_wrap(trans, txq->read_ptr); 410 411 if (txq->read_ptr == txq->write_ptr && 412 txq_id == trans->conf.cmd_queue) 413 iwl_pcie_clear_cmd_in_flight(trans); 414 } 415 416 while (!skb_queue_empty(&txq->overflow_q)) { 417 struct sk_buff *skb = __skb_dequeue(&txq->overflow_q); 418 419 iwl_op_mode_free_skb(trans->op_mode, skb); 420 } 421 422 spin_unlock(&txq->lock); 423 spin_unlock_bh(&txq->reclaim_lock); 424 425 /* just in case - this queue may have been stopped */ 426 iwl_trans_pcie_wake_queue(trans, txq); 427 } 428 429 /* 430 * iwl_pcie_txq_free - Deallocate DMA queue. 431 * @txq: Transmit queue to deallocate. 432 * 433 * Empty queue by removing and destroying all BD's. 434 * Free all buffers. 435 * 0-fill, but do not free "txq" descriptor structure. 436 */ 437 static void iwl_pcie_txq_free(struct iwl_trans *trans, int txq_id) 438 { 439 struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); 440 struct iwl_txq *txq = trans_pcie->txqs.txq[txq_id]; 441 struct device *dev = trans->dev; 442 int i; 443 444 if (WARN_ON(!txq)) 445 return; 446 447 iwl_pcie_txq_unmap(trans, txq_id); 448 449 /* De-alloc array of command/tx buffers */ 450 if (txq_id == trans->conf.cmd_queue) 451 for (i = 0; i < txq->n_window; i++) { 452 kfree_sensitive(txq->entries[i].cmd); 453 kfree_sensitive(txq->entries[i].free_buf); 454 } 455 456 /* De-alloc circular buffer of TFDs */ 457 if (txq->tfds) { 458 dma_free_coherent(dev, 459 trans_pcie->txqs.tfd.size * 460 trans->mac_cfg->base->max_tfd_queue_size, 461 txq->tfds, txq->dma_addr); 462 txq->dma_addr = 0; 463 txq->tfds = NULL; 464 465 dma_free_coherent(dev, 466 sizeof(*txq->first_tb_bufs) * txq->n_window, 467 txq->first_tb_bufs, txq->first_tb_dma); 468 } 469 470 kfree(txq->entries); 471 txq->entries = NULL; 472 473 timer_delete_sync(&txq->stuck_timer); 474 475 /* 0-fill queue descriptor structure */ 476 memset(txq, 0, sizeof(*txq)); 477 } 478 479 void iwl_pcie_tx_start(struct iwl_trans *trans) 480 { 481 struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); 482 int nq = trans->mac_cfg->base->num_of_queues; 483 int chan; 484 u32 reg_val; 485 int clear_dwords = (SCD_TRANS_TBL_OFFSET_QUEUE(nq) - 486 SCD_CONTEXT_MEM_LOWER_BOUND) / sizeof(u32); 487 488 /* make sure all queue are not stopped/used */ 489 memset(trans_pcie->txqs.queue_stopped, 0, 490 sizeof(trans_pcie->txqs.queue_stopped)); 491 memset(trans_pcie->txqs.queue_used, 0, 492 sizeof(trans_pcie->txqs.queue_used)); 493 494 trans_pcie->scd_base_addr = 495 iwl_read_prph(trans, SCD_SRAM_BASE_ADDR); 496 497 /* reset context data, TX status and translation data */ 498 iwl_trans_write_mem(trans, trans_pcie->scd_base_addr + 499 SCD_CONTEXT_MEM_LOWER_BOUND, 500 NULL, clear_dwords); 501 502 iwl_write_prph(trans, SCD_DRAM_BASE_ADDR, 503 trans_pcie->txqs.scd_bc_tbls.dma >> 10); 504 505 /* The chain extension of the SCD doesn't work well. This feature is 506 * enabled by default by the HW, so we need to disable it manually. 507 */ 508 if (trans->mac_cfg->base->scd_chain_ext_wa) 509 iwl_write_prph(trans, SCD_CHAINEXT_EN, 0); 510 511 iwl_trans_ac_txq_enable(trans, trans->conf.cmd_queue, 512 trans->conf.cmd_fifo, 513 IWL_DEF_WD_TIMEOUT); 514 515 /* Activate all Tx DMA/FIFO channels */ 516 iwl_scd_activate_fifos(trans); 517 518 /* Enable DMA channel */ 519 for (chan = 0; chan < FH_TCSR_CHNL_NUM; chan++) 520 iwl_write_direct32(trans, FH_TCSR_CHNL_TX_CONFIG_REG(chan), 521 FH_TCSR_TX_CONFIG_REG_VAL_DMA_CHNL_ENABLE | 522 FH_TCSR_TX_CONFIG_REG_VAL_DMA_CREDIT_ENABLE); 523 524 /* Update FH chicken bits */ 525 reg_val = iwl_read_direct32(trans, FH_TX_CHICKEN_BITS_REG); 526 iwl_write_direct32(trans, FH_TX_CHICKEN_BITS_REG, 527 reg_val | FH_TX_CHICKEN_BITS_SCD_AUTO_RETRY_EN); 528 529 /* Enable L1-Active */ 530 if (trans->mac_cfg->device_family < IWL_DEVICE_FAMILY_8000) 531 iwl_clear_bits_prph(trans, APMG_PCIDEV_STT_REG, 532 APMG_PCIDEV_STT_VAL_L1_ACT_DIS); 533 } 534 535 void iwl_trans_pcie_tx_reset(struct iwl_trans *trans) 536 { 537 struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); 538 int txq_id; 539 540 /* 541 * we should never get here in gen2 trans mode return early to avoid 542 * having invalid accesses 543 */ 544 if (WARN_ON_ONCE(trans->mac_cfg->gen2)) 545 return; 546 547 for (txq_id = 0; txq_id < trans->mac_cfg->base->num_of_queues; 548 txq_id++) { 549 struct iwl_txq *txq = trans_pcie->txqs.txq[txq_id]; 550 if (trans->mac_cfg->gen2) 551 iwl_write_direct64(trans, 552 FH_MEM_CBBC_QUEUE(trans, txq_id), 553 txq->dma_addr); 554 else 555 iwl_write_direct32(trans, 556 FH_MEM_CBBC_QUEUE(trans, txq_id), 557 txq->dma_addr >> 8); 558 iwl_pcie_txq_unmap(trans, txq_id); 559 txq->read_ptr = 0; 560 txq->write_ptr = 0; 561 } 562 563 /* Tell NIC where to find the "keep warm" buffer */ 564 iwl_write_direct32(trans, FH_KW_MEM_ADDR_REG, 565 trans_pcie->kw.dma >> 4); 566 567 /* 568 * Send 0 as the scd_base_addr since the device may have be reset 569 * while we were in WoWLAN in which case SCD_SRAM_BASE_ADDR will 570 * contain garbage. 571 */ 572 iwl_pcie_tx_start(trans); 573 } 574 575 static void iwl_pcie_tx_stop_fh(struct iwl_trans *trans) 576 { 577 struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); 578 int ch, ret; 579 u32 mask = 0; 580 581 spin_lock_bh(&trans_pcie->irq_lock); 582 583 if (!iwl_trans_grab_nic_access(trans)) 584 goto out; 585 586 /* Stop each Tx DMA channel */ 587 for (ch = 0; ch < FH_TCSR_CHNL_NUM; ch++) { 588 iwl_write32(trans, FH_TCSR_CHNL_TX_CONFIG_REG(ch), 0x0); 589 mask |= FH_TSSR_TX_STATUS_REG_MSK_CHNL_IDLE(ch); 590 } 591 592 /* Wait for DMA channels to be idle */ 593 ret = iwl_poll_bit(trans, FH_TSSR_TX_STATUS_REG, mask, mask, 5000); 594 if (ret < 0) 595 IWL_ERR(trans, 596 "Failing on timeout while stopping DMA channel %d [0x%08x]\n", 597 ch, iwl_read32(trans, FH_TSSR_TX_STATUS_REG)); 598 599 iwl_trans_release_nic_access(trans); 600 601 out: 602 spin_unlock_bh(&trans_pcie->irq_lock); 603 } 604 605 /* 606 * iwl_pcie_tx_stop - Stop all Tx DMA channels 607 */ 608 int iwl_pcie_tx_stop(struct iwl_trans *trans) 609 { 610 struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); 611 int txq_id; 612 613 /* Turn off all Tx DMA fifos */ 614 iwl_scd_deactivate_fifos(trans); 615 616 /* Turn off all Tx DMA channels */ 617 iwl_pcie_tx_stop_fh(trans); 618 619 /* 620 * This function can be called before the op_mode disabled the 621 * queues. This happens when we have an rfkill interrupt. 622 * Since we stop Tx altogether - mark the queues as stopped. 623 */ 624 memset(trans_pcie->txqs.queue_stopped, 0, 625 sizeof(trans_pcie->txqs.queue_stopped)); 626 memset(trans_pcie->txqs.queue_used, 0, 627 sizeof(trans_pcie->txqs.queue_used)); 628 629 /* This can happen: start_hw, stop_device */ 630 if (!trans_pcie->txq_memory) 631 return 0; 632 633 /* Unmap DMA from host system and free skb's */ 634 for (txq_id = 0; txq_id < trans->mac_cfg->base->num_of_queues; 635 txq_id++) 636 iwl_pcie_txq_unmap(trans, txq_id); 637 638 return 0; 639 } 640 641 /* 642 * iwl_trans_tx_free - Free TXQ Context 643 * 644 * Destroy all TX DMA queues and structures 645 */ 646 void iwl_pcie_tx_free(struct iwl_trans *trans) 647 { 648 int txq_id; 649 struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); 650 651 memset(trans_pcie->txqs.queue_used, 0, 652 sizeof(trans_pcie->txqs.queue_used)); 653 654 /* Tx queues */ 655 if (trans_pcie->txq_memory) { 656 for (txq_id = 0; 657 txq_id < trans->mac_cfg->base->num_of_queues; 658 txq_id++) { 659 iwl_pcie_txq_free(trans, txq_id); 660 trans_pcie->txqs.txq[txq_id] = NULL; 661 } 662 } 663 664 kfree(trans_pcie->txq_memory); 665 trans_pcie->txq_memory = NULL; 666 667 iwl_pcie_free_dma_ptr(trans, &trans_pcie->kw); 668 669 iwl_pcie_free_dma_ptr(trans, &trans_pcie->txqs.scd_bc_tbls); 670 } 671 672 void iwl_txq_log_scd_error(struct iwl_trans *trans, struct iwl_txq *txq) 673 { 674 u32 txq_id = txq->id; 675 u32 status; 676 bool active; 677 u8 fifo; 678 679 if (trans->mac_cfg->gen2) { 680 IWL_ERR(trans, "Queue %d is stuck %d %d\n", txq_id, 681 txq->read_ptr, txq->write_ptr); 682 /* TODO: access new SCD registers and dump them */ 683 return; 684 } 685 686 status = iwl_read_prph(trans, SCD_QUEUE_STATUS_BITS(txq_id)); 687 fifo = (status >> SCD_QUEUE_STTS_REG_POS_TXF) & 0x7; 688 active = !!(status & BIT(SCD_QUEUE_STTS_REG_POS_ACTIVE)); 689 690 IWL_ERR(trans, 691 "Queue %d is %sactive on fifo %d and stuck for %u ms. SW [%d, %d] HW [%d, %d] FH TRB=0x0%x\n", 692 txq_id, active ? "" : "in", fifo, 693 jiffies_to_msecs(txq->wd_timeout), 694 txq->read_ptr, txq->write_ptr, 695 iwl_read_prph(trans, SCD_QUEUE_RDPTR(txq_id)) & 696 (trans->mac_cfg->base->max_tfd_queue_size - 1), 697 iwl_read_prph(trans, SCD_QUEUE_WRPTR(txq_id)) & 698 (trans->mac_cfg->base->max_tfd_queue_size - 1), 699 iwl_read_direct32(trans, FH_TX_TRB_REG(fifo))); 700 } 701 702 static void iwl_txq_stuck_timer(struct timer_list *t) 703 { 704 struct iwl_txq *txq = timer_container_of(txq, t, stuck_timer); 705 struct iwl_trans *trans = txq->trans; 706 707 spin_lock(&txq->lock); 708 /* check if triggered erroneously */ 709 if (txq->read_ptr == txq->write_ptr) { 710 spin_unlock(&txq->lock); 711 return; 712 } 713 spin_unlock(&txq->lock); 714 715 iwl_txq_log_scd_error(trans, txq); 716 717 iwl_force_nmi(trans); 718 } 719 720 int iwl_pcie_txq_alloc(struct iwl_trans *trans, struct iwl_txq *txq, 721 int slots_num, bool cmd_queue) 722 { 723 struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); 724 size_t num_entries = trans->mac_cfg->gen2 ? 725 slots_num : trans->mac_cfg->base->max_tfd_queue_size; 726 size_t tfd_sz; 727 size_t tb0_buf_sz; 728 int i; 729 730 if (WARN_ONCE(slots_num <= 0, "Invalid slots num:%d\n", slots_num)) 731 return -EINVAL; 732 733 if (WARN_ON(txq->entries || txq->tfds)) 734 return -EINVAL; 735 736 tfd_sz = trans_pcie->txqs.tfd.size * num_entries; 737 738 timer_setup(&txq->stuck_timer, iwl_txq_stuck_timer, 0); 739 txq->trans = trans; 740 741 txq->n_window = slots_num; 742 743 txq->entries = kcalloc(slots_num, 744 sizeof(struct iwl_pcie_txq_entry), 745 GFP_KERNEL); 746 747 if (!txq->entries) 748 goto error; 749 750 if (cmd_queue) 751 for (i = 0; i < slots_num; i++) { 752 txq->entries[i].cmd = 753 kmalloc(sizeof(struct iwl_device_cmd), 754 GFP_KERNEL); 755 if (!txq->entries[i].cmd) 756 goto error; 757 } 758 759 /* Circular buffer of transmit frame descriptors (TFDs), 760 * shared with device 761 */ 762 txq->tfds = dma_alloc_coherent(trans->dev, tfd_sz, 763 &txq->dma_addr, GFP_KERNEL); 764 if (!txq->tfds) 765 goto error; 766 767 BUILD_BUG_ON(sizeof(*txq->first_tb_bufs) != IWL_FIRST_TB_SIZE_ALIGN); 768 769 tb0_buf_sz = sizeof(*txq->first_tb_bufs) * slots_num; 770 771 txq->first_tb_bufs = dma_alloc_coherent(trans->dev, tb0_buf_sz, 772 &txq->first_tb_dma, 773 GFP_KERNEL); 774 if (!txq->first_tb_bufs) 775 goto err_free_tfds; 776 777 for (i = 0; i < num_entries; i++) { 778 void *tfd = iwl_txq_get_tfd(trans, txq, i); 779 780 if (trans->mac_cfg->gen2) 781 iwl_txq_set_tfd_invalid_gen2(trans, tfd); 782 else 783 iwl_txq_set_tfd_invalid_gen1(trans, tfd); 784 } 785 786 return 0; 787 err_free_tfds: 788 dma_free_coherent(trans->dev, tfd_sz, txq->tfds, txq->dma_addr); 789 txq->tfds = NULL; 790 error: 791 if (txq->entries && cmd_queue) 792 for (i = 0; i < slots_num; i++) 793 kfree(txq->entries[i].cmd); 794 kfree(txq->entries); 795 txq->entries = NULL; 796 797 return -ENOMEM; 798 } 799 800 #define BC_TABLE_SIZE (sizeof(struct iwl_bc_tbl_entry) * TFD_QUEUE_BC_SIZE) 801 802 /* 803 * iwl_pcie_tx_alloc - allocate TX context 804 * Allocate all Tx DMA structures and initialize them 805 */ 806 static int iwl_pcie_tx_alloc(struct iwl_trans *trans) 807 { 808 int ret; 809 int txq_id, slots_num; 810 struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); 811 u16 bc_tbls_size = trans->mac_cfg->base->num_of_queues; 812 813 if (WARN_ON(trans->mac_cfg->device_family >= IWL_DEVICE_FAMILY_AX210)) 814 return -EINVAL; 815 816 bc_tbls_size *= BC_TABLE_SIZE; 817 818 /*It is not allowed to alloc twice, so warn when this happens. 819 * We cannot rely on the previous allocation, so free and fail */ 820 if (WARN_ON(trans_pcie->txq_memory)) { 821 ret = -EINVAL; 822 goto error; 823 } 824 825 ret = iwl_pcie_alloc_dma_ptr(trans, &trans_pcie->txqs.scd_bc_tbls, 826 bc_tbls_size); 827 if (ret) { 828 IWL_ERR(trans, "Scheduler BC Table allocation failed\n"); 829 goto error; 830 } 831 832 /* Alloc keep-warm buffer */ 833 ret = iwl_pcie_alloc_dma_ptr(trans, &trans_pcie->kw, IWL_KW_SIZE); 834 if (ret) { 835 IWL_ERR(trans, "Keep Warm allocation failed\n"); 836 goto error; 837 } 838 839 trans_pcie->txq_memory = 840 kcalloc(trans->mac_cfg->base->num_of_queues, 841 sizeof(struct iwl_txq), GFP_KERNEL); 842 if (!trans_pcie->txq_memory) { 843 IWL_ERR(trans, "Not enough memory for txq\n"); 844 ret = -ENOMEM; 845 goto error; 846 } 847 848 /* Alloc and init all Tx queues, including the command queue (#4/#9) */ 849 for (txq_id = 0; txq_id < trans->mac_cfg->base->num_of_queues; 850 txq_id++) { 851 bool cmd_queue = (txq_id == trans->conf.cmd_queue); 852 853 if (cmd_queue) 854 slots_num = max_t(u32, IWL_CMD_QUEUE_SIZE, 855 trans->mac_cfg->base->min_txq_size); 856 else 857 slots_num = max_t(u32, IWL_DEFAULT_QUEUE_SIZE, 858 trans->mac_cfg->base->min_ba_txq_size); 859 trans_pcie->txqs.txq[txq_id] = &trans_pcie->txq_memory[txq_id]; 860 ret = iwl_pcie_txq_alloc(trans, trans_pcie->txqs.txq[txq_id], 861 slots_num, cmd_queue); 862 if (ret) { 863 IWL_ERR(trans, "Tx %d queue alloc failed\n", txq_id); 864 goto error; 865 } 866 trans_pcie->txqs.txq[txq_id]->id = txq_id; 867 } 868 869 return 0; 870 871 error: 872 iwl_pcie_tx_free(trans); 873 874 return ret; 875 } 876 877 /* 878 * iwl_queue_init - Initialize queue's high/low-water and read/write indexes 879 */ 880 static int iwl_queue_init(struct iwl_txq *q, int slots_num) 881 { 882 q->n_window = slots_num; 883 884 /* slots_num must be power-of-two size, otherwise 885 * iwl_txq_get_cmd_index is broken. 886 */ 887 if (WARN_ON(!is_power_of_2(slots_num))) 888 return -EINVAL; 889 890 q->low_mark = q->n_window / 4; 891 if (q->low_mark < 4) 892 q->low_mark = 4; 893 894 q->high_mark = q->n_window / 8; 895 if (q->high_mark < 2) 896 q->high_mark = 2; 897 898 q->write_ptr = 0; 899 q->read_ptr = 0; 900 901 return 0; 902 } 903 904 int iwl_txq_init(struct iwl_trans *trans, struct iwl_txq *txq, 905 int slots_num, bool cmd_queue) 906 { 907 u32 tfd_queue_max_size = 908 trans->mac_cfg->base->max_tfd_queue_size; 909 int ret; 910 911 txq->need_update = false; 912 913 /* max_tfd_queue_size must be power-of-two size, otherwise 914 * iwl_txq_inc_wrap and iwl_txq_dec_wrap are broken. 915 */ 916 if (WARN_ONCE(tfd_queue_max_size & (tfd_queue_max_size - 1), 917 "Max tfd queue size must be a power of two, but is %d", 918 tfd_queue_max_size)) 919 return -EINVAL; 920 921 /* Initialize queue's high/low-water marks, and head/tail indexes */ 922 ret = iwl_queue_init(txq, slots_num); 923 if (ret) 924 return ret; 925 926 spin_lock_init(&txq->lock); 927 spin_lock_init(&txq->reclaim_lock); 928 929 if (cmd_queue) { 930 static struct lock_class_key iwl_txq_cmd_queue_lock_class; 931 932 lockdep_set_class(&txq->lock, &iwl_txq_cmd_queue_lock_class); 933 } 934 935 __skb_queue_head_init(&txq->overflow_q); 936 937 return 0; 938 } 939 940 int iwl_pcie_tx_init(struct iwl_trans *trans) 941 { 942 struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); 943 int ret; 944 int txq_id, slots_num; 945 bool alloc = false; 946 947 if (!trans_pcie->txq_memory) { 948 ret = iwl_pcie_tx_alloc(trans); 949 if (ret) 950 goto error; 951 alloc = true; 952 } 953 954 spin_lock_bh(&trans_pcie->irq_lock); 955 956 /* Turn off all Tx DMA fifos */ 957 iwl_scd_deactivate_fifos(trans); 958 959 /* Tell NIC where to find the "keep warm" buffer */ 960 iwl_write_direct32(trans, FH_KW_MEM_ADDR_REG, 961 trans_pcie->kw.dma >> 4); 962 963 spin_unlock_bh(&trans_pcie->irq_lock); 964 965 /* Alloc and init all Tx queues, including the command queue (#4/#9) */ 966 for (txq_id = 0; txq_id < trans->mac_cfg->base->num_of_queues; 967 txq_id++) { 968 bool cmd_queue = (txq_id == trans->conf.cmd_queue); 969 970 if (cmd_queue) 971 slots_num = max_t(u32, IWL_CMD_QUEUE_SIZE, 972 trans->mac_cfg->base->min_txq_size); 973 else 974 slots_num = max_t(u32, IWL_DEFAULT_QUEUE_SIZE, 975 trans->mac_cfg->base->min_ba_txq_size); 976 ret = iwl_txq_init(trans, trans_pcie->txqs.txq[txq_id], slots_num, 977 cmd_queue); 978 if (ret) { 979 IWL_ERR(trans, "Tx %d queue init failed\n", txq_id); 980 goto error; 981 } 982 983 /* 984 * Tell nic where to find circular buffer of TFDs for a 985 * given Tx queue, and enable the DMA channel used for that 986 * queue. 987 * Circular buffer (TFD queue in DRAM) physical base address 988 */ 989 iwl_write_direct32(trans, FH_MEM_CBBC_QUEUE(trans, txq_id), 990 trans_pcie->txqs.txq[txq_id]->dma_addr >> 8); 991 } 992 993 iwl_set_bits_prph(trans, SCD_GP_CTRL, SCD_GP_CTRL_AUTO_ACTIVE_MODE); 994 if (trans->mac_cfg->base->num_of_queues > 20) 995 iwl_set_bits_prph(trans, SCD_GP_CTRL, 996 SCD_GP_CTRL_ENABLE_31_QUEUES); 997 998 return 0; 999 error: 1000 /*Upon error, free only if we allocated something */ 1001 if (alloc) 1002 iwl_pcie_tx_free(trans); 1003 return ret; 1004 } 1005 1006 static int iwl_pcie_set_cmd_in_flight(struct iwl_trans *trans, 1007 const struct iwl_host_cmd *cmd) 1008 { 1009 struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); 1010 1011 /* Make sure the NIC is still alive in the bus */ 1012 if (test_bit(STATUS_TRANS_DEAD, &trans->status)) 1013 return -ENODEV; 1014 1015 if (!trans->mac_cfg->base->apmg_wake_up_wa) 1016 return 0; 1017 1018 /* 1019 * wake up the NIC to make sure that the firmware will see the host 1020 * command - we will let the NIC sleep once all the host commands 1021 * returned. This needs to be done only on NICs that have 1022 * apmg_wake_up_wa set (see above.) 1023 */ 1024 if (!_iwl_trans_pcie_grab_nic_access(trans, false)) 1025 return -EIO; 1026 1027 /* 1028 * In iwl_trans_grab_nic_access(), we've acquired the reg_lock. 1029 * There, we also returned immediately if cmd_hold_nic_awake is 1030 * already true, so it's OK to unconditionally set it to true. 1031 */ 1032 trans_pcie->cmd_hold_nic_awake = true; 1033 spin_unlock(&trans_pcie->reg_lock); 1034 1035 return 0; 1036 } 1037 1038 static void iwl_txq_progress(struct iwl_txq *txq) 1039 { 1040 lockdep_assert_held(&txq->lock); 1041 1042 if (!txq->wd_timeout) 1043 return; 1044 1045 /* 1046 * station is asleep and we send data - that must 1047 * be uAPSD or PS-Poll. Don't rearm the timer. 1048 */ 1049 if (txq->frozen) 1050 return; 1051 1052 /* 1053 * if empty delete timer, otherwise move timer forward 1054 * since we're making progress on this queue 1055 */ 1056 if (txq->read_ptr == txq->write_ptr) 1057 timer_delete(&txq->stuck_timer); 1058 else 1059 mod_timer(&txq->stuck_timer, jiffies + txq->wd_timeout); 1060 } 1061 1062 static inline bool iwl_txq_used(const struct iwl_txq *q, int i, 1063 int read_ptr, int write_ptr) 1064 { 1065 int index = iwl_txq_get_cmd_index(q, i); 1066 int r = iwl_txq_get_cmd_index(q, read_ptr); 1067 int w = iwl_txq_get_cmd_index(q, write_ptr); 1068 1069 return w >= r ? 1070 (index >= r && index < w) : 1071 !(index < r && index >= w); 1072 } 1073 1074 /* 1075 * iwl_pcie_cmdq_reclaim - Reclaim TX command queue entries already Tx'd 1076 * 1077 * When FW advances 'R' index, all entries between old and new 'R' index 1078 * need to be reclaimed. As result, some free space forms. If there is 1079 * enough free space (> low mark), wake the stack that feeds us. 1080 */ 1081 static void iwl_pcie_cmdq_reclaim(struct iwl_trans *trans, int txq_id, int idx) 1082 { 1083 struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); 1084 struct iwl_txq *txq = trans_pcie->txqs.txq[txq_id]; 1085 int nfreed = 0; 1086 u16 r; 1087 1088 lockdep_assert_held(&txq->lock); 1089 1090 idx = iwl_txq_get_cmd_index(txq, idx); 1091 r = iwl_txq_get_cmd_index(txq, txq->read_ptr); 1092 1093 if (idx >= trans->mac_cfg->base->max_tfd_queue_size || 1094 (!iwl_txq_used(txq, idx, txq->read_ptr, txq->write_ptr))) { 1095 WARN_ONCE(test_bit(txq_id, trans_pcie->txqs.queue_used), 1096 "%s: Read index for DMA queue txq id (%d), index %d is out of range [0-%d] %d %d.\n", 1097 __func__, txq_id, idx, 1098 trans->mac_cfg->base->max_tfd_queue_size, 1099 txq->write_ptr, txq->read_ptr); 1100 return; 1101 } 1102 1103 for (idx = iwl_txq_inc_wrap(trans, idx); r != idx; 1104 r = iwl_txq_inc_wrap(trans, r)) { 1105 txq->read_ptr = iwl_txq_inc_wrap(trans, txq->read_ptr); 1106 1107 if (nfreed++ > 0) { 1108 IWL_ERR(trans, "HCMD skipped: index (%d) %d %d\n", 1109 idx, txq->write_ptr, r); 1110 iwl_force_nmi(trans); 1111 } 1112 } 1113 1114 if (txq->read_ptr == txq->write_ptr) 1115 iwl_pcie_clear_cmd_in_flight(trans); 1116 1117 iwl_txq_progress(txq); 1118 } 1119 1120 static int iwl_pcie_txq_set_ratid_map(struct iwl_trans *trans, u16 ra_tid, 1121 u16 txq_id) 1122 { 1123 struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); 1124 u32 tbl_dw_addr; 1125 u32 tbl_dw; 1126 u16 scd_q2ratid; 1127 1128 scd_q2ratid = ra_tid & SCD_QUEUE_RA_TID_MAP_RATID_MSK; 1129 1130 tbl_dw_addr = trans_pcie->scd_base_addr + 1131 SCD_TRANS_TBL_OFFSET_QUEUE(txq_id); 1132 1133 tbl_dw = iwl_trans_read_mem32(trans, tbl_dw_addr); 1134 1135 if (txq_id & 0x1) 1136 tbl_dw = (scd_q2ratid << 16) | (tbl_dw & 0x0000FFFF); 1137 else 1138 tbl_dw = scd_q2ratid | (tbl_dw & 0xFFFF0000); 1139 1140 iwl_trans_write_mem32(trans, tbl_dw_addr, tbl_dw); 1141 1142 return 0; 1143 } 1144 1145 /* Receiver address (actually, Rx station's index into station table), 1146 * combined with Traffic ID (QOS priority), in format used by Tx Scheduler */ 1147 #define BUILD_RAxTID(sta_id, tid) (((sta_id) << 4) + (tid)) 1148 1149 bool iwl_trans_pcie_txq_enable(struct iwl_trans *trans, int txq_id, u16 ssn, 1150 const struct iwl_trans_txq_scd_cfg *cfg, 1151 unsigned int wdg_timeout) 1152 { 1153 struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); 1154 struct iwl_txq *txq = trans_pcie->txqs.txq[txq_id]; 1155 int fifo = -1; 1156 bool scd_bug = false; 1157 1158 if (test_and_set_bit(txq_id, trans_pcie->txqs.queue_used)) 1159 WARN_ONCE(1, "queue %d already used - expect issues", txq_id); 1160 1161 txq->wd_timeout = msecs_to_jiffies(wdg_timeout); 1162 1163 if (cfg) { 1164 fifo = cfg->fifo; 1165 1166 /* Disable the scheduler prior configuring the cmd queue */ 1167 if (txq_id == trans->conf.cmd_queue && 1168 trans->conf.scd_set_active) 1169 iwl_scd_enable_set_active(trans, 0); 1170 1171 /* Stop this Tx queue before configuring it */ 1172 iwl_scd_txq_set_inactive(trans, txq_id); 1173 1174 /* Set this queue as a chain-building queue unless it is CMD */ 1175 if (txq_id != trans->conf.cmd_queue) 1176 iwl_scd_txq_set_chain(trans, txq_id); 1177 1178 if (cfg->aggregate) { 1179 u16 ra_tid = BUILD_RAxTID(cfg->sta_id, cfg->tid); 1180 1181 /* Map receiver-address / traffic-ID to this queue */ 1182 iwl_pcie_txq_set_ratid_map(trans, ra_tid, txq_id); 1183 1184 /* enable aggregations for the queue */ 1185 iwl_scd_txq_enable_agg(trans, txq_id); 1186 txq->ampdu = true; 1187 } else { 1188 /* 1189 * disable aggregations for the queue, this will also 1190 * make the ra_tid mapping configuration irrelevant 1191 * since it is now a non-AGG queue. 1192 */ 1193 iwl_scd_txq_disable_agg(trans, txq_id); 1194 1195 ssn = txq->read_ptr; 1196 } 1197 } else { 1198 /* 1199 * If we need to move the SCD write pointer by steps of 1200 * 0x40, 0x80 or 0xc0, it gets stuck. Avoids this and let 1201 * the op_mode know by returning true later. 1202 * Do this only in case cfg is NULL since this trick can 1203 * be done only if we have DQA enabled which is true for mvm 1204 * only. And mvm never sets a cfg pointer. 1205 * This is really ugly, but this is the easiest way out for 1206 * this sad hardware issue. 1207 * This bug has been fixed on devices 9000 and up. 1208 */ 1209 scd_bug = !trans->mac_cfg->mq_rx_supported && 1210 !((ssn - txq->write_ptr) & 0x3f) && 1211 (ssn != txq->write_ptr); 1212 if (scd_bug) 1213 ssn++; 1214 } 1215 1216 /* Place first TFD at index corresponding to start sequence number. 1217 * Assumes that ssn_idx is valid (!= 0xFFF) */ 1218 txq->read_ptr = (ssn & 0xff); 1219 txq->write_ptr = (ssn & 0xff); 1220 iwl_write_direct32(trans, HBUS_TARG_WRPTR, 1221 (ssn & 0xff) | (txq_id << 8)); 1222 1223 if (cfg) { 1224 u8 frame_limit = cfg->frame_limit; 1225 1226 iwl_write_prph(trans, SCD_QUEUE_RDPTR(txq_id), ssn); 1227 1228 /* Set up Tx window size and frame limit for this queue */ 1229 iwl_trans_write_mem32(trans, trans_pcie->scd_base_addr + 1230 SCD_CONTEXT_QUEUE_OFFSET(txq_id), 0); 1231 iwl_trans_write_mem32(trans, 1232 trans_pcie->scd_base_addr + 1233 SCD_CONTEXT_QUEUE_OFFSET(txq_id) + sizeof(u32), 1234 SCD_QUEUE_CTX_REG2_VAL(WIN_SIZE, frame_limit) | 1235 SCD_QUEUE_CTX_REG2_VAL(FRAME_LIMIT, frame_limit)); 1236 1237 /* Set up status area in SRAM, map to Tx DMA/FIFO, activate */ 1238 iwl_write_prph(trans, SCD_QUEUE_STATUS_BITS(txq_id), 1239 (1 << SCD_QUEUE_STTS_REG_POS_ACTIVE) | 1240 (cfg->fifo << SCD_QUEUE_STTS_REG_POS_TXF) | 1241 (1 << SCD_QUEUE_STTS_REG_POS_WSL) | 1242 SCD_QUEUE_STTS_REG_MSK); 1243 1244 /* enable the scheduler for this queue (only) */ 1245 if (txq_id == trans->conf.cmd_queue && 1246 trans->conf.scd_set_active) 1247 iwl_scd_enable_set_active(trans, BIT(txq_id)); 1248 1249 IWL_DEBUG_TX_QUEUES(trans, 1250 "Activate queue %d on FIFO %d WrPtr: %d\n", 1251 txq_id, fifo, ssn & 0xff); 1252 } else { 1253 IWL_DEBUG_TX_QUEUES(trans, 1254 "Activate queue %d WrPtr: %d\n", 1255 txq_id, ssn & 0xff); 1256 } 1257 1258 return scd_bug; 1259 } 1260 1261 void iwl_trans_pcie_txq_set_shared_mode(struct iwl_trans *trans, u32 txq_id, 1262 bool shared_mode) 1263 { 1264 struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); 1265 struct iwl_txq *txq = trans_pcie->txqs.txq[txq_id]; 1266 1267 txq->ampdu = !shared_mode; 1268 } 1269 1270 void iwl_trans_pcie_txq_disable(struct iwl_trans *trans, int txq_id, 1271 bool configure_scd) 1272 { 1273 struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); 1274 u32 stts_addr = trans_pcie->scd_base_addr + 1275 SCD_TX_STTS_QUEUE_OFFSET(txq_id); 1276 static const u32 zero_val[4] = {}; 1277 1278 trans_pcie->txqs.txq[txq_id]->frozen_expiry_remainder = 0; 1279 trans_pcie->txqs.txq[txq_id]->frozen = false; 1280 1281 /* 1282 * Upon HW Rfkill - we stop the device, and then stop the queues 1283 * in the op_mode. Just for the sake of the simplicity of the op_mode, 1284 * allow the op_mode to call txq_disable after it already called 1285 * stop_device. 1286 */ 1287 if (!test_and_clear_bit(txq_id, trans_pcie->txqs.queue_used)) { 1288 WARN_ONCE(test_bit(STATUS_DEVICE_ENABLED, &trans->status), 1289 "queue %d not used", txq_id); 1290 return; 1291 } 1292 1293 if (configure_scd) { 1294 iwl_scd_txq_set_inactive(trans, txq_id); 1295 1296 iwl_trans_write_mem(trans, stts_addr, (const void *)zero_val, 1297 ARRAY_SIZE(zero_val)); 1298 } 1299 1300 iwl_pcie_txq_unmap(trans, txq_id); 1301 trans_pcie->txqs.txq[txq_id]->ampdu = false; 1302 1303 IWL_DEBUG_TX_QUEUES(trans, "Deactivate queue %d\n", txq_id); 1304 } 1305 1306 /*************** HOST COMMAND QUEUE FUNCTIONS *****/ 1307 1308 static void iwl_trans_pcie_block_txq_ptrs(struct iwl_trans *trans, bool block) 1309 { 1310 struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); 1311 int i; 1312 1313 for (i = 0; i < trans->mac_cfg->base->num_of_queues; i++) { 1314 struct iwl_txq *txq = trans_pcie->txqs.txq[i]; 1315 1316 if (i == trans->conf.cmd_queue) 1317 continue; 1318 1319 /* we skip the command queue (obviously) so it's OK to nest */ 1320 spin_lock_nested(&txq->lock, 1); 1321 1322 if (!block && !(WARN_ON_ONCE(!txq->block))) { 1323 txq->block--; 1324 if (!txq->block) { 1325 iwl_write32(trans, HBUS_TARG_WRPTR, 1326 txq->write_ptr | (i << 8)); 1327 } 1328 } else if (block) { 1329 txq->block++; 1330 } 1331 1332 spin_unlock(&txq->lock); 1333 } 1334 } 1335 1336 /* 1337 * iwl_pcie_enqueue_hcmd - enqueue a uCode command 1338 * @priv: device private data point 1339 * @cmd: a pointer to the ucode command structure 1340 * 1341 * The function returns < 0 values to indicate the operation 1342 * failed. On success, it returns the index (>= 0) of command in the 1343 * command queue. 1344 */ 1345 int iwl_pcie_enqueue_hcmd(struct iwl_trans *trans, 1346 struct iwl_host_cmd *cmd) 1347 { 1348 struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); 1349 struct iwl_txq *txq = trans_pcie->txqs.txq[trans->conf.cmd_queue]; 1350 struct iwl_device_cmd *out_cmd; 1351 struct iwl_cmd_meta *out_meta; 1352 void *dup_buf = NULL; 1353 dma_addr_t phys_addr; 1354 int idx; 1355 u16 copy_size, cmd_size, tb0_size; 1356 bool had_nocopy = false; 1357 u8 group_id = iwl_cmd_groupid(cmd->id); 1358 int i, ret; 1359 u32 cmd_pos; 1360 const u8 *cmddata[IWL_MAX_CMD_TBS_PER_TFD]; 1361 u16 cmdlen[IWL_MAX_CMD_TBS_PER_TFD]; 1362 unsigned long flags; 1363 1364 if (WARN(!trans->conf.wide_cmd_header && 1365 group_id > IWL_ALWAYS_LONG_GROUP, 1366 "unsupported wide command %#x\n", cmd->id)) 1367 return -EINVAL; 1368 1369 if (group_id != 0) { 1370 copy_size = sizeof(struct iwl_cmd_header_wide); 1371 cmd_size = sizeof(struct iwl_cmd_header_wide); 1372 } else { 1373 copy_size = sizeof(struct iwl_cmd_header); 1374 cmd_size = sizeof(struct iwl_cmd_header); 1375 } 1376 1377 /* need one for the header if the first is NOCOPY */ 1378 BUILD_BUG_ON(IWL_MAX_CMD_TBS_PER_TFD > IWL_NUM_OF_TBS - 1); 1379 1380 for (i = 0; i < IWL_MAX_CMD_TBS_PER_TFD; i++) { 1381 cmddata[i] = cmd->data[i]; 1382 cmdlen[i] = cmd->len[i]; 1383 1384 if (!cmd->len[i]) 1385 continue; 1386 1387 /* need at least IWL_FIRST_TB_SIZE copied */ 1388 if (copy_size < IWL_FIRST_TB_SIZE) { 1389 int copy = IWL_FIRST_TB_SIZE - copy_size; 1390 1391 if (copy > cmdlen[i]) 1392 copy = cmdlen[i]; 1393 cmdlen[i] -= copy; 1394 cmddata[i] += copy; 1395 copy_size += copy; 1396 } 1397 1398 if (cmd->dataflags[i] & IWL_HCMD_DFL_NOCOPY) { 1399 had_nocopy = true; 1400 if (WARN_ON(cmd->dataflags[i] & IWL_HCMD_DFL_DUP)) { 1401 idx = -EINVAL; 1402 goto free_dup_buf; 1403 } 1404 } else if (cmd->dataflags[i] & IWL_HCMD_DFL_DUP) { 1405 /* 1406 * This is also a chunk that isn't copied 1407 * to the static buffer so set had_nocopy. 1408 */ 1409 had_nocopy = true; 1410 1411 /* only allowed once */ 1412 if (WARN_ON(dup_buf)) { 1413 idx = -EINVAL; 1414 goto free_dup_buf; 1415 } 1416 1417 dup_buf = kmemdup(cmddata[i], cmdlen[i], 1418 GFP_ATOMIC); 1419 if (!dup_buf) 1420 return -ENOMEM; 1421 } else { 1422 /* NOCOPY must not be followed by normal! */ 1423 if (WARN_ON(had_nocopy)) { 1424 idx = -EINVAL; 1425 goto free_dup_buf; 1426 } 1427 copy_size += cmdlen[i]; 1428 } 1429 cmd_size += cmd->len[i]; 1430 } 1431 1432 /* 1433 * If any of the command structures end up being larger than 1434 * the TFD_MAX_PAYLOAD_SIZE and they aren't dynamically 1435 * allocated into separate TFDs, then we will need to 1436 * increase the size of the buffers. 1437 */ 1438 if (WARN(copy_size > TFD_MAX_PAYLOAD_SIZE, 1439 "Command %s (%#x) is too large (%d bytes)\n", 1440 iwl_get_cmd_string(trans, cmd->id), 1441 cmd->id, copy_size)) { 1442 idx = -EINVAL; 1443 goto free_dup_buf; 1444 } 1445 1446 spin_lock_irqsave(&txq->lock, flags); 1447 1448 if (iwl_txq_space(trans, txq) < ((cmd->flags & CMD_ASYNC) ? 2 : 1)) { 1449 spin_unlock_irqrestore(&txq->lock, flags); 1450 1451 IWL_ERR(trans, "No space in command queue\n"); 1452 iwl_op_mode_nic_error(trans->op_mode, 1453 IWL_ERR_TYPE_CMD_QUEUE_FULL); 1454 iwl_trans_schedule_reset(trans, IWL_ERR_TYPE_CMD_QUEUE_FULL); 1455 idx = -ENOSPC; 1456 goto free_dup_buf; 1457 } 1458 1459 idx = iwl_txq_get_cmd_index(txq, txq->write_ptr); 1460 out_cmd = txq->entries[idx].cmd; 1461 out_meta = &txq->entries[idx].meta; 1462 1463 /* re-initialize, this also marks the SG list as unused */ 1464 memset(out_meta, 0, sizeof(*out_meta)); 1465 if (cmd->flags & CMD_WANT_SKB) 1466 out_meta->source = cmd; 1467 1468 /* set up the header */ 1469 if (group_id != 0) { 1470 out_cmd->hdr_wide.cmd = iwl_cmd_opcode(cmd->id); 1471 out_cmd->hdr_wide.group_id = group_id; 1472 out_cmd->hdr_wide.version = iwl_cmd_version(cmd->id); 1473 out_cmd->hdr_wide.length = 1474 cpu_to_le16(cmd_size - 1475 sizeof(struct iwl_cmd_header_wide)); 1476 out_cmd->hdr_wide.reserved = 0; 1477 out_cmd->hdr_wide.sequence = 1478 cpu_to_le16(QUEUE_TO_SEQ(trans->conf.cmd_queue) | 1479 INDEX_TO_SEQ(txq->write_ptr)); 1480 1481 cmd_pos = sizeof(struct iwl_cmd_header_wide); 1482 copy_size = sizeof(struct iwl_cmd_header_wide); 1483 } else { 1484 out_cmd->hdr.cmd = iwl_cmd_opcode(cmd->id); 1485 out_cmd->hdr.sequence = 1486 cpu_to_le16(QUEUE_TO_SEQ(trans->conf.cmd_queue) | 1487 INDEX_TO_SEQ(txq->write_ptr)); 1488 out_cmd->hdr.group_id = 0; 1489 1490 cmd_pos = sizeof(struct iwl_cmd_header); 1491 copy_size = sizeof(struct iwl_cmd_header); 1492 } 1493 1494 /* and copy the data that needs to be copied */ 1495 for (i = 0; i < IWL_MAX_CMD_TBS_PER_TFD; i++) { 1496 int copy; 1497 1498 if (!cmd->len[i]) 1499 continue; 1500 1501 /* copy everything if not nocopy/dup */ 1502 if (!(cmd->dataflags[i] & (IWL_HCMD_DFL_NOCOPY | 1503 IWL_HCMD_DFL_DUP))) { 1504 copy = cmd->len[i]; 1505 1506 memcpy((u8 *)out_cmd + cmd_pos, cmd->data[i], copy); 1507 cmd_pos += copy; 1508 copy_size += copy; 1509 continue; 1510 } 1511 1512 /* 1513 * Otherwise we need at least IWL_FIRST_TB_SIZE copied 1514 * in total (for bi-directional DMA), but copy up to what 1515 * we can fit into the payload for debug dump purposes. 1516 */ 1517 copy = min_t(int, TFD_MAX_PAYLOAD_SIZE - cmd_pos, cmd->len[i]); 1518 1519 memcpy((u8 *)out_cmd + cmd_pos, cmd->data[i], copy); 1520 cmd_pos += copy; 1521 1522 /* However, treat copy_size the proper way, we need it below */ 1523 if (copy_size < IWL_FIRST_TB_SIZE) { 1524 copy = IWL_FIRST_TB_SIZE - copy_size; 1525 1526 if (copy > cmd->len[i]) 1527 copy = cmd->len[i]; 1528 copy_size += copy; 1529 } 1530 } 1531 1532 IWL_DEBUG_HC(trans, 1533 "Sending command %s (%.2x.%.2x), seq: 0x%04X, %d bytes at %d[%d]:%d\n", 1534 iwl_get_cmd_string(trans, cmd->id), 1535 group_id, out_cmd->hdr.cmd, 1536 le16_to_cpu(out_cmd->hdr.sequence), 1537 cmd_size, txq->write_ptr, idx, trans->conf.cmd_queue); 1538 1539 /* start the TFD with the minimum copy bytes */ 1540 tb0_size = min_t(int, copy_size, IWL_FIRST_TB_SIZE); 1541 memcpy(&txq->first_tb_bufs[idx], &out_cmd->hdr, tb0_size); 1542 iwl_pcie_txq_build_tfd(trans, txq, 1543 iwl_txq_get_first_tb_dma(txq, idx), 1544 tb0_size, true); 1545 1546 /* map first command fragment, if any remains */ 1547 if (copy_size > tb0_size) { 1548 phys_addr = dma_map_single(trans->dev, 1549 ((u8 *)&out_cmd->hdr) + tb0_size, 1550 copy_size - tb0_size, 1551 DMA_TO_DEVICE); 1552 if (dma_mapping_error(trans->dev, phys_addr)) { 1553 iwl_txq_gen1_tfd_unmap(trans, out_meta, txq, 1554 txq->write_ptr); 1555 idx = -ENOMEM; 1556 goto out; 1557 } 1558 1559 iwl_pcie_txq_build_tfd(trans, txq, phys_addr, 1560 copy_size - tb0_size, false); 1561 } 1562 1563 /* map the remaining (adjusted) nocopy/dup fragments */ 1564 for (i = 0; i < IWL_MAX_CMD_TBS_PER_TFD; i++) { 1565 void *data = (void *)(uintptr_t)cmddata[i]; 1566 1567 if (!cmdlen[i]) 1568 continue; 1569 if (!(cmd->dataflags[i] & (IWL_HCMD_DFL_NOCOPY | 1570 IWL_HCMD_DFL_DUP))) 1571 continue; 1572 if (cmd->dataflags[i] & IWL_HCMD_DFL_DUP) 1573 data = dup_buf; 1574 phys_addr = dma_map_single(trans->dev, data, 1575 cmdlen[i], DMA_TO_DEVICE); 1576 if (dma_mapping_error(trans->dev, phys_addr)) { 1577 iwl_txq_gen1_tfd_unmap(trans, out_meta, txq, 1578 txq->write_ptr); 1579 idx = -ENOMEM; 1580 goto out; 1581 } 1582 1583 iwl_pcie_txq_build_tfd(trans, txq, phys_addr, cmdlen[i], false); 1584 } 1585 1586 BUILD_BUG_ON(IWL_TFH_NUM_TBS > sizeof(out_meta->tbs) * BITS_PER_BYTE); 1587 out_meta->flags = cmd->flags; 1588 if (WARN_ON_ONCE(txq->entries[idx].free_buf)) 1589 kfree_sensitive(txq->entries[idx].free_buf); 1590 txq->entries[idx].free_buf = dup_buf; 1591 1592 trace_iwlwifi_dev_hcmd(trans->dev, cmd, cmd_size, &out_cmd->hdr_wide); 1593 1594 /* start timer if queue currently empty */ 1595 if (txq->read_ptr == txq->write_ptr && txq->wd_timeout) 1596 mod_timer(&txq->stuck_timer, jiffies + txq->wd_timeout); 1597 1598 ret = iwl_pcie_set_cmd_in_flight(trans, cmd); 1599 if (ret < 0) { 1600 idx = ret; 1601 goto out; 1602 } 1603 1604 if (cmd->flags & CMD_BLOCK_TXQS) 1605 iwl_trans_pcie_block_txq_ptrs(trans, true); 1606 1607 /* Increment and update queue's write index */ 1608 txq->write_ptr = iwl_txq_inc_wrap(trans, txq->write_ptr); 1609 iwl_pcie_txq_inc_wr_ptr(trans, txq); 1610 1611 out: 1612 spin_unlock_irqrestore(&txq->lock, flags); 1613 free_dup_buf: 1614 if (idx < 0) 1615 kfree(dup_buf); 1616 return idx; 1617 } 1618 1619 /* 1620 * iwl_pcie_hcmd_complete - Pull unused buffers off the queue and reclaim them 1621 * @rxb: Rx buffer to reclaim 1622 */ 1623 void iwl_pcie_hcmd_complete(struct iwl_trans *trans, 1624 struct iwl_rx_cmd_buffer *rxb) 1625 { 1626 struct iwl_rx_packet *pkt = rxb_addr(rxb); 1627 u16 sequence = le16_to_cpu(pkt->hdr.sequence); 1628 u8 group_id; 1629 u32 cmd_id; 1630 int txq_id = SEQ_TO_QUEUE(sequence); 1631 int index = SEQ_TO_INDEX(sequence); 1632 int cmd_index; 1633 struct iwl_device_cmd *cmd; 1634 struct iwl_cmd_meta *meta; 1635 struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); 1636 struct iwl_txq *txq = trans_pcie->txqs.txq[trans->conf.cmd_queue]; 1637 1638 /* If a Tx command is being handled and it isn't in the actual 1639 * command queue then there a command routing bug has been introduced 1640 * in the queue management code. */ 1641 if (WARN(txq_id != trans->conf.cmd_queue, 1642 "wrong command queue %d (should be %d), sequence 0x%X readp=%d writep=%d\n", 1643 txq_id, trans->conf.cmd_queue, sequence, txq->read_ptr, 1644 txq->write_ptr)) { 1645 iwl_print_hex_error(trans, pkt, 32); 1646 return; 1647 } 1648 1649 spin_lock_bh(&txq->lock); 1650 1651 cmd_index = iwl_txq_get_cmd_index(txq, index); 1652 cmd = txq->entries[cmd_index].cmd; 1653 meta = &txq->entries[cmd_index].meta; 1654 group_id = cmd->hdr.group_id; 1655 cmd_id = WIDE_ID(group_id, cmd->hdr.cmd); 1656 1657 if (trans->mac_cfg->gen2) 1658 iwl_txq_gen2_tfd_unmap(trans, meta, 1659 iwl_txq_get_tfd(trans, txq, index)); 1660 else 1661 iwl_txq_gen1_tfd_unmap(trans, meta, txq, index); 1662 1663 /* Input error checking is done when commands are added to queue. */ 1664 if (meta->flags & CMD_WANT_SKB) { 1665 struct page *p = rxb_steal_page(rxb); 1666 1667 meta->source->resp_pkt = pkt; 1668 meta->source->_rx_page_addr = (unsigned long)page_address(p); 1669 meta->source->_rx_page_order = trans_pcie->rx_page_order; 1670 } 1671 1672 if (meta->flags & CMD_BLOCK_TXQS) 1673 iwl_trans_pcie_block_txq_ptrs(trans, false); 1674 1675 iwl_pcie_cmdq_reclaim(trans, txq_id, index); 1676 1677 if (!(meta->flags & CMD_ASYNC)) { 1678 if (!test_bit(STATUS_SYNC_HCMD_ACTIVE, &trans->status)) { 1679 IWL_WARN(trans, 1680 "HCMD_ACTIVE already clear for command %s\n", 1681 iwl_get_cmd_string(trans, cmd_id)); 1682 } 1683 clear_bit(STATUS_SYNC_HCMD_ACTIVE, &trans->status); 1684 IWL_DEBUG_INFO(trans, "Clearing HCMD_ACTIVE for command %s\n", 1685 iwl_get_cmd_string(trans, cmd_id)); 1686 wake_up(&trans_pcie->wait_command_queue); 1687 } 1688 1689 meta->flags = 0; 1690 1691 spin_unlock_bh(&txq->lock); 1692 } 1693 1694 static int iwl_fill_data_tbs(struct iwl_trans *trans, struct sk_buff *skb, 1695 struct iwl_txq *txq, u8 hdr_len, 1696 struct iwl_cmd_meta *out_meta) 1697 { 1698 u16 head_tb_len; 1699 int i; 1700 1701 /* 1702 * Set up TFD's third entry to point directly to remainder 1703 * of skb's head, if any 1704 */ 1705 head_tb_len = skb_headlen(skb) - hdr_len; 1706 1707 if (head_tb_len > 0) { 1708 dma_addr_t tb_phys = dma_map_single(trans->dev, 1709 skb->data + hdr_len, 1710 head_tb_len, DMA_TO_DEVICE); 1711 if (unlikely(dma_mapping_error(trans->dev, tb_phys))) 1712 return -EINVAL; 1713 trace_iwlwifi_dev_tx_tb(trans->dev, skb, skb->data + hdr_len, 1714 tb_phys, head_tb_len); 1715 iwl_pcie_txq_build_tfd(trans, txq, tb_phys, head_tb_len, false); 1716 } 1717 1718 /* set up the remaining entries to point to the data */ 1719 for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) { 1720 const skb_frag_t *frag = &skb_shinfo(skb)->frags[i]; 1721 dma_addr_t tb_phys; 1722 int tb_idx; 1723 1724 if (!skb_frag_size(frag)) 1725 continue; 1726 1727 tb_phys = skb_frag_dma_map(trans->dev, frag, 0, 1728 skb_frag_size(frag), DMA_TO_DEVICE); 1729 1730 if (unlikely(dma_mapping_error(trans->dev, tb_phys))) 1731 return -EINVAL; 1732 trace_iwlwifi_dev_tx_tb(trans->dev, skb, skb_frag_address(frag), 1733 tb_phys, skb_frag_size(frag)); 1734 tb_idx = iwl_pcie_txq_build_tfd(trans, txq, tb_phys, 1735 skb_frag_size(frag), false); 1736 if (tb_idx < 0) 1737 return tb_idx; 1738 1739 out_meta->tbs |= BIT(tb_idx); 1740 } 1741 1742 return 0; 1743 } 1744 1745 #ifdef CONFIG_INET 1746 static void *iwl_pcie_get_page_hdr(struct iwl_trans *trans, 1747 size_t len, struct sk_buff *skb) 1748 { 1749 struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); 1750 struct iwl_tso_hdr_page *p = this_cpu_ptr(trans_pcie->txqs.tso_hdr_page); 1751 struct iwl_tso_page_info *info; 1752 struct page **page_ptr; 1753 dma_addr_t phys; 1754 void *ret; 1755 1756 page_ptr = (void *)((u8 *)skb->cb + trans->conf.cb_data_offs); 1757 1758 if (WARN_ON(*page_ptr)) 1759 return NULL; 1760 1761 if (!p->page) 1762 goto alloc; 1763 1764 /* 1765 * Check if there's enough room on this page 1766 * 1767 * Note that we put a page chaining pointer *last* in the 1768 * page - we need it somewhere, and if it's there then we 1769 * avoid DMA mapping the last bits of the page which may 1770 * trigger the 32-bit boundary hardware bug. 1771 * 1772 * (see also get_workaround_page() in tx-gen2.c) 1773 */ 1774 if (((unsigned long)p->pos & ~PAGE_MASK) + len < IWL_TSO_PAGE_DATA_SIZE) { 1775 info = IWL_TSO_PAGE_INFO(page_address(p->page)); 1776 goto out; 1777 } 1778 1779 /* We don't have enough room on this page, get a new one. */ 1780 iwl_pcie_free_and_unmap_tso_page(trans, p->page); 1781 1782 alloc: 1783 p->page = alloc_page(GFP_ATOMIC); 1784 if (!p->page) 1785 return NULL; 1786 p->pos = page_address(p->page); 1787 1788 info = IWL_TSO_PAGE_INFO(page_address(p->page)); 1789 1790 /* set the chaining pointer to NULL */ 1791 info->next = NULL; 1792 1793 /* Create a DMA mapping for the page */ 1794 phys = dma_map_page_attrs(trans->dev, p->page, 0, PAGE_SIZE, 1795 DMA_TO_DEVICE, DMA_ATTR_SKIP_CPU_SYNC); 1796 if (unlikely(dma_mapping_error(trans->dev, phys))) { 1797 __free_page(p->page); 1798 p->page = NULL; 1799 1800 return NULL; 1801 } 1802 1803 /* Store physical address and set use count */ 1804 info->dma_addr = phys; 1805 refcount_set(&info->use_count, 1); 1806 out: 1807 *page_ptr = p->page; 1808 /* Return an internal reference for the caller */ 1809 refcount_inc(&info->use_count); 1810 ret = p->pos; 1811 p->pos += len; 1812 1813 return ret; 1814 } 1815 1816 /** 1817 * iwl_pcie_get_sgt_tb_phys - Find TB address in mapped SG list 1818 * @sgt: scatter gather table 1819 * @offset: Offset into the mapped memory (i.e. SKB payload data) 1820 * @len: Length of the area 1821 * 1822 * Find the DMA address that corresponds to the SKB payload data at the 1823 * position given by @offset. 1824 * 1825 * Returns: Address for TB entry 1826 */ 1827 dma_addr_t iwl_pcie_get_sgt_tb_phys(struct sg_table *sgt, unsigned int offset, 1828 unsigned int len) 1829 { 1830 struct scatterlist *sg; 1831 unsigned int sg_offset = 0; 1832 int i; 1833 1834 /* 1835 * Search the mapped DMA areas in the SG for the area that contains the 1836 * data at offset with the given length. 1837 */ 1838 for_each_sgtable_dma_sg(sgt, sg, i) { 1839 if (offset >= sg_offset && 1840 offset + len <= sg_offset + sg_dma_len(sg)) 1841 return sg_dma_address(sg) + offset - sg_offset; 1842 1843 sg_offset += sg_dma_len(sg); 1844 } 1845 1846 WARN_ON_ONCE(1); 1847 1848 return DMA_MAPPING_ERROR; 1849 } 1850 1851 /** 1852 * iwl_pcie_prep_tso - Prepare TSO page and SKB for sending 1853 * @trans: transport private data 1854 * @skb: the SKB to map 1855 * @cmd_meta: command meta to store the scatter list information for unmapping 1856 * @hdr: output argument for TSO headers 1857 * @hdr_room: requested length for TSO headers 1858 * @offset: offset into the data from which mapping should start 1859 * 1860 * Allocate space for a scatter gather list and TSO headers and map the SKB 1861 * using the scatter gather list. The SKB is unmapped again when the page is 1862 * free'ed again at the end of the operation. 1863 * 1864 * Returns: newly allocated and mapped scatter gather table with list 1865 */ 1866 struct sg_table *iwl_pcie_prep_tso(struct iwl_trans *trans, struct sk_buff *skb, 1867 struct iwl_cmd_meta *cmd_meta, 1868 u8 **hdr, unsigned int hdr_room, 1869 unsigned int offset) 1870 { 1871 struct sg_table *sgt; 1872 unsigned int n_segments = skb_shinfo(skb)->nr_frags + 1; 1873 int orig_nents; 1874 1875 if (WARN_ON_ONCE(skb_has_frag_list(skb))) 1876 return NULL; 1877 1878 *hdr = iwl_pcie_get_page_hdr(trans, 1879 hdr_room + __alignof__(struct sg_table) + 1880 sizeof(struct sg_table) + 1881 n_segments * sizeof(struct scatterlist), 1882 skb); 1883 if (!*hdr) 1884 return NULL; 1885 1886 sgt = (void *)PTR_ALIGN(*hdr + hdr_room, __alignof__(struct sg_table)); 1887 sgt->sgl = (void *)(sgt + 1); 1888 1889 sg_init_table(sgt->sgl, n_segments); 1890 1891 /* Only map the data, not the header (it is copied to the TSO page) */ 1892 orig_nents = skb_to_sgvec(skb, sgt->sgl, offset, skb->len - offset); 1893 if (WARN_ON_ONCE(orig_nents <= 0)) 1894 return NULL; 1895 1896 sgt->orig_nents = orig_nents; 1897 1898 /* And map the entire SKB */ 1899 if (dma_map_sgtable(trans->dev, sgt, DMA_TO_DEVICE, 0) < 0) 1900 return NULL; 1901 1902 /* Store non-zero (i.e. valid) offset for unmapping */ 1903 cmd_meta->sg_offset = (unsigned long) sgt & ~PAGE_MASK; 1904 1905 return sgt; 1906 } 1907 1908 static int iwl_fill_data_tbs_amsdu(struct iwl_trans *trans, struct sk_buff *skb, 1909 struct iwl_txq *txq, u8 hdr_len, 1910 struct iwl_cmd_meta *out_meta, 1911 struct iwl_device_tx_cmd *dev_cmd, 1912 u16 tb1_len) 1913 { 1914 struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); 1915 struct iwl_tx_cmd_v6 *tx_cmd = (void *)dev_cmd->payload; 1916 struct ieee80211_hdr *hdr = (void *)skb->data; 1917 unsigned int snap_ip_tcp_hdrlen, ip_hdrlen, total_len, hdr_room; 1918 unsigned int mss = skb_shinfo(skb)->gso_size; 1919 unsigned int data_offset = 0; 1920 u16 length, iv_len, amsdu_pad; 1921 dma_addr_t start_hdr_phys; 1922 u8 *start_hdr, *pos_hdr; 1923 struct sg_table *sgt; 1924 struct tso_t tso; 1925 1926 /* if the packet is protected, then it must be CCMP or GCMP */ 1927 BUILD_BUG_ON(IEEE80211_CCMP_HDR_LEN != IEEE80211_GCMP_HDR_LEN); 1928 iv_len = ieee80211_has_protected(hdr->frame_control) ? 1929 IEEE80211_CCMP_HDR_LEN : 0; 1930 1931 trace_iwlwifi_dev_tx(trans->dev, skb, 1932 iwl_txq_get_tfd(trans, txq, txq->write_ptr), 1933 trans_pcie->txqs.tfd.size, 1934 &dev_cmd->hdr, IWL_FIRST_TB_SIZE + tb1_len, 0); 1935 1936 ip_hdrlen = skb_network_header_len(skb); 1937 snap_ip_tcp_hdrlen = 8 + ip_hdrlen + tcp_hdrlen(skb); 1938 total_len = skb->len - snap_ip_tcp_hdrlen - hdr_len - iv_len; 1939 amsdu_pad = 0; 1940 1941 /* total amount of header we may need for this A-MSDU */ 1942 hdr_room = DIV_ROUND_UP(total_len, mss) * 1943 (3 + snap_ip_tcp_hdrlen + sizeof(struct ethhdr)) + iv_len; 1944 1945 /* Our device supports 9 segments at most, it will fit in 1 page */ 1946 sgt = iwl_pcie_prep_tso(trans, skb, out_meta, &start_hdr, hdr_room, 1947 snap_ip_tcp_hdrlen + hdr_len + iv_len); 1948 if (!sgt) 1949 return -ENOMEM; 1950 1951 start_hdr_phys = iwl_pcie_get_tso_page_phys(start_hdr); 1952 pos_hdr = start_hdr; 1953 memcpy(pos_hdr, skb->data + hdr_len, iv_len); 1954 pos_hdr += iv_len; 1955 1956 /* 1957 * Pull the ieee80211 header + IV to be able to use TSO core, 1958 * we will restore it for the tx_status flow. 1959 */ 1960 skb_pull(skb, hdr_len + iv_len); 1961 1962 /* 1963 * Remove the length of all the headers that we don't actually 1964 * have in the MPDU by themselves, but that we duplicate into 1965 * all the different MSDUs inside the A-MSDU. 1966 */ 1967 le16_add_cpu(&tx_cmd->len, -snap_ip_tcp_hdrlen); 1968 1969 tso_start(skb, &tso); 1970 1971 while (total_len) { 1972 /* this is the data left for this subframe */ 1973 unsigned int data_left = 1974 min_t(unsigned int, mss, total_len); 1975 unsigned int hdr_tb_len; 1976 dma_addr_t hdr_tb_phys; 1977 u8 *subf_hdrs_start = pos_hdr; 1978 1979 total_len -= data_left; 1980 1981 memset(pos_hdr, 0, amsdu_pad); 1982 pos_hdr += amsdu_pad; 1983 amsdu_pad = (4 - (sizeof(struct ethhdr) + snap_ip_tcp_hdrlen + 1984 data_left)) & 0x3; 1985 ether_addr_copy(pos_hdr, ieee80211_get_DA(hdr)); 1986 pos_hdr += ETH_ALEN; 1987 ether_addr_copy(pos_hdr, ieee80211_get_SA(hdr)); 1988 pos_hdr += ETH_ALEN; 1989 1990 length = snap_ip_tcp_hdrlen + data_left; 1991 *((__be16 *)pos_hdr) = cpu_to_be16(length); 1992 pos_hdr += sizeof(length); 1993 1994 /* 1995 * This will copy the SNAP as well which will be considered 1996 * as MAC header. 1997 */ 1998 tso_build_hdr(skb, pos_hdr, &tso, data_left, !total_len); 1999 2000 pos_hdr += snap_ip_tcp_hdrlen; 2001 2002 hdr_tb_len = pos_hdr - start_hdr; 2003 hdr_tb_phys = iwl_pcie_get_tso_page_phys(start_hdr); 2004 2005 iwl_pcie_txq_build_tfd(trans, txq, hdr_tb_phys, 2006 hdr_tb_len, false); 2007 trace_iwlwifi_dev_tx_tb(trans->dev, skb, start_hdr, 2008 hdr_tb_phys, hdr_tb_len); 2009 /* add this subframe's headers' length to the tx_cmd */ 2010 le16_add_cpu(&tx_cmd->len, pos_hdr - subf_hdrs_start); 2011 2012 /* prepare the start_hdr for the next subframe */ 2013 start_hdr = pos_hdr; 2014 2015 /* put the payload */ 2016 while (data_left) { 2017 unsigned int size = min_t(unsigned int, tso.size, 2018 data_left); 2019 dma_addr_t tb_phys; 2020 2021 tb_phys = iwl_pcie_get_sgt_tb_phys(sgt, data_offset, size); 2022 /* Not a real mapping error, use direct comparison */ 2023 if (unlikely(tb_phys == DMA_MAPPING_ERROR)) 2024 return -EINVAL; 2025 2026 iwl_pcie_txq_build_tfd(trans, txq, tb_phys, 2027 size, false); 2028 trace_iwlwifi_dev_tx_tb(trans->dev, skb, tso.data, 2029 tb_phys, size); 2030 2031 data_left -= size; 2032 data_offset += size; 2033 tso_build_data(skb, &tso, size); 2034 } 2035 } 2036 2037 dma_sync_single_for_device(trans->dev, start_hdr_phys, hdr_room, 2038 DMA_TO_DEVICE); 2039 2040 /* re -add the WiFi header and IV */ 2041 skb_push(skb, hdr_len + iv_len); 2042 2043 return 0; 2044 } 2045 #else /* CONFIG_INET */ 2046 static int iwl_fill_data_tbs_amsdu(struct iwl_trans *trans, struct sk_buff *skb, 2047 struct iwl_txq *txq, u8 hdr_len, 2048 struct iwl_cmd_meta *out_meta, 2049 struct iwl_device_tx_cmd *dev_cmd, 2050 u16 tb1_len) 2051 { 2052 /* No A-MSDU without CONFIG_INET */ 2053 WARN_ON(1); 2054 2055 return -1; 2056 } 2057 #endif /* CONFIG_INET */ 2058 2059 #define IWL_TX_CRC_SIZE 4 2060 #define IWL_TX_DELIMITER_SIZE 4 2061 2062 /* 2063 * iwl_txq_gen1_update_byte_cnt_tbl - Set up entry in Tx byte-count array 2064 */ 2065 static void iwl_txq_gen1_update_byte_cnt_tbl(struct iwl_trans *trans, 2066 struct iwl_txq *txq, u16 byte_cnt, 2067 int num_tbs) 2068 { 2069 struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); 2070 struct iwl_bc_tbl_entry *scd_bc_tbl; 2071 int write_ptr = txq->write_ptr; 2072 int txq_id = txq->id; 2073 u8 sec_ctl = 0; 2074 u16 len = byte_cnt + IWL_TX_CRC_SIZE + IWL_TX_DELIMITER_SIZE; 2075 __le16 bc_ent; 2076 struct iwl_device_tx_cmd *dev_cmd = txq->entries[txq->write_ptr].cmd; 2077 struct iwl_tx_cmd_v6 *tx_cmd = (void *)dev_cmd->payload; 2078 u8 sta_id = tx_cmd->sta_id; 2079 2080 scd_bc_tbl = trans_pcie->txqs.scd_bc_tbls.addr; 2081 2082 sec_ctl = tx_cmd->sec_ctl; 2083 2084 switch (sec_ctl & TX_CMD_SEC_MSK) { 2085 case TX_CMD_SEC_CCM: 2086 len += IEEE80211_CCMP_MIC_LEN; 2087 break; 2088 case TX_CMD_SEC_TKIP: 2089 len += IEEE80211_TKIP_ICV_LEN; 2090 break; 2091 case TX_CMD_SEC_WEP: 2092 len += IEEE80211_WEP_IV_LEN + IEEE80211_WEP_ICV_LEN; 2093 break; 2094 } 2095 2096 if (trans->mac_cfg->device_family < IWL_DEVICE_FAMILY_AX210) 2097 len = DIV_ROUND_UP(len, 4); 2098 2099 if (WARN_ON(len > 0xFFF || write_ptr >= TFD_QUEUE_SIZE_MAX)) 2100 return; 2101 2102 bc_ent = cpu_to_le16(len | (sta_id << 12)); 2103 2104 scd_bc_tbl[txq_id * BC_TABLE_SIZE + write_ptr].tfd_offset = bc_ent; 2105 2106 if (write_ptr < TFD_QUEUE_SIZE_BC_DUP) 2107 scd_bc_tbl[txq_id * BC_TABLE_SIZE + TFD_QUEUE_SIZE_MAX + write_ptr].tfd_offset = 2108 bc_ent; 2109 } 2110 2111 int iwl_trans_pcie_tx(struct iwl_trans *trans, struct sk_buff *skb, 2112 struct iwl_device_tx_cmd *dev_cmd, int txq_id) 2113 { 2114 struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); 2115 struct ieee80211_hdr *hdr; 2116 struct iwl_tx_cmd_v6 *tx_cmd = (struct iwl_tx_cmd_v6 *)dev_cmd->payload; 2117 struct iwl_cmd_meta *out_meta; 2118 struct iwl_txq *txq; 2119 dma_addr_t tb0_phys, tb1_phys, scratch_phys; 2120 void *tb1_addr; 2121 void *tfd; 2122 u16 len, tb1_len; 2123 bool wait_write_ptr; 2124 __le16 fc; 2125 u8 hdr_len; 2126 u16 wifi_seq; 2127 bool amsdu; 2128 2129 txq = trans_pcie->txqs.txq[txq_id]; 2130 2131 if (WARN_ONCE(!test_bit(txq_id, trans_pcie->txqs.queue_used), 2132 "TX on unused queue %d\n", txq_id)) 2133 return -EINVAL; 2134 2135 if (skb_is_nonlinear(skb) && 2136 skb_shinfo(skb)->nr_frags > IWL_TRANS_PCIE_MAX_FRAGS(trans_pcie) && 2137 __skb_linearize(skb)) 2138 return -ENOMEM; 2139 2140 /* mac80211 always puts the full header into the SKB's head, 2141 * so there's no need to check if it's readable there 2142 */ 2143 hdr = (struct ieee80211_hdr *)skb->data; 2144 fc = hdr->frame_control; 2145 hdr_len = ieee80211_hdrlen(fc); 2146 2147 spin_lock(&txq->lock); 2148 2149 if (iwl_txq_space(trans, txq) < txq->high_mark) { 2150 iwl_txq_stop(trans, txq); 2151 2152 /* don't put the packet on the ring, if there is no room */ 2153 if (unlikely(iwl_txq_space(trans, txq) < 3)) { 2154 struct iwl_device_tx_cmd **dev_cmd_ptr; 2155 2156 dev_cmd_ptr = (void *)((u8 *)skb->cb + 2157 trans->conf.cb_data_offs + 2158 sizeof(void *)); 2159 2160 *dev_cmd_ptr = dev_cmd; 2161 __skb_queue_tail(&txq->overflow_q, skb); 2162 2163 spin_unlock(&txq->lock); 2164 return 0; 2165 } 2166 } 2167 2168 /* In AGG mode, the index in the ring must correspond to the WiFi 2169 * sequence number. This is a HW requirements to help the SCD to parse 2170 * the BA. 2171 * Check here that the packets are in the right place on the ring. 2172 */ 2173 wifi_seq = IEEE80211_SEQ_TO_SN(le16_to_cpu(hdr->seq_ctrl)); 2174 WARN_ONCE(txq->ampdu && 2175 (wifi_seq & 0xff) != txq->write_ptr, 2176 "Q: %d WiFi Seq %d tfdNum %d", 2177 txq_id, wifi_seq, txq->write_ptr); 2178 2179 /* Set up driver data for this TFD */ 2180 txq->entries[txq->write_ptr].skb = skb; 2181 txq->entries[txq->write_ptr].cmd = dev_cmd; 2182 2183 dev_cmd->hdr.sequence = 2184 cpu_to_le16((u16)(QUEUE_TO_SEQ(txq_id) | 2185 INDEX_TO_SEQ(txq->write_ptr))); 2186 2187 tb0_phys = iwl_txq_get_first_tb_dma(txq, txq->write_ptr); 2188 scratch_phys = tb0_phys + sizeof(struct iwl_cmd_header) + 2189 offsetof(struct iwl_tx_cmd_v6, scratch); 2190 2191 tx_cmd->dram_lsb_ptr = cpu_to_le32(scratch_phys); 2192 tx_cmd->dram_msb_ptr = iwl_get_dma_hi_addr(scratch_phys); 2193 2194 /* Set up first empty entry in queue's array of Tx/cmd buffers */ 2195 out_meta = &txq->entries[txq->write_ptr].meta; 2196 memset(out_meta, 0, sizeof(*out_meta)); 2197 2198 /* 2199 * The second TB (tb1) points to the remainder of the TX command 2200 * and the 802.11 header - dword aligned size 2201 * (This calculation modifies the TX command, so do it before the 2202 * setup of the first TB) 2203 */ 2204 len = sizeof(struct iwl_tx_cmd_v6) + sizeof(struct iwl_cmd_header) + 2205 hdr_len - IWL_FIRST_TB_SIZE; 2206 /* do not align A-MSDU to dword as the subframe header aligns it */ 2207 amsdu = ieee80211_is_data_qos(fc) && 2208 (*ieee80211_get_qos_ctl(hdr) & 2209 IEEE80211_QOS_CTL_A_MSDU_PRESENT); 2210 if (!amsdu) { 2211 tb1_len = ALIGN(len, 4); 2212 /* Tell NIC about any 2-byte padding after MAC header */ 2213 if (tb1_len != len) 2214 tx_cmd->tx_flags |= cpu_to_le32(TX_CMD_FLG_MH_PAD); 2215 } else { 2216 tb1_len = len; 2217 } 2218 2219 /* 2220 * The first TB points to bi-directional DMA data, we'll 2221 * memcpy the data into it later. 2222 */ 2223 iwl_pcie_txq_build_tfd(trans, txq, tb0_phys, 2224 IWL_FIRST_TB_SIZE, true); 2225 2226 /* there must be data left over for TB1 or this code must be changed */ 2227 BUILD_BUG_ON(sizeof(struct iwl_tx_cmd_v6) < IWL_FIRST_TB_SIZE); 2228 BUILD_BUG_ON(sizeof(struct iwl_cmd_header) + 2229 offsetofend(struct iwl_tx_cmd_v6, scratch) > 2230 IWL_FIRST_TB_SIZE); 2231 2232 /* map the data for TB1 */ 2233 tb1_addr = ((u8 *)&dev_cmd->hdr) + IWL_FIRST_TB_SIZE; 2234 tb1_phys = dma_map_single(trans->dev, tb1_addr, tb1_len, DMA_TO_DEVICE); 2235 if (unlikely(dma_mapping_error(trans->dev, tb1_phys))) 2236 goto out_err; 2237 iwl_pcie_txq_build_tfd(trans, txq, tb1_phys, tb1_len, false); 2238 2239 trace_iwlwifi_dev_tx(trans->dev, skb, 2240 iwl_txq_get_tfd(trans, txq, txq->write_ptr), 2241 trans_pcie->txqs.tfd.size, 2242 &dev_cmd->hdr, IWL_FIRST_TB_SIZE + tb1_len, 2243 hdr_len); 2244 2245 /* 2246 * If gso_size wasn't set, don't give the frame "amsdu treatment" 2247 * (adding subframes, etc.). 2248 * This can happen in some testing flows when the amsdu was already 2249 * pre-built, and we just need to send the resulting skb. 2250 */ 2251 if (amsdu && skb_shinfo(skb)->gso_size) { 2252 if (unlikely(iwl_fill_data_tbs_amsdu(trans, skb, txq, hdr_len, 2253 out_meta, dev_cmd, 2254 tb1_len))) 2255 goto out_err; 2256 } else { 2257 struct sk_buff *frag; 2258 2259 if (unlikely(iwl_fill_data_tbs(trans, skb, txq, hdr_len, 2260 out_meta))) 2261 goto out_err; 2262 2263 skb_walk_frags(skb, frag) { 2264 if (unlikely(iwl_fill_data_tbs(trans, frag, txq, 0, 2265 out_meta))) 2266 goto out_err; 2267 } 2268 } 2269 2270 /* building the A-MSDU might have changed this data, so memcpy it now */ 2271 memcpy(&txq->first_tb_bufs[txq->write_ptr], dev_cmd, IWL_FIRST_TB_SIZE); 2272 2273 tfd = iwl_txq_get_tfd(trans, txq, txq->write_ptr); 2274 /* Set up entry for this TFD in Tx byte-count array */ 2275 iwl_txq_gen1_update_byte_cnt_tbl(trans, txq, le16_to_cpu(tx_cmd->len), 2276 iwl_txq_gen1_tfd_get_num_tbs(tfd)); 2277 2278 wait_write_ptr = ieee80211_has_morefrags(fc); 2279 2280 /* start timer if queue currently empty */ 2281 if (txq->read_ptr == txq->write_ptr && txq->wd_timeout) { 2282 /* 2283 * If the TXQ is active, then set the timer, if not, 2284 * set the timer in remainder so that the timer will 2285 * be armed with the right value when the station will 2286 * wake up. 2287 */ 2288 if (!txq->frozen) 2289 mod_timer(&txq->stuck_timer, 2290 jiffies + txq->wd_timeout); 2291 else 2292 txq->frozen_expiry_remainder = txq->wd_timeout; 2293 } 2294 2295 /* Tell device the write index *just past* this latest filled TFD */ 2296 txq->write_ptr = iwl_txq_inc_wrap(trans, txq->write_ptr); 2297 if (!wait_write_ptr) 2298 iwl_pcie_txq_inc_wr_ptr(trans, txq); 2299 2300 /* 2301 * At this point the frame is "transmitted" successfully 2302 * and we will get a TX status notification eventually. 2303 */ 2304 spin_unlock(&txq->lock); 2305 return 0; 2306 out_err: 2307 iwl_txq_gen1_tfd_unmap(trans, out_meta, txq, txq->write_ptr); 2308 spin_unlock(&txq->lock); 2309 return -1; 2310 } 2311 2312 static void iwl_txq_gen1_inval_byte_cnt_tbl(struct iwl_trans *trans, 2313 struct iwl_txq *txq, 2314 int read_ptr) 2315 { 2316 struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); 2317 struct iwl_bc_tbl_entry *scd_bc_tbl = trans_pcie->txqs.scd_bc_tbls.addr; 2318 int txq_id = txq->id; 2319 u8 sta_id = 0; 2320 __le16 bc_ent; 2321 struct iwl_device_tx_cmd *dev_cmd = txq->entries[read_ptr].cmd; 2322 struct iwl_tx_cmd_v6 *tx_cmd = (void *)dev_cmd->payload; 2323 2324 WARN_ON(read_ptr >= TFD_QUEUE_SIZE_MAX); 2325 2326 if (txq_id != trans->conf.cmd_queue) 2327 sta_id = tx_cmd->sta_id; 2328 2329 bc_ent = cpu_to_le16(1 | (sta_id << 12)); 2330 2331 scd_bc_tbl[txq_id * BC_TABLE_SIZE + read_ptr].tfd_offset = bc_ent; 2332 2333 if (read_ptr < TFD_QUEUE_SIZE_BC_DUP) 2334 scd_bc_tbl[txq_id * BC_TABLE_SIZE + TFD_QUEUE_SIZE_MAX + read_ptr].tfd_offset = 2335 bc_ent; 2336 } 2337 2338 /* Frees buffers until index _not_ inclusive */ 2339 void iwl_pcie_reclaim(struct iwl_trans *trans, int txq_id, int ssn, 2340 struct sk_buff_head *skbs, bool is_flush) 2341 { 2342 struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); 2343 struct iwl_txq *txq = trans_pcie->txqs.txq[txq_id]; 2344 int tfd_num, read_ptr, last_to_free; 2345 int txq_read_ptr, txq_write_ptr; 2346 2347 /* This function is not meant to release cmd queue*/ 2348 if (WARN_ON(txq_id == trans->conf.cmd_queue)) 2349 return; 2350 2351 if (WARN_ON(!txq)) 2352 return; 2353 2354 tfd_num = iwl_txq_get_cmd_index(txq, ssn); 2355 2356 spin_lock_bh(&txq->reclaim_lock); 2357 2358 spin_lock(&txq->lock); 2359 txq_read_ptr = txq->read_ptr; 2360 txq_write_ptr = txq->write_ptr; 2361 spin_unlock(&txq->lock); 2362 2363 /* There is nothing to do if we are flushing an empty queue */ 2364 if (is_flush && txq_write_ptr == txq_read_ptr) 2365 goto out; 2366 2367 read_ptr = iwl_txq_get_cmd_index(txq, txq_read_ptr); 2368 2369 if (!test_bit(txq_id, trans_pcie->txqs.queue_used)) { 2370 IWL_DEBUG_TX_QUEUES(trans, "Q %d inactive - ignoring idx %d\n", 2371 txq_id, ssn); 2372 goto out; 2373 } 2374 2375 if (read_ptr == tfd_num) 2376 goto out; 2377 2378 IWL_DEBUG_TX_REPLY(trans, "[Q %d] %d (%d) -> %d (%d)\n", 2379 txq_id, read_ptr, txq_read_ptr, tfd_num, ssn); 2380 2381 /* Since we free until index _not_ inclusive, the one before index is 2382 * the last we will free. This one must be used 2383 */ 2384 last_to_free = iwl_txq_dec_wrap(trans, tfd_num); 2385 2386 if (!iwl_txq_used(txq, last_to_free, txq_read_ptr, txq_write_ptr)) { 2387 IWL_ERR(trans, 2388 "%s: Read index for txq id (%d), last_to_free %d is out of range [0-%d] %d %d.\n", 2389 __func__, txq_id, last_to_free, 2390 trans->mac_cfg->base->max_tfd_queue_size, 2391 txq_write_ptr, txq_read_ptr); 2392 2393 iwl_op_mode_time_point(trans->op_mode, 2394 IWL_FW_INI_TIME_POINT_FAKE_TX, 2395 NULL); 2396 goto out; 2397 } 2398 2399 if (WARN_ON(!skb_queue_empty(skbs))) 2400 goto out; 2401 2402 for (; 2403 read_ptr != tfd_num; 2404 txq_read_ptr = iwl_txq_inc_wrap(trans, txq_read_ptr), 2405 read_ptr = iwl_txq_get_cmd_index(txq, txq_read_ptr)) { 2406 struct iwl_cmd_meta *cmd_meta = &txq->entries[read_ptr].meta; 2407 struct sk_buff *skb = txq->entries[read_ptr].skb; 2408 2409 if (WARN_ONCE(!skb, "no SKB at %d (%d) on queue %d\n", 2410 read_ptr, txq_read_ptr, txq_id)) 2411 continue; 2412 2413 iwl_pcie_free_tso_pages(trans, skb, cmd_meta); 2414 2415 __skb_queue_tail(skbs, skb); 2416 2417 txq->entries[read_ptr].skb = NULL; 2418 2419 if (!trans->mac_cfg->gen2) 2420 iwl_txq_gen1_inval_byte_cnt_tbl(trans, txq, 2421 txq_read_ptr); 2422 2423 iwl_txq_free_tfd(trans, txq, txq_read_ptr); 2424 } 2425 2426 spin_lock(&txq->lock); 2427 txq->read_ptr = txq_read_ptr; 2428 2429 iwl_txq_progress(txq); 2430 2431 if (iwl_txq_space(trans, txq) > txq->low_mark && 2432 test_bit(txq_id, trans_pcie->txqs.queue_stopped)) { 2433 struct sk_buff_head overflow_skbs; 2434 struct sk_buff *skb; 2435 2436 __skb_queue_head_init(&overflow_skbs); 2437 skb_queue_splice_init(&txq->overflow_q, 2438 is_flush ? skbs : &overflow_skbs); 2439 2440 /* 2441 * We are going to transmit from the overflow queue. 2442 * Remember this state so that wait_for_txq_empty will know we 2443 * are adding more packets to the TFD queue. It cannot rely on 2444 * the state of &txq->overflow_q, as we just emptied it, but 2445 * haven't TXed the content yet. 2446 */ 2447 txq->overflow_tx = true; 2448 2449 /* 2450 * This is tricky: we are in reclaim path and are holding 2451 * reclaim_lock, so noone will try to access the txq data 2452 * from that path. We stopped tx, so we can't have tx as well. 2453 * Bottom line, we can unlock and re-lock later. 2454 */ 2455 spin_unlock(&txq->lock); 2456 2457 while ((skb = __skb_dequeue(&overflow_skbs))) { 2458 struct iwl_device_tx_cmd *dev_cmd_ptr; 2459 2460 dev_cmd_ptr = *(void **)((u8 *)skb->cb + 2461 trans->conf.cb_data_offs + 2462 sizeof(void *)); 2463 2464 /* 2465 * Note that we can very well be overflowing again. 2466 * In that case, iwl_txq_space will be small again 2467 * and we won't wake mac80211's queue. 2468 */ 2469 iwl_trans_tx(trans, skb, dev_cmd_ptr, txq_id); 2470 } 2471 2472 if (iwl_txq_space(trans, txq) > txq->low_mark) 2473 iwl_trans_pcie_wake_queue(trans, txq); 2474 2475 spin_lock(&txq->lock); 2476 txq->overflow_tx = false; 2477 } 2478 2479 spin_unlock(&txq->lock); 2480 out: 2481 spin_unlock_bh(&txq->reclaim_lock); 2482 } 2483 2484 /* Set wr_ptr of specific device and txq */ 2485 void iwl_pcie_set_q_ptrs(struct iwl_trans *trans, int txq_id, int ptr) 2486 { 2487 struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); 2488 struct iwl_txq *txq = trans_pcie->txqs.txq[txq_id]; 2489 2490 spin_lock_bh(&txq->lock); 2491 2492 txq->write_ptr = ptr; 2493 txq->read_ptr = txq->write_ptr; 2494 2495 spin_unlock_bh(&txq->lock); 2496 } 2497 2498 void iwl_pcie_freeze_txq_timer(struct iwl_trans *trans, 2499 unsigned long txqs, bool freeze) 2500 { 2501 struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); 2502 int queue; 2503 2504 for_each_set_bit(queue, &txqs, BITS_PER_LONG) { 2505 struct iwl_txq *txq = trans_pcie->txqs.txq[queue]; 2506 unsigned long now; 2507 2508 spin_lock_bh(&txq->lock); 2509 2510 now = jiffies; 2511 2512 if (txq->frozen == freeze) 2513 goto next_queue; 2514 2515 IWL_DEBUG_TX_QUEUES(trans, "%s TXQ %d\n", 2516 freeze ? "Freezing" : "Waking", queue); 2517 2518 txq->frozen = freeze; 2519 2520 if (txq->read_ptr == txq->write_ptr) 2521 goto next_queue; 2522 2523 if (freeze) { 2524 if (unlikely(time_after(now, 2525 txq->stuck_timer.expires))) { 2526 /* 2527 * The timer should have fired, maybe it is 2528 * spinning right now on the lock. 2529 */ 2530 goto next_queue; 2531 } 2532 /* remember how long until the timer fires */ 2533 txq->frozen_expiry_remainder = 2534 txq->stuck_timer.expires - now; 2535 timer_delete(&txq->stuck_timer); 2536 goto next_queue; 2537 } 2538 2539 /* 2540 * Wake a non-empty queue -> arm timer with the 2541 * remainder before it froze 2542 */ 2543 mod_timer(&txq->stuck_timer, 2544 now + txq->frozen_expiry_remainder); 2545 2546 next_queue: 2547 spin_unlock_bh(&txq->lock); 2548 } 2549 } 2550 2551 #define HOST_COMPLETE_TIMEOUT (2 * HZ) 2552 2553 static int iwl_trans_pcie_send_hcmd_sync(struct iwl_trans *trans, 2554 struct iwl_host_cmd *cmd, 2555 const char *cmd_str) 2556 { 2557 struct iwl_trans_pcie *trans_pcie = IWL_TRANS_GET_PCIE_TRANS(trans); 2558 struct iwl_txq *txq = trans_pcie->txqs.txq[trans->conf.cmd_queue]; 2559 int cmd_idx; 2560 int ret; 2561 2562 IWL_DEBUG_INFO(trans, "Attempting to send sync command %s\n", cmd_str); 2563 2564 if (WARN(test_and_set_bit(STATUS_SYNC_HCMD_ACTIVE, 2565 &trans->status), 2566 "Command %s: a command is already active!\n", cmd_str)) 2567 return -EIO; 2568 2569 IWL_DEBUG_INFO(trans, "Setting HCMD_ACTIVE for command %s\n", cmd_str); 2570 2571 if (trans->mac_cfg->gen2) 2572 cmd_idx = iwl_pcie_gen2_enqueue_hcmd(trans, cmd); 2573 else 2574 cmd_idx = iwl_pcie_enqueue_hcmd(trans, cmd); 2575 2576 if (cmd_idx < 0) { 2577 ret = cmd_idx; 2578 clear_bit(STATUS_SYNC_HCMD_ACTIVE, &trans->status); 2579 IWL_ERR(trans, "Error sending %s: enqueue_hcmd failed: %d\n", 2580 cmd_str, ret); 2581 return ret; 2582 } 2583 2584 ret = wait_event_timeout(trans_pcie->wait_command_queue, 2585 !test_bit(STATUS_SYNC_HCMD_ACTIVE, 2586 &trans->status), 2587 HOST_COMPLETE_TIMEOUT); 2588 if (!ret) { 2589 IWL_ERR(trans, "Error sending %s: time out after %dms.\n", 2590 cmd_str, jiffies_to_msecs(HOST_COMPLETE_TIMEOUT)); 2591 2592 IWL_ERR(trans, "Current CMD queue read_ptr %d write_ptr %d\n", 2593 txq->read_ptr, txq->write_ptr); 2594 2595 clear_bit(STATUS_SYNC_HCMD_ACTIVE, &trans->status); 2596 IWL_DEBUG_INFO(trans, "Clearing HCMD_ACTIVE for command %s\n", 2597 cmd_str); 2598 ret = -ETIMEDOUT; 2599 2600 iwl_trans_pcie_sync_nmi(trans); 2601 goto cancel; 2602 } 2603 2604 if (test_bit(STATUS_FW_ERROR, &trans->status)) { 2605 if (!test_and_clear_bit(STATUS_SUPPRESS_CMD_ERROR_ONCE, 2606 &trans->status)) { 2607 IWL_ERR(trans, "FW error in SYNC CMD %s\n", cmd_str); 2608 dump_stack(); 2609 } 2610 ret = -EIO; 2611 goto cancel; 2612 } 2613 2614 if (!(cmd->flags & CMD_SEND_IN_RFKILL) && 2615 test_bit(STATUS_RFKILL_OPMODE, &trans->status)) { 2616 IWL_DEBUG_RF_KILL(trans, "RFKILL in SYNC CMD... no rsp\n"); 2617 ret = -ERFKILL; 2618 goto cancel; 2619 } 2620 2621 if ((cmd->flags & CMD_WANT_SKB) && !cmd->resp_pkt) { 2622 IWL_ERR(trans, "Error: Response NULL in '%s'\n", cmd_str); 2623 ret = -EIO; 2624 goto cancel; 2625 } 2626 2627 return 0; 2628 2629 cancel: 2630 if (cmd->flags & CMD_WANT_SKB) { 2631 /* 2632 * Cancel the CMD_WANT_SKB flag for the cmd in the 2633 * TX cmd queue. Otherwise in case the cmd comes 2634 * in later, it will possibly set an invalid 2635 * address (cmd->meta.source). 2636 */ 2637 txq->entries[cmd_idx].meta.flags &= ~CMD_WANT_SKB; 2638 } 2639 2640 if (cmd->resp_pkt) { 2641 iwl_free_resp(cmd); 2642 cmd->resp_pkt = NULL; 2643 } 2644 2645 return ret; 2646 } 2647 2648 int iwl_trans_pcie_send_hcmd(struct iwl_trans *trans, 2649 struct iwl_host_cmd *cmd) 2650 { 2651 const char *cmd_str = iwl_get_cmd_string(trans, cmd->id); 2652 2653 /* Make sure the NIC is still alive in the bus */ 2654 if (test_bit(STATUS_TRANS_DEAD, &trans->status)) 2655 return -ENODEV; 2656 2657 if (!(cmd->flags & CMD_SEND_IN_RFKILL) && 2658 test_bit(STATUS_RFKILL_OPMODE, &trans->status)) { 2659 IWL_DEBUG_RF_KILL(trans, "Dropping CMD 0x%x: RF KILL\n", 2660 cmd->id); 2661 return -ERFKILL; 2662 } 2663 2664 if (cmd->flags & CMD_ASYNC) { 2665 int ret; 2666 2667 IWL_DEBUG_INFO(trans, "Sending async command %s\n", cmd_str); 2668 2669 /* An asynchronous command can not expect an SKB to be set. */ 2670 if (WARN_ON(cmd->flags & CMD_WANT_SKB)) 2671 return -EINVAL; 2672 2673 if (trans->mac_cfg->gen2) 2674 ret = iwl_pcie_gen2_enqueue_hcmd(trans, cmd); 2675 else 2676 ret = iwl_pcie_enqueue_hcmd(trans, cmd); 2677 2678 if (ret < 0) { 2679 IWL_ERR(trans, 2680 "Error sending %s: enqueue_hcmd failed: %d\n", 2681 iwl_get_cmd_string(trans, cmd->id), ret); 2682 return ret; 2683 } 2684 return 0; 2685 } 2686 2687 return iwl_trans_pcie_send_hcmd_sync(trans, cmd, cmd_str); 2688 } 2689