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: Windows password security audit tool. GUI, reports in PDF.
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date: Tue, 20 Jun 2023 19:45:24 +0200
From: Christophe JAILLET <christophe.jaillet@...adoo.fr>
To: Andrew Lunn <andrew@...n.ch>, Heiner Kallweit <hkallweit1@...il.com>,
 Russell King <linux@...linux.org.uk>, "David S. Miller"
 <davem@...emloft.net>, Eric Dumazet <edumazet@...gle.com>,
 Jakub Kicinski <kuba@...nel.org>, Paolo Abeni <pabeni@...hat.com>,
 Liam Girdwood <lgirdwood@...il.com>, Mark Brown <broonie@...nel.org>
Cc: linux-kernel@...r.kernel.org, kernel-janitors@...r.kernel.org,
 netdev@...r.kernel.org
Subject: Re: [PATCH net-next] net: phy: at803x: Use
 devm_regulator_get_enable_optional()

Le 17/06/2023 à 16:24, Christophe JAILLET a écrit :
> Use devm_regulator_get_enable_optional() instead of hand writing it. It
> saves some line of code.
> 
> Signed-off-by: Christophe JAILLET <christophe.jaillet@...adoo.fr>
> ---
> Compile tested-only.
> 
> If my reading is correct, regulator_disable() is still called in the same
> order, should an error occur or the driver be removed.
> ---
>   drivers/net/phy/at803x.c | 44 +++++++---------------------------------
>   1 file changed, 7 insertions(+), 37 deletions(-)
> 
> diff --git a/drivers/net/phy/at803x.c b/drivers/net/phy/at803x.c
> index 656136628ffd..c1f307d90518 100644
> --- a/drivers/net/phy/at803x.c
> +++ b/drivers/net/phy/at803x.c
> @@ -304,7 +304,6 @@ struct at803x_priv {
>   	bool is_1000basex;
>   	struct regulator_dev *vddio_rdev;
>   	struct regulator_dev *vddh_rdev;
> -	struct regulator *vddio;
>   	u64 stats[ARRAY_SIZE(at803x_hw_stats)];
>   };
>   
> @@ -824,11 +823,11 @@ static int at803x_parse_dt(struct phy_device *phydev)
>   		if (ret < 0)
>   			return ret;
>   
> -		priv->vddio = devm_regulator_get_optional(&phydev->mdio.dev,
> -							  "vddio");
> -		if (IS_ERR(priv->vddio)) {

Hi,

my patch is not broken by itself, but the existing code looks spurious.

If the optional regulator is not found, then -ENODEV is returned, 
at803x_parse_dt() will return this error and the probe will fail.

It looks that the test should be more subtle.

I can send a follow up patch, unless there is a better way to fix the 
pre-existing issue.

See [1] for a more detailed explanation.

CJ

[1]: https://lore.kernel.org/all/ZJFqCQ8bbBoX3l1g@hovoldconsulting.com/

> +		ret = devm_regulator_get_enable_optional(&phydev->mdio.dev,
> +							 "vddio");
> +		if (ret) {
>   			phydev_err(phydev, "failed to get VDDIO regulator\n");
> -			return PTR_ERR(priv->vddio);
> +			return ret;
>   		}
>   
>   		/* Only AR8031/8033 support 1000Base-X for SFP modules */
> @@ -856,12 +855,6 @@ static int at803x_probe(struct phy_device *phydev)
>   	if (ret)
>   		return ret;
>   
> -	if (priv->vddio) {
> -		ret = regulator_enable(priv->vddio);
> -		if (ret < 0)
> -			return ret;
> -	}
> -
>   	if (phydev->drv->phy_id == ATH8031_PHY_ID) {
>   		int ccr = phy_read(phydev, AT803X_REG_CHIP_CONFIG);
>   		int mode_cfg;
> @@ -869,10 +862,8 @@ static int at803x_probe(struct phy_device *phydev)
>   			.wolopts = 0,
>   		};
>   
> -		if (ccr < 0) {
> -			ret = ccr;
> -			goto err;
> -		}
> +		if (ccr < 0)
> +			return ccr;
>   		mode_cfg = ccr & AT803X_MODE_CFG_MASK;
>   
>   		switch (mode_cfg) {
> @@ -890,25 +881,11 @@ static int at803x_probe(struct phy_device *phydev)
>   		ret = at803x_set_wol(phydev, &wol);
>   		if (ret < 0) {
>   			phydev_err(phydev, "failed to disable WOL on probe: %d\n", ret);
> -			goto err;
> +			return ret;
>   		}
>   	}
>   
>   	return 0;
> -
> -err:
> -	if (priv->vddio)
> -		regulator_disable(priv->vddio);
> -
> -	return ret;
> -}
> -
> -static void at803x_remove(struct phy_device *phydev)
> -{
> -	struct at803x_priv *priv = phydev->priv;
> -
> -	if (priv->vddio)
> -		regulator_disable(priv->vddio);
>   }
>   
>   static int at803x_get_features(struct phy_device *phydev)
> @@ -2021,7 +1998,6 @@ static struct phy_driver at803x_driver[] = {
>   	.name			= "Qualcomm Atheros AR8035",
>   	.flags			= PHY_POLL_CABLE_TEST,
>   	.probe			= at803x_probe,
> -	.remove			= at803x_remove,
>   	.config_aneg		= at803x_config_aneg,
>   	.config_init		= at803x_config_init,
>   	.soft_reset		= genphy_soft_reset,
> @@ -2043,7 +2019,6 @@ static struct phy_driver at803x_driver[] = {
>   	.name			= "Qualcomm Atheros AR8030",
>   	.phy_id_mask		= AT8030_PHY_ID_MASK,
>   	.probe			= at803x_probe,
> -	.remove			= at803x_remove,
>   	.config_init		= at803x_config_init,
>   	.link_change_notify	= at803x_link_change_notify,
>   	.set_wol		= at803x_set_wol,
> @@ -2059,7 +2034,6 @@ static struct phy_driver at803x_driver[] = {
>   	.name			= "Qualcomm Atheros AR8031/AR8033",
>   	.flags			= PHY_POLL_CABLE_TEST,
>   	.probe			= at803x_probe,
> -	.remove			= at803x_remove,
>   	.config_init		= at803x_config_init,
>   	.config_aneg		= at803x_config_aneg,
>   	.soft_reset		= genphy_soft_reset,
> @@ -2082,7 +2056,6 @@ static struct phy_driver at803x_driver[] = {
>   	PHY_ID_MATCH_EXACT(ATH8032_PHY_ID),
>   	.name			= "Qualcomm Atheros AR8032",
>   	.probe			= at803x_probe,
> -	.remove			= at803x_remove,
>   	.flags			= PHY_POLL_CABLE_TEST,
>   	.config_init		= at803x_config_init,
>   	.link_change_notify	= at803x_link_change_notify,
> @@ -2100,7 +2073,6 @@ static struct phy_driver at803x_driver[] = {
>   	PHY_ID_MATCH_EXACT(ATH9331_PHY_ID),
>   	.name			= "Qualcomm Atheros AR9331 built-in PHY",
>   	.probe			= at803x_probe,
> -	.remove			= at803x_remove,
>   	.suspend		= at803x_suspend,
>   	.resume			= at803x_resume,
>   	.flags			= PHY_POLL_CABLE_TEST,
> @@ -2117,7 +2089,6 @@ static struct phy_driver at803x_driver[] = {
>   	PHY_ID_MATCH_EXACT(QCA9561_PHY_ID),
>   	.name			= "Qualcomm Atheros QCA9561 built-in PHY",
>   	.probe			= at803x_probe,
> -	.remove			= at803x_remove,
>   	.suspend		= at803x_suspend,
>   	.resume			= at803x_resume,
>   	.flags			= PHY_POLL_CABLE_TEST,
> @@ -2183,7 +2154,6 @@ static struct phy_driver at803x_driver[] = {
>   	.name			= "Qualcomm QCA8081",
>   	.flags			= PHY_POLL_CABLE_TEST,
>   	.probe			= at803x_probe,
> -	.remove			= at803x_remove,
>   	.config_intr		= at803x_config_intr,
>   	.handle_interrupt	= at803x_handle_interrupt,
>   	.get_tunable		= at803x_get_tunable,


Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ