dma_unmap_single(dev, queue->msg_token, PAGE_SIZE, DMA_BIDIRECTIONAL);
        free_page((unsigned long)queue->msgs.handle);
        queue->msgs.handle = NULL;
+
+       ibmvfc_free_event_pool(vhost, queue);
 }
 
 /**
        switch (fmt) {
        case IBMVFC_CRQ_FMT:
                fmt_size = sizeof(*queue->msgs.crq);
+               if (ibmvfc_init_event_pool(vhost, queue)) {
+                       dev_err(dev, "Couldn't initialize event pool.\n");
+                       return -ENOMEM;
+               }
                break;
        case IBMVFC_ASYNC_FMT:
                fmt_size = sizeof(*queue->msgs.async);
                goto kill_kthread;
        }
 
-       if ((rc = ibmvfc_init_event_pool(vhost, &vhost->crq))) {
-               dev_err(dev, "Couldn't initialize event pool. rc=%d\n", rc);
-               goto release_crq;
-       }
-
        if ((rc = scsi_add_host(shost, dev)))
-               goto release_event_pool;
+               goto release_crq;
 
        fc_host_dev_loss_tmo(shost) = IBMVFC_DEV_LOSS_TMO;
 
 
 remove_shost:
        scsi_remove_host(shost);
-release_event_pool:
-       ibmvfc_free_event_pool(vhost, &vhost->crq);
 release_crq:
        ibmvfc_release_crq_queue(vhost);
 kill_kthread:
        spin_unlock_irqrestore(vhost->host->host_lock, flags);
 
        ibmvfc_wait_while_resetting(vhost);
-       ibmvfc_release_crq_queue(vhost);
        kthread_stop(vhost->work_thread);
        fc_remove_host(vhost->host);
        scsi_remove_host(vhost->host);
        list_splice_init(&vhost->purge, &purge);
        spin_unlock_irqrestore(vhost->host->host_lock, flags);
        ibmvfc_complete_purge(&purge);
-       ibmvfc_free_event_pool(vhost, &vhost->crq);
+       ibmvfc_release_crq_queue(vhost);
 
        ibmvfc_free_mem(vhost);
        spin_lock(&ibmvfc_driver_lock);