esp.c: move CMD_SELATNS end of command logic to esp_do_dma() and do_dma_pdma_cb()

The special logic in satn_stop_pdma_cb() is now no longer required since
esp_do_dma() can be used as a direct replacement.

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-53-mark.cave-ayland@ilande.co.uk>
Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
This commit is contained in:
Mark Cave-Ayland 2024-01-12 12:53:44 +00:00
parent 9ff0fd12a2
commit db4d4150ba
2 changed files with 41 additions and 42 deletions

View File

@ -418,54 +418,31 @@ static void handle_s_without_atn(ESPState *s)
} }
} }
static void satn_stop_pdma_cb(ESPState *s)
{
uint8_t buf[ESP_FIFO_SZ];
int n;
/* 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 (!esp_get_tc(s) && !fifo8_is_empty(&s->cmdfifo)) {
trace_esp_handle_satn_stop(fifo8_num_used(&s->cmdfifo));
s->cmdfifo_cdb_offset = 1;
esp_set_phase(s, STAT_CD);
s->rregs[ESP_RSTAT] |= STAT_TC;
s->rregs[ESP_RINTR] |= INTR_BS | INTR_FC;
s->rregs[ESP_RSEQ] = SEQ_CD;
esp_raise_irq(s);
}
}
static void handle_satn_stop(ESPState *s) static void handle_satn_stop(ESPState *s)
{ {
int32_t cmdlen;
if (s->dma && !s->dma_enabled) { if (s->dma && !s->dma_enabled) {
s->dma_cb = handle_satn_stop; s->dma_cb = handle_satn_stop;
return; return;
} }
esp_set_pdma_cb(s, SATN_STOP_PDMA_CB); esp_set_pdma_cb(s, DO_DMA_PDMA_CB);
if (esp_select(s) < 0) { if (esp_select(s) < 0) {
return; return;
} }
cmdlen = get_cmd(s, 1);
if (cmdlen > 0) { esp_set_phase(s, STAT_MO);
trace_esp_handle_satn_stop(fifo8_num_used(&s->cmdfifo)); s->rregs[ESP_RSEQ] = SEQ_MO;
s->cmdfifo_cdb_offset = 1;
esp_set_phase(s, STAT_MO); if (s->dma) {
s->rregs[ESP_RINTR] |= INTR_BS | INTR_FC; esp_do_dma(s);
s->rregs[ESP_RSEQ] = SEQ_MO; } else {
esp_raise_irq(s); if (get_cmd(s, 1)) {
} else if (cmdlen == 0) { trace_esp_handle_satn_stop(fifo8_num_used(&s->cmdfifo));
if (s->dma) {
esp_raise_drq(s); /* Raise command completion interrupt */
s->rregs[ESP_RINTR] |= INTR_BS | INTR_FC;
s->rregs[ESP_RSEQ] = SEQ_MO;
esp_raise_irq(s);
} }
/* Target present, switch to message out phase */
s->rregs[ESP_RSEQ] = SEQ_MO;
esp_set_phase(s, STAT_MO);
} }
} }
@ -554,6 +531,19 @@ static void do_dma_pdma_cb(ESPState *s)
} }
break; break;
case CMD_SELATNS | CMD_DMA:
if (fifo8_num_used(&s->cmdfifo) == 1) {
/* First byte received, stop in message out phase */
esp_set_phase(s, STAT_CD);
s->cmdfifo_cdb_offset = 1;
/* Raise command completion interrupt */
s->rregs[ESP_RINTR] |= INTR_BS | INTR_FC;
s->rregs[ESP_RSEQ] = SEQ_CD;
esp_raise_irq(s);
}
break;
case CMD_TI | CMD_DMA: case CMD_TI | CMD_DMA:
/* ATN remains asserted until TC == 0 */ /* ATN remains asserted until TC == 0 */
if (esp_get_tc(s) == 0) { if (esp_get_tc(s) == 0) {
@ -676,6 +666,19 @@ static void esp_do_dma(ESPState *s)
} }
break; break;
case CMD_SELATNS | CMD_DMA:
if (fifo8_num_used(&s->cmdfifo) == 1) {
/* First byte received, stop in message out phase */
esp_set_phase(s, STAT_CD);
s->cmdfifo_cdb_offset = 1;
/* Raise command completion interrupt */
s->rregs[ESP_RINTR] |= INTR_BS | INTR_FC;
s->rregs[ESP_RSEQ] = SEQ_CD;
esp_raise_irq(s);
}
break;
case CMD_TI | CMD_DMA: case CMD_TI | CMD_DMA:
/* ATN remains asserted until TC == 0 */ /* ATN remains asserted until TC == 0 */
if (esp_get_tc(s) == 0) { if (esp_get_tc(s) == 0) {
@ -906,9 +909,6 @@ static void esp_do_nodma(ESPState *s)
static void esp_pdma_cb(ESPState *s) static void esp_pdma_cb(ESPState *s)
{ {
switch (s->pdma_cb) { switch (s->pdma_cb) {
case SATN_STOP_PDMA_CB:
satn_stop_pdma_cb(s);
break;
case WRITE_RESPONSE_PDMA_CB: case WRITE_RESPONSE_PDMA_CB:
write_response_pdma_cb(s); write_response_pdma_cb(s);
break; break;

View File

@ -152,7 +152,6 @@ struct SysBusESPState {
/* PDMA callbacks */ /* PDMA callbacks */
enum pdma_cb { enum pdma_cb {
SATN_STOP_PDMA_CB = 2,
WRITE_RESPONSE_PDMA_CB = 3, WRITE_RESPONSE_PDMA_CB = 3,
DO_DMA_PDMA_CB = 4 DO_DMA_PDMA_CB = 4
}; };