summaryrefslogtreecommitdiff
path: root/hw/ide
diff options
context:
space:
mode:
authorKevin Wolf <kwolf@redhat.com>2013-06-18 10:25:57 +0200
committerStefan Hajnoczi <stefanha@redhat.com>2013-06-24 10:25:15 +0200
commit1c66869a02b81ad6b687a08d99d32f5f2b01232e (patch)
treeaa072d692fe568841471dc0c071ed168330bfce9 /hw/ide
parent4286434cd607b7dea8fb3366f1529abf0ae39fa9 (diff)
downloadqemu-1c66869a02b81ad6b687a08d99d32f5f2b01232e.tar.gz
ide: Convert WIN_IDENTIFY to ide_cmd_table handler
Signed-off-by: Kevin Wolf <kwolf@redhat.com> Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
Diffstat (limited to 'hw/ide')
-rw-r--r--hw/ide/core.c40
1 files changed, 23 insertions, 17 deletions
diff --git a/hw/ide/core.c b/hw/ide/core.c
index 567515ef13..2df078b2c4 100644
--- a/hw/ide/core.c
+++ b/hw/ide/core.c
@@ -1019,6 +1019,28 @@ static bool cmd_data_set_management(IDEState *s, uint8_t cmd)
return true;
}
+static bool cmd_identify(IDEState *s, uint8_t cmd)
+{
+ if (s->bs && s->drive_kind != IDE_CD) {
+ if (s->drive_kind != IDE_CFATA) {
+ ide_identify(s);
+ } else {
+ ide_cfata_identify(s);
+ }
+ s->status = READY_STAT | SEEK_STAT;
+ ide_transfer_start(s, s->io_buffer, 512, ide_transfer_stop);
+ ide_set_irq(s->bus);
+ return false;
+ } else {
+ if (s->drive_kind == IDE_CD) {
+ ide_set_signature(s);
+ }
+ ide_abort_command(s);
+ }
+
+ return true;
+}
+
#define HD_OK (1u << IDE_HD)
#define CD_OK (1u << IDE_CD)
#define CFA_OK (1u << IDE_CFATA)
@@ -1086,7 +1108,7 @@ static const struct {
[WIN_SLEEPNOW1] = { NULL, ALL_OK },
[WIN_FLUSH_CACHE] = { NULL, ALL_OK },
[WIN_FLUSH_CACHE_EXT] = { NULL, HD_CFA_OK },
- [WIN_IDENTIFY] = { NULL, ALL_OK },
+ [WIN_IDENTIFY] = { cmd_identify, ALL_OK },
[WIN_SETFEATURES] = { NULL, ALL_OK },
[IBM_SENSE_CONDITION] = { NULL, CFA_OK },
[CFA_WEAR_LEVEL] = { NULL, HD_CFA_OK },
@@ -1144,22 +1166,6 @@ void ide_exec_cmd(IDEBus *bus, uint32_t val)
}
switch(val) {
- case WIN_IDENTIFY:
- if (s->bs && s->drive_kind != IDE_CD) {
- if (s->drive_kind != IDE_CFATA)
- ide_identify(s);
- else
- ide_cfata_identify(s);
- s->status = READY_STAT | SEEK_STAT;
- ide_transfer_start(s, s->io_buffer, 512, ide_transfer_stop);
- } else {
- if (s->drive_kind == IDE_CD) {
- ide_set_signature(s);
- }
- ide_abort_command(s);
- }
- ide_set_irq(s->bus);
- break;
case WIN_SPECIFY:
case WIN_RECAL:
s->error = 0;