All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Russell King (Oracle)" <linux@armlinux.org.uk>
To: Wan Jiabing <wanjiabing@vivo.com>
Cc: Andrew Lunn <andrew@lunn.ch>,
	Heiner Kallweit <hkallweit1@gmail.com>,
	"David S. Miller" <davem@davemloft.net>,
	Eric Dumazet <edumazet@google.com>,
	Jakub Kicinski <kuba@kernel.org>, Paolo Abeni <pabeni@redhat.com>,
	Antoine Tenart <atenart@kernel.org>,
	netdev@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH v2 net] net: phy: mscc: Add error check when __phy_read() failed
Date: Wed, 11 May 2022 11:45:24 +0100	[thread overview]
Message-ID: <YnuTxAw06UHCY1mf@shell.armlinux.org.uk> (raw)
In-Reply-To: <20220510142247.16071-1-wanjiabing@vivo.com>

On Tue, May 10, 2022 at 10:22:45PM +0800, Wan Jiabing wrote:
> Calling __phy_read() might return a negative error code. Use 'int'
> to declare variables which call __phy_read() and also add error check
> for them.
> 
> The numerous callers of vsc8584_macsec_phy_read() don't expect it to
> fail. So don't return the error code from __phy_read(), but also don't
> return random values if it does fail.
> 
> Fixes: fa164e40c53b ("net: phy: mscc: split the driver into separate files")
> Signed-off-by: Wan Jiabing <wanjiabing@vivo.com>
> ---
> Changelog:
> v2:
> - Sort variable declaration and add a detailed comment.
> ---
>  drivers/net/phy/mscc/mscc_macsec.c | 11 ++++++++---
>  1 file changed, 8 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/net/phy/mscc/mscc_macsec.c b/drivers/net/phy/mscc/mscc_macsec.c
> index b7b2521c73fb..58ad11a697b6 100644
> --- a/drivers/net/phy/mscc/mscc_macsec.c
> +++ b/drivers/net/phy/mscc/mscc_macsec.c
> @@ -22,9 +22,9 @@
>  static u32 vsc8584_macsec_phy_read(struct phy_device *phydev,
>  				   enum macsec_bank bank, u32 reg)
>  {
> -	u32 val, val_l = 0, val_h = 0;
> +	int rc, val, val_l, val_h;
>  	unsigned long deadline;
> -	int rc;
> +	u32 ret = 0;
>  
>  	rc = phy_select_page(phydev, MSCC_PHY_PAGE_MACSEC);
>  	if (rc < 0)
> @@ -47,15 +47,20 @@ static u32 vsc8584_macsec_phy_read(struct phy_device *phydev,
>  	deadline = jiffies + msecs_to_jiffies(PROC_CMD_NCOMPLETED_TIMEOUT_MS);
>  	do {
>  		val = __phy_read(phydev, MSCC_EXT_PAGE_MACSEC_19);
> +		if (val < 0)
> +			goto failed;
>  	} while (time_before(jiffies, deadline) && !(val & MSCC_PHY_MACSEC_19_CMD));
>  
>  	val_l = __phy_read(phydev, MSCC_EXT_PAGE_MACSEC_17);
>  	val_h = __phy_read(phydev, MSCC_EXT_PAGE_MACSEC_18);
>  
> +	if (val_l > 0 && val_h > 0)
> +		ret = (val_h << 16) | val_l;
> +
>  failed:
>  	phy_restore_page(phydev, rc, rc);
>  
> -	return (val_h << 16) | val_l;
> +	return ret;
>  }

This is still wrong - phy_restore_page() can fail to retore the page.

It's rather unfortunate that you need to return a u32, where the
high values become negative ints, which means you can't use
phy_restore_page() as it's supposed to be used.

If you fail to read from the PHY, is returning zero acceptable?

I think what you should be doing at the very least is:

	rc = phy_select_page(phydev, MSCC_PHY_PAGE_MACSEC);
	if (rc < 0)
		goto failed;

	rc = __phy_write(phydev, MSCC_EXT_PAGE_MACSEC_20, ...);
	if (rc < 0)
		goto failed;

	...

	rc = __phy_write(phydev, MSCC_EXT_PAGE_MACSEC_19, ...);
	if (rc < 0)
		goto failed;

	...
	do {
		val = __phy_read(phydev, MSCC_EXT_PAGE_MACSEC_19);
		if (val < 0) {
			rc = val;
			goto failed;
		}
	} while (...);

	val_l = __phy_read(phydev, MSCC_EXT_PAGE_MACSEC_17);
	if (val_l < 0) {
		rc = val_l;
		goto failed;
	}

	val_h = __phy_read(phydev, MSCC_EXT_PAGE_MACSEC_18);
	if (val_h < 0)
		rc = val_h;

failed:
	rc = phy_restore_page(phgydev, rc, 0);

	return rc < 0 ? 0 : val_h << 16 | val_l;

Which means that if any of the PHY IO functions fail at any point, this
returns zero.

-- 
RMK's Patch system: https://www.armlinux.org.uk/developer/patches/
FTTP is here! 40Mbps down 10Mbps up. Decent connectivity at last!

      parent reply	other threads:[~2022-05-11 10:45 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-05-10 14:22 [PATCH v2 net] net: phy: mscc: Add error check when __phy_read() failed Wan Jiabing
2022-05-10 14:48 ` Antoine Tenart
2022-05-10 15:08   ` Andrew Lunn
2022-05-10 15:33     ` Antoine Tenart
2022-05-11  3:23       ` Jiabing Wan
2022-05-11 10:45 ` Russell King (Oracle) [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=YnuTxAw06UHCY1mf@shell.armlinux.org.uk \
    --to=linux@armlinux.org.uk \
    --cc=andrew@lunn.ch \
    --cc=atenart@kernel.org \
    --cc=davem@davemloft.net \
    --cc=edumazet@google.com \
    --cc=hkallweit1@gmail.com \
    --cc=kuba@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=netdev@vger.kernel.org \
    --cc=pabeni@redhat.com \
    --cc=wanjiabing@vivo.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.