struct scsi_cmnd *cmd;
 
        cmd = scb->io_ctx;
-       ahd_sync_sglist(ahd, scb, BUS_DMASYNC_POSTWRITE);
-       scsi_dma_unmap(cmd);
+       if (cmd) {
+               ahd_sync_sglist(ahd, scb, BUS_DMASYNC_POSTWRITE);
+               scsi_dma_unmap(cmd);
+       }
 }
 
 /******************************** Macros **************************************/
 
        tinfo = ahd_fetch_transinfo(ahd, 'A', ahd->our_id,
                                    cmd->device->id, &tstate);
-       reset_scb->io_ctx = cmd;
+       reset_scb->io_ctx = NULL;
        reset_scb->platform_data->dev = dev;
        reset_scb->sg_count = 0;
        ahd_set_residual(reset_scb, 0);
        dev = scb->platform_data->dev;
        dev->active--;
        dev->openings++;
-       if ((cmd->result & (CAM_DEV_QFRZN << 16)) != 0) {
-               cmd->result &= ~(CAM_DEV_QFRZN << 16);
-               dev->qfrozen--;
+       if (cmd) {
+               if ((cmd->result & (CAM_DEV_QFRZN << 16)) != 0) {
+                       cmd->result &= ~(CAM_DEV_QFRZN << 16);
+                       dev->qfrozen--;
+               }
+       } else if (scb->flags & SCB_DEVICE_RESET) {
+               if (ahd->platform_data->eh_done)
+                       complete(ahd->platform_data->eh_done);
+               ahd_free_scb(ahd, scb);
+               return;
        }
        ahd_linux_unmap_scb(ahd, scb);