| From 6431f5d7c6025f8b007af06ea090de308f7e6881 Mon Sep 17 00:00:00 2001 |
| From: "Sumit.Saxena@lsi.com" <Sumit.Saxena@lsi.com> |
| Date: Tue, 16 Jul 2013 02:26:05 +0530 |
| Subject: SCSI: megaraid_sas: megaraid_sas driver init fails in kdump kernel |
| |
| From: "Sumit.Saxena@lsi.com" <Sumit.Saxena@lsi.com> |
| |
| commit 6431f5d7c6025f8b007af06ea090de308f7e6881 upstream. |
| |
| Problem: When Hardware IOMMU is on, megaraid_sas driver initialization fails |
| in kdump kernel with LSI MegaRAID controller(device id-0x73). |
| |
| Actually this issue needs fix in firmware, but for firmware running in field, |
| this driver fix is proposed to resolve the issue. At firmware initialization |
| time, if firmware does not come to ready state, driver will reset the adapter |
| and retry for firmware transition to ready state unconditionally(not only |
| executed for kdump kernel). |
| |
| Signed-off-by: Sumit Saxena <sumit.saxena@lsi.com> |
| Signed-off-by: Kashyap Desai <kashyap.desai@lsi.com> |
| Signed-off-by: James Bottomley <JBottomley@Parallels.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/scsi/megaraid/megaraid_sas_base.c | 20 +++++++++++++++----- |
| 1 file changed, 15 insertions(+), 5 deletions(-) |
| |
| --- a/drivers/scsi/megaraid/megaraid_sas_base.c |
| +++ b/drivers/scsi/megaraid/megaraid_sas_base.c |
| @@ -3508,11 +3508,21 @@ static int megasas_init_fw(struct megasa |
| break; |
| } |
| |
| - /* |
| - * We expect the FW state to be READY |
| - */ |
| - if (megasas_transition_to_ready(instance, 0)) |
| - goto fail_ready_state; |
| + if (megasas_transition_to_ready(instance, 0)) { |
| + atomic_set(&instance->fw_reset_no_pci_access, 1); |
| + instance->instancet->adp_reset |
| + (instance, instance->reg_set); |
| + atomic_set(&instance->fw_reset_no_pci_access, 0); |
| + dev_info(&instance->pdev->dev, |
| + "megasas: FW restarted successfully from %s!\n", |
| + __func__); |
| + |
| + /*waitting for about 30 second before retry*/ |
| + ssleep(30); |
| + |
| + if (megasas_transition_to_ready(instance, 0)) |
| + goto fail_ready_state; |
| + } |
| |
| /* Check if MSI-X is supported while in ready state */ |
| msix_enable = (instance->instancet->read_fw_status_reg(reg_set) & |