BMDMA interrupt fix (aka Solaris x86 IDE bug fix)
[qemu.git] / hw / ide.c
index db7d73744def0cb952a289dec111a817e6917299..d2220ba0b6ec069dd2f7f543cc94bccdaea50821 100644 (file)
--- a/hw/ide.c
+++ b/hw/ide.c
@@ -499,7 +499,10 @@ static inline void ide_abort_command(IDEState *s)
 
 static inline void ide_set_irq(IDEState *s)
 {
+    BMDMAState *bm = s->bmdma;
     if (!(s->cmd & IDE_CMD_DISABLE_IRQ)) {
+        if (bm)
+            bm->status |= BM_STATUS_INT;
 #ifdef TARGET_PPC
         if (s->openpic) 
             openpic_set_irq(s->openpic, s->irq, 1);
@@ -1570,6 +1573,7 @@ static void ide_ioport_write(void *opaque, uint32_t addr, uint32_t val)
             }
             break;
        case WIN_STANDBYNOW1:
+        case WIN_IDLEIMMEDIATE:
            s->status = READY_STAT;
             ide_set_irq(s);
             break;
@@ -1584,6 +1588,11 @@ static void ide_ioport_write(void *opaque, uint32_t addr, uint32_t val)
             }
             ide_set_irq(s);
             break;
+        case WIN_DIAGNOSE:
+            ide_set_signature(s);
+            s->status = 0x00; /* NOTE: READY is _not_ set */
+            s->error = 0x01;
+            break;
         case WIN_SRST:
             if (!s->is_cdrom)
                 goto abort_cmd;
This page took 0.038895 seconds and 4 git commands to generate.