VirtualBox

Changeset 76074 in vbox


Ignore:
Timestamp:
Dec 8, 2018 9:46:20 PM (6 years ago)
Author:
vboxsync
Message:

BusLogic: Added a semi-credible AHA-1540B emulation.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/Storage/DevBusLogic.cpp

    r75111 r76074  
    323323    DEV_BT_958D     = 0,    /* BusLogic BT-958D, PCI. */
    324324    DEV_BT_545C     = 1,    /* BusLogic BT-545C, ISA. */
    325     DEV_AHA_1540C   = 2     /* Adaptec AHA-1540C, ISA. */
     325    DEV_AHA_1540B   = 2     /* Adaptec AHA-1540B, ISA. */
    326326};
    327327
     
    407407    /** Emulated device type. */
    408408    uint8_t                         uDevType;
     409    /** Signature index for Adaptec models. */
     410    uint8_t                         uAhaSigIdx;
    409411
    410412    /** Number of mailboxes the guest set up. */
     
    11511153    pBusLogic->uMailboxOutgoingPositionCurrent = 0;
    11521154    pBusLogic->uMailboxIncomingPositionCurrent = 0;
     1155    pBusLogic->uAhaSigIdx = 0;
    11531156
    11541157    /* Clear any active/pending interrupts. */
     
    18401843             * the adapter only when the byte is *not* '0' or 'B'.
    18411844             */
    1842             pBusLogic->aReplyBuffer[0] = 'A'; /* Firmware option bytes */
    1843             pBusLogic->aReplyBuffer[1] = 'A'; /* Special option byte */
     1845            if (pBusLogic->uDevType == DEV_AHA_1540B)
     1846            {
     1847                pBusLogic->aReplyBuffer[0] = 'A'; /* Firmware option bytes */
     1848                pBusLogic->aReplyBuffer[1] = '0'; /* Special option byte */
     1849            }
     1850            else
     1851            {
     1852                pBusLogic->aReplyBuffer[0] = 'A'; /* Firmware option bytes */
     1853                pBusLogic->aReplyBuffer[1] = 'A'; /* Special option byte */
     1854            }
    18441855
    18451856            /* We report version 5.07B. This reply will provide the first two digits. */
     
    18511862        case BUSLOGICCOMMAND_INQUIRE_FIRMWARE_VERSION_3RD_LETTER:
    18521863        {
     1864            if (pBusLogic->uDevType == DEV_AHA_1540B)
     1865            {
     1866                /* Newer ASPI4DOS.SYS versions expect this command to fail. */
     1867                Log(("Command %#x not valid for this adapter\n", pBusLogic->uOperationCode));
     1868                pBusLogic->cbReplyParametersLeft = 0;
     1869                pBusLogic->regStatus |= BL_STAT_CMDINV;
     1870                break;
     1871            }
     1872
    18531873            pBusLogic->aReplyBuffer[0] = '7';
    18541874            pBusLogic->cbReplyParametersLeft = 1;
     
    19071927        case BUSLOGICCOMMAND_INQUIRE_HOST_ADAPTER_MODEL_NUMBER:
    19081928        {
     1929            /* Not supported on AHA-154x. */
     1930            if (pBusLogic->uDevType == DEV_AHA_1540B)
     1931            {
     1932                Log(("Command %#x not valid for this adapter\n", pBusLogic->uOperationCode));
     1933                pBusLogic->cbReplyParametersLeft = 0;
     1934                pBusLogic->regStatus |= BL_STAT_CMDINV;
     1935                break;
     1936            }
     1937
    19091938            /* The reply length is set by the guest and is found in the first byte of the command buffer. */
    19101939            if (pBusLogic->aCommandBuffer[0] > sizeof(pBusLogic->aReplyBuffer))
     
    19681997             * Adaptec 154x models supposedly support it too??
    19691998             */
     1999            if (pBusLogic->uDevType == DEV_AHA_1540B)
     2000            {
     2001                Log(("Command %#x not valid for this adapter\n", pBusLogic->uOperationCode));
     2002                pBusLogic->cbReplyParametersLeft = 0;
     2003                pBusLogic->regStatus |= BL_STAT_CMDINV;
     2004                break;
     2005            }
    19702006
    19712007            /* The reply length is set by the guest and is found in the first byte of the command buffer. */
     
    19962032            pReply->cMailbox = pBusLogic->cMailbox;
    19972033            U32_TO_ADDR(pReply->MailboxAddress, pBusLogic->GCPhysAddrMailboxOutgoingBase);
    1998             pReply->uSignature = 'B';
    1999             /* The 'D' signature prevents Adaptec's OS/2 drivers from getting too
    2000              * friendly with BusLogic hardware and upsetting the HBA state.
     2034            /* The 'D' signature (actually 'SD' for Storage Dimensions, and 'BD' for BusLogic)
     2035             * prevents Adaptec's OS/2 drivers from getting too friendly with BusLogic hardware
     2036             * and upsetting the HBA state.
    20012037             */
    2002             pReply->uCharacterD = 'D';      /* BusLogic model. */
     2038            if (pBusLogic->uDevType == DEV_AHA_1540B)
     2039            {
     2040                pReply->uSignature  = 0;    /* Zeros for Adaptec. */
     2041                pReply->uCharacterD = 0;
     2042            }
     2043            else
     2044            {
     2045                pReply->uSignature  = 'B';
     2046                pReply->uCharacterD = 'D';      /* BusLogic model. */
     2047            }
    20032048            pReply->uHostBusType = 'F';     /* PCI bus. */
    20042049            break;
     
    20442089        case BUSLOGICCOMMAND_INITIALIZE_EXTENDED_MAILBOX:
    20452090        {
     2091            if (pBusLogic->uDevType == DEV_AHA_1540B)
     2092            {
     2093                Log(("Command %#x not valid for this adapter\n", pBusLogic->uOperationCode));
     2094                pBusLogic->cbReplyParametersLeft = 0;
     2095                pBusLogic->regStatus |= BL_STAT_CMDINV;
     2096                break;
     2097            }
     2098
    20462099            PRequestInitializeExtendedMailbox pRequest = (PRequestInitializeExtendedMailbox)pBusLogic->aCommandBuffer;
    20472100
     
    21452198        case BUSLOGICCOMMAND_DISABLE_HOST_ADAPTER_INTERRUPT:
    21462199        {
     2200            /* Not supported on AHA-154x HBAs. */
     2201            if (pBusLogic->uDevType == DEV_AHA_1540B)
     2202            {
     2203                Log(("Command %#x not valid for this adapter\n", pBusLogic->uOperationCode));
     2204                pBusLogic->cbReplyParametersLeft = 0;
     2205                pBusLogic->regStatus |= BL_STAT_CMDINV;
     2206                break;
     2207            }
     2208
    21472209            pBusLogic->cbReplyParametersLeft = 0;
    21482210            if (pBusLogic->aCommandBuffer[0] == 0)
     
    22722334static int buslogicRegisterRead(PBUSLOGIC pBusLogic, unsigned iRegister, uint32_t *pu32)
    22732335{
     2336    static const char achAhaSig[] = "ADAP";
    22742337    int rc = VINF_SUCCESS;
    22752338
     
    23412404        case BUSLOGIC_REGISTER_GEOMETRY:
    23422405        {
    2343             *pu32 = pBusLogic->regGeometry;
     2406            if (pBusLogic->uDevType == DEV_AHA_1540B)
     2407            {
     2408                *pu32 = achAhaSig[pBusLogic->uAhaSigIdx];
     2409                pBusLogic->uAhaSigIdx = (pBusLogic->uAhaSigIdx + 1) & 3;
     2410            }
     2411            else
     2412                *pu32 = pBusLogic->regGeometry;
    23442413            break;
    23452414        }
     
    24492518                    case BUSLOGICCOMMAND_MODIFY_IO_ADDRESS:
    24502519                    case BUSLOGICCOMMAND_INQUIRE_EXTENDED_SETUP_INFORMATION:
     2520                    case BUSLOGICCOMMAND_DISABLE_HOST_ADAPTER_INTERRUPT:
     2521                    case BUSLOGICCOMMAND_INQUIRE_HOST_ADAPTER_MODEL_NUMBER:
     2522                        /* These commands are not on AHA-154x, some Adaptec drivers (ASPI4DOS.SYS) test them. */
     2523                        if (pBusLogic->uDevType == DEV_AHA_1540B)
     2524                        {
     2525                            pBusLogic->cbCommandParametersLeft = 0;
     2526                            break;
     2527                        }
     2528                        /* Fall through. */
    24512529                    case BUSLOGICCOMMAND_INQUIRE_SETUP_INFORMATION:
    2452                     case BUSLOGICCOMMAND_INQUIRE_HOST_ADAPTER_MODEL_NUMBER:
    24532530                    case BUSLOGICCOMMAND_ENABLE_STRICT_ROUND_ROBIN_MODE:
    24542531                    case BUSLOGICCOMMAND_SET_CCB_FORMAT:
    24552532                    case BUSLOGICCOMMAND_INQUIRE_SYNCHRONOUS_PERIOD:
    2456                     case BUSLOGICCOMMAND_DISABLE_HOST_ADAPTER_INTERRUPT:
    24572533                    case BUSLOGICCOMMAND_ECHO_COMMAND_DATA:
    24582534                    case BUSLOGICCOMMAND_ENABLE_OUTGOING_MAILBOX_AVAILABLE_INTERRUPT:
     
    24762552                        break;
    24772553                    case BUSLOGICCOMMAND_INITIALIZE_EXTENDED_MAILBOX:
     2554                        /* Some Adaptec drivers (ASPI4DOS.SYS) test this command. */
     2555                        if (pBusLogic->uDevType == DEV_AHA_1540B)
     2556                        {
     2557                            pBusLogic->cbCommandParametersLeft = 0;
     2558                            break;
     2559                        }
    24782560                        pBusLogic->cbCommandParametersLeft = sizeof(RequestInitializeExtendedMailbox);
    24792561                        break;
     
    25302612         */
    25312613        case BUSLOGIC_REGISTER_INTERRUPT:
     2614            if (pBusLogic->uDevType == DEV_AHA_1540B)
     2615                break;
    25322616            pBusLogic->regInterrupt = uVal;
    25332617            break;
    25342618
    25352619        case BUSLOGIC_REGISTER_GEOMETRY:
     2620            if (pBusLogic->uDevType == DEV_AHA_1540B)
     2621                break;
    25362622            pBusLogic->regGeometry = uVal;
    25372623            break;
     
    37523838static DECLCALLBACK(void) buslogicR3Info(PPDMDEVINS pDevIns, PCDBGFINFOHLP pHlp, const char *pszArgs)
    37533839{
    3754     static const char *apszModels[] = { "BusLogic BT-958D", "BusLogic BT-545C", "Adaptec AHA-1540C" };
     3840    static const char *apszModels[] = { "BusLogic BT-958D", "BusLogic BT-545C", "Adaptec AHA-1540B" };
    37553841    PBUSLOGIC   pThis = PDMINS_2_DATA(pDevIns, PBUSLOGIC);
    37563842    unsigned    i;
     
    42014287        pThis->uIsaIrq = 11;
    42024288    }
    4203 #if 0   /* Maybe someday. */
    4204     else if (!strcmp(achCfgStr, "AHA-1540C"))   /* Competitor ISA device. */
    4205     {
    4206         pThis->uDevType = DEV_AHA_1540C;
     4289    else if (!strcmp(achCfgStr, "AHA-1540B"))   /* Competitor ISA device. */
     4290    {
     4291        pThis->uDevType = DEV_AHA_1540B;
    42074292        pThis->uIsaIrq = 11;
    42084293    }
    4209 #endif
    42104294    else
    42114295        return PDMDEV_SET_ERROR(pDevIns, VERR_PDM_DEVINS_UNKNOWN_CFG_VALUES,
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette