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 <agordeev@xxxxxxxxxx> --- drivers/net/ethernet/emulex/benet/be_main.c | 38 ++++++++++++++------------ 1 files changed, 20 insertions(+), 18 deletions(-) diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c index 3e2c834..84d560d 100644 --- a/drivers/net/ethernet/emulex/benet/be_main.c +++ b/drivers/net/ethernet/emulex/benet/be_main.c @@ -2366,29 +2366,23 @@ static int be_msix_enable(struct be_adapter *adapter) else num_vec = adapter->cfg_num_qs; - for (i = 0; i < num_vec; i++) - adapter->msix_entries[i].entry = i; + status = pci_msix_table_size(adapter->pdev); + if (status < 0) + goto fail; - status = pci_enable_msix(adapter->pdev, adapter->msix_entries, num_vec); - if (status == 0) { - goto done; - } else if (status >= MIN_MSIX_VECTORS) { - num_vec = status; - status = pci_enable_msix(adapter->pdev, adapter->msix_entries, - num_vec); - if (!status) - goto done; - } else (status > 0) { + num_vec = min(num_vec, status); + if (num_vec < MIN_MSIX_VECTORS) { status = -ENOSPC; + goto fail; } - dev_warn(dev, "MSIx enable failed\n"); + for (i = 0; i < num_vec; i++) + adapter->msix_entries[i].entry = i; + + status = pci_enable_msix(adapter->pdev, adapter->msix_entries, num_vec); + if (status) + goto fail; - /* INTx is not supported in VFs, so fail probe if enable_msix fails */ - if (!be_physfn(adapter)) - return status; - return 0; -done: if (be_roce_supported(adapter) && num_vec > MIN_MSIX_VECTORS) { adapter->num_msix_roce_vec = num_vec / 2; dev_info(dev, "enabled %d MSI-x vector(s) for RoCE\n", @@ -2400,6 +2394,14 @@ done: dev_info(dev, "enabled %d MSI-x vector(s) for NIC\n", adapter->num_msix_vec); return 0; + +fail: + dev_warn(dev, "MSIx enable failed\n"); + + /* INTx is not supported in VFs, so fail probe if enable_msix fails */ + if (!be_physfn(adapter)) + return status; + return 0; } static inline int be_msix_vec_get(struct be_adapter *adapter, -- 1.7.7.6