net: amd-xgbe: Fix logic around active and passive cables
authorTom Lendacky <thomas.lendacky@amd.com>
Thu, 8 Dec 2022 16:22:24 +0000 (10:22 -0600)
committerDavid S. Miller <davem@davemloft.net>
Mon, 12 Dec 2022 10:05:36 +0000 (10:05 +0000)
SFP+ active and passive cables are copper cables with fixed SFP+ end
connectors. Due to a misinterpretation of this, SFP+ active cables could
end up not being recognized, causing the driver to fail to establish a
connection.

Introduce a new enum in SFP+ cable types, XGBE_SFP_CABLE_FIBER, that is
the default cable type, and handle active and passive cables when they are
specifically detected.

Fixes: abf0a1c2b26a ("amd-xgbe: Add support for SFP+ modules")
Signed-off-by: Tom Lendacky <thomas.lendacky@amd.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c

index 4064c3e3dd492f5856b03bb6f6d4e452bc14e154..868a768f424cb33243cd4022066102eee1b6aa7f 100644 (file)
@@ -189,6 +189,7 @@ enum xgbe_sfp_cable {
        XGBE_SFP_CABLE_UNKNOWN = 0,
        XGBE_SFP_CABLE_ACTIVE,
        XGBE_SFP_CABLE_PASSIVE,
+       XGBE_SFP_CABLE_FIBER,
 };
 
 enum xgbe_sfp_base {
@@ -1149,16 +1150,18 @@ static void xgbe_phy_sfp_parse_eeprom(struct xgbe_prv_data *pdata)
        phy_data->sfp_tx_fault = xgbe_phy_check_sfp_tx_fault(phy_data);
        phy_data->sfp_rx_los = xgbe_phy_check_sfp_rx_los(phy_data);
 
-       /* Assume ACTIVE cable unless told it is PASSIVE */
+       /* Assume FIBER cable unless told otherwise */
        if (sfp_base[XGBE_SFP_BASE_CABLE] & XGBE_SFP_BASE_CABLE_PASSIVE) {
                phy_data->sfp_cable = XGBE_SFP_CABLE_PASSIVE;
                phy_data->sfp_cable_len = sfp_base[XGBE_SFP_BASE_CU_CABLE_LEN];
-       } else {
+       } else if (sfp_base[XGBE_SFP_BASE_CABLE] & XGBE_SFP_BASE_CABLE_ACTIVE) {
                phy_data->sfp_cable = XGBE_SFP_CABLE_ACTIVE;
+       } else {
+               phy_data->sfp_cable = XGBE_SFP_CABLE_FIBER;
        }
 
        /* Determine the type of SFP */
-       if (phy_data->sfp_cable == XGBE_SFP_CABLE_PASSIVE &&
+       if (phy_data->sfp_cable != XGBE_SFP_CABLE_FIBER &&
            xgbe_phy_sfp_bit_rate(sfp_eeprom, XGBE_SFP_SPEED_10000))
                phy_data->sfp_base = XGBE_SFP_BASE_10000_CR;
        else if (sfp_base[XGBE_SFP_BASE_10GBE_CC] & XGBE_SFP_BASE_10GBE_CC_SR)