net: amd-xgbe: Fix logic around active and passive cables
[ Upstream commit 4998006c73afe44e2f639d55bd331c6c26eb039f ]
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: abf0a1c2b2
("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>
Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
bc06c239d5
commit
291b9669f6
@ -188,6 +188,7 @@ enum xgbe_sfp_cable {
|
|||||||
XGBE_SFP_CABLE_UNKNOWN = 0,
|
XGBE_SFP_CABLE_UNKNOWN = 0,
|
||||||
XGBE_SFP_CABLE_ACTIVE,
|
XGBE_SFP_CABLE_ACTIVE,
|
||||||
XGBE_SFP_CABLE_PASSIVE,
|
XGBE_SFP_CABLE_PASSIVE,
|
||||||
|
XGBE_SFP_CABLE_FIBER,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum xgbe_sfp_base {
|
enum xgbe_sfp_base {
|
||||||
@ -1148,16 +1149,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_tx_fault = xgbe_phy_check_sfp_tx_fault(phy_data);
|
||||||
phy_data->sfp_rx_los = xgbe_phy_check_sfp_rx_los(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) {
|
if (sfp_base[XGBE_SFP_BASE_CABLE] & XGBE_SFP_BASE_CABLE_PASSIVE) {
|
||||||
phy_data->sfp_cable = XGBE_SFP_CABLE_PASSIVE;
|
phy_data->sfp_cable = XGBE_SFP_CABLE_PASSIVE;
|
||||||
phy_data->sfp_cable_len = sfp_base[XGBE_SFP_BASE_CU_CABLE_LEN];
|
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;
|
phy_data->sfp_cable = XGBE_SFP_CABLE_ACTIVE;
|
||||||
|
} else {
|
||||||
|
phy_data->sfp_cable = XGBE_SFP_CABLE_FIBER;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Determine the type of SFP */
|
/* 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))
|
xgbe_phy_sfp_bit_rate(sfp_eeprom, XGBE_SFP_SPEED_10000))
|
||||||
phy_data->sfp_base = XGBE_SFP_BASE_10000_CR;
|
phy_data->sfp_base = XGBE_SFP_BASE_10000_CR;
|
||||||
else if (sfp_base[XGBE_SFP_BASE_10GBE_CC] & XGBE_SFP_BASE_10GBE_CC_SR)
|
else if (sfp_base[XGBE_SFP_BASE_10GBE_CC] & XGBE_SFP_BASE_10GBE_CC_SR)
|
||||||
|
Loading…
Reference in New Issue
Block a user