From 404909f7c7ebb7082431df3d010a86ad577d03ee Mon Sep 17 00:00:00 2001 From: Michael McMaster Date: Tue, 11 May 2021 23:10:36 +1000 Subject: [PATCH] Improve IRQ handler responsiveness --- src/firmware/config.c | 2 +- src/firmware/disk.c | 25 ++++++++++++++++--------- src/firmware/scsiPhy.c | 18 ++++++++++++------ 3 files changed, 29 insertions(+), 16 deletions(-) diff --git a/src/firmware/config.c b/src/firmware/config.c index 7a512a9b..a016f6fc 100755 --- a/src/firmware/config.c +++ b/src/firmware/config.c @@ -36,7 +36,7 @@ #include -static const uint16_t FIRMWARE_VERSION = 0x0644; +static const uint16_t FIRMWARE_VERSION = 0x0645; // Optional static config extern uint8_t* __fixed_config; diff --git a/src/firmware/disk.c b/src/firmware/disk.c index a0bcf491..26962d93 100755 --- a/src/firmware/disk.c +++ b/src/firmware/disk.c @@ -657,7 +657,8 @@ void scsiDiskPoll() } } - if ((prep - i) > 0) + if (((prep - i) > 0) && + scsiFifoReady()) { int dmaBytes = SD_SECTOR_SIZE; if ((i % sdPerScsi) == (sdPerScsi - 1)) @@ -679,20 +680,26 @@ void scsiDiskPoll() phaseChangeDelayUs = 0; } + // Wait for the SD transfer to complete before we disable IRQs. + // (Otherwise some cards will cause an error if we don't sent the + // stop transfer command via the DMA complete handler in time) + while (HAL_SD_GetState(&hsd) == HAL_SD_STATE_BUSY) + { + // Wait while keeping BSY. + } + // We've finished transferring the data to the FPGA, now wait until it's // written to he SCSI bus. - __disable_irq(); while (!scsiPhyComplete() && likely(scsiDev.phase == DATA_IN) && likely(!scsiDev.resetFlag)) { - __WFI(); - } - __enable_irq(); - - while (HAL_SD_GetState(&hsd) == HAL_SD_STATE_BUSY) - { - // Wait while keeping BSY. + __disable_irq(); + if (!scsiPhyComplete() && likely(!scsiDev.resetFlag)) + { + __WFI(); + } + __enable_irq(); } if (scsiDev.phase == DATA_IN) diff --git a/src/firmware/scsiPhy.c b/src/firmware/scsiPhy.c index b7b55e02..684887dc 100755 --- a/src/firmware/scsiPhy.c +++ b/src/firmware/scsiPhy.c @@ -329,12 +329,15 @@ scsiRead(uint8_t* data, uint32_t count, int* parityError) scsiReadPIO(data + i, chunk, parityError); - __disable_irq(); while (!scsiPhyComplete() && likely(!scsiDev.resetFlag)) { - __WFI(); + __disable_irq(); + if (!scsiPhyComplete() && likely(!scsiDev.resetFlag)) + { + __WFI(); + } + __enable_irq(); } - __enable_irq(); i += chunk; } @@ -479,12 +482,15 @@ scsiWrite(const uint8_t* data, uint32_t count) scsiWritePIO(data + i, chunk); - __disable_irq(); while (!scsiPhyComplete() && likely(!scsiDev.resetFlag)) { - __WFI(); + __disable_irq(); + if (!scsiPhyComplete() && likely(!scsiDev.resetFlag)) + { + __WFI(); + } + __enable_irq(); } - __enable_irq(); i += chunk; } -- 2.38.5