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