if (!NCR5380_select(instance, cmd)) {
                                dsprintk(NDEBUG_MAIN, instance, "main: select complete\n");
-                               maybe_release_dma_irq(instance);
                        } else {
                                dsprintk(NDEBUG_MAIN | NDEBUG_QUEUES, instance,
                                         "main: select failed, returning %p to queue\n", cmd);
                        NCR5380_information_transfer(instance);
                        done = 0;
                }
-               if (!hostdata->connected)
+               if (!hostdata->connected) {
                        NCR5380_write(SELECT_ENABLE_REG, hostdata->id_mask);
+                       maybe_release_dma_irq(instance);
+               }
                spin_unlock_irq(&hostdata->lock);
                if (!done)
                        cond_resched();
                                         */
                                        NCR5380_write(TARGET_COMMAND_REG, 0);
 
-                                       maybe_release_dma_irq(instance);
                                        return;
                                case MESSAGE_REJECT:
                                        /* Accept message by clearing ACK */
                                        hostdata->busy[scmd_id(cmd)] &= ~(1 << cmd->device->lun);
                                        cmd->result = DID_ERROR << 16;
                                        complete_cmd(instance, cmd);
-                                       maybe_release_dma_irq(instance);
                                        return;
                                }
                                msgout = NOP;
        }
 
        queue_work(hostdata->work_q, &hostdata->main_task);
-       maybe_release_dma_irq(instance);
        spin_unlock_irqrestore(&hostdata->lock, flags);
 
        return result;
        hostdata->dma_len = 0;
 
        queue_work(hostdata->work_q, &hostdata->main_task);
-       maybe_release_dma_irq(instance);
 }
 
 /**