mirror of https://github.com/xemu-project/xemu.git
esp: remove old deferred command completion mechanism
Commit ea84a44250
"scsi: esp: Defer command completion until previous interrupts
have been handled" provided a mechanism to delay the command completion interrupt
until ESP_RINTR is read after the command has completed.
With the previous fixes for latching the ESP_RINTR bits and deferring the setting
of the command completion interrupt for incoming data to the SCSI callback, this
workaround is no longer required and can be removed.
Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
Reviewed-by: Laurent Vivier <laurent@vivier.eu>
Message-Id: <20210304221103.6369-35-mark.cave-ayland@ilande.co.uk>
This commit is contained in:
parent
4e78f3bf35
commit
4aaa6ac383
|
@ -568,18 +568,20 @@ static void esp_do_dma(ESPState *s)
|
||||||
esp_lower_drq(s);
|
esp_lower_drq(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void esp_report_command_complete(ESPState *s, uint32_t status)
|
void esp_command_complete(SCSIRequest *req, size_t resid)
|
||||||
{
|
{
|
||||||
|
ESPState *s = req->hba_private;
|
||||||
|
|
||||||
trace_esp_command_complete();
|
trace_esp_command_complete();
|
||||||
if (s->ti_size != 0) {
|
if (s->ti_size != 0) {
|
||||||
trace_esp_command_complete_unexpected();
|
trace_esp_command_complete_unexpected();
|
||||||
}
|
}
|
||||||
s->ti_size = 0;
|
s->ti_size = 0;
|
||||||
s->async_len = 0;
|
s->async_len = 0;
|
||||||
if (status) {
|
if (req->status) {
|
||||||
trace_esp_command_complete_fail();
|
trace_esp_command_complete_fail();
|
||||||
}
|
}
|
||||||
s->status = status;
|
s->status = req->status;
|
||||||
s->rregs[ESP_RSTAT] = STAT_ST;
|
s->rregs[ESP_RSTAT] = STAT_ST;
|
||||||
esp_dma_done(s);
|
esp_dma_done(s);
|
||||||
esp_lower_drq(s);
|
esp_lower_drq(s);
|
||||||
|
@ -590,23 +592,6 @@ static void esp_report_command_complete(ESPState *s, uint32_t status)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void esp_command_complete(SCSIRequest *req, size_t resid)
|
|
||||||
{
|
|
||||||
ESPState *s = req->hba_private;
|
|
||||||
|
|
||||||
if (s->rregs[ESP_RSTAT] & STAT_INT) {
|
|
||||||
/*
|
|
||||||
* Defer handling command complete until the previous
|
|
||||||
* interrupt has been handled.
|
|
||||||
*/
|
|
||||||
trace_esp_command_complete_deferred();
|
|
||||||
s->deferred_status = req->status;
|
|
||||||
s->deferred_complete = true;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
esp_report_command_complete(s, req->status);
|
|
||||||
}
|
|
||||||
|
|
||||||
void esp_transfer_data(SCSIRequest *req, uint32_t len)
|
void esp_transfer_data(SCSIRequest *req, uint32_t len)
|
||||||
{
|
{
|
||||||
ESPState *s = req->hba_private;
|
ESPState *s = req->hba_private;
|
||||||
|
@ -733,10 +718,6 @@ uint64_t esp_reg_read(ESPState *s, uint32_t saddr)
|
||||||
s->rregs[ESP_RSTAT] &= ~STAT_TC;
|
s->rregs[ESP_RSTAT] &= ~STAT_TC;
|
||||||
s->rregs[ESP_RSEQ] = SEQ_0;
|
s->rregs[ESP_RSEQ] = SEQ_0;
|
||||||
esp_lower_irq(s);
|
esp_lower_irq(s);
|
||||||
if (s->deferred_complete) {
|
|
||||||
esp_report_command_complete(s, s->deferred_status);
|
|
||||||
s->deferred_complete = false;
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case ESP_TCHI:
|
case ESP_TCHI:
|
||||||
/* Return the unique id if the value has never been written */
|
/* Return the unique id if the value has never been written */
|
||||||
|
@ -944,8 +925,10 @@ const VMStateDescription vmstate_esp = {
|
||||||
VMSTATE_UINT32(ti_wptr, ESPState),
|
VMSTATE_UINT32(ti_wptr, ESPState),
|
||||||
VMSTATE_BUFFER(ti_buf, ESPState),
|
VMSTATE_BUFFER(ti_buf, ESPState),
|
||||||
VMSTATE_UINT32(status, ESPState),
|
VMSTATE_UINT32(status, ESPState),
|
||||||
VMSTATE_UINT32(deferred_status, ESPState),
|
VMSTATE_UINT32_TEST(mig_deferred_status, ESPState,
|
||||||
VMSTATE_BOOL(deferred_complete, ESPState),
|
esp_is_before_version_5),
|
||||||
|
VMSTATE_BOOL_TEST(mig_deferred_complete, ESPState,
|
||||||
|
esp_is_before_version_5),
|
||||||
VMSTATE_UINT32(dma, ESPState),
|
VMSTATE_UINT32(dma, ESPState),
|
||||||
VMSTATE_PARTIAL_BUFFER(cmdbuf, ESPState, 16),
|
VMSTATE_PARTIAL_BUFFER(cmdbuf, ESPState, 16),
|
||||||
VMSTATE_BUFFER_START_MIDDLE_V(cmdbuf, ESPState, 16, 4),
|
VMSTATE_BUFFER_START_MIDDLE_V(cmdbuf, ESPState, 16, 4),
|
||||||
|
|
|
@ -30,8 +30,6 @@ struct ESPState {
|
||||||
int32_t ti_size;
|
int32_t ti_size;
|
||||||
uint32_t ti_rptr, ti_wptr;
|
uint32_t ti_rptr, ti_wptr;
|
||||||
uint32_t status;
|
uint32_t status;
|
||||||
uint32_t deferred_status;
|
|
||||||
bool deferred_complete;
|
|
||||||
uint32_t dma;
|
uint32_t dma;
|
||||||
uint8_t ti_buf[TI_BUFSZ];
|
uint8_t ti_buf[TI_BUFSZ];
|
||||||
SCSIBus bus;
|
SCSIBus bus;
|
||||||
|
@ -57,6 +55,8 @@ struct ESPState {
|
||||||
|
|
||||||
/* Legacy fields for vmstate_esp version < 5 */
|
/* Legacy fields for vmstate_esp version < 5 */
|
||||||
uint32_t mig_dma_left;
|
uint32_t mig_dma_left;
|
||||||
|
uint32_t mig_deferred_status;
|
||||||
|
bool mig_deferred_complete;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define TYPE_SYSBUS_ESP "sysbus-esp"
|
#define TYPE_SYSBUS_ESP "sysbus-esp"
|
||||||
|
|
Loading…
Reference in New Issue