]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/commitdiff
net: phylink: use phylib resolved flow control modes
authorRussell King <rmk+kernel@armlinux.org.uk>
Sat, 15 Feb 2020 15:49:48 +0000 (15:49 +0000)
committerDavid S. Miller <davem@davemloft.net>
Mon, 17 Feb 2020 03:39:45 +0000 (19:39 -0800)
Use the new phy_get_pause() helper to get the resolved pause modes for
a PHY rather than resolving the pause modes ourselves. We temporarily
retain our pause mode resolution for causes where there is no PHY
attached, e.g. for fixed-link modes.

Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/phy/phylink.c

index 846aee591684e5b152de6763707019ed70b425e8..e65e9c9dc75971357c1cf39693e07697244993e9 100644 (file)
@@ -500,7 +500,6 @@ static void phylink_resolve(struct work_struct *w)
                switch (pl->cur_link_an_mode) {
                case MLO_AN_PHY:
                        link_state = pl->phy_state;
-                       phylink_resolve_flow(pl, &link_state);
                        phylink_apply_manual_flow(pl, &link_state);
                        phylink_mac_config_up(pl, &link_state);
                        break;
@@ -523,9 +522,8 @@ static void phylink_resolve(struct work_struct *w)
                                link_state.interface = pl->phy_state.interface;
 
                                /* If we have a PHY, we need to update with
-                                * the pause mode bits. */
-                               link_state.pause |= pl->phy_state.pause;
-                               phylink_resolve_flow(pl, &link_state);
+                                * the PHY flow control bits. */
+                               link_state.pause = pl->phy_state.pause;
                                phylink_apply_manual_flow(pl, &link_state);
                                phylink_mac_config(pl, &link_state);
                        }
@@ -714,15 +712,18 @@ static void phylink_phy_change(struct phy_device *phydev, bool up,
                               bool do_carrier)
 {
        struct phylink *pl = phydev->phylink;
+       bool tx_pause, rx_pause;
+
+       phy_get_pause(phydev, &tx_pause, &rx_pause);
 
        mutex_lock(&pl->state_mutex);
        pl->phy_state.speed = phydev->speed;
        pl->phy_state.duplex = phydev->duplex;
        pl->phy_state.pause = MLO_PAUSE_NONE;
-       if (phydev->pause)
-               pl->phy_state.pause |= MLO_PAUSE_SYM;
-       if (phydev->asym_pause)
-               pl->phy_state.pause |= MLO_PAUSE_ASYM;
+       if (tx_pause)
+               pl->phy_state.pause |= MLO_PAUSE_TX;
+       if (rx_pause)
+               pl->phy_state.pause |= MLO_PAUSE_RX;
        pl->phy_state.interface = phydev->interface;
        pl->phy_state.link = up;
        mutex_unlock(&pl->state_mutex);