Re: [PATCH net-next 3/3] net: phy: dp83869: Support 1000Base-X SFP
From: Russell King (Oracle)
Date: Tue Nov 04 2025 - 04:07:35 EST
On Tue, Nov 04, 2025 at 09:50:36AM +0100, Romain Gantois wrote:
> +static void dp83869_module_remove(void *upstream)
> +{
> + struct phy_device *phydev = upstream;
> +
> + phydev_info(phydev, "SFP module removed\n");
> +
> + /* Set speed and duplex to unknown to avoid downshifting warning. */
> + phydev->speed = SPEED_UNKNOWN;
> + phydev->duplex = DUPLEX_UNKNOWN;
Should this be done by core phylib code?
> +}
> +
> +static int dp83869_module_insert(void *upstream, const struct sfp_eeprom_id *id)
> +{
> + __ETHTOOL_DECLARE_LINK_MODE_MASK(phy_support);
> + __ETHTOOL_DECLARE_LINK_MODE_MASK(sfp_support);
> + struct phy_device *phydev = upstream;
> + const struct sfp_module_caps *caps;
> + struct dp83869_private *dp83869;
> + phy_interface_t interface;
> + int ret;
> +
> + linkmode_zero(phy_support);
> + linkmode_set_bit(ETHTOOL_LINK_MODE_1000baseX_Full_BIT, phy_support);
> +
> + caps = sfp_get_module_caps(phydev->sfp_bus);
> +
> + linkmode_and(sfp_support, phy_support, caps->link_modes);
> +
> + if (linkmode_empty(sfp_support)) {
> + phydev_err(phydev, "incompatible SFP module inserted\n");
> + return -EINVAL;
> + }
> +
> + interface = sfp_select_interface(phydev->sfp_bus, sfp_support);
> +
> + phydev_info(phydev, "%s SFP compatible link mode: %s\n", __func__,
> + phy_modes(interface));
> +
> + dp83869 = phydev->priv;
> +
> + switch (interface) {
> + case PHY_INTERFACE_MODE_1000BASEX:
> + dp83869->mode = DP83869_RGMII_1000_BASE;
> + phydev->port = PORT_FIBRE;
> + break;
> + default:
> + phydev_err(phydev, "incompatible PHY-to-SFP module link mode %s!\n",
> + phy_modes(interface));
> + return -EINVAL;
> + }
If you only support 1000BASE-X, please test that in the interface mode
mask (caps->interfaces) rather than going round this long winded
method.
--
RMK's Patch system: https://www.armlinux.org.uk/developer/patches/
FTTP is here! 80Mbps down 10Mbps up. Decent connectivity at last!