esp.c: ensure esp_pdma_write() always calls esp_fifo_push()
authorMark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
Sun, 24 Mar 2024 19:17:05 +0000 (19:17 +0000)
committerMark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
Thu, 4 Apr 2024 14:17:53 +0000 (15:17 +0100)
This ensures that esp_update_drq() is called via esp_fifo_push() whenever the
host uses PDMA to transfer data to a SCSI device.

Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
Message-Id: <20240324191707.623175-17-mark.cave-ayland@ilande.co.uk>
Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
hw/scsi/esp.c

index 4895181ec12845d79095f599691ad94462755de0..04dfd900902e961458702b9153bfc56a05ac5866 100644 (file)
@@ -282,14 +282,12 @@ static void esp_pdma_write(ESPState *s, uint8_t val)
 {
     uint32_t dmalen = esp_get_tc(s);
 
-    if (dmalen == 0) {
-        return;
-    }
-
     esp_fifo_push(s, val);
 
-    dmalen--;
-    esp_set_tc(s, dmalen);
+    if (dmalen && s->drq_state) {
+        dmalen--;
+        esp_set_tc(s, dmalen);
+    }
 }
 
 static int esp_select(ESPState *s)