scsi: aacraid: Reorder Adapter status check
authorRaghava Aditya Renukunta <RaghavaAditya.Renukunta@microsemi.com>
Thu, 16 Feb 2017 20:51:21 +0000 (12:51 -0800)
committerMartin K. Petersen <martin.petersen@oracle.com>
Wed, 22 Feb 2017 23:41:42 +0000 (18:41 -0500)
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.

Cc: stable@vger.kernel.org
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>
drivers/scsi/aacraid/src.c

index 9b11e1a6cc75912f70c794270f39d41880fc9ede..71aaabde6b573be4b93f862dc192a5044b131bc2 100644 (file)
@@ -436,17 +436,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.
         */
@@ -456,6 +463,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;
 }
 
 static inline u32 aac_get_vector(struct aac_dev *dev)