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"
 
        while (fw_state != MFI_STATE_READY) {
 
-               abs_state =
-               instance->instancet->read_fw_status_reg(instance->reg_set);
-
                switch (fw_state) {
 
                case MFI_STATE_FAULT:
                 * 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);
                               "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");