Skip to content

Commit

Permalink
esp: correctly accumulate extended messages for PDMA
Browse files Browse the repository at this point in the history
Commit 799d90d "esp: transition to message out phase after SATN and stop
command" added logic to correctly handle extended messages for DMA requests
but not for PDMA requests.

Apply the same logic in esp_do_dma() to do_dma_pdma_cb() so that extended
messages terminated with a PDMA request are accumulated correctly. This allows
the ESP device to respond correctly to the SDTR negotiation initiated by the
NetBSD ESP driver without causing errors and timeouts on boot.

Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
Message-Id: <20210519100803.10293-6-mark.cave-ayland@ilande.co.uk>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
  • Loading branch information
mcayland authored and bonzini committed Jun 14, 2021
1 parent 3fc0e16 commit 5668ab9
Showing 1 changed file with 20 additions and 3 deletions.
23 changes: 20 additions & 3 deletions hw/scsi/esp.c
Expand Up @@ -492,9 +492,26 @@ static void do_dma_pdma_cb(ESPState *s)
}

s->ti_size = 0;
s->do_cmd = 0;
do_cmd(s);
esp_lower_drq(s);
if ((s->rregs[ESP_RSTAT] & 7) == STAT_CD) {
/* No command received */
if (s->cmdfifo_cdb_offset == fifo8_num_used(&s->cmdfifo)) {
return;
}

/* Command has been received */
s->do_cmd = 0;
do_cmd(s);
} else {
/*
* Extra message out bytes received: update cmdfifo_cdb_offset
* and then switch to commmand phase
*/
s->cmdfifo_cdb_offset = fifo8_num_used(&s->cmdfifo);
s->rregs[ESP_RSTAT] = STAT_TC | STAT_CD;
s->rregs[ESP_RSEQ] = SEQ_CD;
s->rregs[ESP_RINTR] |= INTR_BS;
esp_raise_irq(s);
}
return;
}

Expand Down

0 comments on commit 5668ab9

Please sign in to comment.