[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL 10/45] esp: ensure PDMA write transfers are flushed from the FIFO
From: |
Paolo Bonzini |
Subject: |
[PULL 10/45] esp: ensure PDMA write transfers are flushed from the FIFO to the target immediately |
Date: |
Thu, 17 Jun 2021 11:30:59 +0200 |
From: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
After each PDMA write transfer the MacOS CDROM driver waits until the FIFO is
empty
(i.e. its contents have been written out to the SCSI bus) by polling the FIFO
count
register until it reads 0. This doesn't work with the current PDMA write
implementation which waits until either the FIFO is full or the transfer is
complete
before invoking the PDMA callback to process the FIFO contents.
Change the PDMA write transfer logic so that the PDMA callback is invoked after
each
PDMA write to transfer the FIFO contents to the target buffer immediately, and
hence
avoid getting stuck in the FIFO count register polling loop.
Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
Message-Id: <20210519100803.10293-4-mark.cave-ayland@ilande.co.uk>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
hw/scsi/esp.c | 25 +++++++++++--------------
1 file changed, 11 insertions(+), 14 deletions(-)
diff --git a/hw/scsi/esp.c b/hw/scsi/esp.c
index a0dab319f2..8e314ef156 100644
--- a/hw/scsi/esp.c
+++ b/hw/scsi/esp.c
@@ -338,9 +338,9 @@ static void do_cmd(ESPState *s)
static void satn_pdma_cb(ESPState *s)
{
- s->do_cmd = 0;
- if (!fifo8_is_empty(&s->cmdfifo)) {
+ if (!esp_get_tc(s) && !fifo8_is_empty(&s->cmdfifo)) {
s->cmdfifo_cdb_offset = 1;
+ s->do_cmd = 0;
do_cmd(s);
}
}
@@ -369,12 +369,9 @@ static void handle_satn(ESPState *s)
static void s_without_satn_pdma_cb(ESPState *s)
{
- uint32_t len;
-
- s->do_cmd = 0;
- len = fifo8_num_used(&s->cmdfifo);
- if (len) {
+ if (!esp_get_tc(s) && !fifo8_is_empty(&s->cmdfifo)) {
s->cmdfifo_cdb_offset = 0;
+ s->do_cmd = 0;
do_busid_cmd(s, 0);
}
}
@@ -403,8 +400,7 @@ static void handle_s_without_atn(ESPState *s)
static void satn_stop_pdma_cb(ESPState *s)
{
- s->do_cmd = 0;
- if (!fifo8_is_empty(&s->cmdfifo)) {
+ if (!esp_get_tc(s) && !fifo8_is_empty(&s->cmdfifo)) {
trace_esp_handle_satn_stop(fifo8_num_used(&s->cmdfifo));
s->do_cmd = 1;
s->cmdfifo_cdb_offset = 1;
@@ -493,6 +489,11 @@ static void do_dma_pdma_cb(ESPState *s)
uint32_t n;
if (s->do_cmd) {
+ /* Ensure we have received complete command after SATN and stop */
+ if (esp_get_tc(s) || fifo8_is_empty(&s->cmdfifo)) {
+ return;
+ }
+
s->ti_size = 0;
s->do_cmd = 0;
do_cmd(s);
@@ -1220,7 +1221,6 @@ static void sysbus_esp_pdma_write(void *opaque, hwaddr
addr,
{
SysBusESPState *sysbus = opaque;
ESPState *s = ESP(&sysbus->esp);
- uint32_t dmalen;
trace_esp_pdma_write(size);
@@ -1233,10 +1233,7 @@ static void sysbus_esp_pdma_write(void *opaque, hwaddr
addr,
esp_pdma_write(s, val);
break;
}
- dmalen = esp_get_tc(s);
- if (dmalen == 0 || fifo8_num_free(&s->fifo) < 2) {
- s->pdma_cb(s);
- }
+ s->pdma_cb(s);
}
static uint64_t sysbus_esp_pdma_read(void *opaque, hwaddr addr,
--
2.31.1
- [PULL 08/45] esp: allow non-DMA callback in esp_transfer_data() initial transfer, (continued)
- [PULL 08/45] esp: allow non-DMA callback in esp_transfer_data() initial transfer, Paolo Bonzini, 2021/06/17
- [PULL 05/45] runstate: Initialize Error * to NULL, Paolo Bonzini, 2021/06/17
- [PULL 06/45] esp: only assert INTR_DC interrupt flag if selection fails, Paolo Bonzini, 2021/06/17
- [PULL 07/45] esp: only set ESP_RSEQ at the start of the select sequence, Paolo Bonzini, 2021/06/17
- [PULL 11/45] esp: revert 75ef849696 "esp: correctly fill bus id with requested lun", Paolo Bonzini, 2021/06/17
- [PULL 14/45] esp: store lun coming from the MESSAGE OUT phase, Paolo Bonzini, 2021/06/17
- [PULL 15/45] softmmu/physmem: Mark shared anonymous memory RAM_SHARED, Paolo Bonzini, 2021/06/17
- [PULL 16/45] softmmu/physmem: Fix ram_block_discard_range() to handle shared anonymous memory, Paolo Bonzini, 2021/06/17
- [PULL 18/45] util/mmap-alloc: Factor out calculation of the pagesize for the guard page, Paolo Bonzini, 2021/06/17
- [PULL 09/45] esp: handle non-DMA transfers from the target one byte at a time, Paolo Bonzini, 2021/06/17
- [PULL 10/45] esp: ensure PDMA write transfers are flushed from the FIFO to the target immediately,
Paolo Bonzini <=
- [PULL 13/45] esp: fix migration version check in esp_is_version_5(), Paolo Bonzini, 2021/06/17
- [PULL 12/45] esp: correctly accumulate extended messages for PDMA, Paolo Bonzini, 2021/06/17
- [PULL 17/45] softmmu/physmem: Fix qemu_ram_remap() to handle shared anonymous memory, Paolo Bonzini, 2021/06/17
- [PULL 19/45] util/mmap-alloc: Factor out reserving of a memory region to mmap_reserve(), Paolo Bonzini, 2021/06/17
- [PULL 20/45] util/mmap-alloc: Factor out activating of memory to mmap_activate(), Paolo Bonzini, 2021/06/17
- [PULL 22/45] softmmu/memory: Pass ram_flags to memory_region_init_ram_shared_nomigrate(), Paolo Bonzini, 2021/06/17
- [PULL 26/45] util/mmap-alloc: Support RAM_NORESERVE via MAP_NORESERVE under Linux, Paolo Bonzini, 2021/06/17
- [PULL 23/45] softmmu/memory: Pass ram_flags to qemu_ram_alloc() and qemu_ram_alloc_internal(), Paolo Bonzini, 2021/06/17
- [PULL 29/45] qmp: Include "share" property of memory backends, Paolo Bonzini, 2021/06/17
- [PULL 33/45] configure: map x32 to cpu_family x86_64 for meson, Paolo Bonzini, 2021/06/17