From 43d2a390d28557762d259fb708fb1a34f5906562 Mon Sep 17 00:00:00 2001 From: Russell King Date: Mon, 19 Dec 2016 12:17:57 +0000 Subject: phylink: ensure link drops are reported When the MAC reports a link failure, it can be momentary. Ensure that the event is reported by latching the loss of link, so that the worker reports link down. Signed-off-by: Russell King --- drivers/net/phy/phylink.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/drivers/net/phy/phylink.c b/drivers/net/phy/phylink.c index ff16d4152239..976a2ebdb274 100644 --- a/drivers/net/phy/phylink.c +++ b/drivers/net/phy/phylink.c @@ -60,6 +60,8 @@ struct phylink { struct phylink_link_state phy_state; struct work_struct resolve; + bool mac_link_dropped; + const struct phylink_module_ops *module_ops; void *module_data; }; @@ -340,6 +342,9 @@ static void phylink_resolve(struct work_struct *w) mutex_lock(&pl->state_mutex); if (pl->phylink_disable_state) { + pl->mac_link_dropped = false; + link_state.link = false; + } else if (pl->mac_link_dropped) { link_state.link = false; } else { switch (pl->link_an_mode) { @@ -405,6 +410,10 @@ static void phylink_resolve(struct work_struct *w) phylink_pause_to_str(link_state.pause)); } } + if (!link_state.link && pl->mac_link_dropped) { + pl->mac_link_dropped = false; + queue_work(system_power_efficient_wq, &pl->resolve); + } mutex_unlock(&pl->state_mutex); } @@ -641,6 +650,8 @@ EXPORT_SYMBOL_GPL(phylink_disconnect_phy); void phylink_mac_change(struct phylink *pl, bool up) { + if (!up) + pl->mac_link_dropped = true; phylink_run_resolve(pl); netdev_dbg(pl->netdev, "mac link %s\n", up ? "up" : "down"); } -- cgit