aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--hw/esp.c28
1 files changed, 23 insertions, 5 deletions
diff --git a/hw/esp.c b/hw/esp.c
index cc97eb441b..54878b610d 100644
--- a/hw/esp.c
+++ b/hw/esp.c
@@ -203,14 +203,14 @@ static uint32_t get_cmd(ESPState *s, uint8_t *buf)
return dmalen;
}
-static void do_cmd(ESPState *s, uint8_t *buf)
+static void do_busid_cmd(ESPState *s, uint8_t *buf, uint8_t busid)
{
int32_t datalen;
int lun;
- DPRINTF("do_cmd: busid 0x%x\n", buf[0]);
- lun = buf[0] & 7;
- datalen = s->current_dev->send_command(s->current_dev, 0, &buf[1], lun);
+ DPRINTF("do_busid_cmd: busid 0x%x\n", busid);
+ lun = busid & 7;
+ datalen = s->current_dev->send_command(s->current_dev, 0, buf, lun);
s->ti_size = datalen;
if (datalen != 0) {
s->rregs[ESP_RSTAT] = STAT_TC;
@@ -229,6 +229,13 @@ static void do_cmd(ESPState *s, uint8_t *buf)
esp_raise_irq(s);
}
+static void do_cmd(ESPState *s, uint8_t *buf)
+{
+ uint8_t busid = buf[0];
+
+ do_busid_cmd(s, &buf[1], busid);
+}
+
static void handle_satn(ESPState *s)
{
uint8_t buf[32];
@@ -239,6 +246,17 @@ static void handle_satn(ESPState *s)
do_cmd(s, buf);
}
+static void handle_s_without_atn(ESPState *s)
+{
+ uint8_t buf[32];
+ int len;
+
+ len = get_cmd(s, buf);
+ if (len) {
+ do_busid_cmd(s, buf, 0);
+ }
+}
+
static void handle_satn_stop(ESPState *s)
{
s->cmdlen = get_cmd(s, s->cmdbuf);
@@ -544,7 +562,7 @@ static void esp_mem_writeb(void *opaque, target_phys_addr_t addr, uint32_t val)
break;
case CMD_SEL:
DPRINTF("Select without ATN (%2.2x)\n", val);
- handle_satn(s);
+ handle_s_without_atn(s);
break;
case CMD_SELATN:
DPRINTF("Select with ATN (%2.2x)\n", val);