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