From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1KSV3I-0006Qo-Rl for qemu-devel@nongnu.org; Mon, 11 Aug 2008 06:55:04 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1KSV3H-0006Pg-Nf for qemu-devel@nongnu.org; Mon, 11 Aug 2008 06:55:04 -0400 Received: from [199.232.76.173] (port=40862 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1KSV3H-0006PS-28 for qemu-devel@nongnu.org; Mon, 11 Aug 2008 06:55:03 -0400 Received: from smtp.eu.citrix.com ([62.200.22.115]:21443) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1KSV3G-0000ae-7Y for qemu-devel@nongnu.org; Mon, 11 Aug 2008 06:55:02 -0400 Received: from samy by implementation.famille.thibault.fr with local (Exim 4.69) (envelope-from ) id 1KSV3F-0001df-T6 for qemu-devel@nongnu.org; Mon, 11 Aug 2008 12:55:01 +0200 Date: Mon, 11 Aug 2008 11:55:01 +0100 From: Samuel Thibault Message-ID: <20080811105501.GH4499@implementation.uk.xensource.com> MIME-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit Subject: [Qemu-devel] [PATCH] IDE SEEK_STAT flag 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 Add SEEK_STAT in all non-error cases except sleep request, since our seek times are virtually 0. Although this flag is deprecated by newer ATA standards, Linux at least checks it for CD drives, and would timeout in some case if we do not set it. Signed-off-by: Samuel Thibault Index: hw/ide.c =================================================================== --- hw/ide.c (révision 4992) +++ hw/ide.c (copie de travail) @@ -1048,7 +1048,7 @@ static void ide_atapi_cmd_ok(IDEState *s) { s->error = 0; - s->status = READY_STAT; + s->status = READY_STAT | SEEK_STAT; s->nsector = (s->nsector & ~7) | ATAPI_INT_REASON_IO | ATAPI_INT_REASON_CD; ide_set_irq(s); } @@ -1162,7 +1162,7 @@ if (s->packet_transfer_size <= 0) { /* end of transfer */ ide_transfer_stop(s); - s->status = READY_STAT; + s->status = READY_STAT | SEEK_STAT; s->nsector = (s->nsector & ~7) | ATAPI_INT_REASON_IO | ATAPI_INT_REASON_CD; ide_set_irq(s); #ifdef DEBUG_IDE_ATAPI @@ -1240,10 +1240,10 @@ s->io_buffer_index = 0; if (s->atapi_dma) { - s->status = READY_STAT | DRQ_STAT; + s->status = READY_STAT | SEEK_STAT | DRQ_STAT; ide_dma_start(s, ide_atapi_cmd_read_dma_cb); } else { - s->status = READY_STAT; + s->status = READY_STAT | SEEK_STAT; ide_atapi_cmd_reply_end(s); } } @@ -1258,7 +1258,7 @@ s->io_buffer_index = sector_size; s->cd_sector_size = sector_size; - s->status = READY_STAT; + s->status = READY_STAT | SEEK_STAT; ide_atapi_cmd_reply_end(s); } @@ -1299,7 +1299,7 @@ } if (s->packet_transfer_size <= 0) { - s->status = READY_STAT; + s->status = READY_STAT | SEEK_STAT; s->nsector = (s->nsector & ~7) | ATAPI_INT_REASON_IO | ATAPI_INT_REASON_CD; ide_set_irq(s); eot: @@ -1349,7 +1349,7 @@ s->cd_sector_size = sector_size; /* XXX: check if BUSY_STAT should be set */ - s->status = READY_STAT | DRQ_STAT | BUSY_STAT; + s->status = READY_STAT | SEEK_STAT | DRQ_STAT | BUSY_STAT; ide_dma_start(s, ide_atapi_cmd_read_dma_cb); } @@ -2067,14 +2067,14 @@ if (s->is_cf && s->nsector == 0) { /* Disable Read and Write Multiple */ s->mult_sectors = 0; - s->status = READY_STAT; + s->status = READY_STAT | SEEK_STAT; } else if ((s->nsector & 0xff) != 0 && ((s->nsector & 0xff) > MAX_MULT_SECTORS || (s->nsector & (s->nsector - 1)) != 0)) { ide_abort_command(s); } else { s->mult_sectors = s->nsector & 0xff; - s->status = READY_STAT; + s->status = READY_STAT | SEEK_STAT; } ide_set_irq(s); break; @@ -2084,7 +2084,7 @@ case WIN_VERIFY_ONCE: /* do sector number check ? */ ide_cmd_lba48_transform(s, lba48); - s->status = READY_STAT; + s->status = READY_STAT | SEEK_STAT; ide_set_irq(s); break; case WIN_READ_EXT: @@ -2159,13 +2159,13 @@ case WIN_READ_NATIVE_MAX: ide_cmd_lba48_transform(s, lba48); ide_set_sector(s, s->nb_sectors - 1); - s->status = READY_STAT; + s->status = READY_STAT | SEEK_STAT; ide_set_irq(s); break; case WIN_CHECKPOWERMODE1: case WIN_CHECKPOWERMODE2: s->nsector = 0xff; /* device active or idle */ - s->status = READY_STAT; + s->status = READY_STAT | SEEK_STAT; ide_set_irq(s); break; case WIN_SETFEATURES: @@ -2230,7 +2230,7 @@ case WIN_FLUSH_CACHE_EXT: if (s->bs) bdrv_flush(s->bs); - s->status = READY_STAT; + s->status = READY_STAT | SEEK_STAT; ide_set_irq(s); break; case WIN_STANDBY: @@ -2259,7 +2259,7 @@ break; case WIN_DIAGNOSE: ide_set_signature(s); - s->status = READY_STAT; + s->status = READY_STAT | SEEK_STAT; s->error = 0x01; ide_set_irq(s); break; @@ -2276,7 +2276,7 @@ /* overlapping commands not supported */ if (s->feature & 0x02) goto abort_cmd; - s->status = READY_STAT; + s->status = READY_STAT | SEEK_STAT; s->atapi_dma = s->feature & 1; s->nsector = 1; ide_transfer_start(s, s->io_buffer, ATAPI_PACKET_SIZE, @@ -2287,7 +2287,7 @@ if (!s->is_cf) goto abort_cmd; s->error = 0x09; /* miscellaneous error */ - s->status = READY_STAT; + s->status = READY_STAT | SEEK_STAT; ide_set_irq(s); break; case CFA_ERASE_SECTORS: @@ -2299,14 +2299,14 @@ if (val == CFA_ERASE_SECTORS) s->media_changed = 1; s->error = 0x00; - s->status = READY_STAT; + s->status = READY_STAT | SEEK_STAT; ide_set_irq(s); break; case CFA_TRANSLATE_SECTOR: if (!s->is_cf) goto abort_cmd; s->error = 0x00; - s->status = READY_STAT; + s->status = READY_STAT | SEEK_STAT; memset(s->io_buffer, 0, 0x200); s->io_buffer[0x00] = s->hcyl; /* Cyl MSB */ s->io_buffer[0x01] = s->lcyl; /* Cyl LSB */ @@ -2352,7 +2352,7 @@ default: goto abort_cmd; } - s->status = READY_STAT; + s->status = READY_STAT | SEEK_STAT; ide_set_irq(s); break; default: @@ -2566,7 +2566,7 @@ s->mult_sectors = MAX_MULT_SECTORS; s->cur_drive = s; s->select = 0xa0; - s->status = READY_STAT; + s->status = READY_STAT | SEEK_STAT; ide_set_signature(s); /* init the transfer handler so that 0xffff is returned on data accesses */