提交 b19cf6ee 编写于 作者: E Emil Tantilov 提交者: Jeff Kirsher

ixgbevf: fix AER error handling

Make sure that we free the IRQs in ixgbevf_io_error_detected() when
responding to an PCIe AER error and also restore them when the
interface recovers from it.

Previously it was possible to trigger BUG_ON() check in free_msix_irqs()
in the case where we call ixgbevf_remove() after a failed recovery from
AER error because the interrupts were not freed.

Also moved the down and free functions into ixgbevf_close_suspend()
same as with ixgbe.
Signed-off-by: NEmil Tantilov <emil.s.tantilov@intel.com>
Tested-by: NAndrew Bowers <andrewx.bowers@intel.com>
Signed-off-by: NJeff Kirsher <jeffrey.t.kirsher@intel.com>
上级 126db13f
...@@ -3227,6 +3227,21 @@ int ixgbevf_open(struct net_device *netdev) ...@@ -3227,6 +3227,21 @@ int ixgbevf_open(struct net_device *netdev)
return err; return err;
} }
/**
* ixgbevf_close_suspend - actions necessary to both suspend and close flows
* @adapter: the private adapter struct
*
* This function should contain the necessary work common to both suspending
* and closing of the device.
*/
static void ixgbevf_close_suspend(struct ixgbevf_adapter *adapter)
{
ixgbevf_down(adapter);
ixgbevf_free_irq(adapter);
ixgbevf_free_all_tx_resources(adapter);
ixgbevf_free_all_rx_resources(adapter);
}
/** /**
* ixgbevf_close - Disables a network interface * ixgbevf_close - Disables a network interface
* @netdev: network interface device structure * @netdev: network interface device structure
...@@ -3242,14 +3257,8 @@ int ixgbevf_close(struct net_device *netdev) ...@@ -3242,14 +3257,8 @@ int ixgbevf_close(struct net_device *netdev)
{ {
struct ixgbevf_adapter *adapter = netdev_priv(netdev); struct ixgbevf_adapter *adapter = netdev_priv(netdev);
if (!netif_device_present(netdev)) if (netif_device_present(netdev))
return 0; ixgbevf_close_suspend(adapter);
ixgbevf_down(adapter);
ixgbevf_free_irq(adapter);
ixgbevf_free_all_tx_resources(adapter);
ixgbevf_free_all_rx_resources(adapter);
return 0; return 0;
} }
...@@ -3806,13 +3815,10 @@ static int ixgbevf_suspend(struct pci_dev *pdev, pm_message_t state) ...@@ -3806,13 +3815,10 @@ static int ixgbevf_suspend(struct pci_dev *pdev, pm_message_t state)
rtnl_lock(); rtnl_lock();
netif_device_detach(netdev); netif_device_detach(netdev);
if (netif_running(netdev)) { if (netif_running(netdev))
ixgbevf_down(adapter); ixgbevf_close_suspend(adapter);
ixgbevf_free_irq(adapter);
ixgbevf_free_all_tx_resources(adapter); ixgbevf_clear_interrupt_scheme(adapter);
ixgbevf_free_all_rx_resources(adapter);
ixgbevf_clear_interrupt_scheme(adapter);
}
rtnl_unlock(); rtnl_unlock();
#ifdef CONFIG_PM #ifdef CONFIG_PM
...@@ -4251,7 +4257,7 @@ static pci_ers_result_t ixgbevf_io_error_detected(struct pci_dev *pdev, ...@@ -4251,7 +4257,7 @@ static pci_ers_result_t ixgbevf_io_error_detected(struct pci_dev *pdev,
} }
if (netif_running(netdev)) if (netif_running(netdev))
ixgbevf_down(adapter); ixgbevf_close_suspend(adapter);
if (!test_and_set_bit(__IXGBEVF_DISABLED, &adapter->state)) if (!test_and_set_bit(__IXGBEVF_DISABLED, &adapter->state))
pci_disable_device(pdev); pci_disable_device(pdev);
...@@ -4299,12 +4305,13 @@ static pci_ers_result_t ixgbevf_io_slot_reset(struct pci_dev *pdev) ...@@ -4299,12 +4305,13 @@ static pci_ers_result_t ixgbevf_io_slot_reset(struct pci_dev *pdev)
static void ixgbevf_io_resume(struct pci_dev *pdev) static void ixgbevf_io_resume(struct pci_dev *pdev)
{ {
struct net_device *netdev = pci_get_drvdata(pdev); struct net_device *netdev = pci_get_drvdata(pdev);
struct ixgbevf_adapter *adapter = netdev_priv(netdev);
rtnl_lock();
if (netif_running(netdev)) if (netif_running(netdev))
ixgbevf_up(adapter); ixgbevf_open(netdev);
netif_device_attach(netdev); netif_device_attach(netdev);
rtnl_unlock();
} }
/* PCI Error Recovery (ERS) */ /* PCI Error Recovery (ERS) */
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册