From 0d17ce82128c62e7f707a72a6dc7d21ba0a0b980 Mon Sep 17 00:00:00 2001 From: Mark Cave-Ayland Date: Fri, 12 Jan 2024 12:54:10 +0000 Subject: esp.c: consolidate DMA and PDMA logic in DATA OUT phase This allows the removal of duplicate logic shared between the two implementations. Note that we restrict esp_raise_drq() to PDMA to help reduce the log verbosity for normal DMA. Signed-off-by: Mark Cave-Ayland Tested-by: Helge Deller Tested-by: Thomas Huth Message-Id: <20240112125420.514425-79-mark.cave-ayland@ilande.co.uk> Signed-off-by: Mark Cave-Ayland --- hw/scsi/esp.c | 35 ++++++++++++----------------------- 1 file changed, 12 insertions(+), 23 deletions(-) (limited to 'hw/scsi/esp.c') diff --git a/hw/scsi/esp.c b/hw/scsi/esp.c index d63039af89..394774c379 100644 --- a/hw/scsi/esp.c +++ b/hw/scsi/esp.c @@ -521,40 +521,29 @@ static void esp_do_dma(ESPState *s) if (len > s->async_len) { len = s->async_len; } + if (s->dma_memory_read) { s->dma_memory_read(s->dma_opaque, s->async_buf, len); - esp_set_tc(s, esp_get_tc(s) - len); - s->async_buf += len; - s->async_len -= len; - s->ti_size += len; - - if (s->async_len == 0 && fifo8_num_used(&s->fifo) < 2) { - /* Defer until the scsi layer has completed */ - scsi_req_continue(s->current_req); - return; - } - - esp_dma_ti_check(s); } else { /* Copy FIFO data to device */ len = MIN(s->async_len, ESP_FIFO_SZ); len = MIN(len, fifo8_num_used(&s->fifo)); - n = esp_fifo_pop_buf(&s->fifo, s->async_buf, len); - s->async_buf += n; - s->async_len -= n; - s->ti_size += n; - + len = esp_fifo_pop_buf(&s->fifo, s->async_buf, len); esp_raise_drq(s); + } - if (s->async_len == 0 && fifo8_num_used(&s->fifo) < 2) { - /* Defer until the scsi layer has completed */ - scsi_req_continue(s->current_req); - return; - } + s->async_buf += len; + s->async_len -= len; + s->ti_size += len; - esp_dma_ti_check(s); + if (s->async_len == 0 && fifo8_num_used(&s->fifo) < 2) { + /* Defer until the scsi layer has completed */ + scsi_req_continue(s->current_req); + return; } + + esp_dma_ti_check(s); break; case STAT_DI: -- cgit v1.2.3