|
@@ -2444,7 +2444,7 @@ static void reduce_ethqs(struct adapter *adapter, int n)
|
|
|
*/
|
|
|
static int enable_msix(struct adapter *adapter)
|
|
|
{
|
|
|
- int i, err, want, need;
|
|
|
+ int i, want, need, nqsets;
|
|
|
struct msix_entry entries[MSIX_ENTRIES];
|
|
|
struct sge *s = &adapter->sge;
|
|
|
|
|
@@ -2460,25 +2460,23 @@ static int enable_msix(struct adapter *adapter)
|
|
|
*/
|
|
|
want = s->max_ethqsets + MSIX_EXTRAS;
|
|
|
need = adapter->params.nports + MSIX_EXTRAS;
|
|
|
- while ((err = pci_enable_msix(adapter->pdev, entries, want)) >= need)
|
|
|
- want = err;
|
|
|
|
|
|
- if (err == 0) {
|
|
|
- int nqsets = want - MSIX_EXTRAS;
|
|
|
- if (nqsets < s->max_ethqsets) {
|
|
|
- dev_warn(adapter->pdev_dev, "only enough MSI-X vectors"
|
|
|
- " for %d Queue Sets\n", nqsets);
|
|
|
- s->max_ethqsets = nqsets;
|
|
|
- if (nqsets < s->ethqsets)
|
|
|
- reduce_ethqs(adapter, nqsets);
|
|
|
- }
|
|
|
- for (i = 0; i < want; ++i)
|
|
|
- adapter->msix_info[i].vec = entries[i].vector;
|
|
|
- } else if (err > 0) {
|
|
|
- dev_info(adapter->pdev_dev, "only %d MSI-X vectors left,"
|
|
|
- " not using MSI-X\n", err);
|
|
|
+ want = pci_enable_msix_range(adapter->pdev, entries, need, want);
|
|
|
+ if (want < 0)
|
|
|
+ return want;
|
|
|
+
|
|
|
+ nqsets = want - MSIX_EXTRAS;
|
|
|
+ if (nqsets < s->max_ethqsets) {
|
|
|
+ dev_warn(adapter->pdev_dev, "only enough MSI-X vectors"
|
|
|
+ " for %d Queue Sets\n", nqsets);
|
|
|
+ s->max_ethqsets = nqsets;
|
|
|
+ if (nqsets < s->ethqsets)
|
|
|
+ reduce_ethqs(adapter, nqsets);
|
|
|
}
|
|
|
- return err;
|
|
|
+ for (i = 0; i < want; ++i)
|
|
|
+ adapter->msix_info[i].vec = entries[i].vector;
|
|
|
+
|
|
|
+ return 0;
|
|
|
}
|
|
|
|
|
|
static const struct net_device_ops cxgb4vf_netdev_ops = {
|