As result of recent re-design of the MSI/MSI-X interrupts enabling
pattern this driver has to be updated to use the new technique to
obtain a optimal number of MSI/MSI-X interrupts required.

Signed-off-by: Alexander Gordeev <agord...@redhat.com>
---
 drivers/net/ethernet/broadcom/tg3.c |   24 +++++++++++++-----------
 1 files changed, 13 insertions(+), 11 deletions(-)

diff --git a/drivers/net/ethernet/broadcom/tg3.c 
b/drivers/net/ethernet/broadcom/tg3.c
index 12d961c..2e842ef3 100644
--- a/drivers/net/ethernet/broadcom/tg3.c
+++ b/drivers/net/ethernet/broadcom/tg3.c
@@ -11241,6 +11241,10 @@ static bool tg3_enable_msix(struct tg3 *tp)
        int i, rc;
        struct msix_entry msix_ent[TG3_IRQ_MAX_VECS];
 
+       rc = pci_msix_table_size(tp->pdev);
+       if (rc < 0)
+               return false;
+
        tp->txq_cnt = tp->txq_req;
        tp->rxq_cnt = tp->rxq_req;
        if (!tp->rxq_cnt)
@@ -11256,6 +11260,14 @@ static bool tg3_enable_msix(struct tg3 *tp)
                tp->txq_cnt = 1;
 
        tp->irq_cnt = tg3_irq_count(tp);
+       if (tp->irq_cnt > rc) {
+               netdev_notice(tp->dev, "Requested %d MSI-Xs, available %d\n",
+                             tp->irq_cnt, rc);
+               tp->irq_cnt = rc;
+               tp->rxq_cnt = max(rc - 1, 1);
+               if (tp->txq_cnt)
+                       tp->txq_cnt = min(tp->rxq_cnt, tp->txq_max);
+       }
 
        for (i = 0; i < tp->irq_max; i++) {
                msix_ent[i].entry  = i;
@@ -11263,18 +11275,8 @@ static bool tg3_enable_msix(struct tg3 *tp)
        }
 
        rc = pci_enable_msix(tp->pdev, msix_ent, tp->irq_cnt);
-       if (rc < 0) {
+       if (rc)
                return false;
-       } else if (rc != 0) {
-               if (pci_enable_msix(tp->pdev, msix_ent, rc))
-                       return false;
-               netdev_notice(tp->dev, "Requested %d MSI-X vectors, received 
%d\n",
-                             tp->irq_cnt, rc);
-               tp->irq_cnt = rc;
-               tp->rxq_cnt = max(rc - 1, 1);
-               if (tp->txq_cnt)
-                       tp->txq_cnt = min(tp->rxq_cnt, tp->txq_max);
-       }
 
        for (i = 0; i < tp->irq_max; i++)
                tp->napi[i].irq_vec = msix_ent[i].vector;
-- 
1.7.7.6

_______________________________________________
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev

Reply via email to