From 64cf271ae50a42b30eeb08c9b0de30ecd6aac25a Mon Sep 17 00:00:00 2001 From: Michael McMaster Date: Thu, 30 Jan 2020 19:17:49 +1000 Subject: [PATCH] Fix for large writes and data corruption over 64k --- CHANGELOG | 6 ++++++ rtl/fpga_bitmap.o | Bin 32724 -> 32724 bytes src/firmware/config.c | 2 +- src/firmware/disk.c | 27 ++++++++++++++++++++++++--- 4 files changed, 31 insertions(+), 4 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index ef65698a..3e76dc95 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,9 @@ +20200130 6.2.15 + - Fix issue writing more than 512kb of data in one write command + (bug introduced 6.2.7) + - Fix possible data corruption bug when reading or writing more than + 64kb per command (fixed in most cases by 6.2.14) + 20200101 6.2.14 - Fix for invalid CDROM READ TOC responses (Thanks Simon Gander) - Fix for data corruption for hosts that transfer more than 64k per diff --git a/rtl/fpga_bitmap.o b/rtl/fpga_bitmap.o index e423f33392b4c62d3c09cd4ee966950fe67cd5d9..e351fea819d27606e2891c06738a8318bda2b372 100644 GIT binary patch literal 32724 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®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 diff --git a/src/firmware/config.c b/src/firmware/config.c index f2e6d1e7..929921a9 100755 --- a/src/firmware/config.c +++ b/src/firmware/config.c @@ -37,7 +37,7 @@ #include -static const uint16_t FIRMWARE_VERSION = 0x062E; +static const uint16_t FIRMWARE_VERSION = 0x062F; // Optional static config extern uint8_t* __fixed_config; diff --git a/src/firmware/disk.c b/src/firmware/disk.c index 3c562e30..f79842f0 100755 --- a/src/firmware/disk.c +++ b/src/firmware/disk.c @@ -736,8 +736,17 @@ void scsiDiskPoll() static_assert(SCSI_XFER_MAX >= sizeof(scsiDev.data), "Assumes SCSI_XFER_MAX >= sizeof(scsiDev.data)"); // Start reading and filling fifos as soon as possible. - DWT->CYCCNT = 0; // Start counting cycles - scsiSetDataCount(transfer.blocks * bytesPerSector); + // It's highly unlikely that someone is going to use huge transfers + // per scsi command, but if they do it'll be slower than usual. + // Note: Happens in Macintosh FWB HDD Toolkit benchmarks which default + // to 768kb + uint32_t totalTransferBytes = transfer.blocks * bytesPerSector; + int useSlowDataCount = totalTransferBytes >= SCSI_XFER_MAX; + if (!useSlowDataCount) + { + DWT->CYCCNT = 0; // Start counting cycles + scsiSetDataCount(totalTransferBytes); + } while ((i < totalSDSectors) && likely(scsiDev.phase == DATA_OUT) && @@ -762,6 +771,12 @@ void scsiDiskPoll() sdSpeedKBs, scsiDev.hostSpeedKBs); + if (useSlowDataCount) + { + DWT->CYCCNT = 0; // Start counting cycles + scsiSetDataCount(totalBytes); + } + uint32_t scsiBytesRead = 0; if (readAheadBytes > 0) { @@ -771,7 +786,7 @@ void scsiDiskPoll() &parityError); scsiBytesRead += readAheadBytes; - if (i == 0) + if (i == 0 && !useSlowDataCount) { uint32_t elapsedCycles = DWT->CYCCNT; @@ -864,6 +879,12 @@ void scsiDiskPoll() // do this in a half-duplex fashion. We need to write as much as // possible in each SD card transaction. // use sg_dd from sg_utils3 tools to test. + + if (useSlowDataCount) + { + scsiSetDataCount(sectors * bytesPerSector); + } + for (int scsiSector = i; scsiSector < i + sectors; ++scsiSector) { int dmaBytes = SD_SECTOR_SIZE; -- 2.38.5