Lines Matching defs:aCts

481     ATACONTROLLER       aCts[2];
508 #define ATACONTROLLER_IDX(pController) ( (pController) - PDMINS_2_DATA(CONTROLLER_2_DEVINS(pController), PCIATAState *)->aCts )
5649 PATACONTROLLER pCtl = &pThis->aCts[i];
5682 PATACONTROLLER pCtl = &pThis->aCts[i];
5733 for (uint32_t i = 0; i < RT_ELEMENTS(pThis->aCts); i++)
5793 case 0: *ppLed = &pThis->aCts[0].aIfs[0].Led; break;
5794 case 1: *ppLed = &pThis->aCts[0].aIfs[1].Led; break;
5795 case 2: *ppLed = &pThis->aCts[1].aIfs[0].Led; break;
5796 case 3: *ppLed = &pThis->aCts[1].aIfs[1].Led; break;
5854 PATACONTROLLER pCtl = &pThis->aCts[i];
5892 PATACONTROLLER pCtl = &pThis->aCts[i];
5940 PATACONTROLLER pCtl = &pThis->aCts[i];
6008 PATACONTROLLER pCtl = &pThis->aCts[i];
6076 PATACONTROLLER pCtl = &pThis->aCts[i];
6100 PATACONTROLLER pCtl = &pThis->aCts[i];
6149 iController = iLUN / RT_ELEMENTS(pThis->aCts[0].aIfs);
6150 AssertReleaseMsg(iController < RT_ELEMENTS(pThis->aCts), ("iController=%d iLUN=%d\n", iController, iLUN));
6151 pCtl = &pThis->aCts[iController];
6153 iInterface = iLUN % RT_ELEMENTS(pThis->aCts[0].aIfs);
6336 iController = iLUN / RT_ELEMENTS(pThis->aCts[0].aIfs);
6337 AssertReleaseMsg(iController < RT_ELEMENTS(pThis->aCts), ("iController=%d iLUN=%d\n", iController, iLUN));
6338 pCtl = &pThis->aCts[iController];
6340 iInterface = iLUN % RT_ELEMENTS(pThis->aCts[0].aIfs);
6387 for (uint32_t i = 0; i < RT_ELEMENTS(pThis->aCts); i++)
6389 if (pThis->aCts[i].fRedo && pThis->aCts[i].fRedoIdle)
6391 rc = RTSemEventSignal(pThis->aCts[i].SuspendIOSem);
6410 for (uint32_t i = 0; i < RT_ELEMENTS(pThis->aCts); i++)
6411 if (pThis->aCts[i].AsyncIOThread != NIL_RTTHREAD)
6413 bool fRc = ataAsyncIOIsIdle(&pThis->aCts[i], false /*fStrict*/);
6417 RTSemMutexRequest(pThis->aCts[i].AsyncIORequestMutex, RT_INDEFINITE_WAIT);
6418 ASMAtomicWriteBool(&pThis->aCts[i].fSignalIdle, true);
6419 RTSemMutexRelease(pThis->aCts[i].AsyncIORequestMutex);
6420 fRc = ataAsyncIOIsIdle(&pThis->aCts[i], false /*fStrict*/);
6425 i, pThis->aCts[i].iSelectedIf, pThis->aCts[i].iAIOIf,
6426 pThis->aCts[i].aIfs[0].uATARegCommand, pThis->aCts[i].aIfs[1].uATARegCommand));
6431 ASMAtomicWriteBool(&pThis->aCts[i].fSignalIdle, false);
6448 for (uint32_t i = 0; i < RT_ELEMENTS(pThis->aCts); i++)
6449 AssertLogRelMsgReturn(ataAsyncIOIsIdle(&pThis->aCts[i], false /*fStrict*/),
6463 for (uint32_t i = 0; i < RT_ELEMENTS(pThis->aCts); i++)
6466 for (uint32_t j = 0; j < RT_ELEMENTS(pThis->aCts[i].aIfs); j++)
6468 SSMR3PutBool(pSSM, pThis->aCts[i].aIfs[j].pDrvBase != NULL);
6469 SSMR3PutStrZ(pSSM, pThis->aCts[i].aIfs[j].szSerialNumber);
6470 SSMR3PutStrZ(pSSM, pThis->aCts[i].aIfs[j].szFirmwareRevision);
6471 SSMR3PutStrZ(pSSM, pThis->aCts[i].aIfs[j].szModelNumber);
6487 for (uint32_t i = 0; i < RT_ELEMENTS(pThis->aCts); i++)
6489 SSMR3PutU8(pSSM, pThis->aCts[i].iSelectedIf);
6490 SSMR3PutU8(pSSM, pThis->aCts[i].iAIOIf);
6491 SSMR3PutU8(pSSM, pThis->aCts[i].uAsyncIOState);
6492 SSMR3PutBool(pSSM, pThis->aCts[i].fChainedTransfer);
6493 SSMR3PutBool(pSSM, pThis->aCts[i].fReset);
6494 SSMR3PutBool(pSSM, pThis->aCts[i].fRedo);
6495 SSMR3PutBool(pSSM, pThis->aCts[i].fRedoIdle);
6496 SSMR3PutBool(pSSM, pThis->aCts[i].fRedoDMALastDesc);
6497 SSMR3PutMem(pSSM, &pThis->aCts[i].BmDma, sizeof(pThis->aCts[i].BmDma));
6498 SSMR3PutGCPhys32(pSSM, pThis->aCts[i].pFirstDMADesc);
6499 SSMR3PutGCPhys32(pSSM, pThis->aCts[i].pLastDMADesc);
6500 SSMR3PutGCPhys32(pSSM, pThis->aCts[i].pRedoDMABuffer);
6501 SSMR3PutU32(pSSM, pThis->aCts[i].cbRedoDMABuffer);
6503 for (uint32_t j = 0; j < RT_ELEMENTS(pThis->aCts[i].aIfs); j++)
6505 SSMR3PutBool(pSSM, pThis->aCts[i].aIfs[j].fLBA48);
6506 SSMR3PutBool(pSSM, pThis->aCts[i].aIfs[j].fATAPI);
6507 SSMR3PutBool(pSSM, pThis->aCts[i].aIfs[j].fIrqPending);
6508 SSMR3PutU8(pSSM, pThis->aCts[i].aIfs[j].cMultSectors);
6509 SSMR3PutU32(pSSM, pThis->aCts[i].aIfs[j].PCHSGeometry.cCylinders);
6510 SSMR3PutU32(pSSM, pThis->aCts[i].aIfs[j].PCHSGeometry.cHeads);
6511 SSMR3PutU32(pSSM, pThis->aCts[i].aIfs[j].PCHSGeometry.cSectors);
6512 SSMR3PutU32(pSSM, pThis->aCts[i].aIfs[j].cSectorsPerIRQ);
6513 SSMR3PutU64(pSSM, pThis->aCts[i].aIfs[j].cTotalSectors);
6514 SSMR3PutU8(pSSM, pThis->aCts[i].aIfs[j].uATARegFeature);
6515 SSMR3PutU8(pSSM, pThis->aCts[i].aIfs[j].uATARegFeatureHOB);
6516 SSMR3PutU8(pSSM, pThis->aCts[i].aIfs[j].uATARegError);
6517 SSMR3PutU8(pSSM, pThis->aCts[i].aIfs[j].uATARegNSector);
6518 SSMR3PutU8(pSSM, pThis->aCts[i].aIfs[j].uATARegNSectorHOB);
6519 SSMR3PutU8(pSSM, pThis->aCts[i].aIfs[j].uATARegSector);
6520 SSMR3PutU8(pSSM, pThis->aCts[i].aIfs[j].uATARegSectorHOB);
6521 SSMR3PutU8(pSSM, pThis->aCts[i].aIfs[j].uATARegLCyl);
6522 SSMR3PutU8(pSSM, pThis->aCts[i].aIfs[j].uATARegLCylHOB);
6523 SSMR3PutU8(pSSM, pThis->aCts[i].aIfs[j].uATARegHCyl);
6524 SSMR3PutU8(pSSM, pThis->aCts[i].aIfs[j].uATARegHCylHOB);
6525 SSMR3PutU8(pSSM, pThis->aCts[i].aIfs[j].uATARegSelect);
6526 SSMR3PutU8(pSSM, pThis->aCts[i].aIfs[j].uATARegStatus);
6527 SSMR3PutU8(pSSM, pThis->aCts[i].aIfs[j].uATARegCommand);
6528 SSMR3PutU8(pSSM, pThis->aCts[i].aIfs[j].uATARegDevCtl);
6529 SSMR3PutU8(pSSM, pThis->aCts[i].aIfs[j].uATATransferMode);
6530 SSMR3PutU8(pSSM, pThis->aCts[i].aIfs[j].uTxDir);
6531 SSMR3PutU8(pSSM, pThis->aCts[i].aIfs[j].iBeginTransfer);
6532 SSMR3PutU8(pSSM, pThis->aCts[i].aIfs[j].iSourceSink);
6533 SSMR3PutBool(pSSM, pThis->aCts[i].aIfs[j].fDMA);
6534 SSMR3PutBool(pSSM, pThis->aCts[i].aIfs[j].fATAPITransfer);
6535 SSMR3PutU32(pSSM, pThis->aCts[i].aIfs[j].cbTotalTransfer);
6536 SSMR3PutU32(pSSM, pThis->aCts[i].aIfs[j].cbElementaryTransfer);
6537 SSMR3PutU32(pSSM, pThis->aCts[i].aIfs[j].iIOBufferCur);
6538 SSMR3PutU32(pSSM, pThis->aCts[i].aIfs[j].iIOBufferEnd);
6539 SSMR3PutU32(pSSM, pThis->aCts[i].aIfs[j].iIOBufferPIODataStart);
6540 SSMR3PutU32(pSSM, pThis->aCts[i].aIfs[j].iIOBufferPIODataEnd);
6541 SSMR3PutU32(pSSM, pThis->aCts[i].aIfs[j].iATAPILBA);
6542 SSMR3PutU32(pSSM, pThis->aCts[i].aIfs[j].cbATAPISector);
6543 SSMR3PutMem(pSSM, &pThis->aCts[i].aIfs[j].aATAPICmd, sizeof(pThis->aCts[i].aIfs[j].aATAPICmd));
6544 SSMR3PutMem(pSSM, &pThis->aCts[i].aIfs[j].abATAPISense, sizeof(pThis->aCts[i].aIfs[j].abATAPISense));
6545 SSMR3PutU8(pSSM, pThis->aCts[i].aIfs[j].cNotifiedMediaChange);
6546 SSMR3PutU32(pSSM, pThis->aCts[i].aIfs[j].MediaEventStatus);
6547 SSMR3PutMem(pSSM, &pThis->aCts[i].aIfs[j].Led, sizeof(pThis->aCts[i].aIfs[j].Led));
6548 SSMR3PutU32(pSSM, pThis->aCts[i].aIfs[j].cbIOBuffer);
6549 if (pThis->aCts[i].aIfs[j].cbIOBuffer)
6550 SSMR3PutMem(pSSM, pThis->aCts[i].aIfs[j].CTX_SUFF(pbIOBuffer), pThis->aCts[i].aIfs[j].cbIOBuffer);
6552 Assert(pThis->aCts[i].aIfs[j].CTX_SUFF(pbIOBuffer) == NULL);
6604 for (uint32_t i = 0; i < RT_ELEMENTS(pThis->aCts); i++)
6612 for (uint32_t j = 0; j < RT_ELEMENTS(pThis->aCts[i].aIfs); j++)
6614 ATADevState const *pIf = &pThis->aCts[i].aIfs[j];
6653 for (uint32_t i = 0; i < RT_ELEMENTS(pThis->aCts); i++)
6656 if (!ataAsyncIOIsIdle(&pThis->aCts[i], false))
6662 SSMR3GetU8(pSSM, &pThis->aCts[i].iSelectedIf);
6663 SSMR3GetU8(pSSM, &pThis->aCts[i].iAIOIf);
6664 SSMR3GetU8(pSSM, &pThis->aCts[i].uAsyncIOState);
6665 SSMR3GetBool(pSSM, &pThis->aCts[i].fChainedTransfer);
6666 SSMR3GetBool(pSSM, (bool *)&pThis->aCts[i].fReset);
6667 SSMR3GetBool(pSSM, (bool *)&pThis->aCts[i].fRedo);
6668 SSMR3GetBool(pSSM, (bool *)&pThis->aCts[i].fRedoIdle);
6669 SSMR3GetBool(pSSM, (bool *)&pThis->aCts[i].fRedoDMALastDesc);
6670 SSMR3GetMem(pSSM, &pThis->aCts[i].BmDma, sizeof(pThis->aCts[i].BmDma));
6671 SSMR3GetGCPhys32(pSSM, &pThis->aCts[i].pFirstDMADesc);
6672 SSMR3GetGCPhys32(pSSM, &pThis->aCts[i].pLastDMADesc);
6673 SSMR3GetGCPhys32(pSSM, &pThis->aCts[i].pRedoDMABuffer);
6674 SSMR3GetU32(pSSM, &pThis->aCts[i].cbRedoDMABuffer);
6676 for (uint32_t j = 0; j < RT_ELEMENTS(pThis->aCts[i].aIfs); j++)
6678 SSMR3GetBool(pSSM, &pThis->aCts[i].aIfs[j].fLBA48);
6679 SSMR3GetBool(pSSM, &pThis->aCts[i].aIfs[j].fATAPI);
6680 SSMR3GetBool(pSSM, &pThis->aCts[i].aIfs[j].fIrqPending);
6681 SSMR3GetU8(pSSM, &pThis->aCts[i].aIfs[j].cMultSectors);
6682 SSMR3GetU32(pSSM, &pThis->aCts[i].aIfs[j].PCHSGeometry.cCylinders);
6683 SSMR3GetU32(pSSM, &pThis->aCts[i].aIfs[j].PCHSGeometry.cHeads);
6684 SSMR3GetU32(pSSM, &pThis->aCts[i].aIfs[j].PCHSGeometry.cSectors);
6685 SSMR3GetU32(pSSM, &pThis->aCts[i].aIfs[j].cSectorsPerIRQ);
6686 SSMR3GetU64(pSSM, &pThis->aCts[i].aIfs[j].cTotalSectors);
6687 SSMR3GetU8(pSSM, &pThis->aCts[i].aIfs[j].uATARegFeature);
6688 SSMR3GetU8(pSSM, &pThis->aCts[i].aIfs[j].uATARegFeatureHOB);
6689 SSMR3GetU8(pSSM, &pThis->aCts[i].aIfs[j].uATARegError);
6690 SSMR3GetU8(pSSM, &pThis->aCts[i].aIfs[j].uATARegNSector);
6691 SSMR3GetU8(pSSM, &pThis->aCts[i].aIfs[j].uATARegNSectorHOB);
6692 SSMR3GetU8(pSSM, &pThis->aCts[i].aIfs[j].uATARegSector);
6693 SSMR3GetU8(pSSM, &pThis->aCts[i].aIfs[j].uATARegSectorHOB);
6694 SSMR3GetU8(pSSM, &pThis->aCts[i].aIfs[j].uATARegLCyl);
6695 SSMR3GetU8(pSSM, &pThis->aCts[i].aIfs[j].uATARegLCylHOB);
6696 SSMR3GetU8(pSSM, &pThis->aCts[i].aIfs[j].uATARegHCyl);
6697 SSMR3GetU8(pSSM, &pThis->aCts[i].aIfs[j].uATARegHCylHOB);
6698 SSMR3GetU8(pSSM, &pThis->aCts[i].aIfs[j].uATARegSelect);
6699 SSMR3GetU8(pSSM, &pThis->aCts[i].aIfs[j].uATARegStatus);
6700 SSMR3GetU8(pSSM, &pThis->aCts[i].aIfs[j].uATARegCommand);
6701 SSMR3GetU8(pSSM, &pThis->aCts[i].aIfs[j].uATARegDevCtl);
6702 SSMR3GetU8(pSSM, &pThis->aCts[i].aIfs[j].uATATransferMode);
6703 SSMR3GetU8(pSSM, &pThis->aCts[i].aIfs[j].uTxDir);
6704 SSMR3GetU8(pSSM, &pThis->aCts[i].aIfs[j].iBeginTransfer);
6705 SSMR3GetU8(pSSM, &pThis->aCts[i].aIfs[j].iSourceSink);
6706 SSMR3GetBool(pSSM, &pThis->aCts[i].aIfs[j].fDMA);
6707 SSMR3GetBool(pSSM, &pThis->aCts[i].aIfs[j].fATAPITransfer);
6708 SSMR3GetU32(pSSM, &pThis->aCts[i].aIfs[j].cbTotalTransfer);
6709 SSMR3GetU32(pSSM, &pThis->aCts[i].aIfs[j].cbElementaryTransfer);
6715 pThis->aCts[i].aIfs[j].cbPIOTransferLimit = (pThis->aCts[i].aIfs[j].uATARegHCyl << 8) | pThis->aCts[i].aIfs[j].uATARegLCyl;
6716 SSMR3GetU32(pSSM, &pThis->aCts[i].aIfs[j].iIOBufferCur);
6717 SSMR3GetU32(pSSM, &pThis->aCts[i].aIfs[j].iIOBufferEnd);
6718 SSMR3GetU32(pSSM, &pThis->aCts[i].aIfs[j].iIOBufferPIODataStart);
6719 SSMR3GetU32(pSSM, &pThis->aCts[i].aIfs[j].iIOBufferPIODataEnd);
6720 SSMR3GetU32(pSSM, &pThis->aCts[i].aIfs[j].iATAPILBA);
6721 SSMR3GetU32(pSSM, &pThis->aCts[i].aIfs[j].cbATAPISector);
6722 SSMR3GetMem(pSSM, &pThis->aCts[i].aIfs[j].aATAPICmd, sizeof(pThis->aCts[i].aIfs[j].aATAPICmd));
6725 SSMR3GetMem(pSSM, pThis->aCts[i].aIfs[j].abATAPISense, sizeof(pThis->aCts[i].aIfs[j].abATAPISense));
6730 memset(pThis->aCts[i].aIfs[j].abATAPISense, '\0', sizeof(pThis->aCts[i].aIfs[j].abATAPISense));
6731 pThis->aCts[i].aIfs[j].abATAPISense[0] = 0x70 | (1 << 7);
6732 pThis->aCts[i].aIfs[j].abATAPISense[7] = 10;
6735 pThis->aCts[i].aIfs[j].abATAPISense[2] = uATAPISenseKey & 0x0f;
6736 pThis->aCts[i].aIfs[j].abATAPISense[12] = uATAPIASC;
6739 SSMR3GetU8(pSSM, &pThis->aCts[i].aIfs[j].cNotifiedMediaChange);
6741 SSMR3GetU32(pSSM, (uint32_t*)&pThis->aCts[i].aIfs[j].MediaEventStatus);
6743 pThis->aCts[i].aIfs[j].MediaEventStatus = ATA_EVENT_STATUS_UNCHANGED;
6744 SSMR3GetMem(pSSM, &pThis->aCts[i].aIfs[j].Led, sizeof(pThis->aCts[i].aIfs[j].Led));
6745 SSMR3GetU32(pSSM, &pThis->aCts[i].aIfs[j].cbIOBuffer);
6746 if (pThis->aCts[i].aIfs[j].cbIOBuffer)
6748 if (pThis->aCts[i].aIfs[j].CTX_SUFF(pbIOBuffer))
6749 SSMR3GetMem(pSSM, pThis->aCts[i].aIfs[j].CTX_SUFF(pbIOBuffer), pThis->aCts[i].aIfs[j].cbIOBuffer);
6758 size_t cbLeft = pThis->aCts[i].aIfs[j].cbIOBuffer;
6764 Assert(pThis->aCts[i].aIfs[j].CTX_SUFF(pbIOBuffer) == NULL);
6845 for (uint32_t i = 0; i < RT_ELEMENTS(pThis->aCts); i++)
6847 PDMCritSectEnter(&pThis->aCts[i].lock, VERR_INTERNAL_ERROR);
6848 for (uint32_t j = 0; j < RT_ELEMENTS(pThis->aCts[i].aIfs); j++)
6849 ataResetDevice(&pThis->aCts[i].aIfs[j]);
6850 PDMCritSectLeave(&pThis->aCts[i].lock);
6867 for (uint32_t i = 0; i < RT_ELEMENTS(pThis->aCts); i++)
6869 PDMCritSectEnter(&pThis->aCts[i].lock, VERR_INTERNAL_ERROR);
6871 pThis->aCts[i].iSelectedIf = 0;
6872 pThis->aCts[i].iAIOIf = 0;
6873 pThis->aCts[i].BmDma.u8Cmd = 0;
6877 pThis->aCts[i].BmDma.u8Status = (pThis->aCts[i].aIfs[0].pDrvBase != NULL ? BM_STATUS_D0DMA : 0)
6878 | (pThis->aCts[i].aIfs[1].pDrvBase != NULL ? BM_STATUS_D1DMA : 0);
6879 pThis->aCts[i].BmDma.pvAddr = 0;
6881 pThis->aCts[i].fReset = true;
6882 pThis->aCts[i].fRedo = false;
6883 pThis->aCts[i].fRedoIdle = false;
6884 ataAsyncIOClearRequests(&pThis->aCts[i]);
6886 ataAsyncIOPutRequest(&pThis->aCts[i], &g_ataResetARequest);
6887 ataAsyncIOPutRequest(&pThis->aCts[i], &g_ataResetCRequest);
6889 PDMCritSectLeave(&pThis->aCts[i].lock);
6911 for (uint32_t i = 0; i < RT_ELEMENTS(pThis->aCts); i++)
6913 if (pThis->aCts[i].AsyncIOThread != NIL_RTTHREAD)
6915 int rc = RTSemMutexRequest(pThis->aCts[i].AsyncIORequestMutex, RT_INDEFINITE_WAIT);
6918 ASMAtomicWriteBool(&pThis->aCts[i].fSignalIdle, true);
6919 rc = RTThreadUserReset(pThis->aCts[i].AsyncIOThread);
6922 rc = RTSemMutexRelease(pThis->aCts[i].AsyncIORequestMutex);
6925 if (!ataAsyncIOIsIdle(&pThis->aCts[i], false /*fStrict*/))
6927 rc = RTThreadUserWait(pThis->aCts[i].AsyncIOThread, 30*1000 /*ms*/);
6929 rc = RTThreadUserWait(pThis->aCts[i].AsyncIOThread, 1000 /*ms*/);
6937 ASMAtomicWriteBool(&pThis->aCts[i].fSignalIdle, false);
6965 for (uint32_t i = 0; i < RT_ELEMENTS(pThis->aCts); i++)
6967 pThis->aCts[i].pDevInsRC += offDelta;
6968 pThis->aCts[i].aIfs[0].pDevInsRC += offDelta;
6969 pThis->aCts[i].aIfs[0].pControllerRC += offDelta;
6970 ataRelocBuffer(pDevIns, &pThis->aCts[i].aIfs[0]);
6971 pThis->aCts[i].aIfs[1].pDevInsRC += offDelta;
6972 pThis->aCts[i].aIfs[1].pControllerRC += offDelta;
6973 ataRelocBuffer(pDevIns, &pThis->aCts[i].aIfs[1]);
6996 for (uint32_t i = 0; i < RT_ELEMENTS(pThis->aCts); i++)
6998 if (pThis->aCts[i].AsyncIOThread != NIL_RTTHREAD)
7000 ASMAtomicWriteU32(&pThis->aCts[i].fShutdown, true);
7001 rc = RTSemEventSignal(pThis->aCts[i].AsyncIOSem);
7003 rc = RTSemEventSignal(pThis->aCts[i].SuspendIOSem);
7011 for (unsigned i = 0; i < RT_ELEMENTS(pThis->aCts); i++)
7013 if (pThis->aCts[i].AsyncIOThread != NIL_RTTHREAD)
7015 rc = RTThreadWait(pThis->aCts[i].AsyncIOThread, 30000 /* 30 s*/, NULL);
7017 pThis->aCts[i].AsyncIOThread = NIL_RTTHREAD;
7020 i, pThis->aCts[i].iSelectedIf, pThis->aCts[i].iAIOIf,
7021 pThis->aCts[i].aIfs[0].uATARegCommand, pThis->aCts[i].aIfs[1].uATARegCommand, rc));
7028 for (uint32_t i = 0; i < RT_ELEMENTS(pThis->aCts); i++)
7030 if (pThis->aCts[i].AsyncIORequestMutex != NIL_RTSEMMUTEX)
7032 RTSemMutexDestroy(pThis->aCts[i].AsyncIORequestMutex);
7033 pThis->aCts[i].AsyncIORequestMutex = NIL_RTSEMMUTEX;
7035 if (pThis->aCts[i].AsyncIOSem != NIL_RTSEMEVENT)
7037 RTSemEventDestroy(pThis->aCts[i].AsyncIOSem);
7038 pThis->aCts[i].AsyncIOSem = NIL_RTSEMEVENT;
7040 if (pThis->aCts[i].SuspendIOSem != NIL_RTSEMEVENT)
7042 RTSemEventDestroy(pThis->aCts[i].SuspendIOSem);
7043 pThis->aCts[i].SuspendIOSem = NIL_RTSEMEVENT;
7047 if (pThis->aCts[i].AsyncIOThread != NIL_RTTHREAD)
7049 rc = RTThreadWait(pThis->aCts[i].AsyncIOThread, 1 /*ms*/, NULL);
7052 pThis->aCts[i].AsyncIOThread = NIL_RTTHREAD;
7057 for (uint32_t iIf = 0; iIf < RT_ELEMENTS(pThis->aCts[i].aIfs); iIf++)
7059 if (pThis->aCts[i].aIfs[iIf].pTrackList)
7061 ATAPIPassthroughTrackListDestroy(pThis->aCts[i].aIfs[iIf].pTrackList);
7062 pThis->aCts[i].aIfs[iIf].pTrackList = NULL;
7120 for (uint32_t i = 0; i < RT_ELEMENTS(pThis->aCts); i++)
7122 pThis->aCts[i].AsyncIOSem = NIL_RTSEMEVENT;
7123 pThis->aCts[i].SuspendIOSem = NIL_RTSEMEVENT;
7124 pThis->aCts[i].AsyncIORequestMutex = NIL_RTSEMMUTEX;
7125 pThis->aCts[i].AsyncIOThread = NIL_RTTHREAD;
7223 for (uint32_t i = 0; i < RT_ELEMENTS(pThis->aCts); i++)
7225 pThis->aCts[i].pDevInsR3 = pDevIns;
7226 pThis->aCts[i].pDevInsR0 = PDMDEVINS_2_R0PTR(pDevIns);
7227 pThis->aCts[i].pDevInsRC = PDMDEVINS_2_RCPTR(pDevIns);
7228 pThis->aCts[i].DelayIRQMillies = (uint32_t)DelayIRQMillies;
7229 for (uint32_t j = 0; j < RT_ELEMENTS(pThis->aCts[i].aIfs); j++)
7231 ATADevState *pIf = &pThis->aCts[i].aIfs[j];
7233 pIf->iLUN = i * RT_ELEMENTS(pThis->aCts) + j;
7237 pIf->pControllerR3 = &pThis->aCts[i];
7238 pIf->pControllerR0 = MMHyperR3ToR0(PDMDevHlpGetVM(pDevIns), &pThis->aCts[i]);
7239 pIf->pControllerRC = MMHyperR3ToRC(PDMDevHlpGetVM(pDevIns), &pThis->aCts[i]);
7248 Assert(RT_ELEMENTS(pThis->aCts) == 2);
7249 pThis->aCts[0].irq = 14;
7250 pThis->aCts[0].IOPortBase1 = 0x1f0;
7251 pThis->aCts[0].IOPortBase2 = 0x3f6;
7252 pThis->aCts[1].irq = 15;
7253 pThis->aCts[1].IOPortBase1 = 0x170;
7254 pThis->aCts[1].IOPortBase2 = 0x376;
7281 for (uint32_t i = 0; i < RT_ELEMENTS(pThis->aCts); i++)
7283 rc = PDMDevHlpIOPortRegister(pDevIns, pThis->aCts[i].IOPortBase1, 8, (RTHCPTR)(uintptr_t)i,
7290 rc = PDMDevHlpIOPortRegisterRC(pDevIns, pThis->aCts[i].IOPortBase1, 8, (RTGCPTR)i,
7299 rc = PDMDevHlpIOPortRegisterR0(pDevIns, pThis->aCts[i].IOPortBase1, 8, (RTR0PTR)i,
7302 rc = PDMDevHlpIOPortRegisterR0(pDevIns, pThis->aCts[i].IOPortBase1, 8, (RTR0PTR)i,
7309 rc = PDMDevHlpIOPortRegister(pDevIns, pThis->aCts[i].IOPortBase2, 1, (RTHCPTR)(uintptr_t)i,
7316 rc = PDMDevHlpIOPortRegisterRC(pDevIns, pThis->aCts[i].IOPortBase2, 1, (RTGCPTR)i,
7323 rc = PDMDevHlpIOPortRegisterR0(pDevIns, pThis->aCts[i].IOPortBase2, 1, (RTR0PTR)i,
7329 for (uint32_t j = 0; j < RT_ELEMENTS(pThis->aCts[i].aIfs); j++)
7331 ATADevState *pIf = &pThis->aCts[i].aIfs[j];
7362 PDMDevHlpSTAMRegisterF(pDevIns, &pThis->aCts[i].StatAsyncOps, STAMTYPE_COUNTER, STAMVISIBILITY_ALWAYS, STAMUNIT_OCCURENCES,
7365 PDMDevHlpSTAMRegisterF(pDevIns, &pThis->aCts[i].StatAsyncMinWait, STAMTYPE_U64_RESET, STAMVISIBILITY_ALWAYS, STAMUNIT_NONE,
7367 PDMDevHlpSTAMRegisterF(pDevIns, &pThis->aCts[i].StatAsyncMaxWait, STAMTYPE_U64_RESET, STAMVISIBILITY_ALWAYS, STAMUNIT_NONE,
7369 PDMDevHlpSTAMRegisterF(pDevIns, &pThis->aCts[i].StatAsyncTimeUS, STAMTYPE_COUNTER, STAMVISIBILITY_ALWAYS, STAMUNIT_NONE,
7371 PDMDevHlpSTAMRegisterF(pDevIns, &pThis->aCts[i].StatAsyncTime, STAMTYPE_PROFILE_ADV, STAMVISIBILITY_ALWAYS, STAMUNIT_TICKS_PER_CALL,
7373 PDMDevHlpSTAMRegisterF(pDevIns, &pThis->aCts[i].StatLockWait, STAMTYPE_PROFILE, STAMVISIBILITY_ALWAYS, STAMUNIT_TICKS_PER_CALL,
7378 rc = PDMDevHlpCritSectInit(pDevIns, &pThis->aCts[i].lock, RT_SRC_POS, "ATA#%u", i);
7402 for (uint32_t i = 0; i < RT_ELEMENTS(pThis->aCts); i++)
7404 PATACONTROLLER pCtl = &pThis->aCts[i];
7425 static const char *s_apszDescs[RT_ELEMENTS(pThis->aCts)][RT_ELEMENTS(pCtl->aIfs)] =
7446 static const char *s_apszCFGMKeys[RT_ELEMENTS(pThis->aCts)][RT_ELEMENTS(pCtl->aIfs)] =
7465 pThis->aCts[i].IOPortBase1, pThis->aCts[i].IOPortBase2);