mirror of https://github.com/xemu-project/xemu.git
ATAPI transfer size fix (NetBSD CDROM access fix) - added WIN_CHECKPOWERMODE1 - set error to zero in some cases
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@574 c046a42c-6fe2-441c-8c8c-71466251a162
This commit is contained in:
parent
4796f5e9bc
commit
a136e5a8b1
14
hw/ide.c
14
hw/ide.c
|
@ -550,6 +550,7 @@ static void ide_sector_read(IDEState *s)
|
||||||
int ret, n;
|
int ret, n;
|
||||||
|
|
||||||
s->status = READY_STAT | SEEK_STAT;
|
s->status = READY_STAT | SEEK_STAT;
|
||||||
|
s->error = 0; /* not needed by IDE spec, but needed by Windows */
|
||||||
sector_num = ide_get_sector(s);
|
sector_num = ide_get_sector(s);
|
||||||
n = s->nsector;
|
n = s->nsector;
|
||||||
if (n == 0) {
|
if (n == 0) {
|
||||||
|
@ -694,10 +695,9 @@ static void ide_atapi_cmd_reply_end(IDEState *s)
|
||||||
if (byte_count_limit & 1)
|
if (byte_count_limit & 1)
|
||||||
byte_count_limit--;
|
byte_count_limit--;
|
||||||
size = byte_count_limit;
|
size = byte_count_limit;
|
||||||
} else {
|
|
||||||
s->lcyl = size;
|
|
||||||
s->hcyl = size >> 8;
|
|
||||||
}
|
}
|
||||||
|
s->lcyl = size;
|
||||||
|
s->hcyl = size >> 8;
|
||||||
s->elementary_transfer_size = size;
|
s->elementary_transfer_size = size;
|
||||||
/* we cannot transmit more than one sector at a time */
|
/* we cannot transmit more than one sector at a time */
|
||||||
if (s->lba != -1) {
|
if (s->lba != -1) {
|
||||||
|
@ -1106,6 +1106,7 @@ static void ide_ioport_write(CPUState *env, uint32_t addr, uint32_t val)
|
||||||
break;
|
break;
|
||||||
case WIN_SPECIFY:
|
case WIN_SPECIFY:
|
||||||
case WIN_RECAL:
|
case WIN_RECAL:
|
||||||
|
s->error = 0;
|
||||||
s->status = READY_STAT;
|
s->status = READY_STAT;
|
||||||
ide_set_irq(s);
|
ide_set_irq(s);
|
||||||
break;
|
break;
|
||||||
|
@ -1135,6 +1136,7 @@ static void ide_ioport_write(CPUState *env, uint32_t addr, uint32_t val)
|
||||||
break;
|
break;
|
||||||
case WIN_WRITE:
|
case WIN_WRITE:
|
||||||
case WIN_WRITE_ONCE:
|
case WIN_WRITE_ONCE:
|
||||||
|
s->error = 0;
|
||||||
s->status = SEEK_STAT;
|
s->status = SEEK_STAT;
|
||||||
s->req_nb_sectors = 1;
|
s->req_nb_sectors = 1;
|
||||||
ide_transfer_start(s, s->io_buffer, 512, ide_sector_write);
|
ide_transfer_start(s, s->io_buffer, 512, ide_sector_write);
|
||||||
|
@ -1148,6 +1150,7 @@ static void ide_ioport_write(CPUState *env, uint32_t addr, uint32_t val)
|
||||||
case WIN_MULTWRITE:
|
case WIN_MULTWRITE:
|
||||||
if (!s->mult_sectors)
|
if (!s->mult_sectors)
|
||||||
goto abort_cmd;
|
goto abort_cmd;
|
||||||
|
s->error = 0;
|
||||||
s->status = SEEK_STAT;
|
s->status = SEEK_STAT;
|
||||||
s->req_nb_sectors = s->mult_sectors;
|
s->req_nb_sectors = s->mult_sectors;
|
||||||
n = s->nsector;
|
n = s->nsector;
|
||||||
|
@ -1160,6 +1163,11 @@ static void ide_ioport_write(CPUState *env, uint32_t addr, uint32_t val)
|
||||||
s->status = READY_STAT;
|
s->status = READY_STAT;
|
||||||
ide_set_irq(s);
|
ide_set_irq(s);
|
||||||
break;
|
break;
|
||||||
|
case WIN_CHECKPOWERMODE1:
|
||||||
|
s->nsector = 0xff; /* device active or idle */
|
||||||
|
s->status = READY_STAT;
|
||||||
|
ide_set_irq(s);
|
||||||
|
break;
|
||||||
|
|
||||||
/* ATAPI commands */
|
/* ATAPI commands */
|
||||||
case WIN_PIDENTIFY:
|
case WIN_PIDENTIFY:
|
||||||
|
|
Loading…
Reference in New Issue