IDE: Fill the IDENTIFY request consistently
IDE-HD, IDE-ATAPI and IDE-CFATA all fill the identify buffer in slightly different ways, this is a relatively minor patch to make them uniform, to emphasize that: (1) We build the s->identify_data cache first, then (2) We copy it to s->io_buffer to fulfill the request. Signed-off-by: John Snow <jsnow@redhat.com> Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
parent
b6b1d31f09
commit
4bf6637d35
|
@ -81,13 +81,12 @@ static void ide_identify(IDEState *s)
|
||||||
unsigned int oldsize;
|
unsigned int oldsize;
|
||||||
IDEDevice *dev = s->unit ? s->bus->slave : s->bus->master;
|
IDEDevice *dev = s->unit ? s->bus->slave : s->bus->master;
|
||||||
|
|
||||||
|
p = (uint16_t *)s->identify_data;
|
||||||
if (s->identify_set) {
|
if (s->identify_set) {
|
||||||
memcpy(s->io_buffer, s->identify_data, sizeof(s->identify_data));
|
goto fill_buffer;
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
memset(p, 0, sizeof(s->identify_data));
|
||||||
|
|
||||||
memset(s->io_buffer, 0, 512);
|
|
||||||
p = (uint16_t *)s->io_buffer;
|
|
||||||
put_le16(p + 0, 0x0040);
|
put_le16(p + 0, 0x0040);
|
||||||
put_le16(p + 1, s->cylinders);
|
put_le16(p + 1, s->cylinders);
|
||||||
put_le16(p + 3, s->heads);
|
put_le16(p + 3, s->heads);
|
||||||
|
@ -180,21 +179,22 @@ static void ide_identify(IDEState *s)
|
||||||
put_le16(p + 169, 1); /* TRIM support */
|
put_le16(p + 169, 1); /* TRIM support */
|
||||||
}
|
}
|
||||||
|
|
||||||
memcpy(s->identify_data, p, sizeof(s->identify_data));
|
|
||||||
s->identify_set = 1;
|
s->identify_set = 1;
|
||||||
|
|
||||||
|
fill_buffer:
|
||||||
|
memcpy(s->io_buffer, p, sizeof(s->identify_data));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ide_atapi_identify(IDEState *s)
|
static void ide_atapi_identify(IDEState *s)
|
||||||
{
|
{
|
||||||
uint16_t *p;
|
uint16_t *p;
|
||||||
|
|
||||||
|
p = (uint16_t *)s->identify_data;
|
||||||
if (s->identify_set) {
|
if (s->identify_set) {
|
||||||
memcpy(s->io_buffer, s->identify_data, sizeof(s->identify_data));
|
goto fill_buffer;
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
memset(p, 0, sizeof(s->identify_data));
|
||||||
|
|
||||||
memset(s->io_buffer, 0, 512);
|
|
||||||
p = (uint16_t *)s->io_buffer;
|
|
||||||
/* Removable CDROM, 50us response, 12 byte packets */
|
/* Removable CDROM, 50us response, 12 byte packets */
|
||||||
put_le16(p + 0, (2 << 14) | (5 << 8) | (1 << 7) | (2 << 5) | (0 << 0));
|
put_le16(p + 0, (2 << 14) | (5 << 8) | (1 << 7) | (2 << 5) | (0 << 0));
|
||||||
padstr((char *)(p + 10), s->drive_serial_str, 20); /* serial number */
|
padstr((char *)(p + 10), s->drive_serial_str, 20); /* serial number */
|
||||||
|
@ -247,8 +247,10 @@ static void ide_atapi_identify(IDEState *s)
|
||||||
put_le16(p + 111, s->wwn);
|
put_le16(p + 111, s->wwn);
|
||||||
}
|
}
|
||||||
|
|
||||||
memcpy(s->identify_data, p, sizeof(s->identify_data));
|
|
||||||
s->identify_set = 1;
|
s->identify_set = 1;
|
||||||
|
|
||||||
|
fill_buffer:
|
||||||
|
memcpy(s->io_buffer, p, sizeof(s->identify_data));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ide_cfata_identify(IDEState *s)
|
static void ide_cfata_identify(IDEState *s)
|
||||||
|
@ -256,10 +258,10 @@ static void ide_cfata_identify(IDEState *s)
|
||||||
uint16_t *p;
|
uint16_t *p;
|
||||||
uint32_t cur_sec;
|
uint32_t cur_sec;
|
||||||
|
|
||||||
p = (uint16_t *) s->identify_data;
|
p = (uint16_t *)s->identify_data;
|
||||||
if (s->identify_set)
|
if (s->identify_set) {
|
||||||
goto fill_buffer;
|
goto fill_buffer;
|
||||||
|
}
|
||||||
memset(p, 0, sizeof(s->identify_data));
|
memset(p, 0, sizeof(s->identify_data));
|
||||||
|
|
||||||
cur_sec = s->cylinders * s->heads * s->sectors;
|
cur_sec = s->cylinders * s->heads * s->sectors;
|
||||||
|
|
Loading…
Reference in New Issue