diff --git a/drivers/net/mlx5/Makefile b/drivers/net/mlx5/Makefile
index a458402..bb45294 100644
--- a/drivers/net/mlx5/Makefile
+++ b/drivers/net/mlx5/Makefile
@@ -29,12 +29,12 @@ SRCS-$(CONFIG_RTE_LIBRTE_MLX5_PMD) += mlx5_flow.c
 SRCS-$(CONFIG_RTE_LIBRTE_MLX5_PMD) += mlx5_flow_meter.c
 SRCS-$(CONFIG_RTE_LIBRTE_MLX5_PMD) += mlx5_flow_dv.c
 SRCS-$(CONFIG_RTE_LIBRTE_MLX5_PMD) += mlx5_flow_verbs.c
-SRCS-$(CONFIG_RTE_LIBRTE_MLX5_PMD) += mlx5_mp.c
 SRCS-$(CONFIG_RTE_LIBRTE_MLX5_PMD) += mlx5_utils.c
 SRCS-$(CONFIG_RTE_LIBRTE_MLX5_PMD) += linux/mlx5_socket.c
 SRCS-$(CONFIG_RTE_LIBRTE_MLX5_PMD) += linux/mlx5_os.c
 SRCS-$(CONFIG_RTE_LIBRTE_MLX5_PMD) += linux/mlx5_ethdev_os.c
 SRCS-$(CONFIG_RTE_LIBRTE_MLX5_PMD) += linux/mlx5_verbs.c
+SRCS-$(CONFIG_RTE_LIBRTE_MLX5_PMD) += linux/mlx5_mp_os.c
 
 # Basic CFLAGS.
 CFLAGS += -O3
diff --git a/drivers/net/mlx5/linux/meson.build b/drivers/net/mlx5/linux/meson.build
index 14eed03..2def8e3 100644
--- a/drivers/net/mlx5/linux/meson.build
+++ b/drivers/net/mlx5/linux/meson.build
@@ -7,5 +7,6 @@ sources += files(
 	'mlx5_os.c',
 	'mlx5_ethdev_os.c',
 	'mlx5_verbs.c',
+	'mlx5_mp_os.c',
 )
 
diff --git a/drivers/net/mlx5/linux/mlx5_mp_os.c b/drivers/net/mlx5/linux/mlx5_mp_os.c
new file mode 100644
index 0000000..65b0025
--- /dev/null
+++ b/drivers/net/mlx5/linux/mlx5_mp_os.c
@@ -0,0 +1,211 @@
+/* SPDX-License-Identifier: BSD-3-Clause
+ * Copyright 2019 6WIND S.A.
+ * Copyright 2019 Mellanox Technologies, Ltd
+ */
+
+#include <stdio.h>
+#include <time.h>
+
+#include <rte_eal.h>
+#include <rte_ethdev_driver.h>
+#include <rte_string_fns.h>
+
+#include <mlx5_common_mp.h>
+#include <mlx5_common_mr.h>
+
+#include "mlx5.h"
+#include "mlx5_rxtx.h"
+#include "mlx5_utils.h"
+
+int
+mlx5_mp_os_primary_handle(const struct rte_mp_msg *mp_msg, const void *peer)
+{
+	struct rte_mp_msg mp_res;
+	struct mlx5_mp_param *res = (struct mlx5_mp_param *)mp_res.param;
+	const struct mlx5_mp_param *param =
+		(const struct mlx5_mp_param *)mp_msg->param;
+	struct rte_eth_dev *dev;
+	struct mlx5_priv *priv;
+	struct mr_cache_entry entry;
+	uint32_t lkey;
+	int ret;
+
+	MLX5_ASSERT(rte_eal_process_type() == RTE_PROC_PRIMARY);
+	if (!rte_eth_dev_is_valid_port(param->port_id)) {
+		rte_errno = ENODEV;
+		DRV_LOG(ERR, "port %u invalid port ID", param->port_id);
+		return -rte_errno;
+	}
+	dev = &rte_eth_devices[param->port_id];
+	priv = dev->data->dev_private;
+	switch (param->type) {
+	case MLX5_MP_REQ_CREATE_MR:
+		mp_init_msg(&priv->mp_id, &mp_res, param->type);
+		lkey = mlx5_mr_create_primary(priv->sh->pd,
+					      &priv->sh->share_cache,
+					      &entry, param->args.addr,
+					      priv->config.mr_ext_memseg_en);
+		if (lkey == UINT32_MAX)
+			res->result = -rte_errno;
+		ret = rte_mp_reply(&mp_res, peer);
+		break;
+	case MLX5_MP_REQ_VERBS_CMD_FD:
+		mp_init_msg(&priv->mp_id, &mp_res, param->type);
+		mp_res.num_fds = 1;
+		mp_res.fds[0] = ((struct ibv_context *)priv->sh->ctx)->cmd_fd;
+		res->result = 0;
+		ret = rte_mp_reply(&mp_res, peer);
+		break;
+	case MLX5_MP_REQ_QUEUE_STATE_MODIFY:
+		mp_init_msg(&priv->mp_id, &mp_res, param->type);
+		res->result = mlx5_queue_state_modify_primary
+					(dev, &param->args.state_modify);
+		ret = rte_mp_reply(&mp_res, peer);
+		break;
+	default:
+		rte_errno = EINVAL;
+		DRV_LOG(ERR, "port %u invalid mp request type",
+			dev->data->port_id);
+		return -rte_errno;
+	}
+	return ret;
+}
+
+/**
+ * IPC message handler of a secondary process.
+ *
+ * @param[in] dev
+ *   Pointer to Ethernet structure.
+ * @param[in] peer
+ *   Pointer to the peer socket path.
+ *
+ * @return
+ *   0 on success, a negative errno value otherwise and rte_errno is set.
+ */
+int
+mlx5_mp_os_secondary_handle(const struct rte_mp_msg *mp_msg, const void *peer)
+{
+	struct rte_mp_msg mp_res;
+	struct mlx5_mp_param *res = (struct mlx5_mp_param *)mp_res.param;
+	const struct mlx5_mp_param *param =
+		(const struct mlx5_mp_param *)mp_msg->param;
+	struct rte_eth_dev *dev;
+	struct mlx5_priv *priv;
+	int ret;
+
+	MLX5_ASSERT(rte_eal_process_type() == RTE_PROC_SECONDARY);
+	if (!rte_eth_dev_is_valid_port(param->port_id)) {
+		rte_errno = ENODEV;
+		DRV_LOG(ERR, "port %u invalid port ID", param->port_id);
+		return -rte_errno;
+	}
+	dev = &rte_eth_devices[param->port_id];
+	priv = dev->data->dev_private;
+	switch (param->type) {
+	case MLX5_MP_REQ_START_RXTX:
+		DRV_LOG(INFO, "port %u starting datapath", dev->data->port_id);
+		rte_mb();
+		dev->rx_pkt_burst = mlx5_select_rx_function(dev);
+		dev->tx_pkt_burst = mlx5_select_tx_function(dev);
+		mp_init_msg(&priv->mp_id, &mp_res, param->type);
+		res->result = 0;
+		ret = rte_mp_reply(&mp_res, peer);
+		break;
+	case MLX5_MP_REQ_STOP_RXTX:
+		DRV_LOG(INFO, "port %u stopping datapath", dev->data->port_id);
+		dev->rx_pkt_burst = removed_rx_burst;
+		dev->tx_pkt_burst = removed_tx_burst;
+		rte_mb();
+		mp_init_msg(&priv->mp_id, &mp_res, param->type);
+		res->result = 0;
+		ret = rte_mp_reply(&mp_res, peer);
+		break;
+	default:
+		rte_errno = EINVAL;
+		DRV_LOG(ERR, "port %u invalid mp request type",
+			dev->data->port_id);
+		return -rte_errno;
+	}
+	return ret;
+}
+
+/**
+ * Broadcast request of stopping/starting data-path to secondary processes.
+ *
+ * @param[in] dev
+ *   Pointer to Ethernet structure.
+ * @param[in] type
+ *   Request type.
+ */
+static void
+mp_req_on_rxtx(struct rte_eth_dev *dev, enum mlx5_mp_req_type type)
+{
+	struct rte_mp_msg mp_req;
+	struct rte_mp_msg *mp_res;
+	struct rte_mp_reply mp_rep;
+	struct mlx5_mp_param *res;
+	struct timespec ts = {.tv_sec = MLX5_MP_REQ_TIMEOUT_SEC, .tv_nsec = 0};
+	struct mlx5_priv *priv = dev->data->dev_private;
+	int ret;
+	int i;
+
+	MLX5_ASSERT(rte_eal_process_type() == RTE_PROC_PRIMARY);
+	if (!mlx5_shared_data->secondary_cnt)
+		return;
+	if (type != MLX5_MP_REQ_START_RXTX && type != MLX5_MP_REQ_STOP_RXTX) {
+		DRV_LOG(ERR, "port %u unknown request (req_type %d)",
+			dev->data->port_id, type);
+		return;
+	}
+	mp_init_msg(&priv->mp_id, &mp_req, type);
+	ret = rte_mp_request_sync(&mp_req, &mp_rep, &ts);
+	if (ret) {
+		if (rte_errno != ENOTSUP)
+			DRV_LOG(ERR, "port %u failed to request stop/start Rx/Tx (%d)",
+				dev->data->port_id, type);
+		goto exit;
+	}
+	if (mp_rep.nb_sent != mp_rep.nb_received) {
+		DRV_LOG(ERR,
+			"port %u not all secondaries responded (req_type %d)",
+			dev->data->port_id, type);
+		goto exit;
+	}
+	for (i = 0; i < mp_rep.nb_received; i++) {
+		mp_res = &mp_rep.msgs[i];
+		res = (struct mlx5_mp_param *)mp_res->param;
+		if (res->result) {
+			DRV_LOG(ERR, "port %u request failed on secondary #%d",
+				dev->data->port_id, i);
+			goto exit;
+		}
+	}
+exit:
+	free(mp_rep.msgs);
+}
+
+/**
+ * Broadcast request of starting data-path to secondary processes. The request
+ * is synchronous.
+ *
+ * @param[in] dev
+ *   Pointer to Ethernet structure.
+ */
+void
+mlx5_mp_os_req_start_rxtx(struct rte_eth_dev *dev)
+{
+	mp_req_on_rxtx(dev, MLX5_MP_REQ_START_RXTX);
+}
+
+/**
+ * Broadcast request of stopping data-path to secondary processes. The request
+ * is synchronous.
+ *
+ * @param[in] dev
+ *   Pointer to Ethernet structure.
+ */
+void
+mlx5_mp_os_req_stop_rxtx(struct rte_eth_dev *dev)
+{
+	mp_req_on_rxtx(dev, MLX5_MP_REQ_STOP_RXTX);
+}
diff --git a/drivers/net/mlx5/linux/mlx5_os.c b/drivers/net/mlx5/linux/mlx5_os.c
index a853219..2385d69 100644
--- a/drivers/net/mlx5/linux/mlx5_os.c
+++ b/drivers/net/mlx5/linux/mlx5_os.c
@@ -66,6 +66,14 @@
 #define MLX5DV_CONTEXT_FLAGS_CQE_128B_COMP (1 << 4)
 #endif
 
+static const char *MZ_MLX5_PMD_SHARED_DATA = "mlx5_pmd_shared_data";
+
+/* Spinlock for mlx5_shared_data allocation. */
+static rte_spinlock_t mlx5_shared_data_lock = RTE_SPINLOCK_INITIALIZER;
+
+/* Process local data for secondary processes. */
+static struct mlx5_local_data mlx5_local_data;
+
 /**
  * Get mlx5 device attributes. The glue function query_device_ex() is called
  * with out parameter of type 'struct ibv_device_attr_ex *'. Then fill in mlx5
@@ -356,6 +364,109 @@ mlx5_os_free_shared_dr(struct mlx5_priv *priv)
 }
 
 /**
+ * Initialize shared data between primary and secondary process.
+ *
+ * A memzone is reserved by primary process and secondary processes attach to
+ * the memzone.
+ *
+ * @return
+ *   0 on success, a negative errno value otherwise and rte_errno is set.
+ */
+static int
+mlx5_init_shared_data(void)
+{
+	const struct rte_memzone *mz;
+	int ret = 0;
+
+	rte_spinlock_lock(&mlx5_shared_data_lock);
+	if (mlx5_shared_data == NULL) {
+		if (rte_eal_process_type() == RTE_PROC_PRIMARY) {
+			/* Allocate shared memory. */
+			mz = rte_memzone_reserve(MZ_MLX5_PMD_SHARED_DATA,
+						 sizeof(*mlx5_shared_data),
+						 SOCKET_ID_ANY, 0);
+			if (mz == NULL) {
+				DRV_LOG(ERR,
+					"Cannot allocate mlx5 shared data");
+				ret = -rte_errno;
+				goto error;
+			}
+			mlx5_shared_data = mz->addr;
+			memset(mlx5_shared_data, 0, sizeof(*mlx5_shared_data));
+			rte_spinlock_init(&mlx5_shared_data->lock);
+		} else {
+			/* Lookup allocated shared memory. */
+			mz = rte_memzone_lookup(MZ_MLX5_PMD_SHARED_DATA);
+			if (mz == NULL) {
+				DRV_LOG(ERR,
+					"Cannot attach mlx5 shared data");
+				ret = -rte_errno;
+				goto error;
+			}
+			mlx5_shared_data = mz->addr;
+			memset(&mlx5_local_data, 0, sizeof(mlx5_local_data));
+		}
+	}
+error:
+	rte_spinlock_unlock(&mlx5_shared_data_lock);
+	return ret;
+}
+
+/**
+ * PMD global initialization.
+ *
+ * Independent from individual device, this function initializes global
+ * per-PMD data structures distinguishing primary and secondary processes.
+ * Hence, each initialization is called once per a process.
+ *
+ * @return
+ *   0 on success, a negative errno value otherwise and rte_errno is set.
+ */
+static int
+mlx5_init_once(void)
+{
+	struct mlx5_shared_data *sd;
+	struct mlx5_local_data *ld = &mlx5_local_data;
+	int ret = 0;
+
+	if (mlx5_init_shared_data())
+		return -rte_errno;
+	sd = mlx5_shared_data;
+	MLX5_ASSERT(sd);
+	rte_spinlock_lock(&sd->lock);
+	switch (rte_eal_process_type()) {
+	case RTE_PROC_PRIMARY:
+		if (sd->init_done)
+			break;
+		LIST_INIT(&sd->mem_event_cb_list);
+		rte_rwlock_init(&sd->mem_event_rwlock);
+		rte_mem_event_callback_register("MLX5_MEM_EVENT_CB",
+						mlx5_mr_mem_event_cb, NULL);
+		ret = mlx5_mp_init_primary(MLX5_MP_NAME,
+					   mlx5_mp_os_primary_handle);
+		if (ret)
+			goto out;
+		sd->init_done = true;
+		break;
+	case RTE_PROC_SECONDARY:
+		if (ld->init_done)
+			break;
+		ret = mlx5_mp_init_secondary(MLX5_MP_NAME,
+					     mlx5_mp_os_secondary_handle);
+		if (ret)
+			goto out;
+		++sd->secondary_cnt;
+		ld->init_done = true;
+		break;
+	default:
+		break;
+	}
+out:
+	rte_spinlock_unlock(&sd->lock);
+	return ret;
+}
+
+/**
  * Spawn an Ethernet device from Verbs information.
  *
  * @param dpdk_dev
diff --git a/drivers/net/mlx5/meson.build b/drivers/net/mlx5/meson.build
index e95ce02..c8dcb76 100644
--- a/drivers/net/mlx5/meson.build
+++ b/drivers/net/mlx5/meson.build
@@ -22,7 +22,6 @@ sources = files(
 	'mlx5_rxmode.c',
 	'mlx5_rxq.c',
 	'mlx5_rxtx.c',
-	'mlx5_mp.c',
 	'mlx5_stats.c',
 	'mlx5_trigger.c',
 	'mlx5_txq.c',
diff --git a/drivers/net/mlx5/mlx5.c b/drivers/net/mlx5/mlx5.c
index 0c654ed..10a0306 100644
--- a/drivers/net/mlx5/mlx5.c
+++ b/drivers/net/mlx5/mlx5.c
@@ -167,16 +167,11 @@
 /* Flow memory reclaim mode. */
 #define MLX5_RECLAIM_MEM "reclaim_mem_mode"
 
-static const char *MZ_MLX5_PMD_SHARED_DATA = "mlx5_pmd_shared_data";
-
 /* Shared memory between primary and secondary processes. */
 struct mlx5_shared_data *mlx5_shared_data;
 
-/* Spinlock for mlx5_shared_data allocation. */
-static rte_spinlock_t mlx5_shared_data_lock = RTE_SPINLOCK_INITIALIZER;
-
-/* Process local data for secondary processes. */
-static struct mlx5_local_data mlx5_local_data;
+/** Driver-specific log messages type. */
+int mlx5_logtype;
 
 static LIST_HEAD(, mlx5_dev_ctx_shared) mlx5_dev_ctx_list =
 						LIST_HEAD_INITIALIZER();
@@ -966,55 +961,6 @@ mlx5_alloc_table_hash_list(struct mlx5_priv *priv)
 }
 
 /**
- * Initialize shared data between primary and secondary process.
- *
- * A memzone is reserved by primary process and secondary processes attach to
- * the memzone.
- *
- * @return
- *   0 on success, a negative errno value otherwise and rte_errno is set.
- */
-static int
-mlx5_init_shared_data(void)
-{
-	const struct rte_memzone *mz;
-	int ret = 0;
-
-	rte_spinlock_lock(&mlx5_shared_data_lock);
-	if (mlx5_shared_data == NULL) {
-		if (rte_eal_process_type() == RTE_PROC_PRIMARY) {
-			/* Allocate shared memory. */
-			mz = rte_memzone_reserve(MZ_MLX5_PMD_SHARED_DATA,
-						 sizeof(*mlx5_shared_data),
-						 SOCKET_ID_ANY, 0);
-			if (mz == NULL) {
-				DRV_LOG(ERR,
-					"Cannot allocate mlx5 shared data");
-				ret = -rte_errno;
-				goto error;
-			}
-			mlx5_shared_data = mz->addr;
-			memset(mlx5_shared_data, 0, sizeof(*mlx5_shared_data));
-			rte_spinlock_init(&mlx5_shared_data->lock);
-		} else {
-			/* Lookup allocated shared memory. */
-			mz = rte_memzone_lookup(MZ_MLX5_PMD_SHARED_DATA);
-			if (mz == NULL) {
-				DRV_LOG(ERR,
-					"Cannot attach mlx5 shared data");
-				ret = -rte_errno;
-				goto error;
-			}
-			mlx5_shared_data = mz->addr;
-			memset(&mlx5_local_data, 0, sizeof(mlx5_local_data));
-		}
-	}
-error:
-	rte_spinlock_unlock(&mlx5_shared_data_lock);
-	return ret;
-}
-
-/**
  * Retrieve integer value from environment variable.
  *
  * @param[in] name
@@ -1155,7 +1101,7 @@ mlx5_dev_close(struct rte_eth_dev *dev)
 	dev->tx_pkt_burst = removed_tx_burst;
 	rte_wmb();
 	/* Disable datapath on secondary process. */
-	mlx5_mp_req_stop_rxtx(dev);
+	mlx5_mp_os_req_stop_rxtx(dev);
 	if (priv->rxqs != NULL) {
 		/* XXX race condition if mlx5_rx_burst() is still running. */
 		usleep(1000);
@@ -1461,60 +1407,6 @@ mlx5_args(struct mlx5_dev_config *config, struct rte_devargs *devargs)
 }
 
 /**
- * PMD global initialization.
- *
- * Independent from individual device, this function initializes global
- * per-PMD data structures distinguishing primary and secondary processes.
- * Hence, each initialization is called once per a process.
- *
- * @return
- *   0 on success, a negative errno value otherwise and rte_errno is set.
- */
-int
-mlx5_init_once(void)
-{
-	struct mlx5_shared_data *sd;
-	struct mlx5_local_data *ld = &mlx5_local_data;
-	int ret = 0;
-
-	if (mlx5_init_shared_data())
-		return -rte_errno;
-	sd = mlx5_shared_data;
-	MLX5_ASSERT(sd);
-	rte_spinlock_lock(&sd->lock);
-	switch (rte_eal_process_type()) {
-	case RTE_PROC_PRIMARY:
-		if (sd->init_done)
-			break;
-		LIST_INIT(&sd->mem_event_cb_list);
-		rte_rwlock_init(&sd->mem_event_rwlock);
-		rte_mem_event_callback_register("MLX5_MEM_EVENT_CB",
-						mlx5_mr_mem_event_cb, NULL);
-		ret = mlx5_mp_init_primary(MLX5_MP_NAME,
-					   mlx5_mp_primary_handle);
-		if (ret)
-			goto out;
-		sd->init_done = true;
-		break;
-	case RTE_PROC_SECONDARY:
-		if (ld->init_done)
-			break;
-		ret = mlx5_mp_init_secondary(MLX5_MP_NAME,
-					     mlx5_mp_secondary_handle);
-		if (ret)
-			goto out;
-		++sd->secondary_cnt;
-		ld->init_done = true;
-		break;
-	default:
-		break;
-	}
-out:
-	rte_spinlock_unlock(&sd->lock);
-	return ret;
-}
-
-/**
  * Configures the minimal amount of data to inline into WQE
  * while sending packets.
  *
diff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h
index 87cfbfe..fa223a1 100644
--- a/drivers/net/mlx5/mlx5.h
+++ b/drivers/net/mlx5/mlx5.h
@@ -710,7 +710,6 @@ void mlx5_set_min_inline(struct mlx5_dev_spawn_data *spawn,
 void mlx5_set_metadata_mask(struct rte_eth_dev *dev);
 int mlx5_dev_check_sibling_config(struct mlx5_priv *priv,
 				  struct mlx5_dev_config *config);
-int mlx5_init_once(void);
 int mlx5_dev_configure(struct rte_eth_dev *dev);
 int mlx5_dev_infos_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *info);
 int mlx5_fw_version_get(struct rte_eth_dev *dev, char *fw_ver, size_t fw_size);
@@ -893,11 +892,13 @@ void mlx5_flow_rxq_dynf_metadata_set(struct rte_eth_dev *dev);
 int mlx5_flow_get_aged_flows(struct rte_eth_dev *dev, void **contexts,
 			uint32_t nb_contexts, struct rte_flow_error *error);
 
-/* mlx5_mp.c */
-int mlx5_mp_primary_handle(const struct rte_mp_msg *mp_msg, const void *peer);
-int mlx5_mp_secondary_handle(const struct rte_mp_msg *mp_msg, const void *peer);
-void mlx5_mp_req_start_rxtx(struct rte_eth_dev *dev);
-void mlx5_mp_req_stop_rxtx(struct rte_eth_dev *dev);
+/* mlx5_mp_os.c */
+int mlx5_mp_os_primary_handle(const struct rte_mp_msg *mp_msg,
+			      const void *peer);
+int mlx5_mp_os_secondary_handle(const struct rte_mp_msg *mp_msg,
+				const void *peer);
+void mlx5_mp_os_req_start_rxtx(struct rte_eth_dev *dev);
+void mlx5_mp_os_req_stop_rxtx(struct rte_eth_dev *dev);
 
 /* mlx5_socket.c */
 
diff --git a/drivers/net/mlx5/mlx5_mp.c b/drivers/net/mlx5/mlx5_mp.c
deleted file mode 100644
index a2b5c40..0000000
--- a/drivers/net/mlx5/mlx5_mp.c
+++ /dev/null
@@ -1,211 +0,0 @@
-/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright 2019 6WIND S.A.
- * Copyright 2019 Mellanox Technologies, Ltd
- */
-
-#include <stdio.h>
-#include <time.h>
-
-#include <rte_eal.h>
-#include <rte_ethdev_driver.h>
-#include <rte_string_fns.h>
-
-#include <mlx5_common_mp.h>
-#include <mlx5_common_mr.h>
-
-#include "mlx5.h"
-#include "mlx5_rxtx.h"
-#include "mlx5_utils.h"
-
-int
-mlx5_mp_primary_handle(const struct rte_mp_msg *mp_msg, const void *peer)
-{
-	struct rte_mp_msg mp_res;
-	struct mlx5_mp_param *res = (struct mlx5_mp_param *)mp_res.param;
-	const struct mlx5_mp_param *param =
-		(const struct mlx5_mp_param *)mp_msg->param;
-	struct rte_eth_dev *dev;
-	struct mlx5_priv *priv;
-	struct mr_cache_entry entry;
-	uint32_t lkey;
-	int ret;
-
-	MLX5_ASSERT(rte_eal_process_type() == RTE_PROC_PRIMARY);
-	if (!rte_eth_dev_is_valid_port(param->port_id)) {
-		rte_errno = ENODEV;
-		DRV_LOG(ERR, "port %u invalid port ID", param->port_id);
-		return -rte_errno;
-	}
-	dev = &rte_eth_devices[param->port_id];
-	priv = dev->data->dev_private;
-	switch (param->type) {
-	case MLX5_MP_REQ_CREATE_MR:
-		mp_init_msg(&priv->mp_id, &mp_res, param->type);
-		lkey = mlx5_mr_create_primary(priv->sh->pd,
-					      &priv->sh->share_cache,
-					      &entry, param->args.addr,
-					      priv->config.mr_ext_memseg_en);
-		if (lkey == UINT32_MAX)
-			res->result = -rte_errno;
-		ret = rte_mp_reply(&mp_res, peer);
-		break;
-	case MLX5_MP_REQ_VERBS_CMD_FD:
-		mp_init_msg(&priv->mp_id, &mp_res, param->type);
-		mp_res.num_fds = 1;
-		mp_res.fds[0] = ((struct ibv_context *)priv->sh->ctx)->cmd_fd;
-		res->result = 0;
-		ret = rte_mp_reply(&mp_res, peer);
-		break;
-	case MLX5_MP_REQ_QUEUE_STATE_MODIFY:
-		mp_init_msg(&priv->mp_id, &mp_res, param->type);
-		res->result = mlx5_queue_state_modify_primary
-					(dev, &param->args.state_modify);
-		ret = rte_mp_reply(&mp_res, peer);
-		break;
-	default:
-		rte_errno = EINVAL;
-		DRV_LOG(ERR, "port %u invalid mp request type",
-			dev->data->port_id);
-		return -rte_errno;
-	}
-	return ret;
-}
-
-/**
- * IPC message handler of a secondary process.
- *
- * @param[in] dev
- *   Pointer to Ethernet structure.
- * @param[in] peer
- *   Pointer to the peer socket path.
- *
- * @return
- *   0 on success, a negative errno value otherwise and rte_errno is set.
- */
-int
-mlx5_mp_secondary_handle(const struct rte_mp_msg *mp_msg, const void *peer)
-{
-	struct rte_mp_msg mp_res;
-	struct mlx5_mp_param *res = (struct mlx5_mp_param *)mp_res.param;
-	const struct mlx5_mp_param *param =
-		(const struct mlx5_mp_param *)mp_msg->param;
-	struct rte_eth_dev *dev;
-	struct mlx5_priv *priv;
-	int ret;
-
-	MLX5_ASSERT(rte_eal_process_type() == RTE_PROC_SECONDARY);
-	if (!rte_eth_dev_is_valid_port(param->port_id)) {
-		rte_errno = ENODEV;
-		DRV_LOG(ERR, "port %u invalid port ID", param->port_id);
-		return -rte_errno;
-	}
-	dev = &rte_eth_devices[param->port_id];
-	priv = dev->data->dev_private;
-	switch (param->type) {
-	case MLX5_MP_REQ_START_RXTX:
-		DRV_LOG(INFO, "port %u starting datapath", dev->data->port_id);
-		rte_mb();
-		dev->rx_pkt_burst = mlx5_select_rx_function(dev);
-		dev->tx_pkt_burst = mlx5_select_tx_function(dev);
-		mp_init_msg(&priv->mp_id, &mp_res, param->type);
-		res->result = 0;
-		ret = rte_mp_reply(&mp_res, peer);
-		break;
-	case MLX5_MP_REQ_STOP_RXTX:
-		DRV_LOG(INFO, "port %u stopping datapath", dev->data->port_id);
-		dev->rx_pkt_burst = removed_rx_burst;
-		dev->tx_pkt_burst = removed_tx_burst;
-		rte_mb();
-		mp_init_msg(&priv->mp_id, &mp_res, param->type);
-		res->result = 0;
-		ret = rte_mp_reply(&mp_res, peer);
-		break;
-	default:
-		rte_errno = EINVAL;
-		DRV_LOG(ERR, "port %u invalid mp request type",
-			dev->data->port_id);
-		return -rte_errno;
-	}
-	return ret;
-}
-
-/**
- * Broadcast request of stopping/starting data-path to secondary processes.
- *
- * @param[in] dev
- *   Pointer to Ethernet structure.
- * @param[in] type
- *   Request type.
- */
-static void
-mp_req_on_rxtx(struct rte_eth_dev *dev, enum mlx5_mp_req_type type)
-{
-	struct rte_mp_msg mp_req;
-	struct rte_mp_msg *mp_res;
-	struct rte_mp_reply mp_rep;
-	struct mlx5_mp_param *res;
-	struct timespec ts = {.tv_sec = MLX5_MP_REQ_TIMEOUT_SEC, .tv_nsec = 0};
-	struct mlx5_priv *priv = dev->data->dev_private;
-	int ret;
-	int i;
-
-	MLX5_ASSERT(rte_eal_process_type() == RTE_PROC_PRIMARY);
-	if (!mlx5_shared_data->secondary_cnt)
-		return;
-	if (type != MLX5_MP_REQ_START_RXTX && type != MLX5_MP_REQ_STOP_RXTX) {
-		DRV_LOG(ERR, "port %u unknown request (req_type %d)",
-			dev->data->port_id, type);
-		return;
-	}
-	mp_init_msg(&priv->mp_id, &mp_req, type);
-	ret = rte_mp_request_sync(&mp_req, &mp_rep, &ts);
-	if (ret) {
-		if (rte_errno != ENOTSUP)
-			DRV_LOG(ERR, "port %u failed to request stop/start Rx/Tx (%d)",
-				dev->data->port_id, type);
-		goto exit;
-	}
-	if (mp_rep.nb_sent != mp_rep.nb_received) {
-		DRV_LOG(ERR,
-			"port %u not all secondaries responded (req_type %d)",
-			dev->data->port_id, type);
-		goto exit;
-	}
-	for (i = 0; i < mp_rep.nb_received; i++) {
-		mp_res = &mp_rep.msgs[i];
-		res = (struct mlx5_mp_param *)mp_res->param;
-		if (res->result) {
-			DRV_LOG(ERR, "port %u request failed on secondary #%d",
-				dev->data->port_id, i);
-			goto exit;
-		}
-	}
-exit:
-	free(mp_rep.msgs);
-}
-
-/**
- * Broadcast request of starting data-path to secondary processes. The request
- * is synchronous.
- *
- * @param[in] dev
- *   Pointer to Ethernet structure.
- */
-void
-mlx5_mp_req_start_rxtx(struct rte_eth_dev *dev)
-{
-	mp_req_on_rxtx(dev, MLX5_MP_REQ_START_RXTX);
-}
-
-/**
- * Broadcast request of stopping data-path to secondary processes. The request
- * is synchronous.
- *
- * @param[in] dev
- *   Pointer to Ethernet structure.
- */
-void
-mlx5_mp_req_stop_rxtx(struct rte_eth_dev *dev)
-{
-	mp_req_on_rxtx(dev, MLX5_MP_REQ_STOP_RXTX);
-}
diff --git a/drivers/net/mlx5/mlx5_trigger.c b/drivers/net/mlx5/mlx5_trigger.c
index ef74609..360fd6f 100644
--- a/drivers/net/mlx5/mlx5_trigger.c
+++ b/drivers/net/mlx5/mlx5_trigger.c
@@ -340,7 +340,7 @@ mlx5_dev_start(struct rte_eth_dev *dev)
 	dev->tx_pkt_burst = mlx5_select_tx_function(dev);
 	dev->rx_pkt_burst = mlx5_select_rx_function(dev);
 	/* Enable datapath on secondary process. */
-	mlx5_mp_req_start_rxtx(dev);
+	mlx5_mp_os_req_start_rxtx(dev);
 	if (priv->sh->intr_handle.fd >= 0) {
 		priv->sh->port[priv->dev_port - 1].ih_port_id =
 					(uint32_t)dev->data->port_id;
@@ -385,7 +385,7 @@ mlx5_dev_stop(struct rte_eth_dev *dev)
 	dev->tx_pkt_burst = removed_tx_burst;
 	rte_wmb();
 	/* Disable datapath on secondary process. */
-	mlx5_mp_req_stop_rxtx(dev);
+	mlx5_mp_os_req_stop_rxtx(dev);
 	usleep(1000 * priv->rxqs_n);
 	DRV_LOG(DEBUG, "port %u stopping device", dev->data->port_id);
 	mlx5_flow_stop_default(dev);
