scsi: aacraid: switch to pci_alloc_irq_vectors
authorHannes Reinecke <hare@suse.de>
Tue, 8 Nov 2016 07:11:30 +0000 (08:11 +0100)
committerMartin K. Petersen <martin.petersen@oracle.com>
Fri, 18 Nov 2016 01:29:55 +0000 (20:29 -0500)
Use pci_alloc_irq_vectors and drop the hand-crafted interrupt affinity
routines.

Signed-off-by: Hannes Reinecke <hare@suse.com>
Cc: Adaptec OEM Raid Solutions <aacraid@microsemi.com>
Reviewed-by: Raghava Aditya Renukunta <raghavaaditya.renukunta@microsemi.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/aacraid/aacraid.h
drivers/scsi/aacraid/comminit.c
drivers/scsi/aacraid/commsup.c
drivers/scsi/aacraid/linit.c

index 969c312..f059c14 100644 (file)
@@ -1246,7 +1246,6 @@ struct aac_dev
        u32                     max_msix;       /* max. MSI-X vectors */
        u32                     vector_cap;     /* MSI-X vector capab.*/
        int                     msi_enabled;    /* MSI/MSI-X enabled */
-       struct msix_entry       msixentry[AAC_MAX_MSIX];
        struct aac_msix_ctx     aac_msix[AAC_MAX_MSIX]; /* context */
        u8                      adapter_shutdown;
        u32                     handle_pci_error;
index 341ea32..4f56b10 100644 (file)
@@ -378,16 +378,12 @@ void aac_define_int_mode(struct aac_dev *dev)
        if (msi_count > AAC_MAX_MSIX)
                msi_count = AAC_MAX_MSIX;
 
-       for (i = 0; i < msi_count; i++)
-               dev->msixentry[i].entry = i;
-
        if (msi_count > 1 &&
            pci_find_capability(dev->pdev, PCI_CAP_ID_MSIX)) {
                min_msix = 2;
-               i = pci_enable_msix_range(dev->pdev,
-                                   dev->msixentry,
-                                   min_msix,
-                                   msi_count);
+               i = pci_alloc_irq_vectors(dev->pdev,
+                                         min_msix, msi_count,
+                                         PCI_IRQ_MSIX | PCI_IRQ_AFFINITY);
                if (i > 0) {
                        dev->msi_enabled = 1;
                        msi_count = i;
index 0aeecec..9e7551f 100644 (file)
@@ -2043,30 +2043,22 @@ int aac_acquire_irq(struct aac_dev *dev)
        int i;
        int j;
        int ret = 0;
-       int cpu;
 
-       cpu = cpumask_first(cpu_online_mask);
        if (!dev->sync_mode && dev->msi_enabled && dev->max_msix > 1) {
                for (i = 0; i < dev->max_msix; i++) {
                        dev->aac_msix[i].vector_no = i;
                        dev->aac_msix[i].dev = dev;
-                       if (request_irq(dev->msixentry[i].vector,
+                       if (request_irq(pci_irq_vector(dev->pdev, i),
                                        dev->a_ops.adapter_intr,
                                        0, "aacraid", &(dev->aac_msix[i]))) {
                                printk(KERN_ERR "%s%d: Failed to register IRQ for vector %d.\n",
                                                dev->name, dev->id, i);
                                for (j = 0 ; j < i ; j++)
-                                       free_irq(dev->msixentry[j].vector,
+                                       free_irq(pci_irq_vector(dev->pdev, j),
                                                 &(dev->aac_msix[j]));
                                pci_disable_msix(dev->pdev);
                                ret = -1;
                        }
-                       if (irq_set_affinity_hint(dev->msixentry[i].vector,
-                                                       get_cpu_mask(cpu))) {
-                               printk(KERN_ERR "%s%d: Failed to set IRQ affinity for cpu %d\n",
-                                           dev->name, dev->id, cpu);
-                       }
-                       cpu = cpumask_next(cpu, cpu_online_mask);
                }
        } else {
                dev->aac_msix[0].vector_no = 0;
@@ -2096,16 +2088,9 @@ void aac_free_irq(struct aac_dev *dev)
            dev->pdev->device == PMC_DEVICE_S8 ||
            dev->pdev->device == PMC_DEVICE_S9) {
                if (dev->max_msix > 1) {
-                       for (i = 0; i < dev->max_msix; i++) {
-                               if (irq_set_affinity_hint(
-                                       dev->msixentry[i].vector, NULL)) {
-                                       printk(KERN_ERR "%s%d: Failed to reset IRQ affinity for cpu %d\n",
-                                           dev->name, dev->id, cpu);
-                               }
-                               cpu = cpumask_next(cpu, cpu_online_mask);
-                               free_irq(dev->msixentry[i].vector,
-                                               &(dev->aac_msix[i]));
-                       }
+                       for (i = 0; i < dev->max_msix; i++)
+                               free_irq(pci_irq_vector(dev->pdev, i),
+                                        &(dev->aac_msix[i]));
                } else {
                        free_irq(dev->pdev->irq, &(dev->aac_msix[0]));
                }
index 79871f3..e4f3e22 100644 (file)
@@ -1071,7 +1071,6 @@ static struct scsi_host_template aac_driver_template = {
 static void __aac_shutdown(struct aac_dev * aac)
 {
        int i;
-       int cpu;
 
        aac_send_shutdown(aac);
 
@@ -1087,24 +1086,13 @@ static void __aac_shutdown(struct aac_dev * aac)
                kthread_stop(aac->thread);
        }
        aac_adapter_disable_int(aac);
-       cpu = cpumask_first(cpu_online_mask);
        if (aac->pdev->device == PMC_DEVICE_S6 ||
            aac->pdev->device == PMC_DEVICE_S7 ||
            aac->pdev->device == PMC_DEVICE_S8 ||
            aac->pdev->device == PMC_DEVICE_S9) {
                if (aac->max_msix > 1) {
                        for (i = 0; i < aac->max_msix; i++) {
-                               if (irq_set_affinity_hint(
-                                   aac->msixentry[i].vector,
-                                   NULL)) {
-                                       printk(KERN_ERR "%s%d: Failed to reset IRQ affinity for cpu %d\n",
-                                               aac->name,
-                                               aac->id,
-                                               cpu);
-                               }
-                               cpu = cpumask_next(cpu,
-                                               cpu_online_mask);
-                               free_irq(aac->msixentry[i].vector,
+                               free_irq(pci_irq_vector(aac->pdev, i),
                                         &(aac->aac_msix[i]));
                        }
                } else {
@@ -1350,7 +1338,7 @@ static void aac_release_resources(struct aac_dev *aac)
            aac->pdev->device == PMC_DEVICE_S9) {
                if (aac->max_msix > 1) {
                        for (i = 0; i < aac->max_msix; i++)
-                               free_irq(aac->msixentry[i].vector,
+                               free_irq(pci_irq_vector(aac->pdev, i),
                                        &(aac->aac_msix[i]));
                } else {
                        free_irq(aac->pdev->irq, &(aac->aac_msix[0]));
@@ -1396,13 +1384,13 @@ static int aac_acquire_resources(struct aac_dev *dev)
                        dev->aac_msix[i].vector_no = i;
                        dev->aac_msix[i].dev = dev;
 
-                       if (request_irq(dev->msixentry[i].vector,
+                       if (request_irq(pci_irq_vector(dev->pdev, i),
                                        dev->a_ops.adapter_intr,
                                        0, "aacraid", &(dev->aac_msix[i]))) {
                                printk(KERN_ERR "%s%d: Failed to register IRQ for vector %d.\n",
                                                name, instance, i);
                                for (j = 0 ; j < i ; j++)
-                                       free_irq(dev->msixentry[j].vector,
+                                       free_irq(pci_irq_vector(dev->pdev, j),
                                                 &(dev->aac_msix[j]));
                                pci_disable_msix(dev->pdev);
                                goto error_iounmap;