Skip to content

Commit

Permalink
esp.c: consolidate DMA and PDMA logic in DATA IN phase
Browse files Browse the repository at this point in the history
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 <mark.cave-ayland@ilande.co.uk>
Tested-by: Helge Deller <deller@gmx.de>
Tested-by: Thomas Huth <thuth@redhat.com>
Message-Id: <20240112125420.514425-80-mark.cave-ayland@ilande.co.uk>
Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
  • Loading branch information
mcayland committed Feb 13, 2024
1 parent 0d17ce8 commit c37cc88
Showing 1 changed file with 17 additions and 34 deletions.
51 changes: 17 additions & 34 deletions hw/scsi/esp.c
Original file line number Diff line number Diff line change
Expand Up @@ -557,51 +557,34 @@ static void esp_do_dma(ESPState *s)
if (len > s->async_len) {
len = s->async_len;
}

if (s->dma_memory_write) {
s->dma_memory_write(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 && s->ti_size == 0 && esp_get_tc(s)) {
/* If the guest underflows TC then terminate SCSI request */
scsi_req_continue(s->current_req);
return;
}

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 device data to FIFO */
len = MIN(len, fifo8_num_free(&s->fifo));
fifo8_push_all(&s->fifo, s->async_buf, len);
s->async_buf += len;
s->async_len -= len;
s->ti_size -= len;
esp_set_tc(s, esp_get_tc(s) - len);
esp_raise_drq(s);
}

if (s->async_len == 0 && s->ti_size == 0 && esp_get_tc(s)) {
/* If the guest underflows TC then terminate SCSI request */
scsi_req_continue(s->current_req);
return;
}
s->async_buf += len;
s->async_len -= len;
s->ti_size -= len;
esp_set_tc(s, esp_get_tc(s) - 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;
}
if (s->async_len == 0 && s->ti_size == 0 && esp_get_tc(s)) {
/* If the guest underflows TC then terminate SCSI request */
scsi_req_continue(s->current_req);
return;
}

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_ST:
Expand Down

0 comments on commit c37cc88

Please sign in to comment.