[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [RFC PATCH 3/3] atapi: Allow GET_EVENT_STATUS_NOTIFICATION
From: |
Amit Shah |
Subject: |
[Qemu-devel] [RFC PATCH 3/3] atapi: Allow GET_EVENT_STATUS_NOTIFICATION and TEST_UNIT_READY after media change |
Date: |
Fri, 1 Apr 2011 01:14:08 +0530 |
After a media change, the only commands allowed from the guest were
REQUEST_SENSE and INQUIRY. The guest may also issue
GET_EVENT_STATUS_NOTIFICATION and TEST_UNIT_READY commands to get media
changed notification. Enable those commands.
After this, the HSM violation messages from Linux guests aren't seen.
Signed-off-by: Amit Shah <address@hidden>
---
hw/ide/core.c | 28 +++++++++++++++++++++-------
1 files changed, 21 insertions(+), 7 deletions(-)
diff --git a/hw/ide/core.c b/hw/ide/core.c
index 89e212b..362a258 100644
--- a/hw/ide/core.c
+++ b/hw/ide/core.c
@@ -625,6 +625,14 @@ void ide_atapi_cmd_ok(IDEState *s)
ide_set_irq(s->bus);
}
+static void ide_atapi_cmd_ua(IDEState *s)
+{
+ s->sense_key = SENSE_UNIT_ATTENTION;
+ s->asc = ASC_MEDIUM_MAY_HAVE_CHANGED;
+ ide_atapi_cmd_ok(s);
+ s->sense_key = SENSE_NONE;
+}
+
void ide_atapi_cmd_error(IDEState *s, int sense_key, int asc)
{
#ifdef DEBUG_IDE_ATAPI
@@ -1243,20 +1251,26 @@ static void ide_atapi_cmd(IDEState *s)
/* If there's a UNIT_ATTENTION condition pending, only
REQUEST_SENSE and INQUIRY commands are allowed to complete. */
if (s->sense_key == SENSE_UNIT_ATTENTION &&
- s->io_buffer[0] != GPCMD_REQUEST_SENSE &&
- s->io_buffer[0] != GPCMD_INQUIRY) {
- ide_atapi_cmd_check_status(s);
- return;
+ s->io_buffer[0] != GPCMD_REQUEST_SENSE &&
+ s->io_buffer[0] != GPCMD_INQUIRY &&
+ s->io_buffer[0] != GPCMD_GET_EVENT_STATUS_NOTIFICATION &&
+ s->io_buffer[0] != GPCMD_TEST_UNIT_READY) {
+ ide_atapi_cmd_check_status(s);
+ return;
}
switch(s->io_buffer[0]) {
case GPCMD_TEST_UNIT_READY:
- if (bdrv_is_inserted(s->bs) && !s->cdrom_changed) {
- ide_atapi_cmd_ok(s);
+ if (bdrv_is_inserted(s->bs)) {
+ if (!s->cdrom_changed) {
+ ide_atapi_cmd_ok(s);
+ } else {
+ ide_atapi_cmd_ua(s);
+ }
} else {
- s->cdrom_changed = 0;
ide_atapi_cmd_error(s, SENSE_NOT_READY,
ASC_MEDIUM_NOT_PRESENT);
}
+ s->cdrom_changed = 0;
break;
case GPCMD_MODE_SENSE_6:
case GPCMD_MODE_SENSE_10:
--
1.7.4