Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b19cf6ee authored by Emil Tantilov's avatar Emil Tantilov Committed by Jeff Kirsher
Browse files

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: default avatarEmil Tantilov <emil.s.tantilov@intel.com>
Tested-by: default avatarAndrew Bowers <andrewx.bowers@intel.com>
Signed-off-by: default avatarJeff Kirsher <jeffrey.t.kirsher@intel.com>
parent 126db13f
Loading
Loading
Loading
Loading
+25 −18
Original line number Original line Diff line number Diff line
@@ -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)
{
{
	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)
	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_free_all_rx_resources(adapter);
	ixgbevf_clear_interrupt_scheme(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,
	}
	}


	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)
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) */