[v2] net/dpaa2: release port upon close
Checks
Commit Message
From: Sachin Saxena <sachin.saxena@oss.nxp.com>
With removal of old close behavior, the private
port resources must be released in the .dev_close callback.
Freeing of port private resources is moved from
the ".remove(device)" to the ".dev_close(port)" operation
Signed-off-by: Sachin Saxena <sachin.saxena@oss.nxp.com>
---
drivers/net/dpaa2/dpaa2_ethdev.c | 83 ++++++++++++--------------------
1 file changed, 32 insertions(+), 51 deletions(-)
@@ -99,7 +99,6 @@ static const enum rte_filter_op dpaa2_supported_filter_ops[] = {
};
static struct rte_dpaa2_driver rte_dpaa2_pmd;
-static int dpaa2_dev_uninit(struct rte_eth_dev *eth_dev);
static int dpaa2_dev_link_update(struct rte_eth_dev *dev,
int wait_to_complete);
static int dpaa2_dev_set_link_up(struct rte_eth_dev *dev);
@@ -1241,7 +1240,7 @@ dpaa2_dev_close(struct rte_eth_dev *dev)
{
struct dpaa2_dev_priv *priv = dev->data->dev_private;
struct fsl_mc_io *dpni = (struct fsl_mc_io *)dev->process_private;
- int ret;
+ int i, ret;
struct rte_eth_link link;
PMD_INIT_FUNC_TRACE();
@@ -1249,8 +1248,12 @@ dpaa2_dev_close(struct rte_eth_dev *dev)
if (rte_eal_process_type() != RTE_PROC_PRIMARY)
return 0;
- dpaa2_flow_clean(dev);
+ if (!dpni) {
+ DPAA2_PMD_WARN("Already closed or not started");
+ return -1;
+ }
+ dpaa2_flow_clean(dev);
/* Clean the device first */
ret = dpni_reset(dpni, CMD_PRI_LOW, priv->token);
if (ret) {
@@ -1261,6 +1264,27 @@ dpaa2_dev_close(struct rte_eth_dev *dev)
memset(&link, 0, sizeof(link));
rte_eth_linkstatus_set(dev, &link);
+ /* Free private queues memory */
+ dpaa2_free_rx_tx_queues(dev);
+ /* Close the device at underlying layer*/
+ ret = dpni_close(dpni, CMD_PRI_LOW, priv->token);
+ if (ret) {
+ DPAA2_PMD_ERR("Failure closing dpni device with err code %d",
+ ret);
+ }
+
+ /* Free the allocated memory for ethernet private data and dpni*/
+ priv->hw = NULL;
+ dev->process_private = NULL;
+ rte_free(dpni);
+
+ for (i = 0; i < MAX_TCS; i++)
+ rte_free((void *)(size_t)priv->extract.tc_extract_param[i]);
+
+ if (priv->extract.qos_extract_param)
+ rte_free((void *)(size_t)priv->extract.qos_extract_param);
+
+ DPAA2_PMD_INFO("%s: netdev deleted", dev->data->name);
return 0;
}
@@ -2712,52 +2736,9 @@ dpaa2_dev_init(struct rte_eth_dev *eth_dev)
RTE_LOG(INFO, PMD, "%s: netdev created\n", eth_dev->data->name);
return 0;
init_err:
- dpaa2_dev_uninit(eth_dev);
- return ret;
-}
-
-static int
-dpaa2_dev_uninit(struct rte_eth_dev *eth_dev)
-{
- struct dpaa2_dev_priv *priv = eth_dev->data->dev_private;
- struct fsl_mc_io *dpni = (struct fsl_mc_io *)eth_dev->process_private;
- int i, ret;
-
- PMD_INIT_FUNC_TRACE();
-
- if (rte_eal_process_type() != RTE_PROC_PRIMARY)
- return 0;
-
- if (!dpni) {
- DPAA2_PMD_WARN("Already closed or not started");
- return -1;
- }
-
dpaa2_dev_close(eth_dev);
- dpaa2_free_rx_tx_queues(eth_dev);
-
- /* Close the device at underlying layer*/
- ret = dpni_close(dpni, CMD_PRI_LOW, priv->token);
- if (ret) {
- DPAA2_PMD_ERR(
- "Failure closing dpni device with err code %d",
- ret);
- }
-
- /* Free the allocated memory for ethernet private data and dpni*/
- priv->hw = NULL;
- eth_dev->process_private = NULL;
- rte_free(dpni);
-
- for (i = 0; i < MAX_TCS; i++)
- rte_free((void *)(size_t)priv->extract.tc_extract_param[i]);
-
- if (priv->extract.qos_extract_param)
- rte_free((void *)(size_t)priv->extract.qos_extract_param);
-
- DPAA2_PMD_INFO("%s: netdev deleted", eth_dev->data->name);
- return 0;
+ return ret;
}
static int
@@ -2826,13 +2807,13 @@ static int
rte_dpaa2_remove(struct rte_dpaa2_device *dpaa2_dev)
{
struct rte_eth_dev *eth_dev;
+ int ret;
eth_dev = dpaa2_dev->eth_dev;
- dpaa2_dev_uninit(eth_dev);
-
- rte_eth_dev_release_port(eth_dev);
+ dpaa2_dev_close(eth_dev);
+ ret = rte_eth_dev_release_port(eth_dev);
- return 0;
+ return ret;
}
static struct rte_dpaa2_driver rte_dpaa2_pmd = {