Skip to content

Commit

Permalink
esp.c: only transfer non-DMA MESSAGE OUT phase data for specific comm…
Browse files Browse the repository at this point in the history
…ands

The contents of the FIFO should only be copied to cmdfifo for ESP commands that
are sending data to the SCSI bus, which are the SEL_* commands and the TI
command. Otherwise any incoming data should be held in the FIFO as normal.

This fixes booting of NetBSD m68k under the Q800 machine once again.

Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
Tested-by: Helge Deller <deller@gmx.de>
Tested-by: Thomas Huth <thuth@redhat.com>
Message-Id: <20240112125420.514425-78-mark.cave-ayland@ilande.co.uk>
Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
  • Loading branch information
mcayland committed Feb 13, 2024
1 parent acdee66 commit 215d257
Showing 1 changed file with 15 additions and 6 deletions.
21 changes: 15 additions & 6 deletions hw/scsi/esp.c
Original file line number Diff line number Diff line change
Expand Up @@ -712,14 +712,13 @@ static void esp_do_nodma(ESPState *s)

switch (esp_get_phase(s)) {
case STAT_MO:
/* Copy FIFO into cmdfifo */
n = esp_fifo_pop_buf(&s->fifo, buf, fifo8_num_used(&s->fifo));
n = MIN(fifo8_num_free(&s->cmdfifo), n);
fifo8_push_all(&s->cmdfifo, buf, n);
s->cmdfifo_cdb_offset += n;

switch (s->rregs[ESP_CMD]) {
case CMD_SELATN:
/* Copy FIFO into cmdfifo */
n = esp_fifo_pop_buf(&s->fifo, buf, fifo8_num_used(&s->fifo));
n = MIN(fifo8_num_free(&s->cmdfifo), n);
fifo8_push_all(&s->cmdfifo, buf, n);

if (fifo8_num_used(&s->cmdfifo) >= 1) {
/* First byte received, switch to command phase */
esp_set_phase(s, STAT_CD);
Expand All @@ -734,6 +733,11 @@ static void esp_do_nodma(ESPState *s)
break;

case CMD_SELATNS:
/* Copy one byte from FIFO into cmdfifo */
n = esp_fifo_pop_buf(&s->fifo, buf, 1);
n = MIN(fifo8_num_free(&s->cmdfifo), n);
fifo8_push_all(&s->cmdfifo, buf, n);

if (fifo8_num_used(&s->cmdfifo) >= 1) {
/* First byte received, stop in message out phase */
s->rregs[ESP_RSEQ] = SEQ_MO;
Expand All @@ -746,6 +750,11 @@ static void esp_do_nodma(ESPState *s)
break;

case CMD_TI:
/* Copy FIFO into cmdfifo */
n = esp_fifo_pop_buf(&s->fifo, buf, fifo8_num_used(&s->fifo));
n = MIN(fifo8_num_free(&s->cmdfifo), n);
fifo8_push_all(&s->cmdfifo, buf, n);

/* ATN remains asserted until FIFO empty */
s->cmdfifo_cdb_offset = fifo8_num_used(&s->cmdfifo);
esp_set_phase(s, STAT_CD);
Expand Down

0 comments on commit 215d257

Please sign in to comment.