summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRaghava Aditya Renukunta <RaghavaAditya.Renukunta@microsemi.com>2017-05-10 09:39:46 -0700
committerMartin K. Petersen <martin.petersen@oracle.com>2017-06-12 20:48:00 -0400
commit77cb6d5ea6033e5d477947aa682728959d6c3f8f (patch)
tree46c33f3bfd39a3750cac0bd6d7802ea5cb0d1d7e
parent0e9973ed3382652b324971753745cfe08488bb9f (diff)
downloadlinux-stable-77cb6d5ea6033e5d477947aa682728959d6c3f8f.tar.gz
linux-stable-77cb6d5ea6033e5d477947aa682728959d6c3f8f.tar.bz2
linux-stable-77cb6d5ea6033e5d477947aa682728959d6c3f8f.zip
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: Raghava Aditya Renukunta <RaghavaAditya.Renukunta@microsemi.com> Reviewed-by: David Carroll <david.carroll@microsemi.com> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
-rw-r--r--drivers/scsi/aacraid/src.c38
1 files changed, 18 insertions, 20 deletions
diff --git a/drivers/scsi/aacraid/src.c b/drivers/scsi/aacraid/src.c
index cde4160c3e47..9ad60d63586d 100644
--- a/drivers/scsi/aacraid/src.c
+++ b/drivers/scsi/aacraid/src.c
@@ -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)
{
- unsigned long status, start;
bool is_ctrl_up;
+ int ret = 0;
if (bled < 0)
goto invalid_out;
@@ -785,24 +785,21 @@ static int aac_src_restart_adapter(struct aac_dev *dev, int bled, u8 reset_type)
else
goto set_startup;
- /*
- * Check to see if KERNEL_UP_AND_RUNNING
- * Wait for the adapter to be up and running.
- * 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));
+ if (!dev->sa_firmware) {
+ ret = -ENODEV;
+ goto out;
}
+
+ 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;
case HW_SOFT_RESET:
if (dev->sa_firmware) {
@@ -818,13 +815,14 @@ static int aac_src_restart_adapter(struct aac_dev *dev, int bled, u8 reset_type)
invalid_out:
if (src_readl(dev, MUnit.OMR) & KERNEL_PANIC)
- return -ENODEV;
+ ret = -ENODEV;
set_startup:
if (startup_timeout < 300)
startup_timeout = 300;
- return 0;
+out:
+ return ret;
}
/**