Commit 41a2b9596c9ed2a827e16e749632752dd2686647

Authored by aliguori
1 parent 81174dae

IDE SEEK_STAT flag

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 <samuel.thibault@eu.citrix.com>
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>



git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4994 c046a42c-6fe2-441c-8c8c-71466251a162
Showing 1 changed file with 20 additions and 20 deletions
hw/ide.c
@@ -1048,7 +1048,7 @@ static void ide_sector_write_dma(IDEState *s) @@ -1048,7 +1048,7 @@ static void ide_sector_write_dma(IDEState *s)
1048 static void ide_atapi_cmd_ok(IDEState *s) 1048 static void ide_atapi_cmd_ok(IDEState *s)
1049 { 1049 {
1050 s->error = 0; 1050 s->error = 0;
1051 - s->status = READY_STAT; 1051 + s->status = READY_STAT | SEEK_STAT;
1052 s->nsector = (s->nsector & ~7) | ATAPI_INT_REASON_IO | ATAPI_INT_REASON_CD; 1052 s->nsector = (s->nsector & ~7) | ATAPI_INT_REASON_IO | ATAPI_INT_REASON_CD;
1053 ide_set_irq(s); 1053 ide_set_irq(s);
1054 } 1054 }
@@ -1162,7 +1162,7 @@ static void ide_atapi_cmd_reply_end(IDEState *s) @@ -1162,7 +1162,7 @@ static void ide_atapi_cmd_reply_end(IDEState *s)
1162 if (s->packet_transfer_size <= 0) { 1162 if (s->packet_transfer_size <= 0) {
1163 /* end of transfer */ 1163 /* end of transfer */
1164 ide_transfer_stop(s); 1164 ide_transfer_stop(s);
1165 - s->status = READY_STAT; 1165 + s->status = READY_STAT | SEEK_STAT;
1166 s->nsector = (s->nsector & ~7) | ATAPI_INT_REASON_IO | ATAPI_INT_REASON_CD; 1166 s->nsector = (s->nsector & ~7) | ATAPI_INT_REASON_IO | ATAPI_INT_REASON_CD;
1167 ide_set_irq(s); 1167 ide_set_irq(s);
1168 #ifdef DEBUG_IDE_ATAPI 1168 #ifdef DEBUG_IDE_ATAPI
@@ -1240,10 +1240,10 @@ static void ide_atapi_cmd_reply(IDEState *s, int size, int max_size) @@ -1240,10 +1240,10 @@ static void ide_atapi_cmd_reply(IDEState *s, int size, int max_size)
1240 s->io_buffer_index = 0; 1240 s->io_buffer_index = 0;
1241 1241
1242 if (s->atapi_dma) { 1242 if (s->atapi_dma) {
1243 - s->status = READY_STAT | DRQ_STAT; 1243 + s->status = READY_STAT | SEEK_STAT | DRQ_STAT;
1244 ide_dma_start(s, ide_atapi_cmd_read_dma_cb); 1244 ide_dma_start(s, ide_atapi_cmd_read_dma_cb);
1245 } else { 1245 } else {
1246 - s->status = READY_STAT; 1246 + s->status = READY_STAT | SEEK_STAT;
1247 ide_atapi_cmd_reply_end(s); 1247 ide_atapi_cmd_reply_end(s);
1248 } 1248 }
1249 } 1249 }
@@ -1258,7 +1258,7 @@ static void ide_atapi_cmd_read_pio(IDEState *s, int lba, int nb_sectors, @@ -1258,7 +1258,7 @@ static void ide_atapi_cmd_read_pio(IDEState *s, int lba, int nb_sectors,
1258 s->io_buffer_index = sector_size; 1258 s->io_buffer_index = sector_size;
1259 s->cd_sector_size = sector_size; 1259 s->cd_sector_size = sector_size;
1260 1260
1261 - s->status = READY_STAT; 1261 + s->status = READY_STAT | SEEK_STAT;
1262 ide_atapi_cmd_reply_end(s); 1262 ide_atapi_cmd_reply_end(s);
1263 } 1263 }
1264 1264
@@ -1299,7 +1299,7 @@ static void ide_atapi_cmd_read_dma_cb(void *opaque, int ret) @@ -1299,7 +1299,7 @@ static void ide_atapi_cmd_read_dma_cb(void *opaque, int ret)
1299 } 1299 }
1300 1300
1301 if (s->packet_transfer_size <= 0) { 1301 if (s->packet_transfer_size <= 0) {
1302 - s->status = READY_STAT; 1302 + s->status = READY_STAT | SEEK_STAT;
1303 s->nsector = (s->nsector & ~7) | ATAPI_INT_REASON_IO | ATAPI_INT_REASON_CD; 1303 s->nsector = (s->nsector & ~7) | ATAPI_INT_REASON_IO | ATAPI_INT_REASON_CD;
1304 ide_set_irq(s); 1304 ide_set_irq(s);
1305 eot: 1305 eot:
@@ -1349,7 +1349,7 @@ static void ide_atapi_cmd_read_dma(IDEState *s, int lba, int nb_sectors, @@ -1349,7 +1349,7 @@ static void ide_atapi_cmd_read_dma(IDEState *s, int lba, int nb_sectors,
1349 s->cd_sector_size = sector_size; 1349 s->cd_sector_size = sector_size;
1350 1350
1351 /* XXX: check if BUSY_STAT should be set */ 1351 /* XXX: check if BUSY_STAT should be set */
1352 - s->status = READY_STAT | DRQ_STAT | BUSY_STAT; 1352 + s->status = READY_STAT | SEEK_STAT | DRQ_STAT | BUSY_STAT;
1353 ide_dma_start(s, ide_atapi_cmd_read_dma_cb); 1353 ide_dma_start(s, ide_atapi_cmd_read_dma_cb);
1354 } 1354 }
1355 1355
@@ -2067,14 +2067,14 @@ static void ide_ioport_write(void *opaque, uint32_t addr, uint32_t val) @@ -2067,14 +2067,14 @@ static void ide_ioport_write(void *opaque, uint32_t addr, uint32_t val)
2067 if (s->is_cf && s->nsector == 0) { 2067 if (s->is_cf && s->nsector == 0) {
2068 /* Disable Read and Write Multiple */ 2068 /* Disable Read and Write Multiple */
2069 s->mult_sectors = 0; 2069 s->mult_sectors = 0;
2070 - s->status = READY_STAT; 2070 + s->status = READY_STAT | SEEK_STAT;
2071 } else if ((s->nsector & 0xff) != 0 && 2071 } else if ((s->nsector & 0xff) != 0 &&
2072 ((s->nsector & 0xff) > MAX_MULT_SECTORS || 2072 ((s->nsector & 0xff) > MAX_MULT_SECTORS ||
2073 (s->nsector & (s->nsector - 1)) != 0)) { 2073 (s->nsector & (s->nsector - 1)) != 0)) {
2074 ide_abort_command(s); 2074 ide_abort_command(s);
2075 } else { 2075 } else {
2076 s->mult_sectors = s->nsector & 0xff; 2076 s->mult_sectors = s->nsector & 0xff;
2077 - s->status = READY_STAT; 2077 + s->status = READY_STAT | SEEK_STAT;
2078 } 2078 }
2079 ide_set_irq(s); 2079 ide_set_irq(s);
2080 break; 2080 break;
@@ -2084,7 +2084,7 @@ static void ide_ioport_write(void *opaque, uint32_t addr, uint32_t val) @@ -2084,7 +2084,7 @@ static void ide_ioport_write(void *opaque, uint32_t addr, uint32_t val)
2084 case WIN_VERIFY_ONCE: 2084 case WIN_VERIFY_ONCE:
2085 /* do sector number check ? */ 2085 /* do sector number check ? */
2086 ide_cmd_lba48_transform(s, lba48); 2086 ide_cmd_lba48_transform(s, lba48);
2087 - s->status = READY_STAT; 2087 + s->status = READY_STAT | SEEK_STAT;
2088 ide_set_irq(s); 2088 ide_set_irq(s);
2089 break; 2089 break;
2090 case WIN_READ_EXT: 2090 case WIN_READ_EXT:
@@ -2159,13 +2159,13 @@ static void ide_ioport_write(void *opaque, uint32_t addr, uint32_t val) @@ -2159,13 +2159,13 @@ static void ide_ioport_write(void *opaque, uint32_t addr, uint32_t val)
2159 case WIN_READ_NATIVE_MAX: 2159 case WIN_READ_NATIVE_MAX:
2160 ide_cmd_lba48_transform(s, lba48); 2160 ide_cmd_lba48_transform(s, lba48);
2161 ide_set_sector(s, s->nb_sectors - 1); 2161 ide_set_sector(s, s->nb_sectors - 1);
2162 - s->status = READY_STAT; 2162 + s->status = READY_STAT | SEEK_STAT;
2163 ide_set_irq(s); 2163 ide_set_irq(s);
2164 break; 2164 break;
2165 case WIN_CHECKPOWERMODE1: 2165 case WIN_CHECKPOWERMODE1:
2166 case WIN_CHECKPOWERMODE2: 2166 case WIN_CHECKPOWERMODE2:
2167 s->nsector = 0xff; /* device active or idle */ 2167 s->nsector = 0xff; /* device active or idle */
2168 - s->status = READY_STAT; 2168 + s->status = READY_STAT | SEEK_STAT;
2169 ide_set_irq(s); 2169 ide_set_irq(s);
2170 break; 2170 break;
2171 case WIN_SETFEATURES: 2171 case WIN_SETFEATURES:
@@ -2230,7 +2230,7 @@ static void ide_ioport_write(void *opaque, uint32_t addr, uint32_t val) @@ -2230,7 +2230,7 @@ static void ide_ioport_write(void *opaque, uint32_t addr, uint32_t val)
2230 case WIN_FLUSH_CACHE_EXT: 2230 case WIN_FLUSH_CACHE_EXT:
2231 if (s->bs) 2231 if (s->bs)
2232 bdrv_flush(s->bs); 2232 bdrv_flush(s->bs);
2233 - s->status = READY_STAT; 2233 + s->status = READY_STAT | SEEK_STAT;
2234 ide_set_irq(s); 2234 ide_set_irq(s);
2235 break; 2235 break;
2236 case WIN_STANDBY: 2236 case WIN_STANDBY:
@@ -2259,7 +2259,7 @@ static void ide_ioport_write(void *opaque, uint32_t addr, uint32_t val) @@ -2259,7 +2259,7 @@ static void ide_ioport_write(void *opaque, uint32_t addr, uint32_t val)
2259 break; 2259 break;
2260 case WIN_DIAGNOSE: 2260 case WIN_DIAGNOSE:
2261 ide_set_signature(s); 2261 ide_set_signature(s);
2262 - s->status = READY_STAT; 2262 + s->status = READY_STAT | SEEK_STAT;
2263 s->error = 0x01; 2263 s->error = 0x01;
2264 ide_set_irq(s); 2264 ide_set_irq(s);
2265 break; 2265 break;
@@ -2276,7 +2276,7 @@ static void ide_ioport_write(void *opaque, uint32_t addr, uint32_t val) @@ -2276,7 +2276,7 @@ static void ide_ioport_write(void *opaque, uint32_t addr, uint32_t val)
2276 /* overlapping commands not supported */ 2276 /* overlapping commands not supported */
2277 if (s->feature & 0x02) 2277 if (s->feature & 0x02)
2278 goto abort_cmd; 2278 goto abort_cmd;
2279 - s->status = READY_STAT; 2279 + s->status = READY_STAT | SEEK_STAT;
2280 s->atapi_dma = s->feature & 1; 2280 s->atapi_dma = s->feature & 1;
2281 s->nsector = 1; 2281 s->nsector = 1;
2282 ide_transfer_start(s, s->io_buffer, ATAPI_PACKET_SIZE, 2282 ide_transfer_start(s, s->io_buffer, ATAPI_PACKET_SIZE,
@@ -2287,7 +2287,7 @@ static void ide_ioport_write(void *opaque, uint32_t addr, uint32_t val) @@ -2287,7 +2287,7 @@ static void ide_ioport_write(void *opaque, uint32_t addr, uint32_t val)
2287 if (!s->is_cf) 2287 if (!s->is_cf)
2288 goto abort_cmd; 2288 goto abort_cmd;
2289 s->error = 0x09; /* miscellaneous error */ 2289 s->error = 0x09; /* miscellaneous error */
2290 - s->status = READY_STAT; 2290 + s->status = READY_STAT | SEEK_STAT;
2291 ide_set_irq(s); 2291 ide_set_irq(s);
2292 break; 2292 break;
2293 case CFA_ERASE_SECTORS: 2293 case CFA_ERASE_SECTORS:
@@ -2299,14 +2299,14 @@ static void ide_ioport_write(void *opaque, uint32_t addr, uint32_t val) @@ -2299,14 +2299,14 @@ static void ide_ioport_write(void *opaque, uint32_t addr, uint32_t val)
2299 if (val == CFA_ERASE_SECTORS) 2299 if (val == CFA_ERASE_SECTORS)
2300 s->media_changed = 1; 2300 s->media_changed = 1;
2301 s->error = 0x00; 2301 s->error = 0x00;
2302 - s->status = READY_STAT; 2302 + s->status = READY_STAT | SEEK_STAT;
2303 ide_set_irq(s); 2303 ide_set_irq(s);
2304 break; 2304 break;
2305 case CFA_TRANSLATE_SECTOR: 2305 case CFA_TRANSLATE_SECTOR:
2306 if (!s->is_cf) 2306 if (!s->is_cf)
2307 goto abort_cmd; 2307 goto abort_cmd;
2308 s->error = 0x00; 2308 s->error = 0x00;
2309 - s->status = READY_STAT; 2309 + s->status = READY_STAT | SEEK_STAT;
2310 memset(s->io_buffer, 0, 0x200); 2310 memset(s->io_buffer, 0, 0x200);
2311 s->io_buffer[0x00] = s->hcyl; /* Cyl MSB */ 2311 s->io_buffer[0x00] = s->hcyl; /* Cyl MSB */
2312 s->io_buffer[0x01] = s->lcyl; /* Cyl LSB */ 2312 s->io_buffer[0x01] = s->lcyl; /* Cyl LSB */
@@ -2352,7 +2352,7 @@ static void ide_ioport_write(void *opaque, uint32_t addr, uint32_t val) @@ -2352,7 +2352,7 @@ static void ide_ioport_write(void *opaque, uint32_t addr, uint32_t val)
2352 default: 2352 default:
2353 goto abort_cmd; 2353 goto abort_cmd;
2354 } 2354 }
2355 - s->status = READY_STAT; 2355 + s->status = READY_STAT | SEEK_STAT;
2356 ide_set_irq(s); 2356 ide_set_irq(s);
2357 break; 2357 break;
2358 default: 2358 default:
@@ -2566,7 +2566,7 @@ static void ide_reset(IDEState *s) @@ -2566,7 +2566,7 @@ static void ide_reset(IDEState *s)
2566 s->mult_sectors = MAX_MULT_SECTORS; 2566 s->mult_sectors = MAX_MULT_SECTORS;
2567 s->cur_drive = s; 2567 s->cur_drive = s;
2568 s->select = 0xa0; 2568 s->select = 0xa0;
2569 - s->status = READY_STAT; 2569 + s->status = READY_STAT | SEEK_STAT;
2570 ide_set_signature(s); 2570 ide_set_signature(s);
2571 /* init the transfer handler so that 0xffff is returned on data 2571 /* init the transfer handler so that 0xffff is returned on data
2572 accesses */ 2572 accesses */