Lines Matching refs:txq
130 #define MVNETA_CPU_TXQ_ACCESS(txq) BIT(txq + 8) argument
335 #define IS_TSO_HEADER(txq, addr) \ argument
336 ((addr >= txq->tso_hdrs_phys) && \
337 (addr < txq->tso_hdrs_phys + txq->size * TSO_HEADER_SIZE))
734 static void mvneta_txq_inc_get(struct mvneta_tx_queue *txq) in mvneta_txq_inc_get() argument
736 txq->txq_get_index++; in mvneta_txq_inc_get()
737 if (txq->txq_get_index == txq->size) in mvneta_txq_inc_get()
738 txq->txq_get_index = 0; in mvneta_txq_inc_get()
742 static void mvneta_txq_inc_put(struct mvneta_tx_queue *txq) in mvneta_txq_inc_put() argument
744 txq->txq_put_index++; in mvneta_txq_inc_put()
745 if (txq->txq_put_index == txq->size) in mvneta_txq_inc_put()
746 txq->txq_put_index = 0; in mvneta_txq_inc_put()
924 struct mvneta_tx_queue *txq, in mvneta_txq_pend_desc_add() argument
929 pend_desc += txq->pending; in mvneta_txq_pend_desc_add()
934 mvreg_write(pp, MVNETA_TXQ_UPDATE_REG(txq->id), val); in mvneta_txq_pend_desc_add()
937 txq->pending = 0; in mvneta_txq_pend_desc_add()
942 mvneta_txq_next_desc_get(struct mvneta_tx_queue *txq) in mvneta_txq_next_desc_get() argument
944 int tx_desc = txq->next_desc_to_proc; in mvneta_txq_next_desc_get()
946 txq->next_desc_to_proc = MVNETA_QUEUE_NEXT_DESC(txq, tx_desc); in mvneta_txq_next_desc_get()
947 return txq->descs + tx_desc; in mvneta_txq_next_desc_get()
953 static void mvneta_txq_desc_put(struct mvneta_tx_queue *txq) in mvneta_txq_desc_put() argument
955 if (txq->next_desc_to_proc == 0) in mvneta_txq_desc_put()
956 txq->next_desc_to_proc = txq->last_desc - 1; in mvneta_txq_desc_put()
958 txq->next_desc_to_proc--; in mvneta_txq_desc_put()
1220 struct mvneta_tx_queue *txq = &pp->txqs[queue]; in mvneta_port_up() local
1221 if (txq->descs) in mvneta_port_up()
1458 int rxq, txq; in mvneta_defaults_set() local
1464 for (txq = 0; txq < txq_number; txq++) in mvneta_defaults_set()
1465 if ((txq % max_cpu) == cpu) in mvneta_defaults_set()
1466 txq_map |= MVNETA_CPU_TXQ_ACCESS(txq); in mvneta_defaults_set()
1669 struct mvneta_tx_queue *txq, u32 value) in mvneta_tx_done_pkts_coal_set() argument
1673 val = mvreg_read(pp, MVNETA_TXQ_SIZE_REG(txq->id)); in mvneta_tx_done_pkts_coal_set()
1678 mvreg_write(pp, MVNETA_TXQ_SIZE_REG(txq->id), val); in mvneta_tx_done_pkts_coal_set()
1695 struct mvneta_tx_queue *txq, in mvneta_txq_sent_desc_dec() argument
1703 mvreg_write(pp, MVNETA_TXQ_UPDATE_REG(txq->id), val); in mvneta_txq_sent_desc_dec()
1708 mvreg_write(pp, MVNETA_TXQ_UPDATE_REG(txq->id), val); in mvneta_txq_sent_desc_dec()
1713 struct mvneta_tx_queue *txq) in mvneta_txq_sent_desc_num_get() argument
1718 val = mvreg_read(pp, MVNETA_TXQ_STATUS_REG(txq->id)); in mvneta_txq_sent_desc_num_get()
1729 struct mvneta_tx_queue *txq) in mvneta_txq_sent_desc_proc() argument
1734 sent_desc = mvneta_txq_sent_desc_num_get(pp, txq); in mvneta_txq_sent_desc_proc()
1738 mvneta_txq_sent_desc_dec(pp, txq, sent_desc); in mvneta_txq_sent_desc_proc()
1833 struct mvneta_tx_queue *txq, int num, in mvneta_txq_bufs_free() argument
1840 struct mvneta_tx_buf *buf = &txq->buf[txq->txq_get_index]; in mvneta_txq_bufs_free()
1841 struct mvneta_tx_desc *tx_desc = txq->descs + in mvneta_txq_bufs_free()
1842 txq->txq_get_index; in mvneta_txq_bufs_free()
1844 mvneta_txq_inc_get(txq); in mvneta_txq_bufs_free()
1846 if (!IS_TSO_HEADER(txq, tx_desc->buf_phys_addr) && in mvneta_txq_bufs_free()
1869 struct mvneta_tx_queue *txq) in mvneta_txq_done() argument
1871 struct netdev_queue *nq = netdev_get_tx_queue(pp->dev, txq->id); in mvneta_txq_done()
1874 tx_done = mvneta_txq_sent_desc_proc(pp, txq); in mvneta_txq_done()
1878 mvneta_txq_bufs_free(pp, txq, tx_done, nq, true); in mvneta_txq_done()
1880 txq->count -= tx_done; in mvneta_txq_done()
1883 if (txq->count <= txq->tx_wake_threshold) in mvneta_txq_done()
2041 mvneta_xdp_submit_frame(struct mvneta_port *pp, struct mvneta_tx_queue *txq, in mvneta_xdp_submit_frame() argument
2048 if (txq->count >= txq->tx_stop_threshold) in mvneta_xdp_submit_frame()
2051 tx_desc = mvneta_txq_next_desc_get(txq); in mvneta_xdp_submit_frame()
2053 buf = &txq->buf[txq->txq_put_index]; in mvneta_xdp_submit_frame()
2059 mvneta_txq_desc_put(txq); in mvneta_xdp_submit_frame()
2078 mvneta_txq_inc_put(txq); in mvneta_xdp_submit_frame()
2079 txq->pending++; in mvneta_xdp_submit_frame()
2080 txq->count++; in mvneta_xdp_submit_frame()
2089 struct mvneta_tx_queue *txq; in mvneta_xdp_xmit_back() local
2100 txq = &pp->txqs[cpu % txq_number]; in mvneta_xdp_xmit_back()
2101 nq = netdev_get_tx_queue(pp->dev, txq->id); in mvneta_xdp_xmit_back()
2104 ret = mvneta_xdp_submit_frame(pp, txq, xdpf, false); in mvneta_xdp_xmit_back()
2112 mvneta_txq_pend_desc_add(pp, txq, 0); in mvneta_xdp_xmit_back()
2131 struct mvneta_tx_queue *txq; in mvneta_xdp_xmit() local
2141 txq = &pp->txqs[cpu % txq_number]; in mvneta_xdp_xmit()
2142 nq = netdev_get_tx_queue(pp->dev, txq->id); in mvneta_xdp_xmit()
2146 ret = mvneta_xdp_submit_frame(pp, txq, frames[i], true); in mvneta_xdp_xmit()
2156 mvneta_txq_pend_desc_add(pp, txq, 0); in mvneta_xdp_xmit()
2586 struct mvneta_port *pp, struct mvneta_tx_queue *txq) in mvneta_tso_put_hdr() argument
2589 struct mvneta_tx_buf *buf = &txq->buf[txq->txq_put_index]; in mvneta_tso_put_hdr()
2592 tx_desc = mvneta_txq_next_desc_get(txq); in mvneta_tso_put_hdr()
2596 tx_desc->buf_phys_addr = txq->tso_hdrs_phys + in mvneta_tso_put_hdr()
2597 txq->txq_put_index * TSO_HEADER_SIZE; in mvneta_tso_put_hdr()
2601 mvneta_txq_inc_put(txq); in mvneta_tso_put_hdr()
2605 mvneta_tso_put_data(struct net_device *dev, struct mvneta_tx_queue *txq, in mvneta_tso_put_data() argument
2609 struct mvneta_tx_buf *buf = &txq->buf[txq->txq_put_index]; in mvneta_tso_put_data()
2612 tx_desc = mvneta_txq_next_desc_get(txq); in mvneta_tso_put_data()
2618 mvneta_txq_desc_put(txq); in mvneta_tso_put_data()
2634 mvneta_txq_inc_put(txq); in mvneta_tso_put_data()
2639 struct mvneta_tx_queue *txq) in mvneta_tx_tso() argument
2648 if ((txq->count + tso_count_descs(skb)) >= txq->size) in mvneta_tx_tso()
2668 hdr = txq->tso_hdrs + txq->txq_put_index * TSO_HEADER_SIZE; in mvneta_tx_tso()
2671 mvneta_tso_put_hdr(skb, pp, txq); in mvneta_tx_tso()
2679 if (mvneta_tso_put_data(dev, txq, skb, in mvneta_tx_tso()
2697 struct mvneta_tx_desc *tx_desc = txq->descs + i; in mvneta_tx_tso()
2698 if (!IS_TSO_HEADER(txq, tx_desc->buf_phys_addr)) in mvneta_tx_tso()
2703 mvneta_txq_desc_put(txq); in mvneta_tx_tso()
2710 struct mvneta_tx_queue *txq) in mvneta_tx_frag_process() argument
2716 struct mvneta_tx_buf *buf = &txq->buf[txq->txq_put_index]; in mvneta_tx_frag_process()
2720 tx_desc = mvneta_txq_next_desc_get(txq); in mvneta_tx_frag_process()
2729 mvneta_txq_desc_put(txq); in mvneta_tx_frag_process()
2743 mvneta_txq_inc_put(txq); in mvneta_tx_frag_process()
2753 tx_desc = txq->descs + i; in mvneta_tx_frag_process()
2758 mvneta_txq_desc_put(txq); in mvneta_tx_frag_process()
2769 struct mvneta_tx_queue *txq = &pp->txqs[txq_id]; in mvneta_tx() local
2770 struct mvneta_tx_buf *buf = &txq->buf[txq->txq_put_index]; in mvneta_tx()
2780 frags = mvneta_tx_tso(skb, dev, txq); in mvneta_tx()
2787 tx_desc = mvneta_txq_next_desc_get(txq); in mvneta_tx()
2798 mvneta_txq_desc_put(txq); in mvneta_tx()
2809 mvneta_txq_inc_put(txq); in mvneta_tx()
2814 mvneta_txq_inc_put(txq); in mvneta_tx()
2817 if (mvneta_tx_frag_process(pp, skb, txq)) { in mvneta_tx()
2822 mvneta_txq_desc_put(txq); in mvneta_tx()
2835 txq->count += frags; in mvneta_tx()
2836 if (txq->count >= txq->tx_stop_threshold) in mvneta_tx()
2840 txq->pending + frags > MVNETA_TXQ_DEC_SENT_MASK) in mvneta_tx()
2841 mvneta_txq_pend_desc_add(pp, txq, frags); in mvneta_tx()
2843 txq->pending += frags; in mvneta_tx()
2860 struct mvneta_tx_queue *txq) in mvneta_txq_done_force() argument
2863 struct netdev_queue *nq = netdev_get_tx_queue(pp->dev, txq->id); in mvneta_txq_done_force()
2864 int tx_done = txq->count; in mvneta_txq_done_force()
2866 mvneta_txq_bufs_free(pp, txq, tx_done, nq, false); in mvneta_txq_done_force()
2869 txq->count = 0; in mvneta_txq_done_force()
2870 txq->txq_put_index = 0; in mvneta_txq_done_force()
2871 txq->txq_get_index = 0; in mvneta_txq_done_force()
2879 struct mvneta_tx_queue *txq; in mvneta_tx_done_gbe() local
2884 txq = mvneta_tx_done_policy(pp, cause_tx_done); in mvneta_tx_done_gbe()
2886 nq = netdev_get_tx_queue(pp->dev, txq->id); in mvneta_tx_done_gbe()
2889 if (txq->count) in mvneta_tx_done_gbe()
2890 mvneta_txq_done(pp, txq); in mvneta_tx_done_gbe()
2893 cause_tx_done &= ~((1 << txq->id)); in mvneta_tx_done_gbe()
3378 struct mvneta_tx_queue *txq) in mvneta_txq_sw_init() argument
3382 txq->size = pp->tx_ring_size; in mvneta_txq_sw_init()
3388 txq->tx_stop_threshold = txq->size - MVNETA_MAX_SKB_DESCS; in mvneta_txq_sw_init()
3389 txq->tx_wake_threshold = txq->tx_stop_threshold / 2; in mvneta_txq_sw_init()
3392 txq->descs = dma_alloc_coherent(pp->dev->dev.parent, in mvneta_txq_sw_init()
3393 txq->size * MVNETA_DESC_ALIGNED_SIZE, in mvneta_txq_sw_init()
3394 &txq->descs_phys, GFP_KERNEL); in mvneta_txq_sw_init()
3395 if (!txq->descs) in mvneta_txq_sw_init()
3398 txq->last_desc = txq->size - 1; in mvneta_txq_sw_init()
3400 txq->buf = kmalloc_array(txq->size, sizeof(*txq->buf), GFP_KERNEL); in mvneta_txq_sw_init()
3401 if (!txq->buf) in mvneta_txq_sw_init()
3405 txq->tso_hdrs = dma_alloc_coherent(pp->dev->dev.parent, in mvneta_txq_sw_init()
3406 txq->size * TSO_HEADER_SIZE, in mvneta_txq_sw_init()
3407 &txq->tso_hdrs_phys, GFP_KERNEL); in mvneta_txq_sw_init()
3408 if (!txq->tso_hdrs) in mvneta_txq_sw_init()
3415 cpu = txq->id % num_present_cpus(); in mvneta_txq_sw_init()
3418 cpumask_set_cpu(cpu, &txq->affinity_mask); in mvneta_txq_sw_init()
3419 netif_set_xps_queue(pp->dev, &txq->affinity_mask, txq->id); in mvneta_txq_sw_init()
3425 struct mvneta_tx_queue *txq) in mvneta_txq_hw_init() argument
3428 mvreg_write(pp, MVETH_TXQ_TOKEN_CFG_REG(txq->id), 0x03ffffff); in mvneta_txq_hw_init()
3429 mvreg_write(pp, MVETH_TXQ_TOKEN_COUNT_REG(txq->id), 0x3fffffff); in mvneta_txq_hw_init()
3432 mvreg_write(pp, MVNETA_TXQ_BASE_ADDR_REG(txq->id), txq->descs_phys); in mvneta_txq_hw_init()
3433 mvreg_write(pp, MVNETA_TXQ_SIZE_REG(txq->id), txq->size); in mvneta_txq_hw_init()
3435 mvneta_tx_done_pkts_coal_set(pp, txq, txq->done_pkts_coal); in mvneta_txq_hw_init()
3440 struct mvneta_tx_queue *txq) in mvneta_txq_init() argument
3444 ret = mvneta_txq_sw_init(pp, txq); in mvneta_txq_init()
3448 mvneta_txq_hw_init(pp, txq); in mvneta_txq_init()
3455 struct mvneta_tx_queue *txq) in mvneta_txq_sw_deinit() argument
3457 struct netdev_queue *nq = netdev_get_tx_queue(pp->dev, txq->id); in mvneta_txq_sw_deinit()
3459 kfree(txq->buf); in mvneta_txq_sw_deinit()
3461 if (txq->tso_hdrs) in mvneta_txq_sw_deinit()
3463 txq->size * TSO_HEADER_SIZE, in mvneta_txq_sw_deinit()
3464 txq->tso_hdrs, txq->tso_hdrs_phys); in mvneta_txq_sw_deinit()
3465 if (txq->descs) in mvneta_txq_sw_deinit()
3467 txq->size * MVNETA_DESC_ALIGNED_SIZE, in mvneta_txq_sw_deinit()
3468 txq->descs, txq->descs_phys); in mvneta_txq_sw_deinit()
3472 txq->descs = NULL; in mvneta_txq_sw_deinit()
3473 txq->last_desc = 0; in mvneta_txq_sw_deinit()
3474 txq->next_desc_to_proc = 0; in mvneta_txq_sw_deinit()
3475 txq->descs_phys = 0; in mvneta_txq_sw_deinit()
3479 struct mvneta_tx_queue *txq) in mvneta_txq_hw_deinit() argument
3482 mvreg_write(pp, MVETH_TXQ_TOKEN_CFG_REG(txq->id), 0); in mvneta_txq_hw_deinit()
3483 mvreg_write(pp, MVETH_TXQ_TOKEN_COUNT_REG(txq->id), 0); in mvneta_txq_hw_deinit()
3486 mvreg_write(pp, MVNETA_TXQ_BASE_ADDR_REG(txq->id), 0); in mvneta_txq_hw_deinit()
3487 mvreg_write(pp, MVNETA_TXQ_SIZE_REG(txq->id), 0); in mvneta_txq_hw_deinit()
3491 struct mvneta_tx_queue *txq) in mvneta_txq_deinit() argument
3493 mvneta_txq_sw_deinit(pp, txq); in mvneta_txq_deinit()
3494 mvneta_txq_hw_deinit(pp, txq); in mvneta_txq_deinit()
4498 struct mvneta_tx_queue *txq = &pp->txqs[queue]; in mvneta_ethtool_set_coalesce() local
4499 txq->done_pkts_coal = c->tx_max_coalesced_frames; in mvneta_ethtool_set_coalesce()
4500 mvneta_tx_done_pkts_coal_set(pp, txq, txq->done_pkts_coal); in mvneta_ethtool_set_coalesce()
4964 struct mvneta_tx_queue *txq = &pp->txqs[queue]; in mvneta_init() local
4965 txq->id = queue; in mvneta_init()
4966 txq->size = pp->tx_ring_size; in mvneta_init()
4967 txq->done_pkts_coal = MVNETA_TXDONE_COAL_PKTS; in mvneta_init()
5363 struct mvneta_tx_queue *txq = &pp->txqs[queue]; in mvneta_suspend() local
5365 mvneta_txq_hw_deinit(pp, txq); in mvneta_suspend()
5416 struct mvneta_tx_queue *txq = &pp->txqs[queue]; in mvneta_resume() local
5418 txq->next_desc_to_proc = 0; in mvneta_resume()
5419 mvneta_txq_hw_init(pp, txq); in mvneta_resume()