net: dsa: mv88e6xxx: remove link polling
The link status is polled by the generic phy layer, there's no need to duplicate that polling with additional polling. This additional polling adds additional MDIO traffic, and races with the generic phy layer, resulting in missing or duplicated link status messages. Tested-by: Andrew Lunn <andrew@lunn.ch> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
21c4c073f1
commit
4bac50bace
|
@ -125,7 +125,6 @@ struct dsa_switch_driver mv88e6123_61_65_switch_driver = {
|
|||
.set_addr = mv88e6xxx_set_addr_indirect,
|
||||
.phy_read = mv88e6xxx_phy_read,
|
||||
.phy_write = mv88e6xxx_phy_write,
|
||||
.poll_link = mv88e6xxx_poll_link,
|
||||
.get_strings = mv88e6xxx_get_strings,
|
||||
.get_ethtool_stats = mv88e6xxx_get_ethtool_stats,
|
||||
.get_sset_count = mv88e6xxx_get_sset_count,
|
||||
|
|
|
@ -178,7 +178,6 @@ struct dsa_switch_driver mv88e6131_switch_driver = {
|
|||
.set_addr = mv88e6xxx_set_addr_direct,
|
||||
.phy_read = mv88e6131_phy_read,
|
||||
.phy_write = mv88e6131_phy_write,
|
||||
.poll_link = mv88e6xxx_poll_link,
|
||||
.get_strings = mv88e6xxx_get_strings,
|
||||
.get_ethtool_stats = mv88e6xxx_get_ethtool_stats,
|
||||
.get_sset_count = mv88e6xxx_get_sset_count,
|
||||
|
|
|
@ -104,7 +104,6 @@ struct dsa_switch_driver mv88e6171_switch_driver = {
|
|||
.set_addr = mv88e6xxx_set_addr_indirect,
|
||||
.phy_read = mv88e6xxx_phy_read_indirect,
|
||||
.phy_write = mv88e6xxx_phy_write_indirect,
|
||||
.poll_link = mv88e6xxx_poll_link,
|
||||
.get_strings = mv88e6xxx_get_strings,
|
||||
.get_ethtool_stats = mv88e6xxx_get_ethtool_stats,
|
||||
.get_sset_count = mv88e6xxx_get_sset_count,
|
||||
|
|
|
@ -324,7 +324,6 @@ struct dsa_switch_driver mv88e6352_switch_driver = {
|
|||
.set_addr = mv88e6xxx_set_addr_indirect,
|
||||
.phy_read = mv88e6xxx_phy_read_indirect,
|
||||
.phy_write = mv88e6xxx_phy_write_indirect,
|
||||
.poll_link = mv88e6xxx_poll_link,
|
||||
.get_strings = mv88e6xxx_get_strings,
|
||||
.get_ethtool_stats = mv88e6xxx_get_ethtool_stats,
|
||||
.get_sset_count = mv88e6xxx_get_sset_count,
|
||||
|
|
|
@ -388,73 +388,6 @@ int mv88e6xxx_phy_write_ppu(struct dsa_switch *ds, int addr,
|
|||
}
|
||||
#endif
|
||||
|
||||
void mv88e6xxx_poll_link(struct dsa_switch *ds)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < DSA_MAX_PORTS; i++) {
|
||||
struct net_device *dev;
|
||||
int uninitialized_var(port_status);
|
||||
int pcs_ctrl;
|
||||
int link;
|
||||
int speed;
|
||||
int duplex;
|
||||
int fc;
|
||||
|
||||
dev = ds->ports[i];
|
||||
if (dev == NULL)
|
||||
continue;
|
||||
|
||||
pcs_ctrl = mv88e6xxx_reg_read(ds, REG_PORT(i), PORT_PCS_CTRL);
|
||||
if (pcs_ctrl < 0 || pcs_ctrl & PORT_PCS_CTRL_FORCE_LINK)
|
||||
continue;
|
||||
|
||||
link = 0;
|
||||
if (dev->flags & IFF_UP) {
|
||||
port_status = mv88e6xxx_reg_read(ds, REG_PORT(i),
|
||||
PORT_STATUS);
|
||||
if (port_status < 0)
|
||||
continue;
|
||||
|
||||
link = !!(port_status & PORT_STATUS_LINK);
|
||||
}
|
||||
|
||||
if (!link) {
|
||||
if (netif_carrier_ok(dev)) {
|
||||
netdev_info(dev, "link down\n");
|
||||
netif_carrier_off(dev);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
switch (port_status & PORT_STATUS_SPEED_MASK) {
|
||||
case PORT_STATUS_SPEED_10:
|
||||
speed = 10;
|
||||
break;
|
||||
case PORT_STATUS_SPEED_100:
|
||||
speed = 100;
|
||||
break;
|
||||
case PORT_STATUS_SPEED_1000:
|
||||
speed = 1000;
|
||||
break;
|
||||
default:
|
||||
speed = -1;
|
||||
break;
|
||||
}
|
||||
duplex = (port_status & PORT_STATUS_DUPLEX) ? 1 : 0;
|
||||
fc = (port_status & PORT_STATUS_PAUSE_EN) ? 1 : 0;
|
||||
|
||||
if (!netif_carrier_ok(dev)) {
|
||||
netdev_info(dev,
|
||||
"link up, %d Mb/s, %s duplex, flow control %sabled\n",
|
||||
speed,
|
||||
duplex ? "full" : "half",
|
||||
fc ? "en" : "dis");
|
||||
netif_carrier_on(dev);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static bool mv88e6xxx_6065_family(struct dsa_switch *ds)
|
||||
{
|
||||
struct mv88e6xxx_priv_state *ps = ds_to_priv(ds);
|
||||
|
|
|
@ -442,7 +442,6 @@ void mv88e6xxx_ppu_state_init(struct dsa_switch *ds);
|
|||
int mv88e6xxx_phy_read_ppu(struct dsa_switch *ds, int addr, int regnum);
|
||||
int mv88e6xxx_phy_write_ppu(struct dsa_switch *ds, int addr,
|
||||
int regnum, u16 val);
|
||||
void mv88e6xxx_poll_link(struct dsa_switch *ds);
|
||||
void mv88e6xxx_get_strings(struct dsa_switch *ds, int port, uint8_t *data);
|
||||
void mv88e6xxx_get_ethtool_stats(struct dsa_switch *ds, int port,
|
||||
uint64_t *data);
|
||||
|
|
Loading…
Reference in New Issue