struct qla_hw_data *ha = vha->hw;
        int i, core;
        uint32_t cnt;
+       uint32_t reg_val;
+
+       spin_lock_irqsave(&ha->hardware_lock, flags);
+
+       QLAFX00_SET_HBA_SOC_REG(ha, 0x80004, 0);
+       QLAFX00_SET_HBA_SOC_REG(ha, 0x82004, 0);
+
+       /* stop the XOR DMA engines */
+       QLAFX00_SET_HBA_SOC_REG(ha, 0x60920, 0x02);
+       QLAFX00_SET_HBA_SOC_REG(ha, 0x60924, 0x02);
+       QLAFX00_SET_HBA_SOC_REG(ha, 0xf0920, 0x02);
+       QLAFX00_SET_HBA_SOC_REG(ha, 0xf0924, 0x02);
+
+       /* stop the IDMA engines */
+       reg_val = QLAFX00_GET_HBA_SOC_REG(ha, 0x60840);
+       reg_val &= ~(1<<12);
+       QLAFX00_SET_HBA_SOC_REG(ha, 0x60840, reg_val);
+
+       reg_val = QLAFX00_GET_HBA_SOC_REG(ha, 0x60844);
+       reg_val &= ~(1<<12);
+       QLAFX00_SET_HBA_SOC_REG(ha, 0x60844, reg_val);
+
+       reg_val = QLAFX00_GET_HBA_SOC_REG(ha, 0x60848);
+       reg_val &= ~(1<<12);
+       QLAFX00_SET_HBA_SOC_REG(ha, 0x60848, reg_val);
+
+       reg_val = QLAFX00_GET_HBA_SOC_REG(ha, 0x6084C);
+       reg_val &= ~(1<<12);
+       QLAFX00_SET_HBA_SOC_REG(ha, 0x6084C, reg_val);
+
+       for (i = 0; i < 100000; i++) {
+               if ((QLAFX00_GET_HBA_SOC_REG(ha, 0xd0000) & 0x10000000) == 0 &&
+                   (QLAFX00_GET_HBA_SOC_REG(ha, 0x10600) & 0x1) == 0)
+                       break;
+               udelay(100);
+       }
 
        /* Set all 4 cores in reset */
        for (i = 0; i < 4; i++) {
                QLAFX00_SET_HBA_SOC_REG(ha,
                    (SOC_SW_RST_CONTROL_REG_CORE0 + 8*i), (0xF01));
-       }
-
-       /* Set all 4 core Clock gating control */
-       for (i = 0; i < 4; i++) {
                QLAFX00_SET_HBA_SOC_REG(ha,
                    (SOC_SW_RST_CONTROL_REG_CORE0 + 4 + 8*i), (0x01010101));
        }
 
        /* Reset all units in Fabric */
-       QLAFX00_SET_HBA_SOC_REG(ha, SOC_FABRIC_RST_CONTROL_REG, (0x11F0101));
+       QLAFX00_SET_HBA_SOC_REG(ha, SOC_FABRIC_RST_CONTROL_REG, (0x011f0101));
+
+       /* */
+       QLAFX00_SET_HBA_SOC_REG(ha, 0x10610, 1);
+       QLAFX00_SET_HBA_SOC_REG(ha, 0x10600, 0);
+
+       /* Set all 4 core Memory Power Down Registers */
+       for (i = 0; i < 5; i++) {
+               QLAFX00_SET_HBA_SOC_REG(ha,
+                   (SOC_PWR_MANAGEMENT_PWR_DOWN_REG + 4*i), (0x0));
+       }
 
        /* Reset all interrupt control registers */
        for (i = 0; i < 115; i++) {
        QLAFX00_SET_HBA_SOC_REG(ha, SOC_FABRIC_CONTROL_REG, (0x2));
        QLAFX00_SET_HBA_SOC_REG(ha, SOC_FABRIC_CONFIG_REG, (0x3));
 
-       spin_lock_irqsave(&ha->hardware_lock, flags);
-
        /* Kick in Fabric units */
        QLAFX00_SET_HBA_SOC_REG(ha, SOC_FABRIC_RST_CONTROL_REG, (0x0));
 
 
        ha->isp_ops->disable_intrs(ha);
        qlafx00_soc_cpu_reset(vha);
-       ha->isp_ops->enable_intrs(ha);
 }
 
 /**