|
@@ -5737,7 +5737,7 @@ static void reduce_ethqs(struct adapter *adap, int n)
|
|
|
static int enable_msix(struct adapter *adap)
|
|
|
{
|
|
|
int ofld_need = 0;
|
|
|
- int i, err, want, need;
|
|
|
+ int i, want, need;
|
|
|
struct sge *s = &adap->sge;
|
|
|
unsigned int nchan = adap->params.nports;
|
|
|
struct msix_entry entries[MAX_INGQ + 1];
|
|
@@ -5753,32 +5753,30 @@ static int enable_msix(struct adapter *adap)
|
|
|
}
|
|
|
need = adap->params.nports + EXTRA_VECS + ofld_need;
|
|
|
|
|
|
- while ((err = pci_enable_msix(adap->pdev, entries, want)) >= need)
|
|
|
- want = err;
|
|
|
+ want = pci_enable_msix_range(adap->pdev, entries, need, want);
|
|
|
+ if (want < 0)
|
|
|
+ return want;
|
|
|
|
|
|
- if (!err) {
|
|
|
- /*
|
|
|
- * Distribute available vectors to the various queue groups.
|
|
|
- * Every group gets its minimum requirement and NIC gets top
|
|
|
- * priority for leftovers.
|
|
|
- */
|
|
|
- i = want - EXTRA_VECS - ofld_need;
|
|
|
- if (i < s->max_ethqsets) {
|
|
|
- s->max_ethqsets = i;
|
|
|
- if (i < s->ethqsets)
|
|
|
- reduce_ethqs(adap, i);
|
|
|
- }
|
|
|
- if (is_offload(adap)) {
|
|
|
- i = want - EXTRA_VECS - s->max_ethqsets;
|
|
|
- i -= ofld_need - nchan;
|
|
|
- s->ofldqsets = (i / nchan) * nchan; /* round down */
|
|
|
- }
|
|
|
- for (i = 0; i < want; ++i)
|
|
|
- adap->msix_info[i].vec = entries[i].vector;
|
|
|
- } else if (err > 0)
|
|
|
- dev_info(adap->pdev_dev,
|
|
|
- "only %d MSI-X vectors left, not using MSI-X\n", err);
|
|
|
- return err;
|
|
|
+ /*
|
|
|
+ * Distribute available vectors to the various queue groups.
|
|
|
+ * Every group gets its minimum requirement and NIC gets top
|
|
|
+ * priority for leftovers.
|
|
|
+ */
|
|
|
+ i = want - EXTRA_VECS - ofld_need;
|
|
|
+ if (i < s->max_ethqsets) {
|
|
|
+ s->max_ethqsets = i;
|
|
|
+ if (i < s->ethqsets)
|
|
|
+ reduce_ethqs(adap, i);
|
|
|
+ }
|
|
|
+ if (is_offload(adap)) {
|
|
|
+ i = want - EXTRA_VECS - s->max_ethqsets;
|
|
|
+ i -= ofld_need - nchan;
|
|
|
+ s->ofldqsets = (i / nchan) * nchan; /* round down */
|
|
|
+ }
|
|
|
+ for (i = 0; i < want; ++i)
|
|
|
+ adap->msix_info[i].vec = entries[i].vector;
|
|
|
+
|
|
|
+ return 0;
|
|
|
}
|
|
|
|
|
|
#undef EXTRA_VECS
|