Skip to content

Commit 8564ae0

Browse files
Alexander Gordeevdavem330
authored andcommitted
qlcnic: Fix MSI-X initialization code
Function qlcnic_setup_tss_rss_intr() might enter endless loop in case pci_enable_msix() contiguously returns a positive number of MSI-Xs that could have been allocated. Besides, the function contains 'err = -EIO;' assignment that never could be reached. This update fixes the aforementioned issues. Cc: Shahed Shaikh <[email protected]> Cc: [email protected] Cc: [email protected] Cc: [email protected] Signed-off-by: Alexander Gordeev <[email protected]> Acked-by: Shahed Shaikh <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 54d63f7 commit 8564ae0

File tree

1 file changed

+16
-12
lines changed

1 file changed

+16
-12
lines changed

drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -670,7 +670,7 @@ int qlcnic_setup_tss_rss_intr(struct qlcnic_adapter *adapter)
670670
else
671671
num_msix += adapter->drv_tx_rings;
672672

673-
if (adapter->drv_rss_rings > 0)
673+
if (adapter->drv_rss_rings > 0)
674674
num_msix += adapter->drv_rss_rings;
675675
else
676676
num_msix += adapter->drv_sds_rings;
@@ -686,19 +686,15 @@ int qlcnic_setup_tss_rss_intr(struct qlcnic_adapter *adapter)
686686
return -ENOMEM;
687687
}
688688

689-
restore:
690689
for (vector = 0; vector < num_msix; vector++)
691690
adapter->msix_entries[vector].entry = vector;
692691

692+
restore:
693693
err = pci_enable_msix(pdev, adapter->msix_entries, num_msix);
694-
if (err == 0) {
695-
adapter->ahw->num_msix = num_msix;
696-
if (adapter->drv_tss_rings > 0)
697-
adapter->drv_tx_rings = adapter->drv_tss_rings;
694+
if (err > 0) {
695+
if (!adapter->drv_tss_rings && !adapter->drv_rss_rings)
696+
return -ENOSPC;
698697

699-
if (adapter->drv_rss_rings > 0)
700-
adapter->drv_sds_rings = adapter->drv_rss_rings;
701-
} else {
702698
netdev_info(adapter->netdev,
703699
"Unable to allocate %d MSI-X vectors, Available vectors %d\n",
704700
num_msix, err);
@@ -716,12 +712,20 @@ int qlcnic_setup_tss_rss_intr(struct qlcnic_adapter *adapter)
716712
"Restoring %d Tx, %d SDS rings for total %d vectors.\n",
717713
adapter->drv_tx_rings, adapter->drv_sds_rings,
718714
num_msix);
719-
goto restore;
720715

721-
err = -EIO;
716+
goto restore;
717+
} else if (err < 0) {
718+
return err;
722719
}
723720

724-
return err;
721+
adapter->ahw->num_msix = num_msix;
722+
if (adapter->drv_tss_rings > 0)
723+
adapter->drv_tx_rings = adapter->drv_tss_rings;
724+
725+
if (adapter->drv_rss_rings > 0)
726+
adapter->drv_sds_rings = adapter->drv_rss_rings;
727+
728+
return 0;
725729
}
726730

727731
int qlcnic_enable_msix(struct qlcnic_adapter *adapter, u32 num_msix)

0 commit comments

Comments
 (0)