From: Toni Wilen Date: Thu, 1 Jan 2015 11:18:00 +0000 (+0200) Subject: Compatibility with DKB non-DMA SCSI. X-Git-Tag: 3100~152 X-Git-Url: https://git.unchartedbackwaters.co.uk/w/?a=commitdiff_plain;h=27d58f2d323cfb0fec17e0722ec62661c8516e8a;p=francis%2Fwinuae.git Compatibility with DKB non-DMA SCSI. --- diff --git a/qemuvga/esp.cpp b/qemuvga/esp.cpp index 8454677c..485cca70 100644 --- a/qemuvga/esp.cpp +++ b/qemuvga/esp.cpp @@ -130,6 +130,13 @@ static void do_busid_cmd(ESPState *s, uint8_t *buf, uint8_t busid) lun = busid & 7; current_lun = scsiesp_device_find(&s->bus, 0, s->current_dev->id, lun); + if (!current_lun) { + s->rregs[ESP_RSTAT] = 0; + s->rregs[ESP_RINTR] = INTR_DC; + s->rregs[ESP_RSEQ] = SEQ_0; + esp_raise_irq(s); + return; + } s->current_req = scsiesp_req_new(current_lun, 0, lun, buf, s); datalen = scsiesp_req_enqueue(s->current_req); s->ti_size = datalen; @@ -292,6 +299,12 @@ static int esp_do_dma(ESPState *s) return 1; } +void esp_fake_dma_done(void *opaque) +{ + ESPState *s = (ESPState*)opaque; + scsiesp_req_continue(s->current_req); +} + void esp_command_complete(SCSIRequest *req, uint32_t status, size_t resid) { @@ -416,8 +429,6 @@ uint64_t esp_reg_read(void *opaque, uint32_t saddr) if (s->ti_size == 1) { scsiesp_req_continue(s->current_req); } -// esp_command_complete(s); - //activate_debugger(); } else { s->rregs[ESP_FIFO] = s->ti_buf[s->ti_rptr++]; } @@ -439,6 +450,8 @@ uint64_t esp_reg_read(void *opaque, uint32_t saddr) esp_lower_irq(s); return old_val; + case ESP_RES4: + return 0x80 | 0x20 | 0x2; default: //write_log("read unknown 53c94 register %02x\n", saddr); break; diff --git a/qemuvga/scsi/esp.h b/qemuvga/scsi/esp.h index f206fc8c..0e4ce93c 100644 --- a/qemuvga/scsi/esp.h +++ b/qemuvga/scsi/esp.h @@ -143,11 +143,11 @@ uint64_t esp_reg_read(void *s, uint32_t saddr); void esp_reg_write(void *s, uint32_t saddr, uint64_t val); void esp_dma_enable(void *opaque, int level); +void esp_fake_dma_done(void *opaque); void esp_request_cancelled(SCSIRequest *req); void esp_command_complete(SCSIRequest *req, uint32_t status, size_t resid); void esp_transfer_data(SCSIRequest *req, uint32_t len); void esp_scsi_init(DeviceState *dev, ESPDMAMemoryReadWriteFunc read, ESPDMAMemoryReadWriteFunc write); void esp_scsi_reset(DeviceState *dev, void *privdata); - #endif