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

--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to