From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:36322) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TJlne-0005y4-0X for qemu-devel@nongnu.org; Thu, 04 Oct 2012 09:49:18 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1TJlnP-00027Z-Cl for qemu-devel@nongnu.org; Thu, 04 Oct 2012 09:49:13 -0400 Received: from mx1.redhat.com ([209.132.183.28]:26781) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TJlnP-000279-53 for qemu-devel@nongnu.org; Thu, 04 Oct 2012 09:48:59 -0400 Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q94DmuNp021027 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 4 Oct 2012 09:48:57 -0400 From: Pavel Hrdina Date: Thu, 4 Oct 2012 15:48:53 +0200 Message-Id: <6cdd5330c83101668f5bd4256a0c7d51c2a6712d.1349358363.git.phrdina@redhat.com> Subject: [Qemu-devel] [PATCH 1/1] atapi: make change media detection for guests easier List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: Pavel Hrdina If you have a guest with a media in the cdrom and you change it, the windows and the linux guests cannot properly recognize this media change. For this purpose we have to pretend for some time (2s), that we don't have any media inserted. Signed-off-by: Pavel Hrdina --- hw/ide/atapi.c | 25 ++++++++++++++++++++----- hw/ide/core.c | 1 + hw/ide/internal.h | 3 ++- 3 files changed, 23 insertions(+), 6 deletions(-) diff --git a/hw/ide/atapi.c b/hw/ide/atapi.c index 685cbaa..1f20f10 100644 --- a/hw/ide/atapi.c +++ b/hw/ide/atapi.c @@ -73,7 +73,7 @@ static void lba_to_msf(uint8_t *buf, int lba) static inline int media_present(IDEState *s) { - return !s->tray_open && s->nb_sectors > 0; + return !s->tray_open && s->nb_sectors > 0 && s->cdrom_changed_timer == NULL; } /* XXX: DVDs that could fit on a CD will be reported as a CD */ @@ -504,7 +504,7 @@ static unsigned int event_status_media(IDEState *s, media_status = 0; if (s->tray_open) { media_status = MS_TRAY_OPEN; - } else if (bdrv_is_inserted(s->bs)) { + } else if (media_present(s)) { media_status = MS_MEDIA_PRESENT; } @@ -1091,6 +1091,14 @@ static const struct { /* [1] handler detects and reports not ready condition itself */ }; +static void cdrom_changed_timer_cb(void *opaque) +{ + IDEState *s = opaque; + qemu_del_timer(s->cdrom_changed_timer); + qemu_free_timer(s->cdrom_changed_timer); + s->cdrom_changed_timer = NULL; +} + void ide_atapi_cmd(IDEState *s) { uint8_t *buf; @@ -1125,11 +1133,18 @@ void ide_atapi_cmd(IDEState *s) * states rely on this behavior. */ if (!s->tray_open && bdrv_is_inserted(s->bs) && s->cdrom_changed) { - ide_atapi_cmd_error(s, NOT_READY, ASC_MEDIUM_NOT_PRESENT); + ide_atapi_cmd_error(s, UNIT_ATTENTION, ASC_MEDIUM_MAY_HAVE_CHANGED); s->cdrom_changed = 0; - s->sense_key = UNIT_ATTENTION; - s->asc = ASC_MEDIUM_MAY_HAVE_CHANGED; + + if (s->cdrom_changed_timer) { + cdrom_changed_timer_cb(s); + } + s->cdrom_changed_timer = qemu_new_timer_ms(vm_clock, + cdrom_changed_timer_cb, s); + qemu_mod_timer(s->cdrom_changed_timer, + qemu_get_clock_ms(vm_clock) + 2000); + return; } diff --git a/hw/ide/core.c b/hw/ide/core.c index d6fb69c..caf30c8 100644 --- a/hw/ide/core.c +++ b/hw/ide/core.c @@ -1861,6 +1861,7 @@ static void ide_reset(IDEState *s) s->sense_key = 0; s->asc = 0; s->cdrom_changed = 0; + s->cdrom_changed_timer = NULL; s->packet_transfer_size = 0; s->elementary_transfer_size = 0; s->io_buffer_index = 0; diff --git a/hw/ide/internal.h b/hw/ide/internal.h index bf7d313..20c0268 100644 --- a/hw/ide/internal.h +++ b/hw/ide/internal.h @@ -16,7 +16,7 @@ /* debug IDE devices */ //#define DEBUG_IDE -//#define DEBUG_IDE_ATAPI +#define DEBUG_IDE_ATAPI //#define DEBUG_AIO #define USE_DMA_CDROM @@ -382,6 +382,7 @@ struct IDEState { bool tray_open; bool tray_locked; uint8_t cdrom_changed; + QEMUTimer *cdrom_changed_timer; int packet_transfer_size; int elementary_transfer_size; int io_buffer_index; -- 1.7.11.4