[net-next,2/2] net: sfp: add quirk for FS's DAC10G SFP (SFPP-PC01)

Message ID 20230721060057.2998-3-Raju.Lakkaraju@microchip.com
State New
Headers
Series Add support to Fiberstore SFP quirks |

Commit Message

Raju Lakkaraju July 21, 2023, 6 a.m. UTC
  Add a quirk for a DAC10G SFP that identifies itself as "FS" "SFPP-PC01".
Add a quirk to enable the SGMII interface, modes 2500base-T, 1000base-T,
100base-T/Full and 100base-T/Half support.

Signed-off-by: Raju Lakkaraju <Raju.Lakkaraju@microchip.com>
---
 drivers/net/phy/sfp.c | 14 ++++++++++++++
 1 file changed, 14 insertions(+)
  

Comments

Russell King (Oracle) July 21, 2023, 7:50 a.m. UTC | #1
On Fri, Jul 21, 2023 at 11:30:57AM +0530, Raju Lakkaraju wrote:
> Add a quirk for a DAC10G SFP that identifies itself as "FS" "SFPP-PC01".
> Add a quirk to enable the SGMII interface, modes 2500base-T, 1000base-T,
> 100base-T/Full and 100base-T/Half support.
> 
> Signed-off-by: Raju Lakkaraju <Raju.Lakkaraju@microchip.com>
> ---
>  drivers/net/phy/sfp.c | 14 ++++++++++++++
>  1 file changed, 14 insertions(+)
> 
> diff --git a/drivers/net/phy/sfp.c b/drivers/net/phy/sfp.c
> index ee049efdf71b..80d2680f08ab 100644
> --- a/drivers/net/phy/sfp.c
> +++ b/drivers/net/phy/sfp.c
> @@ -421,6 +421,18 @@ static void sfp_quirk_oem_2_5g(const struct sfp_eeprom_id *id,
>  	sfp_quirk_disable_autoneg(id, modes, interfaces);
>  }
>  
> +static void sfp_quirk_fs_dac(const struct sfp_eeprom_id *id,
> +			     unsigned long *modes,
> +			     unsigned long *interfaces)
> +{
> +	/* Fiberstore(FS)'s DAC SFP (SFPP-PC01) */
> +	linkmode_set_bit(ETHTOOL_LINK_MODE_2500baseT_Full_BIT, modes);
> +	linkmode_set_bit(ETHTOOL_LINK_MODE_1000baseT_Full_BIT, modes);
> +	linkmode_set_bit(ETHTOOL_LINK_MODE_100baseT_Full_BIT, modes);
> +	linkmode_set_bit(ETHTOOL_LINK_MODE_100baseT_Half_BIT, modes);

No. A DAC cable does _not_ give you twisted-pair ethernet which is what
baseT linkmodes are.

The description on fs.com states:

"The 10G SFP+ Passive Direct Attach Copper Twinax Cable is designed for
use in 10GBASE Ethernet."

That means it supports 10GBASE-CR, which is the link mode for 10 Gigabit
ethernet over a direct attach cable.

If it does work at 2.5G speeds, then the protocol that will be used for
that will be 2500base-X.

If it does work at 1G speeds, then the protocol that will be used for
that will be 1000base-X (which is the "standard" protocol for the host
connection for 1G SFPs.)

Going below that isn't technically possible, but can be done with SGMII
by forcing the link settings, but is there really any need to support
slower speeds? What possible valid reason could there be? A host not
supporting 1G speeds with a SFP cage would be utterly insane.

> +	__set_bit(PHY_INTERFACE_MODE_SGMII, interfaces);

I also disagree with this. Unless there is a PHY present, you can _not_
connect two hosts together that are using the SGMII protocol. The SGMII
"negotiation" protocol is _asymetric_, and it relies upon a PHY telling
the host what the link speed and duplex settings are. A host never
sends that information, so this will not "negotiate".
  

Patch

diff --git a/drivers/net/phy/sfp.c b/drivers/net/phy/sfp.c
index ee049efdf71b..80d2680f08ab 100644
--- a/drivers/net/phy/sfp.c
+++ b/drivers/net/phy/sfp.c
@@ -421,6 +421,18 @@  static void sfp_quirk_oem_2_5g(const struct sfp_eeprom_id *id,
 	sfp_quirk_disable_autoneg(id, modes, interfaces);
 }
 
+static void sfp_quirk_fs_dac(const struct sfp_eeprom_id *id,
+			     unsigned long *modes,
+			     unsigned long *interfaces)
+{
+	/* Fiberstore(FS)'s DAC SFP (SFPP-PC01) */
+	linkmode_set_bit(ETHTOOL_LINK_MODE_2500baseT_Full_BIT, modes);
+	linkmode_set_bit(ETHTOOL_LINK_MODE_1000baseT_Full_BIT, modes);
+	linkmode_set_bit(ETHTOOL_LINK_MODE_100baseT_Full_BIT, modes);
+	linkmode_set_bit(ETHTOOL_LINK_MODE_100baseT_Half_BIT, modes);
+	__set_bit(PHY_INTERFACE_MODE_SGMII, interfaces);
+}
+
 static void sfp_quirk_ubnt_uf_instant(const struct sfp_eeprom_id *id,
 				      unsigned long *modes,
 				      unsigned long *interfaces)
@@ -465,6 +477,8 @@  static const struct sfp_quirk sfp_quirks[] = {
 
 	// FS 2.5G Base-T
 	SFP_QUIRK_M("FS", "SFP-2.5G-T", sfp_quirk_oem_2_5g),
+	// FS DAC10G (SFPP-PC01)
+	SFP_QUIRK_M("FS", "SFPP-PC01", sfp_quirk_fs_dac),
 
 	// Lantech 8330-262D-E can operate at 2500base-X, but incorrectly report
 	// 2500MBd NRZ in their EEPROM