xref: /dpdk/drivers/net/mlx5/linux/mlx5_mp_os.c (revision bc5d8fdb7008210e2698fa1f91e51d7dfba00f77)
12e86c4e5SOphir Munk /* SPDX-License-Identifier: BSD-3-Clause
22e86c4e5SOphir Munk  * Copyright 2019 6WIND S.A.
32e86c4e5SOphir Munk  * Copyright 2019 Mellanox Technologies, Ltd
42e86c4e5SOphir Munk  */
52e86c4e5SOphir Munk 
62e86c4e5SOphir Munk #include <stdio.h>
72e86c4e5SOphir Munk #include <time.h>
82e86c4e5SOphir Munk 
92e86c4e5SOphir Munk #include <rte_eal.h>
10df96fd0dSBruce Richardson #include <ethdev_driver.h>
112e86c4e5SOphir Munk #include <rte_string_fns.h>
122e86c4e5SOphir Munk 
132e86c4e5SOphir Munk #include <mlx5_common_mp.h>
142e86c4e5SOphir Munk #include <mlx5_common_mr.h>
152e86c4e5SOphir Munk #include <mlx5_malloc.h>
162e86c4e5SOphir Munk 
172e86c4e5SOphir Munk #include "mlx5.h"
182e86c4e5SOphir Munk #include "mlx5_rxtx.h"
19151cbe3aSMichael Baum #include "mlx5_rx.h"
20377b69fbSMichael Baum #include "mlx5_tx.h"
212e86c4e5SOphir Munk #include "mlx5_utils.h"
222e86c4e5SOphir Munk 
23fec28ca0SDmitry Kozlyuk /**
24fec28ca0SDmitry Kozlyuk  * Handle a port-agnostic message.
25fec28ca0SDmitry Kozlyuk  *
26fec28ca0SDmitry Kozlyuk  * @return
27fec28ca0SDmitry Kozlyuk  *   0 on success, 1 when message is not port-agnostic, (-1) on error.
28fec28ca0SDmitry Kozlyuk  */
29fec28ca0SDmitry Kozlyuk static int
mlx5_mp_os_handle_port_agnostic(const struct rte_mp_msg * mp_msg,const void * peer)30fec28ca0SDmitry Kozlyuk mlx5_mp_os_handle_port_agnostic(const struct rte_mp_msg *mp_msg,
31fec28ca0SDmitry Kozlyuk 				const void *peer)
32fec28ca0SDmitry Kozlyuk {
33fec28ca0SDmitry Kozlyuk 	struct rte_mp_msg mp_res;
34fec28ca0SDmitry Kozlyuk 	struct mlx5_mp_param *res = (struct mlx5_mp_param *)mp_res.param;
35fec28ca0SDmitry Kozlyuk 	const struct mlx5_mp_param *param =
36fec28ca0SDmitry Kozlyuk 		(const struct mlx5_mp_param *)mp_msg->param;
3720489176SMichael Baum 	const struct mlx5_mp_arg_mr_manage *mng = &param->args.mr_manage;
3820489176SMichael Baum 	struct mr_cache_entry entry;
3920489176SMichael Baum 	uint32_t lkey;
40fec28ca0SDmitry Kozlyuk 
41fec28ca0SDmitry Kozlyuk 	switch (param->type) {
4220489176SMichael Baum 	case MLX5_MP_REQ_CREATE_MR:
4320489176SMichael Baum 		mp_init_port_agnostic_msg(&mp_res, param->type);
4420489176SMichael Baum 		lkey = mlx5_mr_create(mng->cdev, &mng->cdev->mr_scache, &entry,
4520489176SMichael Baum 				      mng->addr);
4620489176SMichael Baum 		if (lkey == UINT32_MAX)
4720489176SMichael Baum 			res->result = -rte_errno;
4820489176SMichael Baum 		return rte_mp_reply(&mp_res, peer);
49fec28ca0SDmitry Kozlyuk 	case MLX5_MP_REQ_MEMPOOL_REGISTER:
5020489176SMichael Baum 		mp_init_port_agnostic_msg(&mp_res, param->type);
5108ac0358SDmitry Kozlyuk 		res->result = mlx5_mr_mempool_register(mng->cdev, mng->mempool,
5208ac0358SDmitry Kozlyuk 						       mng->is_extmem);
53fec28ca0SDmitry Kozlyuk 		return rte_mp_reply(&mp_res, peer);
54fec28ca0SDmitry Kozlyuk 	case MLX5_MP_REQ_MEMPOOL_UNREGISTER:
5520489176SMichael Baum 		mp_init_port_agnostic_msg(&mp_res, param->type);
5620489176SMichael Baum 		res->result = mlx5_mr_mempool_unregister(mng->cdev,
5720489176SMichael Baum 							 mng->mempool);
58fec28ca0SDmitry Kozlyuk 		return rte_mp_reply(&mp_res, peer);
59fec28ca0SDmitry Kozlyuk 	default:
60fec28ca0SDmitry Kozlyuk 		return 1;
61fec28ca0SDmitry Kozlyuk 	}
62fec28ca0SDmitry Kozlyuk 	return -1;
63fec28ca0SDmitry Kozlyuk }
64fec28ca0SDmitry Kozlyuk 
652e86c4e5SOphir Munk int
mlx5_mp_os_primary_handle(const struct rte_mp_msg * mp_msg,const void * peer)662e86c4e5SOphir Munk mlx5_mp_os_primary_handle(const struct rte_mp_msg *mp_msg, const void *peer)
672e86c4e5SOphir Munk {
682e86c4e5SOphir Munk 	struct rte_mp_msg mp_res;
692e86c4e5SOphir Munk 	struct mlx5_mp_param *res = (struct mlx5_mp_param *)mp_res.param;
702e86c4e5SOphir Munk 	const struct mlx5_mp_param *param =
712e86c4e5SOphir Munk 		(const struct mlx5_mp_param *)mp_msg->param;
722e86c4e5SOphir Munk 	struct rte_eth_dev *dev;
732e86c4e5SOphir Munk 	struct mlx5_priv *priv;
7485209924SMichael Baum 	struct mlx5_common_device *cdev;
752e86c4e5SOphir Munk 	int ret;
762e86c4e5SOphir Munk 
772e86c4e5SOphir Munk 	MLX5_ASSERT(rte_eal_process_type() == RTE_PROC_PRIMARY);
78fec28ca0SDmitry Kozlyuk 	/* Port-agnostic messages. */
79fec28ca0SDmitry Kozlyuk 	ret = mlx5_mp_os_handle_port_agnostic(mp_msg, peer);
80fec28ca0SDmitry Kozlyuk 	if (ret <= 0)
81fec28ca0SDmitry Kozlyuk 		return ret;
82fec28ca0SDmitry Kozlyuk 	/* Port-specific messages. */
832e86c4e5SOphir Munk 	if (!rte_eth_dev_is_valid_port(param->port_id)) {
842e86c4e5SOphir Munk 		rte_errno = ENODEV;
852e86c4e5SOphir Munk 		DRV_LOG(ERR, "port %u invalid port ID", param->port_id);
862e86c4e5SOphir Munk 		return -rte_errno;
872e86c4e5SOphir Munk 	}
882e86c4e5SOphir Munk 	dev = &rte_eth_devices[param->port_id];
892e86c4e5SOphir Munk 	priv = dev->data->dev_private;
9085209924SMichael Baum 	cdev = priv->sh->cdev;
912e86c4e5SOphir Munk 	switch (param->type) {
922e86c4e5SOphir Munk 	case MLX5_MP_REQ_VERBS_CMD_FD:
932e86c4e5SOphir Munk 		mp_init_msg(&priv->mp_id, &mp_res, param->type);
942e86c4e5SOphir Munk 		mp_res.num_fds = 1;
95ca1418ceSMichael Baum 		mp_res.fds[0] = ((struct ibv_context *)cdev->ctx)->cmd_fd;
962e86c4e5SOphir Munk 		res->result = 0;
972e86c4e5SOphir Munk 		ret = rte_mp_reply(&mp_res, peer);
982e86c4e5SOphir Munk 		break;
992e86c4e5SOphir Munk 	case MLX5_MP_REQ_QUEUE_STATE_MODIFY:
1002e86c4e5SOphir Munk 		mp_init_msg(&priv->mp_id, &mp_res, param->type);
1012e86c4e5SOphir Munk 		res->result = mlx5_queue_state_modify_primary
1022e86c4e5SOphir Munk 					(dev, &param->args.state_modify);
1032e86c4e5SOphir Munk 		ret = rte_mp_reply(&mp_res, peer);
1042e86c4e5SOphir Munk 		break;
105161d103bSViacheslav Ovsiienko 	case MLX5_MP_REQ_QUEUE_RX_STOP:
106161d103bSViacheslav Ovsiienko 		mp_init_msg(&priv->mp_id, &mp_res, param->type);
107161d103bSViacheslav Ovsiienko 		res->result = mlx5_rx_queue_stop_primary
108161d103bSViacheslav Ovsiienko 					(dev, param->args.queue_id.queue_id);
109161d103bSViacheslav Ovsiienko 		ret = rte_mp_reply(&mp_res, peer);
110161d103bSViacheslav Ovsiienko 		break;
111161d103bSViacheslav Ovsiienko 	case MLX5_MP_REQ_QUEUE_RX_START:
112161d103bSViacheslav Ovsiienko 		mp_init_msg(&priv->mp_id, &mp_res, param->type);
113161d103bSViacheslav Ovsiienko 		res->result = mlx5_rx_queue_start_primary
114161d103bSViacheslav Ovsiienko 					(dev, param->args.queue_id.queue_id);
115161d103bSViacheslav Ovsiienko 		ret = rte_mp_reply(&mp_res, peer);
116161d103bSViacheslav Ovsiienko 		break;
117161d103bSViacheslav Ovsiienko 	case MLX5_MP_REQ_QUEUE_TX_STOP:
118161d103bSViacheslav Ovsiienko 		mp_init_msg(&priv->mp_id, &mp_res, param->type);
119161d103bSViacheslav Ovsiienko 		res->result = mlx5_tx_queue_stop_primary
120161d103bSViacheslav Ovsiienko 					(dev, param->args.queue_id.queue_id);
121161d103bSViacheslav Ovsiienko 		ret = rte_mp_reply(&mp_res, peer);
122161d103bSViacheslav Ovsiienko 		break;
123161d103bSViacheslav Ovsiienko 	case MLX5_MP_REQ_QUEUE_TX_START:
124161d103bSViacheslav Ovsiienko 		mp_init_msg(&priv->mp_id, &mp_res, param->type);
125161d103bSViacheslav Ovsiienko 		res->result = mlx5_tx_queue_start_primary
126161d103bSViacheslav Ovsiienko 					(dev, param->args.queue_id.queue_id);
127161d103bSViacheslav Ovsiienko 		ret = rte_mp_reply(&mp_res, peer);
128161d103bSViacheslav Ovsiienko 		break;
1292e86c4e5SOphir Munk 	default:
1302e86c4e5SOphir Munk 		rte_errno = EINVAL;
1312e86c4e5SOphir Munk 		DRV_LOG(ERR, "port %u invalid mp request type",
1322e86c4e5SOphir Munk 			dev->data->port_id);
1332e86c4e5SOphir Munk 		return -rte_errno;
1342e86c4e5SOphir Munk 	}
1352e86c4e5SOphir Munk 	return ret;
1362e86c4e5SOphir Munk }
1372e86c4e5SOphir Munk 
1382e86c4e5SOphir Munk /**
1392e86c4e5SOphir Munk  * IPC message handler of a secondary process.
1402e86c4e5SOphir Munk  *
1412e86c4e5SOphir Munk  * @param[in] dev
1422e86c4e5SOphir Munk  *   Pointer to Ethernet structure.
1432e86c4e5SOphir Munk  * @param[in] peer
1442e86c4e5SOphir Munk  *   Pointer to the peer socket path.
1452e86c4e5SOphir Munk  *
1462e86c4e5SOphir Munk  * @return
1472e86c4e5SOphir Munk  *   0 on success, a negative errno value otherwise and rte_errno is set.
1482e86c4e5SOphir Munk  */
1492e86c4e5SOphir Munk int
mlx5_mp_os_secondary_handle(const struct rte_mp_msg * mp_msg,const void * peer)1502e86c4e5SOphir Munk mlx5_mp_os_secondary_handle(const struct rte_mp_msg *mp_msg, const void *peer)
1512e86c4e5SOphir Munk {
1522e86c4e5SOphir Munk struct rte_mp_msg mp_res;
1532e86c4e5SOphir Munk 	struct mlx5_mp_param *res = (struct mlx5_mp_param *)mp_res.param;
1542e86c4e5SOphir Munk 	const struct mlx5_mp_param *param =
1552e86c4e5SOphir Munk 		(const struct mlx5_mp_param *)mp_msg->param;
1562e86c4e5SOphir Munk 	struct rte_eth_dev *dev;
1572b36c30bSSuanming Mou 	struct mlx5_proc_priv *ppriv;
1582e86c4e5SOphir Munk 	struct mlx5_priv *priv;
1592e86c4e5SOphir Munk 	int ret;
1602e86c4e5SOphir Munk 
1612e86c4e5SOphir Munk 	MLX5_ASSERT(rte_eal_process_type() == RTE_PROC_SECONDARY);
1622e86c4e5SOphir Munk 	if (!rte_eth_dev_is_valid_port(param->port_id)) {
1632e86c4e5SOphir Munk 		rte_errno = ENODEV;
1642e86c4e5SOphir Munk 		DRV_LOG(ERR, "port %u invalid port ID", param->port_id);
1652e86c4e5SOphir Munk 		return -rte_errno;
1662e86c4e5SOphir Munk 	}
1672e86c4e5SOphir Munk 	dev = &rte_eth_devices[param->port_id];
1682e86c4e5SOphir Munk 	priv = dev->data->dev_private;
1692e86c4e5SOphir Munk 	switch (param->type) {
1702e86c4e5SOphir Munk 	case MLX5_MP_REQ_START_RXTX:
1712e86c4e5SOphir Munk 		DRV_LOG(INFO, "port %u starting datapath", dev->data->port_id);
1722e86c4e5SOphir Munk 		dev->rx_pkt_burst = mlx5_select_rx_function(dev);
1732e86c4e5SOphir Munk 		dev->tx_pkt_burst = mlx5_select_tx_function(dev);
1742b36c30bSSuanming Mou 		ppriv = (struct mlx5_proc_priv *)dev->process_private;
1752b36c30bSSuanming Mou 		/* If Tx queue number changes, re-initialize UAR. */
1762b36c30bSSuanming Mou 		if (ppriv->uar_table_sz != priv->txqs_n) {
1772b36c30bSSuanming Mou 			mlx5_tx_uar_uninit_secondary(dev);
1782b36c30bSSuanming Mou 			mlx5_proc_priv_uninit(dev);
1792b36c30bSSuanming Mou 			ret = mlx5_proc_priv_init(dev);
180*bc5d8fdbSLong Li 			if (ret) {
181*bc5d8fdbSLong Li 				close(mp_msg->fds[0]);
1822b36c30bSSuanming Mou 				return -rte_errno;
183*bc5d8fdbSLong Li 			}
1842b36c30bSSuanming Mou 			ret = mlx5_tx_uar_init_secondary(dev, mp_msg->fds[0]);
1852b36c30bSSuanming Mou 			if (ret) {
186*bc5d8fdbSLong Li 				close(mp_msg->fds[0]);
1872b36c30bSSuanming Mou 				mlx5_proc_priv_uninit(dev);
1882b36c30bSSuanming Mou 				return -rte_errno;
1892b36c30bSSuanming Mou 			}
1902b36c30bSSuanming Mou 		}
191*bc5d8fdbSLong Li 		close(mp_msg->fds[0]);
19269b44d6bSChengwen Feng 		rte_mb();
1932e86c4e5SOphir Munk 		mp_init_msg(&priv->mp_id, &mp_res, param->type);
1942e86c4e5SOphir Munk 		res->result = 0;
1952e86c4e5SOphir Munk 		ret = rte_mp_reply(&mp_res, peer);
1962e86c4e5SOphir Munk 		break;
1972e86c4e5SOphir Munk 	case MLX5_MP_REQ_STOP_RXTX:
1982e86c4e5SOphir Munk 		DRV_LOG(INFO, "port %u stopping datapath", dev->data->port_id);
199a41f593fSFerruh Yigit 		dev->rx_pkt_burst = rte_eth_pkt_burst_dummy;
200a41f593fSFerruh Yigit 		dev->tx_pkt_burst = rte_eth_pkt_burst_dummy;
2012e86c4e5SOphir Munk 		rte_mb();
2022e86c4e5SOphir Munk 		mp_init_msg(&priv->mp_id, &mp_res, param->type);
2032e86c4e5SOphir Munk 		res->result = 0;
2042e86c4e5SOphir Munk 		ret = rte_mp_reply(&mp_res, peer);
2052e86c4e5SOphir Munk 		break;
2062e86c4e5SOphir Munk 	default:
2072e86c4e5SOphir Munk 		rte_errno = EINVAL;
2082e86c4e5SOphir Munk 		DRV_LOG(ERR, "port %u invalid mp request type",
2092e86c4e5SOphir Munk 			dev->data->port_id);
2102e86c4e5SOphir Munk 		return -rte_errno;
2112e86c4e5SOphir Munk 	}
2122e86c4e5SOphir Munk 	return ret;
2132e86c4e5SOphir Munk }
2142e86c4e5SOphir Munk 
2152e86c4e5SOphir Munk /**
2162e86c4e5SOphir Munk  * Broadcast request of stopping/starting data-path to secondary processes.
2172e86c4e5SOphir Munk  *
2182e86c4e5SOphir Munk  * @param[in] dev
2192e86c4e5SOphir Munk  *   Pointer to Ethernet structure.
2202e86c4e5SOphir Munk  * @param[in] type
2212e86c4e5SOphir Munk  *   Request type.
2222e86c4e5SOphir Munk  */
2232e86c4e5SOphir Munk static void
mp_req_on_rxtx(struct rte_eth_dev * dev,enum mlx5_mp_req_type type)2242e86c4e5SOphir Munk mp_req_on_rxtx(struct rte_eth_dev *dev, enum mlx5_mp_req_type type)
2252e86c4e5SOphir Munk {
2262e86c4e5SOphir Munk 	struct rte_mp_msg mp_req;
2272e86c4e5SOphir Munk 	struct rte_mp_msg *mp_res;
2282e86c4e5SOphir Munk 	struct rte_mp_reply mp_rep;
2292e86c4e5SOphir Munk 	struct mlx5_mp_param *res;
2302e86c4e5SOphir Munk 	struct timespec ts = {.tv_sec = MLX5_MP_REQ_TIMEOUT_SEC, .tv_nsec = 0};
2312e86c4e5SOphir Munk 	struct mlx5_priv *priv = dev->data->dev_private;
2322e86c4e5SOphir Munk 	int ret;
2332e86c4e5SOphir Munk 	int i;
2342e86c4e5SOphir Munk 
2352e86c4e5SOphir Munk 	MLX5_ASSERT(rte_eal_process_type() == RTE_PROC_PRIMARY);
2362e86c4e5SOphir Munk 	if (!mlx5_shared_data->secondary_cnt)
2372e86c4e5SOphir Munk 		return;
2382e86c4e5SOphir Munk 	if (type != MLX5_MP_REQ_START_RXTX && type != MLX5_MP_REQ_STOP_RXTX) {
2392e86c4e5SOphir Munk 		DRV_LOG(ERR, "port %u unknown request (req_type %d)",
2402e86c4e5SOphir Munk 			dev->data->port_id, type);
2412e86c4e5SOphir Munk 		return;
2422e86c4e5SOphir Munk 	}
2432e86c4e5SOphir Munk 	mp_init_msg(&priv->mp_id, &mp_req, type);
2442b36c30bSSuanming Mou 	if (type == MLX5_MP_REQ_START_RXTX) {
2452b36c30bSSuanming Mou 		mp_req.num_fds = 1;
246ca1418ceSMichael Baum 		mp_req.fds[0] =
247ca1418ceSMichael Baum 			((struct ibv_context *)priv->sh->cdev->ctx)->cmd_fd;
2482b36c30bSSuanming Mou 	}
2492e86c4e5SOphir Munk 	ret = rte_mp_request_sync(&mp_req, &mp_rep, &ts);
2502e86c4e5SOphir Munk 	if (ret) {
2512e86c4e5SOphir Munk 		if (rte_errno != ENOTSUP)
2522e86c4e5SOphir Munk 			DRV_LOG(ERR, "port %u failed to request stop/start Rx/Tx (%d)",
2532e86c4e5SOphir Munk 				dev->data->port_id, type);
2542e86c4e5SOphir Munk 		goto exit;
2552e86c4e5SOphir Munk 	}
2562e86c4e5SOphir Munk 	if (mp_rep.nb_sent != mp_rep.nb_received) {
2572e86c4e5SOphir Munk 		DRV_LOG(ERR,
2582e86c4e5SOphir Munk 			"port %u not all secondaries responded (req_type %d)",
2592e86c4e5SOphir Munk 			dev->data->port_id, type);
2602e86c4e5SOphir Munk 		goto exit;
2612e86c4e5SOphir Munk 	}
2622e86c4e5SOphir Munk 	for (i = 0; i < mp_rep.nb_received; i++) {
2632e86c4e5SOphir Munk 		mp_res = &mp_rep.msgs[i];
2642e86c4e5SOphir Munk 		res = (struct mlx5_mp_param *)mp_res->param;
2652e86c4e5SOphir Munk 		if (res->result) {
2662e86c4e5SOphir Munk 			DRV_LOG(ERR, "port %u request failed on secondary #%d",
2672e86c4e5SOphir Munk 				dev->data->port_id, i);
2682e86c4e5SOphir Munk 			goto exit;
2692e86c4e5SOphir Munk 		}
2702e86c4e5SOphir Munk 	}
2712e86c4e5SOphir Munk exit:
2722e86c4e5SOphir Munk 	mlx5_free(mp_rep.msgs);
2732e86c4e5SOphir Munk }
2742e86c4e5SOphir Munk 
2752e86c4e5SOphir Munk /**
2762e86c4e5SOphir Munk  * Broadcast request of starting data-path to secondary processes. The request
2772e86c4e5SOphir Munk  * is synchronous.
2782e86c4e5SOphir Munk  *
2792e86c4e5SOphir Munk  * @param[in] dev
2802e86c4e5SOphir Munk  *   Pointer to Ethernet structure.
2812e86c4e5SOphir Munk  */
2822e86c4e5SOphir Munk void
mlx5_mp_os_req_start_rxtx(struct rte_eth_dev * dev)2832e86c4e5SOphir Munk mlx5_mp_os_req_start_rxtx(struct rte_eth_dev *dev)
2842e86c4e5SOphir Munk {
2852e86c4e5SOphir Munk 	mp_req_on_rxtx(dev, MLX5_MP_REQ_START_RXTX);
2862e86c4e5SOphir Munk }
2872e86c4e5SOphir Munk 
2882e86c4e5SOphir Munk /**
2892e86c4e5SOphir Munk  * Broadcast request of stopping data-path to secondary processes. The request
2902e86c4e5SOphir Munk  * is synchronous.
2912e86c4e5SOphir Munk  *
2922e86c4e5SOphir Munk  * @param[in] dev
2932e86c4e5SOphir Munk  *   Pointer to Ethernet structure.
2942e86c4e5SOphir Munk  */
2952e86c4e5SOphir Munk void
mlx5_mp_os_req_stop_rxtx(struct rte_eth_dev * dev)2962e86c4e5SOphir Munk mlx5_mp_os_req_stop_rxtx(struct rte_eth_dev *dev)
2972e86c4e5SOphir Munk {
2982e86c4e5SOphir Munk 	mp_req_on_rxtx(dev, MLX5_MP_REQ_STOP_RXTX);
2992e86c4e5SOphir Munk }
300161d103bSViacheslav Ovsiienko 
301161d103bSViacheslav Ovsiienko /**
302161d103bSViacheslav Ovsiienko  * Request Verbs Rx/Tx queue stop or start to the primary process.
303161d103bSViacheslav Ovsiienko  *
304161d103bSViacheslav Ovsiienko  * @param[in] dev
305161d103bSViacheslav Ovsiienko  *   Pointer to Ethernet structure.
306161d103bSViacheslav Ovsiienko  * @param queue_id
307161d103bSViacheslav Ovsiienko  *   Queue ID to control.
308161d103bSViacheslav Ovsiienko  * @param req_type
309161d103bSViacheslav Ovsiienko  *   request type
310161d103bSViacheslav Ovsiienko  *     MLX5_MP_REQ_QUEUE_RX_START - start Rx queue
311161d103bSViacheslav Ovsiienko  *     MLX5_MP_REQ_QUEUE_TX_START - stop Tx queue
312161d103bSViacheslav Ovsiienko  *     MLX5_MP_REQ_QUEUE_RX_STOP - stop Rx queue
313161d103bSViacheslav Ovsiienko  *     MLX5_MP_REQ_QUEUE_TX_STOP - stop Tx queue
314161d103bSViacheslav Ovsiienko  * @return
315161d103bSViacheslav Ovsiienko  *   0 on success, a negative errno value otherwise and
316161d103bSViacheslav Ovsiienko  *     rte_errno is set.
317161d103bSViacheslav Ovsiienko  */
318161d103bSViacheslav Ovsiienko int
mlx5_mp_os_req_queue_control(struct rte_eth_dev * dev,uint16_t queue_id,enum mlx5_mp_req_type req_type)319161d103bSViacheslav Ovsiienko mlx5_mp_os_req_queue_control(struct rte_eth_dev *dev, uint16_t queue_id,
320161d103bSViacheslav Ovsiienko 			  enum mlx5_mp_req_type req_type)
321161d103bSViacheslav Ovsiienko {
322161d103bSViacheslav Ovsiienko 	struct rte_mp_msg mp_req;
323161d103bSViacheslav Ovsiienko 	struct rte_mp_msg *mp_res;
324161d103bSViacheslav Ovsiienko 	struct rte_mp_reply mp_rep;
325161d103bSViacheslav Ovsiienko 	struct mlx5_mp_param *req = (struct mlx5_mp_param *)mp_req.param;
326161d103bSViacheslav Ovsiienko 	struct mlx5_mp_param *res;
327161d103bSViacheslav Ovsiienko 	struct timespec ts = {.tv_sec = MLX5_MP_REQ_TIMEOUT_SEC, .tv_nsec = 0};
328161d103bSViacheslav Ovsiienko 	struct mlx5_priv *priv;
329161d103bSViacheslav Ovsiienko 	int ret;
330161d103bSViacheslav Ovsiienko 
331161d103bSViacheslav Ovsiienko 	MLX5_ASSERT(rte_eal_process_type() == RTE_PROC_SECONDARY);
332161d103bSViacheslav Ovsiienko 	priv = dev->data->dev_private;
333161d103bSViacheslav Ovsiienko 	mp_init_msg(&priv->mp_id, &mp_req, req_type);
334161d103bSViacheslav Ovsiienko 	req->args.queue_id.queue_id = queue_id;
335161d103bSViacheslav Ovsiienko 	ret = rte_mp_request_sync(&mp_req, &mp_rep, &ts);
336161d103bSViacheslav Ovsiienko 	if (ret) {
337161d103bSViacheslav Ovsiienko 		DRV_LOG(ERR, "port %u request to primary process failed",
338161d103bSViacheslav Ovsiienko 			dev->data->port_id);
339161d103bSViacheslav Ovsiienko 		return -rte_errno;
340161d103bSViacheslav Ovsiienko 	}
341161d103bSViacheslav Ovsiienko 	MLX5_ASSERT(mp_rep.nb_received == 1);
342161d103bSViacheslav Ovsiienko 	mp_res = &mp_rep.msgs[0];
343161d103bSViacheslav Ovsiienko 	res = (struct mlx5_mp_param *)mp_res->param;
344161d103bSViacheslav Ovsiienko 	ret = res->result;
345161d103bSViacheslav Ovsiienko 	free(mp_rep.msgs);
346161d103bSViacheslav Ovsiienko 	return ret;
347161d103bSViacheslav Ovsiienko }
348