1 /* SPDX-License-Identifier: BSD-3-Clause
3 * Copyright (c) 2016-2018 Solarflare Communications Inc.
6 * This software was jointly developed between OKTET Labs (under contract
7 * for Solarflare) and Solarflare Communications, Inc.
14 #include <rte_ethdev_driver.h>
18 #include "sfc_dp_tx.h"
28 * Software Tx descriptor information associated with hardware Tx
31 struct sfc_efx_tx_sw_desc
{
32 struct rte_mbuf
*mbuf
;
33 uint8_t *tsoh
; /* Buffer to store TSO header */
36 enum sfc_txq_state_bit
{
37 SFC_TXQ_INITIALIZED_BIT
= 0,
38 #define SFC_TXQ_INITIALIZED (1 << SFC_TXQ_INITIALIZED_BIT)
40 #define SFC_TXQ_STARTED (1 << SFC_TXQ_STARTED_BIT)
42 #define SFC_TXQ_FLUSHING (1 << SFC_TXQ_FLUSHING_BIT)
44 #define SFC_TXQ_FLUSHED (1 << SFC_TXQ_FLUSHED_BIT)
45 SFC_TXQ_FLUSH_FAILED_BIT
,
46 #define SFC_TXQ_FLUSH_FAILED (1 << SFC_TXQ_FLUSH_FAILED_BIT)
50 * Transmit queue control information. Not used on datapath.
51 * Allocated on the socket specified on the queue setup.
55 unsigned int hw_index
;
58 struct sfc_dp_txq
*dp
;
60 unsigned int free_thresh
;
64 static inline unsigned int
65 sfc_txq_sw_index_by_hw_index(unsigned int hw_index
)
70 static inline unsigned int
71 sfc_txq_sw_index(const struct sfc_txq
*txq
)
73 return sfc_txq_sw_index_by_hw_index(txq
->hw_index
);
76 struct sfc_txq
*sfc_txq_by_dp_txq(const struct sfc_dp_txq
*dp_txq
);
79 * Transmit queue information used on libefx-based data path.
80 * Allocated on the socket specified on the queue setup.
84 struct sfc_efx_tx_sw_desc
*sw_ring
;
85 unsigned int ptr_mask
;
86 efx_desc_t
*pend_desc
;
90 unsigned int completed
;
91 unsigned int max_fill_level
;
92 unsigned int free_thresh
;
94 uint16_t dma_desc_size_max
;
96 unsigned int hw_index
;
98 #define SFC_EFX_TXQ_FLAG_STARTED 0x1
99 #define SFC_EFX_TXQ_FLAG_RUNNING 0x2
101 /* Datapath transmit queue anchor */
102 struct sfc_dp_txq dp
;
105 static inline struct sfc_efx_txq
*
106 sfc_efx_txq_by_dp_txq(struct sfc_dp_txq
*dp_txq
)
108 return container_of(dp_txq
, struct sfc_efx_txq
, dp
);
111 struct sfc_txq_info
{
112 unsigned int entries
;
114 boolean_t deferred_start
;
115 boolean_t deferred_started
;
118 int sfc_tx_configure(struct sfc_adapter
*sa
);
119 void sfc_tx_close(struct sfc_adapter
*sa
);
121 int sfc_tx_qinit(struct sfc_adapter
*sa
, unsigned int sw_index
,
122 uint16_t nb_tx_desc
, unsigned int socket_id
,
123 const struct rte_eth_txconf
*tx_conf
);
124 void sfc_tx_qfini(struct sfc_adapter
*sa
, unsigned int sw_index
);
126 void sfc_tx_qflush_done(struct sfc_txq
*txq
);
127 int sfc_tx_qstart(struct sfc_adapter
*sa
, unsigned int sw_index
);
128 void sfc_tx_qstop(struct sfc_adapter
*sa
, unsigned int sw_index
);
129 int sfc_tx_start(struct sfc_adapter
*sa
);
130 void sfc_tx_stop(struct sfc_adapter
*sa
);
132 uint64_t sfc_tx_get_dev_offload_caps(struct sfc_adapter
*sa
);
133 uint64_t sfc_tx_get_queue_offload_caps(struct sfc_adapter
*sa
);
135 /* From 'sfc_tso.c' */
136 int sfc_efx_tso_alloc_tsoh_objs(struct sfc_efx_tx_sw_desc
*sw_ring
,
137 unsigned int txq_entries
,
138 unsigned int socket_id
);
139 void sfc_efx_tso_free_tsoh_objs(struct sfc_efx_tx_sw_desc
*sw_ring
,
140 unsigned int txq_entries
);
141 int sfc_efx_tso_do(struct sfc_efx_txq
*txq
, unsigned int idx
,
142 struct rte_mbuf
**in_seg
, size_t *in_off
, efx_desc_t
**pend
,
143 unsigned int *pkt_descs
, size_t *pkt_len
);
148 #endif /* _SFC_TX_H */