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()
252 struct iwl_txq *txq) in iwl_pcie_txq_inval_byte_cnt_tbl() argument
257 int txq_id = txq->q.id; in iwl_pcie_txq_inval_byte_cnt_tbl()
258 int read_ptr = txq->q.read_ptr; in iwl_pcie_txq_inval_byte_cnt_tbl()
262 (void *)txq->entries[txq->q.read_ptr].cmd->payload; in iwl_pcie_txq_inval_byte_cnt_tbl()
281 struct iwl_txq *txq) in iwl_pcie_txq_inc_wr_ptr() argument
285 int txq_id = txq->q.id; in iwl_pcie_txq_inc_wr_ptr()
287 lockdep_assert_held(&txq->lock); in iwl_pcie_txq_inc_wr_ptr()
310 txq->need_update = true; in iwl_pcie_txq_inc_wr_ptr()
319 IWL_DEBUG_TX(trans, "Q:%d WR: 0x%x\n", txq_id, txq->q.write_ptr); in iwl_pcie_txq_inc_wr_ptr()
320 iwl_write32(trans, HBUS_TARG_WRPTR, txq->q.write_ptr | (txq_id << 8)); in iwl_pcie_txq_inc_wr_ptr()
329 struct iwl_txq *txq = &trans_pcie->txq[i]; in iwl_pcie_txq_check_wrptrs() local
331 spin_lock_bh(&txq->lock); in iwl_pcie_txq_check_wrptrs()
332 if (trans_pcie->txq[i].need_update) { in iwl_pcie_txq_check_wrptrs()
333 iwl_pcie_txq_inc_wr_ptr(trans, txq); in iwl_pcie_txq_check_wrptrs()
334 trans_pcie->txq[i].need_update = false; in iwl_pcie_txq_check_wrptrs()
336 spin_unlock_bh(&txq->lock); in iwl_pcie_txq_check_wrptrs()
407 static void iwl_pcie_txq_free_tfd(struct iwl_trans *trans, struct iwl_txq *txq) in iwl_pcie_txq_free_tfd() argument
409 struct iwl_tfd *tfd_tmp = txq->tfds; in iwl_pcie_txq_free_tfd()
414 int rd_ptr = txq->q.read_ptr; in iwl_pcie_txq_free_tfd()
415 int idx = get_cmd_index(&txq->q, rd_ptr); in iwl_pcie_txq_free_tfd()
417 lockdep_assert_held(&txq->lock); in iwl_pcie_txq_free_tfd()
422 iwl_pcie_tfd_unmap(trans, &txq->entries[idx].meta, &tfd_tmp[rd_ptr]); in iwl_pcie_txq_free_tfd()
425 if (txq->entries) { in iwl_pcie_txq_free_tfd()
428 skb = txq->entries[idx].skb; in iwl_pcie_txq_free_tfd()
436 txq->entries[idx].skb = NULL; in iwl_pcie_txq_free_tfd()
441 static int iwl_pcie_txq_build_tfd(struct iwl_trans *trans, struct iwl_txq *txq, in iwl_pcie_txq_build_tfd() argument
448 q = &txq->q; in iwl_pcie_txq_build_tfd()
449 tfd_tmp = txq->tfds; in iwl_pcie_txq_build_tfd()
474 struct iwl_txq *txq, int slots_num, in iwl_pcie_txq_alloc() argument
482 if (WARN_ON(txq->entries || txq->tfds)) in iwl_pcie_txq_alloc()
485 setup_timer(&txq->stuck_timer, iwl_pcie_txq_stuck_timer, in iwl_pcie_txq_alloc()
486 (unsigned long)txq); in iwl_pcie_txq_alloc()
487 txq->trans_pcie = trans_pcie; in iwl_pcie_txq_alloc()
489 txq->q.n_window = slots_num; in iwl_pcie_txq_alloc()
491 txq->entries = kcalloc(slots_num, in iwl_pcie_txq_alloc()
495 if (!txq->entries) in iwl_pcie_txq_alloc()
500 txq->entries[i].cmd = in iwl_pcie_txq_alloc()
503 if (!txq->entries[i].cmd) in iwl_pcie_txq_alloc()
509 txq->tfds = dma_alloc_coherent(trans->dev, tfd_sz, in iwl_pcie_txq_alloc()
510 &txq->q.dma_addr, GFP_KERNEL); in iwl_pcie_txq_alloc()
511 if (!txq->tfds) in iwl_pcie_txq_alloc()
514 BUILD_BUG_ON(IWL_HCMD_SCRATCHBUF_SIZE != sizeof(*txq->scratchbufs)); in iwl_pcie_txq_alloc()
519 scratchbuf_sz = sizeof(*txq->scratchbufs) * slots_num; in iwl_pcie_txq_alloc()
521 txq->scratchbufs = dma_alloc_coherent(trans->dev, scratchbuf_sz, in iwl_pcie_txq_alloc()
522 &txq->scratchbufs_dma, in iwl_pcie_txq_alloc()
524 if (!txq->scratchbufs) in iwl_pcie_txq_alloc()
527 txq->q.id = txq_id; in iwl_pcie_txq_alloc()
531 dma_free_coherent(trans->dev, tfd_sz, txq->tfds, txq->q.dma_addr); in iwl_pcie_txq_alloc()
533 if (txq->entries && txq_id == trans_pcie->cmd_queue) in iwl_pcie_txq_alloc()
535 kfree(txq->entries[i].cmd); in iwl_pcie_txq_alloc()
536 kfree(txq->entries); in iwl_pcie_txq_alloc()
537 txq->entries = NULL; in iwl_pcie_txq_alloc()
543 static int iwl_pcie_txq_init(struct iwl_trans *trans, struct iwl_txq *txq, in iwl_pcie_txq_init() argument
548 txq->need_update = false; in iwl_pcie_txq_init()
555 ret = iwl_queue_init(&txq->q, slots_num, txq_id); in iwl_pcie_txq_init()
559 spin_lock_init(&txq->lock); in iwl_pcie_txq_init()
566 txq->q.dma_addr >> 8); in iwl_pcie_txq_init()
577 struct iwl_txq *txq = &trans_pcie->txq[txq_id]; in iwl_pcie_txq_unmap() local
578 struct iwl_queue *q = &txq->q; in iwl_pcie_txq_unmap()
580 spin_lock_bh(&txq->lock); in iwl_pcie_txq_unmap()
584 iwl_pcie_txq_free_tfd(trans, txq); in iwl_pcie_txq_unmap()
587 txq->active = false; in iwl_pcie_txq_unmap()
588 spin_unlock_bh(&txq->lock); in iwl_pcie_txq_unmap()
591 iwl_wake_queue(trans, txq); in iwl_pcie_txq_unmap()
605 struct iwl_txq *txq = &trans_pcie->txq[txq_id]; in iwl_pcie_txq_free() local
609 if (WARN_ON(!txq)) in iwl_pcie_txq_free()
616 for (i = 0; i < txq->q.n_window; i++) { in iwl_pcie_txq_free()
617 kzfree(txq->entries[i].cmd); in iwl_pcie_txq_free()
618 kzfree(txq->entries[i].free_buf); in iwl_pcie_txq_free()
622 if (txq->tfds) { in iwl_pcie_txq_free()
625 txq->tfds, txq->q.dma_addr); in iwl_pcie_txq_free()
626 txq->q.dma_addr = 0; in iwl_pcie_txq_free()
627 txq->tfds = NULL; in iwl_pcie_txq_free()
630 sizeof(*txq->scratchbufs) * txq->q.n_window, in iwl_pcie_txq_free()
631 txq->scratchbufs, txq->scratchbufs_dma); in iwl_pcie_txq_free()
634 kfree(txq->entries); in iwl_pcie_txq_free()
635 txq->entries = NULL; in iwl_pcie_txq_free()
637 del_timer_sync(&txq->stuck_timer); in iwl_pcie_txq_free()
640 memset(txq, 0, sizeof(*txq)); in iwl_pcie_txq_free()
707 struct iwl_txq *txq = &trans_pcie->txq[txq_id]; in iwl_trans_pcie_tx_reset() local
710 txq->q.dma_addr >> 8); in iwl_trans_pcie_tx_reset()
712 txq->q.read_ptr = 0; in iwl_trans_pcie_tx_reset()
713 txq->q.write_ptr = 0; in iwl_trans_pcie_tx_reset()
782 if (!trans_pcie->txq) in iwl_pcie_tx_stop()
804 if (trans_pcie->txq) { in iwl_pcie_tx_free()
810 kfree(trans_pcie->txq); in iwl_pcie_tx_free()
811 trans_pcie->txq = NULL; in iwl_pcie_tx_free()
833 if (WARN_ON(trans_pcie->txq)) { in iwl_pcie_tx_alloc()
852 trans_pcie->txq = kcalloc(trans->cfg->base_params->num_of_queues, in iwl_pcie_tx_alloc()
854 if (!trans_pcie->txq) { in iwl_pcie_tx_alloc()
865 ret = iwl_pcie_txq_alloc(trans, &trans_pcie->txq[txq_id], in iwl_pcie_tx_alloc()
887 if (!trans_pcie->txq) { in iwl_pcie_tx_init()
910 ret = iwl_pcie_txq_init(trans, &trans_pcie->txq[txq_id], in iwl_pcie_tx_init()
930 static inline void iwl_pcie_txq_progress(struct iwl_txq *txq) in iwl_pcie_txq_progress() argument
932 lockdep_assert_held(&txq->lock); in iwl_pcie_txq_progress()
934 if (!txq->wd_timeout) in iwl_pcie_txq_progress()
941 if (txq->frozen) in iwl_pcie_txq_progress()
948 if (txq->q.read_ptr == txq->q.write_ptr) in iwl_pcie_txq_progress()
949 del_timer(&txq->stuck_timer); in iwl_pcie_txq_progress()
951 mod_timer(&txq->stuck_timer, jiffies + txq->wd_timeout); in iwl_pcie_txq_progress()
959 struct iwl_txq *txq = &trans_pcie->txq[txq_id]; in iwl_trans_pcie_reclaim() local
961 struct iwl_queue *q = &txq->q; in iwl_trans_pcie_reclaim()
968 spin_lock_bh(&txq->lock); in iwl_trans_pcie_reclaim()
970 if (!txq->active) { in iwl_trans_pcie_reclaim()
976 if (txq->q.read_ptr == tfd_num) in iwl_trans_pcie_reclaim()
980 txq_id, txq->q.read_ptr, tfd_num, ssn); in iwl_trans_pcie_reclaim()
1001 if (WARN_ON_ONCE(txq->entries[txq->q.read_ptr].skb == NULL)) in iwl_trans_pcie_reclaim()
1004 __skb_queue_tail(skbs, txq->entries[txq->q.read_ptr].skb); in iwl_trans_pcie_reclaim()
1006 txq->entries[txq->q.read_ptr].skb = NULL; in iwl_trans_pcie_reclaim()
1008 iwl_pcie_txq_inval_byte_cnt_tbl(trans, txq); in iwl_trans_pcie_reclaim()
1010 iwl_pcie_txq_free_tfd(trans, txq); in iwl_trans_pcie_reclaim()
1013 iwl_pcie_txq_progress(txq); in iwl_trans_pcie_reclaim()
1015 if (iwl_queue_space(&txq->q) > txq->q.low_mark) in iwl_trans_pcie_reclaim()
1016 iwl_wake_queue(trans, txq); in iwl_trans_pcie_reclaim()
1024 spin_unlock_bh(&txq->lock); in iwl_trans_pcie_reclaim()
1105 struct iwl_txq *txq = &trans_pcie->txq[txq_id]; in iwl_pcie_cmdq_reclaim() local
1106 struct iwl_queue *q = &txq->q; in iwl_pcie_cmdq_reclaim()
1110 lockdep_assert_held(&txq->lock); in iwl_pcie_cmdq_reclaim()
1136 iwl_pcie_txq_progress(txq); in iwl_pcie_cmdq_reclaim()
1173 struct iwl_txq *txq = &trans_pcie->txq[txq_id]; in iwl_trans_pcie_txq_enable() local
1179 txq->wd_timeout = msecs_to_jiffies(wdg_timeout); in iwl_trans_pcie_txq_enable()
1204 txq->ampdu = true; in iwl_trans_pcie_txq_enable()
1213 ssn = txq->q.read_ptr; in iwl_trans_pcie_txq_enable()
1219 txq->q.read_ptr = (ssn & 0xff); in iwl_trans_pcie_txq_enable()
1220 txq->q.write_ptr = (ssn & 0xff); in iwl_trans_pcie_txq_enable()
1261 txq->active = true; in iwl_trans_pcie_txq_enable()
1272 trans_pcie->txq[txq_id].frozen_expiry_remainder = 0; in iwl_trans_pcie_txq_disable()
1273 trans_pcie->txq[txq_id].frozen = false; in iwl_trans_pcie_txq_disable()
1295 trans_pcie->txq[txq_id].ampdu = false; in iwl_trans_pcie_txq_disable()
1315 struct iwl_txq *txq = &trans_pcie->txq[trans_pcie->cmd_queue]; in iwl_pcie_enqueue_hcmd() local
1316 struct iwl_queue *q = &txq->q; in iwl_pcie_enqueue_hcmd()
1401 spin_lock_bh(&txq->lock); in iwl_pcie_enqueue_hcmd()
1404 spin_unlock_bh(&txq->lock); in iwl_pcie_enqueue_hcmd()
1413 out_cmd = txq->entries[idx].cmd; in iwl_pcie_enqueue_hcmd()
1414 out_meta = &txq->entries[idx].meta; in iwl_pcie_enqueue_hcmd()
1476 memcpy(&txq->scratchbufs[q->write_ptr], &out_cmd->hdr, scratch_size); in iwl_pcie_enqueue_hcmd()
1477 iwl_pcie_txq_build_tfd(trans, txq, in iwl_pcie_enqueue_hcmd()
1478 iwl_pcie_get_scratchbuf_dma(txq, q->write_ptr), in iwl_pcie_enqueue_hcmd()
1489 &txq->tfds[q->write_ptr]); in iwl_pcie_enqueue_hcmd()
1494 iwl_pcie_txq_build_tfd(trans, txq, phys_addr, in iwl_pcie_enqueue_hcmd()
1513 &txq->tfds[q->write_ptr]); in iwl_pcie_enqueue_hcmd()
1518 iwl_pcie_txq_build_tfd(trans, txq, phys_addr, cmdlen[i], false); in iwl_pcie_enqueue_hcmd()
1522 if (WARN_ON_ONCE(txq->entries[idx].free_buf)) in iwl_pcie_enqueue_hcmd()
1523 kzfree(txq->entries[idx].free_buf); in iwl_pcie_enqueue_hcmd()
1524 txq->entries[idx].free_buf = dup_buf; in iwl_pcie_enqueue_hcmd()
1529 if (q->read_ptr == q->write_ptr && txq->wd_timeout) in iwl_pcie_enqueue_hcmd()
1530 mod_timer(&txq->stuck_timer, jiffies + txq->wd_timeout); in iwl_pcie_enqueue_hcmd()
1542 iwl_pcie_txq_inc_wr_ptr(trans, txq); in iwl_pcie_enqueue_hcmd()
1547 spin_unlock_bh(&txq->lock); in iwl_pcie_enqueue_hcmd()
1575 struct iwl_txq *txq = &trans_pcie->txq[trans_pcie->cmd_queue]; in iwl_pcie_hcmd_complete() local
1583 trans_pcie->txq[trans_pcie->cmd_queue].q.read_ptr, in iwl_pcie_hcmd_complete()
1584 trans_pcie->txq[trans_pcie->cmd_queue].q.write_ptr)) { in iwl_pcie_hcmd_complete()
1589 spin_lock_bh(&txq->lock); in iwl_pcie_hcmd_complete()
1591 cmd_index = get_cmd_index(&txq->q, index); in iwl_pcie_hcmd_complete()
1592 cmd = txq->entries[cmd_index].cmd; in iwl_pcie_hcmd_complete()
1593 meta = &txq->entries[cmd_index].meta; in iwl_pcie_hcmd_complete()
1595 iwl_pcie_tfd_unmap(trans, meta, &txq->tfds[index]); in iwl_pcie_hcmd_complete()
1623 spin_unlock_bh(&txq->lock); in iwl_pcie_hcmd_complete()
1682 struct iwl_txq *txq = &trans_pcie->txq[trans_pcie->cmd_queue]; in iwl_pcie_send_hcmd_sync() local
1683 struct iwl_queue *q = &txq->q; in iwl_pcie_send_hcmd_sync()
1735 trans_pcie->txq[trans_pcie->cmd_queue]. in iwl_pcie_send_hcmd_sync()
1770 struct iwl_txq *txq; in iwl_trans_pcie_tx() local
1780 txq = &trans_pcie->txq[txq_id]; in iwl_trans_pcie_tx()
1781 q = &txq->q; in iwl_trans_pcie_tx()
1787 spin_lock(&txq->lock); in iwl_trans_pcie_tx()
1795 WARN_ONCE(txq->ampdu && in iwl_trans_pcie_tx()
1801 txq->entries[q->write_ptr].skb = skb; in iwl_trans_pcie_tx()
1802 txq->entries[q->write_ptr].cmd = dev_cmd; in iwl_trans_pcie_tx()
1808 tb0_phys = iwl_pcie_get_scratchbuf_dma(txq, q->write_ptr); in iwl_trans_pcie_tx()
1816 out_meta = &txq->entries[q->write_ptr].meta; in iwl_trans_pcie_tx()
1833 memcpy(&txq->scratchbufs[q->write_ptr], &dev_cmd->hdr, in iwl_trans_pcie_tx()
1835 iwl_pcie_txq_build_tfd(trans, txq, tb0_phys, in iwl_trans_pcie_tx()
1846 iwl_pcie_txq_build_tfd(trans, txq, tb1_phys, tb1_len, false); in iwl_trans_pcie_tx()
1859 &txq->tfds[q->write_ptr]); in iwl_trans_pcie_tx()
1862 iwl_pcie_txq_build_tfd(trans, txq, tb2_phys, tb2_len, false); in iwl_trans_pcie_tx()
1866 iwl_pcie_txq_update_byte_cnt_tbl(trans, txq, le16_to_cpu(tx_cmd->len)); in iwl_trans_pcie_tx()
1869 &txq->tfds[txq->q.write_ptr], in iwl_trans_pcie_tx()
1880 if (txq->wd_timeout) in iwl_trans_pcie_tx()
1881 mod_timer(&txq->stuck_timer, jiffies + txq->wd_timeout); in iwl_trans_pcie_tx()
1889 iwl_pcie_txq_inc_wr_ptr(trans, txq); in iwl_trans_pcie_tx()
1897 iwl_pcie_txq_inc_wr_ptr(trans, txq); in iwl_trans_pcie_tx()
1899 iwl_stop_queue(trans, txq); in iwl_trans_pcie_tx()
1901 spin_unlock(&txq->lock); in iwl_trans_pcie_tx()
1904 spin_unlock(&txq->lock); in iwl_trans_pcie_tx()