Skip to content

Commit 6ac9de5

Browse files
ffainellidavem330
authored andcommitted
net: bcmgenet: Register link_update callback for all MoCA PHYs
Commit 8d88c6e ("net: bcmgenet: enable MoCA link state change detection") added a fixed PHY link_update callback for MoCA PHYs when registered using platform_data exclusively, this change is also applicable to systems using Device Tree as their primary configuration interface. In order for this to work, move the link_update assignment into bcmgenet_moca_phy_setup() where we know for sure that we are running on a MoCA GENET instance, and do not override phydev->link since this is: - properly taken care of by the PHY library by getting the link UP/DOWN interrupts - this now runs everytime we call bcmgenet_open(), so we need to preserve whatever we detected before we went administratively DOWN and then UP - we need to make sure that MoCA PHYs start with a link DOWN during probe in order to force a link transition to occur To avoid a forward declaration, move bcmgenet_fixed_phy_link_update() above its caller. Signed-off-by: Florian Fainelli <f.fainelli@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent 7d5d307 commit 6ac9de5

File tree

1 file changed

+23
-14
lines changed
  • drivers/net/ethernet/broadcom/genet

1 file changed

+23
-14
lines changed

drivers/net/ethernet/broadcom/genet/bcmmii.c

Lines changed: 23 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,15 @@ void bcmgenet_mii_setup(struct net_device *dev)
163163
phy_print_status(phydev);
164164
}
165165

166+
static int bcmgenet_fixed_phy_link_update(struct net_device *dev,
167+
struct fixed_phy_status *status)
168+
{
169+
if (dev && dev->phydev && status)
170+
status->link = dev->phydev->link;
171+
172+
return 0;
173+
}
174+
166175
void bcmgenet_phy_power_set(struct net_device *dev, bool enable)
167176
{
168177
struct bcmgenet_priv *priv = netdev_priv(dev);
@@ -215,6 +224,10 @@ static void bcmgenet_moca_phy_setup(struct bcmgenet_priv *priv)
215224
reg = bcmgenet_sys_readl(priv, SYS_PORT_CTRL);
216225
reg |= LED_ACT_SOURCE_MAC;
217226
bcmgenet_sys_writel(priv, reg, SYS_PORT_CTRL);
227+
228+
if (priv->hw_params->flags & GENET_HAS_MOCA_LINK_DET)
229+
fixed_phy_set_link_update(priv->phydev,
230+
bcmgenet_fixed_phy_link_update);
218231
}
219232

220233
int bcmgenet_mii_config(struct net_device *dev)
@@ -460,6 +473,7 @@ static int bcmgenet_mii_of_init(struct bcmgenet_priv *priv)
460473
struct device_node *dn = priv->pdev->dev.of_node;
461474
struct device *kdev = &priv->pdev->dev;
462475
const char *phy_mode_str = NULL;
476+
struct phy_device *phydev = NULL;
463477
char *compat;
464478
int phy_mode;
465479
int ret;
@@ -515,14 +529,12 @@ static int bcmgenet_mii_of_init(struct bcmgenet_priv *priv)
515529
priv->internal_phy = true;
516530
}
517531

518-
return 0;
519-
}
520-
521-
static int bcmgenet_fixed_phy_link_update(struct net_device *dev,
522-
struct fixed_phy_status *status)
523-
{
524-
if (dev && dev->phydev && status)
525-
status->link = dev->phydev->link;
532+
/* Make sure we initialize MoCA PHYs with a link down */
533+
if (phy_mode == PHY_INTERFACE_MODE_MOCA) {
534+
phydev = of_phy_find_device(dn);
535+
if (phydev)
536+
phydev->link = 0;
537+
}
526538

527539
return 0;
528540
}
@@ -579,12 +591,9 @@ static int bcmgenet_mii_pd_init(struct bcmgenet_priv *priv)
579591
return -ENODEV;
580592
}
581593

582-
if (priv->hw_params->flags & GENET_HAS_MOCA_LINK_DET) {
583-
ret = fixed_phy_set_link_update(
584-
phydev, bcmgenet_fixed_phy_link_update);
585-
if (!ret)
586-
phydev->link = 0;
587-
}
594+
/* Make sure we initialize MoCA PHYs with a link down */
595+
phydev->link = 0;
596+
588597
}
589598

590599
priv->phydev = phydev;

0 commit comments

Comments
 (0)