aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi
diff options
context:
space:
mode:
authorTomas Henzl <thenzl@redhat.com>2015-06-02 06:39:46 -0400
committerJames Bottomley <JBottomley@Odin.com>2015-06-13 11:32:30 -0400
commit258c3af2b9309412d82e74b2ea87e8c140fe2072 (patch)
treefc71cf065375f62f81ddc56229ca43859b78079e /drivers/scsi
parentf0284ca63ecf8bdbf76c47eb5354a6a40239320c (diff)
megaraid: fix irq setup process regression
This fixes a regression caused by commit d3557fc8be11d25f316884581f487684f8e7dad3 megaraid_sas : Add separate function for setting up IRQs This makes boot end with 'root does not exist' message on certain adapters. The bug is that the driver does not setup ints for cards without msi-x support. This patch fixes it, in addition to that it moves tasklet initialisation before enable_intr, otherwise a kernel panic may occur, when an interrupt arrives before the tasklet is ready. Signed-off-by: Tomas Henzl <thenzl@redhat.com> Signed-off-by: Sumit Saxena <sumit.saxena@avagotech.com> Signed-off-by: James Bottomley <JBottomley@Odin.com>
Diffstat (limited to 'drivers/scsi')
-rw-r--r--drivers/scsi/megaraid/megaraid_sas_base.c30
1 files changed, 14 insertions, 16 deletions
diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c b/drivers/scsi/megaraid/megaraid_sas_base.c
index a022c39153cf..89bb4c6d86f9 100644
--- a/drivers/scsi/megaraid/megaraid_sas_base.c
+++ b/drivers/scsi/megaraid/megaraid_sas_base.c
@@ -4619,18 +4619,18 @@ static int megasas_init_fw(struct megasas_instance *instance)
4619 instance->msix_vectors = i; 4619 instance->msix_vectors = i;
4620 else 4620 else
4621 instance->msix_vectors = 0; 4621 instance->msix_vectors = 0;
4622 }
4622 4623
4623 dev_info(&instance->pdev->dev, 4624 dev_info(&instance->pdev->dev,
4624 "firmware supports msix\t: (%d)", fw_msix_count); 4625 "firmware supports msix\t: (%d)", fw_msix_count);
4625 dev_info(&instance->pdev->dev, 4626 dev_info(&instance->pdev->dev,
4626 "current msix/online cpus\t: (%d/%d)\n", 4627 "current msix/online cpus\t: (%d/%d)\n",
4627 instance->msix_vectors, (unsigned int)num_online_cpus()); 4628 instance->msix_vectors, (unsigned int)num_online_cpus());
4628 4629
4629 if (instance->msix_vectors ? 4630 if (instance->msix_vectors ?
4630 megasas_setup_irqs_msix(instance, 1) : 4631 megasas_setup_irqs_msix(instance, 1) :
4631 megasas_setup_irqs_ioapic(instance)) 4632 megasas_setup_irqs_ioapic(instance))
4632 goto fail_setup_irqs; 4633 goto fail_setup_irqs;
4633 }
4634 4634
4635 instance->ctrl_info = kzalloc(sizeof(struct megasas_ctrl_info), 4635 instance->ctrl_info = kzalloc(sizeof(struct megasas_ctrl_info),
4636 GFP_KERNEL); 4636 GFP_KERNEL);
@@ -4646,6 +4646,10 @@ static int megasas_init_fw(struct megasas_instance *instance)
4646 /* Get operational params, sge flags, send init cmd to controller */ 4646 /* Get operational params, sge flags, send init cmd to controller */
4647 if (instance->instancet->init_adapter(instance)) 4647 if (instance->instancet->init_adapter(instance))
4648 goto fail_init_adapter; 4648 goto fail_init_adapter;
4649
4650 tasklet_init(&instance->isr_tasklet, instance->instancet->tasklet,
4651 (unsigned long)instance);
4652
4649 instance->instancet->enable_intr(instance); 4653 instance->instancet->enable_intr(instance);
4650 4654
4651 printk(KERN_ERR "megasas: INIT adapter done\n"); 4655 printk(KERN_ERR "megasas: INIT adapter done\n");
@@ -4762,12 +4766,6 @@ static int megasas_init_fw(struct megasas_instance *instance)
4762 instance->throttlequeuedepth = 4766 instance->throttlequeuedepth =
4763 MEGASAS_THROTTLE_QUEUE_DEPTH; 4767 MEGASAS_THROTTLE_QUEUE_DEPTH;
4764 4768
4765 /*
4766 * Setup tasklet for cmd completion
4767 */
4768
4769 tasklet_init(&instance->isr_tasklet, instance->instancet->tasklet,
4770 (unsigned long)instance);
4771 4769
4772 /* Launch SR-IOV heartbeat timer */ 4770 /* Launch SR-IOV heartbeat timer */
4773 if (instance->requestorId) { 4771 if (instance->requestorId) {