xref: /dpdk/drivers/net/mlx5/mlx5_rss.c (revision fc5b160f3ce7d8101fba0db1a3f2679953156afd)
12f97422eSNelio Laranjeiro /*-
22f97422eSNelio Laranjeiro  *   BSD LICENSE
32f97422eSNelio Laranjeiro  *
42f97422eSNelio Laranjeiro  *   Copyright 2015 6WIND S.A.
52f97422eSNelio Laranjeiro  *   Copyright 2015 Mellanox.
62f97422eSNelio Laranjeiro  *
72f97422eSNelio Laranjeiro  *   Redistribution and use in source and binary forms, with or without
82f97422eSNelio Laranjeiro  *   modification, are permitted provided that the following conditions
92f97422eSNelio Laranjeiro  *   are met:
102f97422eSNelio Laranjeiro  *
112f97422eSNelio Laranjeiro  *     * Redistributions of source code must retain the above copyright
122f97422eSNelio Laranjeiro  *       notice, this list of conditions and the following disclaimer.
132f97422eSNelio Laranjeiro  *     * Redistributions in binary form must reproduce the above copyright
142f97422eSNelio Laranjeiro  *       notice, this list of conditions and the following disclaimer in
152f97422eSNelio Laranjeiro  *       the documentation and/or other materials provided with the
162f97422eSNelio Laranjeiro  *       distribution.
172f97422eSNelio Laranjeiro  *     * Neither the name of 6WIND S.A. nor the names of its
182f97422eSNelio Laranjeiro  *       contributors may be used to endorse or promote products derived
192f97422eSNelio Laranjeiro  *       from this software without specific prior written permission.
202f97422eSNelio Laranjeiro  *
212f97422eSNelio Laranjeiro  *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
222f97422eSNelio Laranjeiro  *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
232f97422eSNelio Laranjeiro  *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
242f97422eSNelio Laranjeiro  *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
252f97422eSNelio Laranjeiro  *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
262f97422eSNelio Laranjeiro  *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
272f97422eSNelio Laranjeiro  *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
282f97422eSNelio Laranjeiro  *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
292f97422eSNelio Laranjeiro  *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
302f97422eSNelio Laranjeiro  *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
312f97422eSNelio Laranjeiro  *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
322f97422eSNelio Laranjeiro  */
332f97422eSNelio Laranjeiro 
342f97422eSNelio Laranjeiro #include <stddef.h>
352f97422eSNelio Laranjeiro #include <stdint.h>
362f97422eSNelio Laranjeiro #include <errno.h>
372f97422eSNelio Laranjeiro #include <string.h>
382f97422eSNelio Laranjeiro #include <assert.h>
392f97422eSNelio Laranjeiro 
402f97422eSNelio Laranjeiro /* Verbs header. */
412f97422eSNelio Laranjeiro /* ISO C doesn't support unnamed structs/unions, disabling -pedantic. */
422f97422eSNelio Laranjeiro #ifdef PEDANTIC
43*fc5b160fSBruce Richardson #pragma GCC diagnostic ignored "-Wpedantic"
442f97422eSNelio Laranjeiro #endif
452f97422eSNelio Laranjeiro #include <infiniband/verbs.h>
462f97422eSNelio Laranjeiro #ifdef PEDANTIC
47*fc5b160fSBruce Richardson #pragma GCC diagnostic error "-Wpedantic"
482f97422eSNelio Laranjeiro #endif
492f97422eSNelio Laranjeiro 
502f97422eSNelio Laranjeiro /* DPDK headers don't like -pedantic. */
512f97422eSNelio Laranjeiro #ifdef PEDANTIC
52*fc5b160fSBruce Richardson #pragma GCC diagnostic ignored "-Wpedantic"
532f97422eSNelio Laranjeiro #endif
542f97422eSNelio Laranjeiro #include <rte_malloc.h>
552f97422eSNelio Laranjeiro #include <rte_ethdev.h>
562f97422eSNelio Laranjeiro #ifdef PEDANTIC
57*fc5b160fSBruce Richardson #pragma GCC diagnostic error "-Wpedantic"
582f97422eSNelio Laranjeiro #endif
592f97422eSNelio Laranjeiro 
602f97422eSNelio Laranjeiro #include "mlx5.h"
612f97422eSNelio Laranjeiro #include "mlx5_rxtx.h"
622f97422eSNelio Laranjeiro 
632f97422eSNelio Laranjeiro /**
640573873dSNelio Laranjeiro  * Get a RSS configuration hash key.
650573873dSNelio Laranjeiro  *
660573873dSNelio Laranjeiro  * @param priv
670573873dSNelio Laranjeiro  *   Pointer to private structure.
680573873dSNelio Laranjeiro  * @param rss_hf
690573873dSNelio Laranjeiro  *   RSS hash functions configuration must be retrieved for.
700573873dSNelio Laranjeiro  *
710573873dSNelio Laranjeiro  * @return
720573873dSNelio Laranjeiro  *   Pointer to a RSS configuration structure or NULL if rss_hf cannot
730573873dSNelio Laranjeiro  *   be matched.
740573873dSNelio Laranjeiro  */
750573873dSNelio Laranjeiro static struct rte_eth_rss_conf *
760573873dSNelio Laranjeiro rss_hash_get(struct priv *priv, uint64_t rss_hf)
770573873dSNelio Laranjeiro {
780573873dSNelio Laranjeiro 	unsigned int i;
790573873dSNelio Laranjeiro 
800573873dSNelio Laranjeiro 	for (i = 0; (i != hash_rxq_init_n); ++i) {
810573873dSNelio Laranjeiro 		uint64_t dpdk_rss_hf = hash_rxq_init[i].dpdk_rss_hf;
820573873dSNelio Laranjeiro 
830573873dSNelio Laranjeiro 		if (!(dpdk_rss_hf & rss_hf))
840573873dSNelio Laranjeiro 			continue;
850573873dSNelio Laranjeiro 		return (*priv->rss_conf)[i];
860573873dSNelio Laranjeiro 	}
870573873dSNelio Laranjeiro 	return NULL;
880573873dSNelio Laranjeiro }
890573873dSNelio Laranjeiro 
900573873dSNelio Laranjeiro /**
912f97422eSNelio Laranjeiro  * Register a RSS key.
922f97422eSNelio Laranjeiro  *
932f97422eSNelio Laranjeiro  * @param priv
942f97422eSNelio Laranjeiro  *   Pointer to private structure.
952f97422eSNelio Laranjeiro  * @param key
962f97422eSNelio Laranjeiro  *   Hash key to register.
972f97422eSNelio Laranjeiro  * @param key_len
982f97422eSNelio Laranjeiro  *   Hash key length in bytes.
990573873dSNelio Laranjeiro  * @param rss_hf
1000573873dSNelio Laranjeiro  *   RSS hash functions the provided key applies to.
1012f97422eSNelio Laranjeiro  *
1022f97422eSNelio Laranjeiro  * @return
1032f97422eSNelio Laranjeiro  *   0 on success, errno value on failure.
1042f97422eSNelio Laranjeiro  */
1052f97422eSNelio Laranjeiro int
1062f97422eSNelio Laranjeiro rss_hash_rss_conf_new_key(struct priv *priv, const uint8_t *key,
1070573873dSNelio Laranjeiro 			  unsigned int key_len, uint64_t rss_hf)
1082f97422eSNelio Laranjeiro {
1090573873dSNelio Laranjeiro 	unsigned int i;
1102f97422eSNelio Laranjeiro 
1110573873dSNelio Laranjeiro 	for (i = 0; (i != hash_rxq_init_n); ++i) {
1120573873dSNelio Laranjeiro 		struct rte_eth_rss_conf *rss_conf;
1130573873dSNelio Laranjeiro 		uint64_t dpdk_rss_hf = hash_rxq_init[i].dpdk_rss_hf;
1140573873dSNelio Laranjeiro 
1150573873dSNelio Laranjeiro 		if (!(dpdk_rss_hf & rss_hf))
1160573873dSNelio Laranjeiro 			continue;
1170573873dSNelio Laranjeiro 		rss_conf = rte_realloc((*priv->rss_conf)[i],
1182f97422eSNelio Laranjeiro 				       (sizeof(*rss_conf) + key_len),
1192f97422eSNelio Laranjeiro 				       0);
1202f97422eSNelio Laranjeiro 		if (!rss_conf)
1212f97422eSNelio Laranjeiro 			return ENOMEM;
1222f97422eSNelio Laranjeiro 		rss_conf->rss_key = (void *)(rss_conf + 1);
1232f97422eSNelio Laranjeiro 		rss_conf->rss_key_len = key_len;
1240573873dSNelio Laranjeiro 		rss_conf->rss_hf = dpdk_rss_hf;
1252f97422eSNelio Laranjeiro 		memcpy(rss_conf->rss_key, key, key_len);
1260573873dSNelio Laranjeiro 		(*priv->rss_conf)[i] = rss_conf;
1270573873dSNelio Laranjeiro 	}
1282f97422eSNelio Laranjeiro 	return 0;
1292f97422eSNelio Laranjeiro }
1302f97422eSNelio Laranjeiro 
1312f97422eSNelio Laranjeiro /**
1322f97422eSNelio Laranjeiro  * DPDK callback to update the RSS hash configuration.
1332f97422eSNelio Laranjeiro  *
1342f97422eSNelio Laranjeiro  * @param dev
1352f97422eSNelio Laranjeiro  *   Pointer to Ethernet device structure.
1362f97422eSNelio Laranjeiro  * @param[in] rss_conf
1372f97422eSNelio Laranjeiro  *   RSS configuration data.
1382f97422eSNelio Laranjeiro  *
1392f97422eSNelio Laranjeiro  * @return
1402f97422eSNelio Laranjeiro  *   0 on success, negative errno value on failure.
1412f97422eSNelio Laranjeiro  */
1422f97422eSNelio Laranjeiro int
1432f97422eSNelio Laranjeiro mlx5_rss_hash_update(struct rte_eth_dev *dev,
1442f97422eSNelio Laranjeiro 		     struct rte_eth_rss_conf *rss_conf)
1452f97422eSNelio Laranjeiro {
1462f97422eSNelio Laranjeiro 	struct priv *priv = dev->data->dev_private;
1472f97422eSNelio Laranjeiro 	int err = 0;
1482f97422eSNelio Laranjeiro 
1492f97422eSNelio Laranjeiro 	priv_lock(priv);
1502f97422eSNelio Laranjeiro 
1512f97422eSNelio Laranjeiro 	assert(priv->rss_conf != NULL);
1522f97422eSNelio Laranjeiro 
1532f97422eSNelio Laranjeiro 	/* Apply configuration. */
1542f97422eSNelio Laranjeiro 	if (rss_conf->rss_key)
1552f97422eSNelio Laranjeiro 		err = rss_hash_rss_conf_new_key(priv,
1562f97422eSNelio Laranjeiro 						rss_conf->rss_key,
1570573873dSNelio Laranjeiro 						rss_conf->rss_key_len,
1580573873dSNelio Laranjeiro 						rss_conf->rss_hf);
159c64ccc0eSNélio Laranjeiro 	/* Store protocols for which RSS is enabled. */
160c64ccc0eSNélio Laranjeiro 	priv->rss_hf = rss_conf->rss_hf;
1612f97422eSNelio Laranjeiro 	priv_unlock(priv);
1622f97422eSNelio Laranjeiro 	assert(err >= 0);
1632f97422eSNelio Laranjeiro 	return -err;
1642f97422eSNelio Laranjeiro }
1652f97422eSNelio Laranjeiro 
1662f97422eSNelio Laranjeiro /**
1672f97422eSNelio Laranjeiro  * DPDK callback to get the RSS hash configuration.
1682f97422eSNelio Laranjeiro  *
1692f97422eSNelio Laranjeiro  * @param dev
1702f97422eSNelio Laranjeiro  *   Pointer to Ethernet device structure.
1712f97422eSNelio Laranjeiro  * @param[in, out] rss_conf
1722f97422eSNelio Laranjeiro  *   RSS configuration data.
1732f97422eSNelio Laranjeiro  *
1742f97422eSNelio Laranjeiro  * @return
1752f97422eSNelio Laranjeiro  *   0 on success, negative errno value on failure.
1762f97422eSNelio Laranjeiro  */
1772f97422eSNelio Laranjeiro int
1782f97422eSNelio Laranjeiro mlx5_rss_hash_conf_get(struct rte_eth_dev *dev,
1792f97422eSNelio Laranjeiro 		       struct rte_eth_rss_conf *rss_conf)
1802f97422eSNelio Laranjeiro {
1812f97422eSNelio Laranjeiro 	struct priv *priv = dev->data->dev_private;
1820573873dSNelio Laranjeiro 	struct rte_eth_rss_conf *priv_rss_conf;
1832f97422eSNelio Laranjeiro 
1842f97422eSNelio Laranjeiro 	priv_lock(priv);
1852f97422eSNelio Laranjeiro 
1862f97422eSNelio Laranjeiro 	assert(priv->rss_conf != NULL);
1872f97422eSNelio Laranjeiro 
1880573873dSNelio Laranjeiro 	priv_rss_conf = rss_hash_get(priv, rss_conf->rss_hf);
1890573873dSNelio Laranjeiro 	if (!priv_rss_conf) {
1900573873dSNelio Laranjeiro 		rss_conf->rss_hf = 0;
1910573873dSNelio Laranjeiro 		priv_unlock(priv);
1920573873dSNelio Laranjeiro 		return -EINVAL;
1930573873dSNelio Laranjeiro 	}
1942f97422eSNelio Laranjeiro 	if (rss_conf->rss_key &&
1950573873dSNelio Laranjeiro 	    rss_conf->rss_key_len >= priv_rss_conf->rss_key_len)
1962f97422eSNelio Laranjeiro 		memcpy(rss_conf->rss_key,
1970573873dSNelio Laranjeiro 		       priv_rss_conf->rss_key,
1980573873dSNelio Laranjeiro 		       priv_rss_conf->rss_key_len);
1990573873dSNelio Laranjeiro 	rss_conf->rss_key_len = priv_rss_conf->rss_key_len;
2000573873dSNelio Laranjeiro 	rss_conf->rss_hf = priv_rss_conf->rss_hf;
2012f97422eSNelio Laranjeiro 
2022f97422eSNelio Laranjeiro 	priv_unlock(priv);
2032f97422eSNelio Laranjeiro 	return 0;
2042f97422eSNelio Laranjeiro }
205634efbc2SNelio Laranjeiro 
206634efbc2SNelio Laranjeiro /**
207634efbc2SNelio Laranjeiro  * Allocate/reallocate RETA index table.
208634efbc2SNelio Laranjeiro  *
209634efbc2SNelio Laranjeiro  * @param priv
210634efbc2SNelio Laranjeiro  *   Pointer to private structure.
211634efbc2SNelio Laranjeiro  * @praram reta_size
212634efbc2SNelio Laranjeiro  *   The size of the array to allocate.
213634efbc2SNelio Laranjeiro  *
214634efbc2SNelio Laranjeiro  * @return
215634efbc2SNelio Laranjeiro  *   0 on success, errno value on failure.
216634efbc2SNelio Laranjeiro  */
217634efbc2SNelio Laranjeiro int
218634efbc2SNelio Laranjeiro priv_rss_reta_index_resize(struct priv *priv, unsigned int reta_size)
219634efbc2SNelio Laranjeiro {
220634efbc2SNelio Laranjeiro 	void *mem;
221634efbc2SNelio Laranjeiro 	unsigned int old_size = priv->reta_idx_n;
222634efbc2SNelio Laranjeiro 
223634efbc2SNelio Laranjeiro 	if (priv->reta_idx_n == reta_size)
224634efbc2SNelio Laranjeiro 		return 0;
225634efbc2SNelio Laranjeiro 
226634efbc2SNelio Laranjeiro 	mem = rte_realloc(priv->reta_idx,
227634efbc2SNelio Laranjeiro 			  reta_size * sizeof((*priv->reta_idx)[0]), 0);
228634efbc2SNelio Laranjeiro 	if (!mem)
229634efbc2SNelio Laranjeiro 		return ENOMEM;
230634efbc2SNelio Laranjeiro 	priv->reta_idx = mem;
231634efbc2SNelio Laranjeiro 	priv->reta_idx_n = reta_size;
232634efbc2SNelio Laranjeiro 
233634efbc2SNelio Laranjeiro 	if (old_size < reta_size)
234634efbc2SNelio Laranjeiro 		memset(&(*priv->reta_idx)[old_size], 0,
235634efbc2SNelio Laranjeiro 		       (reta_size - old_size) *
236634efbc2SNelio Laranjeiro 		       sizeof((*priv->reta_idx)[0]));
237634efbc2SNelio Laranjeiro 	return 0;
238634efbc2SNelio Laranjeiro }
239634efbc2SNelio Laranjeiro 
240634efbc2SNelio Laranjeiro /**
241634efbc2SNelio Laranjeiro  * Query RETA table.
242634efbc2SNelio Laranjeiro  *
243634efbc2SNelio Laranjeiro  * @param priv
244634efbc2SNelio Laranjeiro  *   Pointer to private structure.
245634efbc2SNelio Laranjeiro  * @param[in, out] reta_conf
246634efbc2SNelio Laranjeiro  *   Pointer to the first RETA configuration structure.
247634efbc2SNelio Laranjeiro  * @param reta_size
248634efbc2SNelio Laranjeiro  *   Number of entries.
249634efbc2SNelio Laranjeiro  *
250634efbc2SNelio Laranjeiro  * @return
251634efbc2SNelio Laranjeiro  *   0 on success, errno value on failure.
252634efbc2SNelio Laranjeiro  */
253634efbc2SNelio Laranjeiro static int
254634efbc2SNelio Laranjeiro priv_dev_rss_reta_query(struct priv *priv,
255634efbc2SNelio Laranjeiro 			struct rte_eth_rss_reta_entry64 *reta_conf,
256634efbc2SNelio Laranjeiro 			unsigned int reta_size)
257634efbc2SNelio Laranjeiro {
258634efbc2SNelio Laranjeiro 	unsigned int idx;
259634efbc2SNelio Laranjeiro 	unsigned int i;
260634efbc2SNelio Laranjeiro 	int ret;
261634efbc2SNelio Laranjeiro 
262634efbc2SNelio Laranjeiro 	/* See RETA comment in mlx5_dev_infos_get(). */
263634efbc2SNelio Laranjeiro 	ret = priv_rss_reta_index_resize(priv, priv->ind_table_max_size);
264634efbc2SNelio Laranjeiro 	if (ret)
265634efbc2SNelio Laranjeiro 		return ret;
266634efbc2SNelio Laranjeiro 
267634efbc2SNelio Laranjeiro 	/* Fill each entry of the table even if its bit is not set. */
268634efbc2SNelio Laranjeiro 	for (idx = 0, i = 0; (i != reta_size); ++i) {
269634efbc2SNelio Laranjeiro 		idx = i / RTE_RETA_GROUP_SIZE;
270634efbc2SNelio Laranjeiro 		reta_conf[idx].reta[i % RTE_RETA_GROUP_SIZE] =
271634efbc2SNelio Laranjeiro 			(*priv->reta_idx)[i];
272634efbc2SNelio Laranjeiro 	}
273634efbc2SNelio Laranjeiro 	return 0;
274634efbc2SNelio Laranjeiro }
275634efbc2SNelio Laranjeiro 
276634efbc2SNelio Laranjeiro /**
277634efbc2SNelio Laranjeiro  * Update RETA table.
278634efbc2SNelio Laranjeiro  *
279634efbc2SNelio Laranjeiro  * @param priv
280634efbc2SNelio Laranjeiro  *   Pointer to private structure.
281634efbc2SNelio Laranjeiro  * @param[in] reta_conf
282634efbc2SNelio Laranjeiro  *   Pointer to the first RETA configuration structure.
283634efbc2SNelio Laranjeiro  * @param reta_size
284634efbc2SNelio Laranjeiro  *   Number of entries.
285634efbc2SNelio Laranjeiro  *
286634efbc2SNelio Laranjeiro  * @return
287634efbc2SNelio Laranjeiro  *   0 on success, errno value on failure.
288634efbc2SNelio Laranjeiro  */
289634efbc2SNelio Laranjeiro static int
290634efbc2SNelio Laranjeiro priv_dev_rss_reta_update(struct priv *priv,
291634efbc2SNelio Laranjeiro 			 struct rte_eth_rss_reta_entry64 *reta_conf,
292634efbc2SNelio Laranjeiro 			 unsigned int reta_size)
293634efbc2SNelio Laranjeiro {
294634efbc2SNelio Laranjeiro 	unsigned int idx;
295634efbc2SNelio Laranjeiro 	unsigned int i;
296634efbc2SNelio Laranjeiro 	unsigned int pos;
297634efbc2SNelio Laranjeiro 	int ret;
298634efbc2SNelio Laranjeiro 
299634efbc2SNelio Laranjeiro 	/* See RETA comment in mlx5_dev_infos_get(). */
300634efbc2SNelio Laranjeiro 	ret = priv_rss_reta_index_resize(priv, priv->ind_table_max_size);
301634efbc2SNelio Laranjeiro 	if (ret)
302634efbc2SNelio Laranjeiro 		return ret;
303634efbc2SNelio Laranjeiro 
304634efbc2SNelio Laranjeiro 	for (idx = 0, i = 0; (i != reta_size); ++i) {
305634efbc2SNelio Laranjeiro 		idx = i / RTE_RETA_GROUP_SIZE;
306634efbc2SNelio Laranjeiro 		pos = i % RTE_RETA_GROUP_SIZE;
307634efbc2SNelio Laranjeiro 		if (((reta_conf[idx].mask >> i) & 0x1) == 0)
308634efbc2SNelio Laranjeiro 			continue;
309634efbc2SNelio Laranjeiro 		assert(reta_conf[idx].reta[pos] < priv->rxqs_n);
310634efbc2SNelio Laranjeiro 		(*priv->reta_idx)[i] = reta_conf[idx].reta[pos];
311634efbc2SNelio Laranjeiro 	}
312634efbc2SNelio Laranjeiro 	return 0;
313634efbc2SNelio Laranjeiro }
314634efbc2SNelio Laranjeiro 
315634efbc2SNelio Laranjeiro /**
316634efbc2SNelio Laranjeiro  * DPDK callback to get the RETA indirection table.
317634efbc2SNelio Laranjeiro  *
318634efbc2SNelio Laranjeiro  * @param dev
319634efbc2SNelio Laranjeiro  *   Pointer to Ethernet device structure.
320634efbc2SNelio Laranjeiro  * @param reta_conf
321634efbc2SNelio Laranjeiro  *   Pointer to RETA configuration structure array.
322634efbc2SNelio Laranjeiro  * @param reta_size
323634efbc2SNelio Laranjeiro  *   Size of the RETA table.
324634efbc2SNelio Laranjeiro  *
325634efbc2SNelio Laranjeiro  * @return
326634efbc2SNelio Laranjeiro  *   0 on success, negative errno value on failure.
327634efbc2SNelio Laranjeiro  */
328634efbc2SNelio Laranjeiro int
329634efbc2SNelio Laranjeiro mlx5_dev_rss_reta_query(struct rte_eth_dev *dev,
330634efbc2SNelio Laranjeiro 			struct rte_eth_rss_reta_entry64 *reta_conf,
331634efbc2SNelio Laranjeiro 			uint16_t reta_size)
332634efbc2SNelio Laranjeiro {
333634efbc2SNelio Laranjeiro 	int ret;
334634efbc2SNelio Laranjeiro 	struct priv *priv = dev->data->dev_private;
335634efbc2SNelio Laranjeiro 
336634efbc2SNelio Laranjeiro 	priv_lock(priv);
337634efbc2SNelio Laranjeiro 	ret = priv_dev_rss_reta_query(priv, reta_conf, reta_size);
338634efbc2SNelio Laranjeiro 	priv_unlock(priv);
339634efbc2SNelio Laranjeiro 	return -ret;
340634efbc2SNelio Laranjeiro }
341634efbc2SNelio Laranjeiro 
342634efbc2SNelio Laranjeiro /**
343634efbc2SNelio Laranjeiro  * DPDK callback to update the RETA indirection table.
344634efbc2SNelio Laranjeiro  *
345634efbc2SNelio Laranjeiro  * @param dev
346634efbc2SNelio Laranjeiro  *   Pointer to Ethernet device structure.
347634efbc2SNelio Laranjeiro  * @param reta_conf
348634efbc2SNelio Laranjeiro  *   Pointer to RETA configuration structure array.
349634efbc2SNelio Laranjeiro  * @param reta_size
350634efbc2SNelio Laranjeiro  *   Size of the RETA table.
351634efbc2SNelio Laranjeiro  *
352634efbc2SNelio Laranjeiro  * @return
353634efbc2SNelio Laranjeiro  *   0 on success, negative errno value on failure.
354634efbc2SNelio Laranjeiro  */
355634efbc2SNelio Laranjeiro int
356634efbc2SNelio Laranjeiro mlx5_dev_rss_reta_update(struct rte_eth_dev *dev,
357634efbc2SNelio Laranjeiro 			 struct rte_eth_rss_reta_entry64 *reta_conf,
358634efbc2SNelio Laranjeiro 			 uint16_t reta_size)
359634efbc2SNelio Laranjeiro {
360634efbc2SNelio Laranjeiro 	int ret;
361634efbc2SNelio Laranjeiro 	struct priv *priv = dev->data->dev_private;
362634efbc2SNelio Laranjeiro 
363634efbc2SNelio Laranjeiro 	priv_lock(priv);
364634efbc2SNelio Laranjeiro 	ret = priv_dev_rss_reta_update(priv, reta_conf, reta_size);
365634efbc2SNelio Laranjeiro 	priv_unlock(priv);
366634efbc2SNelio Laranjeiro 	return -ret;
367634efbc2SNelio Laranjeiro }
368