scsidevice: add get_more_data() method.

It is required for supporting large data transfers split
into multiple chunks.
This commit is contained in:
Maxim Poliakovski 2023-12-08 11:05:03 +01:00
parent e1b231882e
commit bf278af950
4 changed files with 16 additions and 1 deletions

View File

@ -180,6 +180,7 @@ public:
// ScsiDevice methods
void notify(ScsiMsg msg_type, int param);
bool prepare_data() { return false; };
bool get_more_data() { return false; };
bool has_data() { return this->data_fifo_pos != 0; };
int send_data(uint8_t* dst_ptr, int count);
void process_command() {};

View File

@ -183,6 +183,7 @@ public:
virtual int rcv_data(const uint8_t* src_ptr, const int count);
virtual bool prepare_data() = 0;
virtual bool get_more_data() = 0;
virtual void process_command() = 0;
void set_bus_object_ptr(ScsiBus *bus_obj_ptr) {

View File

@ -113,7 +113,7 @@ void ScsiDevice::prepare_xfer(ScsiBus* bus_obj, int& bytes_in, int& bytes_out)
switch (this->cur_phase) {
case ScsiPhase::COMMAND:
this->data_ptr = this->cmd_buf;
this->data_size = 0; //bytes_in;
this->data_size = 0;
bytes_out = 0;
break;
case ScsiPhase::STATUS:
@ -189,6 +189,18 @@ int ScsiDevice::send_data(uint8_t* dst_ptr, const int count)
this->data_ptr += actual_count;
this->data_size -= actual_count;
// attempt to return the requested amount of data
// when data_size drops down to zero
if (!this->data_size) {
if (this->get_more_data() && count > actual_count) {
dst_ptr += actual_count;
actual_count = std::min(this->data_size, count - actual_count);
std::memcpy(dst_ptr, this->data_ptr, actual_count);
this->data_ptr += actual_count;
this->data_size -= actual_count;
}
}
return actual_count;
}

View File

@ -43,6 +43,7 @@ public:
void insert_image(std::string filename);
void process_command();
bool prepare_data();
bool get_more_data() { return false; };
protected:
int test_unit_ready();