aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRené van Dorst <opensource@vdorst.com>2019-07-27 11:40:11 +0200
committerDavid S. Miller <davem@davemloft.net>2019-07-27 14:27:51 -0700
commit8aace4f3eba2a3ceb431e18683ea0e1ecbade5cd (patch)
treecbb8b7bc3418e3b8e7d708bdeb4b9d17f0f6dca7
parentgigaset: stop maintaining seperately (diff)
downloadlinux-dev-8aace4f3eba2a3ceb431e18683ea0e1ecbade5cd.tar.xz
linux-dev-8aace4f3eba2a3ceb431e18683ea0e1ecbade5cd.zip
net: phylink: Fix flow control for fixed-link
In phylink_parse_fixedlink() the pl->link_config.advertising bits are AND with pl->supported, pl->supported is zeroed and only the speed/duplex modes and MII bits are set. So pl->link_config.advertising always loses the flow control/pause bits. By setting Pause and Asym_Pause bits in pl->supported, the flow control work again when devicetree "pause" is set in fixes-link node and the MAC advertise that is supports pause. Results with this patch. Legend: - DT = 'Pause' is set in the fixed-link in devicetree. - validate() = ‘Yes’ means phylink_set(mask, Pause) is set in the validate(). - flow = results reported my link is Up line. +-----+------------+-------+ | DT | validate() | flow | +-----+------------+-------+ | Yes | Yes | rx/tx | | No | Yes | off | | Yes | No | off | +-----+------------+-------+ Fixes: 9525ae83959b ("phylink: add phylink infrastructure") Signed-off-by: René van Dorst <opensource@vdorst.com> Acked-by: Russell King <rmk+kernel@armlinux.org.uk> Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r--drivers/net/phy/phylink.c2
1 files changed, 2 insertions, 0 deletions
diff --git a/drivers/net/phy/phylink.c b/drivers/net/phy/phylink.c
index b45862465c4d..a45c5de96ab1 100644
--- a/drivers/net/phy/phylink.c
+++ b/drivers/net/phy/phylink.c
@@ -216,6 +216,8 @@ static int phylink_parse_fixedlink(struct phylink *pl,
pl->supported, true);
linkmode_zero(pl->supported);
phylink_set(pl->supported, MII);
+ phylink_set(pl->supported, Pause);
+ phylink_set(pl->supported, Asym_Pause);
if (s) {
__set_bit(s->bit, pl->supported);
} else {