From nobody Fri Oct 3 00:03:11 2025 Received: from smtpout-03.galae.net (smtpout-03.galae.net [185.246.85.4]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 554C335FC3A; Tue, 9 Sep 2025 15:27:57 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.246.85.4 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757431679; cv=none; b=Ril51NAyeHVI6OyJJi67Vh3CEhC/1QWaAAhfmIYtDeKbd67jn8tlIqjLrTpcEGC9zl6+ZmXeE+AOByP7LbfWKyO6BDuZp79ttpBJ3ILtgxL9DTxuMbUYBIs81F+0/Ow0M3DrJtYZsqdWgTXCVbNdae5kz0dkHvM945C3nUo5XlA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1757431679; c=relaxed/simple; bh=oCfjDcMQFDFXw+75U4+GIZVn+hcIWVXGFu34QVjVWs8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=oaNnPPi6/DaskijcFwZ77LlB5V+Idn6nN5zk9hUPnW99h+h2i2RDhaDF25p8dIJecAPbUf5ijdqjMarPWSUHeMeAfmMuPEWLUVfgZVdOI+Rst8wOjQzhwXTbAqbrp42fXEkyL9QX4ZVjcKzRGbOOfjKRSkoGqo+LNThQJvtLiSw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=h7I3b4db; arc=none smtp.client-ip=185.246.85.4 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="h7I3b4db" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-03.galae.net (Postfix) with ESMTPS id C84FA4E408EC; Tue, 9 Sep 2025 15:27:55 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 9F6B660630; Tue, 9 Sep 2025 15:27:55 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 67D16102F2584; Tue, 9 Sep 2025 17:27:50 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1757431674; h=from:subject:date:message-id:to:cc:mime-version: content-transfer-encoding:in-reply-to:references; bh=JFrQJzmg8Zgzx93on0sdS3XZl9D0t9ynDO/E9zD8E+0=; b=h7I3b4dbU9/aFGeaZOSA5403hHQh6WbAM23+PK/rhsHn5TGcatMXpiNR5tUVdexbAL96wm LBRIVDsgWXa6tTsSSVXi++Sq+B9Puw7v0CLdou/GHIEdQDToWLlO5EiJqQY/SMUHUcWmkk wKdJhKuSiP1HJryRRgrr7KBqjU4DsOLJSSB3tfeUYd+FXJBm+1kWSTCyxKjQokoytJ/T2g +dTK7U4O/ZILbjcxnQBBpous3r9e6uSnUrmgJdx6iBEYfh4cKkUoq/KZoAp5wp6N+4dFyK XjYc8ZgMjE1qJCqgCdU6JfXJdcjYlxKB2xpkBpBC3M203T6mpXDNEMczFVInbA== From: Maxime Chevallier To: davem@davemloft.net Cc: Maxime Chevallier , netdev@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-msm@vger.kernel.org, thomas.petazzoni@bootlin.com, Andrew Lunn , Jakub Kicinski , Eric Dumazet , Paolo Abeni , Russell King , linux-arm-kernel@lists.infradead.org, Christophe Leroy , Herve Codina , Florian Fainelli , Heiner Kallweit , Vladimir Oltean , =?UTF-8?q?K=C3=B6ry=20Maincent?= , =?UTF-8?q?Marek=20Beh=C3=BAn?= , Oleksij Rempel , =?UTF-8?q?Nicol=C3=B2=20Veronese?= , Simon Horman , mwojtas@chromium.org, Antoine Tenart , devicetree@vger.kernel.org, Conor Dooley , Krzysztof Kozlowski , Rob Herring , Romain Gantois , Daniel Golle , Dimitri Fedrau Subject: [PATCH net-next v12 11/18] net: phy: marvell-88x2222: Support SFP through phy_port interface Date: Tue, 9 Sep 2025 17:26:07 +0200 Message-ID: <20250909152617.119554-12-maxime.chevallier@bootlin.com> X-Mailer: git-send-email 2.49.0 In-Reply-To: <20250909152617.119554-1-maxime.chevallier@bootlin.com> References: <20250909152617.119554-1-maxime.chevallier@bootlin.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Last-TLS-Session-Version: TLSv1.3 Content-Type: text/plain; charset="utf-8" The 88x2222 PHY from Marvell only supports serialised modes as its line-facing interfaces. Convert that driver to the generic phylib SFP handling. Signed-off-by: Maxime Chevallier Reviewed-by: Christophe Leroy --- drivers/net/phy/marvell-88x2222.c | 95 +++++++++++++------------------ 1 file changed, 38 insertions(+), 57 deletions(-) diff --git a/drivers/net/phy/marvell-88x2222.c b/drivers/net/phy/marvell-88= x2222.c index fad2f54c1eac..ba1bbb6c63d6 100644 --- a/drivers/net/phy/marvell-88x2222.c +++ b/drivers/net/phy/marvell-88x2222.c @@ -13,7 +13,7 @@ #include #include #include -#include +#include #include =20 /* Port PCS Configuration */ @@ -473,90 +473,70 @@ static int mv2222_config_init(struct phy_device *phyd= ev) return 0; } =20 -static int mv2222_sfp_insert(void *upstream, const struct sfp_eeprom_id *i= d) +static int mv2222_configure_serdes(struct phy_port *port, bool enable, + phy_interface_t interface) { - DECLARE_PHY_INTERFACE_MASK(interfaces); - struct phy_device *phydev =3D upstream; - phy_interface_t sfp_interface; + struct phy_device *phydev =3D port_phydev(port); struct mv2222_data *priv; - struct device *dev; - int ret; - - __ETHTOOL_DECLARE_LINK_MODE_MASK(sfp_supported) =3D { 0, }; + int ret =3D 0; =20 priv =3D phydev->priv; - dev =3D &phydev->mdio.dev; - - sfp_parse_support(phydev->sfp_bus, id, sfp_supported, interfaces); - phydev->port =3D sfp_parse_port(phydev->sfp_bus, id, sfp_supported); - sfp_interface =3D sfp_select_interface(phydev->sfp_bus, sfp_supported); - - dev_info(dev, "%s SFP module inserted\n", phy_modes(sfp_interface)); + priv->line_interface =3D interface; =20 - if (sfp_interface !=3D PHY_INTERFACE_MODE_10GBASER && - sfp_interface !=3D PHY_INTERFACE_MODE_1000BASEX && - sfp_interface !=3D PHY_INTERFACE_MODE_SGMII) { - dev_err(dev, "Incompatible SFP module inserted\n"); + if (enable) { + linkmode_and(priv->supported, phydev->supported, port->supported); =20 - return -EINVAL; - } - - priv->line_interface =3D sfp_interface; - linkmode_and(priv->supported, phydev->supported, sfp_supported); + ret =3D mv2222_config_line(phydev); + if (ret < 0) + return ret; =20 - ret =3D mv2222_config_line(phydev); - if (ret < 0) - return ret; + if (mutex_trylock(&phydev->lock)) { + ret =3D mv2222_config_aneg(phydev); + mutex_unlock(&phydev->lock); + } =20 - if (mutex_trylock(&phydev->lock)) { - ret =3D mv2222_config_aneg(phydev); - mutex_unlock(&phydev->lock); + } else { + linkmode_zero(priv->supported); } =20 return ret; } =20 -static void mv2222_sfp_remove(void *upstream) +static void mv2222_port_link_up(struct phy_port *port) { - struct phy_device *phydev =3D upstream; - struct mv2222_data *priv; - - priv =3D phydev->priv; - - priv->line_interface =3D PHY_INTERFACE_MODE_NA; - linkmode_zero(priv->supported); - phydev->port =3D PORT_NONE; -} - -static void mv2222_sfp_link_up(void *upstream) -{ - struct phy_device *phydev =3D upstream; + struct phy_device *phydev =3D port_phydev(port); struct mv2222_data *priv; =20 priv =3D phydev->priv; priv->sfp_link =3D true; } =20 -static void mv2222_sfp_link_down(void *upstream) +static void mv2222_port_link_down(struct phy_port *port) { - struct phy_device *phydev =3D upstream; + struct phy_device *phydev =3D port_phydev(port); struct mv2222_data *priv; =20 priv =3D phydev->priv; priv->sfp_link =3D false; } =20 -static const struct sfp_upstream_ops sfp_phy_ops =3D { - .module_insert =3D mv2222_sfp_insert, - .module_remove =3D mv2222_sfp_remove, - .link_up =3D mv2222_sfp_link_up, - .link_down =3D mv2222_sfp_link_down, - .attach =3D phy_sfp_attach, - .detach =3D phy_sfp_detach, - .connect_phy =3D phy_sfp_connect_phy, - .disconnect_phy =3D phy_sfp_disconnect_phy, +static const struct phy_port_ops mv2222_port_ops =3D { + .link_up =3D mv2222_port_link_up, + .link_down =3D mv2222_port_link_down, + .configure_mii =3D mv2222_configure_serdes, }; =20 +static int mv2222_attach_mii_port(struct phy_device *phydev, struct phy_po= rt *port) +{ + port->ops =3D &mv2222_port_ops; + + __set_bit(PHY_INTERFACE_MODE_10GBASER, port->interfaces); + __set_bit(PHY_INTERFACE_MODE_1000BASEX, port->interfaces); + __set_bit(PHY_INTERFACE_MODE_SGMII, port->interfaces); + + return 0; +} + static int mv2222_probe(struct phy_device *phydev) { struct device *dev =3D &phydev->mdio.dev; @@ -592,7 +572,7 @@ static int mv2222_probe(struct phy_device *phydev) priv->line_interface =3D PHY_INTERFACE_MODE_NA; phydev->priv =3D priv; =20 - return phy_sfp_probe(phydev, &sfp_phy_ops); + return 0; } =20 static struct phy_driver mv2222_drivers[] =3D { @@ -609,6 +589,7 @@ static struct phy_driver mv2222_drivers[] =3D { .suspend =3D mv2222_suspend, .resume =3D mv2222_resume, .read_status =3D mv2222_read_status, + .attach_mii_port =3D mv2222_attach_mii_port, }, }; module_phy_driver(mv2222_drivers); --=20 2.49.0