When the driver reads state values from the hw it might happen that
different values are read in subsequent reads and this can cause problems,
this may lead to a timeout in this function and a non working adapter.

Cc: Adam Radford <[email protected]>

Signed-off-by: Tomas Henzl <[email protected]>
Reviewed-by: Shintaro Minemoto <[email protected]>
Acked-by: Sumit Saxena <[email protected]>
---
 drivers/scsi/megaraid/megaraid_sas_base.c | 15 +++++++--------
 1 file changed, 7 insertions(+), 8 deletions(-)

diff --git a/drivers/scsi/megaraid/megaraid_sas_base.c 
b/drivers/scsi/megaraid/megaraid_sas_base.c
index dc27598..1153ac4 100644
--- a/drivers/scsi/megaraid/megaraid_sas_base.c
+++ b/drivers/scsi/megaraid/megaraid_sas_base.c
@@ -2626,7 +2626,8 @@ megasas_transition_to_ready(struct megasas_instance 
*instance, int ocr)
        u32 cur_state;
        u32 abs_state, curr_abs_state;
 
-       fw_state = instance->instancet->read_fw_status_reg(instance->reg_set) & 
MFI_STATE_MASK;
+       abs_state = instance->instancet->read_fw_status_reg(instance->reg_set);
+       fw_state = abs_state & MFI_STATE_MASK;
 
        if (fw_state != MFI_STATE_READY)
                printk(KERN_INFO "megasas: Waiting for FW to come to ready"
@@ -2634,9 +2635,6 @@ megasas_transition_to_ready(struct megasas_instance 
*instance, int ocr)
 
        while (fw_state != MFI_STATE_READY) {
 
-               abs_state =
-               instance->instancet->read_fw_status_reg(instance->reg_set);
-
                switch (fw_state) {
 
                case MFI_STATE_FAULT:
@@ -2772,10 +2770,8 @@ megasas_transition_to_ready(struct megasas_instance 
*instance, int ocr)
                 * The cur_state should not last for more than max_wait secs
                 */
                for (i = 0; i < (max_wait * 1000); i++) {
-                       fw_state = 
instance->instancet->read_fw_status_reg(instance->reg_set) &
-                                       MFI_STATE_MASK ;
-               curr_abs_state =
-               instance->instancet->read_fw_status_reg(instance->reg_set);
+                       curr_abs_state = instance->instancet->
+                               read_fw_status_reg(instance->reg_set);
 
                        if (abs_state == curr_abs_state) {
                                msleep(1);
@@ -2791,6 +2787,9 @@ megasas_transition_to_ready(struct megasas_instance 
*instance, int ocr)
                               "in %d secs\n", fw_state, max_wait);
                        return -ENODEV;
                }
+
+               abs_state = curr_abs_state;
+               fw_state = curr_abs_state & MFI_STATE_MASK;
        }
        printk(KERN_INFO "megasas: FW now in Ready state\n");
 
-- 
1.8.3.1

--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to