diff options
author | Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk> | 2024-01-12 12:53:14 +0000 |
---|---|---|
committer | Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk> | 2024-02-13 19:37:27 +0000 |
commit | 68ef41fb13ac8739cf689bbf731d4a435b3bdfe7 (patch) | |
tree | 5958a6c065ea5de37e70f0ec88a7508a1131ba3f /hw/scsi | |
parent | c5bd505524303bd8cb9eaf5d44ca7e1713d27f90 (diff) | |
download | qemu-68ef41fb13ac8739cf689bbf731d4a435b3bdfe7.zip qemu-68ef41fb13ac8739cf689bbf731d4a435b3bdfe7.tar.gz qemu-68ef41fb13ac8739cf689bbf731d4a435b3bdfe7.tar.bz2 |
esp.c: ensure that the PDMA callback is called for every device read
Rather than wait for the FIFO to fill up before calling the PDMA callback, push
that logic directly into the from_device logic in do_dma_pdma_cb().
Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
Tested-by: Helge Deller <deller@gmx.de>
Tested-by: Thomas Huth <thuth@redhat.com>
Message-Id: <20240112125420.514425-23-mark.cave-ayland@ilande.co.uk>
Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
Diffstat (limited to 'hw/scsi')
-rw-r--r-- | hw/scsi/esp.c | 8 |
1 files changed, 3 insertions, 5 deletions
diff --git a/hw/scsi/esp.c b/hw/scsi/esp.c index 06be9f2..d80a38d 100644 --- a/hw/scsi/esp.c +++ b/hw/scsi/esp.c @@ -625,14 +625,14 @@ static void do_dma_pdma_cb(ESPState *s) return; } else { - if (s->async_len == 0) { + if (s->async_len == 0 && fifo8_num_used(&s->fifo) < 2) { /* Defer until the scsi layer has completed */ scsi_req_continue(s->current_req); s->data_in_ready = false; return; } - if (esp_get_tc(s) == 0) { + if (esp_get_tc(s) == 0 && fifo8_num_used(&s->fifo) < 2) { esp_lower_drq(s); esp_dma_done(s); } @@ -1419,9 +1419,7 @@ static uint64_t sysbus_esp_pdma_read(void *opaque, hwaddr addr, val = (val << 8) | esp_pdma_read(s); break; } - if (fifo8_num_used(&s->fifo) < 2) { - esp_pdma_cb(s); - } + esp_pdma_cb(s); return val; } |