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%3Ba=su...
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
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
linux-stable-mirror@lists.linaro.org