lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite for Android: free password hash cracker in your pocket
[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID:
 <BY3PR18MB47076A26714A7AC5A34D7F32A0A1A@BY3PR18MB4707.namprd18.prod.outlook.com>
Date: Thu, 11 Dec 2025 18:39:28 +0000
From: Sai Krishna Gajula <saikrishnag@...vell.com>
To: Marek Vasut <marek.vasut@...lbox.org>,
        "netdev@...r.kernel.org"
	<netdev@...r.kernel.org>
CC: "David S. Miller" <davem@...emloft.net>,
        Aleksander Jan Bajkowski
	<olek2@...pl>, Andrew Lunn <andrew@...n.ch>,
        Conor Dooley
	<conor+dt@...nel.org>,
        Eric Dumazet <edumazet@...gle.com>,
        Florian Fainelli
	<f.fainelli@...il.com>,
        Heiner Kallweit <hkallweit1@...il.com>,
        Ivan Galkin
	<ivan.galkin@...s.com>, Jakub Kicinski <kuba@...nel.org>,
        Krzysztof Kozlowski
	<krzk+dt@...nel.org>,
        Michael Klein <michael@...sekall.de>, Paolo Abeni
	<pabeni@...hat.com>,
        Rob Herring <robh@...nel.org>, Russell King
	<linux@...linux.org.uk>,
        Vladimir Oltean <vladimir.oltean@....com>,
        "devicetree@...r.kernel.org" <devicetree@...r.kernel.org>
Subject: RE: [net-next,PATCH v2 3/3] net: phy: realtek: Add property to enable
 SSC



> -----Original Message-----
> From: Marek Vasut <marek.vasut@...lbox.org>
> Sent: Thursday, December 4, 2025 2:38 AM
> To: netdev@...r.kernel.org
> Cc: Marek Vasut <marek.vasut@...lbox.org>; David S. Miller
> <davem@...emloft.net>; Aleksander Jan Bajkowski <olek2@...pl>; Andrew
> Lunn <andrew@...n.ch>; Conor Dooley <conor+dt@...nel.org>; Eric
> Dumazet <edumazet@...gle.com>; Florian Fainelli <f.fainelli@...il.com>;
> Heiner Kallweit <hkallweit1@...il.com>; Ivan Galkin
> <ivan.galkin@...s.com>; Jakub Kicinski <kuba@...nel.org>; Krzysztof
> Kozlowski <krzk+dt@...nel.org>; Michael Klein <michael@...sekall.de>;
> Paolo Abeni <pabeni@...hat.com>; Rob Herring <robh@...nel.org>; Russell
> King <linux@...linux.org.uk>; Vladimir Oltean <vladimir.oltean@....com>;
> devicetree@...r.kernel.org
> Subject: [net-next,PATCH v2 3/3] net: phy: realtek: Add property
> to enable SSC
> 
> Add support for spread spectrum clocking (SSC) on RTL8211F(D)(I)-CG,
> RTL8211FS(I)(-VS)-CG, RTL8211FG(I)(-VS)-CG PHYs. The implementation
> follows EMI improvement application note Rev. 1. 2 for these PHYs. The
> current implementation enables SSC 
> Add support for spread spectrum clocking (SSC) on RTL8211F(D)(I)-CG,
> RTL8211FS(I)(-VS)-CG, RTL8211FG(I)(-VS)-CG PHYs. The implementation
> follows EMI improvement application note Rev. 1.2 for these PHYs.
> 
> The current implementation enables SSC for both RXC and SYSCLK clock
> signals. Introduce DT properties 'realtek,clkout-ssc-enable', 'realtek,rxc-ssc-
> enable' and 'realtek,sysclk-ssc-enable' which control CLKOUT, RXC and SYSCLK
> SSC spread spectrum clocking enablement on these signals.
> 
> Signed-off-by: Marek Vasut <marek.vasut@...lbox.org>
> ---
> Cc: "David S. Miller" <davem@...emloft.net>
> Cc: Aleksander Jan Bajkowski <olek2@...pl>
> Cc: Andrew Lunn <andrew@...n.ch>
> Cc: Conor Dooley <conor+dt@...nel.org>
> Cc: Eric Dumazet <edumazet@...gle.com>
> Cc: Florian Fainelli <f.fainelli@...il.com>
> Cc: Heiner Kallweit <hkallweit1@...il.com>
> Cc: Ivan Galkin <ivan.galkin@...s.com>
> Cc: Jakub Kicinski <kuba@...nel.org>
> Cc: Krzysztof Kozlowski <krzk+dt@...nel.org>
> Cc: Michael Klein <michael@...sekall.de>
> Cc: Paolo Abeni <pabeni@...hat.com>
> Cc: Rob Herring <robh@...nel.org>
> Cc: Russell King <linux@...linux.org.uk>
> Cc: Vladimir Oltean <vladimir.oltean@....com>
> Cc: devicetree@...r.kernel.org
> Cc: netdev@...r.kernel.org
> ---
> V2: Split SSC clock control for each CLKOUT, RXC, SYSCLK signal
> ---
>  drivers/net/phy/realtek/realtek_main.c | 124 +++++++++++++++++++++++++
>  1 file changed, 124 insertions(+)
> 
> diff --git a/drivers/net/phy/realtek/realtek_main.c
> b/drivers/net/phy/realtek/realtek_main.c
> index 67ecf3d4af2b1..ac80653cdbe28 100644
> --- a/drivers/net/phy/realtek/realtek_main.c
> +++ b/drivers/net/phy/realtek/realtek_main.c
> @@ -74,11 +74,19 @@
> 
>  #define RTL8211F_PHYCR2				0x19
>  #define RTL8211F_CLKOUT_EN			BIT(0)
> +#define RTL8211F_SYSCLK_SSC_EN			BIT(3)
>  #define RTL8211F_PHYCR2_PHY_EEE_ENABLE		BIT(5)
> +#define RTL8211F_CLKOUT_SSC_EN			BIT(7)
> 
>  #define RTL8211F_INSR_PAGE			0xa43
>  #define RTL8211F_INSR				0x1d
> 
> +/* RTL8211F SSC settings */
> +#define RTL8211F_SSC_PAGE			0xc44
> +#define RTL8211F_SSC_RXC			0x13
> +#define RTL8211F_SSC_SYSCLK			0x17
> +#define RTL8211F_SSC_CLKOUT			0x19
> +
>  /* RTL8211F LED configuration */
>  #define RTL8211F_LEDCR_PAGE			0xd04
>  #define RTL8211F_LEDCR				0x10
> @@ -203,6 +211,9 @@ MODULE_LICENSE("GPL");  struct rtl821x_priv {
>  	bool enable_aldps;
>  	bool disable_clk_out;
> +	bool enable_clkout_ssc;
> +	bool enable_rxc_ssc;
> +	bool enable_sysclk_ssc;
>  	struct clk *clk;
>  	/* rtl8211f */
>  	u16 iner;
> @@ -266,6 +277,12 @@ static int rtl821x_probe(struct phy_device *phydev)
>  						   "realtek,aldps-enable");
>  	priv->disable_clk_out = of_property_read_bool(dev->of_node,
>  						      "realtek,clkout-disable");
> +	priv->enable_clkout_ssc = of_property_read_bool(dev->of_node,
> +							"realtek,clkout-ssc-
> enable");
> +	priv->enable_rxc_ssc = of_property_read_bool(dev->of_node,
> +						     "realtek,rxc-ssc-enable");
> +	priv->enable_sysclk_ssc = of_property_read_bool(dev->of_node,
> +							"realtek,sysclk-ssc-
> enable");
> 
>  	phydev->priv = priv;
> 
> @@ -700,6 +717,101 @@ static int rtl8211f_config_phy_eee(struct
> phy_device *phydev)
>  				RTL8211F_PHYCR2_PHY_EEE_ENABLE, 0);  }
> 
> +static int rtl8211f_config_clkout_ssc(struct phy_device *phydev) {
> +	struct rtl821x_priv *priv = phydev->priv;
> +	struct device *dev = &phydev->mdio.dev;
> +	int ret;
> +
> +	/* The value is preserved if the device tree property is absent */
> +	if (!priv->enable_clkout_ssc)
> +		return 0;
> +
> +	/* RTL8211FVD has no PHYCR2 register */
> +	if (phydev->drv->phy_id == RTL_8211FVD_PHYID)
> +		return 0;
> +
> +	/* Unnamed registers from EMI improvement parameters application
> note 1.2 */
> +	ret = phy_write_paged(phydev, 0xd09, 0x10, 0xcf00);
> +	if (ret < 0) {
> +		dev_err(dev, "CLKOUT SCC initialization failed: %pe\n",
> ERR_PTR(ret));
> +		return ret;
> +	}
> +
> +	ret = phy_write_paged(phydev, RTL8211F_SSC_PAGE,
> RTL8211F_SSC_CLKOUT, 0x38c3);
> +	if (ret < 0) {
> +		dev_err(dev, "CLKOUT SCC configuration failed: %pe\n",
> ERR_PTR(ret));
> +		return ret;
> +	}
> +
> +	/*
> +	 * Enable CLKOUT SSC using PHYCR2 bit 7 , this step is missing from
> the
> +	 * EMI improvement parameters application note 1.2 section 2.3
> +	 */
> +	ret = phy_modify_paged(phydev, RTL8211F_PHYCR_PAGE,
> RTL8211F_PHYCR2,
> +			       RTL8211F_CLKOUT_SSC_EN,
> RTL8211F_CLKOUT_SSC_EN);
> +	if (ret < 0) {
> +		dev_err(dev, "CLKOUT SCC enable failed: %pe\n",
> ERR_PTR(ret));
> +		return ret;
> +	}
> +
> +	return 0;
> +}
> +
> +static int rtl8211f_config_rxc_ssc(struct phy_device *phydev) {
> +	struct rtl821x_priv *priv = phydev->priv;
> +	struct device *dev = &phydev->mdio.dev;
> +	int ret;
> +
> +	/* The value is preserved if the device tree property is absent */
> +	if (!priv->enable_rxc_ssc)
> +		return 0;
> +
> +	/* RTL8211FVD has no PHYCR2 register */
> +	if (phydev->drv->phy_id == RTL_8211FVD_PHYID)
> +		return 0;
> +
> +	ret = phy_write_paged(phydev, RTL8211F_SSC_PAGE,
> RTL8211F_SSC_RXC, 0x5f00);
> +	if (ret < 0) {
> +		dev_err(dev, "RXC SCC configuration failed: %pe\n",
> ERR_PTR(ret));
> +		return ret;
> +	}
> +
> +	return 0;
> +}
> +
> +static int rtl8211f_config_sysclk_ssc(struct phy_device *phydev) {

Minor nit:   Kernel style requires the opening brace on the next line, also in other places.
static int rtl8211f_config_sysclk_ssc(struct phy_device *phydev) 
{

> +	struct rtl821x_priv *priv = phydev->priv;
> +	struct device *dev = &phydev->mdio.dev;
> +	int ret;
> +
> +	/* The value is preserved if the device tree property is absent */
> +	if (!priv->enable_sysclk_ssc)
> +		return 0;
> +
> +	/* RTL8211FVD has no PHYCR2 register */
> +	if (phydev->drv->phy_id == RTL_8211FVD_PHYID)
> +		return 0;
> +
> +	ret = phy_write_paged(phydev, RTL8211F_SSC_PAGE,
> RTL8211F_SSC_SYSCLK, 0x4f00);
> +	if (ret < 0) {
> +		dev_err(dev, "SYSCLK SCC configuration failed: %pe\n",
> ERR_PTR(ret));
> +		return ret;
> +	}
> +
> +	/* Enable SSC */
> +	ret = phy_modify_paged(phydev, RTL8211F_PHYCR_PAGE,
> RTL8211F_PHYCR2,
> +			       RTL8211F_SYSCLK_SSC_EN,
> RTL8211F_SYSCLK_SSC_EN);
> +	if (ret < 0) {
> +		dev_err(dev, "SYSCLK SCC enable failed: %pe\n",
> ERR_PTR(ret));
> +		return ret;
> +	}
> +
> +	return 0;
> +}
> +
>  static int rtl8211f_config_init(struct phy_device *phydev)  {
>  	struct device *dev = &phydev->mdio.dev; @@ -723,6 +835,18 @@
> static int rtl8211f_config_init(struct phy_device *phydev)
>  		return ret;
>  	}
> 
> +	ret = rtl8211f_config_clkout_ssc(phydev);
> +	if (ret)
> +		return ret;
> +
> +	ret = rtl8211f_config_rxc_ssc(phydev);
> +	if (ret)
> +		return ret;
> +
> +	ret = rtl8211f_config_sysclk_ssc(phydev);
> +	if (ret)
> +		return ret;
> +
>  	return rtl8211f_config_phy_eee(phydev);  }
> 
> --
> 2.51.0
> 

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ