X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=drivers%2Fnet%2Fhns3%2Fhns3_mp.c;h=e74ddea1957d0efcbe9c573e70e490a1e2fdf5ba;hb=ae5f21f287aa680843363fe526920b70fb8e1fb5;hp=6d33bf49cda8f876f3b6fa4252c2f04cacefa2d4;hpb=443242212baeb67d298c54cc927553c92aa29bec;p=dpdk.git diff --git a/drivers/net/hns3/hns3_mp.c b/drivers/net/hns3/hns3_mp.c index 6d33bf49cd..e74ddea195 100644 --- a/drivers/net/hns3/hns3_mp.c +++ b/drivers/net/hns3/hns3_mp.c @@ -13,7 +13,7 @@ #include "hns3_mp.h" /* local data for primary or secondary process. */ -struct hns3_process_local_data process_data; +static struct hns3_process_local_data process_data; /* * Initialize IPC message. @@ -74,7 +74,6 @@ mp_secondary_handle(const struct rte_mp_msg *mp_msg, const void *peer) 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; @@ -98,14 +97,12 @@ mp_secondary_handle(const struct rte_mp_msg *mp_msg, const void *peer) 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; + hns3_start_tx_datapath(dev); 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; + hns3_stop_tx_datapath(dev); break; default: rte_errno = EINVAL; @@ -227,7 +224,8 @@ hns3_mp_req_start_tx(struct rte_eth_dev *dev) /* * Initialize by primary process. */ -int hns3_mp_init_primary(void) +static int +hns3_mp_init_primary(void) { int ret; @@ -244,20 +242,11 @@ int hns3_mp_init_primary(void) return 0; } -void hns3_mp_uninit(void) -{ - process_data.eth_dev_cnt--; - - if (process_data.eth_dev_cnt == 0) { - rte_mp_action_unregister(HNS3_MP_NAME); - process_data.init_done = false; - } -} - /* * Initialize by secondary process. */ -int hns3_mp_init_secondary(void) +static int +hns3_mp_init_secondary(void) { int ret; @@ -265,10 +254,52 @@ int hns3_mp_init_secondary(void) return 0; ret = rte_mp_action_register(HNS3_MP_NAME, mp_secondary_handle); - if (ret) + if (ret && rte_errno != ENOTSUP) return ret; process_data.init_done = true; return 0; } + +int +hns3_mp_init(struct rte_eth_dev *dev) +{ + struct hns3_hw *hw = HNS3_DEV_PRIVATE_TO_HW(dev->data->dev_private); + int ret; + + if (rte_eal_process_type() != RTE_PROC_PRIMARY) { + ret = hns3_mp_init_secondary(); + if (ret) { + PMD_INIT_LOG(ERR, "Failed to init for secondary process, ret = %d", + ret); + return ret; + } + __atomic_fetch_add(&hw->secondary_cnt, 1, __ATOMIC_RELAXED); + } else { + ret = hns3_mp_init_primary(); + if (ret) { + PMD_INIT_LOG(ERR, "Failed to init for primary process, ret = %d", + ret); + return ret; + } + } + + process_data.eth_dev_cnt++; + + return 0; +} + +void hns3_mp_uninit(struct rte_eth_dev *dev) +{ + struct hns3_hw *hw = HNS3_DEV_PRIVATE_TO_HW(dev->data->dev_private); + + if (rte_eal_process_type() != RTE_PROC_PRIMARY) + __atomic_fetch_sub(&hw->secondary_cnt, 1, __ATOMIC_RELAXED); + + process_data.eth_dev_cnt--; + if (process_data.eth_dev_cnt == 0) { + rte_mp_action_unregister(HNS3_MP_NAME); + process_data.init_done = false; + } +}