提交 a136e5a8 编写于 作者: B bellard

ATAPI transfer size fix (NetBSD CDROM access fix) - added WIN_CHECKPOWERMODE1...

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
上级 4796f5e9
...@@ -550,6 +550,7 @@ static void ide_sector_read(IDEState *s) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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:
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册