stable.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* Re: Patch "net: bcmgenet: soft reset 40nm EPHYs before MAC init" has been added to the 4.19-stable tree
       [not found] <1573050816170143@kroah.com>
@ 2019-11-07 18:08 ` Doug Berger
  2019-11-08  7:16   ` Greg KH
  0 siblings, 1 reply; 2+ messages in thread
From: Doug Berger @ 2019-11-07 18:08 UTC (permalink / raw)
  To: gregkh, davem, f.fainelli; +Cc: stable-commits, stable

Just to triple check, this commit should be removed from the 4.19-stable
tree too.

Thanks,
    Doug

On 11/6/19 6:33 AM, gregkh@linuxfoundation.org wrote:
> 
> This is a note to let you know that I've just added the patch titled
> 
>     net: bcmgenet: soft reset 40nm EPHYs before MAC init
> 
> to the 4.19-stable tree which can be found at:
>     http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
> 
> The filename of the patch is:
>      net-bcmgenet-soft-reset-40nm-ephys-before-mac-init.patch
> and it can be found in the queue-4.19 subdirectory.
> 
> If you, or anyone else, feels it should not be added to the stable tree,
> please let <stable@vger.kernel.org> know about it.
> 
> 
> From foo@baz Wed 06 Nov 2019 03:31:22 PM CET
> From: Doug Berger <opendmb@gmail.com>
> Date: Wed, 16 Oct 2019 16:06:31 -0700
> Subject: net: bcmgenet: soft reset 40nm EPHYs before MAC init
> 
> From: Doug Berger <opendmb@gmail.com>
> 
> [ Upstream commit 1f515486275a08a17a2c806b844cca18f7de5b34 ]
> 
> It turns out that the "Workaround for putting the PHY in IDDQ mode"
> used by the internal EPHYs on 40nm Set-Top Box chips when powering
> down puts the interface to the GENET MAC in a state that can cause
> subsequent MAC resets to be incomplete.
> 
> Rather than restore the forced soft reset when powering up internal
> PHYs, this commit moves the invocation of phy_init_hw earlier in
> the MAC initialization sequence to just before the MAC reset in the
> open and resume functions. This allows the interface to be stable
> and allows the MAC resets to be successful.
> 
> The bcmgenet_mii_probe() function is split in two to accommodate
> this. The new function bcmgenet_mii_connect() handles the first
> half of the functionality before the MAC initialization, and the
> bcmgenet_mii_config() function is extended to provide the remaining
> PHY configuration following the MAC initialization.
> 
> Fixes: 484bfa1507bf ("Revert "net: bcmgenet: Software reset EPHY after power on"")
> Signed-off-by: Doug Berger <opendmb@gmail.com>
> Acked-by: Florian Fainelli <f.fainelli@gmail.com>
> Signed-off-by: David S. Miller <davem@davemloft.net>
> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
> ---
>  drivers/net/ethernet/broadcom/genet/bcmgenet.c |   28 +++---
>  drivers/net/ethernet/broadcom/genet/bcmgenet.h |    2 
>  drivers/net/ethernet/broadcom/genet/bcmmii.c   |  112 +++++++++++--------------
>  3 files changed, 69 insertions(+), 73 deletions(-)
> 
> --- a/drivers/net/ethernet/broadcom/genet/bcmgenet.c
> +++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.c
> @@ -2879,6 +2879,12 @@ static int bcmgenet_open(struct net_devi
>  	if (priv->internal_phy)
>  		bcmgenet_power_up(priv, GENET_POWER_PASSIVE);
>  
> +	ret = bcmgenet_mii_connect(dev);
> +	if (ret) {
> +		netdev_err(dev, "failed to connect to PHY\n");
> +		goto err_clk_disable;
> +	}
> +
>  	/* take MAC out of reset */
>  	bcmgenet_umac_reset(priv);
>  
> @@ -2888,6 +2894,12 @@ static int bcmgenet_open(struct net_devi
>  	reg = bcmgenet_umac_readl(priv, UMAC_CMD);
>  	priv->crc_fwd_en = !!(reg & CMD_CRC_FWD);
>  
> +	ret = bcmgenet_mii_config(dev, true);
> +	if (ret) {
> +		netdev_err(dev, "unsupported PHY\n");
> +		goto err_disconnect_phy;
> +	}
> +
>  	bcmgenet_set_hw_addr(priv, dev->dev_addr);
>  
>  	if (priv->internal_phy) {
> @@ -2903,7 +2915,7 @@ static int bcmgenet_open(struct net_devi
>  	ret = bcmgenet_init_dma(priv);
>  	if (ret) {
>  		netdev_err(dev, "failed to initialize DMA\n");
> -		goto err_clk_disable;
> +		goto err_disconnect_phy;
>  	}
>  
>  	/* Always enable ring 16 - descriptor ring */
> @@ -2926,25 +2938,19 @@ static int bcmgenet_open(struct net_devi
>  		goto err_irq0;
>  	}
>  
> -	ret = bcmgenet_mii_probe(dev);
> -	if (ret) {
> -		netdev_err(dev, "failed to connect to PHY\n");
> -		goto err_irq1;
> -	}
> -
>  	bcmgenet_netif_start(dev);
>  
>  	netif_tx_start_all_queues(dev);
>  
>  	return 0;
>  
> -err_irq1:
> -	free_irq(priv->irq1, priv);
>  err_irq0:
>  	free_irq(priv->irq0, priv);
>  err_fini_dma:
>  	bcmgenet_dma_teardown(priv);
>  	bcmgenet_fini_dma(priv);
> +err_disconnect_phy:
> +	phy_disconnect(dev->phydev);
>  err_clk_disable:
>  	if (priv->internal_phy)
>  		bcmgenet_power_down(priv, GENET_POWER_PASSIVE);
> @@ -3657,6 +3663,8 @@ static int bcmgenet_resume(struct device
>  	if (priv->internal_phy)
>  		bcmgenet_power_up(priv, GENET_POWER_PASSIVE);
>  
> +	phy_init_hw(dev->phydev);
> +
>  	bcmgenet_umac_reset(priv);
>  
>  	init_umac(priv);
> @@ -3665,8 +3673,6 @@ static int bcmgenet_resume(struct device
>  	if (priv->wolopts)
>  		clk_disable_unprepare(priv->clk_wol);
>  
> -	phy_init_hw(dev->phydev);
> -
>  	/* Speed settings must be restored */
>  	bcmgenet_mii_config(priv->dev, false);
>  
> --- a/drivers/net/ethernet/broadcom/genet/bcmgenet.h
> +++ b/drivers/net/ethernet/broadcom/genet/bcmgenet.h
> @@ -723,8 +723,8 @@ GENET_IO_MACRO(rbuf, GENET_RBUF_OFF);
>  
>  /* MDIO routines */
>  int bcmgenet_mii_init(struct net_device *dev);
> +int bcmgenet_mii_connect(struct net_device *dev);
>  int bcmgenet_mii_config(struct net_device *dev, bool init);
> -int bcmgenet_mii_probe(struct net_device *dev);
>  void bcmgenet_mii_exit(struct net_device *dev);
>  void bcmgenet_phy_power_set(struct net_device *dev, bool enable);
>  void bcmgenet_mii_setup(struct net_device *dev);
> --- a/drivers/net/ethernet/broadcom/genet/bcmmii.c
> +++ b/drivers/net/ethernet/broadcom/genet/bcmmii.c
> @@ -176,6 +176,46 @@ static void bcmgenet_moca_phy_setup(stru
>  					  bcmgenet_fixed_phy_link_update);
>  }
>  
> +int bcmgenet_mii_connect(struct net_device *dev)
> +{
> +	struct bcmgenet_priv *priv = netdev_priv(dev);
> +	struct device_node *dn = priv->pdev->dev.of_node;
> +	struct phy_device *phydev;
> +	u32 phy_flags = 0;
> +	int ret;
> +
> +	/* Communicate the integrated PHY revision */
> +	if (priv->internal_phy)
> +		phy_flags = priv->gphy_rev;
> +
> +	/* Initialize link state variables that bcmgenet_mii_setup() uses */
> +	priv->old_link = -1;
> +	priv->old_speed = -1;
> +	priv->old_duplex = -1;
> +	priv->old_pause = -1;
> +
> +	if (dn) {
> +		phydev = of_phy_connect(dev, priv->phy_dn, bcmgenet_mii_setup,
> +					phy_flags, priv->phy_interface);
> +		if (!phydev) {
> +			pr_err("could not attach to PHY\n");
> +			return -ENODEV;
> +		}
> +	} else {
> +		phydev = dev->phydev;
> +		phydev->dev_flags = phy_flags;
> +
> +		ret = phy_connect_direct(dev, phydev, bcmgenet_mii_setup,
> +					 priv->phy_interface);
> +		if (ret) {
> +			pr_err("could not attach to PHY\n");
> +			return -ENODEV;
> +		}
> +	}
> +
> +	return 0;
> +}
> +
>  int bcmgenet_mii_config(struct net_device *dev, bool init)
>  {
>  	struct bcmgenet_priv *priv = netdev_priv(dev);
> @@ -269,71 +309,21 @@ int bcmgenet_mii_config(struct net_devic
>  		bcmgenet_ext_writel(priv, reg, EXT_RGMII_OOB_CTRL);
>  	}
>  
> -	if (init)
> -		dev_info(kdev, "configuring instance for %s\n", phy_name);
> -
> -	return 0;
> -}
> -
> -int bcmgenet_mii_probe(struct net_device *dev)
> -{
> -	struct bcmgenet_priv *priv = netdev_priv(dev);
> -	struct device_node *dn = priv->pdev->dev.of_node;
> -	struct phy_device *phydev;
> -	u32 phy_flags = 0;
> -	int ret;
> -
> -	/* Communicate the integrated PHY revision */
> -	if (priv->internal_phy)
> -		phy_flags = priv->gphy_rev;
> -
> -	/* Initialize link state variables that bcmgenet_mii_setup() uses */
> -	priv->old_link = -1;
> -	priv->old_speed = -1;
> -	priv->old_duplex = -1;
> -	priv->old_pause = -1;
> -
> -	if (dn) {
> -		phydev = of_phy_connect(dev, priv->phy_dn, bcmgenet_mii_setup,
> -					phy_flags, priv->phy_interface);
> -		if (!phydev) {
> -			pr_err("could not attach to PHY\n");
> -			return -ENODEV;
> -		}
> -	} else {
> -		phydev = dev->phydev;
> -		phydev->dev_flags = phy_flags;
> +	if (init) {
> +		phydev->advertising = phydev->supported;
>  
> -		ret = phy_connect_direct(dev, phydev, bcmgenet_mii_setup,
> -					 priv->phy_interface);
> -		if (ret) {
> -			pr_err("could not attach to PHY\n");
> -			return -ENODEV;
> -		}
> -	}
> +		/* The internal PHY has its link interrupts routed to the
> +		 * Ethernet MAC ISRs. On GENETv5 there is a hardware issue
> +		 * that prevents the signaling of link UP interrupts when
> +		 * the link operates at 10Mbps, so fallback to polling for
> +		 * those versions of GENET.
> +		 */
> +		if (priv->internal_phy && !GENET_IS_V5(priv))
> +			phydev->irq = PHY_IGNORE_INTERRUPT;
>  
> -	/* Configure port multiplexer based on what the probed PHY device since
> -	 * reading the 'max-speed' property determines the maximum supported
> -	 * PHY speed which is needed for bcmgenet_mii_config() to configure
> -	 * things appropriately.
> -	 */
> -	ret = bcmgenet_mii_config(dev, true);
> -	if (ret) {
> -		phy_disconnect(dev->phydev);
> -		return ret;
> +		dev_info(kdev, "configuring instance for %s\n", phy_name);
>  	}
>  
> -	phydev->advertising = phydev->supported;
> -
> -	/* The internal PHY has its link interrupts routed to the
> -	 * Ethernet MAC ISRs. On GENETv5 there is a hardware issue
> -	 * that prevents the signaling of link UP interrupts when
> -	 * the link operates at 10Mbps, so fallback to polling for
> -	 * those versions of GENET.
> -	 */
> -	if (priv->internal_phy && !GENET_IS_V5(priv))
> -		dev->phydev->irq = PHY_IGNORE_INTERRUPT;
> -
>  	return 0;
>  }
>  
> 
> 
> Patches currently in stable-queue which might be from opendmb@gmail.com are
> 
> queue-4.19/net-phy-bcm7xxx-define-soft_reset-for-40nm-ephy.patch
> queue-4.19/net-bcmgenet-reset-40nm-ephy-on-energy-detect.patch
> queue-4.19/net-bcmgenet-don-t-set-phydev-link-from-mac.patch
> queue-4.19/net-bcmgenet-soft-reset-40nm-ephys-before-mac-init.patch
> 


^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: Patch "net: bcmgenet: soft reset 40nm EPHYs before MAC init" has been added to the 4.19-stable tree
  2019-11-07 18:08 ` Patch "net: bcmgenet: soft reset 40nm EPHYs before MAC init" has been added to the 4.19-stable tree Doug Berger
@ 2019-11-08  7:16   ` Greg KH
  0 siblings, 0 replies; 2+ messages in thread
From: Greg KH @ 2019-11-08  7:16 UTC (permalink / raw)
  To: Doug Berger; +Cc: davem, f.fainelli, stable-commits, stable

On Thu, Nov 07, 2019 at 10:08:27AM -0800, Doug Berger wrote:
> Just to triple check, this commit should be removed from the 4.19-stable
> tree too.

Ah, good catch, now dropped, thanks.

greg k-h

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2019-11-08  7:16 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
     [not found] <1573050816170143@kroah.com>
2019-11-07 18:08 ` Patch "net: bcmgenet: soft reset 40nm EPHYs before MAC init" has been added to the 4.19-stable tree Doug Berger
2019-11-08  7:16   ` Greg KH

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).