scsi: aacraid: Reorder Adapter status check
authorRaghava Aditya Renukunta <RaghavaAditya.Renukunta@microsemi.com>
Thu, 16 Feb 2017 20:51:21 +0000 (12:51 -0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 12 Mar 2017 05:37:26 +0000 (06:37 +0100)
commit c421530bf848604e97d0785a03b3fe2c62775083 upstream.

The driver currently checks the SELF_TEST_FAILED first and then
KERNEL_PANIC next. Under error conditions(boot code failure) both
SELF_TEST_FAILED and KERNEL_PANIC can be set at the same time.

The driver has the capability to reset the controller on an KERNEL_PANIC,
but not on SELF_TEST_FAILED.

Fixed by first checking KERNEL_PANIC and then the others.

Fixes: e8b12f0fb835223752 ([SCSI] aacraid: Add new code for PMC-Sierra's SRC base controller family)
Signed-off-by: Raghava Aditya Renukunta <RaghavaAditya.Renukunta@microsemi.com>
Reviewed-by: David Carroll <David.Carroll@microsemi.com>
Reviewed-by: Johannes Thumshirn <jthumshirn@suse.de>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/scsi/aacraid/src.c

index bc0203f3d243e8e8926e1975408017d9dd5f5012..e415e1c58eb59f6f53370c682e3786b9c659d330 100644 (file)
@@ -412,17 +412,24 @@ static int aac_src_check_health(struct aac_dev *dev)
 {
        u32 status = src_readl(dev, MUnit.OMR);
 
+       /*
+        *      Check to see if the board panic'd.
+        */
+       if (unlikely(status & KERNEL_PANIC))
+               goto err_blink;
+
        /*
         *      Check to see if the board failed any self tests.
         */
        if (unlikely(status & SELF_TEST_FAILED))
-               return -1;
+               goto err_out;
 
        /*
-        *      Check to see if the board panic'd.
+        *      Check to see if the board failed any self tests.
         */
-       if (unlikely(status & KERNEL_PANIC))
-               return (status >> 16) & 0xFF;
+       if (unlikely(status & MONITOR_PANIC))
+               goto err_out;
+
        /*
         *      Wait for the adapter to be up and running.
         */
@@ -432,6 +439,12 @@ static int aac_src_check_health(struct aac_dev *dev)
         *      Everything is OK
         */
        return 0;
+
+err_out:
+       return -1;
+
+err_blink:
+       return (status > 16) & 0xFF;
 }
 
 /**