diff options
author | Ashijeet Acharya <ashijeet.acharya@6wind.com> | 2019-05-24 09:30:15 +0000 |
---|---|---|
committer | Kevin Bowling <kbowling@FreeBSD.org> | 2021-09-14 00:43:37 +0000 |
commit | 419dafe93aacf36d3a6d2a5da94d9ecf993f46f1 (patch) | |
tree | da6b5291e7035ae63bfef97b7fbe6b9898fac578 | |
parent | 6d034e061a965f28426981af1314da48d25af06b (diff) | |
download | src-419dafe93aacf36d3a6d2a5da94d9ecf993f46f1.tar.gz src-419dafe93aacf36d3a6d2a5da94d9ecf993f46f1.zip |
ixgbe: wait for link after copper MAC setup
After setting up the link on x552/X557-AT 10GBASE-T NICs, sometimes the
link does not get set up properly and as a result all the subsequent
calls to ixgbe_check_link() from ixgbe_dev_link_update_share() fail.
Introduce a delay time of 1s in ixgbe_setup_mac_link_t_X550em() before
beginning to set up the external PHY link speed to ensure that the
controller can acquire the link.
Signed-off-by: Ashijeet Acharya <ashijeet.acharya@6wind.com>
Acked-by: Qi Zhang <qi.z.zhang@intel.com>
Approved by: imp
Obtained from: DPDK (d31b95860d8e9dd7c6e242bd08baaac00a9714f0)
MFC after: 1 week
Differential Revision: https://reviews.freebsd.org/D31621
(cherry picked from commit d5bbb5500cf2ebeae078cb6ae38ecd4b15ec7f6d)
-rw-r--r-- | sys/dev/ixgbe/ixgbe_x550.c | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/sys/dev/ixgbe/ixgbe_x550.c b/sys/dev/ixgbe/ixgbe_x550.c index 7b120f841d85..a7759117f5b5 100644 --- a/sys/dev/ixgbe/ixgbe_x550.c +++ b/sys/dev/ixgbe/ixgbe_x550.c @@ -4464,6 +4464,8 @@ s32 ixgbe_setup_mac_link_t_X550em(struct ixgbe_hw *hw, { s32 status; ixgbe_link_speed force_speed; + u32 i; + bool link_up = false; DEBUGFUNC("ixgbe_setup_mac_link_t_X550em"); @@ -4483,6 +4485,19 @@ s32 ixgbe_setup_mac_link_t_X550em(struct ixgbe_hw *hw, if (status != IXGBE_SUCCESS) return status; + + /* Wait for the controller to acquire link */ + for (i = 0; i < 10; i++) { + msec_delay(100); + + status = ixgbe_check_link(hw, &force_speed, &link_up, + false); + if (status != IXGBE_SUCCESS) + return status; + + if (link_up) + break; + } } return hw->phy.ops.setup_link_speed(hw, speed, autoneg_wait_to_complete); |