From c55f6606a9a767e5e7a8b92100a9da15b9a8cbd1 Mon Sep 17 00:00:00 2001 From: Michael McMaster Date: Mon, 12 Oct 2020 20:30:30 +1000 Subject: [PATCH] Add new "blind write" option to increase write command performance. This causes issues with some SCSI hosts and is now disabled by default. --- CHANGELOG | 5 ++++- include/scsi2sd.h | 3 ++- src/firmware/config.c | 2 +- src/firmware/disk.c | 4 +++- src/scsi2sd-util6/BoardPanel.cc | 12 ++++++++++++ src/scsi2sd-util6/BoardPanel.hh | 4 +++- src/scsi2sd-util6/ConfigUtil.cc | 21 +++++++++++++++++++++ src/scsi2sd-util6/Makefile | 4 +++- 8 files changed, 49 insertions(+), 6 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index c99ebb8e..8ed88e9e 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,6 +1,9 @@ -2020xxxx 6.X.X +20201012 6.3.2 - Increase limit of READ/WRITE BUFFER command for improved compatibility SGI Iris hosts + - Add new config option to enable blind writes to improve SD card write + performance. This was previously enabled default but causes problems + with some SCSI hosts. 20200419 6.3.1 - Added checks to ensure the correct firmware version is loaded. diff --git a/include/scsi2sd.h b/include/scsi2sd.h index c5a4aaed..1176a02c 100755 --- a/include/scsi2sd.h +++ b/include/scsi2sd.h @@ -62,7 +62,8 @@ typedef enum typedef enum { - S2S_CFG_ENABLE_TERMINATOR = 1 + S2S_CFG_ENABLE_TERMINATOR = 1, + S2S_CFG_ENABLE_BLIND_WRITES = 2, } S2S_CFG_FLAGS6; typedef enum diff --git a/src/firmware/config.c b/src/firmware/config.c index 46ef3d7b..df19f9a1 100755 --- a/src/firmware/config.c +++ b/src/firmware/config.c @@ -37,7 +37,7 @@ #include -static const uint16_t FIRMWARE_VERSION = 0x0631; +static const uint16_t FIRMWARE_VERSION = 0x0632; // Optional static config extern uint8_t* __fixed_config; diff --git a/src/firmware/disk.c b/src/firmware/disk.c index f79842f0..f1fd8c86 100755 --- a/src/firmware/disk.c +++ b/src/firmware/disk.c @@ -551,7 +551,9 @@ int scsiDiskCommand() static uint32_t calcReadahead(uint32_t totalBytes, uint32_t sdSpeedKBs, uint32_t scsiSpeedKBs) { - if (scsiSpeedKBs == 0 || scsiDev.hostSpeedMeasured == 0) + if (!(scsiDev.boardCfg.flags6 & S2S_CFG_ENABLE_BLIND_WRITES) || + (scsiSpeedKBs == 0) || + (scsiDev.hostSpeedMeasured == 0)) { return totalBytes; } diff --git a/src/scsi2sd-util6/BoardPanel.cc b/src/scsi2sd-util6/BoardPanel.cc index e7a3b190..2fc645bb 100644 --- a/src/scsi2sd-util6/BoardPanel.cc +++ b/src/scsi2sd-util6/BoardPanel.cc @@ -158,6 +158,16 @@ BoardPanel::BoardPanel(wxWindow* parent, const S2S_BoardCfg& initialConfig) : myMapLunsCtrl->SetToolTip(_("Treat LUNS as IDs instead. Supports multiple drives on XEBEC S1410 SASI Bridge")); fgs->Add(myMapLunsCtrl); + + fgs->Add(new wxStaticText(this, wxID_ANY, wxT(""))); + myBlindWriteCtrl = + new wxCheckBox( + this, + ID_blindWriteCtrl, + _("Enable Blind Writes")); + myBlindWriteCtrl->SetToolTip(_("Enable writing to the SD card before all the SCSI data has been received.")); + fgs->Add(myBlindWriteCtrl); + wxBoxSizer* hbox = new wxBoxSizer(wxHORIZONTAL); hbox->Add(fgs, 1, wxALL | wxEXPAND, 15); this->SetSizer(hbox); @@ -184,6 +194,7 @@ BoardPanel::getConfig() const (myMapLunsCtrl->IsChecked() ? S2S_CFG_MAP_LUNS_TO_IDS : 0); config.flags6 = (myTermCtrl->IsChecked() ? S2S_CFG_ENABLE_TERMINATOR : 0); + config.flags6 = (myBlindWriteCtrl->IsChecked() ? S2S_CFG_ENABLE_BLIND_WRITES : 0); config.startupDelay = CtrlGetValue(myStartDelayCtrl).first; config.selectionDelay = CtrlGetValue(mySelDelayCtrl).first; @@ -200,6 +211,7 @@ BoardPanel::setConfig(const S2S_BoardCfg& config) myUnitAttCtrl->SetValue(config.flags & S2S_CFG_ENABLE_UNIT_ATTENTION); myScsi2Ctrl->SetValue(config.flags & S2S_CFG_ENABLE_SCSI2); myTermCtrl->SetValue(config.flags6 & S2S_CFG_ENABLE_TERMINATOR); + myBlindWriteCtrl->SetValue(config.flags6 & S2S_CFG_ENABLE_BLIND_WRITES); mySelLatchCtrl->SetValue(config.flags & S2S_CFG_ENABLE_SEL_LATCH); myMapLunsCtrl->SetValue(config.flags & S2S_CFG_MAP_LUNS_TO_IDS); diff --git a/src/scsi2sd-util6/BoardPanel.hh b/src/scsi2sd-util6/BoardPanel.hh index 9d419b77..a21680cd 100644 --- a/src/scsi2sd-util6/BoardPanel.hh +++ b/src/scsi2sd-util6/BoardPanel.hh @@ -60,7 +60,8 @@ private: ID_mapLunsCtrl, ID_startDelayCtrl, ID_selDelayCtrl, - ID_scsiSpeedCtrl + ID_scsiSpeedCtrl, + ID_blindWriteCtrl, }; wxWindow* myParent; @@ -73,6 +74,7 @@ private: wxCheckBox* myTermCtrl; wxCheckBox* mySelLatchCtrl; wxCheckBox* myMapLunsCtrl; + wxCheckBox* myBlindWriteCtrl; wxIntegerValidator* myDelayValidator; wxTextCtrl* myStartDelayCtrl; diff --git a/src/scsi2sd-util6/ConfigUtil.cc b/src/scsi2sd-util6/ConfigUtil.cc index 3080c332..26acaa79 100755 --- a/src/scsi2sd-util6/ConfigUtil.cc +++ b/src/scsi2sd-util6/ConfigUtil.cc @@ -384,6 +384,15 @@ ConfigUtil::toXML(const S2S_BoardCfg& config) " ********************************************************* -->\n" << " " << static_cast(config.scsiSpeed) << "\n" << + " \n" << + " " << + (config.flags6 & S2S_CFG_ENABLE_BLIND_WRITES ? "true" : "false") << + "\n" << + "\n"; return s.str(); @@ -603,6 +612,18 @@ parseBoardConfig(wxXmlNode* node) result.flags6 = result.flags & ~S2S_CFG_ENABLE_TERMINATOR; } } + else if (child->GetName() == "blindWrites") + { + std::string s(child->GetNodeContent().mb_str()); + if (s == "true") + { + result.flags6 |= S2S_CFG_ENABLE_BLIND_WRITES; + } + else + { + result.flags6 = result.flags & ~S2S_CFG_ENABLE_BLIND_WRITES; + } + } else if (child->GetName() == "selLatch") { std::string s(child->GetNodeContent().mb_str()); diff --git a/src/scsi2sd-util6/Makefile b/src/scsi2sd-util6/Makefile index 2ec65dca..70d7abb7 100755 --- a/src/scsi2sd-util6/Makefile +++ b/src/scsi2sd-util6/Makefile @@ -106,6 +106,7 @@ ifeq ($(TARGET),Darwin) CC=clang -mmacosx-version-min=10.7 CXX=clang++ -stdlib=libc++ -mmacosx-version-min=10.7 WX_CONFIG += --with-macosx-version-min=10.7 + CPPFLAGS_WXBUILD += -D__ASSERT_MACROS_DEFINE_VERSIONS_WITHOUT_UNDERSCORES=1 LIBUSB_CONFIG += --with-macosx-version-min=10.7 --disable-shared LDFLAGS_LIBUSB += -lobjc DFU-UTIL_CONFIG += --with-macosx-version-min=10.7 --disable-shared @@ -189,6 +190,7 @@ $(BUILD)/libusb/buildstamp: endif ifneq ($(USE_SYSTEM_WX),Yes) +$(OBJ): $(BUILD)/wx/buildstamp $(WXOBJ): $(BUILD)/wx/buildstamp $(EXEOBJ): $(BUILD)/wx/buildstamp ifneq ($(USE_SYSTEM_ZLIB),Yes) @@ -199,7 +201,7 @@ endif mkdir -p $(dir $@) ( \ cd $(dir $@) && \ - $(CURDIR)/wxWidgets/configure $(WX_CONFIG) CPPFLAGS="$(CPPFLAGS_ZLIB)" LDFLAGS="$(LDFLAGS_ZLIB)" && \ + $(CURDIR)/wxWidgets/configure $(WX_CONFIG) CPPFLAGS="$(CPPFLAGS_ZLIB) $(CPPFLAGS_WXBUILD)" LDFLAGS="$(LDFLAGS_ZLIB)" && \ $(MAKE) \ ) && \ touch $@ -- 2.38.5