diff options
-rw-r--r-- | drivers/net/cxgb3/adapter.h | 1 | ||||
-rw-r--r-- | drivers/net/cxgb3/cxgb3_main.c | 23 |
2 files changed, 16 insertions, 8 deletions
diff --git a/drivers/net/cxgb3/adapter.h b/drivers/net/cxgb3/adapter.h index a89d8cc51205..5fb7c6851eb2 100644 --- a/drivers/net/cxgb3/adapter.h +++ b/drivers/net/cxgb3/adapter.h | |||
@@ -230,6 +230,7 @@ struct adapter { | |||
230 | unsigned int slow_intr_mask; | 230 | unsigned int slow_intr_mask; |
231 | unsigned long irq_stats[IRQ_NUM_STATS]; | 231 | unsigned long irq_stats[IRQ_NUM_STATS]; |
232 | 232 | ||
233 | int msix_nvectors; | ||
233 | struct { | 234 | struct { |
234 | unsigned short vec; | 235 | unsigned short vec; |
235 | char desc[22]; | 236 | char desc[22]; |
diff --git a/drivers/net/cxgb3/cxgb3_main.c b/drivers/net/cxgb3/cxgb3_main.c index 0089746b8d02..52131bd4cc70 100644 --- a/drivers/net/cxgb3/cxgb3_main.c +++ b/drivers/net/cxgb3/cxgb3_main.c | |||
@@ -338,7 +338,7 @@ static void free_irq_resources(struct adapter *adapter) | |||
338 | 338 | ||
339 | free_irq(adapter->msix_info[0].vec, adapter); | 339 | free_irq(adapter->msix_info[0].vec, adapter); |
340 | for_each_port(adapter, i) | 340 | for_each_port(adapter, i) |
341 | n += adap2pinfo(adapter, i)->nqsets; | 341 | n += adap2pinfo(adapter, i)->nqsets; |
342 | 342 | ||
343 | for (i = 0; i < n; ++i) | 343 | for (i = 0; i < n; ++i) |
344 | free_irq(adapter->msix_info[i + 1].vec, | 344 | free_irq(adapter->msix_info[i + 1].vec, |
@@ -2752,7 +2752,7 @@ static void set_nqsets(struct adapter *adap) | |||
2752 | int i, j = 0; | 2752 | int i, j = 0; |
2753 | int num_cpus = num_online_cpus(); | 2753 | int num_cpus = num_online_cpus(); |
2754 | int hwports = adap->params.nports; | 2754 | int hwports = adap->params.nports; |
2755 | int nqsets = SGE_QSETS; | 2755 | int nqsets = adap->msix_nvectors - 1; |
2756 | 2756 | ||
2757 | if (adap->params.rev > 0 && adap->flags & USING_MSIX) { | 2757 | if (adap->params.rev > 0 && adap->flags & USING_MSIX) { |
2758 | if (hwports == 2 && | 2758 | if (hwports == 2 && |
@@ -2781,18 +2781,25 @@ static void set_nqsets(struct adapter *adap) | |||
2781 | static int __devinit cxgb_enable_msix(struct adapter *adap) | 2781 | static int __devinit cxgb_enable_msix(struct adapter *adap) |
2782 | { | 2782 | { |
2783 | struct msix_entry entries[SGE_QSETS + 1]; | 2783 | struct msix_entry entries[SGE_QSETS + 1]; |
2784 | int vectors; | ||
2784 | int i, err; | 2785 | int i, err; |
2785 | 2786 | ||
2786 | for (i = 0; i < ARRAY_SIZE(entries); ++i) | 2787 | vectors = ARRAY_SIZE(entries); |
2788 | for (i = 0; i < vectors; ++i) | ||
2787 | entries[i].entry = i; | 2789 | entries[i].entry = i; |
2788 | 2790 | ||
2789 | err = pci_enable_msix(adap->pdev, entries, ARRAY_SIZE(entries)); | 2791 | while ((err = pci_enable_msix(adap->pdev, entries, vectors)) > 0) |
2792 | vectors = err; | ||
2793 | |||
2794 | if (!err && vectors < (adap->params.nports + 1)) | ||
2795 | err = -1; | ||
2796 | |||
2790 | if (!err) { | 2797 | if (!err) { |
2791 | for (i = 0; i < ARRAY_SIZE(entries); ++i) | 2798 | for (i = 0; i < vectors; ++i) |
2792 | adap->msix_info[i].vec = entries[i].vector; | 2799 | adap->msix_info[i].vec = entries[i].vector; |
2793 | } else if (err > 0) | 2800 | adap->msix_nvectors = vectors; |
2794 | dev_info(&adap->pdev->dev, | 2801 | } |
2795 | "only %d MSI-X vectors left, not using MSI-X\n", err); | 2802 | |
2796 | return err; | 2803 | return err; |
2797 | } | 2804 | } |
2798 | 2805 | ||