diff --git a/hw/block/m25p80.c b/hw/block/m25p80.c index 46dbe7c521..4f05caf34e 100644 --- a/hw/block/m25p80.c +++ b/hw/block/m25p80.c @@ -856,28 +856,18 @@ static void complete_collecting_data(Flash *s) break; case RDID_90: case RDID_AB: - if (get_man(s) == MAN_SST) { - if (s->cur_addr <= 1) { - if (s->cur_addr) { - s->data[0] = s->pi->id[2]; - s->data[1] = s->pi->id[0]; - } else { - s->data[0] = s->pi->id[0]; - s->data[1] = s->pi->id[2]; - } - s->pos = 0; - s->len = 2; - s->data_read_loop = true; - s->state = STATE_READING_DATA; - } else { - qemu_log_mask(LOG_GUEST_ERROR, - "M25P80: Invalid read id address\n"); - } + // Read Manufacturer/Device ID - The address low bit selects which of the manufacturer/device pair comes first; real chips answer regardless of vendor, so this is not gated on MAN_SST. Reused for 0xAB (Release Power-Down + Device ID), whose trailing byte reads back the device id. + if (s->cur_addr) { + s->data[0] = s->pi->id[2]; + s->data[1] = s->pi->id[0]; } else { - qemu_log_mask(LOG_GUEST_ERROR, - "M25P80: Read id (command 0x90/0xAB) is not supported" - " by device\n"); + s->data[0] = s->pi->id[0]; + s->data[1] = s->pi->id[2]; } + s->pos = 0; + s->len = 2; + s->data_read_loop = true; + s->state = STATE_READING_DATA; break; case RDSFDP: