aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Cave-Ayland <mark.cave-ayland@ilande.co.uk>2023-08-07 07:52:58 +0100
committerGerd Hoffmann <kraxel@redhat.com>2023-08-24 10:40:09 +0200
commitdb50227d4e42057f8ff520777b36ab7a742a4bfc (patch)
tree21ada671997d49a13d9527d53cd4cbe0753c3d39
parent774a823a966cdc5d31ddc11af2b7b4f2c250ffdd (diff)
downloadseabios-db50227d4e42057f8ff520777b36ab7a742a4bfc.zip
seabios-db50227d4e42057f8ff520777b36ab7a742a4bfc.tar.gz
seabios-db50227d4e42057f8ff520777b36ab7a742a4bfc.tar.bz2
esp-scsi: flush FIFO before sending SCSI command
The ESP FIFO is used as a buffer for DMA requests and so isn't guaranteed to be empty in the case of SCSI errors or a mixed DMA/non-DMA request. Flush the FIFO before sending a SCSI command to guarantee that it is correctly positioned at the start of the FIFO. Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk> Reviewed-by: Paolo Bonzini <pbonzini@redhat.com> Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> Message-ID: <20230807065300.366070-2-mark.cave-ayland@ilande.co.uk> Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
-rw-r--r--src/hw/esp-scsi.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/src/hw/esp-scsi.c b/src/hw/esp-scsi.c
index cc25f22..e4815aa 100644
--- a/src/hw/esp-scsi.c
+++ b/src/hw/esp-scsi.c
@@ -46,6 +46,7 @@
#define ESP_DMA_WMAC 0x58c
#define ESP_CMD_DMA 0x80
+#define ESP_CMD_FLUSH 0x01
#define ESP_CMD_RESET 0x02
#define ESP_CMD_TI 0x10
#define ESP_CMD_ICCS 0x11
@@ -96,6 +97,9 @@ esp_scsi_process_op(struct disk_op_s *op)
outb(target, iobase + ESP_WBUSID);
+ /* Clear FIFO before sending command. */
+ outb(ESP_CMD_FLUSH, iobase + ESP_CMD);
+
/*
* We need to pass the LUN at the beginning of the command, and the FIFO
* is only 16 bytes, so we cannot support 16-byte CDBs. The alternative