On Wed, Apr 17, 2019 at 4:13 AM Konstantin Khlebnikov <khlebni...@yandex-team.ru> wrote: > > Driver does not want to keep packets in tx queue when link is lost. > But present code only reset NIC to flush them, but does not prevent > queuing new packets. Moreover reset sequence itself could generate > new packets via netconsole and NIC falls into endless reset loop. > > This patch wakes tx queue only when NIC is ready to send packets. > > This is proper fix for problem addressed by commit 0f9e980bf5ee > ("e1000e: fix cyclic resets at link up with active tx"). > > Signed-off-by: Konstantin Khlebnikov <khlebni...@yandex-team.ru> > Suggested-by: Alexander Duyck <alexander.du...@gmail.com> Tested-by: Joseph Yasi <joe.y...@gmail.com> > --- > drivers/net/ethernet/intel/e1000e/netdev.c | 6 ++++-- > 1 file changed, 4 insertions(+), 2 deletions(-) > > diff --git a/drivers/net/ethernet/intel/e1000e/netdev.c > b/drivers/net/ethernet/intel/e1000e/netdev.c > index ba96e52aa8d1..fe643d66aa10 100644 > --- a/drivers/net/ethernet/intel/e1000e/netdev.c > +++ b/drivers/net/ethernet/intel/e1000e/netdev.c > @@ -4209,7 +4209,7 @@ void e1000e_up(struct e1000_adapter *adapter) > e1000_configure_msix(adapter); > e1000_irq_enable(adapter); > > - netif_start_queue(adapter->netdev); > + /* tx queue started by watchdog timer when link is up */ > > e1000e_trigger_lsc(adapter); > } > @@ -4607,6 +4607,7 @@ int e1000e_open(struct net_device *netdev) > pm_runtime_get_sync(&pdev->dev); > > netif_carrier_off(netdev); > + netif_stop_queue(netdev); > > /* allocate transmit descriptors */ > err = e1000e_setup_tx_resources(adapter->tx_ring); > @@ -4667,7 +4668,6 @@ int e1000e_open(struct net_device *netdev) > e1000_irq_enable(adapter); > > adapter->tx_hang_recheck = false; > - netif_start_queue(netdev); > > hw->mac.get_link_status = true; > pm_runtime_put(&pdev->dev); > @@ -5289,6 +5289,7 @@ static void e1000_watchdog_task(struct work_struct > *work) > if (phy->ops.cfg_on_link_up) > phy->ops.cfg_on_link_up(hw); > > + netif_wake_queue(netdev); > netif_carrier_on(netdev); > > if (!test_bit(__E1000_DOWN, &adapter->state)) > @@ -5302,6 +5303,7 @@ static void e1000_watchdog_task(struct work_struct > *work) > /* Link status message must follow this format */ > pr_info("%s NIC Link is Down\n", > adapter->netdev->name); > netif_carrier_off(netdev); > + netif_stop_queue(netdev); > if (!test_bit(__E1000_DOWN, &adapter->state)) > mod_timer(&adapter->phy_info_timer, > round_jiffies(jiffies + 2 * HZ)); >
_______________________________________________ E1000-devel mailing list E1000-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/e1000-devel To learn more about Intel® Ethernet, visit http://communities.intel.com/community/wired