From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1L00In-0001CC-QE for qemu-devel@nongnu.org; Tue, 11 Nov 2008 15:57:33 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1L00Im-0001Bn-TP for qemu-devel@nongnu.org; Tue, 11 Nov 2008 15:57:33 -0500 Received: from [199.232.76.173] (port=59218 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1L00Im-0001Bk-O0 for qemu-devel@nongnu.org; Tue, 11 Nov 2008 15:57:32 -0500 Received: from savannah.gnu.org ([199.232.41.3]:36546 helo=sv.gnu.org) by monty-python.gnu.org with esmtps (TLS-1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1L00Im-0005r0-FB for qemu-devel@nongnu.org; Tue, 11 Nov 2008 15:57:32 -0500 Received: from cvs.savannah.gnu.org ([199.232.41.69]) by sv.gnu.org with esmtp (Exim 4.63) (envelope-from ) id 1L00Il-0004Qo-Km for qemu-devel@nongnu.org; Tue, 11 Nov 2008 20:57:31 +0000 Received: from aliguori by cvs.savannah.gnu.org with local (Exim 4.63) (envelope-from ) id 1L00Il-0004Qf-9R for qemu-devel@nongnu.org; Tue, 11 Nov 2008 20:57:31 +0000 MIME-Version: 1.0 Errors-To: aliguori Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From: Anthony Liguori Message-Id: Date: Tue, 11 Nov 2008 20:57:31 +0000 Subject: [Qemu-devel] [5698] windows cdrom cache flush (Stefano Stabellini) Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Revision: 5698 http://svn.sv.gnu.org/viewvc/?view=rev&root=qemu&revision=5698 Author: aliguori Date: 2008-11-11 20:57:30 +0000 (Tue, 11 Nov 2008) Log Message: ----------- windows cdrom cache flush (Stefano Stabellini) Windows only flushes its cache of a CDROM if it gets a SENSE_UNIT_ATTENTION CHECK_CONDITION response to a REQUEST_SENSE command. Make sure it does so after we change the CD. Tab damage fixed by Anthony Liguori Signed-off-by: Stefano Stabellini Signed-off-by: Steven Smith Signed-off-by: Anthony Liguori Modified Paths: -------------- trunk/hw/ide.c Modified: trunk/hw/ide.c =================================================================== --- trunk/hw/ide.c 2008-11-11 20:54:09 UTC (rev 5697) +++ trunk/hw/ide.c 2008-11-11 20:57:30 UTC (rev 5698) @@ -351,6 +351,7 @@ #define ASC_ILLEGAL_OPCODE 0x20 #define ASC_LOGICAL_BLOCK_OOR 0x21 #define ASC_INV_FIELD_IN_CMD_PACKET 0x24 +#define ASC_MEDIUM_MAY_HAVE_CHANGED 0x28 #define ASC_INCOMPATIBLE_FORMAT 0x30 #define ASC_MEDIUM_NOT_PRESENT 0x3a #define ASC_SAVING_PARAMETERS_NOT_SUPPORTED 0x39 @@ -1106,6 +1107,17 @@ ide_set_irq(s); } +static void ide_atapi_cmd_check_status(IDEState *s) +{ +#ifdef DEBUG_IDE_ATAPI + printf("atapi_cmd_check_status\n"); +#endif + s->error = MC_ERR | (SENSE_UNIT_ATTENTION << 4); + s->status = ERR_STAT; + s->nsector = 0; + ide_set_irq(s); +} + static inline void cpu_to_ube16(uint8_t *buf, int val) { buf[0] = val >> 8; @@ -1528,6 +1540,14 @@ printf("\n"); } #endif + /* 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; + } switch(s->io_buffer[0]) { case GPCMD_TEST_UNIT_READY: if (bdrv_is_inserted(s->bs)) { @@ -1623,6 +1643,8 @@ buf[2] = s->sense_key; buf[7] = 10; buf[12] = s->asc; + if (s->sense_key == SENSE_UNIT_ATTENTION) + s->sense_key = SENSE_NONE; ide_atapi_cmd_reply(s, 18, max_len); break; case GPCMD_PREVENT_ALLOW_MEDIUM_REMOVAL: @@ -1974,9 +1996,13 @@ IDEState *s = opaque; uint64_t nb_sectors; - /* XXX: send interrupt too */ bdrv_get_geometry(s->bs, &nb_sectors); s->nb_sectors = nb_sectors; + + s->sense_key = SENSE_UNIT_ATTENTION; + s->asc = ASC_MEDIUM_MAY_HAVE_CHANGED; + + ide_set_irq(s); } static void ide_cmd_lba48_transform(IDEState *s, int lba48)