Commit 875328e4 authored by Jacob Keller's avatar Jacob Keller Committed by Jeff Kirsher

fm10k: reinitialize queuing scheme after calling init_hw

The init_hw function may fail, and in the case of VFs, it might change
the number of maximum queues available. Thus, for every flow which
checks init_hw, we need to ensure that we clear the queue scheme before,
and initialize it after. The fm10k_io_slot_reset path will end up
triggering a reset so fm10k_reinit needs this change. The
fm10k_io_error_detected and fm10k_io_resume also need to properly clear
and reinitialize the queue scheme.
Signed-off-by: default avatarJacob Keller <jacob.e.keller@intel.com>
Reviewed-by: default avatarBruce Allan <bruce.w.allan@intel.com>
Tested-by: default avatarKrishneil Singh <Krishneil.k.singh@intel.com>
Signed-off-by: default avatarJeff Kirsher <jeffrey.t.kirsher@intel.com>
parent 1343c65f
...@@ -159,6 +159,9 @@ static void fm10k_reinit(struct fm10k_intfc *interface) ...@@ -159,6 +159,9 @@ static void fm10k_reinit(struct fm10k_intfc *interface)
fm10k_mbx_free_irq(interface); fm10k_mbx_free_irq(interface);
/* free interrupts */
fm10k_clear_queueing_scheme(interface);
/* delay any future reset requests */ /* delay any future reset requests */
interface->last_reset = jiffies + (10 * HZ); interface->last_reset = jiffies + (10 * HZ);
...@@ -175,6 +178,12 @@ static void fm10k_reinit(struct fm10k_intfc *interface) ...@@ -175,6 +178,12 @@ static void fm10k_reinit(struct fm10k_intfc *interface)
goto reinit_err; goto reinit_err;
} }
err = fm10k_init_queueing_scheme(interface);
if (err) {
dev_err(&interface->pdev->dev, "init_queueing_scheme failed: %d\n", err);
goto reinit_err;
}
/* reassociate interrupts */ /* reassociate interrupts */
fm10k_mbx_request_irq(interface); fm10k_mbx_request_irq(interface);
...@@ -2198,6 +2207,9 @@ static pci_ers_result_t fm10k_io_error_detected(struct pci_dev *pdev, ...@@ -2198,6 +2207,9 @@ static pci_ers_result_t fm10k_io_error_detected(struct pci_dev *pdev,
if (netif_running(netdev)) if (netif_running(netdev))
fm10k_close(netdev); fm10k_close(netdev);
/* free interrupts */
fm10k_clear_queueing_scheme(interface);
fm10k_mbx_free_irq(interface); fm10k_mbx_free_irq(interface);
pci_disable_device(pdev); pci_disable_device(pdev);
...@@ -2270,6 +2282,12 @@ static void fm10k_io_resume(struct pci_dev *pdev) ...@@ -2270,6 +2282,12 @@ static void fm10k_io_resume(struct pci_dev *pdev)
/* reset statistics starting values */ /* reset statistics starting values */
hw->mac.ops.rebind_hw_stats(hw, &interface->stats); hw->mac.ops.rebind_hw_stats(hw, &interface->stats);
err = fm10k_init_queueing_scheme(interface);
if (err) {
dev_err(&interface->pdev->dev, "init_queueing_scheme failed: %d\n", err);
return;
}
/* reassociate interrupts */ /* reassociate interrupts */
fm10k_mbx_request_irq(interface); fm10k_mbx_request_irq(interface);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment