Lines Matching refs:txq
149 struct iwl_txq *txq = (void *)data; in iwl_pcie_txq_stuck_timer() local
150 struct iwl_trans_pcie *trans_pcie = txq->trans_pcie; in iwl_pcie_txq_stuck_timer()
153 SCD_TX_STTS_QUEUE_OFFSET(txq->q.id); in iwl_pcie_txq_stuck_timer()
157 spin_lock(&txq->lock); in iwl_pcie_txq_stuck_timer()
159 if (txq->q.read_ptr == txq->q.write_ptr) { in iwl_pcie_txq_stuck_timer()
160 spin_unlock(&txq->lock); in iwl_pcie_txq_stuck_timer()
163 spin_unlock(&txq->lock); in iwl_pcie_txq_stuck_timer()
165 IWL_ERR(trans, "Queue %d stuck for %u ms.\n", txq->q.id, in iwl_pcie_txq_stuck_timer()
166 jiffies_to_msecs(txq->wd_timeout)); in iwl_pcie_txq_stuck_timer()
168 txq->q.read_ptr, txq->q.write_ptr); in iwl_pcie_txq_stuck_timer()
207 struct iwl_txq *txq, u16 byte_cnt) in iwl_pcie_txq_update_byte_cnt_tbl() argument
211 int write_ptr = txq->q.write_ptr; in iwl_pcie_txq_update_byte_cnt_tbl()
212 int txq_id = txq->q.id; in iwl_pcie_txq_update_byte_cnt_tbl()
218 (void *) txq->entries[txq->q.write_ptr].cmd->payload; in iwl_pcie_txq_update_byte_cnt_tbl()
253 struct iwl_txq *txq) in iwl_pcie_txq_inval_byte_cnt_tbl() argument
258 int txq_id = txq->q.id; in iwl_pcie_txq_inval_byte_cnt_tbl()
259 int read_ptr = txq->q.read_ptr; in iwl_pcie_txq_inval_byte_cnt_tbl()
263 (void *)txq->entries[txq->q.read_ptr].cmd->payload; in iwl_pcie_txq_inval_byte_cnt_tbl()
282 struct iwl_txq *txq) in iwl_pcie_txq_inc_wr_ptr() argument
286 int txq_id = txq->q.id; in iwl_pcie_txq_inc_wr_ptr()
288 lockdep_assert_held(&txq->lock); in iwl_pcie_txq_inc_wr_ptr()
311 txq->need_update = true; in iwl_pcie_txq_inc_wr_ptr()
320 IWL_DEBUG_TX(trans, "Q:%d WR: 0x%x\n", txq_id, txq->q.write_ptr); in iwl_pcie_txq_inc_wr_ptr()
321 iwl_write32(trans, HBUS_TARG_WRPTR, txq->q.write_ptr | (txq_id << 8)); in iwl_pcie_txq_inc_wr_ptr()
330 struct iwl_txq *txq = &trans_pcie->txq[i]; in iwl_pcie_txq_check_wrptrs() local
332 spin_lock_bh(&txq->lock); in iwl_pcie_txq_check_wrptrs()
333 if (trans_pcie->txq[i].need_update) { in iwl_pcie_txq_check_wrptrs()
334 iwl_pcie_txq_inc_wr_ptr(trans, txq); in iwl_pcie_txq_check_wrptrs()
335 trans_pcie->txq[i].need_update = false; in iwl_pcie_txq_check_wrptrs()
337 spin_unlock_bh(&txq->lock); in iwl_pcie_txq_check_wrptrs()
415 static void iwl_pcie_txq_free_tfd(struct iwl_trans *trans, struct iwl_txq *txq) in iwl_pcie_txq_free_tfd() argument
417 struct iwl_tfd *tfd_tmp = txq->tfds; in iwl_pcie_txq_free_tfd()
422 int rd_ptr = txq->q.read_ptr; in iwl_pcie_txq_free_tfd()
423 int idx = get_cmd_index(&txq->q, rd_ptr); in iwl_pcie_txq_free_tfd()
425 lockdep_assert_held(&txq->lock); in iwl_pcie_txq_free_tfd()
430 iwl_pcie_tfd_unmap(trans, &txq->entries[idx].meta, &tfd_tmp[rd_ptr]); in iwl_pcie_txq_free_tfd()
433 if (txq->entries) { in iwl_pcie_txq_free_tfd()
436 skb = txq->entries[idx].skb; in iwl_pcie_txq_free_tfd()
444 txq->entries[idx].skb = NULL; in iwl_pcie_txq_free_tfd()
449 static int iwl_pcie_txq_build_tfd(struct iwl_trans *trans, struct iwl_txq *txq, in iwl_pcie_txq_build_tfd() argument
456 q = &txq->q; in iwl_pcie_txq_build_tfd()
457 tfd_tmp = txq->tfds; in iwl_pcie_txq_build_tfd()
482 struct iwl_txq *txq, int slots_num, in iwl_pcie_txq_alloc() argument
490 if (WARN_ON(txq->entries || txq->tfds)) in iwl_pcie_txq_alloc()
493 setup_timer(&txq->stuck_timer, iwl_pcie_txq_stuck_timer, in iwl_pcie_txq_alloc()
494 (unsigned long)txq); in iwl_pcie_txq_alloc()
495 txq->trans_pcie = trans_pcie; in iwl_pcie_txq_alloc()
497 txq->q.n_window = slots_num; in iwl_pcie_txq_alloc()
499 txq->entries = kcalloc(slots_num, in iwl_pcie_txq_alloc()
503 if (!txq->entries) in iwl_pcie_txq_alloc()
508 txq->entries[i].cmd = in iwl_pcie_txq_alloc()
511 if (!txq->entries[i].cmd) in iwl_pcie_txq_alloc()
517 txq->tfds = dma_alloc_coherent(trans->dev, tfd_sz, in iwl_pcie_txq_alloc()
518 &txq->q.dma_addr, GFP_KERNEL); in iwl_pcie_txq_alloc()
519 if (!txq->tfds) in iwl_pcie_txq_alloc()
522 BUILD_BUG_ON(IWL_HCMD_SCRATCHBUF_SIZE != sizeof(*txq->scratchbufs)); in iwl_pcie_txq_alloc()
527 scratchbuf_sz = sizeof(*txq->scratchbufs) * slots_num; in iwl_pcie_txq_alloc()
529 txq->scratchbufs = dma_alloc_coherent(trans->dev, scratchbuf_sz, in iwl_pcie_txq_alloc()
530 &txq->scratchbufs_dma, in iwl_pcie_txq_alloc()
532 if (!txq->scratchbufs) in iwl_pcie_txq_alloc()
535 txq->q.id = txq_id; in iwl_pcie_txq_alloc()
539 dma_free_coherent(trans->dev, tfd_sz, txq->tfds, txq->q.dma_addr); in iwl_pcie_txq_alloc()
541 if (txq->entries && txq_id == trans_pcie->cmd_queue) in iwl_pcie_txq_alloc()
543 kfree(txq->entries[i].cmd); in iwl_pcie_txq_alloc()
544 kfree(txq->entries); in iwl_pcie_txq_alloc()
545 txq->entries = NULL; in iwl_pcie_txq_alloc()
551 static int iwl_pcie_txq_init(struct iwl_trans *trans, struct iwl_txq *txq, in iwl_pcie_txq_init() argument
556 txq->need_update = false; in iwl_pcie_txq_init()
563 ret = iwl_queue_init(&txq->q, slots_num, txq_id); in iwl_pcie_txq_init()
567 spin_lock_init(&txq->lock); in iwl_pcie_txq_init()
574 txq->q.dma_addr >> 8); in iwl_pcie_txq_init()
585 struct iwl_txq *txq = &trans_pcie->txq[txq_id]; in iwl_pcie_txq_unmap() local
586 struct iwl_queue *q = &txq->q; in iwl_pcie_txq_unmap()
588 spin_lock_bh(&txq->lock); in iwl_pcie_txq_unmap()
592 iwl_pcie_txq_free_tfd(trans, txq); in iwl_pcie_txq_unmap()
595 txq->active = false; in iwl_pcie_txq_unmap()
596 spin_unlock_bh(&txq->lock); in iwl_pcie_txq_unmap()
599 iwl_wake_queue(trans, txq); in iwl_pcie_txq_unmap()
613 struct iwl_txq *txq = &trans_pcie->txq[txq_id]; in iwl_pcie_txq_free() local
617 if (WARN_ON(!txq)) in iwl_pcie_txq_free()
624 for (i = 0; i < txq->q.n_window; i++) { in iwl_pcie_txq_free()
625 kzfree(txq->entries[i].cmd); in iwl_pcie_txq_free()
626 kzfree(txq->entries[i].free_buf); in iwl_pcie_txq_free()
630 if (txq->tfds) { in iwl_pcie_txq_free()
633 txq->tfds, txq->q.dma_addr); in iwl_pcie_txq_free()
634 txq->q.dma_addr = 0; in iwl_pcie_txq_free()
635 txq->tfds = NULL; in iwl_pcie_txq_free()
638 sizeof(*txq->scratchbufs) * txq->q.n_window, in iwl_pcie_txq_free()
639 txq->scratchbufs, txq->scratchbufs_dma); in iwl_pcie_txq_free()
642 kfree(txq->entries); in iwl_pcie_txq_free()
643 txq->entries = NULL; in iwl_pcie_txq_free()
645 del_timer_sync(&txq->stuck_timer); in iwl_pcie_txq_free()
648 memset(txq, 0, sizeof(*txq)); in iwl_pcie_txq_free()
715 struct iwl_txq *txq = &trans_pcie->txq[txq_id]; in iwl_trans_pcie_tx_reset() local
718 txq->q.dma_addr >> 8); in iwl_trans_pcie_tx_reset()
720 txq->q.read_ptr = 0; in iwl_trans_pcie_tx_reset()
721 txq->q.write_ptr = 0; in iwl_trans_pcie_tx_reset()
790 if (!trans_pcie->txq) in iwl_pcie_tx_stop()
812 if (trans_pcie->txq) { in iwl_pcie_tx_free()
818 kfree(trans_pcie->txq); in iwl_pcie_tx_free()
819 trans_pcie->txq = NULL; in iwl_pcie_tx_free()
841 if (WARN_ON(trans_pcie->txq)) { in iwl_pcie_tx_alloc()
860 trans_pcie->txq = kcalloc(trans->cfg->base_params->num_of_queues, in iwl_pcie_tx_alloc()
862 if (!trans_pcie->txq) { in iwl_pcie_tx_alloc()
873 ret = iwl_pcie_txq_alloc(trans, &trans_pcie->txq[txq_id], in iwl_pcie_tx_alloc()
895 if (!trans_pcie->txq) { in iwl_pcie_tx_init()
918 ret = iwl_pcie_txq_init(trans, &trans_pcie->txq[txq_id], in iwl_pcie_tx_init()
939 static inline void iwl_pcie_txq_progress(struct iwl_txq *txq) in iwl_pcie_txq_progress() argument
941 lockdep_assert_held(&txq->lock); in iwl_pcie_txq_progress()
943 if (!txq->wd_timeout) in iwl_pcie_txq_progress()
950 if (txq->frozen) in iwl_pcie_txq_progress()
957 if (txq->q.read_ptr == txq->q.write_ptr) in iwl_pcie_txq_progress()
958 del_timer(&txq->stuck_timer); in iwl_pcie_txq_progress()
960 mod_timer(&txq->stuck_timer, jiffies + txq->wd_timeout); in iwl_pcie_txq_progress()
968 struct iwl_txq *txq = &trans_pcie->txq[txq_id]; in iwl_trans_pcie_reclaim() local
970 struct iwl_queue *q = &txq->q; in iwl_trans_pcie_reclaim()
977 spin_lock_bh(&txq->lock); in iwl_trans_pcie_reclaim()
979 if (!txq->active) { in iwl_trans_pcie_reclaim()
985 if (txq->q.read_ptr == tfd_num) in iwl_trans_pcie_reclaim()
989 txq_id, txq->q.read_ptr, tfd_num, ssn); in iwl_trans_pcie_reclaim()
1010 if (WARN_ON_ONCE(txq->entries[txq->q.read_ptr].skb == NULL)) in iwl_trans_pcie_reclaim()
1013 __skb_queue_tail(skbs, txq->entries[txq->q.read_ptr].skb); in iwl_trans_pcie_reclaim()
1015 txq->entries[txq->q.read_ptr].skb = NULL; in iwl_trans_pcie_reclaim()
1017 iwl_pcie_txq_inval_byte_cnt_tbl(trans, txq); in iwl_trans_pcie_reclaim()
1019 iwl_pcie_txq_free_tfd(trans, txq); in iwl_trans_pcie_reclaim()
1022 iwl_pcie_txq_progress(txq); in iwl_trans_pcie_reclaim()
1024 if (iwl_queue_space(&txq->q) > txq->q.low_mark) in iwl_trans_pcie_reclaim()
1025 iwl_wake_queue(trans, txq); in iwl_trans_pcie_reclaim()
1033 spin_unlock_bh(&txq->lock); in iwl_trans_pcie_reclaim()
1112 struct iwl_txq *txq = &trans_pcie->txq[txq_id]; in iwl_pcie_cmdq_reclaim() local
1113 struct iwl_queue *q = &txq->q; in iwl_pcie_cmdq_reclaim()
1117 lockdep_assert_held(&txq->lock); in iwl_pcie_cmdq_reclaim()
1143 iwl_pcie_txq_progress(txq); in iwl_pcie_cmdq_reclaim()
1180 struct iwl_txq *txq = &trans_pcie->txq[txq_id]; in iwl_trans_pcie_txq_enable() local
1186 txq->wd_timeout = msecs_to_jiffies(wdg_timeout); in iwl_trans_pcie_txq_enable()
1211 txq->ampdu = true; in iwl_trans_pcie_txq_enable()
1220 ssn = txq->q.read_ptr; in iwl_trans_pcie_txq_enable()
1226 txq->q.read_ptr = (ssn & 0xff); in iwl_trans_pcie_txq_enable()
1227 txq->q.write_ptr = (ssn & 0xff); in iwl_trans_pcie_txq_enable()
1268 txq->active = true; in iwl_trans_pcie_txq_enable()
1279 trans_pcie->txq[txq_id].frozen_expiry_remainder = 0; in iwl_trans_pcie_txq_disable()
1280 trans_pcie->txq[txq_id].frozen = false; in iwl_trans_pcie_txq_disable()
1302 trans_pcie->txq[txq_id].ampdu = false; in iwl_trans_pcie_txq_disable()
1322 struct iwl_txq *txq = &trans_pcie->txq[trans_pcie->cmd_queue]; in iwl_pcie_enqueue_hcmd() local
1323 struct iwl_queue *q = &txq->q; in iwl_pcie_enqueue_hcmd()
1419 spin_lock_bh(&txq->lock); in iwl_pcie_enqueue_hcmd()
1422 spin_unlock_bh(&txq->lock); in iwl_pcie_enqueue_hcmd()
1431 out_cmd = txq->entries[idx].cmd; in iwl_pcie_enqueue_hcmd()
1432 out_meta = &txq->entries[idx].meta; in iwl_pcie_enqueue_hcmd()
1511 memcpy(&txq->scratchbufs[q->write_ptr], &out_cmd->hdr, scratch_size); in iwl_pcie_enqueue_hcmd()
1512 iwl_pcie_txq_build_tfd(trans, txq, in iwl_pcie_enqueue_hcmd()
1513 iwl_pcie_get_scratchbuf_dma(txq, q->write_ptr), in iwl_pcie_enqueue_hcmd()
1524 &txq->tfds[q->write_ptr]); in iwl_pcie_enqueue_hcmd()
1529 iwl_pcie_txq_build_tfd(trans, txq, phys_addr, in iwl_pcie_enqueue_hcmd()
1548 &txq->tfds[q->write_ptr]); in iwl_pcie_enqueue_hcmd()
1553 iwl_pcie_txq_build_tfd(trans, txq, phys_addr, cmdlen[i], false); in iwl_pcie_enqueue_hcmd()
1559 if (WARN_ON_ONCE(txq->entries[idx].free_buf)) in iwl_pcie_enqueue_hcmd()
1560 kzfree(txq->entries[idx].free_buf); in iwl_pcie_enqueue_hcmd()
1561 txq->entries[idx].free_buf = dup_buf; in iwl_pcie_enqueue_hcmd()
1566 if (q->read_ptr == q->write_ptr && txq->wd_timeout) in iwl_pcie_enqueue_hcmd()
1567 mod_timer(&txq->stuck_timer, jiffies + txq->wd_timeout); in iwl_pcie_enqueue_hcmd()
1579 iwl_pcie_txq_inc_wr_ptr(trans, txq); in iwl_pcie_enqueue_hcmd()
1584 spin_unlock_bh(&txq->lock); in iwl_pcie_enqueue_hcmd()
1610 struct iwl_txq *txq = &trans_pcie->txq[trans_pcie->cmd_queue]; in iwl_pcie_hcmd_complete() local
1618 trans_pcie->txq[trans_pcie->cmd_queue].q.read_ptr, in iwl_pcie_hcmd_complete()
1619 trans_pcie->txq[trans_pcie->cmd_queue].q.write_ptr)) { in iwl_pcie_hcmd_complete()
1624 spin_lock_bh(&txq->lock); in iwl_pcie_hcmd_complete()
1626 cmd_index = get_cmd_index(&txq->q, index); in iwl_pcie_hcmd_complete()
1627 cmd = txq->entries[cmd_index].cmd; in iwl_pcie_hcmd_complete()
1628 meta = &txq->entries[cmd_index].meta; in iwl_pcie_hcmd_complete()
1630 iwl_pcie_tfd_unmap(trans, meta, &txq->tfds[index]); in iwl_pcie_hcmd_complete()
1657 spin_unlock_bh(&txq->lock); in iwl_pcie_hcmd_complete()
1716 struct iwl_txq *txq = &trans_pcie->txq[trans_pcie->cmd_queue]; in iwl_pcie_send_hcmd_sync() local
1717 struct iwl_queue *q = &txq->q; in iwl_pcie_send_hcmd_sync()
1769 trans_pcie->txq[trans_pcie->cmd_queue]. in iwl_pcie_send_hcmd_sync()
1804 struct iwl_txq *txq; in iwl_trans_pcie_tx() local
1815 txq = &trans_pcie->txq[txq_id]; in iwl_trans_pcie_tx()
1816 q = &txq->q; in iwl_trans_pcie_tx()
1834 spin_lock(&txq->lock); in iwl_trans_pcie_tx()
1842 WARN_ONCE(txq->ampdu && in iwl_trans_pcie_tx()
1848 txq->entries[q->write_ptr].skb = skb; in iwl_trans_pcie_tx()
1849 txq->entries[q->write_ptr].cmd = dev_cmd; in iwl_trans_pcie_tx()
1855 tb0_phys = iwl_pcie_get_scratchbuf_dma(txq, q->write_ptr); in iwl_trans_pcie_tx()
1863 out_meta = &txq->entries[q->write_ptr].meta; in iwl_trans_pcie_tx()
1881 memcpy(&txq->scratchbufs[q->write_ptr], &dev_cmd->hdr, in iwl_trans_pcie_tx()
1883 iwl_pcie_txq_build_tfd(trans, txq, tb0_phys, in iwl_trans_pcie_tx()
1894 iwl_pcie_txq_build_tfd(trans, txq, tb1_phys, tb1_len, false); in iwl_trans_pcie_tx()
1907 &txq->tfds[q->write_ptr]); in iwl_trans_pcie_tx()
1910 iwl_pcie_txq_build_tfd(trans, txq, tb2_phys, tb2_len, false); in iwl_trans_pcie_tx()
1927 &txq->tfds[q->write_ptr]); in iwl_trans_pcie_tx()
1930 tb_idx = iwl_pcie_txq_build_tfd(trans, txq, tb_phys, in iwl_trans_pcie_tx()
1937 iwl_pcie_txq_update_byte_cnt_tbl(trans, txq, le16_to_cpu(tx_cmd->len)); in iwl_trans_pcie_tx()
1940 &txq->tfds[txq->q.write_ptr], in iwl_trans_pcie_tx()
1951 if (txq->wd_timeout) { in iwl_trans_pcie_tx()
1958 if (!txq->frozen) in iwl_trans_pcie_tx()
1959 mod_timer(&txq->stuck_timer, in iwl_trans_pcie_tx()
1960 jiffies + txq->wd_timeout); in iwl_trans_pcie_tx()
1962 txq->frozen_expiry_remainder = txq->wd_timeout; in iwl_trans_pcie_tx()
1971 iwl_pcie_txq_inc_wr_ptr(trans, txq); in iwl_trans_pcie_tx()
1979 iwl_pcie_txq_inc_wr_ptr(trans, txq); in iwl_trans_pcie_tx()
1981 iwl_stop_queue(trans, txq); in iwl_trans_pcie_tx()
1983 spin_unlock(&txq->lock); in iwl_trans_pcie_tx()
1986 spin_unlock(&txq->lock); in iwl_trans_pcie_tx()