mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-02 16:44:10 +08:00
net: dsa/bcm_sf2: fix incorrect usage of state->link
state->link has never been valid in mac_config() implementations - while it may be correct in some calls, it is not true that it can be relied upon. Fix bcm_sf2 to use the correct method of handling forced link status. Reviewed-by: Florian Fainelli <f.fainelli@gmail.com> Tested-by: Florian Fainelli <f.fainelli@gmail.com> Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
bcd763b714
commit
2d1f90f9ba
@ -618,8 +618,6 @@ force_link:
|
||||
break;
|
||||
}
|
||||
|
||||
if (state->link)
|
||||
reg |= LINK_STS;
|
||||
if (state->duplex == DUPLEX_FULL)
|
||||
reg |= DUPLX_MODE;
|
||||
|
||||
@ -650,6 +648,20 @@ static void bcm_sf2_sw_mac_link_down(struct dsa_switch *ds, int port,
|
||||
unsigned int mode,
|
||||
phy_interface_t interface)
|
||||
{
|
||||
struct bcm_sf2_priv *priv = bcm_sf2_to_priv(ds);
|
||||
u32 reg, offset;
|
||||
|
||||
if (port != core_readl(priv, CORE_IMP0_PRT_ID)) {
|
||||
if (priv->type == BCM7445_DEVICE_ID)
|
||||
offset = CORE_STS_OVERRIDE_GMIIP_PORT(port);
|
||||
else
|
||||
offset = CORE_STS_OVERRIDE_GMIIP2_PORT(port);
|
||||
|
||||
reg = core_readl(priv, offset);
|
||||
reg &= ~LINK_STS;
|
||||
core_writel(priv, reg, offset);
|
||||
}
|
||||
|
||||
bcm_sf2_sw_mac_link_set(ds, port, interface, false);
|
||||
}
|
||||
|
||||
@ -662,9 +674,21 @@ static void bcm_sf2_sw_mac_link_up(struct dsa_switch *ds, int port,
|
||||
{
|
||||
struct bcm_sf2_priv *priv = bcm_sf2_to_priv(ds);
|
||||
struct ethtool_eee *p = &priv->dev->ports[port].eee;
|
||||
u32 reg, offset;
|
||||
|
||||
bcm_sf2_sw_mac_link_set(ds, port, interface, true);
|
||||
|
||||
if (port != core_readl(priv, CORE_IMP0_PRT_ID)) {
|
||||
if (priv->type == BCM7445_DEVICE_ID)
|
||||
offset = CORE_STS_OVERRIDE_GMIIP_PORT(port);
|
||||
else
|
||||
offset = CORE_STS_OVERRIDE_GMIIP2_PORT(port);
|
||||
|
||||
reg = core_readl(priv, offset);
|
||||
reg |= LINK_STS;
|
||||
core_writel(priv, reg, offset);
|
||||
}
|
||||
|
||||
if (mode == MLO_AN_PHY && phydev)
|
||||
p->eee_enabled = b53_eee_init(ds, port, phydev);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user