net: amd-xgbe: Check only the minimum speed for active/passive cables
[ Upstream commit f8ab263d4d48e6dab752029bf562f20a2ee630ed ]
There are cables that exist that can support speeds in excess of 10GbE.
The driver, however, restricts the EEPROM advertised nominal bitrate to
a specific range, which can prevent usage of cables that can support,
for example, up to 25GbE.
Rather than checking that an active or passive cable supports a specific
range, only check for a minimum supported speed.
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:

committed by
Greg Kroah-Hartman

parent
03ea9ba5fd
commit
334c9fb892
@@ -237,10 +237,7 @@ enum xgbe_sfp_speed {
|
|||||||
|
|
||||||
#define XGBE_SFP_BASE_BR 12
|
#define XGBE_SFP_BASE_BR 12
|
||||||
#define XGBE_SFP_BASE_BR_1GBE_MIN 0x0a
|
#define XGBE_SFP_BASE_BR_1GBE_MIN 0x0a
|
||||||
#define XGBE_SFP_BASE_BR_1GBE_MAX 0x0d
|
|
||||||
#define XGBE_SFP_BASE_BR_10GBE_MIN 0x64
|
#define XGBE_SFP_BASE_BR_10GBE_MIN 0x64
|
||||||
#define XGBE_SFP_BASE_BR_10GBE_MAX 0x68
|
|
||||||
#define XGBE_MOLEX_SFP_BASE_BR_10GBE_MAX 0x78
|
|
||||||
|
|
||||||
#define XGBE_SFP_BASE_CU_CABLE_LEN 18
|
#define XGBE_SFP_BASE_CU_CABLE_LEN 18
|
||||||
|
|
||||||
@@ -827,29 +824,22 @@ static void xgbe_phy_sfp_phy_settings(struct xgbe_prv_data *pdata)
|
|||||||
static bool xgbe_phy_sfp_bit_rate(struct xgbe_sfp_eeprom *sfp_eeprom,
|
static bool xgbe_phy_sfp_bit_rate(struct xgbe_sfp_eeprom *sfp_eeprom,
|
||||||
enum xgbe_sfp_speed sfp_speed)
|
enum xgbe_sfp_speed sfp_speed)
|
||||||
{
|
{
|
||||||
u8 *sfp_base, min, max;
|
u8 *sfp_base, min;
|
||||||
|
|
||||||
sfp_base = sfp_eeprom->base;
|
sfp_base = sfp_eeprom->base;
|
||||||
|
|
||||||
switch (sfp_speed) {
|
switch (sfp_speed) {
|
||||||
case XGBE_SFP_SPEED_1000:
|
case XGBE_SFP_SPEED_1000:
|
||||||
min = XGBE_SFP_BASE_BR_1GBE_MIN;
|
min = XGBE_SFP_BASE_BR_1GBE_MIN;
|
||||||
max = XGBE_SFP_BASE_BR_1GBE_MAX;
|
|
||||||
break;
|
break;
|
||||||
case XGBE_SFP_SPEED_10000:
|
case XGBE_SFP_SPEED_10000:
|
||||||
min = XGBE_SFP_BASE_BR_10GBE_MIN;
|
min = XGBE_SFP_BASE_BR_10GBE_MIN;
|
||||||
if (memcmp(&sfp_eeprom->base[XGBE_SFP_BASE_VENDOR_NAME],
|
|
||||||
XGBE_MOLEX_VENDOR, XGBE_SFP_BASE_VENDOR_NAME_LEN) == 0)
|
|
||||||
max = XGBE_MOLEX_SFP_BASE_BR_10GBE_MAX;
|
|
||||||
else
|
|
||||||
max = XGBE_SFP_BASE_BR_10GBE_MAX;
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return ((sfp_base[XGBE_SFP_BASE_BR] >= min) &&
|
return sfp_base[XGBE_SFP_BASE_BR] >= min;
|
||||||
(sfp_base[XGBE_SFP_BASE_BR] <= max));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void xgbe_phy_free_phy_device(struct xgbe_prv_data *pdata)
|
static void xgbe_phy_free_phy_device(struct xgbe_prv_data *pdata)
|
||||||
|
Reference in New Issue
Block a user