Remove the 'eth_dev' field in process shared data 'struct
nfp_net_hw', and modify the related logic.

Signed-off-by: Chaoyong He <chaoyong...@corigine.com>
Reviewed-by: Long Wu <long...@corigine.com>
Reviewed-by: Peng Zhang <peng.zh...@corigine.com>
---
 drivers/net/nfp/flower/nfp_flower.c           | 16 ++--
 drivers/net/nfp/flower/nfp_flower.h           |  2 +
 drivers/net/nfp/flower/nfp_flower_ctrl.c      |  8 +-
 drivers/net/nfp/flower/nfp_flower_flow.c      | 16 ++--
 .../net/nfp/flower/nfp_flower_representor.c   | 76 +++++++++----------
 .../net/nfp/flower/nfp_flower_representor.h   |  1 -
 drivers/net/nfp/nfp_ethdev.c                  | 36 ++++-----
 drivers/net/nfp/nfp_net_common.h              |  3 -
 8 files changed, 78 insertions(+), 80 deletions(-)

diff --git a/drivers/net/nfp/flower/nfp_flower.c 
b/drivers/net/nfp/flower/nfp_flower.c
index 83249feedb..76e5d674f1 100644
--- a/drivers/net/nfp/flower/nfp_flower.c
+++ b/drivers/net/nfp/flower/nfp_flower.c
@@ -271,15 +271,15 @@ nfp_flower_init_ctrl_vnic(struct nfp_app_fw_flower 
*app_fw_flower,
        }
 
        /* Allocate memory for the eth_dev of the vNIC */
-       hw->eth_dev = rte_zmalloc("nfp_ctrl_vnic",
+       app_fw_flower->ctrl_ethdev = rte_zmalloc("nfp_ctrl_vnic",
                        sizeof(struct rte_eth_dev), RTE_CACHE_LINE_SIZE);
-       if (hw->eth_dev == NULL) {
+       if (app_fw_flower->ctrl_ethdev == NULL) {
                PMD_INIT_LOG(ERR, "Could not allocate ctrl vnic");
                return -ENOMEM;
        }
 
        /* Grab the pointer to the newly created rte_eth_dev here */
-       eth_dev = hw->eth_dev;
+       eth_dev = app_fw_flower->ctrl_ethdev;
 
        /* Also allocate memory for the data part of the eth_dev */
        eth_dev->data = rte_zmalloc("nfp_ctrl_vnic_data",
@@ -529,7 +529,7 @@ nfp_flower_cleanup_ctrl_vnic(struct nfp_app_fw_flower 
*app_fw_flower,
        char ctrl_rxring_name[RTE_MEMZONE_NAMESIZE];
 
        hw = app_fw_flower->ctrl_hw;
-       eth_dev = hw->eth_dev;
+       eth_dev = app_fw_flower->ctrl_ethdev;
 
        pci_name = strchr(hw_priv->pf_dev->pci_dev->name, ':') + 1;
 
@@ -562,15 +562,17 @@ nfp_flower_cleanup_ctrl_vnic(struct nfp_app_fw_flower 
*app_fw_flower,
 }
 
 static int
-nfp_flower_start_ctrl_vnic(struct nfp_net_hw *net_hw)
+nfp_flower_start_ctrl_vnic(struct nfp_app_fw_flower *app_fw_flower)
 {
        int ret;
        uint32_t update;
        uint32_t new_ctrl;
        struct nfp_hw *hw;
        struct rte_eth_dev *dev;
+       struct nfp_net_hw *net_hw;
 
-       dev = net_hw->eth_dev;
+       net_hw = app_fw_flower->ctrl_hw;
+       dev = app_fw_flower->ctrl_ethdev;
        hw = &net_hw->super;
 
        /* Disabling queues just in case... */
@@ -736,7 +738,7 @@ nfp_init_app_fw_flower(struct nfp_net_hw_priv *hw_priv)
        }
 
        /* Start the ctrl vNIC */
-       ret = nfp_flower_start_ctrl_vnic(app_fw_flower->ctrl_hw);
+       ret = nfp_flower_start_ctrl_vnic(app_fw_flower);
        if (ret != 0) {
                PMD_INIT_LOG(ERR, "Could not start flower ctrl vNIC");
                goto ctrl_vnic_cleanup;
diff --git a/drivers/net/nfp/flower/nfp_flower.h 
b/drivers/net/nfp/flower/nfp_flower.h
index 5c2f338a20..ae80782df4 100644
--- a/drivers/net/nfp/flower/nfp_flower.h
+++ b/drivers/net/nfp/flower/nfp_flower.h
@@ -63,12 +63,14 @@ struct nfp_app_fw_flower {
 
        /** Pointer to the PF vNIC */
        struct nfp_net_hw *pf_hw;
+       struct rte_eth_dev *pf_ethdev;
 
        /** Pointer to a mempool for the Ctrl vNIC */
        struct rte_mempool *ctrl_pktmbuf_pool;
 
        /** Pointer to the ctrl vNIC */
        struct nfp_net_hw *ctrl_hw;
+       struct rte_eth_dev *ctrl_ethdev;
 
        /** Ctrl vNIC Rx counter */
        uint64_t ctrl_vnic_rx_count;
diff --git a/drivers/net/nfp/flower/nfp_flower_ctrl.c 
b/drivers/net/nfp/flower/nfp_flower_ctrl.c
index 4c2aeb9849..de6e419cac 100644
--- a/drivers/net/nfp/flower/nfp_flower_ctrl.c
+++ b/drivers/net/nfp/flower/nfp_flower_ctrl.c
@@ -153,12 +153,10 @@ nfp_flower_ctrl_vnic_nfd3_xmit(struct nfp_app_fw_flower 
*app_fw_flower,
        uint32_t free_descs;
        struct rte_mbuf **lmbuf;
        struct nfp_net_txq *txq;
-       struct nfp_net_hw *ctrl_hw;
        struct rte_eth_dev *ctrl_dev;
        struct nfp_net_nfd3_tx_desc *txds;
 
-       ctrl_hw = app_fw_flower->ctrl_hw;
-       ctrl_dev = ctrl_hw->eth_dev;
+       ctrl_dev = app_fw_flower->ctrl_ethdev;
 
        /* Flower ctrl vNIC only has a single tx queue */
        txq = ctrl_dev->data->tx_queues[0];
@@ -232,7 +230,7 @@ nfp_flower_ctrl_vnic_nfdk_xmit(struct nfp_app_fw_flower 
*app_fw_flower,
        struct rte_eth_dev *ctrl_dev;
        struct nfp_net_nfdk_tx_desc *ktxds;
 
-       ctrl_dev = app_fw_flower->ctrl_hw->eth_dev;
+       ctrl_dev = app_fw_flower->ctrl_ethdev;
 
        /* Flower ctrl vNIC only has a single tx queue */
        txq = ctrl_dev->data->tx_queues[0];
@@ -511,7 +509,7 @@ nfp_flower_ctrl_vnic_process(struct nfp_app_fw_flower 
*app_fw_flower)
        struct rte_eth_dev *ctrl_eth_dev;
        struct rte_mbuf *pkts_burst[MAX_PKT_BURST];
 
-       ctrl_eth_dev = app_fw_flower->ctrl_hw->eth_dev;
+       ctrl_eth_dev = app_fw_flower->ctrl_ethdev;
 
        /* Ctrl vNIC only has a single Rx queue */
        rxq = ctrl_eth_dev->data->rx_queues[0];
diff --git a/drivers/net/nfp/flower/nfp_flower_flow.c 
b/drivers/net/nfp/flower/nfp_flower_flow.c
index 086cc8079a..8ff13923e5 100644
--- a/drivers/net/nfp/flower/nfp_flower_flow.c
+++ b/drivers/net/nfp/flower/nfp_flower_flow.c
@@ -3518,7 +3518,7 @@ nfp_flow_action_rss_add(struct nfp_flower_representor 
*representor,
                struct nfp_fl_rss **rss_store)
 {
        int ret;
-       struct nfp_net_hw *pf_hw;
+       struct rte_eth_dev *eth_dev;
        struct rte_eth_rss_conf rss_conf;
        struct nfp_fl_rss *rss_store_tmp;
        const struct rte_flow_action_rss *rss;
@@ -3536,8 +3536,8 @@ nfp_flow_action_rss_add(struct nfp_flower_representor 
*representor,
 
        rss_conf.rss_hf = 0;
        rss_conf.rss_key = rss_key;
-       pf_hw = representor->app_fw_flower->pf_hw;
-       ret = nfp_net_rss_hash_conf_get(pf_hw->eth_dev, &rss_conf);
+       eth_dev = representor->app_fw_flower->pf_ethdev;
+       ret = nfp_net_rss_hash_conf_get(eth_dev, &rss_conf);
        if (ret != 0) {
                PMD_DRV_LOG(ERR, "Get RSS conf failed.");
                return ret;
@@ -3563,7 +3563,7 @@ nfp_flow_action_rss_add(struct nfp_flower_representor 
*representor,
                rss_store_tmp->key_len = rss->key_len;
        }
 
-       ret = nfp_net_rss_hash_update(pf_hw->eth_dev, &rss_conf);
+       ret = nfp_net_rss_hash_update(eth_dev, &rss_conf);
        if (ret != 0) {
                PMD_DRV_LOG(ERR, "Update RSS conf failed.");
                free(rss_store_tmp);
@@ -3580,7 +3580,7 @@ nfp_flow_action_rss_del(struct nfp_flower_representor 
*representor,
                struct rte_flow *nfp_flow)
 {
        int ret;
-       struct nfp_net_hw *pf_hw;
+       struct rte_eth_dev *eth_dev;
        struct nfp_fl_rss *rss_store;
        struct rte_eth_rss_conf rss_conf;
        uint8_t rss_key[NFP_NET_CFG_RSS_KEY_SZ];
@@ -3590,8 +3590,8 @@ nfp_flow_action_rss_del(struct nfp_flower_representor 
*representor,
 
        rss_conf.rss_hf = 0;
        rss_conf.rss_key = rss_key;
-       pf_hw = representor->app_fw_flower->pf_hw;
-       ret = nfp_net_rss_hash_conf_get(pf_hw->eth_dev, &rss_conf);
+       eth_dev = representor->app_fw_flower->pf_ethdev;
+       ret = nfp_net_rss_hash_conf_get(eth_dev, &rss_conf);
        if (ret != 0) {
                PMD_DRV_LOG(ERR, "Get RSS conf failed.");
                goto exit;
@@ -3612,7 +3612,7 @@ nfp_flow_action_rss_del(struct nfp_flower_representor 
*representor,
                rss_conf.rss_key_len = 0;
        }
 
-       ret = nfp_net_rss_hash_update(pf_hw->eth_dev, &rss_conf);
+       ret = nfp_net_rss_hash_update(eth_dev, &rss_conf);
        if (ret != 0)
                PMD_DRV_LOG(ERR, "Update RSS conf failed.");
 
diff --git a/drivers/net/nfp/flower/nfp_flower_representor.c 
b/drivers/net/nfp/flower/nfp_flower_representor.c
index 0e19723f57..60f02ad919 100644
--- a/drivers/net/nfp/flower/nfp_flower_representor.c
+++ b/drivers/net/nfp/flower/nfp_flower_representor.c
@@ -270,7 +270,6 @@ nfp_flower_repr_tx_burst(void *tx_queue,
        uint16_t sent;
        void *pf_tx_queue;
        struct nfp_net_txq *txq;
-       struct nfp_net_hw *pf_hw;
        struct rte_eth_dev *dev;
        struct rte_eth_dev *repr_dev;
        struct nfp_flower_representor *repr;
@@ -290,8 +289,7 @@ nfp_flower_repr_tx_burst(void *tx_queue,
                                tx_pkts[i], repr->port_id);
 
        /* This points to the PF vNIC that owns this representor */
-       pf_hw = txq->hw;
-       dev = pf_hw->eth_dev;
+       dev = repr->app_fw_flower->pf_ethdev;
 
        /* Only using Tx queue 0 for now. */
        pf_tx_queue = dev->data->tx_queues[0];
@@ -306,10 +304,9 @@ nfp_flower_repr_tx_burst(void *tx_queue,
 }
 
 static void
-nfp_flower_repr_free_queue(struct nfp_flower_representor *repr)
+nfp_flower_repr_free_queue(struct rte_eth_dev *eth_dev)
 {
        uint16_t i;
-       struct rte_eth_dev *eth_dev = repr->eth_dev;
 
        for (i = 0; i < eth_dev->data->nb_tx_queues; i++)
                rte_free(eth_dev->data->tx_queues[i]);
@@ -319,10 +316,8 @@ nfp_flower_repr_free_queue(struct nfp_flower_representor 
*repr)
 }
 
 static void
-nfp_flower_pf_repr_close_queue(struct nfp_flower_representor *repr)
+nfp_flower_pf_repr_close_queue(struct rte_eth_dev *eth_dev)
 {
-       struct rte_eth_dev *eth_dev = repr->eth_dev;
-
        /*
         * We assume that the DPDK application is stopping all the
         * threads/queues before calling the device close function.
@@ -335,17 +330,18 @@ nfp_flower_pf_repr_close_queue(struct 
nfp_flower_representor *repr)
 }
 
 static void
-nfp_flower_repr_close_queue(struct nfp_flower_representor *repr)
+nfp_flower_repr_close_queue(struct rte_eth_dev *eth_dev,
+               enum nfp_repr_type repr_type)
 {
-       switch (repr->repr_type) {
+       switch (repr_type) {
        case NFP_REPR_TYPE_PHYS_PORT:
-               nfp_flower_repr_free_queue(repr);
+               nfp_flower_repr_free_queue(eth_dev);
                break;
        case NFP_REPR_TYPE_PF:
-               nfp_flower_pf_repr_close_queue(repr);
+               nfp_flower_pf_repr_close_queue(eth_dev);
                break;
        case NFP_REPR_TYPE_VF:
-               nfp_flower_repr_free_queue(repr);
+               nfp_flower_repr_free_queue(eth_dev);
                break;
        default:
                PMD_DRV_LOG(ERR, "Unsupported repr port type.");
@@ -384,18 +380,18 @@ nfp_flower_pf_repr_uninit(struct rte_eth_dev *eth_dev)
 }
 
 static void
-nfp_flower_repr_free(struct nfp_flower_representor *repr,
+nfp_flower_repr_free(struct rte_eth_dev *eth_dev,
                enum nfp_repr_type repr_type)
 {
        switch (repr_type) {
        case NFP_REPR_TYPE_PHYS_PORT:
-               nfp_flower_repr_uninit(repr->eth_dev);
+               nfp_flower_repr_uninit(eth_dev);
                break;
        case NFP_REPR_TYPE_PF:
-               nfp_flower_pf_repr_uninit(repr->eth_dev);
+               nfp_flower_pf_repr_uninit(eth_dev);
                break;
        case NFP_REPR_TYPE_VF:
-               nfp_flower_repr_uninit(repr->eth_dev);
+               nfp_flower_repr_uninit(eth_dev);
                break;
        default:
                PMD_DRV_LOG(ERR, "Unsupported repr port type.");
@@ -425,9 +421,8 @@ nfp_flower_repr_dev_close(struct rte_eth_dev *dev)
        if (pf_dev->app_fw_id != NFP_APP_FW_FLOWER_NIC)
                return -EINVAL;
 
-       nfp_flower_repr_close_queue(repr);
-
-       nfp_flower_repr_free(repr, repr->repr_type);
+       nfp_flower_repr_close_queue(dev, repr->repr_type);
+       nfp_flower_repr_free(dev, repr->repr_type);
 
        for (i = 0; i < MAX_FLOWER_VFS; i++) {
                if (app_fw_flower->vf_reprs[i] != NULL)
@@ -575,8 +570,7 @@ nfp_flower_pf_repr_init(struct rte_eth_dev *eth_dev,
        rte_ether_addr_copy(&init_repr_data->mac_addr, 
eth_dev->data->mac_addrs);
 
        repr->app_fw_flower->pf_repr = repr;
-       repr->app_fw_flower->pf_hw->eth_dev = eth_dev;
-       repr->eth_dev = eth_dev;
+       repr->app_fw_flower->pf_ethdev = eth_dev;
 
        return 0;
 }
@@ -668,8 +662,6 @@ nfp_flower_repr_init(struct rte_eth_dev *eth_dev,
                app_fw_flower->vf_reprs[index] = repr;
        }
 
-       repr->eth_dev = eth_dev;
-
        return 0;
 
 mac_cleanup:
@@ -684,28 +676,38 @@ static void
 nfp_flower_repr_free_all(struct nfp_app_fw_flower *app_fw_flower)
 {
        uint32_t i;
+       struct rte_eth_dev *eth_dev;
        struct nfp_flower_representor *repr;
 
        for (i = 0; i < MAX_FLOWER_VFS; i++) {
                repr = app_fw_flower->vf_reprs[i];
                if (repr != NULL) {
-                       nfp_flower_repr_free(repr, NFP_REPR_TYPE_VF);
-                       app_fw_flower->vf_reprs[i] = NULL;
+                       eth_dev = rte_eth_dev_get_by_name(repr->name);
+                       if (eth_dev != NULL) {
+                               nfp_flower_repr_free(eth_dev, NFP_REPR_TYPE_VF);
+                               app_fw_flower->vf_reprs[i] = NULL;
+                       }
                }
        }
 
        for (i = 0; i < NFP_MAX_PHYPORTS; i++) {
                repr = app_fw_flower->phy_reprs[i];
                if (repr != NULL) {
-                       nfp_flower_repr_free(repr, NFP_REPR_TYPE_PHYS_PORT);
-                       app_fw_flower->phy_reprs[i] = NULL;
+                       eth_dev = rte_eth_dev_get_by_name(repr->name);
+                       if (eth_dev != NULL) {
+                               nfp_flower_repr_free(eth_dev, 
NFP_REPR_TYPE_PHYS_PORT);
+                               app_fw_flower->phy_reprs[i] = NULL;
+                       }
                }
        }
 
        repr = app_fw_flower->pf_repr;
        if (repr != NULL) {
-               nfp_flower_repr_free(repr, NFP_REPR_TYPE_PF);
-               app_fw_flower->pf_repr = NULL;
+               eth_dev = rte_eth_dev_get_by_name(repr->name);
+               if (eth_dev != NULL) {
+                       nfp_flower_repr_free(eth_dev, NFP_REPR_TYPE_PF);
+                       app_fw_flower->pf_repr = NULL;
+               }
        }
 }
 
@@ -719,7 +721,7 @@ nfp_flower_repr_priv_init(struct nfp_app_fw_flower 
*app_fw_flower,
 
        repr = app_fw_flower->pf_repr;
        if (repr != NULL) {
-               eth_dev = repr->eth_dev;
+               eth_dev = rte_eth_dev_get_by_name(repr->name);
                if (eth_dev != NULL)
                        eth_dev->process_private = hw_priv;
        }
@@ -727,7 +729,7 @@ nfp_flower_repr_priv_init(struct nfp_app_fw_flower 
*app_fw_flower,
        for (i = 0; i < NFP_MAX_PHYPORTS; i++) {
                repr = app_fw_flower->phy_reprs[i];
                if (repr != NULL) {
-                       eth_dev = repr->eth_dev;
+                       eth_dev = rte_eth_dev_get_by_name(repr->name);
                        if (eth_dev != NULL)
                                eth_dev->process_private = hw_priv;
                }
@@ -736,7 +738,7 @@ nfp_flower_repr_priv_init(struct nfp_app_fw_flower 
*app_fw_flower,
        for (i = 0; i < MAX_FLOWER_VFS; i++) {
                repr = app_fw_flower->vf_reprs[i];
                if (repr != NULL) {
-                       eth_dev = repr->eth_dev;
+                       eth_dev = rte_eth_dev_get_by_name(repr->name);
                        if (eth_dev != NULL)
                                eth_dev->process_private = hw_priv;
                }
@@ -750,7 +752,6 @@ nfp_flower_repr_alloc(struct nfp_app_fw_flower 
*app_fw_flower,
        int i;
        int ret;
        const char *pci_name;
-       struct rte_eth_dev *eth_dev;
        struct rte_pci_device *pci_dev;
        struct nfp_eth_table *nfp_eth_table;
        struct nfp_eth_table_port *eth_port;
@@ -760,7 +761,6 @@ nfp_flower_repr_alloc(struct nfp_app_fw_flower 
*app_fw_flower,
        };
 
        nfp_eth_table = hw_priv->pf_dev->nfp_eth_table;
-       eth_dev = app_fw_flower->ctrl_hw->eth_dev;
 
        /* Send a NFP_FLOWER_CMSG_TYPE_MAC_REPR cmsg to hardware */
        ret = nfp_flower_cmsg_mac_repr(app_fw_flower, nfp_eth_table);
@@ -783,7 +783,7 @@ nfp_flower_repr_alloc(struct nfp_app_fw_flower 
*app_fw_flower,
                        "%s_repr_pf", pci_name);
 
        /* Create a eth_dev for this representor */
-       ret = rte_eth_dev_create(eth_dev->device, flower_repr.name,
+       ret = rte_eth_dev_create(&pci_dev->device, flower_repr.name,
                        sizeof(struct nfp_flower_representor),
                        NULL, NULL, nfp_flower_pf_repr_init, &flower_repr);
        if (ret != 0) {
@@ -808,7 +808,7 @@ nfp_flower_repr_alloc(struct nfp_app_fw_flower 
*app_fw_flower,
                 * Create a eth_dev for this representor.
                 * This will also allocate private memory for the device.
                 */
-               ret = rte_eth_dev_create(eth_dev->device, flower_repr.name,
+               ret = rte_eth_dev_create(&pci_dev->device, flower_repr.name,
                                sizeof(struct nfp_flower_representor),
                                NULL, NULL, nfp_flower_repr_init, &flower_repr);
                if (ret != 0) {
@@ -837,7 +837,7 @@ nfp_flower_repr_alloc(struct nfp_app_fw_flower 
*app_fw_flower,
                                "%s_repr_vf%d", pci_name, i);
 
                /* This will also allocate private memory for the device */
-               ret = rte_eth_dev_create(eth_dev->device, flower_repr.name,
+               ret = rte_eth_dev_create(&pci_dev->device, flower_repr.name,
                                sizeof(struct nfp_flower_representor),
                                NULL, NULL, nfp_flower_repr_init, &flower_repr);
                if (ret != 0) {
diff --git a/drivers/net/nfp/flower/nfp_flower_representor.h 
b/drivers/net/nfp/flower/nfp_flower_representor.h
index 41965f6e0e..d539e53b23 100644
--- a/drivers/net/nfp/flower/nfp_flower_representor.h
+++ b/drivers/net/nfp/flower/nfp_flower_representor.h
@@ -20,7 +20,6 @@ struct nfp_flower_representor {
        struct rte_ring *ring;
        struct rte_eth_link link;
        struct rte_eth_stats repr_stats;
-       struct rte_eth_dev *eth_dev;
 };
 
 int nfp_flower_repr_create(struct nfp_app_fw_flower *app_fw_flower,
diff --git a/drivers/net/nfp/nfp_ethdev.c b/drivers/net/nfp/nfp_ethdev.c
index 258b617eb2..d450c9472e 100644
--- a/drivers/net/nfp/nfp_ethdev.c
+++ b/drivers/net/nfp/nfp_ethdev.c
@@ -100,15 +100,14 @@ nfp_devargs_parse(struct nfp_devargs *nfp_devargs_param,
 
 static void
 nfp_net_pf_read_mac(struct nfp_app_fw_nic *app_fw_nic,
-               uint16_t port)
+               uint16_t port,
+               struct nfp_net_hw_priv *hw_priv)
 {
        struct nfp_net_hw *hw;
-       struct nfp_net_hw_priv *hw_priv;
        struct nfp_eth_table *nfp_eth_table;
 
        /* Grab a pointer to the correct physical port */
        hw = app_fw_nic->ports[port];
-       hw_priv = hw->eth_dev->process_private;
 
        nfp_eth_table = hw_priv->pf_dev->nfp_eth_table;
 
@@ -582,17 +581,14 @@ nfp_net_uninit(struct rte_eth_dev *eth_dev)
 
 static void
 nfp_cleanup_port_app_fw_nic(struct nfp_pf_dev *pf_dev,
-               uint8_t id)
+               uint8_t id,
+               struct rte_eth_dev *eth_dev)
 {
-       struct rte_eth_dev *eth_dev;
        struct nfp_app_fw_nic *app_fw_nic;
 
        app_fw_nic = pf_dev->app_fw_priv;
        if (app_fw_nic->ports[id] != NULL) {
-               eth_dev = app_fw_nic->ports[id]->eth_dev;
-               if (eth_dev != NULL)
-                       nfp_net_uninit(eth_dev);
-
+               nfp_net_uninit(eth_dev);
                app_fw_nic->ports[id] = NULL;
        }
 }
@@ -691,7 +687,7 @@ nfp_net_close(struct rte_eth_dev *dev)
        if (pf_dev->app_fw_id != NFP_APP_FW_CORE_NIC)
                return -EINVAL;
 
-       nfp_cleanup_port_app_fw_nic(pf_dev, hw->idx);
+       nfp_cleanup_port_app_fw_nic(pf_dev, hw->idx, dev);
 
        for (i = 0; i < app_fw_nic->total_phyports; i++) {
                id = nfp_function_id_get(pf_dev, i);
@@ -971,7 +967,6 @@ nfp_net_init(struct rte_eth_dev *eth_dev)
 
        net_hw->tx_bar = pf_dev->qc_bar + tx_base * NFP_QCP_QUEUE_ADDR_SZ;
        net_hw->rx_bar = pf_dev->qc_bar + rx_base * NFP_QCP_QUEUE_ADDR_SZ;
-       eth_dev->data->dev_private = net_hw;
 
        PMD_INIT_LOG(DEBUG, "ctrl_bar: %p, tx_bar: %p, rx_bar: %p",
                        hw->ctrl_bar, net_hw->tx_bar, net_hw->rx_bar);
@@ -1002,7 +997,7 @@ nfp_net_init(struct rte_eth_dev *eth_dev)
                        goto xstats_free;
        }
 
-       nfp_net_pf_read_mac(app_fw_nic, port);
+       nfp_net_pf_read_mac(app_fw_nic, port, hw_priv);
        nfp_write_mac(hw, &hw->mac_addr.addr_bytes[0]);
 
        if (rte_is_valid_assigned_ether_addr(&hw->mac_addr) == 0) {
@@ -1580,7 +1575,6 @@ nfp_init_app_fw_nic(struct nfp_net_hw_priv *hw_priv)
                /* Add this device to the PF's array of physical ports */
                app_fw_nic->ports[id] = hw;
 
-               hw->eth_dev = eth_dev;
                hw->idx = id;
                hw->nfp_idx = nfp_eth_table->ports[id].index;
 
@@ -1605,12 +1599,18 @@ nfp_init_app_fw_nic(struct nfp_net_hw_priv *hw_priv)
 
 port_cleanup:
        for (i = 0; i < app_fw_nic->total_phyports; i++) {
-               id = nfp_function_id_get(pf_dev, i);
-               hw = app_fw_nic->ports[id];
+               struct rte_eth_dev *eth_dev;
 
-               if (hw != NULL && hw->eth_dev != NULL) {
-                       nfp_net_uninit(hw->eth_dev);
-                       rte_eth_dev_release_port(hw->eth_dev);
+               if (pf_dev->multi_pf.enabled)
+                       snprintf(port_name, sizeof(port_name), "%s",
+                                       pf_dev->pci_dev->device.name);
+               else
+                       snprintf(port_name, sizeof(port_name), "%s_port%u",
+                                       pf_dev->pci_dev->device.name, i);
+               eth_dev = rte_eth_dev_get_by_name(port_name);
+               if (eth_dev != NULL) {
+                       nfp_net_uninit(eth_dev);
+                       rte_eth_dev_release_port(eth_dev);
                }
        }
        nfp_cpp_area_release_free(pf_dev->ctrl_area);
diff --git a/drivers/net/nfp/nfp_net_common.h b/drivers/net/nfp/nfp_net_common.h
index 40f314af0a..a4eaed6433 100644
--- a/drivers/net/nfp/nfp_net_common.h
+++ b/drivers/net/nfp/nfp_net_common.h
@@ -167,9 +167,6 @@ struct nfp_net_hw {
        /** The parent class */
        struct nfp_hw super;
 
-       /** Backpointer to the eth_dev of this port */
-       struct rte_eth_dev *eth_dev;
-
        /** TX pointer ring write back memzone */
        const struct rte_memzone *txrwb_mz;
 
-- 
2.39.1

Reply via email to