Skip to content

Commit

Permalink
esp.c: separate logic based upon ESP command in esp_command_complete()
Browse files Browse the repository at this point in the history
The handling of the INTR_FC and INTR_BS bits is different depending upon the
last command executed by the ESP. Note that currently INTR_FC is managed
elsewhere, but that will change soon.

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-59-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 8dded6d commit 8bb2249
Showing 1 changed file with 16 additions and 14 deletions.
30 changes: 16 additions & 14 deletions hw/scsi/esp.c
Original file line number Diff line number Diff line change
Expand Up @@ -823,25 +823,27 @@ void esp_command_complete(SCSIRequest *req, size_t resid)
* Switch to status phase. For non-DMA transfers from the target the last
* byte is still in the FIFO
*/
esp_set_phase(s, STAT_ST);
if (s->ti_size == 0) {
/*
* Transfer complete: force TC to zero just in case a TI command was
* requested for more data than the command returns (Solaris 8 does
* this)
*/
esp_set_tc(s, 0);
esp_dma_ti_check(s);
} else {
s->ti_size = 0;

switch (s->rregs[ESP_CMD]) {
case CMD_SEL | CMD_DMA:
case CMD_SEL:
case CMD_SELATN | CMD_DMA:
case CMD_SELATN:
/*
* Transfer truncated: raise INTR_BS to indicate early change of
* phase
* No data phase for sequencer command so raise deferred bus service
* interrupt
*/
s->rregs[ESP_RINTR] |= INTR_BS;
esp_raise_irq(s);
s->ti_size = 0;
break;
}

/* Raise bus service interrupt to indicate change to STATUS phase */
esp_set_phase(s, STAT_ST);
s->rregs[ESP_RINTR] |= INTR_BS;
esp_raise_irq(s);
esp_lower_drq(s);

if (s->current_req) {
scsi_req_unref(s->current_req);
s->current_req = NULL;
Expand Down

0 comments on commit 8bb2249

Please sign in to comment.