| 3373 | | if (pCtl->irq == 16) |
|---|
| 3374 | | PDMDevHlpPCISetIrqNoWait(pDevIns, 0, 1); |
|---|
| | 3376 | if (pCtl->aIfs[pCtl->iSelectedIf].fIrqPending) |
|---|
| | 3377 | { |
|---|
| | 3378 | Log2(("%s: LUN#%d asserting IRQ (drive select change)\n", __FUNCTION__, pCtl->aIfs[pCtl->iSelectedIf].iLUN)); |
|---|
| | 3379 | /* The BMDMA unit unconditionally sets BM_STATUS_INT if |
|---|
| | 3380 | * the interrupt line is asserted. It monitors the line |
|---|
| | 3381 | * for a rising edge. */ |
|---|
| | 3382 | pCtl->BmDma.u8Status |= BM_STATUS_INT; |
|---|
| | 3383 | if (pCtl->irq == 16) |
|---|
| | 3384 | PDMDevHlpPCISetIrqNoWait(pDevIns, 0, 1); |
|---|
| | 3385 | else |
|---|
| | 3386 | PDMDevHlpISASetIrqNoWait(pDevIns, pCtl->irq, 1); |
|---|
| | 3387 | } |
|---|
| 3376 | | PDMDevHlpISASetIrqNoWait(pDevIns, pCtl->irq, 1); |
|---|
| 3377 | | } |
|---|
| 3378 | | else |
|---|
| 3379 | | { |
|---|
| 3380 | | if (pCtl->irq == 16) |
|---|
| 3381 | | PDMDevHlpPCISetIrqNoWait(pDevIns, 0, 0); |
|---|
| 3382 | | else |
|---|
| 3383 | | PDMDevHlpISASetIrqNoWait(pDevIns, pCtl->irq, 0); |
|---|
| | 3389 | { |
|---|
| | 3390 | Log2(("%s: LUN#%d deasserting IRQ (drive select change)\n", __FUNCTION__, pCtl->aIfs[pCtl->iSelectedIf].iLUN)); |
|---|
| | 3391 | if (pCtl->irq == 16) |
|---|
| | 3392 | PDMDevHlpPCISetIrqNoWait(pDevIns, 0, 0); |
|---|
| | 3393 | else |
|---|
| | 3394 | PDMDevHlpISASetIrqNoWait(pDevIns, pCtl->irq, 0); |
|---|
| | 3395 | } |
|---|
| | 3617 | } |
|---|
| | 3618 | |
|---|
| | 3619 | /* Change of interrupt disable flag. Update interrupt line if interrupt |
|---|
| | 3620 | * is pending on the current interface. */ |
|---|
| | 3621 | if ((val ^ pCtl->aIfs[0].uATARegDevCtl) & ATA_DEVCTL_DISABLE_IRQ |
|---|
| | 3622 | && pCtl->aIfs[pCtl->iSelectedIf].fIrqPending) |
|---|
| | 3623 | { |
|---|
| | 3624 | if (!(val & ATA_DEVCTL_DISABLE_IRQ)) |
|---|
| | 3625 | { |
|---|
| | 3626 | Log2(("%s: LUN#%d asserting IRQ (interrupt disable change)\n", __FUNCTION__, pCtl->aIfs[pCtl->iSelectedIf].iLUN)); |
|---|
| | 3627 | /* The BMDMA unit unconditionally sets BM_STATUS_INT if the |
|---|
| | 3628 | * interrupt line is asserted. It monitors the line for a rising |
|---|
| | 3629 | * edge. */ |
|---|
| | 3630 | pCtl->BmDma.u8Status |= BM_STATUS_INT; |
|---|
| | 3631 | if (pCtl->irq == 16) |
|---|
| | 3632 | PDMDevHlpPCISetIrqNoWait(CONTROLLER_2_DEVINS(pCtl), 0, 1); |
|---|
| | 3633 | else |
|---|
| | 3634 | PDMDevHlpISASetIrqNoWait(CONTROLLER_2_DEVINS(pCtl), pCtl->irq, 1); |
|---|
| | 3635 | } |
|---|
| | 3636 | else |
|---|
| | 3637 | { |
|---|
| | 3638 | Log2(("%s: LUN#%d deasserting IRQ (interrupt disable change)\n", __FUNCTION__, pCtl->aIfs[pCtl->iSelectedIf].iLUN)); |
|---|
| | 3639 | if (pCtl->irq == 16) |
|---|
| | 3640 | PDMDevHlpPCISetIrqNoWait(CONTROLLER_2_DEVINS(pCtl), 0, 0); |
|---|
| | 3641 | else |
|---|
| | 3642 | PDMDevHlpISASetIrqNoWait(CONTROLLER_2_DEVINS(pCtl), pCtl->irq, 0); |
|---|
| | 3643 | } |
|---|