static void qlcnic_free_adapter_resources(struct qlcnic_adapter *adapter)
 {
+       struct qlcnic_fw_dump *fw_dump = &adapter->ahw->fw_dump;
+
        kfree(adapter->recv_ctx);
        adapter->recv_ctx = NULL;
 
-       if (adapter->ahw->fw_dump.tmpl_hdr) {
-               vfree(adapter->ahw->fw_dump.tmpl_hdr);
-               adapter->ahw->fw_dump.tmpl_hdr = NULL;
+       if (fw_dump->tmpl_hdr) {
+               vfree(fw_dump->tmpl_hdr);
+               fw_dump->tmpl_hdr = NULL;
+       }
+
+       if (fw_dump->dma_buffer) {
+               dma_free_coherent(&adapter->pdev->dev, QLC_PEX_DMA_READ_SIZE,
+                                 fw_dump->dma_buffer, fw_dump->phys_addr);
+               fw_dump->dma_buffer = NULL;
        }
 
        kfree(adapter->ahw->reset.buff);
 
 #define QLC_DMA_CMD_BUFF_ADDR_HI       4
 #define QLC_DMA_CMD_STATUS_CTRL                8
 
-#define QLC_PEX_DMA_READ_SIZE          (PAGE_SIZE * 16)
-
 static int qlcnic_start_pex_dma(struct qlcnic_adapter *adapter,
                                struct __mem *mem)
 {
        u32 version, csum, *tmp_buf;
        u8 use_flash_temp = 0;
        u32 temp_size = 0;
+       void *temp_buffer;
        int err;
 
        ahw = adapter->ahw;
 
        qlcnic_cache_tmpl_hdr_values(adapter, fw_dump);
 
+       if (fw_dump->use_pex_dma) {
+               fw_dump->dma_buffer = NULL;
+               temp_buffer = dma_alloc_coherent(&adapter->pdev->dev,
+                                                QLC_PEX_DMA_READ_SIZE,
+                                                &fw_dump->phys_addr,
+                                                GFP_KERNEL);
+               if (!temp_buffer)
+                       fw_dump->use_pex_dma = false;
+               else
+                       fw_dump->dma_buffer = temp_buffer;
+       }
+
+
        dev_info(&adapter->pdev->dev,
                 "Default minidump capture mask 0x%x\n",
                 fw_dump->cap_mask);
        struct device *dev = &adapter->pdev->dev;
        struct qlcnic_hardware_context *ahw;
        struct qlcnic_dump_entry *entry;
-       void *temp_buffer, *tmpl_hdr;
+       void *tmpl_hdr;
        u32 ocm_window;
        __le32 *buffer;
        char mesg[64];
        qlcnic_set_sys_info(adapter, tmpl_hdr, 0, QLCNIC_DRIVER_VERSION);
        qlcnic_set_sys_info(adapter, tmpl_hdr, 1, adapter->fw_version);
 
-       if (fw_dump->use_pex_dma) {
-               temp_buffer = dma_alloc_coherent(dev, QLC_PEX_DMA_READ_SIZE,
-                                                &fw_dump->phys_addr,
-                                                GFP_KERNEL);
-               if (!temp_buffer)
-                       fw_dump->use_pex_dma = false;
-               else
-                       fw_dump->dma_buffer = temp_buffer;
-       }
-
        if (qlcnic_82xx_check(adapter)) {
                ops_cnt = ARRAY_SIZE(qlcnic_fw_dump_ops);
                fw_dump_ops = qlcnic_fw_dump_ops;
        /* Send a udev event to notify availability of FW dump */
        kobject_uevent_env(&dev->kobj, KOBJ_CHANGE, msg);
 
-       if (fw_dump->use_pex_dma)
-               dma_free_coherent(dev, QLC_PEX_DMA_READ_SIZE,
-                                 fw_dump->dma_buffer, fw_dump->phys_addr);
-
        return 0;
 }