mirror of
https://github.com/izzy2lost/xemu.git
synced 2026-07-06 00:20:22 -07:00
esp.c: only call dma_memory_read function if transfer length is non-zero
In the cases where mixed DMA/non-DMA transfers are used or no data is available, it is possible for the calculated transfer length to be zero. Only call the dma_memory_read function where the transfer length is non-zero to avoid invoking the DMA engine for a zero length transfer which can have side-effects (along with generating additional tracing noise). Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk> Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> Tested-by: Philippe Mathieu-Daudé <philmd@linaro.org> Message-ID: <20250711204636.542964-5-mark.cave-ayland@ilande.co.uk> Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
This commit is contained in:
committed by
Philippe Mathieu-Daudé
parent
e70aa5dc29
commit
9d6df740ec
+13
-7
@@ -487,8 +487,10 @@ static void esp_do_dma(ESPState *s)
|
||||
case STAT_MO:
|
||||
if (s->dma_memory_read) {
|
||||
len = MIN(len, fifo8_num_free(&s->cmdfifo));
|
||||
s->dma_memory_read(s->dma_opaque, buf, len);
|
||||
esp_set_tc(s, esp_get_tc(s) - len);
|
||||
if (len) {
|
||||
s->dma_memory_read(s->dma_opaque, buf, len);
|
||||
esp_set_tc(s, esp_get_tc(s) - len);
|
||||
}
|
||||
} else {
|
||||
len = esp_fifo_pop_buf(s, buf, fifo8_num_used(&s->fifo));
|
||||
len = MIN(fifo8_num_free(&s->cmdfifo), len);
|
||||
@@ -541,9 +543,11 @@ static void esp_do_dma(ESPState *s)
|
||||
trace_esp_do_dma(cmdlen, len);
|
||||
if (s->dma_memory_read) {
|
||||
len = MIN(len, fifo8_num_free(&s->cmdfifo));
|
||||
s->dma_memory_read(s->dma_opaque, buf, len);
|
||||
fifo8_push_all(&s->cmdfifo, buf, len);
|
||||
esp_set_tc(s, esp_get_tc(s) - len);
|
||||
if (len) {
|
||||
s->dma_memory_read(s->dma_opaque, buf, len);
|
||||
fifo8_push_all(&s->cmdfifo, buf, len);
|
||||
esp_set_tc(s, esp_get_tc(s) - len);
|
||||
}
|
||||
} else {
|
||||
len = esp_fifo_pop_buf(s, buf, fifo8_num_used(&s->fifo));
|
||||
len = MIN(fifo8_num_free(&s->cmdfifo), len);
|
||||
@@ -572,8 +576,10 @@ static void esp_do_dma(ESPState *s)
|
||||
switch (s->rregs[ESP_CMD]) {
|
||||
case CMD_TI | CMD_DMA:
|
||||
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);
|
||||
if (len) {
|
||||
s->dma_memory_read(s->dma_opaque, s->async_buf, len);
|
||||
esp_set_tc(s, esp_get_tc(s) - len);
|
||||
}
|
||||
} else {
|
||||
/* Copy FIFO data to device */
|
||||
len = MIN(s->async_len, ESP_FIFO_SZ);
|
||||
|
||||
Reference in New Issue
Block a user