]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
net: amd-xgbe: Reset link when the link never comes back
authorShyam Sundar S K <Shyam-sundar.S-k@amd.com>
Tue, 16 Feb 2021 19:07:09 +0000 (00:37 +0530)
committerDavid S. Miller <davem@davemloft.net>
Tue, 16 Feb 2021 22:09:45 +0000 (14:09 -0800)
Normally, auto negotiation and reconnect should be automatically done by
the hardware. But there seems to be an issue where auto negotiation has
to be restarted manually. This happens because of link training and so
even though still connected to the partner the link never "comes back".
This needs an auto-negotiation restart.

Also, a change in xgbe-mdio is needed to get ethtool to recognize the
link down and get the link change message. This change is only
required in a backplane connection mode.

Fixes: abf0a1c2b26a ("amd-xgbe: Add support for SFP+ modules")
Co-developed-by: Sudheesh Mavila <sudheesh.mavila@amd.com>
Signed-off-by: Sudheesh Mavila <sudheesh.mavila@amd.com>
Signed-off-by: Shyam Sundar S K <Shyam-sundar.S-k@amd.com>
Acked-by: Tom Lendacky <thomas.lendacky@amd.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/amd/xgbe/xgbe-mdio.c
drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c

index 19ee4db0156d6eaf71609183614fa0ca7946cc9e..4e97b486952205fbba19d6bfc938341c7f36a495 100644 (file)
@@ -1345,7 +1345,7 @@ static void xgbe_phy_status(struct xgbe_prv_data *pdata)
                                                             &an_restart);
        if (an_restart) {
                xgbe_phy_config_aneg(pdata);
-               return;
+               goto adjust_link;
        }
 
        if (pdata->phy.link) {
index 087948085ae19e1ff644e7811ef45dd57f7f36e9..d3f72faecd1dab8aa2833d69147e37b51f37dfd3 100644 (file)
@@ -2610,6 +2610,14 @@ static int xgbe_phy_link_status(struct xgbe_prv_data *pdata, int *an_restart)
        if (reg & MDIO_STAT1_LSTATUS)
                return 1;
 
+       if (pdata->phy.autoneg == AUTONEG_ENABLE &&
+           phy_data->port_mode == XGBE_PORT_MODE_BACKPLANE) {
+               if (!test_bit(XGBE_LINK_INIT, &pdata->dev_state)) {
+                       netif_carrier_off(pdata->netdev);
+                       *an_restart = 1;
+               }
+       }
+
        /* No link, attempt a receiver reset cycle */
        if (phy_data->rrc_count++ > XGBE_RRC_FREQUENCY) {
                phy_data->rrc_count = 0;