Revert "Last AIO Patch" as requested by Fabrice, it is incomplete and
breaks other (non-Windows) systems. git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3552 c046a42c-6fe2-441c-8c8c-71466251a162
This commit is contained in:
parent
ec6338bac3
commit
31c2a146ec
70
hw/ide.c
70
hw/ide.c
|
@ -358,7 +358,7 @@ typedef struct IDEState {
|
||||||
uint8_t *data_ptr;
|
uint8_t *data_ptr;
|
||||||
uint8_t *data_end;
|
uint8_t *data_end;
|
||||||
uint8_t io_buffer[MAX_MULT_SECTORS*512 + 4];
|
uint8_t io_buffer[MAX_MULT_SECTORS*512 + 4];
|
||||||
QEMUTimer *sector_write_timer; /* only used for win2k instal hack */
|
QEMUTimer *sector_write_timer; /* only used for win2k install hack */
|
||||||
uint32_t irq_count; /* counts IRQs when using win2k install hack */
|
uint32_t irq_count; /* counts IRQs when using win2k install hack */
|
||||||
/* CF-ATA extended error */
|
/* CF-ATA extended error */
|
||||||
uint8_t ext_error;
|
uint8_t ext_error;
|
||||||
|
@ -865,10 +865,31 @@ static void ide_sector_write_timer_cb(void *opaque)
|
||||||
ide_set_irq(s);
|
ide_set_irq(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ide_sector_write_aio_cb(void *opaque, int ret)
|
static void ide_sector_write(IDEState *s)
|
||||||
{
|
{
|
||||||
BMDMAState *bm = opaque;
|
int64_t sector_num;
|
||||||
IDEState *s = bm->ide_if;
|
int ret, n, n1;
|
||||||
|
|
||||||
|
s->status = READY_STAT | SEEK_STAT;
|
||||||
|
sector_num = ide_get_sector(s);
|
||||||
|
#if defined(DEBUG_IDE)
|
||||||
|
printf("write sector=%Ld\n", sector_num);
|
||||||
|
#endif
|
||||||
|
n = s->nsector;
|
||||||
|
if (n > s->req_nb_sectors)
|
||||||
|
n = s->req_nb_sectors;
|
||||||
|
ret = bdrv_write(s->bs, sector_num, s->io_buffer, n);
|
||||||
|
s->nsector -= n;
|
||||||
|
if (s->nsector == 0) {
|
||||||
|
/* no more sectors to write */
|
||||||
|
ide_transfer_stop(s);
|
||||||
|
} else {
|
||||||
|
n1 = s->nsector;
|
||||||
|
if (n1 > s->req_nb_sectors)
|
||||||
|
n1 = s->req_nb_sectors;
|
||||||
|
ide_transfer_start(s, s->io_buffer, 512 * n1, ide_sector_write);
|
||||||
|
}
|
||||||
|
ide_set_sector(s, sector_num + n);
|
||||||
|
|
||||||
#ifdef TARGET_I386
|
#ifdef TARGET_I386
|
||||||
if (win2k_install_hack && ((++s->irq_count % 16) == 0)) {
|
if (win2k_install_hack && ((++s->irq_count % 16) == 0)) {
|
||||||
|
@ -885,47 +906,6 @@ static void ide_sector_write_aio_cb(void *opaque, int ret)
|
||||||
{
|
{
|
||||||
ide_set_irq(s);
|
ide_set_irq(s);
|
||||||
}
|
}
|
||||||
bm->aiocb = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void ide_sector_write(IDEState *s)
|
|
||||||
{
|
|
||||||
BMDMAState *bm;
|
|
||||||
int64_t sector_num;
|
|
||||||
int n, n1;
|
|
||||||
|
|
||||||
s->io_buffer_index = 0;
|
|
||||||
s->io_buffer_size = 0;
|
|
||||||
bm = s->bmdma;
|
|
||||||
if(bm == NULL) {
|
|
||||||
bm = qemu_mallocz(sizeof(BMDMAState));
|
|
||||||
s->bmdma = bm;
|
|
||||||
}
|
|
||||||
bm->ide_if = s;
|
|
||||||
bm->dma_cb = ide_sector_write_aio_cb;
|
|
||||||
|
|
||||||
s->status = READY_STAT | SEEK_STAT;
|
|
||||||
sector_num = ide_get_sector(s);
|
|
||||||
#if defined(DEBUG_IDE)
|
|
||||||
printf("write sector=%Ld\n", sector_num);
|
|
||||||
#endif
|
|
||||||
n = s->nsector;
|
|
||||||
if (n > s->req_nb_sectors)
|
|
||||||
n = s->req_nb_sectors;
|
|
||||||
s->nsector -= n;
|
|
||||||
if (s->nsector == 0) {
|
|
||||||
/* no more sectors to write */
|
|
||||||
ide_transfer_stop(s);
|
|
||||||
} else {
|
|
||||||
n1 = s->nsector;
|
|
||||||
if (n1 > s->req_nb_sectors)
|
|
||||||
n1 = s->req_nb_sectors;
|
|
||||||
ide_transfer_start(s, s->io_buffer, 512 * n1, ide_sector_write);
|
|
||||||
}
|
|
||||||
ide_set_sector(s, sector_num + n);
|
|
||||||
|
|
||||||
bm->aiocb = bdrv_aio_write(s->bs, sector_num, s->io_buffer, n,
|
|
||||||
ide_sector_write_aio_cb, bm);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* XXX: handle errors */
|
/* XXX: handle errors */
|
||||||
|
|
Loading…
Reference in New Issue