lkml.org 
[lkml]   [2013]   [Oct]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
From
Subject[PATCH RFC v2 20/29] qib: Make use of pcim_enable_msix() and pci_msix_table_size() interfaces
Date
Signed-off-by: Alexander Gordeev <agordeev@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


\
 
 \ /
  Last update: 2013-10-19 09:21    [W:0.483 / U:0.036 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site