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