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]
Message-ID: <20210604115153.pux7qbrybs4ckg4j@skbuf>
Date:   Fri, 4 Jun 2021 11:51:54 +0000
From:   Vladimir Oltean <vladimir.oltean@....com>
To:     Michael Sit Wei Hong <michael.wei.hong.sit@...el.com>
CC:     "Jose.Abreu@...opsys.com" <Jose.Abreu@...opsys.com>,
        "andrew@...n.ch" <andrew@...n.ch>,
        "hkallweit1@...il.com" <hkallweit1@...il.com>,
        "linux@...linux.org.uk" <linux@...linux.org.uk>,
        "kuba@...nel.org" <kuba@...nel.org>,
        "netdev@...r.kernel.org" <netdev@...r.kernel.org>,
        "peppe.cavallaro@...com" <peppe.cavallaro@...com>,
        "alexandre.torgue@...s.st.com" <alexandre.torgue@...s.st.com>,
        "davem@...emloft.net" <davem@...emloft.net>,
        "mcoquelin.stm32@...il.com" <mcoquelin.stm32@...il.com>,
        "weifeng.voon@...el.com" <weifeng.voon@...el.com>,
        "boon.leong.ong@...el.com" <boon.leong.ong@...el.com>,
        "tee.min.tan@...el.com" <tee.min.tan@...el.com>,
        "vee.khee.wong@...ux.intel.com" <vee.khee.wong@...ux.intel.com>,
        "vee.khee.wong@...el.com" <vee.khee.wong@...el.com>,
        "linux-stm32@...md-mailman.stormreply.com" 
        <linux-stm32@...md-mailman.stormreply.com>,
        "linux-arm-kernel@...ts.infradead.org" 
        <linux-arm-kernel@...ts.infradead.org>,
        "linux-kernel@...r.kernel.org" <linux-kernel@...r.kernel.org>
Subject: Re: [RESEND PATCH net-next v5 1/3] net: stmmac: split xPCS setup from
 mdio register

On Fri, Jun 04, 2021 at 06:57:31PM +0800, Michael Sit Wei Hong wrote:
> From: Voon Weifeng <weifeng.voon@...el.com>
> 
> This patch is a preparation patch for the enabling of Intel mGbE 2.5Gbps
> link speed. The Intel mGbR link speed configuration (1G/2.5G) is depends on
> a mdio ADHOC register which can be configured in the bios menu.
> As PHY interface might be different for 1G and 2.5G, the mdio bus need be
> ready to check the link speed and select the PHY interface before probing
> the xPCS.
> 
> Signed-off-by: Voon Weifeng <weifeng.voon@...el.com>
> Signed-off-by: Michael Sit Wei Hong <michael.wei.hong.sit@...el.com>
> ---
>  drivers/net/ethernet/stmicro/stmmac/stmmac.h  |  1 +
>  .../net/ethernet/stmicro/stmmac/stmmac_main.c |  7 ++
>  .../net/ethernet/stmicro/stmmac/stmmac_mdio.c | 64 ++++++++++---------
>  3 files changed, 43 insertions(+), 29 deletions(-)
> 
> diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac.h b/drivers/net/ethernet/stmicro/stmmac/stmmac.h
> index b6cd43eda7ac..fd7212afc543 100644
> --- a/drivers/net/ethernet/stmicro/stmmac/stmmac.h
> +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac.h
> @@ -311,6 +311,7 @@ enum stmmac_state {
>  int stmmac_mdio_unregister(struct net_device *ndev);
>  int stmmac_mdio_register(struct net_device *ndev);
>  int stmmac_mdio_reset(struct mii_bus *mii);
> +int stmmac_xpcs_setup(struct mii_bus *mii);
>  void stmmac_set_ethtool_ops(struct net_device *netdev);
>  
>  void stmmac_ptp_register(struct stmmac_priv *priv);
> diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
> index 6d41dd6f9f7a..c1331c07623d 100644
> --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
> +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
> @@ -6991,6 +6991,12 @@ int stmmac_dvr_probe(struct device *device,
>  		}
>  	}
>  
> +	if (priv->plat->mdio_bus_data->has_xpcs) {

stmmac_mdio_register has:

	if (!mdio_bus_data)
		return 0;

which suggests that some platforms might not populate priv->plat->mdio_bus_data.

Are you sure it is safe to go straight to dereferencing mdio_bus_data->has_xpcs
in the common driver probe function?

> +		ret = stmmac_xpcs_setup(priv->mii);
> +		if (ret)
> +			goto error_xpcs_setup;
> +	}
> +
>  	ret = stmmac_phy_setup(priv);
>  	if (ret) {
>  		netdev_err(ndev, "failed to setup phy (%d)\n", ret);
> @@ -7027,6 +7033,7 @@ int stmmac_dvr_probe(struct device *device,
>  	unregister_netdev(ndev);
>  error_netdev_register:
>  	phylink_destroy(priv->phylink);
> +error_xpcs_setup:
>  error_phy_setup:
>  	if (priv->hw->pcs != STMMAC_PCS_TBI &&
>  	    priv->hw->pcs != STMMAC_PCS_RTBI)
> diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_mdio.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_mdio.c
> index 6312a152c8ad..bc900e240da2 100644
> --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_mdio.c
> +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_mdio.c
> @@ -397,6 +397,41 @@ int stmmac_mdio_reset(struct mii_bus *bus)
>  	return 0;
>  }
>  
> +int stmmac_xpcs_setup(struct mii_bus *bus)
> +{
> +	int mode, addr;

Can you please sort the variables in decreasing order of line length?
Also, "mode" can be of the phy_interface_t type.

> +	struct net_device *ndev = bus->priv;
> +	struct mdio_xpcs_args *xpcs;
> +	struct stmmac_priv *priv;
> +	struct mdio_device *mdiodev;
> +
> +	priv = netdev_priv(ndev);
> +	mode = priv->plat->phy_interface;
> +
> +	/* Try to probe the XPCS by scanning all addresses. */
> +	for (addr = 0; addr < PHY_MAX_ADDR; addr++) {
> +		mdiodev = mdio_device_create(bus, addr);
> +		if (IS_ERR(mdiodev))
> +			continue;
> +
> +		xpcs = xpcs_create(mdiodev, mode);
> +		if (IS_ERR_OR_NULL(xpcs)) {
> +			mdio_device_free(mdiodev);
> +			continue;
> +		}
> +
> +		priv->hw->xpcs = xpcs;
> +		break;
> +	}
> +
> +	if (!priv->hw->xpcs) {
> +		dev_warn(priv->device, "No xPCS found\n");
> +		return -ENODEV;
> +	}
> +
> +	return 0;
> +}
> +
>  /**
>   * stmmac_mdio_register
>   * @ndev: net device structure
> @@ -501,40 +536,11 @@ int stmmac_mdio_register(struct net_device *ndev)
>  		goto no_phy_found;
>  	}
>  
> -	/* Try to probe the XPCS by scanning all addresses. */
> -	if (mdio_bus_data->has_xpcs) {
> -		int mode = priv->plat->phy_interface;
> -		struct mdio_device *mdiodev;
> -		struct mdio_xpcs_args *xpcs;
> -
> -		for (addr = 0; addr < PHY_MAX_ADDR; addr++) {
> -			mdiodev = mdio_device_create(new_bus, addr);
> -			if (IS_ERR(mdiodev))
> -				continue;
> -
> -			xpcs = xpcs_create(mdiodev, mode);
> -			if (IS_ERR_OR_NULL(xpcs)) {
> -				mdio_device_free(mdiodev);
> -				continue;
> -			}
> -
> -			priv->hw->xpcs = xpcs;
> -			break;
> -		}
> -
> -		if (!priv->hw->xpcs) {
> -			dev_warn(dev, "No XPCS found\n");
> -			err = -ENODEV;
> -			goto no_xpcs_found;
> -		}
> -	}
> -
>  bus_register_done:
>  	priv->mii = new_bus;
>  
>  	return 0;
>  
> -no_xpcs_found:
>  no_phy_found:
>  	mdiobus_unregister(new_bus);
>  bus_register_fail:
> -- 
> 2.17.1
> 

Powered by blists - more mailing lists

Powered by Openwall GNU/*/Linux Powered by OpenVZ