Signed-off-by: Alexander Gordeev <agord...@redhat.com>
---
 drivers/infiniband/hw/qib/qib_pcie.c |   48 +++++++++++++++++-----------------
 1 files changed, 24 insertions(+), 24 deletions(-)

diff --git a/drivers/infiniband/hw/qib/qib_pcie.c 
b/drivers/infiniband/hw/qib/qib_pcie.c
index 3f14009..bad0ca3 100644
--- a/drivers/infiniband/hw/qib/qib_pcie.c
+++ b/drivers/infiniband/hw/qib/qib_pcie.c
@@ -197,46 +197,46 @@ static void qib_msix_setup(struct qib_devdata *dd, int 
pos, u32 *msixcnt,
                           struct qib_msix_entry *qib_msix_entry)
 {
        int ret;
-       u32 tabsize = 0;
-       u16 msix_flags;
+       int tabsize = *msixcnt;
        struct msix_entry *msix_entry;
        int i;
 
+       ret = pci_msix_table_size(dd->pcidev);
+       if (ret < 0)
+               goto err;
+
+       tabsize = min(tabsize, ret);
+
        /* We can't pass qib_msix_entry array to qib_msix_setup
         * so use a dummy msix_entry array and copy the allocated
         * irq back to the qib_msix_entry array. */
-       msix_entry = kmalloc(*msixcnt * sizeof(*msix_entry), GFP_KERNEL);
+       msix_entry = kmalloc(tabsize * sizeof(*msix_entry), GFP_KERNEL);
        if (!msix_entry) {
                ret = -ENOMEM;
-               goto do_intx;
+               goto err;
        }
-       for (i = 0; i < *msixcnt; i++)
+       for (i = 0; i < tabsize; i++)
                msix_entry[i] = qib_msix_entry[i].msix;
 
-       pci_read_config_word(dd->pcidev, pos + PCI_MSIX_FLAGS, &msix_flags);
-       tabsize = 1 + (msix_flags & PCI_MSIX_FLAGS_QSIZE);
-       if (tabsize > *msixcnt)
-               tabsize = *msixcnt;
-       ret = pci_enable_msix(dd->pcidev, msix_entry, tabsize);
-       if (ret > 0) {
+       ret = pcim_enable_msix(dd->pcidev, msix_entry, tabsize);
+       if (ret < 0)
+               goto err;
+       else
                tabsize = ret;
-               ret = pci_enable_msix(dd->pcidev, msix_entry, tabsize);
-       }
-do_intx:
-       if (ret) {
-               qib_dev_err(dd,
-                       "pci_enable_msix %d vectors failed: %d, falling back to 
INTx\n",
-                       tabsize, ret);
-               tabsize = 0;
-       }
+
        for (i = 0; i < tabsize; i++)
                qib_msix_entry[i].msix = msix_entry[i];
+
        kfree(msix_entry);
        *msixcnt = tabsize;
-
-       if (ret)
-               qib_enable_intx(dd->pcidev);
-
+       return;
+
+err:
+       qib_dev_err(dd,
+               "pci_enable_msix %d vectors failed: %d, falling back to INTx\n",
+               tabsize, ret);
+       *msixcnt = 0;
+       qib_enable_intx(dd->pcidev);
 }
 
 /**
-- 
1.7.7.6

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to