Commit 77cb6d5e authored by Raghava Aditya Renukunta's avatar Raghava Aditya Renukunta Committed by Martin K. Petersen

scsi: aacraid: Rework SOFT reset code

Now the driver issues a soft reset and waits for the controller to be up
and running by periodically checking on the status of the controller
health registers. Also prevents ARC adapters from issuing soft reset if
IOP resets failed.
Signed-off-by: default avatarRaghava Aditya Renukunta <RaghavaAditya.Renukunta@microsemi.com>
Reviewed-by: default avatarDavid Carroll <david.carroll@microsemi.com>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent 0e9973ed
...@@ -754,8 +754,8 @@ static void aac_send_hardware_soft_reset(struct aac_dev *dev) ...@@ -754,8 +754,8 @@ static void aac_send_hardware_soft_reset(struct aac_dev *dev)
static int aac_src_restart_adapter(struct aac_dev *dev, int bled, u8 reset_type) static int aac_src_restart_adapter(struct aac_dev *dev, int bled, u8 reset_type)
{ {
unsigned long status, start;
bool is_ctrl_up; bool is_ctrl_up;
int ret = 0;
if (bled < 0) if (bled < 0)
goto invalid_out; goto invalid_out;
...@@ -785,24 +785,21 @@ static int aac_src_restart_adapter(struct aac_dev *dev, int bled, u8 reset_type) ...@@ -785,24 +785,21 @@ static int aac_src_restart_adapter(struct aac_dev *dev, int bled, u8 reset_type)
else else
goto set_startup; goto set_startup;
/* if (!dev->sa_firmware) {
* Check to see if KERNEL_UP_AND_RUNNING ret = -ENODEV;
* Wait for the adapter to be up and running. goto out;
* If !KERNEL_UP_AND_RUNNING issue HW Soft Reset
*/
status = src_readl(dev, MUnit.OMR);
if (dev->sa_firmware
&& !(status & KERNEL_UP_AND_RUNNING)) {
start = jiffies;
do {
status = src_readl(dev, MUnit.OMR);
if (time_after(jiffies,
start+HZ*SOFT_RESET_TIME)) {
aac_send_hardware_soft_reset(dev);
start = jiffies;
}
} while (!(status & KERNEL_UP_AND_RUNNING));
} }
aac_send_hardware_soft_reset(dev);
dev->msi_enabled = 0;
is_ctrl_up = aac_is_ctrl_up_and_running(dev);
if (!is_ctrl_up) {
dev_err(&dev->pdev->dev, "SOFT reset failed\n");
ret = -ENODEV;
goto out;
}
break; break;
case HW_SOFT_RESET: case HW_SOFT_RESET:
if (dev->sa_firmware) { if (dev->sa_firmware) {
...@@ -818,13 +815,14 @@ static int aac_src_restart_adapter(struct aac_dev *dev, int bled, u8 reset_type) ...@@ -818,13 +815,14 @@ static int aac_src_restart_adapter(struct aac_dev *dev, int bled, u8 reset_type)
invalid_out: invalid_out:
if (src_readl(dev, MUnit.OMR) & KERNEL_PANIC) if (src_readl(dev, MUnit.OMR) & KERNEL_PANIC)
return -ENODEV; ret = -ENODEV;
set_startup: set_startup:
if (startup_timeout < 300) if (startup_timeout < 300)
startup_timeout = 300; startup_timeout = 300;
return 0; out:
return ret;
} }
/** /**
......
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