Signed-off-by: Christoph Hellwig <[email protected]>
---
 drivers/scsi/pm8001/pm8001_init.c | 35 ++++++++++++++---------------------
 drivers/scsi/pm8001/pm8001_sas.h  |  2 --
 2 files changed, 14 insertions(+), 23 deletions(-)

diff --git a/drivers/scsi/pm8001/pm8001_init.c 
b/drivers/scsi/pm8001/pm8001_init.c
index 9fc675f..417368c 100644
--- a/drivers/scsi/pm8001/pm8001_init.c
+++ b/drivers/scsi/pm8001/pm8001_init.c
@@ -888,7 +888,6 @@ static u32 pm8001_setup_msix(struct pm8001_hba_info 
*pm8001_ha)
        u32 i = 0, j = 0;
        u32 number_of_intr;
        int flag = 0;
-       u32 max_entry;
        int rc;
        static char intr_drvname[PM8001_MAX_MSIX_VEC][sizeof(DRV_NAME)+3];
 
@@ -900,18 +899,14 @@ static u32 pm8001_setup_msix(struct pm8001_hba_info 
*pm8001_ha)
                flag &= ~IRQF_SHARED;
        }
 
-       max_entry = sizeof(pm8001_ha->msix_entries) /
-               sizeof(pm8001_ha->msix_entries[0]);
-       for (i = 0; i < max_entry ; i++)
-               pm8001_ha->msix_entries[i].entry = i;
-       rc = pci_enable_msix_exact(pm8001_ha->pdev, pm8001_ha->msix_entries,
-               number_of_intr);
-       pm8001_ha->number_of_intr = number_of_intr;
-       if (rc)
+       rc = pci_alloc_irq_vectors(pm8001_ha->pdev, number_of_intr,
+                       number_of_intr, PCI_IRQ_MSIX);
+       if (rc < 0)
                return rc;
+       pm8001_ha->number_of_intr = number_of_intr;
 
        PM8001_INIT_DBG(pm8001_ha, pm8001_printk(
-               "pci_enable_msix_exact request ret:%d no of intr %d\n",
+               "pci_alloc_irq_vectors request ret:%d no of intr %d\n",
                                rc, pm8001_ha->number_of_intr));
 
        for (i = 0; i < number_of_intr; i++) {
@@ -920,15 +915,15 @@ static u32 pm8001_setup_msix(struct pm8001_hba_info 
*pm8001_ha)
                pm8001_ha->irq_vector[i].irq_id = i;
                pm8001_ha->irq_vector[i].drv_inst = pm8001_ha;
 
-               rc = request_irq(pm8001_ha->msix_entries[i].vector,
+               rc = request_irq(pci_irq_vector(pm8001_ha->pdev, i),
                        pm8001_interrupt_handler_msix, flag,
                        intr_drvname[i], &(pm8001_ha->irq_vector[i]));
                if (rc) {
                        for (j = 0; j < i; j++) {
-                               free_irq(pm8001_ha->msix_entries[j].vector,
+                               free_irq(pci_irq_vector(pm8001_ha->pdev, i),
                                        &(pm8001_ha->irq_vector[i]));
                        }
-                       pci_disable_msix(pm8001_ha->pdev);
+                       pci_free_irq_vectors(pm8001_ha->pdev);
                        break;
                }
        }
@@ -1102,11 +1097,10 @@ static void pm8001_pci_remove(struct pci_dev *pdev)
 
 #ifdef PM8001_USE_MSIX
        for (i = 0; i < pm8001_ha->number_of_intr; i++)
-               synchronize_irq(pm8001_ha->msix_entries[i].vector);
+               synchronize_irq(pci_irq_vector(pdev, i));
        for (i = 0; i < pm8001_ha->number_of_intr; i++)
-               free_irq(pm8001_ha->msix_entries[i].vector,
-                               &(pm8001_ha->irq_vector[i]));
-       pci_disable_msix(pdev);
+               free_irq(pci_irq_vector(pdev, i), &pm8001_ha->irq_vector[i]);
+       pci_free_irq_vectors(pdev);
 #else
        free_irq(pm8001_ha->irq, sha);
 #endif
@@ -1152,11 +1146,10 @@ static int pm8001_pci_suspend(struct pci_dev *pdev, 
pm_message_t state)
        PM8001_CHIP_DISP->chip_soft_rst(pm8001_ha);
 #ifdef PM8001_USE_MSIX
        for (i = 0; i < pm8001_ha->number_of_intr; i++)
-               synchronize_irq(pm8001_ha->msix_entries[i].vector);
+               synchronize_irq(pci_irq_vector(pdev, i));
        for (i = 0; i < pm8001_ha->number_of_intr; i++)
-               free_irq(pm8001_ha->msix_entries[i].vector,
-                               &(pm8001_ha->irq_vector[i]));
-       pci_disable_msix(pdev);
+               free_irq(pci_irq_vector(pdev, i), &pm8001_ha->irq_vector[i]);
+       pci_free_irq_vectors(pdev);
 #else
        free_irq(pm8001_ha->irq, sha);
 #endif
diff --git a/drivers/scsi/pm8001/pm8001_sas.h b/drivers/scsi/pm8001/pm8001_sas.h
index 6628cc3..e81a8fa 100644
--- a/drivers/scsi/pm8001/pm8001_sas.h
+++ b/drivers/scsi/pm8001/pm8001_sas.h
@@ -521,8 +521,6 @@ struct pm8001_hba_info {
        struct pm8001_device    *devices;
        struct pm8001_ccb_info  *ccb_info;
 #ifdef PM8001_USE_MSIX
-       struct msix_entry       msix_entries[PM8001_MAX_MSIX_VEC];
-                                       /*for msi-x interrupt*/
        int                     number_of_intr;/*will be used in remove()*/
 #endif
 #ifdef PM8001_USE_TASKLET
-- 
2.1.4

Reply via email to