From: Zerun Fu <zerun...@corigine.com>

The previous logic will call 'nfp_eth_read_ports()' every time when the
link status changed, but some of which are not necessary.

Refactor this part of logic and only call 'nfp_eth_read_ports()' when
the speed is really updated or the device is under auto-negotiation mode.

Signed-off-by: Zerun Fu <zerun...@corigine.com>
Reviewed-by: Chaoyong He <chaoyong...@corigine.com>
Reviewed-by: Long Wu <long...@corigine.com>
Reviewed-by: Peng Zhang <peng.zh...@corigine.com>
---
 drivers/net/nfp/nfp_ethdev.c     |  3 +++
 drivers/net/nfp/nfp_net_common.c | 18 ++++++++++++------
 drivers/net/nfp/nfp_net_common.h |  3 +++
 3 files changed, 18 insertions(+), 6 deletions(-)

diff --git a/drivers/net/nfp/nfp_ethdev.c b/drivers/net/nfp/nfp_ethdev.c
index f4fd013a51..9870b2dd33 100644
--- a/drivers/net/nfp/nfp_ethdev.c
+++ b/drivers/net/nfp/nfp_ethdev.c
@@ -339,6 +339,8 @@ nfp_net_speed_configure(struct rte_eth_dev *dev)
                }
        }
 
+       hw_priv->pf_dev->speed_updated = true;
+
        return 0;
 }
 
@@ -2250,6 +2252,7 @@ nfp_pf_init(struct rte_pci_device *pci_dev)
        pf_dev->nfp_eth_table = nfp_eth_table;
        pf_dev->sync = sync;
        pf_dev->total_phyports = nfp_net_get_port_num(pf_dev, nfp_eth_table);
+       pf_dev->speed_updated = false;
 
        ret = nfp_net_speed_cap_get(pf_dev);
        if (ret != 0) {
diff --git a/drivers/net/nfp/nfp_net_common.c b/drivers/net/nfp/nfp_net_common.c
index 5616160686..fed8daa188 100644
--- a/drivers/net/nfp/nfp_net_common.c
+++ b/drivers/net/nfp/nfp_net_common.c
@@ -738,22 +738,28 @@ nfp_net_speed_aneg_update(struct rte_eth_dev *dev,
 {
        uint32_t i;
        uint32_t speed;
+       enum nfp_eth_aneg aneg;
+       struct nfp_pf_dev *pf_dev;
        struct nfp_eth_table *nfp_eth_table;
        struct nfp_eth_table_port *eth_port;
 
+       pf_dev = hw_priv->pf_dev;
+       aneg = pf_dev->nfp_eth_table->ports[hw->idx].aneg;
+
        /* Compare whether the current status has changed. */
-       if (dev->data->dev_link.link_status != link->link_status) {
-               nfp_eth_table = nfp_eth_read_ports(hw_priv->pf_dev->cpp);
+       if (pf_dev->speed_updated || aneg == NFP_ANEG_AUTO) {
+               nfp_eth_table = nfp_eth_read_ports(pf_dev->cpp);
                if (nfp_eth_table == NULL) {
                        PMD_DRV_LOG(DEBUG, "Error reading NFP ethernet table.");
                        return -EIO;
+               } else {
+                       pf_dev->nfp_eth_table->ports[hw->idx] = 
nfp_eth_table->ports[hw->idx];
+                       free(nfp_eth_table);
+                       pf_dev->speed_updated = false;
                }
-
-               hw_priv->pf_dev->nfp_eth_table->ports[hw->idx] = 
nfp_eth_table->ports[hw->idx];
-               free(nfp_eth_table);
        }
 
-       nfp_eth_table = hw_priv->pf_dev->nfp_eth_table;
+       nfp_eth_table = pf_dev->nfp_eth_table;
        eth_port = &nfp_eth_table->ports[hw->idx];
        speed = eth_port->speed;
 
diff --git a/drivers/net/nfp/nfp_net_common.h b/drivers/net/nfp/nfp_net_common.h
index b43f815951..8e3e219261 100644
--- a/drivers/net/nfp/nfp_net_common.h
+++ b/drivers/net/nfp/nfp_net_common.h
@@ -160,6 +160,9 @@ struct nfp_pf_dev {
        uint8_t vf_base_id;
        /** Number of queues per VF */
        uint32_t queue_per_vf;
+
+       /** Record the speed uptade */
+       bool speed_updated;
 };
 
 #define NFP_NET_FLOW_LIMIT    1024
-- 
2.39.1

Reply via email to