|
@@ -1344,20 +1344,23 @@ static int efx_probe_interrupts(struct efx_nic *efx)
|
|
|
|
|
|
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_enable_msix_range(efx->pci_dev,
|
|
|
+ xentries, 1, n_channels);
|
|
|
+ if (rc < 0) {
|
|
|
+ /* Fall back to single channel MSI */
|
|
|
+ efx->interrupt_mode = EFX_INT_MODE_MSI;
|
|
|
+ netif_err(efx, drv, efx->net_dev,
|
|
|
+ "could not enable MSI-X\n");
|
|
|
+ } else 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);
|
|
|
}
|
|
|
|
|
|
- if (rc == 0) {
|
|
|
+ if (rc > 0) {
|
|
|
efx->n_channels = n_channels;
|
|
|
if (n_channels > extra_channels)
|
|
|
n_channels -= extra_channels;
|
|
@@ -1373,11 +1376,6 @@ static int efx_probe_interrupts(struct efx_nic *efx)
|
|
|
for (i = 0; i < efx->n_channels; i++)
|
|
|
efx_get_channel(efx, i)->irq =
|
|
|
xentries[i].vector;
|
|
|
- } else {
|
|
|
- /* Fall back to single channel MSI */
|
|
|
- efx->interrupt_mode = EFX_INT_MODE_MSI;
|
|
|
- netif_err(efx, drv, efx->net_dev,
|
|
|
- "could not enable MSI-X\n");
|
|
|
}
|
|
|
}
|
|
|
|