Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'msix'

Alexander Gordeev says:

====================
net: Use pci_enable_msix_range() instead of pci_enable_msix()

As result of deprecation of MSI-X/MSI enablement functions
pci_enable_msix() and pci_enable_msi_block() all drivers
using these two interfaces need to be updated to use the
new pci_enable_msi_range() and pci_enable_msix_range()
interfaces.

Cc: e1000-devel@lists.sourceforge.net
Cc: linux-driver@qlogic.com
Cc: linux-net-drivers@solarflare.com
Cc: linux-pci@vger.kernel.org
Cc: linux-rdma@vger.kernel.org
Cc: netdev@vger.kernel.org
Cc: pv-drivers@vmware.com
Cc: wil6210@qca.qualcomm.com
====================

Signed-off-by: David S. Miller <davem@davemloft.net>

+289 -394
+4 -11
drivers/net/ethernet/broadcom/bnx2.c
··· 6206 6206 static void 6207 6207 bnx2_enable_msix(struct bnx2 *bp, int msix_vecs) 6208 6208 { 6209 - int i, total_vecs, rc; 6209 + int i, total_vecs; 6210 6210 struct msix_entry msix_ent[BNX2_MAX_MSIX_VEC]; 6211 6211 struct net_device *dev = bp->dev; 6212 6212 const int len = sizeof(bp->irq_tbl[0].name); ··· 6229 6229 #ifdef BCM_CNIC 6230 6230 total_vecs++; 6231 6231 #endif 6232 - rc = -ENOSPC; 6233 - while (total_vecs >= BNX2_MIN_MSIX_VEC) { 6234 - rc = pci_enable_msix(bp->pdev, msix_ent, total_vecs); 6235 - if (rc <= 0) 6236 - break; 6237 - if (rc > 0) 6238 - total_vecs = rc; 6239 - } 6240 - 6241 - if (rc != 0) 6232 + total_vecs = pci_enable_msix_range(bp->pdev, msix_ent, 6233 + BNX2_MIN_MSIX_VEC, total_vecs); 6234 + if (total_vecs < 0) 6242 6235 return; 6243 6236 6244 6237 msix_vecs = total_vecs;
+20 -26
drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c
··· 1638 1638 DP(BNX2X_MSG_SP, "about to request enable msix with %d vectors\n", 1639 1639 msix_vec); 1640 1640 1641 - rc = pci_enable_msix(bp->pdev, &bp->msix_table[0], msix_vec); 1642 - 1641 + rc = pci_enable_msix_range(bp->pdev, &bp->msix_table[0], 1642 + BNX2X_MIN_MSIX_VEC_CNT(bp), msix_vec); 1643 1643 /* 1644 1644 * reconfigure number of tx/rx queues according to available 1645 1645 * MSI-X vectors 1646 1646 */ 1647 - if (rc >= BNX2X_MIN_MSIX_VEC_CNT(bp)) { 1648 - /* how less vectors we will have? */ 1649 - int diff = msix_vec - rc; 1650 - 1651 - BNX2X_DEV_INFO("Trying to use less MSI-X vectors: %d\n", rc); 1652 - 1653 - rc = pci_enable_msix(bp->pdev, &bp->msix_table[0], rc); 1654 - 1655 - if (rc) { 1656 - BNX2X_DEV_INFO("MSI-X is not attainable rc %d\n", rc); 1657 - goto no_msix; 1658 - } 1659 - /* 1660 - * decrease number of queues by number of unallocated entries 1661 - */ 1662 - bp->num_ethernet_queues -= diff; 1663 - bp->num_queues = bp->num_ethernet_queues + bp->num_cnic_queues; 1664 - 1665 - BNX2X_DEV_INFO("New queue configuration set: %d\n", 1666 - bp->num_queues); 1667 - } else if (rc > 0) { 1647 + if (rc == -ENOSPC) { 1668 1648 /* Get by with single vector */ 1669 - rc = pci_enable_msix(bp->pdev, &bp->msix_table[0], 1); 1670 - if (rc) { 1649 + rc = pci_enable_msix_range(bp->pdev, &bp->msix_table[0], 1, 1); 1650 + if (rc < 0) { 1671 1651 BNX2X_DEV_INFO("Single MSI-X is not attainable rc %d\n", 1672 1652 rc); 1673 1653 goto no_msix; ··· 1660 1680 bp->num_ethernet_queues = 1; 1661 1681 bp->num_queues = bp->num_ethernet_queues + bp->num_cnic_queues; 1662 1682 } else if (rc < 0) { 1663 - BNX2X_DEV_INFO("MSI-X is not attainable rc %d\n", rc); 1683 + BNX2X_DEV_INFO("MSI-X is not attainable rc %d\n", rc); 1664 1684 goto no_msix; 1685 + } else if (rc < msix_vec) { 1686 + /* how less vectors we will have? */ 1687 + int diff = msix_vec - rc; 1688 + 1689 + BNX2X_DEV_INFO("Trying to use less MSI-X vectors: %d\n", rc); 1690 + 1691 + /* 1692 + * decrease number of queues by number of unallocated entries 1693 + */ 1694 + bp->num_ethernet_queues -= diff; 1695 + bp->num_queues = bp->num_ethernet_queues + bp->num_cnic_queues; 1696 + 1697 + BNX2X_DEV_INFO("New queue configuration set: %d\n", 1698 + bp->num_queues); 1665 1699 } 1666 1700 1667 1701 bp->flags |= USING_MSIX_FLAG;
+2 -4
drivers/net/ethernet/broadcom/tg3.c
··· 11362 11362 msix_ent[i].vector = 0; 11363 11363 } 11364 11364 11365 - rc = pci_enable_msix(tp->pdev, msix_ent, tp->irq_cnt); 11365 + rc = pci_enable_msix_range(tp->pdev, msix_ent, 1, tp->irq_cnt); 11366 11366 if (rc < 0) { 11367 11367 return false; 11368 - } else if (rc != 0) { 11369 - if (pci_enable_msix(tp->pdev, msix_ent, rc)) 11370 - return false; 11368 + } else if (rc < tp->irq_cnt) { 11371 11369 netdev_notice(tp->dev, "Requested %d MSI-X vectors, received %d\n", 11372 11370 tp->irq_cnt, rc); 11373 11371 tp->irq_cnt = rc;
+9 -14
drivers/net/ethernet/brocade/bna/bnad.c
··· 2666 2666 for (i = 0; i < bnad->msix_num; i++) 2667 2667 bnad->msix_table[i].entry = i; 2668 2668 2669 - ret = pci_enable_msix(bnad->pcidev, bnad->msix_table, bnad->msix_num); 2670 - if (ret > 0) { 2671 - /* Not enough MSI-X vectors. */ 2669 + ret = pci_enable_msix_range(bnad->pcidev, bnad->msix_table, 2670 + 1, bnad->msix_num); 2671 + if (ret < 0) { 2672 + goto intx_mode; 2673 + } else if (ret < bnad->msix_num) { 2672 2674 pr_warn("BNA: %d MSI-X vectors allocated < %d requested\n", 2673 2675 ret, bnad->msix_num); 2674 2676 ··· 2683 2681 bnad->msix_num = BNAD_NUM_TXQ + BNAD_NUM_RXP + 2684 2682 BNAD_MAILBOX_MSIX_VECTORS; 2685 2683 2686 - if (bnad->msix_num > ret) 2684 + if (bnad->msix_num > ret) { 2685 + pci_disable_msix(bnad->pcidev); 2687 2686 goto intx_mode; 2688 - 2689 - /* Try once more with adjusted numbers */ 2690 - /* If this fails, fall back to INTx */ 2691 - ret = pci_enable_msix(bnad->pcidev, bnad->msix_table, 2692 - bnad->msix_num); 2693 - if (ret) 2694 - goto intx_mode; 2695 - 2696 - } else if (ret < 0) 2697 - goto intx_mode; 2687 + } 2688 + } 2698 2689 2699 2690 pci_intx(bnad->pcidev, 0); 2700 2691
+9 -17
drivers/net/ethernet/chelsio/cxgb3/cxgb3_main.c
··· 3088 3088 { 3089 3089 struct msix_entry entries[SGE_QSETS + 1]; 3090 3090 int vectors; 3091 - int i, err; 3091 + int i; 3092 3092 3093 3093 vectors = ARRAY_SIZE(entries); 3094 3094 for (i = 0; i < vectors; ++i) 3095 3095 entries[i].entry = i; 3096 3096 3097 - while ((err = pci_enable_msix(adap->pdev, entries, vectors)) > 0) 3098 - vectors = err; 3097 + vectors = pci_enable_msix_range(adap->pdev, entries, 3098 + adap->params.nports + 1, vectors); 3099 + if (vectors < 0) 3100 + return vectors; 3099 3101 3100 - if (err < 0) 3101 - pci_disable_msix(adap->pdev); 3102 + for (i = 0; i < vectors; ++i) 3103 + adap->msix_info[i].vec = entries[i].vector; 3104 + adap->msix_nvectors = vectors; 3102 3105 3103 - if (!err && vectors < (adap->params.nports + 1)) { 3104 - pci_disable_msix(adap->pdev); 3105 - err = -1; 3106 - } 3107 - 3108 - if (!err) { 3109 - for (i = 0; i < vectors; ++i) 3110 - adap->msix_info[i].vec = entries[i].vector; 3111 - adap->msix_nvectors = vectors; 3112 - } 3113 - 3114 - return err; 3106 + return 0; 3115 3107 } 3116 3108 3117 3109 static void print_port_info(struct adapter *adap, const struct adapter_info *ai)
+24 -26
drivers/net/ethernet/chelsio/cxgb4/cxgb4_main.c
··· 5737 5737 static int enable_msix(struct adapter *adap) 5738 5738 { 5739 5739 int ofld_need = 0; 5740 - int i, err, want, need; 5740 + int i, want, need; 5741 5741 struct sge *s = &adap->sge; 5742 5742 unsigned int nchan = adap->params.nports; 5743 5743 struct msix_entry entries[MAX_INGQ + 1]; ··· 5753 5753 } 5754 5754 need = adap->params.nports + EXTRA_VECS + ofld_need; 5755 5755 5756 - while ((err = pci_enable_msix(adap->pdev, entries, want)) >= need) 5757 - want = err; 5756 + want = pci_enable_msix_range(adap->pdev, entries, need, want); 5757 + if (want < 0) 5758 + return want; 5758 5759 5759 - if (!err) { 5760 - /* 5761 - * Distribute available vectors to the various queue groups. 5762 - * Every group gets its minimum requirement and NIC gets top 5763 - * priority for leftovers. 5764 - */ 5765 - i = want - EXTRA_VECS - ofld_need; 5766 - if (i < s->max_ethqsets) { 5767 - s->max_ethqsets = i; 5768 - if (i < s->ethqsets) 5769 - reduce_ethqs(adap, i); 5770 - } 5771 - if (is_offload(adap)) { 5772 - i = want - EXTRA_VECS - s->max_ethqsets; 5773 - i -= ofld_need - nchan; 5774 - s->ofldqsets = (i / nchan) * nchan; /* round down */ 5775 - } 5776 - for (i = 0; i < want; ++i) 5777 - adap->msix_info[i].vec = entries[i].vector; 5778 - } else if (err > 0) 5779 - dev_info(adap->pdev_dev, 5780 - "only %d MSI-X vectors left, not using MSI-X\n", err); 5781 - return err; 5760 + /* 5761 + * Distribute available vectors to the various queue groups. 5762 + * Every group gets its minimum requirement and NIC gets top 5763 + * priority for leftovers. 5764 + */ 5765 + i = want - EXTRA_VECS - ofld_need; 5766 + if (i < s->max_ethqsets) { 5767 + s->max_ethqsets = i; 5768 + if (i < s->ethqsets) 5769 + reduce_ethqs(adap, i); 5770 + } 5771 + if (is_offload(adap)) { 5772 + i = want - EXTRA_VECS - s->max_ethqsets; 5773 + i -= ofld_need - nchan; 5774 + s->ofldqsets = (i / nchan) * nchan; /* round down */ 5775 + } 5776 + for (i = 0; i < want; ++i) 5777 + adap->msix_info[i].vec = entries[i].vector; 5778 + 5779 + return 0; 5782 5780 } 5783 5781 5784 5782 #undef EXTRA_VECS
+16 -19
drivers/net/ethernet/chelsio/cxgb4vf/cxgb4vf_main.c
··· 2444 2444 */ 2445 2445 static int enable_msix(struct adapter *adapter) 2446 2446 { 2447 - int i, err, want, need; 2447 + int i, want, need, nqsets; 2448 2448 struct msix_entry entries[MSIX_ENTRIES]; 2449 2449 struct sge *s = &adapter->sge; 2450 2450 ··· 2460 2460 */ 2461 2461 want = s->max_ethqsets + MSIX_EXTRAS; 2462 2462 need = adapter->params.nports + MSIX_EXTRAS; 2463 - while ((err = pci_enable_msix(adapter->pdev, entries, want)) >= need) 2464 - want = err; 2465 2463 2466 - if (err == 0) { 2467 - int nqsets = want - MSIX_EXTRAS; 2468 - if (nqsets < s->max_ethqsets) { 2469 - dev_warn(adapter->pdev_dev, "only enough MSI-X vectors" 2470 - " for %d Queue Sets\n", nqsets); 2471 - s->max_ethqsets = nqsets; 2472 - if (nqsets < s->ethqsets) 2473 - reduce_ethqs(adapter, nqsets); 2474 - } 2475 - for (i = 0; i < want; ++i) 2476 - adapter->msix_info[i].vec = entries[i].vector; 2477 - } else if (err > 0) { 2478 - pci_disable_msix(adapter->pdev); 2479 - dev_info(adapter->pdev_dev, "only %d MSI-X vectors left," 2480 - " not using MSI-X\n", err); 2464 + want = pci_enable_msix_range(adapter->pdev, entries, need, want); 2465 + if (want < 0) 2466 + return want; 2467 + 2468 + nqsets = want - MSIX_EXTRAS; 2469 + if (nqsets < s->max_ethqsets) { 2470 + dev_warn(adapter->pdev_dev, "only enough MSI-X vectors" 2471 + " for %d Queue Sets\n", nqsets); 2472 + s->max_ethqsets = nqsets; 2473 + if (nqsets < s->ethqsets) 2474 + reduce_ethqs(adapter, nqsets); 2481 2475 } 2482 - return err; 2476 + for (i = 0; i < want; ++i) 2477 + adapter->msix_info[i].vec = entries[i].vector; 2478 + 2479 + return 0; 2483 2480 } 2484 2481 2485 2482 static const struct net_device_ops cxgb4vf_netdev_ops = {
+4 -2
drivers/net/ethernet/cisco/enic/enic_main.c
··· 1796 1796 enic->cq_count >= n + m && 1797 1797 enic->intr_count >= n + m + 2) { 1798 1798 1799 - if (!pci_enable_msix(enic->pdev, enic->msix_entry, n + m + 2)) { 1799 + if (pci_enable_msix_range(enic->pdev, enic->msix_entry, 1800 + n + m + 2, n + m + 2) > 0) { 1800 1801 1801 1802 enic->rq_count = n; 1802 1803 enic->wq_count = m; ··· 1816 1815 enic->wq_count >= m && 1817 1816 enic->cq_count >= 1 + m && 1818 1817 enic->intr_count >= 1 + m + 2) { 1819 - if (!pci_enable_msix(enic->pdev, enic->msix_entry, 1 + m + 2)) { 1818 + if (pci_enable_msix_range(enic->pdev, enic->msix_entry, 1819 + 1 + m + 2, 1 + m + 2) > 0) { 1820 1820 1821 1821 enic->rq_count = 1; 1822 1822 enic->wq_count = m;
+13 -18
drivers/net/ethernet/emulex/benet/be_main.c
··· 2507 2507 2508 2508 static int be_msix_enable(struct be_adapter *adapter) 2509 2509 { 2510 - int i, status, num_vec; 2510 + int i, num_vec; 2511 2511 struct device *dev = &adapter->pdev->dev; 2512 2512 2513 2513 /* If RoCE is supported, program the max number of NIC vectors that ··· 2523 2523 for (i = 0; i < num_vec; i++) 2524 2524 adapter->msix_entries[i].entry = i; 2525 2525 2526 - status = pci_enable_msix(adapter->pdev, adapter->msix_entries, num_vec); 2527 - if (status == 0) { 2528 - goto done; 2529 - } else if (status >= MIN_MSIX_VECTORS) { 2530 - num_vec = status; 2531 - status = pci_enable_msix(adapter->pdev, adapter->msix_entries, 2532 - num_vec); 2533 - if (!status) 2534 - goto done; 2535 - } 2526 + num_vec = pci_enable_msix_range(adapter->pdev, adapter->msix_entries, 2527 + MIN_MSIX_VECTORS, num_vec); 2528 + if (num_vec < 0) 2529 + goto fail; 2536 2530 2537 - dev_warn(dev, "MSIx enable failed\n"); 2538 - 2539 - /* INTx is not supported in VFs, so fail probe if enable_msix fails */ 2540 - if (!be_physfn(adapter)) 2541 - return status; 2542 - return 0; 2543 - done: 2544 2531 if (be_roce_supported(adapter) && num_vec > MIN_MSIX_VECTORS) { 2545 2532 adapter->num_msix_roce_vec = num_vec / 2; 2546 2533 dev_info(dev, "enabled %d MSI-x vector(s) for RoCE\n", ··· 2538 2551 2539 2552 dev_info(dev, "enabled %d MSI-x vector(s) for NIC\n", 2540 2553 adapter->num_msix_vec); 2554 + return 0; 2555 + 2556 + fail: 2557 + dev_warn(dev, "MSIx enable failed\n"); 2558 + 2559 + /* INTx is not supported in VFs, so fail probe if enable_msix fails */ 2560 + if (!be_physfn(adapter)) 2561 + return num_vec; 2541 2562 return 0; 2542 2563 } 2543 2564
+7 -4
drivers/net/ethernet/intel/e1000e/netdev.c
··· 2038 2038 msix_entry), 2039 2039 GFP_KERNEL); 2040 2040 if (adapter->msix_entries) { 2041 + struct e1000_adapter *a = adapter; 2042 + 2041 2043 for (i = 0; i < adapter->num_vectors; i++) 2042 2044 adapter->msix_entries[i].entry = i; 2043 2045 2044 - err = pci_enable_msix(adapter->pdev, 2045 - adapter->msix_entries, 2046 - adapter->num_vectors); 2047 - if (err == 0) 2046 + err = pci_enable_msix_range(a->pdev, 2047 + a->msix_entries, 2048 + a->num_vectors, 2049 + a->num_vectors); 2050 + if (err > 0) 2048 2051 return; 2049 2052 } 2050 2053 /* MSI-X failed, so fall through and try MSI */
+6 -27
drivers/net/ethernet/intel/i40e/i40e_main.c
··· 5856 5856 **/ 5857 5857 static int i40e_reserve_msix_vectors(struct i40e_pf *pf, int vectors) 5858 5858 { 5859 - int err = 0; 5860 - 5861 - pf->num_msix_entries = 0; 5862 - while (vectors >= I40E_MIN_MSIX) { 5863 - err = pci_enable_msix(pf->pdev, pf->msix_entries, vectors); 5864 - if (err == 0) { 5865 - /* good to go */ 5866 - pf->num_msix_entries = vectors; 5867 - break; 5868 - } else if (err < 0) { 5869 - /* total failure */ 5870 - dev_info(&pf->pdev->dev, 5871 - "MSI-X vector reservation failed: %d\n", err); 5872 - vectors = 0; 5873 - break; 5874 - } else { 5875 - /* err > 0 is the hint for retry */ 5876 - dev_info(&pf->pdev->dev, 5877 - "MSI-X vectors wanted %d, retrying with %d\n", 5878 - vectors, err); 5879 - vectors = err; 5880 - } 5881 - } 5882 - 5883 - if (vectors > 0 && vectors < I40E_MIN_MSIX) { 5859 + vectors = pci_enable_msix_range(pf->pdev, pf->msix_entries, 5860 + I40E_MIN_MSIX, vectors); 5861 + if (vectors < 0) { 5884 5862 dev_info(&pf->pdev->dev, 5885 - "Couldn't get enough vectors, only %d available\n", 5886 - vectors); 5863 + "MSI-X vector reservation failed: %d\n", vectors); 5887 5864 vectors = 0; 5888 5865 } 5866 + 5867 + pf->num_msix_entries = vectors; 5889 5868 5890 5869 return vectors; 5891 5870 }
+5 -4
drivers/net/ethernet/intel/igb/igb_main.c
··· 1111 1111 for (i = 0; i < numvecs; i++) 1112 1112 adapter->msix_entries[i].entry = i; 1113 1113 1114 - err = pci_enable_msix(adapter->pdev, 1115 - adapter->msix_entries, 1116 - numvecs); 1117 - if (err == 0) 1114 + err = pci_enable_msix_range(adapter->pdev, 1115 + adapter->msix_entries, 1116 + numvecs, 1117 + numvecs); 1118 + if (err > 0) 1118 1119 return; 1119 1120 1120 1121 igb_reset_interrupt_capability(adapter);
+3 -3
drivers/net/ethernet/intel/igbvf/netdev.c
··· 1043 1043 for (i = 0; i < 3; i++) 1044 1044 adapter->msix_entries[i].entry = i; 1045 1045 1046 - err = pci_enable_msix(adapter->pdev, 1047 - adapter->msix_entries, 3); 1046 + err = pci_enable_msix_range(adapter->pdev, 1047 + adapter->msix_entries, 3, 3); 1048 1048 } 1049 1049 1050 - if (err) { 1050 + if (err < 0) { 1051 1051 /* MSI-X failed */ 1052 1052 dev_err(&adapter->pdev->dev, 1053 1053 "Failed to initialize MSI-X interrupts.\n");
+4 -12
drivers/net/ethernet/intel/ixgbe/ixgbe_lib.c
··· 698 698 static void ixgbe_acquire_msix_vectors(struct ixgbe_adapter *adapter, 699 699 int vectors) 700 700 { 701 - int err, vector_threshold; 701 + int vector_threshold; 702 702 703 703 /* We'll want at least 2 (vector_threshold): 704 704 * 1) TxQ[0] + RxQ[0] handler ··· 712 712 * Right now, we simply care about how many we'll get; we'll 713 713 * set them up later while requesting irq's. 714 714 */ 715 - while (vectors >= vector_threshold) { 716 - err = pci_enable_msix(adapter->pdev, adapter->msix_entries, 717 - vectors); 718 - if (!err) /* Success in acquiring all requested vectors. */ 719 - break; 720 - else if (err < 0) 721 - vectors = 0; /* Nasty failure, quit now */ 722 - else /* err == number of vectors we should try again with */ 723 - vectors = err; 724 - } 715 + vectors = pci_enable_msix_range(adapter->pdev, adapter->msix_entries, 716 + vector_threshold, vectors); 725 717 726 - if (vectors < vector_threshold) { 718 + if (vectors < 0) { 727 719 /* Can't allocate enough MSI-X interrupts? Oh well. 728 720 * This just means we'll go with either a single MSI 729 721 * vector or fall back to legacy interrupts.
+11 -21
drivers/net/ethernet/intel/ixgbevf/ixgbevf_main.c
··· 1817 1817 static int ixgbevf_acquire_msix_vectors(struct ixgbevf_adapter *adapter, 1818 1818 int vectors) 1819 1819 { 1820 - int err = 0; 1821 1820 int vector_threshold; 1822 1821 1823 1822 /* We'll want at least 2 (vector_threshold): ··· 1830 1831 * Right now, we simply care about how many we'll get; we'll 1831 1832 * set them up later while requesting irq's. 1832 1833 */ 1833 - while (vectors >= vector_threshold) { 1834 - err = pci_enable_msix(adapter->pdev, adapter->msix_entries, 1835 - vectors); 1836 - if (!err || err < 0) /* Success or a nasty failure. */ 1837 - break; 1838 - else /* err == number of vectors we should try again with */ 1839 - vectors = err; 1840 - } 1834 + vectors = pci_enable_msix_range(adapter->pdev, adapter->msix_entries, 1835 + vector_threshold, vectors); 1841 1836 1842 - if (vectors < vector_threshold) 1843 - err = -ENOMEM; 1844 - 1845 - if (err) { 1837 + if (vectors < 0) { 1846 1838 dev_err(&adapter->pdev->dev, 1847 1839 "Unable to allocate MSI-X interrupts\n"); 1848 1840 kfree(adapter->msix_entries); 1849 1841 adapter->msix_entries = NULL; 1850 - } else { 1851 - /* 1852 - * Adjust for only the vectors we'll use, which is minimum 1853 - * of max_msix_q_vectors + NON_Q_VECTORS, or the number of 1854 - * vectors we were allocated. 1855 - */ 1856 - adapter->num_msix_vectors = vectors; 1842 + return vectors; 1857 1843 } 1858 1844 1859 - return err; 1845 + /* Adjust for only the vectors we'll use, which is minimum 1846 + * of max_msix_q_vectors + NON_Q_VECTORS, or the number of 1847 + * vectors we were allocated. 1848 + */ 1849 + adapter->num_msix_vectors = vectors; 1850 + 1851 + return 0; 1860 1852 } 1861 1853 1862 1854 /**
+5 -16
drivers/net/ethernet/mellanox/mlx4/main.c
··· 1976 1976 int nreq = min_t(int, dev->caps.num_ports * 1977 1977 min_t(int, netif_get_num_default_rss_queues() + 1, 1978 1978 MAX_MSIX_P_PORT) + MSIX_LEGACY_SZ, MAX_MSIX); 1979 - int err; 1980 1979 int i; 1981 1980 1982 1981 if (msi_x) { ··· 1989 1990 for (i = 0; i < nreq; ++i) 1990 1991 entries[i].entry = i; 1991 1992 1992 - retry: 1993 - err = pci_enable_msix(dev->pdev, entries, nreq); 1994 - if (err) { 1995 - /* Try again if at least 2 vectors are available */ 1996 - if (err > 1) { 1997 - mlx4_info(dev, "Requested %d vectors, " 1998 - "but only %d MSI-X vectors available, " 1999 - "trying again\n", nreq, err); 2000 - nreq = err; 2001 - goto retry; 2002 - } 1993 + nreq = pci_enable_msix_range(dev->pdev, entries, 2, nreq); 1994 + 1995 + if (nreq < 0) { 2003 1996 kfree(entries); 2004 1997 goto no_msi; 2005 - } 2006 - 2007 - if (nreq < 2008 - MSIX_LEGACY_SZ + dev->caps.num_ports * MIN_MSIX_P_PORT) { 1998 + } else if (nreq < MSIX_LEGACY_SZ + 1999 + dev->caps.num_ports * MIN_MSIX_P_PORT) { 2009 2000 /*Working in legacy mode , all EQ's shared*/ 2010 2001 dev->caps.comp_pool = 0; 2011 2002 dev->caps.num_comp_vectors = nreq - 1;
+5 -11
drivers/net/ethernet/mellanox/mlx5/core/main.c
··· 116 116 struct mlx5_eq_table *table = &dev->priv.eq_table; 117 117 int num_eqs = 1 << dev->caps.log_max_eq; 118 118 int nvec; 119 - int err; 120 119 int i; 121 120 122 121 nvec = dev->caps.num_ports * num_online_cpus() + MLX5_EQ_VEC_COMP_BASE; ··· 130 131 for (i = 0; i < nvec; i++) 131 132 table->msix_arr[i].entry = i; 132 133 133 - retry: 134 - table->num_comp_vectors = nvec - MLX5_EQ_VEC_COMP_BASE; 135 - err = pci_enable_msix(dev->pdev, table->msix_arr, nvec); 136 - if (err <= 0) { 137 - return err; 138 - } else if (err > 2) { 139 - nvec = err; 140 - goto retry; 141 - } 134 + nvec = pci_enable_msix_range(dev->pdev, table->msix_arr, 135 + MLX5_EQ_VEC_COMP_BASE, nvec); 136 + if (nvec < 0) 137 + return nvec; 142 138 143 - mlx5_core_dbg(dev, "received %d MSI vectors out of %d requested\n", err, nvec); 139 + table->num_comp_vectors = nvec - MLX5_EQ_VEC_COMP_BASE; 144 140 145 141 return 0; 146 142 }
+20 -20
drivers/net/ethernet/myricom/myri10ge/myri10ge.c
··· 2329 2329 status = 0; 2330 2330 if (myri10ge_msi) { 2331 2331 if (mgp->num_slices > 1) { 2332 - status = 2333 - pci_enable_msix(pdev, mgp->msix_vectors, 2334 - mgp->num_slices); 2335 - if (status == 0) { 2336 - mgp->msix_enabled = 1; 2337 - } else { 2332 + status = pci_enable_msix_range(pdev, mgp->msix_vectors, 2333 + mgp->num_slices, mgp->num_slices); 2334 + if (status < 0) { 2338 2335 dev_err(&pdev->dev, 2339 2336 "Error %d setting up MSI-X\n", status); 2340 2337 return status; 2341 2338 } 2339 + mgp->msix_enabled = 1; 2342 2340 } 2343 2341 if (mgp->msix_enabled == 0) { 2344 2342 status = pci_enable_msi(pdev); ··· 3893 3895 mgp->msix_vectors = kcalloc(mgp->num_slices, sizeof(*mgp->msix_vectors), 3894 3896 GFP_KERNEL); 3895 3897 if (mgp->msix_vectors == NULL) 3896 - goto disable_msix; 3898 + goto no_msix; 3897 3899 for (i = 0; i < mgp->num_slices; i++) { 3898 3900 mgp->msix_vectors[i].entry = i; 3899 3901 } 3900 3902 3901 3903 while (mgp->num_slices > 1) { 3902 - /* make sure it is a power of two */ 3903 - while (!is_power_of_2(mgp->num_slices)) 3904 - mgp->num_slices--; 3904 + mgp->num_slices = rounddown_pow_of_two(mgp->num_slices); 3905 3905 if (mgp->num_slices == 1) 3906 - goto disable_msix; 3907 - status = pci_enable_msix(pdev, mgp->msix_vectors, 3908 - mgp->num_slices); 3909 - if (status == 0) { 3910 - pci_disable_msix(pdev); 3906 + goto no_msix; 3907 + status = pci_enable_msix_range(pdev, 3908 + mgp->msix_vectors, 3909 + mgp->num_slices, 3910 + mgp->num_slices); 3911 + if (status < 0) 3912 + goto no_msix; 3913 + 3914 + pci_disable_msix(pdev); 3915 + 3916 + if (status == mgp->num_slices) { 3911 3917 if (old_allocated) 3912 3918 kfree(old_fw); 3913 3919 return; 3914 - } 3915 - if (status > 0) 3920 + } else { 3916 3921 mgp->num_slices = status; 3917 - else 3918 - goto disable_msix; 3922 + } 3919 3923 } 3920 3924 3921 - disable_msix: 3925 + no_msix: 3922 3926 if (mgp->msix_vectors != NULL) { 3923 3927 kfree(mgp->msix_vectors); 3924 3928 mgp->msix_vectors = NULL;
+3 -2
drivers/net/ethernet/neterion/s2io.c
··· 3792 3792 writeq(rx_mat, &bar0->rx_mat); 3793 3793 readq(&bar0->rx_mat); 3794 3794 3795 - ret = pci_enable_msix(nic->pdev, nic->entries, nic->num_entries); 3795 + ret = pci_enable_msix_range(nic->pdev, nic->entries, 3796 + nic->num_entries, nic->num_entries); 3796 3797 /* We fail init if error or we get less vectors than min required */ 3797 - if (ret) { 3798 + if (ret < 0) { 3798 3799 DBG_PRINT(ERR_DBG, "Enabling MSI-X failed\n"); 3799 3800 kfree(nic->entries); 3800 3801 swstats->mem_freed += nic->num_entries *
+9 -6
drivers/net/ethernet/neterion/vxge/vxge-main.c
··· 2349 2349 vdev->vxge_entries[j].entry = VXGE_ALARM_MSIX_ID; 2350 2350 vdev->vxge_entries[j].in_use = 0; 2351 2351 2352 - ret = pci_enable_msix(vdev->pdev, vdev->entries, vdev->intr_cnt); 2353 - if (ret > 0) { 2352 + ret = pci_enable_msix_range(vdev->pdev, 2353 + vdev->entries, 3, vdev->intr_cnt); 2354 + if (ret < 0) { 2355 + ret = -ENODEV; 2356 + goto enable_msix_failed; 2357 + } else if (ret < vdev->intr_cnt) { 2358 + pci_disable_msix(vdev->pdev); 2359 + 2354 2360 vxge_debug_init(VXGE_ERR, 2355 2361 "%s: MSI-X enable failed for %d vectors, ret: %d", 2356 2362 VXGE_DRIVER_NAME, vdev->intr_cnt, ret); 2357 - if ((max_config_vpath != VXGE_USE_DEFAULT) || (ret < 3)) { 2363 + if (max_config_vpath != VXGE_USE_DEFAULT) { 2358 2364 ret = -ENODEV; 2359 2365 goto enable_msix_failed; 2360 2366 } ··· 2374 2368 vxge_close_vpaths(vdev, temp); 2375 2369 vdev->no_of_vpath = temp; 2376 2370 goto start; 2377 - } else if (ret < 0) { 2378 - ret = -ENODEV; 2379 - goto enable_msix_failed; 2380 2371 } 2381 2372 return 0; 2382 2373
+25 -16
drivers/net/ethernet/nvidia/forcedeth.c
··· 3930 3930 { 3931 3931 struct fe_priv *np = get_nvpriv(dev); 3932 3932 u8 __iomem *base = get_hwbase(dev); 3933 - int ret = 1; 3933 + int ret; 3934 3934 int i; 3935 3935 irqreturn_t (*handler)(int foo, void *data); 3936 3936 ··· 3946 3946 if (np->msi_flags & NV_MSI_X_CAPABLE) { 3947 3947 for (i = 0; i < (np->msi_flags & NV_MSI_X_VECTORS_MASK); i++) 3948 3948 np->msi_x_entry[i].entry = i; 3949 - ret = pci_enable_msix(np->pci_dev, np->msi_x_entry, (np->msi_flags & NV_MSI_X_VECTORS_MASK)); 3950 - if (ret == 0) { 3949 + ret = pci_enable_msix_range(np->pci_dev, 3950 + np->msi_x_entry, 3951 + np->msi_flags & NV_MSI_X_VECTORS_MASK, 3952 + np->msi_flags & NV_MSI_X_VECTORS_MASK); 3953 + if (ret > 0) { 3951 3954 np->msi_flags |= NV_MSI_X_ENABLED; 3952 3955 if (optimization_mode == NV_OPTIMIZATION_MODE_THROUGHPUT && !intr_test) { 3953 3956 /* Request irq for rx handling */ 3954 3957 sprintf(np->name_rx, "%s-rx", dev->name); 3955 - if (request_irq(np->msi_x_entry[NV_MSI_X_VECTOR_RX].vector, 3956 - nv_nic_irq_rx, IRQF_SHARED, np->name_rx, dev) != 0) { 3958 + ret = request_irq(np->msi_x_entry[NV_MSI_X_VECTOR_RX].vector, 3959 + nv_nic_irq_rx, IRQF_SHARED, np->name_rx, dev); 3960 + if (ret) { 3957 3961 netdev_info(dev, 3958 3962 "request_irq failed for rx %d\n", 3959 3963 ret); ··· 3967 3963 } 3968 3964 /* Request irq for tx handling */ 3969 3965 sprintf(np->name_tx, "%s-tx", dev->name); 3970 - if (request_irq(np->msi_x_entry[NV_MSI_X_VECTOR_TX].vector, 3971 - nv_nic_irq_tx, IRQF_SHARED, np->name_tx, dev) != 0) { 3966 + ret = request_irq(np->msi_x_entry[NV_MSI_X_VECTOR_TX].vector, 3967 + nv_nic_irq_tx, IRQF_SHARED, np->name_tx, dev); 3968 + if (ret) { 3972 3969 netdev_info(dev, 3973 3970 "request_irq failed for tx %d\n", 3974 3971 ret); ··· 3979 3974 } 3980 3975 /* Request irq for link and timer handling */ 3981 3976 sprintf(np->name_other, "%s-other", dev->name); 3982 - if (request_irq(np->msi_x_entry[NV_MSI_X_VECTOR_OTHER].vector, 3983 - nv_nic_irq_other, IRQF_SHARED, np->name_other, dev) != 0) { 3977 + ret = request_irq(np->msi_x_entry[NV_MSI_X_VECTOR_OTHER].vector, 3978 + nv_nic_irq_other, IRQF_SHARED, np->name_other, dev); 3979 + if (ret) { 3984 3980 netdev_info(dev, 3985 3981 "request_irq failed for link %d\n", 3986 3982 ret); ··· 3997 3991 set_msix_vector_map(dev, NV_MSI_X_VECTOR_OTHER, NVREG_IRQ_OTHER); 3998 3992 } else { 3999 3993 /* Request irq for all interrupts */ 4000 - if (request_irq(np->msi_x_entry[NV_MSI_X_VECTOR_ALL].vector, handler, IRQF_SHARED, dev->name, dev) != 0) { 3994 + ret = request_irq(np->msi_x_entry[NV_MSI_X_VECTOR_ALL].vector, 3995 + handler, IRQF_SHARED, dev->name, dev); 3996 + if (ret) { 4001 3997 netdev_info(dev, 4002 3998 "request_irq failed %d\n", 4003 3999 ret); ··· 4013 4005 writel(0, base + NvRegMSIXMap1); 4014 4006 } 4015 4007 netdev_info(dev, "MSI-X enabled\n"); 4008 + return 0; 4016 4009 } 4017 4010 } 4018 - if (ret != 0 && np->msi_flags & NV_MSI_CAPABLE) { 4011 + if (np->msi_flags & NV_MSI_CAPABLE) { 4019 4012 ret = pci_enable_msi(np->pci_dev); 4020 4013 if (ret == 0) { 4021 4014 np->msi_flags |= NV_MSI_ENABLED; 4022 - if (request_irq(np->pci_dev->irq, handler, IRQF_SHARED, dev->name, dev) != 0) { 4015 + ret = request_irq(np->pci_dev->irq, handler, IRQF_SHARED, dev->name, dev); 4016 + if (ret) { 4023 4017 netdev_info(dev, "request_irq failed %d\n", 4024 4018 ret); 4025 4019 pci_disable_msi(np->pci_dev); ··· 4035 4025 /* enable msi vector 0 */ 4036 4026 writel(NVREG_MSI_VECTOR_0_ENABLED, base + NvRegMSIIrqMask); 4037 4027 netdev_info(dev, "MSI enabled\n"); 4028 + return 0; 4038 4029 } 4039 4030 } 4040 - if (ret != 0) { 4041 - if (request_irq(np->pci_dev->irq, handler, IRQF_SHARED, dev->name, dev) != 0) 4042 - goto out_err; 4043 4031 4044 - } 4032 + if (request_irq(np->pci_dev->irq, handler, IRQF_SHARED, dev->name, dev) != 0) 4033 + goto out_err; 4045 4034 4046 4035 return 0; 4047 4036 out_free_tx:
+3 -2
drivers/net/ethernet/qlogic/netxen/netxen_nic_main.c
··· 643 643 644 644 if (adapter->msix_supported) { 645 645 netxen_init_msix_entries(adapter, num_msix); 646 - err = pci_enable_msix(pdev, adapter->msix_entries, num_msix); 647 - if (err == 0) { 646 + err = pci_enable_msix_range(pdev, adapter->msix_entries, 647 + num_msix, num_msix); 648 + if (err > 0) { 648 649 adapter->flags |= NETXEN_NIC_MSIX_ENABLED; 649 650 netxen_set_msix_bit(pdev, 1); 650 651
+11 -7
drivers/net/ethernet/qlogic/qlcnic/qlcnic_main.c
··· 684 684 int qlcnic_enable_msix(struct qlcnic_adapter *adapter, u32 num_msix) 685 685 { 686 686 struct pci_dev *pdev = adapter->pdev; 687 - int err = -1, vector; 687 + int err, vector; 688 688 689 689 if (!adapter->msix_entries) { 690 690 adapter->msix_entries = kcalloc(num_msix, ··· 701 701 for (vector = 0; vector < num_msix; vector++) 702 702 adapter->msix_entries[vector].entry = vector; 703 703 704 - err = pci_enable_msix(pdev, adapter->msix_entries, num_msix); 705 - if (err == 0) { 704 + err = pci_enable_msix_range(pdev, 705 + adapter->msix_entries, 1, num_msix); 706 + 707 + if (err == num_msix) { 706 708 adapter->flags |= QLCNIC_MSIX_ENABLED; 707 709 adapter->ahw->num_msix = num_msix; 708 710 dev_info(&pdev->dev, "using msi-x interrupts\n"); 709 - return err; 711 + return 0; 710 712 } else if (err > 0) { 713 + pci_disable_msix(pdev); 714 + 711 715 dev_info(&pdev->dev, 712 716 "Unable to allocate %d MSI-X vectors, Available vectors %d\n", 713 717 num_msix, err); ··· 719 715 if (qlcnic_82xx_check(adapter)) { 720 716 num_msix = rounddown_pow_of_two(err); 721 717 if (err < QLCNIC_82XX_MINIMUM_VECTOR) 722 - return -EIO; 718 + return -ENOSPC; 723 719 } else { 724 720 num_msix = rounddown_pow_of_two(err - 1); 725 721 num_msix += 1; 726 722 if (err < QLCNIC_83XX_MINIMUM_VECTOR) 727 - return -EIO; 723 + return -ENOSPC; 728 724 } 729 725 730 726 if (qlcnic_82xx_check(adapter) && ··· 751 747 } 752 748 } 753 749 754 - return err; 750 + return -EIO; 755 751 } 756 752 757 753 static int qlcnic_82xx_calculate_msix_vector(struct qlcnic_adapter *adapter)
+4 -12
drivers/net/ethernet/qlogic/qlge/qlge_main.c
··· 3331 3331 for (i = 0; i < qdev->intr_count; i++) 3332 3332 qdev->msi_x_entry[i].entry = i; 3333 3333 3334 - /* Loop to get our vectors. We start with 3335 - * what we want and settle for what we get. 3336 - */ 3337 - do { 3338 - err = pci_enable_msix(qdev->pdev, 3339 - qdev->msi_x_entry, qdev->intr_count); 3340 - if (err > 0) 3341 - qdev->intr_count = err; 3342 - } while (err > 0); 3343 - 3334 + err = pci_enable_msix_range(qdev->pdev, qdev->msi_x_entry, 3335 + 1, qdev->intr_count); 3344 3336 if (err < 0) { 3345 3337 kfree(qdev->msi_x_entry); 3346 3338 qdev->msi_x_entry = NULL; 3347 3339 netif_warn(qdev, ifup, qdev->ndev, 3348 3340 "MSI-X Enable failed, trying MSI.\n"); 3349 - qdev->intr_count = 1; 3350 3341 qlge_irq_type = MSI_IRQ; 3351 - } else if (err == 0) { 3342 + } else { 3343 + qdev->intr_count = err; 3352 3344 set_bit(QL_MSIX_ENABLED, &qdev->flags); 3353 3345 netif_info(qdev, ifup, qdev->ndev, 3354 3346 "MSI-X Enabled, got %d vectors.\n",
+9 -11
drivers/net/ethernet/sfc/efx.c
··· 1344 1344 1345 1345 for (i = 0; i < n_channels; i++) 1346 1346 xentries[i].entry = i; 1347 - rc = pci_enable_msix(efx->pci_dev, xentries, n_channels); 1348 - if (rc > 0) { 1347 + rc = pci_enable_msix_range(efx->pci_dev, 1348 + xentries, 1, n_channels); 1349 + if (rc < 0) { 1350 + /* Fall back to single channel MSI */ 1351 + efx->interrupt_mode = EFX_INT_MODE_MSI; 1352 + netif_err(efx, drv, efx->net_dev, 1353 + "could not enable MSI-X\n"); 1354 + } else if (rc < n_channels) { 1349 1355 netif_err(efx, drv, efx->net_dev, 1350 1356 "WARNING: Insufficient MSI-X vectors" 1351 1357 " available (%d < %u).\n", rc, n_channels); 1352 1358 netif_err(efx, drv, efx->net_dev, 1353 1359 "WARNING: Performance may be reduced.\n"); 1354 - EFX_BUG_ON_PARANOID(rc >= n_channels); 1355 1360 n_channels = rc; 1356 - rc = pci_enable_msix(efx->pci_dev, xentries, 1357 - n_channels); 1358 1361 } 1359 1362 1360 - if (rc == 0) { 1363 + if (rc > 0) { 1361 1364 efx->n_channels = n_channels; 1362 1365 if (n_channels > extra_channels) 1363 1366 n_channels -= extra_channels; ··· 1376 1373 for (i = 0; i < efx->n_channels; i++) 1377 1374 efx_get_channel(efx, i)->irq = 1378 1375 xentries[i].vector; 1379 - } else { 1380 - /* Fall back to single channel MSI */ 1381 - efx->interrupt_mode = EFX_INT_MODE_MSI; 1382 - netif_err(efx, drv, efx->net_dev, 1383 - "could not enable MSI-X\n"); 1384 1376 } 1385 1377 } 1386 1378
+3 -8
drivers/net/ethernet/sun/niu.c
··· 9041 9041 struct msix_entry msi_vec[NIU_NUM_LDG]; 9042 9042 struct niu_parent *parent = np->parent; 9043 9043 struct pci_dev *pdev = np->pdev; 9044 - int i, num_irqs, err; 9044 + int i, num_irqs; 9045 9045 u8 first_ldg; 9046 9046 9047 9047 first_ldg = (NIU_NUM_LDG / parent->num_ports) * np->port; ··· 9053 9053 (np->port == 0 ? 3 : 1)); 9054 9054 BUG_ON(num_irqs > (NIU_NUM_LDG / parent->num_ports)); 9055 9055 9056 - retry: 9057 9056 for (i = 0; i < num_irqs; i++) { 9058 9057 msi_vec[i].vector = 0; 9059 9058 msi_vec[i].entry = i; 9060 9059 } 9061 9060 9062 - err = pci_enable_msix(pdev, msi_vec, num_irqs); 9063 - if (err < 0) { 9061 + num_irqs = pci_enable_msix_range(pdev, msi_vec, 1, num_irqs); 9062 + if (num_irqs < 0) { 9064 9063 np->flags &= ~NIU_FLAGS_MSIX; 9065 9064 return; 9066 - } 9067 - if (err > 0) { 9068 - num_irqs = err; 9069 - goto retry; 9070 9065 } 9071 9066 9072 9067 np->flags |= NIU_FLAGS_MSIX;
+40 -58
drivers/net/vmxnet3/vmxnet3_drv.c
··· 2729 2729 /* 2730 2730 * Enable MSIx vectors. 2731 2731 * Returns : 2732 - * 0 on successful enabling of required vectors, 2733 2732 * VMXNET3_LINUX_MIN_MSIX_VECT when only minimum number of vectors required 2734 - * could be enabled. 2735 - * number of vectors which can be enabled otherwise (this number is smaller 2733 + * were enabled. 2734 + * number of vectors which were enabled otherwise (this number is greater 2736 2735 * than VMXNET3_LINUX_MIN_MSIX_VECT) 2737 2736 */ 2738 2737 2739 2738 static int 2740 - vmxnet3_acquire_msix_vectors(struct vmxnet3_adapter *adapter, 2741 - int vectors) 2739 + vmxnet3_acquire_msix_vectors(struct vmxnet3_adapter *adapter, int nvec) 2742 2740 { 2743 - int err = 0, vector_threshold; 2744 - vector_threshold = VMXNET3_LINUX_MIN_MSIX_VECT; 2741 + int ret = pci_enable_msix_range(adapter->pdev, 2742 + adapter->intr.msix_entries, nvec, nvec); 2745 2743 2746 - while (vectors >= vector_threshold) { 2747 - err = pci_enable_msix(adapter->pdev, adapter->intr.msix_entries, 2748 - vectors); 2749 - if (!err) { 2750 - adapter->intr.num_intrs = vectors; 2751 - return 0; 2752 - } else if (err < 0) { 2753 - dev_err(&adapter->netdev->dev, 2754 - "Failed to enable MSI-X, error: %d\n", err); 2755 - vectors = 0; 2756 - } else if (err < vector_threshold) { 2757 - break; 2758 - } else { 2759 - /* If fails to enable required number of MSI-x vectors 2760 - * try enabling minimum number of vectors required. 2761 - */ 2762 - dev_err(&adapter->netdev->dev, 2763 - "Failed to enable %d MSI-X, trying %d instead\n", 2764 - vectors, vector_threshold); 2765 - vectors = vector_threshold; 2766 - } 2744 + if (ret == -ENOSPC && nvec > VMXNET3_LINUX_MIN_MSIX_VECT) { 2745 + dev_err(&adapter->netdev->dev, 2746 + "Failed to enable %d MSI-X, trying %d\n", 2747 + nvec, VMXNET3_LINUX_MIN_MSIX_VECT); 2748 + 2749 + ret = pci_enable_msix_range(adapter->pdev, 2750 + adapter->intr.msix_entries, 2751 + VMXNET3_LINUX_MIN_MSIX_VECT, 2752 + VMXNET3_LINUX_MIN_MSIX_VECT); 2767 2753 } 2768 2754 2769 - dev_info(&adapter->pdev->dev, 2770 - "Number of MSI-X interrupts which can be allocated " 2771 - "is lower than min threshold required.\n"); 2772 - return err; 2755 + if (ret < 0) { 2756 + dev_err(&adapter->netdev->dev, 2757 + "Failed to enable MSI-X, error: %d\n", ret); 2758 + } 2759 + 2760 + return ret; 2773 2761 } 2774 2762 2775 2763 ··· 2784 2796 2785 2797 #ifdef CONFIG_PCI_MSI 2786 2798 if (adapter->intr.type == VMXNET3_IT_MSIX) { 2787 - int vector, err = 0; 2799 + int i, nvec; 2788 2800 2789 - adapter->intr.num_intrs = (adapter->share_intr == 2790 - VMXNET3_INTR_TXSHARE) ? 1 : 2791 - adapter->num_tx_queues; 2792 - adapter->intr.num_intrs += (adapter->share_intr == 2793 - VMXNET3_INTR_BUDDYSHARE) ? 0 : 2794 - adapter->num_rx_queues; 2795 - adapter->intr.num_intrs += 1; /* for link event */ 2801 + nvec = adapter->share_intr == VMXNET3_INTR_TXSHARE ? 2802 + 1 : adapter->num_tx_queues; 2803 + nvec += adapter->share_intr == VMXNET3_INTR_BUDDYSHARE ? 2804 + 0 : adapter->num_rx_queues; 2805 + nvec += 1; /* for link event */ 2806 + nvec = nvec > VMXNET3_LINUX_MIN_MSIX_VECT ? 2807 + nvec : VMXNET3_LINUX_MIN_MSIX_VECT; 2796 2808 2797 - adapter->intr.num_intrs = (adapter->intr.num_intrs > 2798 - VMXNET3_LINUX_MIN_MSIX_VECT 2799 - ? adapter->intr.num_intrs : 2800 - VMXNET3_LINUX_MIN_MSIX_VECT); 2809 + for (i = 0; i < nvec; i++) 2810 + adapter->intr.msix_entries[i].entry = i; 2801 2811 2802 - for (vector = 0; vector < adapter->intr.num_intrs; vector++) 2803 - adapter->intr.msix_entries[vector].entry = vector; 2812 + nvec = vmxnet3_acquire_msix_vectors(adapter, nvec); 2813 + if (nvec < 0) 2814 + goto msix_err; 2804 2815 2805 - err = vmxnet3_acquire_msix_vectors(adapter, 2806 - adapter->intr.num_intrs); 2807 2816 /* If we cannot allocate one MSIx vector per queue 2808 2817 * then limit the number of rx queues to 1 2809 2818 */ 2810 - if (err == VMXNET3_LINUX_MIN_MSIX_VECT) { 2819 + if (nvec == VMXNET3_LINUX_MIN_MSIX_VECT) { 2811 2820 if (adapter->share_intr != VMXNET3_INTR_BUDDYSHARE 2812 2821 || adapter->num_rx_queues != 1) { 2813 2822 adapter->share_intr = VMXNET3_INTR_TXSHARE; 2814 2823 netdev_err(adapter->netdev, 2815 2824 "Number of rx queues : 1\n"); 2816 2825 adapter->num_rx_queues = 1; 2817 - adapter->intr.num_intrs = 2818 - VMXNET3_LINUX_MIN_MSIX_VECT; 2819 2826 } 2820 - return; 2821 2827 } 2822 - if (!err) 2823 - return; 2824 2828 2829 + adapter->intr.num_intrs = nvec; 2830 + return; 2831 + 2832 + msix_err: 2825 2833 /* If we cannot allocate MSIx vectors use only one rx queue */ 2826 2834 dev_info(&adapter->pdev->dev, 2827 2835 "Failed to enable MSI-X, error %d. " 2828 - "Limiting #rx queues to 1, try MSI.\n", err); 2836 + "Limiting #rx queues to 1, try MSI.\n", nvec); 2829 2837 2830 2838 adapter->intr.type = VMXNET3_IT_MSI; 2831 2839 } 2832 2840 2833 2841 if (adapter->intr.type == VMXNET3_IT_MSI) { 2834 - int err; 2835 - err = pci_enable_msi(adapter->pdev); 2836 - if (!err) { 2842 + if (!pci_enable_msi(adapter->pdev)) { 2837 2843 adapter->num_rx_queues = 1; 2838 2844 adapter->intr.num_intrs = 1; 2839 2845 return;
+15 -17
drivers/net/wireless/ath/wil6210/pcie_bus.c
··· 41 41 switch (use_msi) { 42 42 case 3: 43 43 case 1: 44 + wil_dbg_misc(wil, "Setup %d MSI interrupts\n", use_msi); 45 + break; 44 46 case 0: 47 + wil_dbg_misc(wil, "MSI interrupts disabled, use INTx\n"); 45 48 break; 46 49 default: 47 - wil_err(wil, "Invalid use_msi=%d, default to 1\n", 48 - use_msi); 50 + wil_err(wil, "Invalid use_msi=%d, default to 1\n", use_msi); 49 51 use_msi = 1; 50 52 } 51 - wil->n_msi = use_msi; 52 - if (wil->n_msi) { 53 - wil_dbg_misc(wil, "Setup %d MSI interrupts\n", use_msi); 54 - rc = pci_enable_msi_block(pdev, wil->n_msi); 55 - if (rc && (wil->n_msi == 3)) { 56 - wil_err(wil, "3 MSI mode failed, try 1 MSI\n"); 57 - wil->n_msi = 1; 58 - rc = pci_enable_msi_block(pdev, wil->n_msi); 59 - } 60 - if (rc) { 61 - wil_err(wil, "pci_enable_msi failed, use INTx\n"); 62 - wil->n_msi = 0; 63 - } 64 - } else { 65 - wil_dbg_misc(wil, "MSI interrupts disabled, use INTx\n"); 53 + 54 + if (use_msi == 3 && pci_enable_msi_range(pdev, 3, 3) < 0) { 55 + wil_err(wil, "3 MSI mode failed, try 1 MSI\n"); 56 + use_msi = 1; 66 57 } 58 + 59 + if (use_msi == 1 && pci_enable_msi(pdev)) { 60 + wil_err(wil, "pci_enable_msi failed, use INTx\n"); 61 + use_msi = 0; 62 + } 63 + 64 + wil->n_msi = use_msi; 67 65 68 66 rc = wil6210_init_irq(wil, pdev->irq); 69 67 if (rc)