*      each I/O
         */
        fibptr->hw_fib_va->header.XferState = 0;
+       fibptr->flags = 0;
        fibptr->callback = NULL;
        fibptr->callback_data = NULL;
 
         *      will have a debug mode where the adapter can notify the host
         *      it had a problem and the host can log that fact.
         */
+       fibptr->flags = 0;
        if (wait && !reply) {
                return -EINVAL;
        } else if (!wait && reply) {
        if (!wait) {
                fibptr->callback = callback;
                fibptr->callback_data = callback_data;
+               fibptr->flags = FIB_CONTEXT_FLAG;
        }
 
        fibptr->done = 0;
-       fibptr->flags = 0;
 
        FIB_COUNTER_INCREMENT(aac_config.FibsSent);
 
 
                         *      NOTE:  we cannot touch the fib after this
                         *          call, because it may have been deallocated.
                         */
+                       fib->flags = 0;
                        fib->callback(fib->callback_data, fib);
                } else {
                        unsigned long flagv;
  *     all QE there are and wake up all the waiters before exiting.
  */
 
-unsigned int aac_intr_normal(struct aac_dev *dev, u32 index)
+unsigned int aac_intr_normal(struct aac_dev * dev, u32 index)
 {
        dprintk((KERN_INFO "aac_intr_normal(%p,%x)\n", dev, index));
        if ((index & 0x00000002L)) {
                         *      NOTE:  we cannot touch the fib after this
                         *          call, because it may have been deallocated.
                         */
+                       fib->flags = 0;
                        fib->callback(fib->callback_data, fib);
                } else {
                        unsigned long flagv;
 
                        break;
        case INQUIRY:
        case READ_CAPACITY:
-       case TEST_UNIT_READY:
                /* Mark associated FIB to not complete, eh handler does this */
                for (count = 0; count < (host->can_queue + AAC_NUM_MGT_FIB); ++count) {
                        struct fib * fib = &aac->fibs[count];
                        if (fib->hw_fib_va->header.XferState &&
+                         (fib->flags & FIB_CONTEXT_FLAG) &&
                          (fib->callback_data == cmd)) {
                                fib->flags |= FIB_CONTEXT_FLAG_TIMED_OUT;
                                cmd->SCp.phase = AAC_OWNER_ERROR_HANDLER;
                                ret = SUCCESS;
                        }
                }
+               break;
+       case TEST_UNIT_READY:
+               /* Mark associated FIB to not complete, eh handler does this */
+               for (count = 0; count < (host->can_queue + AAC_NUM_MGT_FIB); ++count) {
+                       struct scsi_cmnd * command;
+                       struct fib * fib = &aac->fibs[count];
+                       if ((fib->hw_fib_va->header.XferState & cpu_to_le32(Async | NoResponseExpected)) &&
+                         (fib->flags & FIB_CONTEXT_FLAG) &&
+                         ((command = fib->callback_data)) &&
+                         (command->device == cmd->device)) {
+                               fib->flags |= FIB_CONTEXT_FLAG_TIMED_OUT;
+                               command->SCp.phase = AAC_OWNER_ERROR_HANDLER;
+                               if (command == cmd)
+                                       ret = SUCCESS;
+                       }
+               }
        }
        return ret;
 }
        for (count = 0; count < (host->can_queue + AAC_NUM_MGT_FIB); ++count) {
                struct fib * fib = &aac->fibs[count];
                if (fib->hw_fib_va->header.XferState &&
+                 (fib->flags & FIB_CONTEXT_FLAG) &&
                  (fib->callback_data == cmd)) {
                        fib->flags |= FIB_CONTEXT_FLAG_TIMED_OUT;
                        cmd->SCp.phase = AAC_OWNER_ERROR_HANDLER;