diff options
author | Laurent Vivier | 2019-10-26 18:45:37 +0200 |
---|---|---|
committer | Laurent Vivier | 2019-10-28 19:03:36 +0100 |
commit | 6130b18850945eda3904db0e65fd0b7a3afe1f6a (patch) | |
tree | 37219bfa0b58bc0d2b31765b47b06baab9781152 /hw/scsi/esp.c | |
parent | esp: move handle_ti_cmd() cleanup code to esp_do_dma(). (diff) | |
download | qemu-6130b18850945eda3904db0e65fd0b7a3afe1f6a.tar.gz qemu-6130b18850945eda3904db0e65fd0b7a3afe1f6a.tar.xz qemu-6130b18850945eda3904db0e65fd0b7a3afe1f6a.zip |
esp: move get_cmd() post-DMA code to get_cmd_cb()
This will be needed to implement pseudo-DMA
Signed-off-by: Laurent Vivier <laurent@vivier.eu>
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
Acked-by: Paolo Bonzini <pbonzini@redhat.com>
Message-Id: <20191026164546.30020-3-laurent@vivier.eu>
Diffstat (limited to 'hw/scsi/esp.c')
-rw-r--r-- | hw/scsi/esp.c | 46 |
1 files changed, 29 insertions, 17 deletions
diff --git a/hw/scsi/esp.c b/hw/scsi/esp.c index 09b28cba17..0230ede21d 100644 --- a/hw/scsi/esp.c +++ b/hw/scsi/esp.c @@ -84,6 +84,34 @@ void esp_request_cancelled(SCSIRequest *req) } } +static int get_cmd_cb(ESPState *s) +{ + int target; + + target = s->wregs[ESP_WBUSID] & BUSID_DID; + + s->ti_size = 0; + s->ti_rptr = 0; + s->ti_wptr = 0; + + if (s->current_req) { + /* Started a new command before the old one finished. Cancel it. */ + scsi_req_cancel(s->current_req); + s->async_len = 0; + } + + s->current_dev = scsi_device_find(&s->bus, 0, target, 0); + if (!s->current_dev) { + /* No such drive */ + s->rregs[ESP_RSTAT] = 0; + s->rregs[ESP_RINTR] = INTR_DC; + s->rregs[ESP_RSEQ] = SEQ_0; + esp_raise_irq(s); + return -1; + } + return 0; +} + static uint32_t get_cmd(ESPState *s, uint8_t *buf, uint8_t buflen) { uint32_t dmalen; @@ -108,23 +136,7 @@ static uint32_t get_cmd(ESPState *s, uint8_t *buf, uint8_t buflen) } trace_esp_get_cmd(dmalen, target); - s->ti_size = 0; - s->ti_rptr = 0; - s->ti_wptr = 0; - - if (s->current_req) { - /* Started a new command before the old one finished. Cancel it. */ - scsi_req_cancel(s->current_req); - s->async_len = 0; - } - - s->current_dev = scsi_device_find(&s->bus, 0, target, 0); - if (!s->current_dev) { - // No such drive - s->rregs[ESP_RSTAT] = 0; - s->rregs[ESP_RINTR] = INTR_DC; - s->rregs[ESP_RSEQ] = SEQ_0; - esp_raise_irq(s); + if (get_cmd_cb(s) < 0) { return 0; } return dmalen; |