Commit 59663e42 authored by Siva Reddy Kallam's avatar Siva Reddy Kallam Committed by David S. Miller
Browse files

tg3: Add PHY reset for 5717/5719/5720 in change ring and flow control paths



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: default avatarSiva Reddy Kallam <siva.kallam@broadcom.com>
Acked-by: default avatarMichael Chan <michael.chan@broadcom.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 1359f251
Loading
Loading
Loading
Loading
+16 −2
Original line number Diff line number Diff line
@@ -12422,6 +12422,7 @@ static int tg3_set_ringparam(struct net_device *dev, struct ethtool_ringparam *e
{
	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) ||
@@ -12453,7 +12454,13 @@ static int tg3_set_ringparam(struct net_device *dev, struct ethtool_ringparam *e

	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);
	}
@@ -12487,6 +12494,7 @@ static int tg3_set_pauseparam(struct net_device *dev, struct ethtool_pauseparam
{
	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);
@@ -12556,7 +12564,13 @@ static int tg3_set_pauseparam(struct net_device *dev, struct ethtool_pauseparam

		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);
		}