/* SPDX-License-Identifier: BSD-3-Clause
- * Copyright(c) 2018-2019 Hisilicon Limited.
+ * Copyright(c) 2018-2021 HiSilicon Limited.
*/
#include <rte_eal.h>
-#include <rte_ethdev_driver.h>
+#include <ethdev_driver.h>
#include <rte_string_fns.h>
#include <rte_io.h>
struct hns3_mp_param *res = (struct hns3_mp_param *)mp_res.param;
const struct hns3_mp_param *param =
(const struct hns3_mp_param *)mp_msg->param;
+ eth_tx_prep_t prep = NULL;
struct rte_eth_dev *dev;
int ret;
if (!rte_eth_dev_is_valid_port(param->port_id)) {
rte_errno = ENODEV;
- PMD_INIT_LOG(ERR, "port %u invalid port ID", param->port_id);
+ PMD_INIT_LOG(ERR, "port %d invalid port ID", param->port_id);
return -rte_errno;
}
dev = &rte_eth_devices[param->port_id];
case HNS3_MP_REQ_START_RXTX:
PMD_INIT_LOG(INFO, "port %u starting datapath",
dev->data->port_id);
- rte_mb();
hns3_set_rxtx_function(dev);
- mp_init_msg(dev, &mp_res, param->type);
- res->result = 0;
- ret = rte_mp_reply(&mp_res, peer);
break;
case HNS3_MP_REQ_STOP_RXTX:
PMD_INIT_LOG(INFO, "port %u stopping datapath",
dev->data->port_id);
hns3_set_rxtx_function(dev);
- rte_mb();
- mp_init_msg(dev, &mp_res, param->type);
- res->result = 0;
- ret = rte_mp_reply(&mp_res, peer);
+ break;
+ case HNS3_MP_REQ_START_TX:
+ PMD_INIT_LOG(INFO, "port %u starting Tx datapath",
+ dev->data->port_id);
+ dev->tx_pkt_burst = hns3_get_tx_function(dev, &prep);
+ dev->tx_pkt_prepare = prep;
+ break;
+ case HNS3_MP_REQ_STOP_TX:
+ PMD_INIT_LOG(INFO, "port %u stopping Tx datapath",
+ dev->data->port_id);
+ dev->tx_pkt_burst = hns3_dummy_rxtx_burst;
+ dev->tx_pkt_prepare = NULL;
break;
default:
rte_errno = EINVAL;
dev->data->port_id);
return -rte_errno;
}
+
+ rte_mb();
+ mp_init_msg(dev, &mp_res, param->type);
+ res->result = 0;
+ ret = rte_mp_reply(&mp_res, peer);
+
return ret;
}
+static bool
+mp_req_type_is_valid(enum hns3_mp_req_type type)
+{
+ return type == HNS3_MP_REQ_START_RXTX ||
+ type == HNS3_MP_REQ_STOP_RXTX ||
+ type == HNS3_MP_REQ_START_TX ||
+ type == HNS3_MP_REQ_STOP_TX;
+}
+
/*
* Broadcast request of stopping/starting data-path to secondary processes.
*
int ret;
int i;
- if (!hw->secondary_cnt)
+ if (rte_eal_process_type() == RTE_PROC_SECONDARY || !hw->secondary_cnt)
return;
- if (type != HNS3_MP_REQ_START_RXTX && type != HNS3_MP_REQ_STOP_RXTX) {
+ if (!mp_req_type_is_valid(type)) {
hns3_err(hw, "port %u unknown request (req_type %d)",
dev->data->port_id, type);
return;
mp_req_on_rxtx(dev, HNS3_MP_REQ_STOP_RXTX);
}
+void
+hns3_mp_req_stop_tx(struct rte_eth_dev *dev)
+{
+ mp_req_on_rxtx(dev, HNS3_MP_REQ_STOP_TX);
+}
+
+void
+hns3_mp_req_start_tx(struct rte_eth_dev *dev)
+{
+ mp_req_on_rxtx(dev, HNS3_MP_REQ_START_TX);
+}
+
/*
* Initialize by primary process.
*/