esp-scsi: handle non-DMA SCSI commands with no data phase
The existing esp-scsi state machine checks for the STAT_TC bit to exit state 1 but in the case where there is no data phase, a non-DMA command is executed which doesn't set STAT_TC. This only works because QEMU currently always sets STAT_TC just after issuing every SCSI command. Update the esp-scsi state machine so that in the case where there is no data phase, we immediately execute CMD_ICCS instead of waiting for STAT_TC to be set which will never happen with a non-DMA CMD_SELATN command. Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk> Message-ID: <20230807065300.366070-4-mark.cave-ayland@ilande.co.uk> Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
This commit is contained in:
parent
cf4b829f0c
commit
7a4003be25
|
@ -137,19 +137,28 @@ esp_scsi_process_op(struct disk_op_s *op)
|
|||
esp_scsi_dma(iobase, (u32)op->buf_fl, count, scsi_is_read(op));
|
||||
outb(ESP_CMD_TI | ESP_CMD_DMA, iobase + ESP_CMD);
|
||||
continue;
|
||||
} else {
|
||||
/* No data phase. */
|
||||
state++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* At end of DMA TC is set again -> complete command. */
|
||||
if (state == 1 && (stat & ESP_STAT_TC)) {
|
||||
state++;
|
||||
continue;
|
||||
}
|
||||
|
||||
/* Request message in data. */
|
||||
if (state == 2) {
|
||||
state++;
|
||||
outb(ESP_CMD_ICCS, iobase + ESP_CMD);
|
||||
continue;
|
||||
}
|
||||
|
||||
/* Finally read data from the message in phase. */
|
||||
if (state == 2 && (stat & ESP_STAT_MSG)) {
|
||||
if (state == 3 && (stat & ESP_STAT_MSG)) {
|
||||
state++;
|
||||
status = inb(iobase + ESP_FIFO);
|
||||
inb(iobase + ESP_FIFO);
|
||||
|
|
Loading…
Reference in New Issue