scsi: aacraid: switch to pci_alloc_irq_vectors
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>
This commit is contained in:
Родитель
a0f4bd7f2a
Коммит
0910d8bbdd
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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]));
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
Загрузка…
Ссылка в новой задаче