ATH11K_RECOVER_START_TIMEOUT_HZ);
 
        ath11k_hif_power_down(ab);
-       ath11k_qmi_free_resource(ab);
        ath11k_hif_power_up(ab);
 
        ath11k_dbg(ab, ATH11K_DBG_BOOT, "reset started\n");
 
 
        for (i = 0; i < ab->qmi.mem_seg_count; i++) {
                chunk = &ab->qmi.target_mem[i];
+
+               /* Firmware reloads in coldboot/firmware recovery.
+                * in such case, no need to allocate memory for FW again.
+                */
+               if (chunk->vaddr) {
+                       if (chunk->prev_type == chunk->type ||
+                           chunk->prev_size == chunk->size)
+                               continue;
+
+                       /* cannot reuse the existing chunk */
+                       dma_free_coherent(ab->dev, chunk->size,
+                                         chunk->vaddr, chunk->paddr);
+                       chunk->vaddr = NULL;
+               }
+
                chunk->vaddr = dma_alloc_coherent(ab->dev,
                                                  chunk->size,
                                                  &chunk->paddr,
                                   chunk->type);
                        return -EINVAL;
                }
+               chunk->prev_type = chunk->type;
+               chunk->prev_size = chunk->size;
        }
 
        return 0;
        char path[100];
        int ret;
 
-       if (m3_mem->vaddr || m3_mem->size)
-               return 0;
-
        fw = ath11k_core_firmware_request(ab, ATH11K_M3_FILE);
        if (IS_ERR(fw)) {
                ret = PTR_ERR(fw);
                return ret;
        }
 
+       if (m3_mem->vaddr || m3_mem->size)
+               goto skip_m3_alloc;
+
        m3_mem->vaddr = dma_alloc_coherent(ab->dev,
                                           fw->size, &m3_mem->paddr,
                                           GFP_KERNEL);
                return -ENOMEM;
        }
 
+skip_m3_alloc:
        memcpy(m3_mem->vaddr, fw->data, fw->size);
        m3_mem->size = fw->size;
        release_firmware(fw);