#include <linux/blkdev.h>
 #include <asm/uaccess.h>
 #include <asm/io.h>
+#include <linux/completion.h>
 #include <linux/delay.h>
 #include <linux/proc_fs.h>
 #include <linux/reboot.h>
 
        scb->idx = CMDID_INT_CMDS;
 
-       scmd->state = 0;
-
        /*
         * Get the lock only if the caller has not acquired it already
         */
 
        if( ls == LOCK_INT ) spin_unlock_irqrestore(&adapter->lock, flags);
 
-       /*
-        * Wait till this command finishes. Do not use
-        * wait_event_interruptible(). It causes panic if CTRL-C is hit when
-        * dumping e.g., physical disk information through /proc interface.
-        */
-#if 0
-       wait_event_interruptible(adapter->int_waitq, scmd->state);
-#endif
-       wait_event(adapter->int_waitq, scmd->state);
+       wait_for_completion(&adapter->int_waitq);
 
        rval = scmd->result;
        mc->status = scmd->result;
 
        adapter = (adapter_t *)scmd->device->host->hostdata;
 
-       scmd->state = 1; /* thread waiting for its command to complete */
-
-       /*
-        * See comment in mega_internal_command() routine for
-        * wait_event_interruptible()
-        */
-#if 0
-       wake_up_interruptible(&adapter->int_waitq);
-#endif
-       wake_up(&adapter->int_waitq);
+       complete(&adapter->int_waitq);
 
 }
 
        }
                
        init_MUTEX(&adapter->int_mtx);
-       init_waitqueue_head(&adapter->int_waitq);
+       init_completion(&adapter->int_waitq);
 
        adapter->this_id = DEFAULT_INITIATOR_ID;
        adapter->host->this_id = DEFAULT_INITIATOR_ID;
 
        Scsi_Cmnd               int_scmd;
        struct semaphore        int_mtx;        /* To synchronize the internal
                                                commands */
-       wait_queue_head_t       int_waitq;      /* wait queue for internal
+       struct completion       int_waitq;      /* wait queue for internal
                                                 cmds */
 
        int     has_cluster;    /* cluster support on this HBA */
 
 
                memset(cmd, 0, sizeof(*cmd));
                cmd->device = dev;
-               cmd->state = SCSI_STATE_UNUSED;
                init_timer(&cmd->eh_timeout);
                INIT_LIST_HEAD(&cmd->list);
                spin_lock_irqsave(&dev->list_lock, flags);
         * We will use a queued command if possible, otherwise we will
         * emulate the queuing and calling of completion function ourselves.
         */
-
-       cmd->state = SCSI_STATE_QUEUED;
-
        atomic_inc(&cmd->device->iorequest_cnt);
 
        /*
         * Set the serial numbers back to zero
         */
        cmd->serial_number = 0;
-       cmd->state = SCSI_STATE_BHQUEUE;
 
        atomic_inc(&cmd->device->iodone_cnt);
        if (cmd->result)
        SCSI_LOG_MLCOMPLETE(4, printk("Notifying upper driver of completion "
                                "for device %d %x\n", sdev->id, cmd->result));
 
-       cmd->state = SCSI_STATE_FINISHED;
-
        /*
         * We can get here with use_sg=0, causing a panic in the upper level
         */
 
        spin_lock_irqsave(shost->host_lock, flags);
 
        scsi_eh_eflags_set(scmd, eh_flag);
-       /*
-        * FIXME: Can we stop setting owner and state.
-        */
-       scmd->state = SCSI_STATE_FAILED;
        list_add_tail(&scmd->eh_entry, &shost->eh_cmd_q);
        set_bit(SHOST_RECOVERY, &shost->shost_state);
        shost->host_failed++;
                               struct list_head *done_q)
 {
        scmd->device->host->host_failed--;
-       scmd->state = SCSI_STATE_BHQUEUE;
-
        scsi_eh_eflags_clr_all(scmd);
 
        /*
        scmd->request = &req;
        memset(&scmd->eh_timeout, 0, sizeof(scmd->eh_timeout));
        scmd->request->rq_status        = RQ_SCSI_BUSY;
-       scmd->state                     = SCSI_STATE_INITIALIZING;
 
        memset(&scmd->cmnd, '\0', sizeof(scmd->cmnd));
     
 
        else if (reason == SCSI_MLQUEUE_DEVICE_BUSY)
                device->device_blocked = device->max_device_blocked;
 
-       /*
-        * Register the fact that we own the thing for now.
-        */
-       cmd->state = SCSI_STATE_MLQUEUE;
-
        /*
         * Decrement the counters, since these commands are no longer
         * active on the host/device.
 
        int     sc_magic;
 
        struct scsi_device *device;
-       unsigned short state;
        struct scsi_request *sc_request;
 
        struct list_head list;  /* scsi_cmnd participates in queue lists */