From bf5289d30e181704c6993c63c88e286bac832127 Mon Sep 17 00:00:00 2001 From: Uwe Seimet Date: Wed, 25 Aug 2021 08:21:19 +0200 Subject: [PATCH] Maintain list of supported block sizes --- src/raspberrypi/devices/device_factory.cpp | 13 ++++++++++--- src/raspberrypi/devices/disk.cpp | 7 +++---- src/raspberrypi/devices/disk.h | 6 ++++-- src/raspberrypi/rascsi.cpp | 10 ++++++++-- src/raspberrypi/rascsi_interface.proto | 4 ++-- src/raspberrypi/rasctl.cpp | 14 +++++++++++--- 6 files changed, 38 insertions(+), 16 deletions(-) diff --git a/src/raspberrypi/devices/device_factory.cpp b/src/raspberrypi/devices/device_factory.cpp index 518509d6..2a9f4e99 100644 --- a/src/raspberrypi/devices/device_factory.cpp +++ b/src/raspberrypi/devices/device_factory.cpp @@ -15,6 +15,7 @@ #include "scsi_host_bridge.h" #include "scsi_daynaport.h" #include "device_factory.h" +#include using namespace std; using namespace rascsi_interface; @@ -44,8 +45,13 @@ Device *DeviceFactory::CreateDevice(PbDeviceType& type, const string& filename, } } - Device *device = NULL; + vector sector_sizes; + sector_sizes.push_back(512); + sector_sizes.push_back(1024); + sector_sizes.push_back(2048); + sector_sizes.push_back(4096); + Device *device = NULL; switch (type) { case SAHD: device = new SASIHD(); @@ -58,7 +64,7 @@ Device *DeviceFactory::CreateDevice(PbDeviceType& type, const string& filename, } else { device = new SCSIHD(); device->SetProtectable(true); - ((Disk *)device)->SetSectorSizeConfigurable(true); + ((Disk *)device)->SetSectorSizes(sector_sizes); } break; @@ -67,7 +73,8 @@ Device *DeviceFactory::CreateDevice(PbDeviceType& type, const string& filename, device = new SCSIHD(true); device->SetProtectable(true); device->SetLockable(true); - ((Disk *)device)->SetSectorSizeConfigurable(true); + device->SetProtectable(true); + ((Disk *)device)->SetSectorSizes(sector_sizes); break; case SCMO: diff --git a/src/raspberrypi/devices/disk.cpp b/src/raspberrypi/devices/disk.cpp index 06bbd14d..73d58b8c 100644 --- a/src/raspberrypi/devices/disk.cpp +++ b/src/raspberrypi/devices/disk.cpp @@ -424,7 +424,6 @@ void Disk::ReadDefectData10(SASIDEV *controller) Disk::Disk(const std::string id) : Device(id), PrimaryDevice(), BlockDevice() { // Work initialization - sector_size_configurable = false; configured_sector_size = 0; disk.size = 0; disk.blocks = 0; @@ -1765,12 +1764,12 @@ void Disk::SetSectorSize(int size) bool Disk::IsSectorSizeConfigurable() const { - return sector_size_configurable; + return !sector_sizes.empty(); } -void Disk::SetSectorSizeConfigurable(bool sector_size_configurable) +void Disk::SetSectorSizes(const vector& sector_sizes) { - this->sector_size_configurable = sector_size_configurable; + this->sector_sizes = sector_sizes; } int Disk::GetConfiguredSectorSize() const diff --git a/src/raspberrypi/devices/disk.h b/src/raspberrypi/devices/disk.h index aa0775fb..786ad512 100644 --- a/src/raspberrypi/devices/disk.h +++ b/src/raspberrypi/devices/disk.h @@ -28,6 +28,7 @@ #include "file_support.h" #include "filepath.h" #include +#include #include class Disk : public Device, public PrimaryDevice, public BlockDevice @@ -35,7 +36,7 @@ class Disk : public Device, public PrimaryDevice, public BlockDevice private: enum access_mode { RW6, RW10, RW16 }; - bool sector_size_configurable; + vector sector_sizes; int configured_sector_size; SASIDEV::ctrl_t *ctrl; @@ -125,7 +126,8 @@ public: int GetSectorSize() const; void SetSectorSize(int); bool IsSectorSizeConfigurable() const; - void SetSectorSizeConfigurable(bool); + vector GetSectorSizes() const; + void SetSectorSizes(const vector&); int GetConfiguredSectorSize() const; void SetConfiguredSectorSize(int); uint32_t GetBlockCount() const; diff --git a/src/raspberrypi/rascsi.cpp b/src/raspberrypi/rascsi.cpp index e88ac060..d8252390 100644 --- a/src/raspberrypi/rascsi.cpp +++ b/src/raspberrypi/rascsi.cpp @@ -552,20 +552,26 @@ void GetDeviceTypeFeatures(PbServerInfo& serverInfo) features->set_supports_file(true); types_features = serverInfo.add_types_features(); + types_features->add_block_sizes(512); + types_features->add_block_sizes(1024); + types_features->add_block_sizes(2048); + types_features->add_block_sizes(4096); features = types_features->add_features(); types_features->set_type(SCHD); features->set_protectable(true); features->set_supports_file(true); - features->set_supports_block_size(true); types_features = serverInfo.add_types_features(); + types_features->add_block_sizes(512); + types_features->add_block_sizes(1024); + types_features->add_block_sizes(2048); + types_features->add_block_sizes(4096); features = types_features->add_features(); types_features->set_type(SCRM); features->set_protectable(true); features->set_removable(true); features->set_lockable(true); features->set_supports_file(true); - features->set_supports_block_size(true); types_features = serverInfo.add_types_features(); features = types_features->add_features(); diff --git a/src/raspberrypi/rascsi_interface.proto b/src/raspberrypi/rascsi_interface.proto index b54be04d..c49cdece 100644 --- a/src/raspberrypi/rascsi_interface.proto +++ b/src/raspberrypi/rascsi_interface.proto @@ -61,8 +61,6 @@ message PbDeviceFeatures { bool lockable = 4; // Device supports image file bool supports_file = 5; - // Device supports configurable block size - bool supports_block_size = 6; } // The status of a device @@ -79,6 +77,8 @@ message PbDeviceStatus { message PbDeviceTypeFeatures { PbDeviceType type = 1; repeated PbDeviceFeatures features = 2; + // List of supported block sizes + repeated uint32 block_sizes = 6; } // The image file data diff --git a/src/raspberrypi/rasctl.cpp b/src/raspberrypi/rasctl.cpp index 7a1862b5..df0af043 100644 --- a/src/raspberrypi/rasctl.cpp +++ b/src/raspberrypi/rasctl.cpp @@ -236,15 +236,23 @@ void CommandServerInfo(const string& hostname, int port) if (features.supports_file()) { cout << " Image file support"; } - if (features.supports_block_size()) { - cout << " Block size configurable"; - } cout << endl; } } else { cout << endl; } + + if (type_features.block_sizes_size()) { + cout << " Supported block sizes: "; + for (int j = 0; j < type_features.block_sizes_size(); j++) { + if (j) { + cout << ", "; + } + cout << type_features.block_sizes(j); + } + cout << endl; + } } cout << "Available devices:" << endl;