diff options
-rw-r--r-- | drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c | 50 |
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) | |||
5737 | static int enable_msix(struct adapter *adap) | 5737 | static 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 |