| From foo@baz Mon 16 Sep 2019 01:07:00 PM CEST |
| From: Stefan Chulski <stefanc@marvell.com> |
| Date: Thu, 5 Sep 2019 19:46:18 +0300 |
| Subject: net: phylink: Fix flow control resolution |
| |
| From: Stefan Chulski <stefanc@marvell.com> |
| |
| [ Upstream commit 63b2ed4e10b2e6c913e1d8cdd728e7fba4115a3d ] |
| |
| Regarding to IEEE 802.3-2015 standard section 2 |
| 28B.3 Priority resolution - Table 28-3 - Pause resolution |
| |
| In case of Local device Pause=1 AsymDir=0, Link partner |
| Pause=1 AsymDir=1, Local device resolution should be enable PAUSE |
| transmit, disable PAUSE receive. |
| And in case of Local device Pause=1 AsymDir=1, Link partner |
| Pause=1 AsymDir=0, Local device resolution should be enable PAUSE |
| receive, disable PAUSE transmit. |
| |
| Fixes: 9525ae83959b ("phylink: add phylink infrastructure") |
| Signed-off-by: Stefan Chulski <stefanc@marvell.com> |
| Reported-by: Shaul Ben-Mayor <shaulb@marvell.com> |
| Acked-by: Russell King <rmk+kernel@armlinux.org.uk> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/net/phy/phylink.c | 6 +++--- |
| 1 file changed, 3 insertions(+), 3 deletions(-) |
| |
| --- a/drivers/net/phy/phylink.c |
| +++ b/drivers/net/phy/phylink.c |
| @@ -359,8 +359,8 @@ static void phylink_get_fixed_state(stru |
| * Local device Link partner |
| * Pause AsymDir Pause AsymDir Result |
| * 1 X 1 X TX+RX |
| - * 0 1 1 1 RX |
| - * 1 1 0 1 TX |
| + * 0 1 1 1 TX |
| + * 1 1 0 1 RX |
| */ |
| static void phylink_resolve_flow(struct phylink *pl, |
| struct phylink_link_state *state) |
| @@ -381,7 +381,7 @@ static void phylink_resolve_flow(struct |
| new_pause = MLO_PAUSE_TX | MLO_PAUSE_RX; |
| else if (pause & MLO_PAUSE_ASYM) |
| new_pause = state->pause & MLO_PAUSE_SYM ? |
| - MLO_PAUSE_RX : MLO_PAUSE_TX; |
| + MLO_PAUSE_TX : MLO_PAUSE_RX; |
| } else { |
| new_pause = pl->link_config.pause & MLO_PAUSE_TXRX_MASK; |
| } |