diff options
28 files changed, 295 insertions, 400 deletions
diff --git a/drivers/net/ethernet/broadcom/bnx2.c b/drivers/net/ethernet/broadcom/bnx2.c index cda25ac45b47..ca6b36220d94 100644 --- a/drivers/net/ethernet/broadcom/bnx2.c +++ b/drivers/net/ethernet/broadcom/bnx2.c | |||
| @@ -6206,7 +6206,7 @@ bnx2_free_irq(struct bnx2 *bp) | |||
| 6206 | static void | 6206 | static void |
| 6207 | bnx2_enable_msix(struct bnx2 *bp, int msix_vecs) | 6207 | bnx2_enable_msix(struct bnx2 *bp, int msix_vecs) |
| 6208 | { | 6208 | { |
| 6209 | int i, total_vecs, rc; | 6209 | int i, total_vecs; |
| 6210 | struct msix_entry msix_ent[BNX2_MAX_MSIX_VEC]; | 6210 | struct msix_entry msix_ent[BNX2_MAX_MSIX_VEC]; |
| 6211 | struct net_device *dev = bp->dev; | 6211 | struct net_device *dev = bp->dev; |
| 6212 | const int len = sizeof(bp->irq_tbl[0].name); | 6212 | const int len = sizeof(bp->irq_tbl[0].name); |
| @@ -6229,16 +6229,9 @@ bnx2_enable_msix(struct bnx2 *bp, int msix_vecs) | |||
| 6229 | #ifdef BCM_CNIC | 6229 | #ifdef BCM_CNIC |
| 6230 | total_vecs++; | 6230 | total_vecs++; |
| 6231 | #endif | 6231 | #endif |
| 6232 | rc = -ENOSPC; | 6232 | total_vecs = pci_enable_msix_range(bp->pdev, msix_ent, |
| 6233 | while (total_vecs >= BNX2_MIN_MSIX_VEC) { | 6233 | BNX2_MIN_MSIX_VEC, total_vecs); |
| 6234 | rc = pci_enable_msix(bp->pdev, msix_ent, total_vecs); | 6234 | if (total_vecs < 0) |
| 6235 | if (rc <= 0) | ||
| 6236 | break; | ||
| 6237 | if (rc > 0) | ||
| 6238 | total_vecs = rc; | ||
| 6239 | } | ||
| 6240 | |||
| 6241 | if (rc != 0) | ||
| 6242 | return; | 6235 | return; |
| 6243 | 6236 | ||
| 6244 | msix_vecs = total_vecs; | 6237 | msix_vecs = total_vecs; |
diff --git a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c index 9ded3dbb7678..8363b9de5004 100644 --- a/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c +++ b/drivers/net/ethernet/broadcom/bnx2x/bnx2x_cmn.c | |||
| @@ -1638,36 +1638,16 @@ int bnx2x_enable_msix(struct bnx2x *bp) | |||
| 1638 | DP(BNX2X_MSG_SP, "about to request enable msix with %d vectors\n", | 1638 | DP(BNX2X_MSG_SP, "about to request enable msix with %d vectors\n", |
| 1639 | msix_vec); | 1639 | msix_vec); |
| 1640 | 1640 | ||
| 1641 | rc = pci_enable_msix(bp->pdev, &bp->msix_table[0], msix_vec); | 1641 | rc = pci_enable_msix_range(bp->pdev, &bp->msix_table[0], |
| 1642 | 1642 | BNX2X_MIN_MSIX_VEC_CNT(bp), msix_vec); | |
| 1643 | /* | 1643 | /* |
| 1644 | * reconfigure number of tx/rx queues according to available | 1644 | * reconfigure number of tx/rx queues according to available |
| 1645 | * MSI-X vectors | 1645 | * MSI-X vectors |
| 1646 | */ | 1646 | */ |
| 1647 | if (rc >= BNX2X_MIN_MSIX_VEC_CNT(bp)) { | 1647 | if (rc == -ENOSPC) { |
| 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) { | ||
| 1668 | /* Get by with single vector */ | 1648 | /* Get by with single vector */ |
| 1669 | rc = pci_enable_msix(bp->pdev, &bp->msix_table[0], 1); | 1649 | rc = pci_enable_msix_range(bp->pdev, &bp->msix_table[0], 1, 1); |
| 1670 | if (rc) { | 1650 | if (rc < 0) { |
| 1671 | BNX2X_DEV_INFO("Single MSI-X is not attainable rc %d\n", | 1651 | BNX2X_DEV_INFO("Single MSI-X is not attainable rc %d\n", |
| 1672 | rc); | 1652 | rc); |
| 1673 | goto no_msix; | 1653 | goto no_msix; |
| @@ -1680,8 +1660,22 @@ int bnx2x_enable_msix(struct bnx2x *bp) | |||
| 1680 | bp->num_ethernet_queues = 1; | 1660 | bp->num_ethernet_queues = 1; |
| 1681 | bp->num_queues = bp->num_ethernet_queues + bp->num_cnic_queues; | 1661 | bp->num_queues = bp->num_ethernet_queues + bp->num_cnic_queues; |
| 1682 | } else if (rc < 0) { | 1662 | } else if (rc < 0) { |
| 1683 | BNX2X_DEV_INFO("MSI-X is not attainable rc %d\n", rc); | 1663 | BNX2X_DEV_INFO("MSI-X is not attainable rc %d\n", rc); |
| 1684 | goto no_msix; | 1664 | goto no_msix; |
| 1665 | } else if (rc < msix_vec) { | ||
| 1666 | /* how less vectors we will have? */ | ||
| 1667 | int diff = msix_vec - rc; | ||
| 1668 | |||
| 1669 | BNX2X_DEV_INFO("Trying to use less MSI-X vectors: %d\n", rc); | ||
| 1670 | |||
| 1671 | /* | ||
| 1672 | * decrease number of queues by number of unallocated entries | ||
| 1673 | */ | ||
| 1674 | bp->num_ethernet_queues -= diff; | ||
| 1675 | bp->num_queues = bp->num_ethernet_queues + bp->num_cnic_queues; | ||
| 1676 | |||
| 1677 | BNX2X_DEV_INFO("New queue configuration set: %d\n", | ||
| 1678 | bp->num_queues); | ||
| 1685 | } | 1679 | } |
| 1686 | 1680 | ||
| 1687 | bp->flags |= USING_MSIX_FLAG; | 1681 | bp->flags |= USING_MSIX_FLAG; |
diff --git a/drivers/net/ethernet/broadcom/tg3.c b/drivers/net/ethernet/broadcom/tg3.c index 3167ed6593b0..6e5e7c0ffbd7 100644 --- a/drivers/net/ethernet/broadcom/tg3.c +++ b/drivers/net/ethernet/broadcom/tg3.c | |||
| @@ -11362,12 +11362,10 @@ static bool tg3_enable_msix(struct tg3 *tp) | |||
| 11362 | msix_ent[i].vector = 0; | 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 | if (rc < 0) { | 11366 | if (rc < 0) { |
| 11367 | return false; | 11367 | return false; |
| 11368 | } else if (rc != 0) { | 11368 | } else if (rc < tp->irq_cnt) { |
| 11369 | if (pci_enable_msix(tp->pdev, msix_ent, rc)) | ||
| 11370 | return false; | ||
| 11371 | netdev_notice(tp->dev, "Requested %d MSI-X vectors, received %d\n", | 11369 | netdev_notice(tp->dev, "Requested %d MSI-X vectors, received %d\n", |
| 11372 | tp->irq_cnt, rc); | 11370 | tp->irq_cnt, rc); |
| 11373 | tp->irq_cnt = rc; | 11371 | tp->irq_cnt = rc; |
diff --git a/drivers/net/ethernet/brocade/bna/bnad.c b/drivers/net/ethernet/brocade/bna/bnad.c index cf64f3d0b60d..bf436d0a1094 100644 --- a/drivers/net/ethernet/brocade/bna/bnad.c +++ b/drivers/net/ethernet/brocade/bna/bnad.c | |||
| @@ -2666,9 +2666,11 @@ bnad_enable_msix(struct bnad *bnad) | |||
| 2666 | for (i = 0; i < bnad->msix_num; i++) | 2666 | for (i = 0; i < bnad->msix_num; i++) |
| 2667 | bnad->msix_table[i].entry = i; | 2667 | bnad->msix_table[i].entry = i; |
| 2668 | 2668 | ||
| 2669 | ret = pci_enable_msix(bnad->pcidev, bnad->msix_table, bnad->msix_num); | 2669 | ret = pci_enable_msix_range(bnad->pcidev, bnad->msix_table, |
| 2670 | if (ret > 0) { | 2670 | |
