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 <agord...@redhat.com>
---
 drivers/net/ethernet/sfc/efx.c |   18 +++++++++++-------
 1 files changed, 11 insertions(+), 7 deletions(-)

diff --git a/drivers/net/ethernet/sfc/efx.c b/drivers/net/ethernet/sfc/efx.c
index 07c9bc4..184ef9f 100644
--- a/drivers/net/ethernet/sfc/efx.c
+++ b/drivers/net/ethernet/sfc/efx.c
@@ -1261,21 +1261,24 @@ static int efx_probe_interrupts(struct efx_nic *efx)
                n_channels += extra_channels;
                n_channels = min(n_channels, efx->max_channels);
 
-               for (i = 0; i < n_channels; i++)
-                       xentries[i].entry = i;
-               rc = pci_enable_msix(efx->pci_dev, xentries, n_channels);
-               if (rc > 0) {
+               rc = pci_msix_table_size(efx->pci_dev);
+               if (rc < 0)
+                       goto msi;
+
+               if (rc < n_channels) {
                        netif_err(efx, drv, efx->net_dev,
                                  "WARNING: Insufficient MSI-X vectors"
                                  " available (%d < %u).\n", rc, n_channels);
                        netif_err(efx, drv, efx->net_dev,
                                  "WARNING: Performance may be reduced.\n");
-                       EFX_BUG_ON_PARANOID(rc >= n_channels);
                        n_channels = rc;
-                       rc = pci_enable_msix(efx->pci_dev, xentries,
-                                            n_channels);
                }
 
+               EFX_BUG_ON_PARANOID(n_channels > ARRAY_SIZE(xentries));
+               for (i = 0; i < n_channels; i++)
+                       xentries[i].entry = i;
+
+               rc = pci_enable_msix(efx->pci_dev, xentries, n_channels);
                if (rc == 0) {
                        efx->n_channels = n_channels;
                        if (n_channels > extra_channels)
@@ -1293,6 +1296,7 @@ static int efx_probe_interrupts(struct efx_nic *efx)
                                efx_get_channel(efx, i)->irq =
                                        xentries[i].vector;
                } else {
+msi:
                        /* Fall back to single channel MSI */
                        efx->interrupt_mode = EFX_INT_MODE_MSI;
                        netif_err(efx, drv, efx->net_dev,
-- 
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
E1000-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/e1000-devel
To learn more about Intel&#174; Ethernet, visit 
http://communities.intel.com/community/wired

Reply via email to