Commit 6e4a93be authored by Jakub Kicinski's avatar Jakub Kicinski

Merge branch 'quirk-for-oem-sfp-2-5g-t-copper-module'

Russell King says:

====================
Quirk for OEM SFP-2.5G-T copper module

Frank Wunderlich reports that this copper module requires a quirk in
order to function - in that the module needs to use 2500base-X.
Moreover, negotiation must be disabled.

An example of this device would be:

  https://www.optcore.net/product/sfp-2g-t-gen
====================

Link: https://lore.kernel.org/r/ZBniMlTDZJQ242DP@shell.armlinux.org.ukSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parents cad052e6 50e96acb
...@@ -151,6 +151,10 @@ void sfp_parse_support(struct sfp_bus *bus, const struct sfp_eeprom_id *id, ...@@ -151,6 +151,10 @@ void sfp_parse_support(struct sfp_bus *bus, const struct sfp_eeprom_id *id,
unsigned int br_min, br_nom, br_max; unsigned int br_min, br_nom, br_max;
__ETHTOOL_DECLARE_LINK_MODE_MASK(modes) = { 0, }; __ETHTOOL_DECLARE_LINK_MODE_MASK(modes) = { 0, };
phylink_set(modes, Autoneg);
phylink_set(modes, Pause);
phylink_set(modes, Asym_Pause);
/* Decode the bitrate information to MBd */ /* Decode the bitrate information to MBd */
br_min = br_nom = br_max = 0; br_min = br_nom = br_max = 0;
if (id->base.br_nominal) { if (id->base.br_nominal) {
...@@ -329,10 +333,6 @@ void sfp_parse_support(struct sfp_bus *bus, const struct sfp_eeprom_id *id, ...@@ -329,10 +333,6 @@ void sfp_parse_support(struct sfp_bus *bus, const struct sfp_eeprom_id *id,
bus->sfp_quirk->modes(id, modes, interfaces); bus->sfp_quirk->modes(id, modes, interfaces);
linkmode_or(support, support, modes); linkmode_or(support, support, modes);
phylink_set(support, Autoneg);
phylink_set(support, Pause);
phylink_set(support, Asym_Pause);
} }
EXPORT_SYMBOL_GPL(sfp_parse_support); EXPORT_SYMBOL_GPL(sfp_parse_support);
......
...@@ -360,6 +360,23 @@ static void sfp_quirk_2500basex(const struct sfp_eeprom_id *id, ...@@ -360,6 +360,23 @@ static void sfp_quirk_2500basex(const struct sfp_eeprom_id *id,
__set_bit(PHY_INTERFACE_MODE_2500BASEX, interfaces); __set_bit(PHY_INTERFACE_MODE_2500BASEX, interfaces);
} }
static void sfp_quirk_disable_autoneg(const struct sfp_eeprom_id *id,
unsigned long *modes,
unsigned long *interfaces)
{
linkmode_clear_bit(ETHTOOL_LINK_MODE_Autoneg_BIT, modes);
}
static void sfp_quirk_oem_2_5g(const struct sfp_eeprom_id *id,
unsigned long *modes,
unsigned long *interfaces)
{
/* Copper 2.5G SFP */
linkmode_set_bit(ETHTOOL_LINK_MODE_2500baseT_Full_BIT, modes);
__set_bit(PHY_INTERFACE_MODE_2500BASEX, interfaces);
sfp_quirk_disable_autoneg(id, modes, interfaces);
}
static void sfp_quirk_ubnt_uf_instant(const struct sfp_eeprom_id *id, static void sfp_quirk_ubnt_uf_instant(const struct sfp_eeprom_id *id,
unsigned long *modes, unsigned long *modes,
unsigned long *interfaces) unsigned long *interfaces)
...@@ -401,6 +418,7 @@ static const struct sfp_quirk sfp_quirks[] = { ...@@ -401,6 +418,7 @@ static const struct sfp_quirk sfp_quirks[] = {
SFP_QUIRK_M("UBNT", "UF-INSTANT", sfp_quirk_ubnt_uf_instant), SFP_QUIRK_M("UBNT", "UF-INSTANT", sfp_quirk_ubnt_uf_instant),
SFP_QUIRK_F("OEM", "SFP-10G-T", sfp_fixup_rollball_cc), SFP_QUIRK_F("OEM", "SFP-10G-T", sfp_fixup_rollball_cc),
SFP_QUIRK_M("OEM", "SFP-2.5G-T", sfp_quirk_oem_2_5g),
SFP_QUIRK_F("OEM", "RTSFP-10", sfp_fixup_rollball_cc), SFP_QUIRK_F("OEM", "RTSFP-10", sfp_fixup_rollball_cc),
SFP_QUIRK_F("OEM", "RTSFP-10G", sfp_fixup_rollball_cc), SFP_QUIRK_F("OEM", "RTSFP-10G", sfp_fixup_rollball_cc),
SFP_QUIRK_F("Turris", "RTSFP-10", sfp_fixup_rollball), SFP_QUIRK_F("Turris", "RTSFP-10", sfp_fixup_rollball),
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment