net/i40e: set speed to undefined for default case in link update

Message ID 2121840c6dc59bcd1caffa8f4c8428fed5d667a7.1568216789.git.thierry.herbelot@6wind.com (mailing list archive)
State Accepted, archived
Delegated to: xiaolong ye
Headers
Series net/i40e: set speed to undefined for default case in link update |

Checks

Context Check Description
ci/checkpatch success coding style OK
ci/Intel-compilation success Compilation OK
ci/iol-dpdk_compile_ovs success Compile Testing PASS
ci/iol-dpdk_compile success Compile Testing PASS
ci/iol-dpdk_compile_spdk success Compile Testing PASS
ci/intel-Performance success Performance Testing PASS
ci/mellanox-Performance success Performance Testing PASS

Commit Message

Thierry Herbelot Sept. 11, 2019, 4:02 p.m. UTC
  From: Laurent Hardy <laurent.hardy@6wind.com>

During PF/VF link update, a default speed value of 100M will be set
if get_link_info has failed or speed is unknown.

Consequently if PF is put in no-carrier state, VFs will switch to
"in carrier" state due to a link up + a link speed set to 100M
(default value if no speed detected).

To be consistent with linux drivers on which PF and VFs are in
same carrier state, sets default speed to undefined (instead of 100M)
and updates a link status of VF only if link is up and speed is
different from undefined.

Fixes: 4861cde46116 ('i40e: new poll mode driver')
Cc: stable@dpdk.org
Cc: beilei.xing@intel.com
Cc: qi.z.zhang@intel.com

Signed-off-by: Laurent Hardy <laurent.hardy@6wind.com>
---
 drivers/net/i40e/i40e_ethdev.c    | 4 ++--
 drivers/net/i40e/i40e_ethdev_vf.c | 8 +++++---
 2 files changed, 7 insertions(+), 5 deletions(-)
  

Comments

Qi Zhang Sept. 17, 2019, 2:40 a.m. UTC | #1
> -----Original Message-----
> From: Thierry Herbelot [mailto:thierry.herbelot@6wind.com]
> Sent: Thursday, September 12, 2019 12:03 AM
> To: dev@dpdk.org
> Cc: Laurent Hardy <laurent.hardy@6wind.com>; Thomas Monjalon
> <thomas@monjalon.net>; stable@dpdk.org; Xing, Beilei
> <beilei.xing@intel.com>; Zhang, Qi Z <qi.z.zhang@intel.com>
> Subject: [PATCH] net/i40e: set speed to undefined for default case in link
> update
> 
> From: Laurent Hardy <laurent.hardy@6wind.com>
> 
> During PF/VF link update, a default speed value of 100M will be set if
> get_link_info has failed or speed is unknown.
> 
> Consequently if PF is put in no-carrier state, VFs will switch to "in carrier" state
> due to a link up + a link speed set to 100M (default value if no speed detected).
> 
> To be consistent with linux drivers on which PF and VFs are in same carrier
> state, sets default speed to undefined (instead of 100M) and updates a link
> status of VF only if link is up and speed is different from undefined.
> 
> Fixes: 4861cde46116 ('i40e: new poll mode driver')
> Cc: stable@dpdk.org
> Cc: beilei.xing@intel.com
> Cc: qi.z.zhang@intel.com
> 
> Signed-off-by: Laurent Hardy <laurent.hardy@6wind.com>

Acked-by: Qi Zhang <qi.z.zhang@intel.com>
  
Xiaolong Ye Sept. 30, 2019, 10:53 a.m. UTC | #2
On 09/11, Thierry Herbelot wrote:
>From: Laurent Hardy <laurent.hardy@6wind.com>
>
>During PF/VF link update, a default speed value of 100M will be set
>if get_link_info has failed or speed is unknown.
>
>Consequently if PF is put in no-carrier state, VFs will switch to
>"in carrier" state due to a link up + a link speed set to 100M
>(default value if no speed detected).
>
>To be consistent with linux drivers on which PF and VFs are in
>same carrier state, sets default speed to undefined (instead of 100M)
>and updates a link status of VF only if link is up and speed is
>different from undefined.
>
>Fixes: 4861cde46116 ('i40e: new poll mode driver')
>Cc: stable@dpdk.org
>Cc: beilei.xing@intel.com
>Cc: qi.z.zhang@intel.com
>
>Signed-off-by: Laurent Hardy <laurent.hardy@6wind.com>
>---
> drivers/net/i40e/i40e_ethdev.c    | 4 ++--
> drivers/net/i40e/i40e_ethdev_vf.c | 8 +++++---
> 2 files changed, 7 insertions(+), 5 deletions(-)
>

Reviewed-by: Xiaolong Ye <xiaolong.ye@intel.com>

Applied to dpdk-next-net-intel.
  

Patch

diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c
index 4e40b7ab5250..76abe8209a10 100644
--- a/drivers/net/i40e/i40e_ethdev.c
+++ b/drivers/net/i40e/i40e_ethdev.c
@@ -2743,7 +2743,7 @@  update_link_aq(struct i40e_hw *hw, struct rte_eth_link *link,
 		status = i40e_aq_get_link_info(hw, enable_lse,
 						&link_status, NULL);
 		if (unlikely(status != I40E_SUCCESS)) {
-			link->link_speed = ETH_SPEED_NUM_100M;
+			link->link_speed = ETH_SPEED_NUM_NONE;
 			link->link_duplex = ETH_LINK_FULL_DUPLEX;
 			PMD_DRV_LOG(ERR, "Failed to get link info");
 			return;
@@ -2777,7 +2777,7 @@  update_link_aq(struct i40e_hw *hw, struct rte_eth_link *link,
 		link->link_speed = ETH_SPEED_NUM_40G;
 		break;
 	default:
-		link->link_speed = ETH_SPEED_NUM_100M;
+		link->link_speed = ETH_SPEED_NUM_NONE;
 		break;
 	}
 }
diff --git a/drivers/net/i40e/i40e_ethdev_vf.c b/drivers/net/i40e/i40e_ethdev_vf.c
index c77b30c54ba7..a63b83f81718 100644
--- a/drivers/net/i40e/i40e_ethdev_vf.c
+++ b/drivers/net/i40e/i40e_ethdev_vf.c
@@ -2143,13 +2143,15 @@  i40evf_dev_link_update(struct rte_eth_dev *dev,
 		new_link.link_speed = ETH_SPEED_NUM_40G;
 		break;
 	default:
-		new_link.link_speed = ETH_SPEED_NUM_100M;
+		new_link.link_speed = ETH_SPEED_NUM_NONE;
 		break;
 	}
 	/* full duplex only */
 	new_link.link_duplex = ETH_LINK_FULL_DUPLEX;
-	new_link.link_status = vf->link_up ? ETH_LINK_UP :
-					     ETH_LINK_DOWN;
+	new_link.link_status = vf->link_up &&
+				new_link.link_speed != ETH_SPEED_NUM_NONE
+				? ETH_LINK_UP
+				: ETH_LINK_DOWN;
 	new_link.link_autoneg =
 		!(dev->data->dev_conf.link_speeds & ETH_LINK_SPEED_FIXED);