Message ID | E1fcqSe-0004W1-8A@rmk-PC.armlinux.org.uk |
---|---|
State | Accepted, archived |
Delegated to: | David Miller |
Headers | show |
Series | [net,1/2] sfp: ensure we clean up properly on bus registration failure | expand |
From: Russell King <rmk+kernel@armlinux.org.uk> Date: Tue, 10 Jul 2018 12:05:36 +0100 > It was been observed that with a particular order of initialisation, > the netdev can be up, but the SFP module still has its TX_DISABLE > signal asserted. This occurs when the network device brought up before > the SFP kernel module has been inserted by userspace. > > This occurs because sfp-bus layer does not hear about the change in > network device state, and so assumes that it is still down. Set > netdev->sfp when the upstream is registered to work around this problem. > > Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk> Applied.
diff --git a/drivers/net/phy/sfp-bus.c b/drivers/net/phy/sfp-bus.c index e355e7db54a7..5e5fcc33421e 100644 --- a/drivers/net/phy/sfp-bus.c +++ b/drivers/net/phy/sfp-bus.c @@ -342,7 +342,6 @@ static int sfp_register_bus(struct sfp_bus *bus) } if (bus->started) bus->socket_ops->start(bus->sfp); - bus->netdev->sfp_bus = bus; bus->registered = true; return 0; } @@ -357,7 +356,6 @@ static void sfp_unregister_bus(struct sfp_bus *bus) if (bus->phydev && ops && ops->disconnect_phy) ops->disconnect_phy(bus->upstream); } - bus->netdev->sfp_bus = NULL; bus->registered = false; } @@ -433,6 +431,7 @@ static void sfp_upstream_clear(struct sfp_bus *bus) { bus->upstream_ops = NULL; bus->upstream = NULL; + bus->netdev->sfp_bus = NULL; bus->netdev = NULL; } @@ -461,6 +460,7 @@ struct sfp_bus *sfp_register_upstream(struct fwnode_handle *fwnode, bus->upstream_ops = ops; bus->upstream = upstream; bus->netdev = ndev; + ndev->sfp_bus = bus; if (bus->sfp) { ret = sfp_register_bus(bus);
It was been observed that with a particular order of initialisation, the netdev can be up, but the SFP module still has its TX_DISABLE signal asserted. This occurs when the network device brought up before the SFP kernel module has been inserted by userspace. This occurs because sfp-bus layer does not hear about the change in network device state, and so assumes that it is still down. Set netdev->sfp when the upstream is registered to work around this problem. Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk> --- drivers/net/phy/sfp-bus.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)