From bee782234a0797a2df043ec8f6c32c2984c77cf3 Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Sat, 7 Sep 2019 13:17:34 -0400 Subject: [PATCH] Ensures no state transitions while acknowledge is still asserted. --- Storage/MassStorage/SCSI/Target.hpp | 10 ++++++++-- .../MassStorage/SCSI/TargetImplementation.hpp | 18 +++++++++++------- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/Storage/MassStorage/SCSI/Target.hpp b/Storage/MassStorage/SCSI/Target.hpp index 3977a1dff..5a8d8f618 100644 --- a/Storage/MassStorage/SCSI/Target.hpp +++ b/Storage/MassStorage/SCSI/Target.hpp @@ -83,11 +83,17 @@ struct Responder { Terminates a SCSI command, sending the proper sequence of status and message phases. */ void terminate_command(Status status) { - send_message(Target::Responder::Message::CommandComplete, [status] (const Target::CommandState &state, Target::Responder &responder) { - responder.send_status(status, [] (const Target::CommandState &state, Target::Responder &responder) { + send_status(status, [] (const Target::CommandState &state, Target::Responder &responder) { + responder.send_message(Target::Responder::Message::CommandComplete, [] (const Target::CommandState &state, Target::Responder &responder) { responder.end_command(); }); }); + +// send_message(Target::Responder::Message::CommandComplete, [status] (const Target::CommandState &state, Target::Responder &responder) { +// responder.send_status(status, [] (const Target::CommandState &state, Target::Responder &responder) { +// responder.end_command(); +// }); +// }); } }; diff --git a/Storage/MassStorage/SCSI/TargetImplementation.hpp b/Storage/MassStorage/SCSI/TargetImplementation.hpp index 51ed40519..40eb4ec29 100644 --- a/Storage/MassStorage/SCSI/TargetImplementation.hpp +++ b/Storage/MassStorage/SCSI/TargetImplementation.hpp @@ -98,12 +98,13 @@ template void Target::scsi_bus_did_change(Bus *, B data_[data_pointer_] = uint8_t(new_state); ++data_pointer_; - if(data_pointer_ == data_.size()) { - next_function_(CommandState(command_), *this); - } break; case 0: + if(data_pointer_ == data_.size()) { + next_function_(CommandState(command_), *this); + } + bus_state_ |= Line::Request; break; } @@ -119,16 +120,17 @@ template void Target::scsi_bus_did_change(Bus *, B ++data_pointer_; printf("DP: %zu\n", data_pointer_); + break; + + case 0: if( - phase_ == Phase::SendingMessage || - phase_ == Phase::SendingStatus || + (phase_ == Phase::SendingMessage && data_pointer_ == 1) || + (phase_ == Phase::SendingStatus && data_pointer_ == 1) || (phase_ == Phase::SendingData && data_pointer_ == data_.size()) ) { next_function_(CommandState(command_), *this); } - break; - case 0: bus_state_ |= Line::Request; bus_state_ &= ~0xff; @@ -238,6 +240,7 @@ template void Target::send_status(Status status, c phase_ = Phase::SendingStatus; next_function_ = next; + data_pointer_ = 0; set_device_output(bus_state_); } @@ -250,6 +253,7 @@ template void Target::send_message(Message message phase_ = Phase::SendingMessage; next_function_ = next; + data_pointer_ = 0; set_device_output(bus_state_); }