Lines Matching refs:pBusLogic

979 static int buslogicR3RegisterISARange(PBUSLOGIC pBusLogic, uint8_t uBaseCode);
986 * @param pBusLogic Pointer to the BusLogic device instance.
990 static void buslogicSetInterrupt(PBUSLOGIC pBusLogic, bool fSuppressIrq, uint8_t uIrqType)
992 LogFlowFunc(("pBusLogic=%#p\n", pBusLogic));
997 if (!(pBusLogic->regInterrupt & BL_INTR_CMDC))
998 pBusLogic->regInterrupt |= uIrqType; /* Report now. */
1000 pBusLogic->uPendingIntr |= uIrqType; /* Report later. */
1004 AssertMsg(pBusLogic->regInterrupt == 0 || pBusLogic->regInterrupt == (BL_INTR_INTV | BL_INTR_CMDC),
1005 ("regInterrupt=%02X\n", pBusLogic->regInterrupt));
1006 pBusLogic->regInterrupt |= uIrqType;
1011 pBusLogic->regInterrupt |= BL_INTR_INTV;
1012 if (pBusLogic->fIRQEnabled && !fSuppressIrq)
1013 PDMDevHlpPCISetIrq(pBusLogic->CTX_SUFF(pDevIns), 0, 1);
1022 static void buslogicClearInterrupt(PBUSLOGIC pBusLogic)
1024 LogFlowFunc(("pBusLogic=%#p, clearing %#02x (pending %#02x)\n",
1025 pBusLogic, pBusLogic->regInterrupt, pBusLogic->uPendingIntr));
1026 pBusLogic->regInterrupt = 0;
1027 PDMDevHlpPCISetIrq(pBusLogic->CTX_SUFF(pDevIns), 0, 0);
1029 if (pBusLogic->uPendingIntr)
1031 buslogicSetInterrupt(pBusLogic, false, pBusLogic->uPendingIntr);
1032 pBusLogic->uPendingIntr = 0;
1041 DECLINLINE(void) buslogicR3OutgoingMailboxAdvance(PBUSLOGIC pBusLogic)
1043 pBusLogic->uMailboxOutgoingPositionCurrent = (pBusLogic->uMailboxOutgoingPositionCurrent + 1) % pBusLogic->cMailbox;
1050 * @param pBusLogic.
1052 static void buslogicR3InitializeLocalRam(PBUSLOGIC pBusLogic)
1061 memset(pBusLogic->LocalRam.u8View, 0, sizeof(HostAdapterLocalRam));
1062 pBusLogic->LocalRam.structured.autoSCSIData.fLevelSensitiveInterrupt = true;
1063 pBusLogic->LocalRam.structured.autoSCSIData.fParityCheckingEnabled = true;
1064 pBusLogic->LocalRam.structured.autoSCSIData.fExtendedTranslation = true; /* Same as in geometry register. */
1065 pBusLogic->LocalRam.structured.autoSCSIData.u16DeviceEnabledMask = ~0; /* All enabled. Maybe mask out non present devices? */
1066 pBusLogic->LocalRam.structured.autoSCSIData.u16WidePermittedMask = ~0;
1067 pBusLogic->LocalRam.structured.autoSCSIData.u16FastPermittedMask = ~0;
1068 pBusLogic->LocalRam.structured.autoSCSIData.u16SynchronousPermittedMask = ~0;
1069 pBusLogic->LocalRam.structured.autoSCSIData.u16DisconnectPermittedMask = ~0;
1070 pBusLogic->LocalRam.structured.autoSCSIData.fStrictRoundRobinMode = pBusLogic->fStrictRoundRobinMode;
1071 pBusLogic->LocalRam.structured.autoSCSIData.u16UltraPermittedMask = ~0;
1079 * @param pBusLogic Pointer to the BusLogic device instance.
1082 static int buslogicR3HwReset(PBUSLOGIC pBusLogic, bool fResetIO)
1084 LogFlowFunc(("pBusLogic=%#p\n", pBusLogic));
1087 pBusLogic->regStatus = BL_STAT_HARDY | BL_STAT_INREQ;
1088 pBusLogic->regGeometry = BL_GEOM_XLATEN;
1089 pBusLogic->uOperationCode = 0xff; /* No command executing. */
1090 pBusLogic->iParameter = 0;
1091 pBusLogic->cbCommandParametersLeft = 0;
1092 pBusLogic->fIRQEnabled = true;
1093 pBusLogic->fStrictRoundRobinMode = false;
1094 pBusLogic->fExtendedLunCCBFormat = false;
1095 pBusLogic->uMailboxOutgoingPositionCurrent = 0;
1096 pBusLogic->uMailboxIncomingPositionCurrent = 0;
1099 pBusLogic->uPendingIntr = 0;
1100 buslogicClearInterrupt(pBusLogic);
1105 buslogicR3RegisterISARange(pBusLogic, pBusLogic->uDefaultISABaseCode);
1107 buslogicR3InitializeLocalRam(pBusLogic);
1108 vboxscsiInitialize(&pBusLogic->VBoxSCSI);
1119 * @param pBusLogic Pointer to the BusLogic device instance
1122 static void buslogicCommandComplete(PBUSLOGIC pBusLogic, bool fSuppressIrq)
1124 LogFlowFunc(("pBusLogic=%#p\n", pBusLogic));
1126 pBusLogic->fUseLocalRam = false;
1127 pBusLogic->regStatus |= BL_STAT_HARDY;
1128 pBusLogic->iReply = 0;
1131 if (pBusLogic->uOperationCode != BUSLOGICCOMMAND_EXECUTE_MAILBOX_COMMAND)
1134 pBusLogic->regStatus &= ~BL_STAT_DIRRDY;
1135 buslogicSetInterrupt(pBusLogic, fSuppressIrq, BL_INTR_CMDC);
1138 pBusLogic->uOperationCode = 0xff;
1139 pBusLogic->iParameter = 0;
1148 * @param pBusLogic Pointer to the BusLogic device instance.
1151 static void buslogicR3InitiateReset(PBUSLOGIC pBusLogic, bool fHardReset)
1153 LogFlowFunc(("pBusLogic=%#p fHardReset=%d\n", pBusLogic, fHardReset));
1155 buslogicR3HwReset(pBusLogic, false);
1160 pBusLogic->regStatus |= BL_STAT_DACT;
1161 pBusLogic->regStatus &= ~BL_STAT_HARDY;
1164 pBusLogic->u64ResetTime = PDMDevHlpTMTimeVirtGetNano(pBusLogic->CTX_SUFF(pDevIns));
1172 * @param pBusLogic Pointer to the BusLogic device instance.
1178 static void buslogicR3SendIncomingMailbox(PBUSLOGIC pBusLogic, PBUSLOGICTASKSTATE pTaskState,
1186 int rc = PDMCritSectEnter(&pBusLogic->CritSectIntr, VINF_SUCCESS);
1189 RTGCPHYS GCPhysAddrMailboxIncoming = pBusLogic->GCPhysAddrMailboxIncomingBase
1190 + ( pBusLogic->uMailboxIncomingPositionCurrent
1203 PDMDevHlpPCIPhysWrite(pBusLogic->CTX_SUFF(pDevIns), GCPhysAddrCCB,
1210 PDMDevHlpPhysRead(pBusLogic->CTX_SUFF(pDevIns), GCPhysAddrMailboxIncoming + uCodeOffs, &uCode, sizeof(uCode));
1222 PDMDevHlpPCIPhysWrite(pBusLogic->CTX_SUFF(pDevIns), GCPhysAddrMailboxIncoming, &Mbx24, sizeof(Mailbox24));
1227 PDMDevHlpPCIPhysWrite(pBusLogic->CTX_SUFF(pDevIns), GCPhysAddrMailboxIncoming,
1232 pBusLogic->uMailboxIncomingPositionCurrent++;
1233 if (pBusLogic->uMailboxIncomingPositionCurrent >= pBusLogic->cMailbox)
1234 pBusLogic->uMailboxIncomingPositionCurrent = 0;
1237 ASMAtomicIncU32(&pBusLogic->cInMailboxesReady);
1240 buslogicSetInterrupt(pBusLogic, false, BL_INTR_IMBL);
1242 PDMCritSectLeave(&pBusLogic->CritSectIntr);
1323 PPDMDEVINS pDevIns = pTaskState->CTX_SUFF(pTargetDevice)->CTX_SUFF(pBusLogic)->CTX_SUFF(pDevIns);
1350 PPDMDEVINS pDevIns = pTaskState->CTX_SUFF(pTargetDevice)->CTX_SUFF(pBusLogic)->CTX_SUFF(pDevIns);
1494 PPDMDEVINS pDevIns = pTaskState->CTX_SUFF(pTargetDevice)->CTX_SUFF(pBusLogic)->CTX_SUFF(pDevIns);
1632 PPDMDEVINS pDevIns = pTaskState->CTX_SUFF(pTargetDevice)->CTX_SUFF(pBusLogic)->CTX_SUFF(pDevIns);
1664 PPDMDEVINS pDevIns = pTaskState->CTX_SUFF(pTargetDevice)->CTX_SUFF(pBusLogic)->CTX_SUFF(pDevIns);
1686 * @param pBusLogic Pointer to the BusLogic device instance.
1688 static int buslogicProcessCommand(PBUSLOGIC pBusLogic)
1693 LogFlowFunc(("pBusLogic=%#p\n", pBusLogic));
1694 AssertMsg(pBusLogic->uOperationCode != 0xff, ("There is no command to execute\n"));
1696 switch (pBusLogic->uOperationCode)
1700 pBusLogic->cbReplyParametersLeft = 0;
1704 PReplyInquirePCIHostAdapterInformation pReply = (PReplyInquirePCIHostAdapterInformation)pBusLogic->aReplyBuffer;
1709 pReply->IsaIOPort = pBusLogic->uISABaseCode;
1710 pReply->IRQ = PCIDevGetInterruptLine(&pBusLogic->dev);
1711 pBusLogic->cbReplyParametersLeft = sizeof(ReplyInquirePCIHostAdapterInformation);
1721 Log(("ISA I/O for PCI (code %x)\n", pBusLogic->aCommandBuffer[0]));
1722 buslogicR3RegisterISARange(pBusLogic, pBusLogic->aCommandBuffer[0]);
1723 pBusLogic->cbReplyParametersLeft = 0;
1736 pBusLogic->aReplyBuffer[0] = 'A'; /* Firmware option bytes */
1737 pBusLogic->aReplyBuffer[1] = 'A'; /* Special option byte */
1740 pBusLogic->aReplyBuffer[2] = '5'; /* Major version 5 */
1741 pBusLogic->aReplyBuffer[3] = '0'; /* Minor version 0 */
1742 pBusLogic->cbReplyParametersLeft = 4; /* Reply is 4 bytes long */
1747 pBusLogic->aReplyBuffer[0] = '7';
1748 pBusLogic->cbReplyParametersLeft = 1;
1753 pBusLogic->aReplyBuffer[0] = 'B';
1754 pBusLogic->cbReplyParametersLeft = 1;
1759 if (pBusLogic->iParameter == 1)
1762 pBusLogic->cbCommandParametersLeft = pBusLogic->aCommandBuffer[0];
1763 Log(("Set HA options: %u bytes follow\n", pBusLogic->cbCommandParametersLeft));
1768 Log(("Set HA options: received %u bytes\n", pBusLogic->aCommandBuffer[0]));
1771 pBusLogic->cbReplyParametersLeft = 0;
1778 if (pBusLogic->iParameter == 12)
1781 pBusLogic->cbCommandParametersLeft = pBusLogic->aCommandBuffer[11];
1782 Log(("Execute SCSI cmd: %u more bytes follow\n", pBusLogic->cbCommandParametersLeft));
1789 Log(("Execute SCSI cmd: received %u bytes\n", pBusLogic->aCommandBuffer[0]));
1791 pCmd = (PESCMD)pBusLogic->aCommandBuffer;
1795 pBusLogic->cbReplyParametersLeft = 4;
1796 pBusLogic->aReplyBuffer[0] = pBusLogic->aReplyBuffer[1] = 0;
1797 pBusLogic->aReplyBuffer[2] = 0x11; /* HBA status (timeout). */
1798 pBusLogic->aReplyBuffer[3] = 0; /* Device status. */
1804 pBusLogic->cbReplyParametersLeft = pBusLogic->aCommandBuffer[0];
1805 memset(pBusLogic->aReplyBuffer, ' ', pBusLogic->cbReplyParametersLeft);
1807 int cCharsToTransfer = (pBusLogic->cbReplyParametersLeft <= (sizeof(aModelName) - 1))
1808 ? pBusLogic->cbReplyParametersLeft
1812 pBusLogic->aReplyBuffer[i] = aModelName[i];
1818 uint8_t uPciIrq = PCIDevGetInterruptLine(&pBusLogic->dev);
1820 pBusLogic->cbReplyParametersLeft = sizeof(ReplyInquireConfiguration);
1821 PReplyInquireConfiguration pReply = (PReplyInquireConfiguration)pBusLogic->aReplyBuffer;
1852 pBusLogic->cbReplyParametersLeft = pBusLogic->aCommandBuffer[0];
1853 PReplyInquireExtendedSetupInformation pReply = (PReplyInquireExtendedSetupInformation)pBusLogic->aReplyBuffer;
1859 pReply->cMailbox = pBusLogic->cMailbox;
1860 pReply->uMailboxAddressBase = (uint32_t)pBusLogic->GCPhysAddrMailboxOutgoingBase;
1871 pBusLogic->cbReplyParametersLeft = pBusLogic->aCommandBuffer[0];
1872 PReplyInquireSetupInformation pReply = (PReplyInquireSetupInformation)pBusLogic->aReplyBuffer;
1876 pReply->cMailbox = pBusLogic->cMailbox;
1877 U32_TO_ADDR(pReply->MailboxAddress, pBusLogic->GCPhysAddrMailboxOutgoingBase);
1892 uint8_t uOffset = pBusLogic->aCommandBuffer[0];
1893 pBusLogic->cbReplyParametersLeft = pBusLogic->aCommandBuffer[1];
1895 pBusLogic->fUseLocalRam = true;
1896 pBusLogic->iReply = uOffset;
1901 PRequestInitMbx pRequest = (PRequestInitMbx)pBusLogic->aCommandBuffer;
1903 pBusLogic->fMbxIs24Bit = true;
1904 pBusLogic->cMailbox = pRequest->cMailbox;
1905 pBusLogic->GCPhysAddrMailboxOutgoingBase = (RTGCPHYS)ADDR_TO_U32(pRequest->aMailboxBaseAddr);
1907 pBusLogic->GCPhysAddrMailboxIncomingBase = pBusLogic->GCPhysAddrMailboxOutgoingBase + (pBusLogic->cMailbox * sizeof(Mailbox24));
1909 Log(("GCPhysAddrMailboxOutgoingBase=%RGp\n", pBusLogic->GCPhysAddrMailboxOutgoingBase));
1910 Log(("GCPhysAddrMailboxIncomingBase=%RGp\n", pBusLogic->GCPhysAddrMailboxIncomingBase));
1911 Log(("cMailboxes=%u (24-bit mode)\n", pBusLogic->cMailbox));
1914 pBusLogic->regStatus &= ~BL_STAT_INREQ;
1915 pBusLogic->cbReplyParametersLeft = 0;
1920 PRequestInitializeExtendedMailbox pRequest = (PRequestInitializeExtendedMailbox)pBusLogic->aCommandBuffer;
1922 pBusLogic->fMbxIs24Bit = false;
1923 pBusLogic->cMailbox = pRequest->cMailbox;
1924 pBusLogic->GCPhysAddrMailboxOutgoingBase = (RTGCPHYS)pRequest->uMailboxBaseAddress;
1926 pBusLogic->GCPhysAddrMailboxIncomingBase = (RTGCPHYS)pRequest->uMailboxBaseAddress + (pBusLogic->cMailbox * sizeof(Mailbox32));
1928 Log(("GCPhysAddrMailboxOutgoingBase=%RGp\n", pBusLogic->GCPhysAddrMailboxOutgoingBase));
1929 Log(("GCPhysAddrMailboxIncomingBase=%RGp\n", pBusLogic->GCPhysAddrMailboxIncomingBase));
1930 Log(("cMailboxes=%u (32-bit mode)\n", pBusLogic->cMailbox));
1933 pBusLogic->regStatus &= ~BL_STAT_INREQ;
1934 pBusLogic->cbReplyParametersLeft = 0;
1939 if (pBusLogic->aCommandBuffer[0] == 0)
1940 pBusLogic->fStrictRoundRobinMode = false;
1941 else if (pBusLogic->aCommandBuffer[0] == 1)
1942 pBusLogic->fStrictRoundRobinMode = true;
1944 AssertMsgFailed(("Invalid round robin mode %d\n", pBusLogic->aCommandBuffer[0]));
1946 pBusLogic->cbReplyParametersLeft = 0;
1951 if (pBusLogic->aCommandBuffer[0] == 0)
1952 pBusLogic->fExtendedLunCCBFormat = false;
1953 else if (pBusLogic->aCommandBuffer[0] == 1)
1954 pBusLogic->fExtendedLunCCBFormat = true;
1956 AssertMsgFailed(("Invalid CCB format %d\n", pBusLogic->aCommandBuffer[0]));
1958 pBusLogic->cbReplyParametersLeft = 0;
1965 memset(pBusLogic->aReplyBuffer, 0, 8);
1968 if (pBusLogic->aDeviceStates[i].fPresent)
1969 pBusLogic->aReplyBuffer[i] = 1;
1971 pBusLogic->aReplyBuffer[7] = 0; /* HA hardcoded at ID 7. */
1972 pBusLogic->cbReplyParametersLeft = 8;
1976 memset(pBusLogic->aReplyBuffer, 0, 8);
1979 if (pBusLogic->aDeviceStates[i + 8].fPresent)
1980 pBusLogic->aReplyBuffer[i] = 1;
1982 pBusLogic->cbReplyParametersLeft = 8;
1989 for (uint8_t i = 0; i < RT_ELEMENTS(pBusLogic->aDeviceStates); i++)
1991 if (pBusLogic->aDeviceStates[i].fPresent)
1994 pBusLogic->aReplyBuffer[0] = (uint8_t)u16TargetsPresentMask;
1995 pBusLogic->aReplyBuffer[1] = (uint8_t)(u16TargetsPresentMask >> 8);
1996 pBusLogic->cbReplyParametersLeft = 2;
2001 pBusLogic->cbReplyParametersLeft = pBusLogic->aCommandBuffer[0];
2003 for (uint8_t i = 0; i < pBusLogic->cbReplyParametersLeft; i++)
2004 pBusLogic->aReplyBuffer[i] = 0; /** @todo Figure if we need something other here. It's not needed for the linux driver */
2010 if (pBusLogic->aCommandBuffer[0] == 0)
2011 pBusLogic->fIRQEnabled = false;
2013 pBusLogic->fIRQEnabled = true;
2020 pBusLogic->aReplyBuffer[0] = pBusLogic->aCommandBuffer[0];
2021 pBusLogic->cbReplyParametersLeft = 1;
2026 pBusLogic->cbReplyParametersLeft = 0;
2027 pBusLogic->LocalRam.structured.autoSCSIData.uBusOnDelay = pBusLogic->aCommandBuffer[0];
2028 Log(("Bus-on time: %d\n", pBusLogic->aCommandBuffer[0]));
2033 pBusLogic->cbReplyParametersLeft = 0;
2034 pBusLogic->LocalRam.structured.autoSCSIData.uBusOffDelay = pBusLogic->aCommandBuffer[0];
2035 Log(("Bus-off time: %d\n", pBusLogic->aCommandBuffer[0]));
2040 pBusLogic->cbReplyParametersLeft = 0;
2041 pBusLogic->LocalRam.structured.autoSCSIData.uDMATransferRate = pBusLogic->aCommandBuffer[0];
2042 Log(("Bus transfer rate: %02X\n", pBusLogic->aCommandBuffer[0]));
2050 pBusLogic->cbReplyParametersLeft = 0;
2051 addr.hi = pBusLogic->aCommandBuffer[0];
2052 addr.mid = pBusLogic->aCommandBuffer[1];
2053 addr.lo = pBusLogic->aCommandBuffer[2];
2056 PDMDevHlpPhysRead(pBusLogic->CTX_SUFF(pDevIns), GCPhysFifoBuf,
2057 &pBusLogic->LocalRam.u8View[64], 64);
2065 pBusLogic->cbReplyParametersLeft = 0;
2066 addr.hi = pBusLogic->aCommandBuffer[0];
2067 addr.mid = pBusLogic->aCommandBuffer[1];
2068 addr.lo = pBusLogic->aCommandBuffer[2];
2071 PDMDevHlpPCIPhysWrite(pBusLogic->CTX_SUFF(pDevIns), GCPhysFifoBuf,
2072 &pBusLogic->LocalRam.u8View[64], 64);
2076 AssertMsgFailed(("Invalid command %#x\n", pBusLogic->uOperationCode));
2082 Log(("Command %#x not valid for this adapter\n", pBusLogic->uOperationCode));
2083 pBusLogic->cbReplyParametersLeft = 0;
2084 pBusLogic->regStatus |= BL_STAT_CMDINV;
2090 Log(("uOperationCode=%#x, cbReplyParametersLeft=%d\n", pBusLogic->uOperationCode, pBusLogic->cbReplyParametersLeft));
2093 if (pBusLogic->cbReplyParametersLeft)
2094 pBusLogic->regStatus |= BL_STAT_DIRRDY;
2095 else if (!pBusLogic->cbCommandParametersLeft)
2096 buslogicCommandComplete(pBusLogic, fSuppressIrq);
2105 * @param pBusLogic Pointer to the BusLogic instance data.
2109 static int buslogicRegisterRead(PBUSLOGIC pBusLogic, unsigned iRegister, uint32_t *pu32)
2117 *pu32 = pBusLogic->regStatus;
2126 if (pBusLogic->regStatus & BL_STAT_DACT)
2128 uint64_t u64AccessTime = PDMDevHlpTMTimeVirtGetNano(pBusLogic->CTX_SUFF(pDevIns));
2130 pBusLogic->regStatus &= ~BL_STAT_DACT;
2131 pBusLogic->regStatus |= BL_STAT_HARDY;
2133 if (u64AccessTime - pBusLogic->u64ResetTime > BUSLOGIC_RESET_DURATION_NS)
2136 *pu32 = pBusLogic->regStatus;
2137 pBusLogic->u64ResetTime = 0;
2144 if (pBusLogic->fUseLocalRam)
2145 *pu32 = pBusLogic->LocalRam.u8View[pBusLogic->iReply];
2147 *pu32 = pBusLogic->aReplyBuffer[pBusLogic->iReply];
2152 if (pBusLogic->cbReplyParametersLeft)
2154 pBusLogic->iReply++;
2155 pBusLogic->cbReplyParametersLeft--;
2156 if (!pBusLogic->cbReplyParametersLeft)
2162 buslogicCommandComplete(pBusLogic, false);
2166 pBusLogic->iReply, pBusLogic->cbReplyParametersLeft));
2171 *pu32 = pBusLogic->regInterrupt;
2176 *pu32 = pBusLogic->regGeometry;
2193 * @param pBusLogic Pointer to the BusLogic instance data.
2197 static int buslogicRegisterWrite(PBUSLOGIC pBusLogic, unsigned iRegister, uint8_t uVal)
2211 buslogicR3InitiateReset(pBusLogic, fHardReset);
2218 rc = PDMCritSectEnter(&pBusLogic->CritSectIntr, VINF_IOM_R3_IOPORT_WRITE);
2223 uint32_t cMailboxesReady = ASMAtomicXchgU32(&pBusLogic->cInMailboxesReady, 0);
2228 buslogicClearInterrupt(pBusLogic);
2230 PDMCritSectLeave(&pBusLogic->CritSectIntr);
2237 if ((uVal == BUSLOGICCOMMAND_EXECUTE_MAILBOX_COMMAND) && (pBusLogic->uOperationCode == 0xff))
2240 if (pBusLogic->cMailbox)
2242 ASMAtomicIncU32(&pBusLogic->cMailboxesReady);
2243 if (!ASMAtomicXchgBool(&pBusLogic->fNotificationSend, true))
2246 PPDMQUEUEITEMCORE pItem = PDMQueueAlloc(pBusLogic->CTX_SUFF(pNotifierQueue));
2248 PDMQueueInsert(pBusLogic->CTX_SUFF(pNotifierQueue), (PPDMQUEUEITEMCORE)pItem);
2259 if (pBusLogic->uOperationCode == 0xff)
2261 pBusLogic->uOperationCode = uVal;
2262 pBusLogic->iParameter = 0;
2265 pBusLogic->regStatus &= ~(BL_STAT_HARDY | BL_STAT_CMDINV);
2268 switch (pBusLogic->uOperationCode)
2279 pBusLogic->cbCommandParametersLeft = 0;
2293 pBusLogic->cbCommandParametersLeft = 1;
2296 pBusLogic->cbCommandParametersLeft = 2;
2300 pBusLogic->cbCommandParametersLeft = 3;
2303 pBusLogic->cbCommandParametersLeft = sizeof(RequestInitMbx);
2306 pBusLogic->cbCommandParametersLeft = sizeof(RequestInitializeExtendedMailbox);
2310 pBusLogic->cbCommandParametersLeft = 1;
2314 pBusLogic->cbCommandParametersLeft = 12;
2319 pBusLogic->cbCommandParametersLeft = 0;
2330 if (pBusLogic->uOperationCode == BUSLOGICCOMMAND_MODIFY_IO_ADDRESS)
2342 pBusLogic->aCommandBuffer[pBusLogic->iParameter] = uVal;
2343 pBusLogic->iParameter++;
2344 pBusLogic->cbCommandParametersLeft--;
2348 if (!pBusLogic->cbCommandParametersLeft)
2350 rc = buslogicProcessCommand(pBusLogic);
2360 pBusLogic->regInterrupt = uVal;
2364 pBusLogic->regGeometry = uVal;
2424 PBUSLOGIC pBusLogic = PDMINS_2_DATA(pDevIns, PBUSLOGIC);
2429 return buslogicRegisterRead(pBusLogic, iRegister, pu32);
2445 PBUSLOGIC pBusLogic = PDMINS_2_DATA(pDevIns, PBUSLOGIC);
2452 rc = buslogicRegisterWrite(pBusLogic, iRegister, (uint8_t)uVal);
2462 static int buslogicR3PrepareBIOSSCSIRequest(PBUSLOGIC pBusLogic)
2468 rc = RTMemCacheAllocEx(pBusLogic->hTaskCache, (void **)&pTaskState);
2473 rc = vboxscsiSetupRequest(&pBusLogic->VBoxSCSI, &pTaskState->PDMScsiRequest, &uTargetDevice);
2478 pTaskState->CTX_SUFF(pTargetDevice) = &pBusLogic->aDeviceStates[uTargetDevice];
2492 memcpy(pBusLogic->VBoxSCSI.pbBuf, &ScsiInquiryData, 5);
2494 rc = vboxscsiRequestFinished(&pBusLogic->VBoxSCSI, &pTaskState->PDMScsiRequest, SCSI_STATUS_OK);
2497 RTMemCacheFree(pBusLogic->hTaskCache, pTaskState);
2528 PBUSLOGIC pBusLogic = PDMINS_2_DATA(pDevIns, PBUSLOGIC);
2532 rc = vboxscsiReadRegister(&pBusLogic->VBoxSCSI, (Port - BUSLOGIC_BIOS_IO_PORT), pu32);
2554 PBUSLOGIC pBusLogic = PDMINS_2_DATA(pDevIns, PBUSLOGIC);
2561 rc = vboxscsiWriteRegister(&pBusLogic->VBoxSCSI, (Port - BUSLOGIC_BIOS_IO_PORT), (uint8_t)u32);
2564 rc = buslogicR3PrepareBIOSSCSIRequest(pBusLogic);
2580 PBUSLOGIC pBusLogic = PDMINS_2_DATA(pDevIns, PBUSLOGIC);
2586 rc = vboxscsiWriteString(pDevIns, &pBusLogic->VBoxSCSI, (Port - BUSLOGIC_BIOS_IO_PORT),
2590 rc = buslogicR3PrepareBIOSSCSIRequest(pBusLogic);
2606 PBUSLOGIC pBusLogic = PDMINS_2_DATA(pDevIns, PBUSLOGIC);
2611 return vboxscsiReadString(pDevIns, &pBusLogic->VBoxSCSI, (Port - BUSLOGIC_BIOS_IO_PORT),
2619 * @param pBusLogic Pointer to the BusLogic device instance.
2622 static int buslogicR3RegisterISARange(PBUSLOGIC pBusLogic, uint8_t uBaseCode)
2631 if (uNewBase != pBusLogic->IOISABase)
2634 if (pBusLogic->IOISABase)
2635 rc = PDMDevHlpIOPortDeregister(pBusLogic->CTX_SUFF(pDevIns), pBusLogic->IOISABase, 4);
2639 pBusLogic->IOISABase = 0; /* First mark as unregistered. */
2640 pBusLogic->uISABaseCode = ISA_BASE_DISABLED;
2645 rc = PDMDevHlpIOPortRegister(pBusLogic->CTX_SUFF(pDevIns), uNewBase, 4, NULL,
2651 pBusLogic->IOISABase = uNewBase;
2652 pBusLogic->uISABaseCode = uCode;
2802 PBUSLOGIC pBusLogic = pBusLogicDevice->CTX_SUFF(pBusLogic);
2821 pTaskState->pRedoNext = ASMAtomicReadPtrT(&pBusLogic->pTasksRedoHead, PBUSLOGICTASKSTATE);
2822 } while (!ASMAtomicCmpXchgPtr(&pBusLogic->pTasksRedoHead, pTaskState, pTaskState->pRedoNext));
2825 if (!ASMAtomicXchgBool(&pBusLogic->fRedo, true))
2826 buslogicR3RedoSetWarning(pBusLogic, rcReq);
2832 rc = vboxscsiRequestFinished(&pBusLogic->VBoxSCSI, pSCSIRequest, rcCompletion);
2843 buslogicR3SendIncomingMailbox(pBusLogic, pTaskState,
2848 buslogicR3SendIncomingMailbox(pBusLogic, pTaskState,
2860 RTMemCacheFree(pBusLogic->hTaskCache, pTaskState);
2863 if (pBusLogicDevice->cOutstandingRequests == 0 && pBusLogic->fSignalIdle)
2864 PDMDevHlpAsyncNotificationCompleted(pBusLogic->pDevInsR3);
2873 PPDMDEVINS pDevIns = pBusLogicDevice->CTX_SUFF(pBusLogic)->CTX_SUFF(pDevIns);
2886 static int buslogicR3DeviceSCSIRequestSetup(PBUSLOGIC pBusLogic, PBUSLOGICTASKSTATE pTaskState)
2895 PDMDevHlpPhysRead(pBusLogic->CTX_SUFF(pDevIns), GCPhysAddrCCB,
2899 pTargetDevice = &pBusLogic->aDeviceStates[uTargetIdCCB];
2914 if (!pBusLogic->aDeviceStates[uTargetIdCCB].fPresent)
2921 buslogicR3SendIncomingMailbox(pBusLogic, pTaskState,
2926 RTMemCacheFree(pBusLogic->hTaskCache, pTaskState);
2971 static int buslogicR3DeviceSCSIRequestAbort(PBUSLOGIC pBusLogic, PBUSLOGICTASKSTATE pTaskState)
2978 PDMDevHlpPhysRead(pBusLogic->CTX_SUFF(pDevIns), GCPhysAddrCCB,
2982 pTargetDevice = &pBusLogic->aDeviceStates[uTargetIdCCB];
2985 buslogicR3SendIncomingMailbox(pBusLogic, pTaskState,
2990 RTMemCacheFree(pBusLogic->hTaskCache, pTaskState);
3000 * @param pBusLogic Pointer to the BusLogic instance data.
3003 static RTGCPHYS buslogicR3ReadOutgoingMailbox(PBUSLOGIC pBusLogic, PBUSLOGICTASKSTATE pTaskState)
3007 if (pBusLogic->fMbxIs24Bit)
3011 GCMailbox = pBusLogic->GCPhysAddrMailboxOutgoingBase + (pBusLogic->uMailboxOutgoingPositionCurrent * sizeof(Mailbox24));
3012 PDMDevHlpPhysRead(pBusLogic->CTX_SUFF(pDevIns), GCMailbox, &Mbx24, sizeof(Mailbox24));
3018 GCMailbox = pBusLogic->GCPhysAddrMailboxOutgoingBase + (pBusLogic->uMailboxOutgoingPositionCurrent * sizeof(Mailbox32));
3019 PDMDevHlpPhysRead(pBusLogic->CTX_SUFF(pDevIns), GCMailbox, &pTaskState->MailboxGuest, sizeof(Mailbox32));
3029 * @param pBusLogic Pointer to the BusLogic instance data.
3031 static int buslogicR3ProcessMailboxNext(PBUSLOGIC pBusLogic)
3037 rc = RTMemCacheAllocEx(pBusLogic->hTaskCache, (void **)&pTaskState);
3041 pTaskState->fIs24Bit = pBusLogic->fMbxIs24Bit;
3042 pTaskState->cbSGEntry = pBusLogic->fMbxIs24Bit ? sizeof(SGE24) : sizeof(SGE32);
3044 if (!pBusLogic->fStrictRoundRobinMode)
3047 uint8_t uMailboxPosCur = pBusLogic->uMailboxOutgoingPositionCurrent;
3052 GCPhysAddrMailboxCurrent = buslogicR3ReadOutgoingMailbox(pBusLogic,pTaskState);
3055 buslogicR3OutgoingMailboxAdvance(pBusLogic);
3057 && uMailboxPosCur != pBusLogic->uMailboxOutgoingPositionCurrent);
3062 GCPhysAddrMailboxCurrent = buslogicR3ReadOutgoingMailbox(pBusLogic,pTaskState);
3074 RTMemCacheFree(pBusLogic->hTaskCache, pTaskState);
3078 LogFlow(("Got loaded mailbox at slot %u, CCB phys %RGp\n", pBusLogic->uMailboxOutgoingPositionCurrent, (RTGCPHYS)pTaskState->MailboxGuest.u32PhysAddrCCB));
3086 PDMDevHlpPCIPhysWrite(pBusLogic->CTX_SUFF(pDevIns), GCPhysAddrMailboxCurrent + uCodeOffs, &uActionCode, sizeof(uActionCode));
3089 rc = buslogicR3DeviceSCSIRequestSetup(pBusLogic, pTaskState);
3093 rc = buslogicR3DeviceSCSIRequestAbort(pBusLogic, pTaskState);
3101 if (pBusLogic->fStrictRoundRobinMode)
3102 buslogicR3OutgoingMailboxAdvance(pBusLogic);
3118 PBUSLOGIC pBusLogic = PDMINS_2_DATA(pDevIns, PBUSLOGIC);
3121 Assert(pBusLogic->fNotificationSend);
3122 ASMAtomicXchgBool(&pBusLogic->fNotificationSend, false);
3123 ASMAtomicXchgU32(&pBusLogic->cMailboxesReady, 0); /** @todo Actually not required anymore but to stay compatible with older saved states. */
3129 rc = buslogicR3ProcessMailboxNext(pBusLogic);
3190 PBUSLOGIC pBusLogic = PDMINS_2_DATA(pDevIns, PBUSLOGIC);
3193 for (unsigned i = 0; i < RT_ELEMENTS(pBusLogic->aDeviceStates); i++)
3195 PBUSLOGICDEVICE pDevice = &pBusLogic->aDeviceStates[i];
3203 SSMR3PutU8 (pSSM, pBusLogic->regStatus);
3204 SSMR3PutU8 (pSSM, pBusLogic->regInterrupt);
3205 SSMR3PutU8 (pSSM, pBusLogic->regGeometry);
3206 SSMR3PutMem (pSSM, &pBusLogic->LocalRam, sizeof(pBusLogic->LocalRam));
3207 SSMR3PutU8 (pSSM, pBusLogic->uOperationCode);
3208 SSMR3PutMem (pSSM, &pBusLogic->aCommandBuffer, sizeof(pBusLogic->aCommandBuffer));
3209 SSMR3PutU8 (pSSM, pBusLogic->iParameter);
3210 SSMR3PutU8 (pSSM, pBusLogic->cbCommandParametersLeft);
3211 SSMR3PutBool (pSSM, pBusLogic->fUseLocalRam);
3212 SSMR3PutMem (pSSM, pBusLogic->aReplyBuffer, sizeof(pBusLogic->aReplyBuffer));
3213 SSMR3PutU8 (pSSM, pBusLogic->iReply);
3214 SSMR3PutU8 (pSSM, pBusLogic->cbReplyParametersLeft);
3215 SSMR3PutBool (pSSM, pBusLogic->fIRQEnabled);
3216 SSMR3PutU8 (pSSM, pBusLogic->uISABaseCode);
3217 SSMR3PutU32 (pSSM, pBusLogic->cMailbox);
3218 SSMR3PutBool (pSSM, pBusLogic->fMbxIs24Bit);
3219 SSMR3PutGCPhys(pSSM, pBusLogic->GCPhysAddrMailboxOutgoingBase);
3220 SSMR3PutU32 (pSSM, pBusLogic->uMailboxOutgoingPositionCurrent);
3221 SSMR3PutU32 (pSSM, pBusLogic->cMailboxesReady);
3222 SSMR3PutBool (pSSM, pBusLogic->fNotificationSend);
3223 SSMR3PutGCPhys(pSSM, pBusLogic->GCPhysAddrMailboxIncomingBase);
3224 SSMR3PutU32 (pSSM, pBusLogic->uMailboxIncomingPositionCurrent);
3225 SSMR3PutBool (pSSM, pBusLogic->fStrictRoundRobinMode);
3226 SSMR3PutBool (pSSM, pBusLogic->fExtendedLunCCBFormat);
3228 SSMR3PutU8 (pSSM, pBusLogic->VBoxSCSI.regIdentify);
3229 SSMR3PutU8 (pSSM, pBusLogic->VBoxSCSI.uTargetDevice);
3230 SSMR3PutU8 (pSSM, pBusLogic->VBoxSCSI.uTxDir);
3231 SSMR3PutU8 (pSSM, pBusLogic->VBoxSCSI.cbCDB);
3232 SSMR3PutMem (pSSM, pBusLogic->VBoxSCSI.abCDB, sizeof(pBusLogic->VBoxSCSI.abCDB));
3233 SSMR3PutU8 (pSSM, pBusLogic->VBoxSCSI.iCDB);
3234 SSMR3PutU32 (pSSM, pBusLogic->VBoxSCSI.cbBuf);
3235 SSMR3PutU32 (pSSM, pBusLogic->VBoxSCSI.iBuf);
3236 SSMR3PutBool (pSSM, pBusLogic->VBoxSCSI.fBusy);
3237 SSMR3PutU8 (pSSM, pBusLogic->VBoxSCSI.enmState);
3238 if (pBusLogic->VBoxSCSI.cbBuf)
3239 SSMR3PutMem(pSSM, pBusLogic->VBoxSCSI.pbBuf, pBusLogic->VBoxSCSI.cbBuf);
3249 PBUSLOGICTASKSTATE pTaskState = pBusLogic->pTasksRedoHead;
3250 if (pBusLogic->fRedo)
3261 pTaskState = pBusLogic->pTasksRedoHead;
3284 PBUSLOGIC pBusLogic = PDMINS_2_DATA(pDevIns, PBUSLOGIC);
3292 for (unsigned i = 0; i < RT_ELEMENTS(pBusLogic->aDeviceStates); i++)
3294 PBUSLOGICDEVICE pDevice = &pBusLogic->aDeviceStates[i];
3312 SSMR3GetU8 (pSSM, (uint8_t *)&pBusLogic->regStatus);
3313 SSMR3GetU8 (pSSM, (uint8_t *)&pBusLogic->regInterrupt);
3314 SSMR3GetU8 (pSSM, (uint8_t *)&pBusLogic->regGeometry);
3315 SSMR3GetMem (pSSM, &pBusLogic->LocalRam, sizeof(pBusLogic->LocalRam));
3316 SSMR3GetU8 (pSSM, &pBusLogic->uOperationCode);
3318 SSMR3GetMem (pSSM, &pBusLogic->aCommandBuffer, sizeof(pBusLogic->aCommandBuffer));
3320 SSMR3GetMem (pSSM, &pBusLogic->aCommandBuffer, BUSLOGIC_COMMAND_SIZE_OLD);
3321 SSMR3GetU8 (pSSM, &pBusLogic->iParameter);
3322 SSMR3GetU8 (pSSM, &pBusLogic->cbCommandParametersLeft);
3323 SSMR3GetBool (pSSM, &pBusLogic->fUseLocalRam);
3324 SSMR3GetMem (pSSM, pBusLogic->aReplyBuffer, sizeof(pBusLogic->aReplyBuffer));
3325 SSMR3GetU8 (pSSM, &pBusLogic->iReply);
3326 SSMR3GetU8 (pSSM, &pBusLogic->cbReplyParametersLeft);
3327 SSMR3GetBool (pSSM, &pBusLogic->fIRQEnabled);
3328 SSMR3GetU8 (pSSM, &pBusLogic->uISABaseCode);
3329 SSMR3GetU32 (pSSM, &pBusLogic->cMailbox);
3331 SSMR3GetBool (pSSM, &pBusLogic->fMbxIs24Bit);
3332 SSMR3GetGCPhys(pSSM, &pBusLogic->GCPhysAddrMailboxOutgoingBase);
3333 SSMR3GetU32 (pSSM, &pBusLogic->uMailboxOutgoingPositionCurrent);
3334 SSMR3GetU32 (pSSM, (uint32_t *)&pBusLogic->cMailboxesReady);
3335 SSMR3GetBool (pSSM, (bool *)&pBusLogic->fNotificationSend);
3336 SSMR3GetGCPhys(pSSM, &pBusLogic->GCPhysAddrMailboxIncomingBase);
3337 SSMR3GetU32 (pSSM, &pBusLogic->uMailboxIncomingPositionCurrent);
3338 SSMR3GetBool (pSSM, &pBusLogic->fStrictRoundRobinMode);
3339 SSMR3GetBool (pSSM, &pBusLogic->fExtendedLunCCBFormat);
3341 SSMR3GetU8 (pSSM, &pBusLogic->VBoxSCSI.regIdentify);
3342 SSMR3GetU8 (pSSM, &pBusLogic->VBoxSCSI.uTargetDevice);
3343 SSMR3GetU8 (pSSM, &pBusLogic->VBoxSCSI.uTxDir);
3344 SSMR3GetU8 (pSSM, &pBusLogic->VBoxSCSI.cbCDB);
3345 SSMR3GetMem (pSSM, pBusLogic->VBoxSCSI.abCDB, sizeof(pBusLogic->VBoxSCSI.abCDB));
3346 SSMR3GetU8 (pSSM, &pBusLogic->VBoxSCSI.iCDB);
3347 SSMR3GetU32 (pSSM, &pBusLogic->VBoxSCSI.cbBuf);
3348 SSMR3GetU32 (pSSM, &pBusLogic->VBoxSCSI.iBuf);
3349 SSMR3GetBool(pSSM, (bool *)&pBusLogic->VBoxSCSI.fBusy);
3350 SSMR3GetU8 (pSSM, (uint8_t *)&pBusLogic->VBoxSCSI.enmState);
3351 if (pBusLogic->VBoxSCSI.cbBuf)
3353 pBusLogic->VBoxSCSI.pbBuf = (uint8_t *)RTMemAllocZ(pBusLogic->VBoxSCSI.cbBuf);
3354 if (!pBusLogic->VBoxSCSI.pbBuf)
3360 SSMR3GetMem(pSSM, pBusLogic->VBoxSCSI.pbBuf, pBusLogic->VBoxSCSI.cbBuf);
3363 if (pBusLogic->VBoxSCSI.fBusy)
3364 pBusLogic->fRedo = true;
3374 pBusLogic->fRedo = true;
3378 PBUSLOGICTASKSTATE pTaskState = (PBUSLOGICTASKSTATE)RTMemCacheAlloc(pBusLogic->hTaskCache);
3388 RTMemCacheFree(pBusLogic->hTaskCache, pTaskState);
3393 pTaskState->pRedoNext = pBusLogic->pTasksRedoHead;
3394 pBusLogic->pTasksRedoHead = pTaskState;
3452 PBUSLOGIC pBusLogic = PDMILEDPORTS_2_PBUSLOGIC(pInterface);
3455 *ppLed = &pBusLogic->aDeviceStates[iLUN].Led;