|
@@ -536,17 +536,33 @@ static int aac_eh_abort(struct scsi_cmnd* cmd)
|
|
break;
|
|
break;
|
|
case INQUIRY:
|
|
case INQUIRY:
|
|
case READ_CAPACITY:
|
|
case READ_CAPACITY:
|
|
- case TEST_UNIT_READY:
|
|
|
|
/* Mark associated FIB to not complete, eh handler does this */
|
|
/* Mark associated FIB to not complete, eh handler does this */
|
|
for (count = 0; count < (host->can_queue + AAC_NUM_MGT_FIB); ++count) {
|
|
for (count = 0; count < (host->can_queue + AAC_NUM_MGT_FIB); ++count) {
|
|
struct fib * fib = &aac->fibs[count];
|
|
struct fib * fib = &aac->fibs[count];
|
|
if (fib->hw_fib_va->header.XferState &&
|
|
if (fib->hw_fib_va->header.XferState &&
|
|
|
|
+ (fib->flags & FIB_CONTEXT_FLAG) &&
|
|
(fib->callback_data == cmd)) {
|
|
(fib->callback_data == cmd)) {
|
|
fib->flags |= FIB_CONTEXT_FLAG_TIMED_OUT;
|
|
fib->flags |= FIB_CONTEXT_FLAG_TIMED_OUT;
|
|
cmd->SCp.phase = AAC_OWNER_ERROR_HANDLER;
|
|
cmd->SCp.phase = AAC_OWNER_ERROR_HANDLER;
|
|
ret = SUCCESS;
|
|
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;
|
|
return ret;
|
|
}
|
|
}
|
|
@@ -569,6 +585,7 @@ static int aac_eh_reset(struct scsi_cmnd* cmd)
|
|
for (count = 0; count < (host->can_queue + AAC_NUM_MGT_FIB); ++count) {
|
|
for (count = 0; count < (host->can_queue + AAC_NUM_MGT_FIB); ++count) {
|
|
struct fib * fib = &aac->fibs[count];
|
|
struct fib * fib = &aac->fibs[count];
|
|
if (fib->hw_fib_va->header.XferState &&
|
|
if (fib->hw_fib_va->header.XferState &&
|
|
|
|
+ (fib->flags & FIB_CONTEXT_FLAG) &&
|
|
(fib->callback_data == cmd)) {
|
|
(fib->callback_data == cmd)) {
|
|
fib->flags |= FIB_CONTEXT_FLAG_TIMED_OUT;
|
|
fib->flags |= FIB_CONTEXT_FLAG_TIMED_OUT;
|
|
cmd->SCp.phase = AAC_OWNER_ERROR_HANDLER;
|
|
cmd->SCp.phase = AAC_OWNER_ERROR_HANDLER;
|