| From foo@baz Wed Nov 21 13:17:56 CET 2018 |
| From: Siva Reddy Kallam <siva.kallam@broadcom.com> |
| Date: Tue, 20 Nov 2018 10:04:04 +0530 |
| Subject: tg3: Add PHY reset for 5717/5719/5720 in change ring and flow control paths |
| |
| From: Siva Reddy Kallam <siva.kallam@broadcom.com> |
| |
| [ Upstream commit 59663e42199c93d1d7314d1446f6782fc4b1eb81 ] |
| |
| This patch has the fix to avoid PHY lockup with 5717/5719/5720 in change |
| ring and flow control paths. This patch solves the RX hang while doing |
| continuous ring or flow control parameters with heavy traffic from peer. |
| |
| Signed-off-by: Siva Reddy Kallam <siva.kallam@broadcom.com> |
| Acked-by: Michael Chan <michael.chan@broadcom.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/net/ethernet/broadcom/tg3.c | 18 ++++++++++++++++-- |
| 1 file changed, 16 insertions(+), 2 deletions(-) |
| |
| --- a/drivers/net/ethernet/broadcom/tg3.c |
| +++ b/drivers/net/ethernet/broadcom/tg3.c |
| @@ -12389,6 +12389,7 @@ static int tg3_set_ringparam(struct net_ |
| { |
| struct tg3 *tp = netdev_priv(dev); |
| int i, irq_sync = 0, err = 0; |
| + bool reset_phy = false; |
| |
| if ((ering->rx_pending > tp->rx_std_ring_mask) || |
| (ering->rx_jumbo_pending > tp->rx_jmb_ring_mask) || |
| @@ -12420,7 +12421,13 @@ static int tg3_set_ringparam(struct net_ |
| |
| if (netif_running(dev)) { |
| tg3_halt(tp, RESET_KIND_SHUTDOWN, 1); |
| - err = tg3_restart_hw(tp, false); |
| + /* Reset PHY to avoid PHY lock up */ |
| + if (tg3_asic_rev(tp) == ASIC_REV_5717 || |
| + tg3_asic_rev(tp) == ASIC_REV_5719 || |
| + tg3_asic_rev(tp) == ASIC_REV_5720) |
| + reset_phy = true; |
| + |
| + err = tg3_restart_hw(tp, reset_phy); |
| if (!err) |
| tg3_netif_start(tp); |
| } |
| @@ -12454,6 +12461,7 @@ static int tg3_set_pauseparam(struct net |
| { |
| struct tg3 *tp = netdev_priv(dev); |
| int err = 0; |
| + bool reset_phy = false; |
| |
| if (tp->link_config.autoneg == AUTONEG_ENABLE) |
| tg3_warn_mgmt_link_flap(tp); |
| @@ -12544,7 +12552,13 @@ static int tg3_set_pauseparam(struct net |
| |
| if (netif_running(dev)) { |
| tg3_halt(tp, RESET_KIND_SHUTDOWN, 1); |
| - err = tg3_restart_hw(tp, false); |
| + /* Reset PHY to avoid PHY lock up */ |
| + if (tg3_asic_rev(tp) == ASIC_REV_5717 || |
| + tg3_asic_rev(tp) == ASIC_REV_5719 || |
| + tg3_asic_rev(tp) == ASIC_REV_5720) |
| + reset_phy = true; |
| + |
| + err = tg3_restart_hw(tp, reset_phy); |
| if (!err) |
| tg3_netif_start(tp); |
| } |