As result of recent re-design of the MSI/MSI-X interrupts enabling pattern this driver has to be updated to use the new technique to obtain a optimal number of MSI/MSI-X interrupts required.
Signed-off-by: Alexander Gordeev <[email protected]> --- drivers/net/vmxnet3/vmxnet3_drv.c | 68 ++++++++++++++++++------------------- 1 files changed, 33 insertions(+), 35 deletions(-) diff --git a/drivers/net/vmxnet3/vmxnet3_drv.c b/drivers/net/vmxnet3/vmxnet3_drv.c index 00dc0d0..8d3321b 100644 --- a/drivers/net/vmxnet3/vmxnet3_drv.c +++ b/drivers/net/vmxnet3/vmxnet3_drv.c @@ -2724,49 +2724,47 @@ vmxnet3_read_mac_addr(struct vmxnet3_adapter *adapter, u8 *mac) #ifdef CONFIG_PCI_MSI -/* - * Enable MSIx vectors. - * Returns : - * 0 on successful enabling of required vectors, - * VMXNET3_LINUX_MIN_MSIX_VECT when only minimum number of vectors required - * could be enabled. - * number of vectors which can be enabled otherwise (this number is smaller - * than VMXNET3_LINUX_MIN_MSIX_VECT) - */ - static int vmxnet3_acquire_msix_vectors(struct vmxnet3_adapter *adapter, int vectors) { - int err = -EINVAL, vector_threshold; + int err, vector_threshold; + vector_threshold = VMXNET3_LINUX_MIN_MSIX_VECT; + if (vectors < vector_threshold) + return -EINVAL; - while (vectors >= vector_threshold) { - err = pci_enable_msix(adapter->pdev, adapter->intr.msix_entries, - vectors); - if (!err) { - adapter->intr.num_intrs = vectors; - return 0; - } else if (err < 0) { - dev_err(&adapter->netdev->dev, - "Failed to enable MSI-X, error: %d\n", err); - return err; - } else if (err < vector_threshold) { - dev_info(&adapter->pdev->dev, - "Number of MSI-Xs which can be allocated " - "is lower than min threshold required.\n"); - return -ENOSPC; - } else { - /* If fails to enable required number of MSI-x vectors - * try enabling minimum number of vectors required. - */ - dev_err(&adapter->netdev->dev, - "Failed to enable %d MSI-X, trying %d instead\n", - vectors, vector_threshold); - vectors = vector_threshold; - } + err = pci_msix_table_size(adapter->pdev); + if (err < 0) + goto err_msix; + if (err < vector_threshold) { + dev_info(&adapter->pdev->dev, + "Number of MSI-X interrupts which can be allocated " + "is lower than min threshold required.\n"); + return -ENOSPC; + } + if (err < vectors) { + /* + * If fails to enable required number of MSI-x vectors + * try enabling minimum number of vectors required. + */ + dev_err(&adapter->netdev->dev, + "Failed to enable %d MSI-X, trying %d instead\n", + vectors, vector_threshold); + vectors = vector_threshold; } + err = pci_enable_msix(adapter->pdev, adapter->intr.msix_entries, + vectors); + if (err) + goto err_msix; + + adapter->intr.num_intrs = vectors; + return 0; + +err_msix: + dev_err(&adapter->netdev->dev, + "Failed to enable MSI-X, error: %d\n", err); return err; } -- 1.7.7.6 ------------------------------------------------------------------------------ October Webinars: Code for Performance Free Intel webinars can help you accelerate application performance. Explore tips for MPI, OpenMP, advanced profiling, and more. Get the most from the latest Intel processors and coprocessors. See abstracts and register > http://pubads.g.doubleclick.net/gampad/clk?id=60134791&iu=/4140/ostg.clktrk _______________________________________________ E1000-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/e1000-devel To learn more about Intel® Ethernet, visit http://communities.intel.com/community/wired
