1d30ea906Sjfb8856606 /* SPDX-License-Identifier: BSD-3-Clause
2d30ea906Sjfb8856606 * Copyright(c) 2017 Intel Corporation
3d30ea906Sjfb8856606 */
4d30ea906Sjfb8856606
5d30ea906Sjfb8856606 #ifndef _RTE_ETHDEV_DRIVER_H_
6d30ea906Sjfb8856606 #define _RTE_ETHDEV_DRIVER_H_
7d30ea906Sjfb8856606
8d30ea906Sjfb8856606 /**
9d30ea906Sjfb8856606 * @file
10d30ea906Sjfb8856606 *
11d30ea906Sjfb8856606 * RTE Ethernet Device PMD API
12d30ea906Sjfb8856606 *
13d30ea906Sjfb8856606 * These APIs for the use from Ethernet drivers, user applications shouldn't
14d30ea906Sjfb8856606 * use them.
15d30ea906Sjfb8856606 *
16d30ea906Sjfb8856606 */
17d30ea906Sjfb8856606
18d30ea906Sjfb8856606 #include <rte_ethdev.h>
19d30ea906Sjfb8856606
20d30ea906Sjfb8856606 #ifdef __cplusplus
21d30ea906Sjfb8856606 extern "C" {
22d30ea906Sjfb8856606 #endif
23d30ea906Sjfb8856606
24*2d9fd380Sjfb8856606 /**< @internal Declaration of the hairpin peer queue information structure. */
25*2d9fd380Sjfb8856606 struct rte_hairpin_peer_info;
26*2d9fd380Sjfb8856606
27*2d9fd380Sjfb8856606 /*
28*2d9fd380Sjfb8856606 * Definitions of all functions exported by an Ethernet driver through the
29*2d9fd380Sjfb8856606 * generic structure of type *eth_dev_ops* supplied in the *rte_eth_dev*
30*2d9fd380Sjfb8856606 * structure associated with an Ethernet device.
31*2d9fd380Sjfb8856606 */
32*2d9fd380Sjfb8856606
33*2d9fd380Sjfb8856606 typedef int (*eth_dev_configure_t)(struct rte_eth_dev *dev);
34*2d9fd380Sjfb8856606 /**< @internal Ethernet device configuration. */
35*2d9fd380Sjfb8856606
36*2d9fd380Sjfb8856606 typedef int (*eth_dev_start_t)(struct rte_eth_dev *dev);
37*2d9fd380Sjfb8856606 /**< @internal Function used to start a configured Ethernet device. */
38*2d9fd380Sjfb8856606
39*2d9fd380Sjfb8856606 typedef int (*eth_dev_stop_t)(struct rte_eth_dev *dev);
40*2d9fd380Sjfb8856606 /**< @internal Function used to stop a configured Ethernet device. */
41*2d9fd380Sjfb8856606
42*2d9fd380Sjfb8856606 typedef int (*eth_dev_set_link_up_t)(struct rte_eth_dev *dev);
43*2d9fd380Sjfb8856606 /**< @internal Function used to link up a configured Ethernet device. */
44*2d9fd380Sjfb8856606
45*2d9fd380Sjfb8856606 typedef int (*eth_dev_set_link_down_t)(struct rte_eth_dev *dev);
46*2d9fd380Sjfb8856606 /**< @internal Function used to link down a configured Ethernet device. */
47*2d9fd380Sjfb8856606
48*2d9fd380Sjfb8856606 typedef int (*eth_dev_close_t)(struct rte_eth_dev *dev);
49*2d9fd380Sjfb8856606 /**< @internal Function used to close a configured Ethernet device. */
50*2d9fd380Sjfb8856606
51*2d9fd380Sjfb8856606 typedef int (*eth_dev_reset_t)(struct rte_eth_dev *dev);
52*2d9fd380Sjfb8856606 /** <@internal Function used to reset a configured Ethernet device. */
53*2d9fd380Sjfb8856606
54*2d9fd380Sjfb8856606 typedef int (*eth_is_removed_t)(struct rte_eth_dev *dev);
55*2d9fd380Sjfb8856606 /**< @internal Function used to detect an Ethernet device removal. */
56*2d9fd380Sjfb8856606
57*2d9fd380Sjfb8856606 /**
58*2d9fd380Sjfb8856606 * @internal
59*2d9fd380Sjfb8856606 * Function used to enable the Rx promiscuous mode of an Ethernet device.
60*2d9fd380Sjfb8856606 *
61*2d9fd380Sjfb8856606 * @param dev
62*2d9fd380Sjfb8856606 * ethdev handle of port.
63*2d9fd380Sjfb8856606 *
64*2d9fd380Sjfb8856606 * @return
65*2d9fd380Sjfb8856606 * Negative errno value on error, 0 on success.
66*2d9fd380Sjfb8856606 *
67*2d9fd380Sjfb8856606 * @retval 0
68*2d9fd380Sjfb8856606 * Success, promiscuous mode is enabled.
69*2d9fd380Sjfb8856606 * @retval -ENOTSUP
70*2d9fd380Sjfb8856606 * Promiscuous mode is not supported.
71*2d9fd380Sjfb8856606 * @retval -ENODEV
72*2d9fd380Sjfb8856606 * Device is gone.
73*2d9fd380Sjfb8856606 * @retval -E_RTE_SECONDARY
74*2d9fd380Sjfb8856606 * Function was called from a secondary process instance and not supported.
75*2d9fd380Sjfb8856606 * @retval -ETIMEDOUT
76*2d9fd380Sjfb8856606 * Attempt to enable promiscuos mode failed because of timeout.
77*2d9fd380Sjfb8856606 * @retval -EAGAIN
78*2d9fd380Sjfb8856606 * Failed to enable promiscuous mode.
79*2d9fd380Sjfb8856606 */
80*2d9fd380Sjfb8856606 typedef int (*eth_promiscuous_enable_t)(struct rte_eth_dev *dev);
81*2d9fd380Sjfb8856606
82*2d9fd380Sjfb8856606 /**
83*2d9fd380Sjfb8856606 * @internal
84*2d9fd380Sjfb8856606 * Function used to disable the Rx promiscuous mode of an Ethernet device.
85*2d9fd380Sjfb8856606 *
86*2d9fd380Sjfb8856606 * @param dev
87*2d9fd380Sjfb8856606 * ethdev handle of port.
88*2d9fd380Sjfb8856606 *
89*2d9fd380Sjfb8856606 * @return
90*2d9fd380Sjfb8856606 * Negative errno value on error, 0 on success.
91*2d9fd380Sjfb8856606 *
92*2d9fd380Sjfb8856606 * @retval 0
93*2d9fd380Sjfb8856606 * Success, promiscuous mode is disabled.
94*2d9fd380Sjfb8856606 * @retval -ENOTSUP
95*2d9fd380Sjfb8856606 * Promiscuous mode disabling is not supported.
96*2d9fd380Sjfb8856606 * @retval -ENODEV
97*2d9fd380Sjfb8856606 * Device is gone.
98*2d9fd380Sjfb8856606 * @retval -E_RTE_SECONDARY
99*2d9fd380Sjfb8856606 * Function was called from a secondary process instance and not supported.
100*2d9fd380Sjfb8856606 * @retval -ETIMEDOUT
101*2d9fd380Sjfb8856606 * Attempt to disable promiscuos mode failed because of timeout.
102*2d9fd380Sjfb8856606 * @retval -EAGAIN
103*2d9fd380Sjfb8856606 * Failed to disable promiscuous mode.
104*2d9fd380Sjfb8856606 */
105*2d9fd380Sjfb8856606 typedef int (*eth_promiscuous_disable_t)(struct rte_eth_dev *dev);
106*2d9fd380Sjfb8856606
107*2d9fd380Sjfb8856606 /**
108*2d9fd380Sjfb8856606 * @internal
109*2d9fd380Sjfb8856606 * Enable the receipt of all multicast packets by an Ethernet device.
110*2d9fd380Sjfb8856606 *
111*2d9fd380Sjfb8856606 * @param dev
112*2d9fd380Sjfb8856606 * ethdev handle of port.
113*2d9fd380Sjfb8856606 *
114*2d9fd380Sjfb8856606 * @return
115*2d9fd380Sjfb8856606 * Negative errno value on error, 0 on success.
116*2d9fd380Sjfb8856606 *
117*2d9fd380Sjfb8856606 * @retval 0
118*2d9fd380Sjfb8856606 * Success, all-multicast mode is enabled.
119*2d9fd380Sjfb8856606 * @retval -ENOTSUP
120*2d9fd380Sjfb8856606 * All-multicast mode is not supported.
121*2d9fd380Sjfb8856606 * @retval -ENODEV
122*2d9fd380Sjfb8856606 * Device is gone.
123*2d9fd380Sjfb8856606 * @retval -E_RTE_SECONDARY
124*2d9fd380Sjfb8856606 * Function was called from a secondary process instance and not supported.
125*2d9fd380Sjfb8856606 * @retval -ETIMEDOUT
126*2d9fd380Sjfb8856606 * Attempt to enable all-multicast mode failed because of timeout.
127*2d9fd380Sjfb8856606 * @retval -EAGAIN
128*2d9fd380Sjfb8856606 * Failed to enable all-multicast mode.
129*2d9fd380Sjfb8856606 */
130*2d9fd380Sjfb8856606 typedef int (*eth_allmulticast_enable_t)(struct rte_eth_dev *dev);
131*2d9fd380Sjfb8856606
132*2d9fd380Sjfb8856606 /**
133*2d9fd380Sjfb8856606 * @internal
134*2d9fd380Sjfb8856606 * Disable the receipt of all multicast packets by an Ethernet device.
135*2d9fd380Sjfb8856606 *
136*2d9fd380Sjfb8856606 * @param dev
137*2d9fd380Sjfb8856606 * ethdev handle of port.
138*2d9fd380Sjfb8856606 *
139*2d9fd380Sjfb8856606 * @return
140*2d9fd380Sjfb8856606 * Negative errno value on error, 0 on success.
141*2d9fd380Sjfb8856606 *
142*2d9fd380Sjfb8856606 * @retval 0
143*2d9fd380Sjfb8856606 * Success, all-multicast mode is disabled.
144*2d9fd380Sjfb8856606 * @retval -ENOTSUP
145*2d9fd380Sjfb8856606 * All-multicast mode disabling is not supported.
146*2d9fd380Sjfb8856606 * @retval -ENODEV
147*2d9fd380Sjfb8856606 * Device is gone.
148*2d9fd380Sjfb8856606 * @retval -E_RTE_SECONDARY
149*2d9fd380Sjfb8856606 * Function was called from a secondary process instance and not supported.
150*2d9fd380Sjfb8856606 * @retval -ETIMEDOUT
151*2d9fd380Sjfb8856606 * Attempt to disable all-multicast mode failed because of timeout.
152*2d9fd380Sjfb8856606 * @retval -EAGAIN
153*2d9fd380Sjfb8856606 * Failed to disable all-multicast mode.
154*2d9fd380Sjfb8856606 */
155*2d9fd380Sjfb8856606 typedef int (*eth_allmulticast_disable_t)(struct rte_eth_dev *dev);
156*2d9fd380Sjfb8856606
157*2d9fd380Sjfb8856606 typedef int (*eth_link_update_t)(struct rte_eth_dev *dev,
158*2d9fd380Sjfb8856606 int wait_to_complete);
159*2d9fd380Sjfb8856606 /**< @internal Get link speed, duplex mode and state (up/down) of an Ethernet device. */
160*2d9fd380Sjfb8856606
161*2d9fd380Sjfb8856606 typedef int (*eth_stats_get_t)(struct rte_eth_dev *dev,
162*2d9fd380Sjfb8856606 struct rte_eth_stats *igb_stats);
163*2d9fd380Sjfb8856606 /**< @internal Get global I/O statistics of an Ethernet device. */
164*2d9fd380Sjfb8856606
165*2d9fd380Sjfb8856606 /**
166*2d9fd380Sjfb8856606 * @internal
167*2d9fd380Sjfb8856606 * Reset global I/O statistics of an Ethernet device to 0.
168*2d9fd380Sjfb8856606 *
169*2d9fd380Sjfb8856606 * @param dev
170*2d9fd380Sjfb8856606 * ethdev handle of port.
171*2d9fd380Sjfb8856606 *
172*2d9fd380Sjfb8856606 * @return
173*2d9fd380Sjfb8856606 * Negative errno value on error, 0 on success.
174*2d9fd380Sjfb8856606 *
175*2d9fd380Sjfb8856606 * @retval 0
176*2d9fd380Sjfb8856606 * Success, statistics has been reset.
177*2d9fd380Sjfb8856606 * @retval -ENOTSUP
178*2d9fd380Sjfb8856606 * Resetting statistics is not supported.
179*2d9fd380Sjfb8856606 * @retval -EINVAL
180*2d9fd380Sjfb8856606 * Resetting statistics is not valid.
181*2d9fd380Sjfb8856606 * @retval -ENOMEM
182*2d9fd380Sjfb8856606 * Not enough memory to get the stats.
183*2d9fd380Sjfb8856606 */
184*2d9fd380Sjfb8856606 typedef int (*eth_stats_reset_t)(struct rte_eth_dev *dev);
185*2d9fd380Sjfb8856606
186*2d9fd380Sjfb8856606 typedef int (*eth_xstats_get_t)(struct rte_eth_dev *dev,
187*2d9fd380Sjfb8856606 struct rte_eth_xstat *stats, unsigned int n);
188*2d9fd380Sjfb8856606 /**< @internal Get extended stats of an Ethernet device. */
189*2d9fd380Sjfb8856606
190*2d9fd380Sjfb8856606 typedef int (*eth_xstats_get_by_id_t)(struct rte_eth_dev *dev,
191*2d9fd380Sjfb8856606 const uint64_t *ids,
192*2d9fd380Sjfb8856606 uint64_t *values,
193*2d9fd380Sjfb8856606 unsigned int n);
194*2d9fd380Sjfb8856606 /**< @internal Get extended stats of an Ethernet device. */
195*2d9fd380Sjfb8856606
196*2d9fd380Sjfb8856606 /**
197*2d9fd380Sjfb8856606 * @internal
198*2d9fd380Sjfb8856606 * Reset extended stats of an Ethernet device.
199*2d9fd380Sjfb8856606 *
200*2d9fd380Sjfb8856606 * @param dev
201*2d9fd380Sjfb8856606 * ethdev handle of port.
202*2d9fd380Sjfb8856606 *
203*2d9fd380Sjfb8856606 * @return
204*2d9fd380Sjfb8856606 * Negative errno value on error, 0 on success.
205*2d9fd380Sjfb8856606 *
206*2d9fd380Sjfb8856606 * @retval 0
207*2d9fd380Sjfb8856606 * Success, statistics has been reset.
208*2d9fd380Sjfb8856606 * @retval -ENOTSUP
209*2d9fd380Sjfb8856606 * Resetting statistics is not supported.
210*2d9fd380Sjfb8856606 * @retval -EINVAL
211*2d9fd380Sjfb8856606 * Resetting statistics is not valid.
212*2d9fd380Sjfb8856606 * @retval -ENOMEM
213*2d9fd380Sjfb8856606 * Not enough memory to get the stats.
214*2d9fd380Sjfb8856606 */
215*2d9fd380Sjfb8856606 typedef int (*eth_xstats_reset_t)(struct rte_eth_dev *dev);
216*2d9fd380Sjfb8856606
217*2d9fd380Sjfb8856606 typedef int (*eth_xstats_get_names_t)(struct rte_eth_dev *dev,
218*2d9fd380Sjfb8856606 struct rte_eth_xstat_name *xstats_names, unsigned int size);
219*2d9fd380Sjfb8856606 /**< @internal Get names of extended stats of an Ethernet device. */
220*2d9fd380Sjfb8856606
221*2d9fd380Sjfb8856606 typedef int (*eth_xstats_get_names_by_id_t)(struct rte_eth_dev *dev,
222*2d9fd380Sjfb8856606 struct rte_eth_xstat_name *xstats_names, const uint64_t *ids,
223*2d9fd380Sjfb8856606 unsigned int size);
224*2d9fd380Sjfb8856606 /**< @internal Get names of extended stats of an Ethernet device. */
225*2d9fd380Sjfb8856606
226*2d9fd380Sjfb8856606 typedef int (*eth_queue_stats_mapping_set_t)(struct rte_eth_dev *dev,
227*2d9fd380Sjfb8856606 uint16_t queue_id,
228*2d9fd380Sjfb8856606 uint8_t stat_idx,
229*2d9fd380Sjfb8856606 uint8_t is_rx);
230*2d9fd380Sjfb8856606 /**< @internal Set a queue statistics mapping for a tx/rx queue of an Ethernet device. */
231*2d9fd380Sjfb8856606
232*2d9fd380Sjfb8856606 typedef int (*eth_dev_infos_get_t)(struct rte_eth_dev *dev,
233*2d9fd380Sjfb8856606 struct rte_eth_dev_info *dev_info);
234*2d9fd380Sjfb8856606 /**< @internal Get specific information of an Ethernet device. */
235*2d9fd380Sjfb8856606
236*2d9fd380Sjfb8856606 typedef const uint32_t *(*eth_dev_supported_ptypes_get_t)(struct rte_eth_dev *dev);
237*2d9fd380Sjfb8856606 /**< @internal Get supported ptypes of an Ethernet device. */
238*2d9fd380Sjfb8856606
239*2d9fd380Sjfb8856606 /**
240*2d9fd380Sjfb8856606 * @internal
241*2d9fd380Sjfb8856606 * Inform Ethernet device about reduced range of packet types to handle.
242*2d9fd380Sjfb8856606 *
243*2d9fd380Sjfb8856606 * @param dev
244*2d9fd380Sjfb8856606 * The Ethernet device identifier.
245*2d9fd380Sjfb8856606 * @param ptype_mask
246*2d9fd380Sjfb8856606 * The ptype family that application is interested in should be bitwise OR of
247*2d9fd380Sjfb8856606 * RTE_PTYPE_*_MASK or 0.
248*2d9fd380Sjfb8856606 * @return
249*2d9fd380Sjfb8856606 * - (0) if Success.
250*2d9fd380Sjfb8856606 */
251*2d9fd380Sjfb8856606 typedef int (*eth_dev_ptypes_set_t)(struct rte_eth_dev *dev,
252*2d9fd380Sjfb8856606 uint32_t ptype_mask);
253*2d9fd380Sjfb8856606
254*2d9fd380Sjfb8856606 typedef int (*eth_queue_start_t)(struct rte_eth_dev *dev,
255*2d9fd380Sjfb8856606 uint16_t queue_id);
256*2d9fd380Sjfb8856606 /**< @internal Start rx and tx of a queue of an Ethernet device. */
257*2d9fd380Sjfb8856606
258*2d9fd380Sjfb8856606 typedef int (*eth_queue_stop_t)(struct rte_eth_dev *dev,
259*2d9fd380Sjfb8856606 uint16_t queue_id);
260*2d9fd380Sjfb8856606 /**< @internal Stop rx and tx of a queue of an Ethernet device. */
261*2d9fd380Sjfb8856606
262*2d9fd380Sjfb8856606 typedef int (*eth_rx_queue_setup_t)(struct rte_eth_dev *dev,
263*2d9fd380Sjfb8856606 uint16_t rx_queue_id,
264*2d9fd380Sjfb8856606 uint16_t nb_rx_desc,
265*2d9fd380Sjfb8856606 unsigned int socket_id,
266*2d9fd380Sjfb8856606 const struct rte_eth_rxconf *rx_conf,
267*2d9fd380Sjfb8856606 struct rte_mempool *mb_pool);
268*2d9fd380Sjfb8856606 /**< @internal Set up a receive queue of an Ethernet device. */
269*2d9fd380Sjfb8856606
270*2d9fd380Sjfb8856606 typedef int (*eth_tx_queue_setup_t)(struct rte_eth_dev *dev,
271*2d9fd380Sjfb8856606 uint16_t tx_queue_id,
272*2d9fd380Sjfb8856606 uint16_t nb_tx_desc,
273*2d9fd380Sjfb8856606 unsigned int socket_id,
274*2d9fd380Sjfb8856606 const struct rte_eth_txconf *tx_conf);
275*2d9fd380Sjfb8856606 /**< @internal Setup a transmit queue of an Ethernet device. */
276*2d9fd380Sjfb8856606
277*2d9fd380Sjfb8856606 typedef int (*eth_rx_enable_intr_t)(struct rte_eth_dev *dev,
278*2d9fd380Sjfb8856606 uint16_t rx_queue_id);
279*2d9fd380Sjfb8856606 /**< @internal Enable interrupt of a receive queue of an Ethernet device. */
280*2d9fd380Sjfb8856606
281*2d9fd380Sjfb8856606 typedef int (*eth_rx_disable_intr_t)(struct rte_eth_dev *dev,
282*2d9fd380Sjfb8856606 uint16_t rx_queue_id);
283*2d9fd380Sjfb8856606 /**< @internal Disable interrupt of a receive queue of an Ethernet device. */
284*2d9fd380Sjfb8856606
285*2d9fd380Sjfb8856606 typedef void (*eth_queue_release_t)(void *queue);
286*2d9fd380Sjfb8856606 /**< @internal Release memory resources allocated by given RX/TX queue. */
287*2d9fd380Sjfb8856606
288*2d9fd380Sjfb8856606 typedef int (*eth_fw_version_get_t)(struct rte_eth_dev *dev,
289*2d9fd380Sjfb8856606 char *fw_version, size_t fw_size);
290*2d9fd380Sjfb8856606 /**< @internal Get firmware information of an Ethernet device. */
291*2d9fd380Sjfb8856606
292*2d9fd380Sjfb8856606 typedef int (*eth_tx_done_cleanup_t)(void *txq, uint32_t free_cnt);
293*2d9fd380Sjfb8856606 /**< @internal Force mbufs to be from TX ring. */
294*2d9fd380Sjfb8856606
295*2d9fd380Sjfb8856606 typedef void (*eth_rxq_info_get_t)(struct rte_eth_dev *dev,
296*2d9fd380Sjfb8856606 uint16_t rx_queue_id, struct rte_eth_rxq_info *qinfo);
297*2d9fd380Sjfb8856606
298*2d9fd380Sjfb8856606 typedef void (*eth_txq_info_get_t)(struct rte_eth_dev *dev,
299*2d9fd380Sjfb8856606 uint16_t tx_queue_id, struct rte_eth_txq_info *qinfo);
300*2d9fd380Sjfb8856606
301*2d9fd380Sjfb8856606 typedef int (*eth_burst_mode_get_t)(struct rte_eth_dev *dev,
302*2d9fd380Sjfb8856606 uint16_t queue_id, struct rte_eth_burst_mode *mode);
303*2d9fd380Sjfb8856606
304*2d9fd380Sjfb8856606 typedef int (*mtu_set_t)(struct rte_eth_dev *dev, uint16_t mtu);
305*2d9fd380Sjfb8856606 /**< @internal Set MTU. */
306*2d9fd380Sjfb8856606
307*2d9fd380Sjfb8856606 typedef int (*vlan_filter_set_t)(struct rte_eth_dev *dev,
308*2d9fd380Sjfb8856606 uint16_t vlan_id,
309*2d9fd380Sjfb8856606 int on);
310*2d9fd380Sjfb8856606 /**< @internal filtering of a VLAN Tag Identifier by an Ethernet device. */
311*2d9fd380Sjfb8856606
312*2d9fd380Sjfb8856606 typedef int (*vlan_tpid_set_t)(struct rte_eth_dev *dev,
313*2d9fd380Sjfb8856606 enum rte_vlan_type type, uint16_t tpid);
314*2d9fd380Sjfb8856606 /**< @internal set the outer/inner VLAN-TPID by an Ethernet device. */
315*2d9fd380Sjfb8856606
316*2d9fd380Sjfb8856606 typedef int (*vlan_offload_set_t)(struct rte_eth_dev *dev, int mask);
317*2d9fd380Sjfb8856606 /**< @internal set VLAN offload function by an Ethernet device. */
318*2d9fd380Sjfb8856606
319*2d9fd380Sjfb8856606 typedef int (*vlan_pvid_set_t)(struct rte_eth_dev *dev,
320*2d9fd380Sjfb8856606 uint16_t vlan_id,
321*2d9fd380Sjfb8856606 int on);
322*2d9fd380Sjfb8856606 /**< @internal set port based TX VLAN insertion by an Ethernet device. */
323*2d9fd380Sjfb8856606
324*2d9fd380Sjfb8856606 typedef void (*vlan_strip_queue_set_t)(struct rte_eth_dev *dev,
325*2d9fd380Sjfb8856606 uint16_t rx_queue_id,
326*2d9fd380Sjfb8856606 int on);
327*2d9fd380Sjfb8856606 /**< @internal VLAN stripping enable/disable by an queue of Ethernet device. */
328*2d9fd380Sjfb8856606
329*2d9fd380Sjfb8856606 typedef int (*flow_ctrl_get_t)(struct rte_eth_dev *dev,
330*2d9fd380Sjfb8856606 struct rte_eth_fc_conf *fc_conf);
331*2d9fd380Sjfb8856606 /**< @internal Get current flow control parameter on an Ethernet device */
332*2d9fd380Sjfb8856606
333*2d9fd380Sjfb8856606 typedef int (*flow_ctrl_set_t)(struct rte_eth_dev *dev,
334*2d9fd380Sjfb8856606 struct rte_eth_fc_conf *fc_conf);
335*2d9fd380Sjfb8856606 /**< @internal Setup flow control parameter on an Ethernet device */
336*2d9fd380Sjfb8856606
337*2d9fd380Sjfb8856606 typedef int (*priority_flow_ctrl_set_t)(struct rte_eth_dev *dev,
338*2d9fd380Sjfb8856606 struct rte_eth_pfc_conf *pfc_conf);
339*2d9fd380Sjfb8856606 /**< @internal Setup priority flow control parameter on an Ethernet device */
340*2d9fd380Sjfb8856606
341*2d9fd380Sjfb8856606 typedef int (*reta_update_t)(struct rte_eth_dev *dev,
342*2d9fd380Sjfb8856606 struct rte_eth_rss_reta_entry64 *reta_conf,
343*2d9fd380Sjfb8856606 uint16_t reta_size);
344*2d9fd380Sjfb8856606 /**< @internal Update RSS redirection table on an Ethernet device */
345*2d9fd380Sjfb8856606
346*2d9fd380Sjfb8856606 typedef int (*reta_query_t)(struct rte_eth_dev *dev,
347*2d9fd380Sjfb8856606 struct rte_eth_rss_reta_entry64 *reta_conf,
348*2d9fd380Sjfb8856606 uint16_t reta_size);
349*2d9fd380Sjfb8856606 /**< @internal Query RSS redirection table on an Ethernet device */
350*2d9fd380Sjfb8856606
351*2d9fd380Sjfb8856606 typedef int (*rss_hash_update_t)(struct rte_eth_dev *dev,
352*2d9fd380Sjfb8856606 struct rte_eth_rss_conf *rss_conf);
353*2d9fd380Sjfb8856606 /**< @internal Update RSS hash configuration of an Ethernet device */
354*2d9fd380Sjfb8856606
355*2d9fd380Sjfb8856606 typedef int (*rss_hash_conf_get_t)(struct rte_eth_dev *dev,
356*2d9fd380Sjfb8856606 struct rte_eth_rss_conf *rss_conf);
357*2d9fd380Sjfb8856606 /**< @internal Get current RSS hash configuration of an Ethernet device */
358*2d9fd380Sjfb8856606
359*2d9fd380Sjfb8856606 typedef int (*eth_dev_led_on_t)(struct rte_eth_dev *dev);
360*2d9fd380Sjfb8856606 /**< @internal Turn on SW controllable LED on an Ethernet device */
361*2d9fd380Sjfb8856606
362*2d9fd380Sjfb8856606 typedef int (*eth_dev_led_off_t)(struct rte_eth_dev *dev);
363*2d9fd380Sjfb8856606 /**< @internal Turn off SW controllable LED on an Ethernet device */
364*2d9fd380Sjfb8856606
365*2d9fd380Sjfb8856606 typedef void (*eth_mac_addr_remove_t)(struct rte_eth_dev *dev, uint32_t index);
366*2d9fd380Sjfb8856606 /**< @internal Remove MAC address from receive address register */
367*2d9fd380Sjfb8856606
368*2d9fd380Sjfb8856606 typedef int (*eth_mac_addr_add_t)(struct rte_eth_dev *dev,
369*2d9fd380Sjfb8856606 struct rte_ether_addr *mac_addr,
370*2d9fd380Sjfb8856606 uint32_t index,
371*2d9fd380Sjfb8856606 uint32_t vmdq);
372*2d9fd380Sjfb8856606 /**< @internal Set a MAC address into Receive Address Register */
373*2d9fd380Sjfb8856606
374*2d9fd380Sjfb8856606 typedef int (*eth_mac_addr_set_t)(struct rte_eth_dev *dev,
375*2d9fd380Sjfb8856606 struct rte_ether_addr *mac_addr);
376*2d9fd380Sjfb8856606 /**< @internal Set a MAC address into Receive Address Register */
377*2d9fd380Sjfb8856606
378*2d9fd380Sjfb8856606 typedef int (*eth_uc_hash_table_set_t)(struct rte_eth_dev *dev,
379*2d9fd380Sjfb8856606 struct rte_ether_addr *mac_addr,
380*2d9fd380Sjfb8856606 uint8_t on);
381*2d9fd380Sjfb8856606 /**< @internal Set a Unicast Hash bitmap */
382*2d9fd380Sjfb8856606
383*2d9fd380Sjfb8856606 typedef int (*eth_uc_all_hash_table_set_t)(struct rte_eth_dev *dev,
384*2d9fd380Sjfb8856606 uint8_t on);
385*2d9fd380Sjfb8856606 /**< @internal Set all Unicast Hash bitmap */
386*2d9fd380Sjfb8856606
387*2d9fd380Sjfb8856606 typedef int (*eth_set_queue_rate_limit_t)(struct rte_eth_dev *dev,
388*2d9fd380Sjfb8856606 uint16_t queue_idx,
389*2d9fd380Sjfb8856606 uint16_t tx_rate);
390*2d9fd380Sjfb8856606 /**< @internal Set queue TX rate */
391*2d9fd380Sjfb8856606
392*2d9fd380Sjfb8856606 typedef int (*eth_mirror_rule_set_t)(struct rte_eth_dev *dev,
393*2d9fd380Sjfb8856606 struct rte_eth_mirror_conf *mirror_conf,
394*2d9fd380Sjfb8856606 uint8_t rule_id,
395*2d9fd380Sjfb8856606 uint8_t on);
396*2d9fd380Sjfb8856606 /**< @internal Add a traffic mirroring rule on an Ethernet device */
397*2d9fd380Sjfb8856606
398*2d9fd380Sjfb8856606 typedef int (*eth_mirror_rule_reset_t)(struct rte_eth_dev *dev,
399*2d9fd380Sjfb8856606 uint8_t rule_id);
400*2d9fd380Sjfb8856606 /**< @internal Remove a traffic mirroring rule on an Ethernet device */
401*2d9fd380Sjfb8856606
402*2d9fd380Sjfb8856606 typedef int (*eth_udp_tunnel_port_add_t)(struct rte_eth_dev *dev,
403*2d9fd380Sjfb8856606 struct rte_eth_udp_tunnel *tunnel_udp);
404*2d9fd380Sjfb8856606 /**< @internal Add tunneling UDP port */
405*2d9fd380Sjfb8856606
406*2d9fd380Sjfb8856606 typedef int (*eth_udp_tunnel_port_del_t)(struct rte_eth_dev *dev,
407*2d9fd380Sjfb8856606 struct rte_eth_udp_tunnel *tunnel_udp);
408*2d9fd380Sjfb8856606 /**< @internal Delete tunneling UDP port */
409*2d9fd380Sjfb8856606
410*2d9fd380Sjfb8856606 typedef int (*eth_set_mc_addr_list_t)(struct rte_eth_dev *dev,
411*2d9fd380Sjfb8856606 struct rte_ether_addr *mc_addr_set,
412*2d9fd380Sjfb8856606 uint32_t nb_mc_addr);
413*2d9fd380Sjfb8856606 /**< @internal set the list of multicast addresses on an Ethernet device */
414*2d9fd380Sjfb8856606
415*2d9fd380Sjfb8856606 typedef int (*eth_timesync_enable_t)(struct rte_eth_dev *dev);
416*2d9fd380Sjfb8856606 /**< @internal Function used to enable IEEE1588/802.1AS timestamping. */
417*2d9fd380Sjfb8856606
418*2d9fd380Sjfb8856606 typedef int (*eth_timesync_disable_t)(struct rte_eth_dev *dev);
419*2d9fd380Sjfb8856606 /**< @internal Function used to disable IEEE1588/802.1AS timestamping. */
420*2d9fd380Sjfb8856606
421*2d9fd380Sjfb8856606 typedef int (*eth_timesync_read_rx_timestamp_t)(struct rte_eth_dev *dev,
422*2d9fd380Sjfb8856606 struct timespec *timestamp,
423*2d9fd380Sjfb8856606 uint32_t flags);
424*2d9fd380Sjfb8856606 /**< @internal Function used to read an RX IEEE1588/802.1AS timestamp. */
425*2d9fd380Sjfb8856606
426*2d9fd380Sjfb8856606 typedef int (*eth_timesync_read_tx_timestamp_t)(struct rte_eth_dev *dev,
427*2d9fd380Sjfb8856606 struct timespec *timestamp);
428*2d9fd380Sjfb8856606 /**< @internal Function used to read a TX IEEE1588/802.1AS timestamp. */
429*2d9fd380Sjfb8856606
430*2d9fd380Sjfb8856606 typedef int (*eth_timesync_adjust_time)(struct rte_eth_dev *dev, int64_t);
431*2d9fd380Sjfb8856606 /**< @internal Function used to adjust the device clock */
432*2d9fd380Sjfb8856606
433*2d9fd380Sjfb8856606 typedef int (*eth_timesync_read_time)(struct rte_eth_dev *dev,
434*2d9fd380Sjfb8856606 struct timespec *timestamp);
435*2d9fd380Sjfb8856606 /**< @internal Function used to get time from the device clock. */
436*2d9fd380Sjfb8856606
437*2d9fd380Sjfb8856606 typedef int (*eth_timesync_write_time)(struct rte_eth_dev *dev,
438*2d9fd380Sjfb8856606 const struct timespec *timestamp);
439*2d9fd380Sjfb8856606 /**< @internal Function used to get time from the device clock */
440*2d9fd380Sjfb8856606
441*2d9fd380Sjfb8856606 typedef int (*eth_read_clock)(struct rte_eth_dev *dev,
442*2d9fd380Sjfb8856606 uint64_t *timestamp);
443*2d9fd380Sjfb8856606 /**< @internal Function used to get the current value of the device clock. */
444*2d9fd380Sjfb8856606
445*2d9fd380Sjfb8856606 typedef int (*eth_get_reg_t)(struct rte_eth_dev *dev,
446*2d9fd380Sjfb8856606 struct rte_dev_reg_info *info);
447*2d9fd380Sjfb8856606 /**< @internal Retrieve registers */
448*2d9fd380Sjfb8856606
449*2d9fd380Sjfb8856606 typedef int (*eth_get_eeprom_length_t)(struct rte_eth_dev *dev);
450*2d9fd380Sjfb8856606 /**< @internal Retrieve eeprom size */
451*2d9fd380Sjfb8856606
452*2d9fd380Sjfb8856606 typedef int (*eth_get_eeprom_t)(struct rte_eth_dev *dev,
453*2d9fd380Sjfb8856606 struct rte_dev_eeprom_info *info);
454*2d9fd380Sjfb8856606 /**< @internal Retrieve eeprom data */
455*2d9fd380Sjfb8856606
456*2d9fd380Sjfb8856606 typedef int (*eth_set_eeprom_t)(struct rte_eth_dev *dev,
457*2d9fd380Sjfb8856606 struct rte_dev_eeprom_info *info);
458*2d9fd380Sjfb8856606 /**< @internal Program eeprom data */
459*2d9fd380Sjfb8856606
460*2d9fd380Sjfb8856606 typedef int (*eth_get_module_info_t)(struct rte_eth_dev *dev,
461*2d9fd380Sjfb8856606 struct rte_eth_dev_module_info *modinfo);
462*2d9fd380Sjfb8856606 /**< @internal Retrieve type and size of plugin module eeprom */
463*2d9fd380Sjfb8856606
464*2d9fd380Sjfb8856606 typedef int (*eth_get_module_eeprom_t)(struct rte_eth_dev *dev,
465*2d9fd380Sjfb8856606 struct rte_dev_eeprom_info *info);
466*2d9fd380Sjfb8856606 /**< @internal Retrieve plugin module eeprom data */
467*2d9fd380Sjfb8856606
468*2d9fd380Sjfb8856606 /**
469*2d9fd380Sjfb8856606 * Feature filter types
470*2d9fd380Sjfb8856606 */
471*2d9fd380Sjfb8856606 enum rte_filter_type {
472*2d9fd380Sjfb8856606 RTE_ETH_FILTER_NONE = 0,
473*2d9fd380Sjfb8856606 RTE_ETH_FILTER_ETHERTYPE,
474*2d9fd380Sjfb8856606 RTE_ETH_FILTER_FLEXIBLE,
475*2d9fd380Sjfb8856606 RTE_ETH_FILTER_SYN,
476*2d9fd380Sjfb8856606 RTE_ETH_FILTER_NTUPLE,
477*2d9fd380Sjfb8856606 RTE_ETH_FILTER_TUNNEL,
478*2d9fd380Sjfb8856606 RTE_ETH_FILTER_FDIR,
479*2d9fd380Sjfb8856606 RTE_ETH_FILTER_HASH,
480*2d9fd380Sjfb8856606 RTE_ETH_FILTER_L2_TUNNEL,
481*2d9fd380Sjfb8856606 RTE_ETH_FILTER_GENERIC,
482*2d9fd380Sjfb8856606 };
483*2d9fd380Sjfb8856606
484*2d9fd380Sjfb8856606 /**
485*2d9fd380Sjfb8856606 * Generic operations on filters
486*2d9fd380Sjfb8856606 */
487*2d9fd380Sjfb8856606 enum rte_filter_op {
488*2d9fd380Sjfb8856606 RTE_ETH_FILTER_GET, /**< get flow API ops */
489*2d9fd380Sjfb8856606 };
490*2d9fd380Sjfb8856606
491*2d9fd380Sjfb8856606 typedef int (*eth_filter_ctrl_t)(struct rte_eth_dev *dev,
492*2d9fd380Sjfb8856606 enum rte_filter_type filter_type,
493*2d9fd380Sjfb8856606 enum rte_filter_op filter_op,
494*2d9fd380Sjfb8856606 void *arg);
495*2d9fd380Sjfb8856606 /**< @internal Take operations to assigned filter type on an Ethernet device */
496*2d9fd380Sjfb8856606
497*2d9fd380Sjfb8856606 typedef int (*eth_tm_ops_get_t)(struct rte_eth_dev *dev, void *ops);
498*2d9fd380Sjfb8856606 /**< @internal Get Traffic Management (TM) operations on an Ethernet device */
499*2d9fd380Sjfb8856606
500*2d9fd380Sjfb8856606 typedef int (*eth_mtr_ops_get_t)(struct rte_eth_dev *dev, void *ops);
501*2d9fd380Sjfb8856606 /**< @internal Get Traffic Metering and Policing (MTR) operations */
502*2d9fd380Sjfb8856606
503*2d9fd380Sjfb8856606 typedef int (*eth_get_dcb_info)(struct rte_eth_dev *dev,
504*2d9fd380Sjfb8856606 struct rte_eth_dcb_info *dcb_info);
505*2d9fd380Sjfb8856606 /**< @internal Get dcb information on an Ethernet device */
506*2d9fd380Sjfb8856606
507*2d9fd380Sjfb8856606 typedef int (*eth_pool_ops_supported_t)(struct rte_eth_dev *dev,
508*2d9fd380Sjfb8856606 const char *pool);
509*2d9fd380Sjfb8856606 /**< @internal Test if a port supports specific mempool ops */
510*2d9fd380Sjfb8856606
511*2d9fd380Sjfb8856606 /**
512*2d9fd380Sjfb8856606 * @internal
513*2d9fd380Sjfb8856606 * Get the hairpin capabilities.
514*2d9fd380Sjfb8856606 *
515*2d9fd380Sjfb8856606 * @param dev
516*2d9fd380Sjfb8856606 * ethdev handle of port.
517*2d9fd380Sjfb8856606 * @param cap
518*2d9fd380Sjfb8856606 * returns the hairpin capabilities from the device.
519*2d9fd380Sjfb8856606 *
520*2d9fd380Sjfb8856606 * @return
521*2d9fd380Sjfb8856606 * Negative errno value on error, 0 on success.
522*2d9fd380Sjfb8856606 *
523*2d9fd380Sjfb8856606 * @retval 0
524*2d9fd380Sjfb8856606 * Success, hairpin is supported.
525*2d9fd380Sjfb8856606 * @retval -ENOTSUP
526*2d9fd380Sjfb8856606 * Hairpin is not supported.
527*2d9fd380Sjfb8856606 */
528*2d9fd380Sjfb8856606 typedef int (*eth_hairpin_cap_get_t)(struct rte_eth_dev *dev,
529*2d9fd380Sjfb8856606 struct rte_eth_hairpin_cap *cap);
530*2d9fd380Sjfb8856606
531*2d9fd380Sjfb8856606 /**
532*2d9fd380Sjfb8856606 * @internal
533*2d9fd380Sjfb8856606 * Setup RX hairpin queue.
534*2d9fd380Sjfb8856606 *
535*2d9fd380Sjfb8856606 * @param dev
536*2d9fd380Sjfb8856606 * ethdev handle of port.
537*2d9fd380Sjfb8856606 * @param rx_queue_id
538*2d9fd380Sjfb8856606 * the selected RX queue index.
539*2d9fd380Sjfb8856606 * @param nb_rx_desc
540*2d9fd380Sjfb8856606 * the requested number of descriptors for this queue. 0 - use PMD default.
541*2d9fd380Sjfb8856606 * @param conf
542*2d9fd380Sjfb8856606 * the RX hairpin configuration structure.
543*2d9fd380Sjfb8856606 *
544*2d9fd380Sjfb8856606 * @return
545*2d9fd380Sjfb8856606 * Negative errno value on error, 0 on success.
546*2d9fd380Sjfb8856606 *
547*2d9fd380Sjfb8856606 * @retval 0
548*2d9fd380Sjfb8856606 * Success, hairpin is supported.
549*2d9fd380Sjfb8856606 * @retval -ENOTSUP
550*2d9fd380Sjfb8856606 * Hairpin is not supported.
551*2d9fd380Sjfb8856606 * @retval -EINVAL
552*2d9fd380Sjfb8856606 * One of the parameters is invalid.
553*2d9fd380Sjfb8856606 * @retval -ENOMEM
554*2d9fd380Sjfb8856606 * Unable to allocate resources.
555*2d9fd380Sjfb8856606 */
556*2d9fd380Sjfb8856606 typedef int (*eth_rx_hairpin_queue_setup_t)
557*2d9fd380Sjfb8856606 (struct rte_eth_dev *dev, uint16_t rx_queue_id,
558*2d9fd380Sjfb8856606 uint16_t nb_rx_desc,
559*2d9fd380Sjfb8856606 const struct rte_eth_hairpin_conf *conf);
560*2d9fd380Sjfb8856606
561*2d9fd380Sjfb8856606 /**
562*2d9fd380Sjfb8856606 * @internal
563*2d9fd380Sjfb8856606 * Setup TX hairpin queue.
564*2d9fd380Sjfb8856606 *
565*2d9fd380Sjfb8856606 * @param dev
566*2d9fd380Sjfb8856606 * ethdev handle of port.
567*2d9fd380Sjfb8856606 * @param tx_queue_id
568*2d9fd380Sjfb8856606 * the selected TX queue index.
569*2d9fd380Sjfb8856606 * @param nb_tx_desc
570*2d9fd380Sjfb8856606 * the requested number of descriptors for this queue. 0 - use PMD default.
571*2d9fd380Sjfb8856606 * @param conf
572*2d9fd380Sjfb8856606 * the TX hairpin configuration structure.
573*2d9fd380Sjfb8856606 *
574*2d9fd380Sjfb8856606 * @return
575*2d9fd380Sjfb8856606 * Negative errno value on error, 0 on success.
576*2d9fd380Sjfb8856606 *
577*2d9fd380Sjfb8856606 * @retval 0
578*2d9fd380Sjfb8856606 * Success, hairpin is supported.
579*2d9fd380Sjfb8856606 * @retval -ENOTSUP
580*2d9fd380Sjfb8856606 * Hairpin is not supported.
581*2d9fd380Sjfb8856606 * @retval -EINVAL
582*2d9fd380Sjfb8856606 * One of the parameters is invalid.
583*2d9fd380Sjfb8856606 * @retval -ENOMEM
584*2d9fd380Sjfb8856606 * Unable to allocate resources.
585*2d9fd380Sjfb8856606 */
586*2d9fd380Sjfb8856606 typedef int (*eth_tx_hairpin_queue_setup_t)
587*2d9fd380Sjfb8856606 (struct rte_eth_dev *dev, uint16_t tx_queue_id,
588*2d9fd380Sjfb8856606 uint16_t nb_tx_desc,
589*2d9fd380Sjfb8856606 const struct rte_eth_hairpin_conf *hairpin_conf);
590*2d9fd380Sjfb8856606
591*2d9fd380Sjfb8856606 /**
592*2d9fd380Sjfb8856606 * @internal
593*2d9fd380Sjfb8856606 * Get Forward Error Correction(FEC) capability.
594*2d9fd380Sjfb8856606 *
595*2d9fd380Sjfb8856606 * @param dev
596*2d9fd380Sjfb8856606 * ethdev handle of port.
597*2d9fd380Sjfb8856606 * @param speed_fec_capa
598*2d9fd380Sjfb8856606 * speed_fec_capa is out only with per-speed capabilities.
599*2d9fd380Sjfb8856606 * @param num
600*2d9fd380Sjfb8856606 * a number of elements in an speed_fec_capa array.
601*2d9fd380Sjfb8856606 *
602*2d9fd380Sjfb8856606 * @return
603*2d9fd380Sjfb8856606 * Negative errno value on error, positive value on success.
604*2d9fd380Sjfb8856606 *
605*2d9fd380Sjfb8856606 * @retval positive value
606*2d9fd380Sjfb8856606 * A non-negative value lower or equal to num: success. The return value
607*2d9fd380Sjfb8856606 * is the number of entries filled in the fec capa array.
608*2d9fd380Sjfb8856606 * A non-negative value higher than num: error, the given fec capa array
609*2d9fd380Sjfb8856606 * is too small. The return value corresponds to the num that should
610*2d9fd380Sjfb8856606 * be given to succeed. The entries in the fec capa array are not valid
611*2d9fd380Sjfb8856606 * and shall not be used by the caller.
612*2d9fd380Sjfb8856606 * @retval -ENOTSUP
613*2d9fd380Sjfb8856606 * Operation is not supported.
614*2d9fd380Sjfb8856606 * @retval -EIO
615*2d9fd380Sjfb8856606 * Device is removed.
616*2d9fd380Sjfb8856606 * @retval -EINVAL
617*2d9fd380Sjfb8856606 * *num* or *speed_fec_capa* invalid.
618*2d9fd380Sjfb8856606 */
619*2d9fd380Sjfb8856606 typedef int (*eth_fec_get_capability_t)(struct rte_eth_dev *dev,
620*2d9fd380Sjfb8856606 struct rte_eth_fec_capa *speed_fec_capa, unsigned int num);
621*2d9fd380Sjfb8856606
622*2d9fd380Sjfb8856606 /**
623*2d9fd380Sjfb8856606 * @internal
624*2d9fd380Sjfb8856606 * Get Forward Error Correction(FEC) mode.
625*2d9fd380Sjfb8856606 *
626*2d9fd380Sjfb8856606 * @param dev
627*2d9fd380Sjfb8856606 * ethdev handle of port.
628*2d9fd380Sjfb8856606 * @param fec_capa
629*2d9fd380Sjfb8856606 * a bitmask of enabled FEC modes. If AUTO bit is set, other
630*2d9fd380Sjfb8856606 * bits specify FEC modes which may be negotiated. If AUTO
631*2d9fd380Sjfb8856606 * bit is clear, specify FEC modes to be used (only one valid
632*2d9fd380Sjfb8856606 * mode per speed may be set).
633*2d9fd380Sjfb8856606 *
634*2d9fd380Sjfb8856606 * @return
635*2d9fd380Sjfb8856606 * Negative errno value on error, 0 on success.
636*2d9fd380Sjfb8856606 *
637*2d9fd380Sjfb8856606 * @retval 0
638*2d9fd380Sjfb8856606 * Success, get FEC success.
639*2d9fd380Sjfb8856606 * @retval -ENOTSUP
640*2d9fd380Sjfb8856606 * Operation is not supported.
641*2d9fd380Sjfb8856606 * @retval -EIO
642*2d9fd380Sjfb8856606 * Device is removed.
643*2d9fd380Sjfb8856606 */
644*2d9fd380Sjfb8856606 typedef int (*eth_fec_get_t)(struct rte_eth_dev *dev,
645*2d9fd380Sjfb8856606 uint32_t *fec_capa);
646*2d9fd380Sjfb8856606
647*2d9fd380Sjfb8856606 /**
648*2d9fd380Sjfb8856606 * @internal
649*2d9fd380Sjfb8856606 * Set Forward Error Correction(FEC) mode.
650*2d9fd380Sjfb8856606 *
651*2d9fd380Sjfb8856606 * @param dev
652*2d9fd380Sjfb8856606 * ethdev handle of port.
653*2d9fd380Sjfb8856606 * @param fec_capa
654*2d9fd380Sjfb8856606 * bitmask of allowed FEC modes. It must be only one
655*2d9fd380Sjfb8856606 * if AUTO is disabled. If AUTO is enabled, other
656*2d9fd380Sjfb8856606 * bits specify FEC modes which may be negotiated.
657*2d9fd380Sjfb8856606 *
658*2d9fd380Sjfb8856606 * @return
659*2d9fd380Sjfb8856606 * Negative errno value on error, 0 on success.
660*2d9fd380Sjfb8856606 *
661*2d9fd380Sjfb8856606 * @retval 0
662*2d9fd380Sjfb8856606 * Success, set FEC success.
663*2d9fd380Sjfb8856606 * @retval -ENOTSUP
664*2d9fd380Sjfb8856606 * Operation is not supported.
665*2d9fd380Sjfb8856606 * @retval -EINVAL
666*2d9fd380Sjfb8856606 * Unsupported FEC mode requested.
667*2d9fd380Sjfb8856606 * @retval -EIO
668*2d9fd380Sjfb8856606 * Device is removed.
669*2d9fd380Sjfb8856606 */
670*2d9fd380Sjfb8856606 typedef int (*eth_fec_set_t)(struct rte_eth_dev *dev, uint32_t fec_capa);
671*2d9fd380Sjfb8856606
672*2d9fd380Sjfb8856606 /**
673*2d9fd380Sjfb8856606 * @internal
674*2d9fd380Sjfb8856606 * Get all hairpin Tx/Rx peer ports of the current device, if any.
675*2d9fd380Sjfb8856606 *
676*2d9fd380Sjfb8856606 * @param dev
677*2d9fd380Sjfb8856606 * ethdev handle of port.
678*2d9fd380Sjfb8856606 * @param peer_ports
679*2d9fd380Sjfb8856606 * array to save the ports list.
680*2d9fd380Sjfb8856606 * @param len
681*2d9fd380Sjfb8856606 * array length.
682*2d9fd380Sjfb8856606 * @param direction
683*2d9fd380Sjfb8856606 * value to decide the current to peer direction
684*2d9fd380Sjfb8856606 * positive - used as Tx to get all peer Rx ports.
685*2d9fd380Sjfb8856606 * zero - used as Rx to get all peer Tx ports.
686*2d9fd380Sjfb8856606 *
687*2d9fd380Sjfb8856606 * @return
688*2d9fd380Sjfb8856606 * Negative errno value on error, 0 or positive on success.
689*2d9fd380Sjfb8856606 *
690*2d9fd380Sjfb8856606 * @retval 0
691*2d9fd380Sjfb8856606 * Success, no peer ports.
692*2d9fd380Sjfb8856606 * @retval >0
693*2d9fd380Sjfb8856606 * Actual number of the peer ports.
694*2d9fd380Sjfb8856606 * @retval -ENOTSUP
695*2d9fd380Sjfb8856606 * Get peer ports API is not supported.
696*2d9fd380Sjfb8856606 * @retval -EINVAL
697*2d9fd380Sjfb8856606 * One of the parameters is invalid.
698*2d9fd380Sjfb8856606 */
699*2d9fd380Sjfb8856606 typedef int (*hairpin_get_peer_ports_t)(struct rte_eth_dev *dev,
700*2d9fd380Sjfb8856606 uint16_t *peer_ports, size_t len,
701*2d9fd380Sjfb8856606 uint32_t direction);
702*2d9fd380Sjfb8856606
703*2d9fd380Sjfb8856606 /**
704*2d9fd380Sjfb8856606 * @internal
705*2d9fd380Sjfb8856606 * Bind all hairpin Tx queues of one port to the Rx queues of the peer port.
706*2d9fd380Sjfb8856606 *
707*2d9fd380Sjfb8856606 * @param dev
708*2d9fd380Sjfb8856606 * ethdev handle of port.
709*2d9fd380Sjfb8856606 * @param rx_port
710*2d9fd380Sjfb8856606 * the peer Rx port.
711*2d9fd380Sjfb8856606 *
712*2d9fd380Sjfb8856606 * @return
713*2d9fd380Sjfb8856606 * Negative errno value on error, 0 on success.
714*2d9fd380Sjfb8856606 *
715*2d9fd380Sjfb8856606 * @retval 0
716*2d9fd380Sjfb8856606 * Success, bind successfully.
717*2d9fd380Sjfb8856606 * @retval -ENOTSUP
718*2d9fd380Sjfb8856606 * Bind API is not supported.
719*2d9fd380Sjfb8856606 * @retval -EINVAL
720*2d9fd380Sjfb8856606 * One of the parameters is invalid.
721*2d9fd380Sjfb8856606 * @retval -EBUSY
722*2d9fd380Sjfb8856606 * Device is not started.
723*2d9fd380Sjfb8856606 */
724*2d9fd380Sjfb8856606 typedef int (*eth_hairpin_bind_t)(struct rte_eth_dev *dev,
725*2d9fd380Sjfb8856606 uint16_t rx_port);
726*2d9fd380Sjfb8856606
727*2d9fd380Sjfb8856606 /**
728*2d9fd380Sjfb8856606 * @internal
729*2d9fd380Sjfb8856606 * Unbind all hairpin Tx queues of one port from the Rx queues of the peer port.
730*2d9fd380Sjfb8856606 *
731*2d9fd380Sjfb8856606 * @param dev
732*2d9fd380Sjfb8856606 * ethdev handle of port.
733*2d9fd380Sjfb8856606 * @param rx_port
734*2d9fd380Sjfb8856606 * the peer Rx port.
735*2d9fd380Sjfb8856606 *
736*2d9fd380Sjfb8856606 * @return
737*2d9fd380Sjfb8856606 * Negative errno value on error, 0 on success.
738*2d9fd380Sjfb8856606 *
739*2d9fd380Sjfb8856606 * @retval 0
740*2d9fd380Sjfb8856606 * Success, unbind successfully.
741*2d9fd380Sjfb8856606 * @retval -ENOTSUP
742*2d9fd380Sjfb8856606 * Bind API is not supported.
743*2d9fd380Sjfb8856606 * @retval -EINVAL
744*2d9fd380Sjfb8856606 * One of the parameters is invalid.
745*2d9fd380Sjfb8856606 * @retval -EBUSY
746*2d9fd380Sjfb8856606 * Device is already stopped.
747*2d9fd380Sjfb8856606 */
748*2d9fd380Sjfb8856606 typedef int (*eth_hairpin_unbind_t)(struct rte_eth_dev *dev,
749*2d9fd380Sjfb8856606 uint16_t rx_port);
750*2d9fd380Sjfb8856606
751*2d9fd380Sjfb8856606 typedef int (*eth_hairpin_queue_peer_update_t)
752*2d9fd380Sjfb8856606 (struct rte_eth_dev *dev, uint16_t peer_queue,
753*2d9fd380Sjfb8856606 struct rte_hairpin_peer_info *current_info,
754*2d9fd380Sjfb8856606 struct rte_hairpin_peer_info *peer_info, uint32_t direction);
755*2d9fd380Sjfb8856606 /**< @internal Update and fetch peer queue information. */
756*2d9fd380Sjfb8856606
757*2d9fd380Sjfb8856606 typedef int (*eth_hairpin_queue_peer_bind_t)
758*2d9fd380Sjfb8856606 (struct rte_eth_dev *dev, uint16_t cur_queue,
759*2d9fd380Sjfb8856606 struct rte_hairpin_peer_info *peer_info, uint32_t direction);
760*2d9fd380Sjfb8856606 /**< @internal Bind peer queue to the current queue with fetched information. */
761*2d9fd380Sjfb8856606
762*2d9fd380Sjfb8856606 typedef int (*eth_hairpin_queue_peer_unbind_t)
763*2d9fd380Sjfb8856606 (struct rte_eth_dev *dev, uint16_t cur_queue, uint32_t direction);
764*2d9fd380Sjfb8856606 /**< @internal Unbind peer queue from the current queue. */
765*2d9fd380Sjfb8856606
766*2d9fd380Sjfb8856606 /**
767*2d9fd380Sjfb8856606 * @internal A structure containing the functions exported by an Ethernet driver.
768*2d9fd380Sjfb8856606 */
769*2d9fd380Sjfb8856606 struct eth_dev_ops {
770*2d9fd380Sjfb8856606 eth_dev_configure_t dev_configure; /**< Configure device. */
771*2d9fd380Sjfb8856606 eth_dev_start_t dev_start; /**< Start device. */
772*2d9fd380Sjfb8856606 eth_dev_stop_t dev_stop; /**< Stop device. */
773*2d9fd380Sjfb8856606 eth_dev_set_link_up_t dev_set_link_up; /**< Device link up. */
774*2d9fd380Sjfb8856606 eth_dev_set_link_down_t dev_set_link_down; /**< Device link down. */
775*2d9fd380Sjfb8856606 eth_dev_close_t dev_close; /**< Close device. */
776*2d9fd380Sjfb8856606 eth_dev_reset_t dev_reset; /**< Reset device. */
777*2d9fd380Sjfb8856606 eth_link_update_t link_update; /**< Get device link state. */
778*2d9fd380Sjfb8856606 eth_is_removed_t is_removed;
779*2d9fd380Sjfb8856606 /**< Check if the device was physically removed. */
780*2d9fd380Sjfb8856606
781*2d9fd380Sjfb8856606 eth_promiscuous_enable_t promiscuous_enable; /**< Promiscuous ON. */
782*2d9fd380Sjfb8856606 eth_promiscuous_disable_t promiscuous_disable;/**< Promiscuous OFF. */
783*2d9fd380Sjfb8856606 eth_allmulticast_enable_t allmulticast_enable;/**< RX multicast ON. */
784*2d9fd380Sjfb8856606 eth_allmulticast_disable_t allmulticast_disable;/**< RX multicast OFF. */
785*2d9fd380Sjfb8856606 eth_mac_addr_remove_t mac_addr_remove; /**< Remove MAC address. */
786*2d9fd380Sjfb8856606 eth_mac_addr_add_t mac_addr_add; /**< Add a MAC address. */
787*2d9fd380Sjfb8856606 eth_mac_addr_set_t mac_addr_set; /**< Set a MAC address. */
788*2d9fd380Sjfb8856606 eth_set_mc_addr_list_t set_mc_addr_list; /**< set list of mcast addrs. */
789*2d9fd380Sjfb8856606 mtu_set_t mtu_set; /**< Set MTU. */
790*2d9fd380Sjfb8856606
791*2d9fd380Sjfb8856606 eth_stats_get_t stats_get; /**< Get generic device statistics. */
792*2d9fd380Sjfb8856606 eth_stats_reset_t stats_reset; /**< Reset generic device statistics. */
793*2d9fd380Sjfb8856606 eth_xstats_get_t xstats_get; /**< Get extended device statistics. */
794*2d9fd380Sjfb8856606 eth_xstats_reset_t xstats_reset; /**< Reset extended device statistics. */
795*2d9fd380Sjfb8856606 eth_xstats_get_names_t xstats_get_names;
796*2d9fd380Sjfb8856606 /**< Get names of extended statistics. */
797*2d9fd380Sjfb8856606 eth_queue_stats_mapping_set_t queue_stats_mapping_set;
798*2d9fd380Sjfb8856606 /**< Configure per queue stat counter mapping. */
799*2d9fd380Sjfb8856606
800*2d9fd380Sjfb8856606 eth_dev_infos_get_t dev_infos_get; /**< Get device info. */
801*2d9fd380Sjfb8856606 eth_rxq_info_get_t rxq_info_get; /**< retrieve RX queue information. */
802*2d9fd380Sjfb8856606 eth_txq_info_get_t txq_info_get; /**< retrieve TX queue information. */
803*2d9fd380Sjfb8856606 eth_burst_mode_get_t rx_burst_mode_get; /**< Get RX burst mode */
804*2d9fd380Sjfb8856606 eth_burst_mode_get_t tx_burst_mode_get; /**< Get TX burst mode */
805*2d9fd380Sjfb8856606 eth_fw_version_get_t fw_version_get; /**< Get firmware version. */
806*2d9fd380Sjfb8856606 eth_dev_supported_ptypes_get_t dev_supported_ptypes_get;
807*2d9fd380Sjfb8856606 /**< Get packet types supported and identified by device. */
808*2d9fd380Sjfb8856606 eth_dev_ptypes_set_t dev_ptypes_set;
809*2d9fd380Sjfb8856606 /**< Inform Ethernet device about reduced range of packet types to handle. */
810*2d9fd380Sjfb8856606
811*2d9fd380Sjfb8856606 vlan_filter_set_t vlan_filter_set; /**< Filter VLAN Setup. */
812*2d9fd380Sjfb8856606 vlan_tpid_set_t vlan_tpid_set; /**< Outer/Inner VLAN TPID Setup. */
813*2d9fd380Sjfb8856606 vlan_strip_queue_set_t vlan_strip_queue_set; /**< VLAN Stripping on queue. */
814*2d9fd380Sjfb8856606 vlan_offload_set_t vlan_offload_set; /**< Set VLAN Offload. */
815*2d9fd380Sjfb8856606 vlan_pvid_set_t vlan_pvid_set; /**< Set port based TX VLAN insertion. */
816*2d9fd380Sjfb8856606
817*2d9fd380Sjfb8856606 eth_queue_start_t rx_queue_start;/**< Start RX for a queue. */
818*2d9fd380Sjfb8856606 eth_queue_stop_t rx_queue_stop; /**< Stop RX for a queue. */
819*2d9fd380Sjfb8856606 eth_queue_start_t tx_queue_start;/**< Start TX for a queue. */
820*2d9fd380Sjfb8856606 eth_queue_stop_t tx_queue_stop; /**< Stop TX for a queue. */
821*2d9fd380Sjfb8856606 eth_rx_queue_setup_t rx_queue_setup;/**< Set up device RX queue. */
822*2d9fd380Sjfb8856606 eth_queue_release_t rx_queue_release; /**< Release RX queue. */
823*2d9fd380Sjfb8856606
824*2d9fd380Sjfb8856606 eth_rx_enable_intr_t rx_queue_intr_enable; /**< Enable Rx queue interrupt. */
825*2d9fd380Sjfb8856606 eth_rx_disable_intr_t rx_queue_intr_disable; /**< Disable Rx queue interrupt. */
826*2d9fd380Sjfb8856606 eth_tx_queue_setup_t tx_queue_setup;/**< Set up device TX queue. */
827*2d9fd380Sjfb8856606 eth_queue_release_t tx_queue_release; /**< Release TX queue. */
828*2d9fd380Sjfb8856606 eth_tx_done_cleanup_t tx_done_cleanup;/**< Free tx ring mbufs */
829*2d9fd380Sjfb8856606
830*2d9fd380Sjfb8856606 eth_dev_led_on_t dev_led_on; /**< Turn on LED. */
831*2d9fd380Sjfb8856606 eth_dev_led_off_t dev_led_off; /**< Turn off LED. */
832*2d9fd380Sjfb8856606
833*2d9fd380Sjfb8856606 flow_ctrl_get_t flow_ctrl_get; /**< Get flow control. */
834*2d9fd380Sjfb8856606 flow_ctrl_set_t flow_ctrl_set; /**< Setup flow control. */
835*2d9fd380Sjfb8856606 priority_flow_ctrl_set_t priority_flow_ctrl_set; /**< Setup priority flow control. */
836*2d9fd380Sjfb8856606
837*2d9fd380Sjfb8856606 eth_uc_hash_table_set_t uc_hash_table_set; /**< Set Unicast Table Array. */
838*2d9fd380Sjfb8856606 eth_uc_all_hash_table_set_t uc_all_hash_table_set; /**< Set Unicast hash bitmap. */
839*2d9fd380Sjfb8856606
840*2d9fd380Sjfb8856606 eth_mirror_rule_set_t mirror_rule_set; /**< Add a traffic mirror rule. */
841*2d9fd380Sjfb8856606 eth_mirror_rule_reset_t mirror_rule_reset; /**< reset a traffic mirror rule. */
842*2d9fd380Sjfb8856606
843*2d9fd380Sjfb8856606 eth_udp_tunnel_port_add_t udp_tunnel_port_add; /** Add UDP tunnel port. */
844*2d9fd380Sjfb8856606 eth_udp_tunnel_port_del_t udp_tunnel_port_del; /** Del UDP tunnel port. */
845*2d9fd380Sjfb8856606
846*2d9fd380Sjfb8856606 eth_set_queue_rate_limit_t set_queue_rate_limit; /**< Set queue rate limit. */
847*2d9fd380Sjfb8856606
848*2d9fd380Sjfb8856606 rss_hash_update_t rss_hash_update; /** Configure RSS hash protocols. */
849*2d9fd380Sjfb8856606 rss_hash_conf_get_t rss_hash_conf_get; /** Get current RSS hash configuration. */
850*2d9fd380Sjfb8856606 reta_update_t reta_update; /** Update redirection table. */
851*2d9fd380Sjfb8856606 reta_query_t reta_query; /** Query redirection table. */
852*2d9fd380Sjfb8856606
853*2d9fd380Sjfb8856606 eth_get_reg_t get_reg; /**< Get registers. */
854*2d9fd380Sjfb8856606 eth_get_eeprom_length_t get_eeprom_length; /**< Get eeprom length. */
855*2d9fd380Sjfb8856606 eth_get_eeprom_t get_eeprom; /**< Get eeprom data. */
856*2d9fd380Sjfb8856606 eth_set_eeprom_t set_eeprom; /**< Set eeprom. */
857*2d9fd380Sjfb8856606
858*2d9fd380Sjfb8856606 eth_get_module_info_t get_module_info;
859*2d9fd380Sjfb8856606 /** Get plugin module eeprom attribute. */
860*2d9fd380Sjfb8856606 eth_get_module_eeprom_t get_module_eeprom;
861*2d9fd380Sjfb8856606 /** Get plugin module eeprom data. */
862*2d9fd380Sjfb8856606
863*2d9fd380Sjfb8856606 eth_filter_ctrl_t filter_ctrl; /**< common filter control. */
864*2d9fd380Sjfb8856606
865*2d9fd380Sjfb8856606 eth_get_dcb_info get_dcb_info; /** Get DCB information. */
866*2d9fd380Sjfb8856606
867*2d9fd380Sjfb8856606 eth_timesync_enable_t timesync_enable;
868*2d9fd380Sjfb8856606 /** Turn IEEE1588/802.1AS timestamping on. */
869*2d9fd380Sjfb8856606 eth_timesync_disable_t timesync_disable;
870*2d9fd380Sjfb8856606 /** Turn IEEE1588/802.1AS timestamping off. */
871*2d9fd380Sjfb8856606 eth_timesync_read_rx_timestamp_t timesync_read_rx_timestamp;
872*2d9fd380Sjfb8856606 /** Read the IEEE1588/802.1AS RX timestamp. */
873*2d9fd380Sjfb8856606 eth_timesync_read_tx_timestamp_t timesync_read_tx_timestamp;
874*2d9fd380Sjfb8856606 /** Read the IEEE1588/802.1AS TX timestamp. */
875*2d9fd380Sjfb8856606 eth_timesync_adjust_time timesync_adjust_time; /** Adjust the device clock. */
876*2d9fd380Sjfb8856606 eth_timesync_read_time timesync_read_time; /** Get the device clock time. */
877*2d9fd380Sjfb8856606 eth_timesync_write_time timesync_write_time; /** Set the device clock time. */
878*2d9fd380Sjfb8856606
879*2d9fd380Sjfb8856606 eth_read_clock read_clock;
880*2d9fd380Sjfb8856606
881*2d9fd380Sjfb8856606 eth_xstats_get_by_id_t xstats_get_by_id;
882*2d9fd380Sjfb8856606 /**< Get extended device statistic values by ID. */
883*2d9fd380Sjfb8856606 eth_xstats_get_names_by_id_t xstats_get_names_by_id;
884*2d9fd380Sjfb8856606 /**< Get name of extended device statistics by ID. */
885*2d9fd380Sjfb8856606
886*2d9fd380Sjfb8856606 eth_tm_ops_get_t tm_ops_get;
887*2d9fd380Sjfb8856606 /**< Get Traffic Management (TM) operations. */
888*2d9fd380Sjfb8856606
889*2d9fd380Sjfb8856606 eth_mtr_ops_get_t mtr_ops_get;
890*2d9fd380Sjfb8856606 /**< Get Traffic Metering and Policing (MTR) operations. */
891*2d9fd380Sjfb8856606
892*2d9fd380Sjfb8856606 eth_pool_ops_supported_t pool_ops_supported;
893*2d9fd380Sjfb8856606 /**< Test if a port supports specific mempool ops */
894*2d9fd380Sjfb8856606
895*2d9fd380Sjfb8856606 eth_hairpin_cap_get_t hairpin_cap_get;
896*2d9fd380Sjfb8856606 /**< Returns the hairpin capabilities. */
897*2d9fd380Sjfb8856606 eth_rx_hairpin_queue_setup_t rx_hairpin_queue_setup;
898*2d9fd380Sjfb8856606 /**< Set up device RX hairpin queue. */
899*2d9fd380Sjfb8856606 eth_tx_hairpin_queue_setup_t tx_hairpin_queue_setup;
900*2d9fd380Sjfb8856606 /**< Set up device TX hairpin queue. */
901*2d9fd380Sjfb8856606
902*2d9fd380Sjfb8856606 eth_fec_get_capability_t fec_get_capability;
903*2d9fd380Sjfb8856606 /**< Get Forward Error Correction(FEC) capability. */
904*2d9fd380Sjfb8856606 eth_fec_get_t fec_get;
905*2d9fd380Sjfb8856606 /**< Get Forward Error Correction(FEC) mode. */
906*2d9fd380Sjfb8856606 eth_fec_set_t fec_set;
907*2d9fd380Sjfb8856606 /**< Set Forward Error Correction(FEC) mode. */
908*2d9fd380Sjfb8856606 hairpin_get_peer_ports_t hairpin_get_peer_ports;
909*2d9fd380Sjfb8856606 /**< Get hairpin peer ports list. */
910*2d9fd380Sjfb8856606 eth_hairpin_bind_t hairpin_bind;
911*2d9fd380Sjfb8856606 /**< Bind all hairpin Tx queues of device to the peer port Rx queues. */
912*2d9fd380Sjfb8856606 eth_hairpin_unbind_t hairpin_unbind;
913*2d9fd380Sjfb8856606 /**< Unbind all hairpin Tx queues from the peer port Rx queues. */
914*2d9fd380Sjfb8856606 eth_hairpin_queue_peer_update_t hairpin_queue_peer_update;
915*2d9fd380Sjfb8856606 /**< Pass the current queue info and get the peer queue info. */
916*2d9fd380Sjfb8856606 eth_hairpin_queue_peer_bind_t hairpin_queue_peer_bind;
917*2d9fd380Sjfb8856606 /**< Set up the connection between the pair of hairpin queues. */
918*2d9fd380Sjfb8856606 eth_hairpin_queue_peer_unbind_t hairpin_queue_peer_unbind;
919*2d9fd380Sjfb8856606 /**< Disconnect the hairpin queues of a pair from each other. */
920*2d9fd380Sjfb8856606 };
921*2d9fd380Sjfb8856606
922d30ea906Sjfb8856606 /**
9234418919fSjohnjiang * RX/TX queue states
9244418919fSjohnjiang */
9254418919fSjohnjiang #define RTE_ETH_QUEUE_STATE_STOPPED 0
9264418919fSjohnjiang #define RTE_ETH_QUEUE_STATE_STARTED 1
9274418919fSjohnjiang #define RTE_ETH_QUEUE_STATE_HAIRPIN 2
9284418919fSjohnjiang
9294418919fSjohnjiang /**
9304418919fSjohnjiang * @internal
9314418919fSjohnjiang * Check if the selected Rx queue is hairpin queue.
9324418919fSjohnjiang *
9334418919fSjohnjiang * @param dev
9344418919fSjohnjiang * Pointer to the selected device.
9354418919fSjohnjiang * @param queue_id
9364418919fSjohnjiang * The selected queue.
9374418919fSjohnjiang *
9384418919fSjohnjiang * @return
9394418919fSjohnjiang * - (1) if the queue is hairpin queue, 0 otherwise.
9404418919fSjohnjiang */
941*2d9fd380Sjfb8856606 __rte_internal
9424418919fSjohnjiang int rte_eth_dev_is_rx_hairpin_queue(struct rte_eth_dev *dev, uint16_t queue_id);
9434418919fSjohnjiang
9444418919fSjohnjiang /**
9454418919fSjohnjiang * @internal
9464418919fSjohnjiang * Check if the selected Tx queue is hairpin queue.
9474418919fSjohnjiang *
9484418919fSjohnjiang * @param dev
9494418919fSjohnjiang * Pointer to the selected device.
9504418919fSjohnjiang * @param queue_id
9514418919fSjohnjiang * The selected queue.
9524418919fSjohnjiang *
9534418919fSjohnjiang * @return
9544418919fSjohnjiang * - (1) if the queue is hairpin queue, 0 otherwise.
9554418919fSjohnjiang */
956*2d9fd380Sjfb8856606 __rte_internal
9574418919fSjohnjiang int rte_eth_dev_is_tx_hairpin_queue(struct rte_eth_dev *dev, uint16_t queue_id);
9584418919fSjohnjiang
9594418919fSjohnjiang /**
960d30ea906Sjfb8856606 * @internal
961d30ea906Sjfb8856606 * Returns a ethdev slot specified by the unique identifier name.
962d30ea906Sjfb8856606 *
963d30ea906Sjfb8856606 * @param name
964d30ea906Sjfb8856606 * The pointer to the Unique identifier name for each Ethernet device
965d30ea906Sjfb8856606 * @return
966d30ea906Sjfb8856606 * - The pointer to the ethdev slot, on success. NULL on error
967d30ea906Sjfb8856606 */
968*2d9fd380Sjfb8856606 __rte_internal
969d30ea906Sjfb8856606 struct rte_eth_dev *rte_eth_dev_allocated(const char *name);
970d30ea906Sjfb8856606
971d30ea906Sjfb8856606 /**
972d30ea906Sjfb8856606 * @internal
973d30ea906Sjfb8856606 * Allocates a new ethdev slot for an ethernet device and returns the pointer
974d30ea906Sjfb8856606 * to that slot for the driver to use.
975d30ea906Sjfb8856606 *
976d30ea906Sjfb8856606 * @param name Unique identifier name for each Ethernet device
977d30ea906Sjfb8856606 * @return
978d30ea906Sjfb8856606 * - Slot in the rte_dev_devices array for a new device;
979d30ea906Sjfb8856606 */
980*2d9fd380Sjfb8856606 __rte_internal
981d30ea906Sjfb8856606 struct rte_eth_dev *rte_eth_dev_allocate(const char *name);
982d30ea906Sjfb8856606
983d30ea906Sjfb8856606 /**
984d30ea906Sjfb8856606 * @internal
985d30ea906Sjfb8856606 * Attach to the ethdev already initialized by the primary
986d30ea906Sjfb8856606 * process.
987d30ea906Sjfb8856606 *
988d30ea906Sjfb8856606 * @param name Ethernet device's name.
989d30ea906Sjfb8856606 * @return
990d30ea906Sjfb8856606 * - Success: Slot in the rte_dev_devices array for attached
991d30ea906Sjfb8856606 * device.
992d30ea906Sjfb8856606 * - Error: Null pointer.
993d30ea906Sjfb8856606 */
994*2d9fd380Sjfb8856606 __rte_internal
995d30ea906Sjfb8856606 struct rte_eth_dev *rte_eth_dev_attach_secondary(const char *name);
996d30ea906Sjfb8856606
997d30ea906Sjfb8856606 /**
998d30ea906Sjfb8856606 * @internal
999d30ea906Sjfb8856606 * Notify RTE_ETH_EVENT_DESTROY and release the specified ethdev port.
1000d30ea906Sjfb8856606 *
1001d30ea906Sjfb8856606 * The following PMD-managed data fields will be freed:
1002d30ea906Sjfb8856606 * - dev_private
1003d30ea906Sjfb8856606 * - mac_addrs
1004d30ea906Sjfb8856606 * - hash_mac_addrs
1005d30ea906Sjfb8856606 * If one of these fields should not be freed,
1006d30ea906Sjfb8856606 * it must be reset to NULL by the PMD, typically in dev_close method.
1007d30ea906Sjfb8856606 *
1008d30ea906Sjfb8856606 * @param eth_dev
1009d30ea906Sjfb8856606 * Device to be detached.
1010d30ea906Sjfb8856606 * @return
1011d30ea906Sjfb8856606 * - 0 on success, negative on error
1012d30ea906Sjfb8856606 */
1013*2d9fd380Sjfb8856606 __rte_internal
1014d30ea906Sjfb8856606 int rte_eth_dev_release_port(struct rte_eth_dev *eth_dev);
1015d30ea906Sjfb8856606
1016d30ea906Sjfb8856606 /**
1017d30ea906Sjfb8856606 * @internal
1018d30ea906Sjfb8856606 * Release device queues and clear its configuration to force the user
1019d30ea906Sjfb8856606 * application to reconfigure it. It is for internal use only.
1020d30ea906Sjfb8856606 *
1021d30ea906Sjfb8856606 * @param dev
1022d30ea906Sjfb8856606 * Pointer to struct rte_eth_dev.
1023d30ea906Sjfb8856606 *
1024d30ea906Sjfb8856606 * @return
1025d30ea906Sjfb8856606 * void
1026d30ea906Sjfb8856606 */
1027*2d9fd380Sjfb8856606 __rte_internal
1028*2d9fd380Sjfb8856606 void rte_eth_dev_internal_reset(struct rte_eth_dev *dev);
1029d30ea906Sjfb8856606
1030d30ea906Sjfb8856606 /**
1031d30ea906Sjfb8856606 * @internal Executes all the user application registered callbacks for
1032d30ea906Sjfb8856606 * the specific device. It is for DPDK internal user only. User
1033d30ea906Sjfb8856606 * application should not call it directly.
1034d30ea906Sjfb8856606 *
1035d30ea906Sjfb8856606 * @param dev
1036d30ea906Sjfb8856606 * Pointer to struct rte_eth_dev.
1037d30ea906Sjfb8856606 * @param event
1038d30ea906Sjfb8856606 * Eth device interrupt event type.
1039d30ea906Sjfb8856606 * @param ret_param
1040d30ea906Sjfb8856606 * To pass data back to user application.
1041d30ea906Sjfb8856606 * This allows the user application to decide if a particular function
1042d30ea906Sjfb8856606 * is permitted or not.
1043d30ea906Sjfb8856606 *
1044d30ea906Sjfb8856606 * @return
1045d30ea906Sjfb8856606 * int
1046d30ea906Sjfb8856606 */
1047*2d9fd380Sjfb8856606 __rte_internal
1048*2d9fd380Sjfb8856606 int rte_eth_dev_callback_process(struct rte_eth_dev *dev,
1049d30ea906Sjfb8856606 enum rte_eth_event_type event, void *ret_param);
1050d30ea906Sjfb8856606
1051d30ea906Sjfb8856606 /**
1052d30ea906Sjfb8856606 * @internal
1053d30ea906Sjfb8856606 * This is the last step of device probing.
1054d30ea906Sjfb8856606 * It must be called after a port is allocated and initialized successfully.
1055d30ea906Sjfb8856606 *
1056d30ea906Sjfb8856606 * The notification RTE_ETH_EVENT_NEW is sent to other entities
1057d30ea906Sjfb8856606 * (libraries and applications).
1058d30ea906Sjfb8856606 * The state is set as RTE_ETH_DEV_ATTACHED.
1059d30ea906Sjfb8856606 *
1060d30ea906Sjfb8856606 * @param dev
1061d30ea906Sjfb8856606 * New ethdev port.
1062d30ea906Sjfb8856606 */
1063*2d9fd380Sjfb8856606 __rte_internal
1064d30ea906Sjfb8856606 void rte_eth_dev_probing_finish(struct rte_eth_dev *dev);
1065d30ea906Sjfb8856606
1066d30ea906Sjfb8856606 /**
1067d30ea906Sjfb8856606 * Create memzone for HW rings.
1068d30ea906Sjfb8856606 * malloc can't be used as the physical address is needed.
1069d30ea906Sjfb8856606 * If the memzone is already created, then this function returns a ptr
1070d30ea906Sjfb8856606 * to the old one.
1071d30ea906Sjfb8856606 *
1072d30ea906Sjfb8856606 * @param eth_dev
1073d30ea906Sjfb8856606 * The *eth_dev* pointer is the address of the *rte_eth_dev* structure
1074d30ea906Sjfb8856606 * @param name
1075d30ea906Sjfb8856606 * The name of the memory zone
1076d30ea906Sjfb8856606 * @param queue_id
1077d30ea906Sjfb8856606 * The index of the queue to add to name
1078d30ea906Sjfb8856606 * @param size
1079d30ea906Sjfb8856606 * The sizeof of the memory area
1080d30ea906Sjfb8856606 * @param align
1081d30ea906Sjfb8856606 * Alignment for resulting memzone. Must be a power of 2.
1082d30ea906Sjfb8856606 * @param socket_id
1083d30ea906Sjfb8856606 * The *socket_id* argument is the socket identifier in case of NUMA.
1084d30ea906Sjfb8856606 */
1085*2d9fd380Sjfb8856606 __rte_internal
1086d30ea906Sjfb8856606 const struct rte_memzone *
1087d30ea906Sjfb8856606 rte_eth_dma_zone_reserve(const struct rte_eth_dev *eth_dev, const char *name,
1088d30ea906Sjfb8856606 uint16_t queue_id, size_t size,
1089d30ea906Sjfb8856606 unsigned align, int socket_id);
1090d30ea906Sjfb8856606
1091d30ea906Sjfb8856606 /**
1092*2d9fd380Sjfb8856606 * Free previously allocated memzone for HW rings.
1093*2d9fd380Sjfb8856606 *
1094*2d9fd380Sjfb8856606 * @param eth_dev
1095*2d9fd380Sjfb8856606 * The *eth_dev* pointer is the address of the *rte_eth_dev* structure
1096*2d9fd380Sjfb8856606 * @param name
1097*2d9fd380Sjfb8856606 * The name of the memory zone
1098*2d9fd380Sjfb8856606 * @param queue_id
1099*2d9fd380Sjfb8856606 * The index of the queue to add to name
1100*2d9fd380Sjfb8856606 * @return
1101*2d9fd380Sjfb8856606 * Negative errno value on error, 0 on success.
1102*2d9fd380Sjfb8856606 */
1103*2d9fd380Sjfb8856606 __rte_internal
1104*2d9fd380Sjfb8856606 int
1105*2d9fd380Sjfb8856606 rte_eth_dma_zone_free(const struct rte_eth_dev *eth_dev, const char *name,
1106*2d9fd380Sjfb8856606 uint16_t queue_id);
1107*2d9fd380Sjfb8856606
1108*2d9fd380Sjfb8856606 /**
1109d30ea906Sjfb8856606 * @internal
1110d30ea906Sjfb8856606 * Atomically set the link status for the specific device.
1111d30ea906Sjfb8856606 * It is for use by DPDK device driver use only.
1112d30ea906Sjfb8856606 * User applications should not call it
1113d30ea906Sjfb8856606 *
1114d30ea906Sjfb8856606 * @param dev
1115d30ea906Sjfb8856606 * Pointer to struct rte_eth_dev.
1116d30ea906Sjfb8856606 * @param link
1117d30ea906Sjfb8856606 * New link status value.
1118d30ea906Sjfb8856606 * @return
1119d30ea906Sjfb8856606 * Same convention as eth_link_update operation.
1120d30ea906Sjfb8856606 * 0 if link up status has changed
1121d30ea906Sjfb8856606 * -1 if link up status was unchanged
1122d30ea906Sjfb8856606 */
1123d30ea906Sjfb8856606 static inline int
rte_eth_linkstatus_set(struct rte_eth_dev * dev,const struct rte_eth_link * new_link)1124d30ea906Sjfb8856606 rte_eth_linkstatus_set(struct rte_eth_dev *dev,
1125d30ea906Sjfb8856606 const struct rte_eth_link *new_link)
1126d30ea906Sjfb8856606 {
1127*2d9fd380Sjfb8856606 uint64_t *dev_link = (uint64_t *)&(dev->data->dev_link);
1128d30ea906Sjfb8856606 union {
1129d30ea906Sjfb8856606 uint64_t val64;
1130d30ea906Sjfb8856606 struct rte_eth_link link;
1131d30ea906Sjfb8856606 } orig;
1132d30ea906Sjfb8856606
1133d30ea906Sjfb8856606 RTE_BUILD_BUG_ON(sizeof(*new_link) != sizeof(uint64_t));
1134d30ea906Sjfb8856606
1135*2d9fd380Sjfb8856606 orig.val64 = __atomic_exchange_n(dev_link, *(const uint64_t *)new_link,
1136*2d9fd380Sjfb8856606 __ATOMIC_SEQ_CST);
1137d30ea906Sjfb8856606
1138d30ea906Sjfb8856606 return (orig.link.link_status == new_link->link_status) ? -1 : 0;
1139d30ea906Sjfb8856606 }
1140d30ea906Sjfb8856606
1141d30ea906Sjfb8856606 /**
1142d30ea906Sjfb8856606 * @internal
1143d30ea906Sjfb8856606 * Atomically get the link speed and status.
1144d30ea906Sjfb8856606 *
1145d30ea906Sjfb8856606 * @param dev
1146d30ea906Sjfb8856606 * Pointer to struct rte_eth_dev.
1147d30ea906Sjfb8856606 * @param link
1148d30ea906Sjfb8856606 * link status value.
1149d30ea906Sjfb8856606 */
1150d30ea906Sjfb8856606 static inline void
rte_eth_linkstatus_get(const struct rte_eth_dev * dev,struct rte_eth_link * link)1151d30ea906Sjfb8856606 rte_eth_linkstatus_get(const struct rte_eth_dev *dev,
1152d30ea906Sjfb8856606 struct rte_eth_link *link)
1153d30ea906Sjfb8856606 {
1154*2d9fd380Sjfb8856606 uint64_t *src = (uint64_t *)&(dev->data->dev_link);
1155d30ea906Sjfb8856606 uint64_t *dst = (uint64_t *)link;
1156d30ea906Sjfb8856606
1157d30ea906Sjfb8856606 RTE_BUILD_BUG_ON(sizeof(*link) != sizeof(uint64_t));
1158d30ea906Sjfb8856606
1159*2d9fd380Sjfb8856606 *dst = __atomic_load_n(src, __ATOMIC_SEQ_CST);
1160d30ea906Sjfb8856606 }
1161d30ea906Sjfb8856606
1162d30ea906Sjfb8856606 /**
1163d30ea906Sjfb8856606 * Allocate an unique switch domain identifier.
1164d30ea906Sjfb8856606 *
1165d30ea906Sjfb8856606 * A pool of switch domain identifiers which can be allocated on request. This
1166d30ea906Sjfb8856606 * will enabled devices which support the concept of switch domains to request
1167d30ea906Sjfb8856606 * a switch domain id which is guaranteed to be unique from other devices
1168d30ea906Sjfb8856606 * running in the same process.
1169d30ea906Sjfb8856606 *
1170d30ea906Sjfb8856606 * @param domain_id
1171d30ea906Sjfb8856606 * switch domain identifier parameter to pass back to application
1172d30ea906Sjfb8856606 *
1173d30ea906Sjfb8856606 * @return
1174d30ea906Sjfb8856606 * Negative errno value on error, 0 on success.
1175d30ea906Sjfb8856606 */
1176*2d9fd380Sjfb8856606 __rte_internal
11774418919fSjohnjiang int
1178d30ea906Sjfb8856606 rte_eth_switch_domain_alloc(uint16_t *domain_id);
1179d30ea906Sjfb8856606
1180d30ea906Sjfb8856606 /**
1181d30ea906Sjfb8856606 * Free switch domain.
1182d30ea906Sjfb8856606 *
1183d30ea906Sjfb8856606 * Return a switch domain identifier to the pool of free identifiers after it is
1184d30ea906Sjfb8856606 * no longer in use by device.
1185d30ea906Sjfb8856606 *
1186d30ea906Sjfb8856606 * @param domain_id
1187d30ea906Sjfb8856606 * switch domain identifier to free
1188d30ea906Sjfb8856606 *
1189d30ea906Sjfb8856606 * @return
1190d30ea906Sjfb8856606 * Negative errno value on error, 0 on success.
1191d30ea906Sjfb8856606 */
1192*2d9fd380Sjfb8856606 __rte_internal
11934418919fSjohnjiang int
1194d30ea906Sjfb8856606 rte_eth_switch_domain_free(uint16_t domain_id);
1195d30ea906Sjfb8856606
1196d30ea906Sjfb8856606 /** Generic Ethernet device arguments */
1197d30ea906Sjfb8856606 struct rte_eth_devargs {
1198d30ea906Sjfb8856606 uint16_t ports[RTE_MAX_ETHPORTS];
1199d30ea906Sjfb8856606 /** port/s number to enable on a multi-port single function */
1200d30ea906Sjfb8856606 uint16_t nb_ports;
1201d30ea906Sjfb8856606 /** number of ports in ports field */
1202d30ea906Sjfb8856606 uint16_t representor_ports[RTE_MAX_ETHPORTS];
1203d30ea906Sjfb8856606 /** representor port/s identifier to enable on device */
1204d30ea906Sjfb8856606 uint16_t nb_representor_ports;
1205d30ea906Sjfb8856606 /** number of ports in representor port field */
1206d30ea906Sjfb8856606 };
1207d30ea906Sjfb8856606
1208d30ea906Sjfb8856606 /**
1209d30ea906Sjfb8856606 * PMD helper function to parse ethdev arguments
1210d30ea906Sjfb8856606 *
1211d30ea906Sjfb8856606 * @param devargs
1212d30ea906Sjfb8856606 * device arguments
1213d30ea906Sjfb8856606 * @param eth_devargs
1214d30ea906Sjfb8856606 * parsed ethdev specific arguments.
1215d30ea906Sjfb8856606 *
1216d30ea906Sjfb8856606 * @return
1217d30ea906Sjfb8856606 * Negative errno value on error, 0 on success.
1218d30ea906Sjfb8856606 */
1219*2d9fd380Sjfb8856606 __rte_internal
12204418919fSjohnjiang int
1221d30ea906Sjfb8856606 rte_eth_devargs_parse(const char *devargs, struct rte_eth_devargs *eth_devargs);
1222d30ea906Sjfb8856606
1223d30ea906Sjfb8856606
1224d30ea906Sjfb8856606 typedef int (*ethdev_init_t)(struct rte_eth_dev *ethdev, void *init_params);
1225d30ea906Sjfb8856606 typedef int (*ethdev_bus_specific_init)(struct rte_eth_dev *ethdev,
1226d30ea906Sjfb8856606 void *bus_specific_init_params);
1227d30ea906Sjfb8856606
1228d30ea906Sjfb8856606 /**
1229d30ea906Sjfb8856606 * PMD helper function for the creation of a new ethdev ports.
1230d30ea906Sjfb8856606 *
1231d30ea906Sjfb8856606 * @param device
1232d30ea906Sjfb8856606 * rte_device handle.
1233d30ea906Sjfb8856606 * @param name
1234d30ea906Sjfb8856606 * port name.
1235d30ea906Sjfb8856606 * @param priv_data_size
1236d30ea906Sjfb8856606 * size of private data required for port.
1237d30ea906Sjfb8856606 * @param bus_specific_init
1238d30ea906Sjfb8856606 * port bus specific initialisation callback function
1239d30ea906Sjfb8856606 * @param bus_init_params
1240d30ea906Sjfb8856606 * port bus specific initialisation parameters
1241d30ea906Sjfb8856606 * @param ethdev_init
1242d30ea906Sjfb8856606 * device specific port initialization callback function
1243d30ea906Sjfb8856606 * @param init_params
1244d30ea906Sjfb8856606 * port initialisation parameters
1245d30ea906Sjfb8856606 *
1246d30ea906Sjfb8856606 * @return
1247d30ea906Sjfb8856606 * Negative errno value on error, 0 on success.
1248d30ea906Sjfb8856606 */
1249*2d9fd380Sjfb8856606 __rte_internal
12504418919fSjohnjiang int
1251d30ea906Sjfb8856606 rte_eth_dev_create(struct rte_device *device, const char *name,
1252d30ea906Sjfb8856606 size_t priv_data_size,
1253d30ea906Sjfb8856606 ethdev_bus_specific_init bus_specific_init, void *bus_init_params,
1254d30ea906Sjfb8856606 ethdev_init_t ethdev_init, void *init_params);
1255d30ea906Sjfb8856606
1256d30ea906Sjfb8856606
1257d30ea906Sjfb8856606 typedef int (*ethdev_uninit_t)(struct rte_eth_dev *ethdev);
1258d30ea906Sjfb8856606
1259d30ea906Sjfb8856606 /**
12601646932aSjfb8856606 * PMD helper function for cleaning up the resources of a ethdev port on it's
1261d30ea906Sjfb8856606 * destruction.
1262d30ea906Sjfb8856606 *
1263d30ea906Sjfb8856606 * @param ethdev
1264d30ea906Sjfb8856606 * ethdev handle of port.
1265d30ea906Sjfb8856606 * @param ethdev_uninit
1266d30ea906Sjfb8856606 * device specific port un-initialise callback function
1267d30ea906Sjfb8856606 *
1268d30ea906Sjfb8856606 * @return
1269d30ea906Sjfb8856606 * Negative errno value on error, 0 on success.
1270d30ea906Sjfb8856606 */
1271*2d9fd380Sjfb8856606 __rte_internal
12724418919fSjohnjiang int
1273d30ea906Sjfb8856606 rte_eth_dev_destroy(struct rte_eth_dev *ethdev, ethdev_uninit_t ethdev_uninit);
1274d30ea906Sjfb8856606
1275*2d9fd380Sjfb8856606 /**
1276*2d9fd380Sjfb8856606 * @internal
1277*2d9fd380Sjfb8856606 * Pass the current hairpin queue HW and/or SW information to the peer queue
1278*2d9fd380Sjfb8856606 * and fetch back the information of the peer queue.
1279*2d9fd380Sjfb8856606 *
1280*2d9fd380Sjfb8856606 * @param peer_port
1281*2d9fd380Sjfb8856606 * Peer port identifier of the Ethernet device.
1282*2d9fd380Sjfb8856606 * @param peer_queue
1283*2d9fd380Sjfb8856606 * Peer queue index of the port.
1284*2d9fd380Sjfb8856606 * @param cur_info
1285*2d9fd380Sjfb8856606 * Pointer to the current information structure.
1286*2d9fd380Sjfb8856606 * @param peer_info
1287*2d9fd380Sjfb8856606 * Pointer to the peer information, output.
1288*2d9fd380Sjfb8856606 * @param direction
1289*2d9fd380Sjfb8856606 * Direction to pass the information.
1290*2d9fd380Sjfb8856606 * positive - pass Tx queue information and get peer Rx queue information
1291*2d9fd380Sjfb8856606 * zero - pass Rx queue information and get peer Tx queue information
1292*2d9fd380Sjfb8856606 *
1293*2d9fd380Sjfb8856606 * @return
1294*2d9fd380Sjfb8856606 * Negative errno value on error, 0 on success.
1295*2d9fd380Sjfb8856606 */
1296*2d9fd380Sjfb8856606 __rte_internal
1297*2d9fd380Sjfb8856606 int
1298*2d9fd380Sjfb8856606 rte_eth_hairpin_queue_peer_update(uint16_t peer_port, uint16_t peer_queue,
1299*2d9fd380Sjfb8856606 struct rte_hairpin_peer_info *cur_info,
1300*2d9fd380Sjfb8856606 struct rte_hairpin_peer_info *peer_info,
1301*2d9fd380Sjfb8856606 uint32_t direction);
1302*2d9fd380Sjfb8856606
1303*2d9fd380Sjfb8856606 /**
1304*2d9fd380Sjfb8856606 * @internal
1305*2d9fd380Sjfb8856606 * Configure current hairpin queue with the peer information fetched to create
1306*2d9fd380Sjfb8856606 * the connection (bind) with peer queue in the specified direction.
1307*2d9fd380Sjfb8856606 * This function might need to be called twice to fully create the connections.
1308*2d9fd380Sjfb8856606 *
1309*2d9fd380Sjfb8856606 * @param cur_port
1310*2d9fd380Sjfb8856606 * Current port identifier of the Ethernet device.
1311*2d9fd380Sjfb8856606 * @param cur_queue
1312*2d9fd380Sjfb8856606 * Current queue index of the port.
1313*2d9fd380Sjfb8856606 * @param peer_info
1314*2d9fd380Sjfb8856606 * Pointer to the peer information, input.
1315*2d9fd380Sjfb8856606 * @param direction
1316*2d9fd380Sjfb8856606 * Direction to create the connection.
1317*2d9fd380Sjfb8856606 * positive - bind current Tx queue to peer Rx queue
1318*2d9fd380Sjfb8856606 * zero - bind current Rx queue to peer Tx queue
1319*2d9fd380Sjfb8856606 *
1320*2d9fd380Sjfb8856606 * @return
1321*2d9fd380Sjfb8856606 * Negative errno value on error, 0 on success.
1322*2d9fd380Sjfb8856606 */
1323*2d9fd380Sjfb8856606 __rte_internal
1324*2d9fd380Sjfb8856606 int
1325*2d9fd380Sjfb8856606 rte_eth_hairpin_queue_peer_bind(uint16_t cur_port, uint16_t cur_queue,
1326*2d9fd380Sjfb8856606 struct rte_hairpin_peer_info *peer_info,
1327*2d9fd380Sjfb8856606 uint32_t direction);
1328*2d9fd380Sjfb8856606
1329*2d9fd380Sjfb8856606 /**
1330*2d9fd380Sjfb8856606 * @internal
1331*2d9fd380Sjfb8856606 * Reset the current queue state and configuration to disconnect (unbind) it
1332*2d9fd380Sjfb8856606 * from the peer queue.
1333*2d9fd380Sjfb8856606 * This function might need to be called twice to disconnect each other.
1334*2d9fd380Sjfb8856606 *
1335*2d9fd380Sjfb8856606 * @param cur_port
1336*2d9fd380Sjfb8856606 * Current port identifier of the Ethernet device.
1337*2d9fd380Sjfb8856606 * @param cur_queue
1338*2d9fd380Sjfb8856606 * Current queue index of the port.
1339*2d9fd380Sjfb8856606 * @param direction
1340*2d9fd380Sjfb8856606 * Direction to destroy the connection.
1341*2d9fd380Sjfb8856606 * positive - unbind current Tx queue from peer Rx queue
1342*2d9fd380Sjfb8856606 * zero - unbind current Rx queue from peer Tx queue
1343*2d9fd380Sjfb8856606 *
1344*2d9fd380Sjfb8856606 * @return
1345*2d9fd380Sjfb8856606 * Negative errno value on error, 0 on success.
1346*2d9fd380Sjfb8856606 */
1347*2d9fd380Sjfb8856606 __rte_internal
1348*2d9fd380Sjfb8856606 int
1349*2d9fd380Sjfb8856606 rte_eth_hairpin_queue_peer_unbind(uint16_t cur_port, uint16_t cur_queue,
1350*2d9fd380Sjfb8856606 uint32_t direction);
1351*2d9fd380Sjfb8856606
1352*2d9fd380Sjfb8856606
1353*2d9fd380Sjfb8856606 /*
1354*2d9fd380Sjfb8856606 * Legacy ethdev API used internally by drivers.
1355*2d9fd380Sjfb8856606 */
1356*2d9fd380Sjfb8856606
1357*2d9fd380Sjfb8856606 /**
1358*2d9fd380Sjfb8856606 * Define all structures for Ethertype Filter type.
1359*2d9fd380Sjfb8856606 */
1360*2d9fd380Sjfb8856606
1361*2d9fd380Sjfb8856606 #define RTE_ETHTYPE_FLAGS_MAC 0x0001 /**< If set, compare mac */
1362*2d9fd380Sjfb8856606 #define RTE_ETHTYPE_FLAGS_DROP 0x0002 /**< If set, drop packet when match */
1363*2d9fd380Sjfb8856606
1364*2d9fd380Sjfb8856606 /**
1365*2d9fd380Sjfb8856606 * A structure used to define the ethertype filter entry
1366*2d9fd380Sjfb8856606 * to support RTE_ETH_FILTER_ETHERTYPE data representation.
1367*2d9fd380Sjfb8856606 */
1368*2d9fd380Sjfb8856606 struct rte_eth_ethertype_filter {
1369*2d9fd380Sjfb8856606 struct rte_ether_addr mac_addr; /**< Mac address to match. */
1370*2d9fd380Sjfb8856606 uint16_t ether_type; /**< Ether type to match */
1371*2d9fd380Sjfb8856606 uint16_t flags; /**< Flags from RTE_ETHTYPE_FLAGS_* */
1372*2d9fd380Sjfb8856606 uint16_t queue; /**< Queue assigned to when match*/
1373*2d9fd380Sjfb8856606 };
1374*2d9fd380Sjfb8856606
1375*2d9fd380Sjfb8856606 /**
1376*2d9fd380Sjfb8856606 * A structure used to define the TCP syn filter entry
1377*2d9fd380Sjfb8856606 * to support RTE_ETH_FILTER_SYN data representation.
1378*2d9fd380Sjfb8856606 */
1379*2d9fd380Sjfb8856606 struct rte_eth_syn_filter {
1380*2d9fd380Sjfb8856606 /** 1 - higher priority than other filters, 0 - lower priority. */
1381*2d9fd380Sjfb8856606 uint8_t hig_pri;
1382*2d9fd380Sjfb8856606 uint16_t queue; /**< Queue assigned to when match */
1383*2d9fd380Sjfb8856606 };
1384*2d9fd380Sjfb8856606
1385*2d9fd380Sjfb8856606 /**
1386*2d9fd380Sjfb8856606 * filter type of tunneling packet
1387*2d9fd380Sjfb8856606 */
1388*2d9fd380Sjfb8856606 #define ETH_TUNNEL_FILTER_OMAC 0x01 /**< filter by outer MAC addr */
1389*2d9fd380Sjfb8856606 #define ETH_TUNNEL_FILTER_OIP 0x02 /**< filter by outer IP Addr */
1390*2d9fd380Sjfb8856606 #define ETH_TUNNEL_FILTER_TENID 0x04 /**< filter by tenant ID */
1391*2d9fd380Sjfb8856606 #define ETH_TUNNEL_FILTER_IMAC 0x08 /**< filter by inner MAC addr */
1392*2d9fd380Sjfb8856606 #define ETH_TUNNEL_FILTER_IVLAN 0x10 /**< filter by inner VLAN ID */
1393*2d9fd380Sjfb8856606 #define ETH_TUNNEL_FILTER_IIP 0x20 /**< filter by inner IP addr */
1394*2d9fd380Sjfb8856606
1395*2d9fd380Sjfb8856606 #define RTE_TUNNEL_FILTER_IMAC_IVLAN (ETH_TUNNEL_FILTER_IMAC | \
1396*2d9fd380Sjfb8856606 ETH_TUNNEL_FILTER_IVLAN)
1397*2d9fd380Sjfb8856606 #define RTE_TUNNEL_FILTER_IMAC_IVLAN_TENID (ETH_TUNNEL_FILTER_IMAC | \
1398*2d9fd380Sjfb8856606 ETH_TUNNEL_FILTER_IVLAN | \
1399*2d9fd380Sjfb8856606 ETH_TUNNEL_FILTER_TENID)
1400*2d9fd380Sjfb8856606 #define RTE_TUNNEL_FILTER_IMAC_TENID (ETH_TUNNEL_FILTER_IMAC | \
1401*2d9fd380Sjfb8856606 ETH_TUNNEL_FILTER_TENID)
1402*2d9fd380Sjfb8856606 #define RTE_TUNNEL_FILTER_OMAC_TENID_IMAC (ETH_TUNNEL_FILTER_OMAC | \
1403*2d9fd380Sjfb8856606 ETH_TUNNEL_FILTER_TENID | \
1404*2d9fd380Sjfb8856606 ETH_TUNNEL_FILTER_IMAC)
1405*2d9fd380Sjfb8856606
1406*2d9fd380Sjfb8856606 /**
1407*2d9fd380Sjfb8856606 * Select IPv4 or IPv6 for tunnel filters.
1408*2d9fd380Sjfb8856606 */
1409*2d9fd380Sjfb8856606 enum rte_tunnel_iptype {
1410*2d9fd380Sjfb8856606 RTE_TUNNEL_IPTYPE_IPV4 = 0, /**< IPv4. */
1411*2d9fd380Sjfb8856606 RTE_TUNNEL_IPTYPE_IPV6, /**< IPv6. */
1412*2d9fd380Sjfb8856606 };
1413*2d9fd380Sjfb8856606
1414*2d9fd380Sjfb8856606 /**
1415*2d9fd380Sjfb8856606 * Tunneling Packet filter configuration.
1416*2d9fd380Sjfb8856606 */
1417*2d9fd380Sjfb8856606 struct rte_eth_tunnel_filter_conf {
1418*2d9fd380Sjfb8856606 struct rte_ether_addr outer_mac; /**< Outer MAC address to match. */
1419*2d9fd380Sjfb8856606 struct rte_ether_addr inner_mac; /**< Inner MAC address to match. */
1420*2d9fd380Sjfb8856606 uint16_t inner_vlan; /**< Inner VLAN to match. */
1421*2d9fd380Sjfb8856606 enum rte_tunnel_iptype ip_type; /**< IP address type. */
1422*2d9fd380Sjfb8856606 /**
1423*2d9fd380Sjfb8856606 * Outer destination IP address to match if ETH_TUNNEL_FILTER_OIP
1424*2d9fd380Sjfb8856606 * is set in filter_type, or inner destination IP address to match
1425*2d9fd380Sjfb8856606 * if ETH_TUNNEL_FILTER_IIP is set in filter_type.
1426*2d9fd380Sjfb8856606 */
1427*2d9fd380Sjfb8856606 union {
1428*2d9fd380Sjfb8856606 uint32_t ipv4_addr; /**< IPv4 address in big endian. */
1429*2d9fd380Sjfb8856606 uint32_t ipv6_addr[4]; /**< IPv6 address in big endian. */
1430*2d9fd380Sjfb8856606 } ip_addr;
1431*2d9fd380Sjfb8856606 /** Flags from ETH_TUNNEL_FILTER_XX - see above. */
1432*2d9fd380Sjfb8856606 uint16_t filter_type;
1433*2d9fd380Sjfb8856606 enum rte_eth_tunnel_type tunnel_type; /**< Tunnel Type. */
1434*2d9fd380Sjfb8856606 uint32_t tenant_id; /**< Tenant ID to match. VNI, GRE key... */
1435*2d9fd380Sjfb8856606 uint16_t queue_id; /**< Queue assigned to if match. */
1436*2d9fd380Sjfb8856606 };
1437*2d9fd380Sjfb8856606
1438d30ea906Sjfb8856606 #ifdef __cplusplus
1439d30ea906Sjfb8856606 }
1440d30ea906Sjfb8856606 #endif
1441d30ea906Sjfb8856606
1442d30ea906Sjfb8856606 #endif /* _RTE_ETHDEV_DRIVER_H_ */
1443