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>
This commit is contained in:
Mark Cave-Ayland 2023-08-07 07:52:58 +01:00 committed by Gerd Hoffmann
parent 774a823a96
commit db50227d4e
1 changed files with 4 additions and 0 deletions

View File

@ -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