/**
  * check_fw_ready - The LLDD check if the FW is ready, if not, return error.
+ * This function sleeps hence it must not be used in atomic context.
  * @pm8001_ha: our hba card information
  */
 static int check_fw_ready(struct pm8001_hba_info *pm8001_ha)
        int ret = 0;
 
        /* reset / PCIe ready */
-       max_wait_time = max_wait_count = 100 * 1000;    /* 100 milli sec */
+       max_wait_time = max_wait_count = 5;     /* 100 milli sec */
        do {
-               udelay(1);
+               msleep(FW_READY_INTERVAL);
                value = pm8001_cr32(pm8001_ha, 0, MSGU_SCRATCH_PAD_1);
        } while ((value == 0xFFFFFFFF) && (--max_wait_count));
 
        /* check ila status */
-       max_wait_time = max_wait_count = 1000 * 1000;   /* 1000 milli sec */
+       max_wait_time = max_wait_count = 50;    /* 1000 milli sec */
        do {
-               udelay(1);
+               msleep(FW_READY_INTERVAL);
                value = pm8001_cr32(pm8001_ha, 0, MSGU_SCRATCH_PAD_1);
        } while (((value & SCRATCH_PAD_ILA_READY) !=
                        SCRATCH_PAD_ILA_READY) && (--max_wait_count));
        }
 
        /* check RAAE status */
-       max_wait_time = max_wait_count = 1800 * 1000;   /* 1800 milli sec */
+       max_wait_time = max_wait_count = 90;    /* 1800 milli sec */
        do {
-               udelay(1);
+               msleep(FW_READY_INTERVAL);
                value = pm8001_cr32(pm8001_ha, 0, MSGU_SCRATCH_PAD_1);
        } while (((value & SCRATCH_PAD_RAAE_READY) !=
                                SCRATCH_PAD_RAAE_READY) && (--max_wait_count));
        }
 
        /* check iop0 status */
-       max_wait_time = max_wait_count = 600 * 1000;    /* 600 milli sec */
+       max_wait_time = max_wait_count = 30;    /* 600 milli sec */
        do {
-               udelay(1);
+               msleep(FW_READY_INTERVAL);
                value = pm8001_cr32(pm8001_ha, 0, MSGU_SCRATCH_PAD_1);
        } while (((value & SCRATCH_PAD_IOP0_READY) != SCRATCH_PAD_IOP0_READY) &&
                        (--max_wait_count));
        if ((pm8001_ha->chip_id != chip_8008) &&
                        (pm8001_ha->chip_id != chip_8009)) {
                /* 200 milli sec */
-               max_wait_time = max_wait_count = 200 * 1000;
+               max_wait_time = max_wait_count = 10;
                do {
-                       udelay(1);
+                       msleep(FW_READY_INTERVAL);
                        value = pm8001_cr32(pm8001_ha, 0, MSGU_SCRATCH_PAD_1);
                } while (((value & SCRATCH_PAD_IOP1_READY) !=
                                SCRATCH_PAD_IOP1_READY) && (--max_wait_count));