aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c50
1 files changed, 24 insertions, 26 deletions
diff --git a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
index 43ab35fea48d..bd0321d8b612 100644
--- a/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
+++ b/drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
@@ -5737,7 +5737,7 @@ static void reduce_ethqs(struct adapter *adap, int n)
5737static int enable_msix(struct adapter *adap) 5737static int enable_msix(struct adapter *adap)
5738{ 5738{
5739 int ofld_need = 0; 5739 int ofld_need = 0;
5740 int i, err, want, need; 5740 int i, want, need;
5741 struct sge *s = &adap->sge; 5741 struct sge *s = &adap->sge;
5742 unsigned int nchan = adap->params.nports; 5742 unsigned int nchan = adap->params.nports;
5743 struct msix_entry entries[MAX_INGQ + 1]; 5743 struct msix_entry entries[MAX_INGQ + 1];
@@ -5753,32 +5753,30 @@ static int enable_msix(struct adapter *adap)
5753 } 5753 }
5754 need = adap->params.nports + EXTRA_VECS + ofld_need; 5754 need = adap->params.nports + EXTRA_VECS + ofld_need;
5755 5755
5756 while ((err = pci_enable_msix(adap->pdev, entries, want)) >= need) 5756 want = pci_enable_msix_range(adap->pdev, entries, need, want);
5757 want = err; 5757 if (want < 0)
5758 return want;
5758 5759
5759 if (!err) { 5760 /*
5760 /* 5761 * Distribute available vectors to the various queue groups.
5761 * Distribute available vectors to the various queue groups. 5762 * Every group gets its minimum requirement and NIC gets top
5762 * Every group gets its minimum requirement and NIC gets top 5763 * priority for leftovers.
5763 * priority for leftovers. 5764 */
5764 */ 5765 i = want - EXTRA_VECS - ofld_need;
5765 i = want - EXTRA_VECS - ofld_need; 5766 if (i < s->max_ethqsets) {
5766 if (i < s->max_ethqsets) { 5767 s->max_ethqsets = i;
5767 s->max_ethqsets = i; 5768 if (i < s->ethqsets)
5768 if (i < s->ethqsets) 5769 reduce_ethqs(adap, i);
5769 reduce_ethqs(adap, i); 5770 }
5770 } 5771 if (is_offload(adap)) {
5771 if (is_offload(adap)) { 5772 i = want - EXTRA_VECS - s->max_ethqsets;
5772 i = want - EXTRA_VECS - s->max_ethqsets; 5773 i -= ofld_need - nchan;
5773 i -= ofld_need - nchan; 5774 s->ofldqsets = (i / nchan) * nchan; /* round down */
5774 s->ofldqsets = (i / nchan) * nchan; /* round down */ 5775 }
5775 } 5776 for (i = 0; i < want; ++i)
5776 for (i = 0; i < want; ++i) 5777 adap->msix_info[i].vec = entries[i].vector;
5777 adap->msix_info[i].vec = entries[i].vector; 5778
5778 } else if (err > 0) 5779 return 0;
5779 dev_info(adap->pdev_dev,
5780 "only %d MSI-X vectors left, not using MSI-X\n", err);
5781 return err;
5782} 5780}
5783 5781
5784#undef EXTRA_VECS 5782#undef EXTRA_VECS