| From bd7c9964f3ea6db292ab90bae808cc4b102e735b Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Tue, 1 Feb 2022 15:48:43 -0600 |
| Subject: scsi: smartpqi: Fix kdump issue when controller is locked up |
| |
| From: Mahesh Rajashekhara <mahesh.rajashekhara@microchip.com> |
| |
| [ Upstream commit 3ada501d602abf02353445c03bb3258146445d90 ] |
| |
| Avoid dropping into shell if the controller is in locked up state. |
| |
| Driver issues SIS soft reset to bring back the controller to SIS mode while |
| OS boots into kdump mode. |
| |
| If the controller is in lockup state, SIS soft reset does not work. |
| |
| Since the controller lockup code has not been cleared, driver considers the |
| firmware is no longer up and running. Driver returns back an error code to |
| OS and the kdump fails. |
| |
| Link: https://lore.kernel.org/r/164375212337.440833.11955356190354940369.stgit@brunhilda.pdev.net |
| Reviewed-by: Kevin Barnett <kevin.barnett@microchip.com> |
| Reviewed-by: Scott Benesh <scott.benesh@microchip.com> |
| Reviewed-by: Scott Teel <scott.teel@microchip.com> |
| Signed-off-by: Mahesh Rajashekhara <mahesh.rajashekhara@microchip.com> |
| Signed-off-by: Don Brace <don.brace@microchip.com> |
| Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/scsi/smartpqi/smartpqi_init.c | 39 ++++++++++++++++----------- |
| 1 file changed, 23 insertions(+), 16 deletions(-) |
| |
| diff --git a/drivers/scsi/smartpqi/smartpqi_init.c b/drivers/scsi/smartpqi/smartpqi_init.c |
| index 2db9f874cc51..f3749e508673 100644 |
| --- a/drivers/scsi/smartpqi/smartpqi_init.c |
| +++ b/drivers/scsi/smartpqi/smartpqi_init.c |
| @@ -7855,6 +7855,21 @@ static int pqi_force_sis_mode(struct pqi_ctrl_info *ctrl_info) |
| return pqi_revert_to_sis_mode(ctrl_info); |
| } |
| |
| +static void pqi_perform_lockup_action(void) |
| +{ |
| + switch (pqi_lockup_action) { |
| + case PANIC: |
| + panic("FATAL: Smart Family Controller lockup detected"); |
| + break; |
| + case REBOOT: |
| + emergency_restart(); |
| + break; |
| + case NONE: |
| + default: |
| + break; |
| + } |
| +} |
| + |
| static int pqi_ctrl_init(struct pqi_ctrl_info *ctrl_info) |
| { |
| int rc; |
| @@ -7879,8 +7894,15 @@ static int pqi_ctrl_init(struct pqi_ctrl_info *ctrl_info) |
| * commands. |
| */ |
| rc = sis_wait_for_ctrl_ready(ctrl_info); |
| - if (rc) |
| + if (rc) { |
| + if (reset_devices) { |
| + dev_err(&ctrl_info->pci_dev->dev, |
| + "kdump init failed with error %d\n", rc); |
| + pqi_lockup_action = REBOOT; |
| + pqi_perform_lockup_action(); |
| + } |
| return rc; |
| + } |
| |
| /* |
| * Get the controller properties. This allows us to determine |
| @@ -8605,21 +8627,6 @@ static int pqi_ofa_ctrl_restart(struct pqi_ctrl_info *ctrl_info, unsigned int de |
| return pqi_ctrl_init_resume(ctrl_info); |
| } |
| |
| -static void pqi_perform_lockup_action(void) |
| -{ |
| - switch (pqi_lockup_action) { |
| - case PANIC: |
| - panic("FATAL: Smart Family Controller lockup detected"); |
| - break; |
| - case REBOOT: |
| - emergency_restart(); |
| - break; |
| - case NONE: |
| - default: |
| - break; |
| - } |
| -} |
| - |
| static struct pqi_raid_error_info pqi_ctrl_offline_raid_error_info = { |
| .data_out_result = PQI_DATA_IN_OUT_HARDWARE_ERROR, |
| .status = SAM_STAT_CHECK_CONDITION, |
| -- |
| 2.35.1 |
| |