Commit 0910d8bb authored by Hannes Reinecke's avatar Hannes Reinecke Committed by Martin K. Petersen

scsi: aacraid: switch to pci_alloc_irq_vectors

Use pci_alloc_irq_vectors and drop the hand-crafted interrupt affinity
routines.
Signed-off-by: default avatarHannes Reinecke <hare@suse.com>
Cc: Adaptec OEM Raid Solutions <aacraid@microsemi.com>
Reviewed-by: default avatarRaghava Aditya Renukunta <raghavaaditya.renukunta@microsemi.com>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent a0f4bd7f
...@@ -1246,7 +1246,6 @@ struct aac_dev ...@@ -1246,7 +1246,6 @@ struct aac_dev
u32 max_msix; /* max. MSI-X vectors */ u32 max_msix; /* max. MSI-X vectors */
u32 vector_cap; /* MSI-X vector capab.*/ u32 vector_cap; /* MSI-X vector capab.*/
int msi_enabled; /* MSI/MSI-X enabled */ int msi_enabled; /* MSI/MSI-X enabled */
struct msix_entry msixentry[AAC_MAX_MSIX];
struct aac_msix_ctx aac_msix[AAC_MAX_MSIX]; /* context */ struct aac_msix_ctx aac_msix[AAC_MAX_MSIX]; /* context */
u8 adapter_shutdown; u8 adapter_shutdown;
u32 handle_pci_error; u32 handle_pci_error;
......
...@@ -378,16 +378,12 @@ void aac_define_int_mode(struct aac_dev *dev) ...@@ -378,16 +378,12 @@ void aac_define_int_mode(struct aac_dev *dev)
if (msi_count > AAC_MAX_MSIX) if (msi_count > AAC_MAX_MSIX)
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 && if (msi_count > 1 &&
pci_find_capability(dev->pdev, PCI_CAP_ID_MSIX)) { pci_find_capability(dev->pdev, PCI_CAP_ID_MSIX)) {
min_msix = 2; min_msix = 2;
i = pci_enable_msix_range(dev->pdev, i = pci_alloc_irq_vectors(dev->pdev,
dev->msixentry, min_msix, msi_count,
min_msix, PCI_IRQ_MSIX | PCI_IRQ_AFFINITY);
msi_count);
if (i > 0) { if (i > 0) {
dev->msi_enabled = 1; dev->msi_enabled = 1;
msi_count = i; msi_count = i;
......
...@@ -2043,30 +2043,22 @@ int aac_acquire_irq(struct aac_dev *dev) ...@@ -2043,30 +2043,22 @@ int aac_acquire_irq(struct aac_dev *dev)
int i; int i;
int j; int j;
int ret = 0; int ret = 0;
int cpu;
cpu = cpumask_first(cpu_online_mask);
if (!dev->sync_mode && dev->msi_enabled && dev->max_msix > 1) { if (!dev->sync_mode && dev->msi_enabled && dev->max_msix > 1) {
for (i = 0; i < dev->max_msix; i++) { for (i = 0; i < dev->max_msix; i++) {
dev->aac_msix[i].vector_no = i; dev->aac_msix[i].vector_no = i;
dev->aac_msix[i].dev = dev; 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, dev->a_ops.adapter_intr,
0, "aacraid", &(dev->aac_msix[i]))) { 0, "aacraid", &(dev->aac_msix[i]))) {
printk(KERN_ERR "%s%d: Failed to register IRQ for vector %d.\n", printk(KERN_ERR "%s%d: Failed to register IRQ for vector %d.\n",
dev->name, dev->id, i); dev->name, dev->id, i);
for (j = 0 ; j < i ; j++) for (j = 0 ; j < i ; j++)
free_irq(dev->msixentry[j].vector, free_irq(pci_irq_vector(dev->pdev, j),
&(dev->aac_msix[j])); &(dev->aac_msix[j]));
pci_disable_msix(dev->pdev); pci_disable_msix(dev->pdev);
ret = -1; 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 { } else {
dev->aac_msix[0].vector_no = 0; dev->aac_msix[0].vector_no = 0;
...@@ -2096,16 +2088,9 @@ void aac_free_irq(struct aac_dev *dev) ...@@ -2096,16 +2088,9 @@ void aac_free_irq(struct aac_dev *dev)
dev->pdev->device == PMC_DEVICE_S8 || dev->pdev->device == PMC_DEVICE_S8 ||
dev->pdev->device == PMC_DEVICE_S9) { dev->pdev->device == PMC_DEVICE_S9) {
if (dev->max_msix > 1) { if (dev->max_msix > 1) {
for (i = 0; i < dev->max_msix; i++) { for (i = 0; i < dev->max_msix; i++)
if (irq_set_affinity_hint( free_irq(pci_irq_vector(dev->pdev, i),
dev->msixentry[i].vector, NULL)) { &(dev->aac_msix[i]));
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]));
}
} else { } else {
free_irq(dev->pdev->irq, &(dev->aac_msix[0])); free_irq(dev->pdev->irq, &(dev->aac_msix[0]));
} }
......
...@@ -1071,7 +1071,6 @@ static struct scsi_host_template aac_driver_template = { ...@@ -1071,7 +1071,6 @@ static struct scsi_host_template aac_driver_template = {
static void __aac_shutdown(struct aac_dev * aac) static void __aac_shutdown(struct aac_dev * aac)
{ {
int i; int i;
int cpu;
aac_send_shutdown(aac); aac_send_shutdown(aac);
...@@ -1087,24 +1086,13 @@ static void __aac_shutdown(struct aac_dev * aac) ...@@ -1087,24 +1086,13 @@ static void __aac_shutdown(struct aac_dev * aac)
kthread_stop(aac->thread); kthread_stop(aac->thread);
} }
aac_adapter_disable_int(aac); aac_adapter_disable_int(aac);
cpu = cpumask_first(cpu_online_mask);
if (aac->pdev->device == PMC_DEVICE_S6 || if (aac->pdev->device == PMC_DEVICE_S6 ||
aac->pdev->device == PMC_DEVICE_S7 || aac->pdev->device == PMC_DEVICE_S7 ||
aac->pdev->device == PMC_DEVICE_S8 || aac->pdev->device == PMC_DEVICE_S8 ||
aac->pdev->device == PMC_DEVICE_S9) { aac->pdev->device == PMC_DEVICE_S9) {
if (aac->max_msix > 1) { if (aac->max_msix > 1) {
for (i = 0; i < aac->max_msix; i++) { for (i = 0; i < aac->max_msix; i++) {
if (irq_set_affinity_hint( free_irq(pci_irq_vector(aac->pdev, i),
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,
&(aac->aac_msix[i])); &(aac->aac_msix[i]));
} }
} else { } else {
...@@ -1350,7 +1338,7 @@ static void aac_release_resources(struct aac_dev *aac) ...@@ -1350,7 +1338,7 @@ static void aac_release_resources(struct aac_dev *aac)
aac->pdev->device == PMC_DEVICE_S9) { aac->pdev->device == PMC_DEVICE_S9) {
if (aac->max_msix > 1) { if (aac->max_msix > 1) {
for (i = 0; i < aac->max_msix; i++) 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])); &(aac->aac_msix[i]));
} else { } else {
free_irq(aac->pdev->irq, &(aac->aac_msix[0])); free_irq(aac->pdev->irq, &(aac->aac_msix[0]));
...@@ -1396,13 +1384,13 @@ static int aac_acquire_resources(struct aac_dev *dev) ...@@ -1396,13 +1384,13 @@ static int aac_acquire_resources(struct aac_dev *dev)
dev->aac_msix[i].vector_no = i; dev->aac_msix[i].vector_no = i;
dev->aac_msix[i].dev = dev; 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, dev->a_ops.adapter_intr,
0, "aacraid", &(dev->aac_msix[i]))) { 0, "aacraid", &(dev->aac_msix[i]))) {
printk(KERN_ERR "%s%d: Failed to register IRQ for vector %d.\n", printk(KERN_ERR "%s%d: Failed to register IRQ for vector %d.\n",
name, instance, i); name, instance, i);
for (j = 0 ; j < i ; j++) for (j = 0 ; j < i ; j++)
free_irq(dev->msixentry[j].vector, free_irq(pci_irq_vector(dev->pdev, j),
&(dev->aac_msix[j])); &(dev->aac_msix[j]));
pci_disable_msix(dev->pdev); pci_disable_msix(dev->pdev);
goto error_iounmap; goto error_iounmap;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment