VirtualBox

Changeset 25675 in vbox


Ignore:
Timestamp:
Jan 7, 2010 1:11:59 AM (15 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
56391
Message:

LsiLogic: Introduce NumPorts configuration parameter to configure the number of ports for the SAS controller. Allows up to 255 disks attached to one controller

Location:
trunk/src/VBox/Devices
Files:
3 edited

Legend:

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

    r25588 r25675  
    7070    /** Pointer to the owning lsilogic device instance. - R3 pointer */
    7171    R3PTRTYPE(struct LSILOGICSCSI *)  pLsiLogicR3;
    72     /** Pointer to the owning lsilogic device instance. - R0 pointer */
    73     R0PTRTYPE(struct LSILOGICSCSI *)  pLsiLogicR0;
    74     /** Pointer to the owning lsilogic device instance. - RC pointer */
    75     RCPTRTYPE(struct LSILOGICSCSI *)  pLsiLogicRC;
    7672
    7773    /** LUN of the device. */
     
    149145#endif
    150146
     147    /** Number of device states allocated. */
     148    uint32_t                   cDeviceStates;
    151149    /** States for attached devices. */
    152     LSILOGICDEVICE       aDeviceStates[LSILOGIC_DEVICES_MAX];
     150    R3PTRTYPE(PLSILOGICDEVICE) paDeviceStates;
    153151
    154152    /** MMIO address the device is mapped to. */
    155     RTGCPHYS             GCPhysMMIOBase;
     153    RTGCPHYS              GCPhysMMIOBase;
    156154    /** I/O port address the device is mapped to. */
    157     RTIOPORT             IOPortBase;
     155    RTIOPORT              IOPortBase;
    158156
    159157    /** Interrupt mask. */
    160     volatile uint32_t    uInterruptMask;
     158    volatile uint32_t     uInterruptMask;
    161159    /** Interrupt status register. */
    162     volatile uint32_t    uInterruptStatus;
     160    volatile uint32_t     uInterruptStatus;
    163161
    164162    /** Buffer for messages which are passed
     
    181179    uint16_t              u16IOCFaultCode;
    182180
    183     /** Upper 32 bits of the moessage frame address to locate requests in guest memory. */
     181    /** Upper 32 bits of the message frame address to locate requests in guest memory. */
    184182    uint32_t              u32HostMFAHighAddr;
    185183    /** Upper 32 bits of the sense buffer address. */
     
    251249    uint16_t                       u16Alignment3;
    252250    uint32_t                       u32Alignment4;
     251
     252    /** Number of ports this controller has. */
     253    uint8_t                        cPorts;
    253254
    254255    /** BIOS emulation. */
     
    477478
    478479    /* Set default values. */
    479     pThis->cMaxDevices   = LSILOGIC_DEVICES_MAX;
     480    pThis->cMaxDevices   = pThis->cDeviceStates;
    480481    pThis->cMaxBuses     = 1;
    481482    pThis->cbReplyFrame  = 128; /* @todo Figure out where it is needed. */
     
    727728            {
    728729                pReply->IOCFacts.u16MessageVersion    = 0x0102; /* Version from the specification. */
    729                 pReply->IOCFacts.u8NumberOfPorts      = 1;
     730                pReply->IOCFacts.u8NumberOfPorts      = pLsiLogic->cPorts;
    730731            }
    731732            else if (pLsiLogic->enmCtrlType == LSILOGICCTRLTYPE_SCSI_SAS)
    732733            {
    733734                pReply->IOCFacts.u16MessageVersion    = 0x0105; /* Version from the specification. */
    734                 pReply->IOCFacts.u8NumberOfPorts      = 8;
     735                pReply->IOCFacts.u8NumberOfPorts      = pLsiLogic->cPorts;
    735736            }
    736737            else
     
    768769            {
    769770                /* This controller only supports one bus with bus number 0. */
    770                 if (pPortFactsReq->u8PortNumber != 0)
     771                if (pPortFactsReq->u8PortNumber >= pLsiLogic->cPorts)
    771772                {
    772773                    pReply->PortFacts.u8PortType = 0; /* Not existant. */
     
    775776                {
    776777                    pReply->PortFacts.u8PortType             = 0x01; /* SCSI Port. */
    777                     pReply->PortFacts.u16MaxDevices          = LSILOGIC_DEVICES_MAX;
     778                    pReply->PortFacts.u16MaxDevices          = LSILOGICSCSI_PCI_SPI_DEVICES_PER_BUS_MAX;
    778779                    pReply->PortFacts.u16ProtocolFlags       = RT_BIT(3) | RT_BIT(0); /* SCSI initiator and LUN supported. */
    779780                    pReply->PortFacts.u16PortSCSIID          = 7; /* Default */
     
    785786            else if (pLsiLogic->enmCtrlType == LSILOGICCTRLTYPE_SCSI_SAS)
    786787            {
    787                 if (pPortFactsReq->u8PortNumber >= 8)
     788                if (pPortFactsReq->u8PortNumber >= pLsiLogic->cPorts)
    788789                {
    789790                    pReply->PortFacts.u8PortType = 0; /* Not existant. */
     
    792793                {
    793794                    pReply->PortFacts.u8PortType             = 0x30; /* SAS Port. */
    794                     pReply->PortFacts.u16MaxDevices          = 1;
     795                    pReply->PortFacts.u16MaxDevices          = pLsiLogic->cPorts;
    795796                    pReply->PortFacts.u16ProtocolFlags       = RT_BIT(3) | RT_BIT(0); /* SCSI initiator and LUN supported. */
    796                     pReply->PortFacts.u16PortSCSIID          = 7; /* Default */
     797                    pReply->PortFacts.u16PortSCSIID          = pLsiLogic->cPorts;
    797798                    pReply->PortFacts.u16MaxPersistentIDs    = 0;
    798799                    pReply->PortFacts.u16MaxPostedCmdBuffers = 0; /* Only applies for target mode which we dont support. */
     
    18491850#endif
    18501851
    1851     if (RT_LIKELY(   (pTaskState->GuestRequest.SCSIIO.u8TargetID < LSILOGIC_DEVICES_MAX)
     1852    if (RT_LIKELY(   (pTaskState->GuestRequest.SCSIIO.u8TargetID < pLsiLogic->cDeviceStates)
    18521853                  && (pTaskState->GuestRequest.SCSIIO.u8Bus == 0)))
    18531854    {
    18541855        PLSILOGICDEVICE pTargetDevice;
    1855         pTargetDevice = &pLsiLogic->aDeviceStates[pTaskState->GuestRequest.SCSIIO.u8TargetID];
     1856        pTargetDevice = &pLsiLogic->paDeviceStates[pTaskState->GuestRequest.SCSIIO.u8TargetID];
    18561857
    18571858        if (pTargetDevice->pDrvBase)
     
    19011902
    19021903    /* The rest is equal to both errors. */
    1903     pTaskState->IOCReply.SCSIIOError.u8TargetID = pTaskState->GuestRequest.SCSIIO.u8TargetID;
    1904     pTaskState->IOCReply.SCSIIOError.u8Bus = pTaskState->GuestRequest.SCSIIO.u8Bus;
    1905     pTaskState->IOCReply.SCSIIOError.u8MessageLength = sizeof(MptSCSIIOErrorReply) / 4;
    1906     pTaskState->IOCReply.SCSIIOError.u8Function = pTaskState->GuestRequest.SCSIIO.u8Function;
    1907     pTaskState->IOCReply.SCSIIOError.u8CDBLength = pTaskState->GuestRequest.SCSIIO.u8CDBLength;
     1904    pTaskState->IOCReply.SCSIIOError.u8TargetID          = pTaskState->GuestRequest.SCSIIO.u8TargetID;
     1905    pTaskState->IOCReply.SCSIIOError.u8Bus               = pTaskState->GuestRequest.SCSIIO.u8Bus;
     1906    pTaskState->IOCReply.SCSIIOError.u8MessageLength     = sizeof(MptSCSIIOErrorReply) / 4;
     1907    pTaskState->IOCReply.SCSIIOError.u8Function          = pTaskState->GuestRequest.SCSIIO.u8Function;
     1908    pTaskState->IOCReply.SCSIIOError.u8CDBLength         = pTaskState->GuestRequest.SCSIIO.u8CDBLength;
    19081909    pTaskState->IOCReply.SCSIIOError.u8SenseBufferLength = pTaskState->GuestRequest.SCSIIO.u8SenseBufferLength;
    1909     pTaskState->IOCReply.SCSIIOError.u32MessageContext = pTaskState->GuestRequest.SCSIIO.u32MessageContext;
    1910     pTaskState->IOCReply.SCSIIOError.u8SCSIStatus = SCSI_STATUS_OK;
    1911     pTaskState->IOCReply.SCSIIOError.u8SCSIState  = MPT_SCSI_IO_ERROR_SCSI_STATE_TERMINATED;
    1912     pTaskState->IOCReply.SCSIIOError.u32IOCLogInfo    = 0;
    1913     pTaskState->IOCReply.SCSIIOError.u32TransferCount = 0;
    1914     pTaskState->IOCReply.SCSIIOError.u32SenseCount    = 0;
    1915     pTaskState->IOCReply.SCSIIOError.u32ResponseInfo  = 0;
     1910    pTaskState->IOCReply.SCSIIOError.u32MessageContext   = pTaskState->GuestRequest.SCSIIO.u32MessageContext;
     1911    pTaskState->IOCReply.SCSIIOError.u8SCSIStatus        = SCSI_STATUS_OK;
     1912    pTaskState->IOCReply.SCSIIOError.u8SCSIState         = MPT_SCSI_IO_ERROR_SCSI_STATE_TERMINATED;
     1913    pTaskState->IOCReply.SCSIIOError.u32IOCLogInfo       = 0;
     1914    pTaskState->IOCReply.SCSIIOError.u32TransferCount    = 0;
     1915    pTaskState->IOCReply.SCSIIOError.u32SenseCount       = 0;
     1916    pTaskState->IOCReply.SCSIIOError.u32ResponseInfo     = 0;
    19161917
    19171918    lsilogicFinishAddressReply(pLsiLogic, &pTaskState->IOCReply, false);
     
    19681969            /* The SCSI target encountered an error during processing post a reply. */
    19691970            memset(&pTaskState->IOCReply, 0, sizeof(MptReplyUnion));
    1970             pTaskState->IOCReply.SCSIIOError.u8TargetID = pTaskState->GuestRequest.SCSIIO.u8TargetID;
    1971             pTaskState->IOCReply.SCSIIOError.u8Bus      = pTaskState->GuestRequest.SCSIIO.u8Bus;
    1972             pTaskState->IOCReply.SCSIIOError.u8MessageLength = 8;
    1973             pTaskState->IOCReply.SCSIIOError.u8Function  = pTaskState->GuestRequest.SCSIIO.u8Function;
    1974             pTaskState->IOCReply.SCSIIOError.u8CDBLength = pTaskState->GuestRequest.SCSIIO.u8CDBLength;
     1971            pTaskState->IOCReply.SCSIIOError.u8TargetID          = pTaskState->GuestRequest.SCSIIO.u8TargetID;
     1972            pTaskState->IOCReply.SCSIIOError.u8Bus               = pTaskState->GuestRequest.SCSIIO.u8Bus;
     1973            pTaskState->IOCReply.SCSIIOError.u8MessageLength     = 8;
     1974            pTaskState->IOCReply.SCSIIOError.u8Function          = pTaskState->GuestRequest.SCSIIO.u8Function;
     1975            pTaskState->IOCReply.SCSIIOError.u8CDBLength         = pTaskState->GuestRequest.SCSIIO.u8CDBLength;
    19751976            pTaskState->IOCReply.SCSIIOError.u8SenseBufferLength = pTaskState->GuestRequest.SCSIIO.u8SenseBufferLength;
    1976             pTaskState->IOCReply.SCSIIOError.u8MessageFlags = pTaskState->GuestRequest.SCSIIO.u8MessageFlags;
    1977             pTaskState->IOCReply.SCSIIOError.u32MessageContext = pTaskState->GuestRequest.SCSIIO.u32MessageContext;
    1978             pTaskState->IOCReply.SCSIIOError.u8SCSIStatus = rcCompletion;
    1979             pTaskState->IOCReply.SCSIIOError.u8SCSIState  = MPT_SCSI_IO_ERROR_SCSI_STATE_AUTOSENSE_VALID;
    1980             pTaskState->IOCReply.SCSIIOError.u16IOCStatus  = 0;
    1981             pTaskState->IOCReply.SCSIIOError.u32IOCLogInfo = 0;
    1982             pTaskState->IOCReply.SCSIIOError.u32TransferCount = 0;
    1983             pTaskState->IOCReply.SCSIIOError.u32SenseCount    = sizeof(pTaskState->abSenseBuffer);
    1984             pTaskState->IOCReply.SCSIIOError.u32ResponseInfo  = 0;
     1977            pTaskState->IOCReply.SCSIIOError.u8MessageFlags      = pTaskState->GuestRequest.SCSIIO.u8MessageFlags;
     1978            pTaskState->IOCReply.SCSIIOError.u32MessageContext   = pTaskState->GuestRequest.SCSIIO.u32MessageContext;
     1979            pTaskState->IOCReply.SCSIIOError.u8SCSIStatus        = rcCompletion;
     1980            pTaskState->IOCReply.SCSIIOError.u8SCSIState         = MPT_SCSI_IO_ERROR_SCSI_STATE_AUTOSENSE_VALID;
     1981            pTaskState->IOCReply.SCSIIOError.u16IOCStatus        = 0;
     1982            pTaskState->IOCReply.SCSIIOError.u32IOCLogInfo       = 0;
     1983            pTaskState->IOCReply.SCSIIOError.u32TransferCount    = 0;
     1984            pTaskState->IOCReply.SCSIIOError.u32SenseCount       = sizeof(pTaskState->abSenseBuffer);
     1985            pTaskState->IOCReply.SCSIIOError.u32ResponseInfo     = 0;
    19851986
    19861987            lsilogicFinishAddressReply(pLsiLogic, &pTaskState->IOCReply, true);
     
    21342135            break;
    21352136        case 1:
    2136             *ppPageHeader = &pPages->ManufacturingPage1.Header;
    2137             *ppbPageData  =  pPages->ManufacturingPage1.abVPDInfo;
     2137            *ppPageHeader = &pPages->ManufacturingPage1.u.fields.Header;
     2138            *ppbPageData  =  pPages->ManufacturingPage1.u.abPageData;
    21382139            *pcbPage      = sizeof(pPages->ManufacturingPage1);
    21392140            break;
     
    23492350    {
    23502351        case 0:
    2351             *ppPageHeader = &pPages->u.SasPages.SASIOUnitPage0.u.fields.ExtHeader;
    2352             *ppbPageData  =  pPages->u.SasPages.SASIOUnitPage0.u.abPageData;
    2353             *pcbPage      = sizeof(pPages->u.SasPages.SASIOUnitPage0);
     2352            *ppPageHeader = &pPages->u.SasPages.pSASIOUnitPage0->u.fields.ExtHeader;
     2353            *ppbPageData  = pPages->u.SasPages.pSASIOUnitPage0->u.abPageData;
     2354            *pcbPage      = pPages->u.SasPages.cbSASIOUnitPage0;
    23542355            break;
    23552356        case 1:
    2356             *ppPageHeader = &pPages->u.SasPages.SASIOUnitPage1.u.fields.ExtHeader;
    2357             *ppbPageData  =  pPages->u.SasPages.SASIOUnitPage1.u.abPageData;
    2358             *pcbPage      = sizeof(pPages->u.SasPages.SASIOUnitPage1);
     2357            *ppPageHeader = &pPages->u.SasPages.pSASIOUnitPage1->u.fields.ExtHeader;
     2358            *ppbPageData  =  pPages->u.SasPages.pSASIOUnitPage1->u.abPageData;
     2359            *pcbPage      = pPages->u.SasPages.cbSASIOUnitPage1;
    23592360            break;
    23602361        case 2:
     
    23852386    uint8_t uAddressForm = MPT_CONFIGURATION_PAGE_ADDRESS_GET_SAS_FORM(PageAddress);
    23862387    PMptConfigurationPagesSas pPagesSas = &pPages->u.SasPages;
     2388    PMptPHY pPHYPages = NULL;
    23872389
    23882390    Log(("Address form %d\n", uAddressForm));
     
    23942396        Log(("PHY number %d\n", u8PhyNumber));
    23952397
    2396         if (u8PhyNumber >= RT_ELEMENTS(pPagesSas->aPHY))
     2398        if (u8PhyNumber >= pPagesSas->cPHYs)
    23972399            return VERR_NOT_FOUND;
    23982400
     2401        pPHYPages = &pPagesSas->paPHYs[u8PhyNumber];
     2402    }
     2403    else if (uAddressForm == 1) /* Index form */
     2404    {
     2405        uint16_t u16Index = PageAddress.SASPHY.Form1.u16Index;
     2406
     2407        Log(("PHY index %d\n", u16Index));
     2408
     2409        if (u16Index >= pPagesSas->cPHYs)
     2410            return VERR_NOT_FOUND;
     2411
     2412        pPHYPages = &pPagesSas->paPHYs[u16Index];
     2413    }
     2414    else
     2415        rc = VERR_NOT_FOUND; /* Correct? */
     2416
     2417    if (pPHYPages)
     2418    {
    23992419        switch(u8PageNumber)
    24002420        {
    24012421            case 0:
    2402                 *ppPageHeader = &pPagesSas->aPHY[u8PhyNumber].SASPHYPage0.u.fields.ExtHeader;
    2403                 *ppbPageData  =  pPagesSas->aPHY[u8PhyNumber].SASPHYPage0.u.abPageData;
    2404                 *pcbPage      = sizeof(pPagesSas->aPHY[u8PhyNumber].SASPHYPage0);
     2422                *ppPageHeader = &pPHYPages->SASPHYPage0.u.fields.ExtHeader;
     2423                *ppbPageData  = pPHYPages->SASPHYPage0.u.abPageData;
     2424                *pcbPage      = sizeof(pPHYPages->SASPHYPage0);
    24052425                break;
    24062426            case 1:
    2407                 *ppPageHeader = &pPagesSas->aPHY[u8PhyNumber].SASPHYPage1.u.fields.ExtHeader;
    2408                 *ppbPageData  =  pPagesSas->aPHY[u8PhyNumber].SASPHYPage1.u.abPageData;
    2409                 *pcbPage      = sizeof(pPagesSas->aPHY[u8PhyNumber].SASPHYPage1);
     2427                *ppPageHeader = &pPHYPages->SASPHYPage1.u.fields.ExtHeader;
     2428                *ppbPageData  =  pPHYPages->SASPHYPage1.u.abPageData;
     2429                *pcbPage      = sizeof(pPHYPages->SASPHYPage1);
    24102430                break;
    24112431            default:
     
    24132433        }
    24142434    }
    2415     else if (uAddressForm == 1) /* Index form */
    2416     {
    2417         uint16_t u16Index = PageAddress.SASPHY.Form1.u16Index;
    2418 
    2419         Log(("PHY index %d\n", u16Index));
    2420 
    2421         if (u16Index >= RT_ELEMENTS(pPagesSas->aPHY))
    2422             return VERR_NOT_FOUND;
    2423 
    2424         switch(u8PageNumber)
    2425         {
    2426             case 0:
    2427                 *ppPageHeader = &pPagesSas->aPHY[u16Index].SASPHYPage0.u.fields.ExtHeader;
    2428                 *ppbPageData  =  pPagesSas->aPHY[u16Index].SASPHYPage0.u.abPageData;
    2429                 *pcbPage      = sizeof(pPagesSas->aPHY[u16Index].SASPHYPage0);
    2430                 break;
    2431             case 1:
    2432                 *ppPageHeader = &pPagesSas->aPHY[u16Index].SASPHYPage1.u.fields.ExtHeader;
    2433                 *ppbPageData  =  pPagesSas->aPHY[u16Index].SASPHYPage1.u.abPageData;
    2434                 *pcbPage      = sizeof(pPagesSas->aPHY[u16Index].SASPHYPage1);
    2435                 break;
    2436             default:
    2437                 rc = VERR_NOT_FOUND;
    2438         }
    2439     }
    24402435    else
    2441         rc = VERR_NOT_FOUND; /* Correct? */
    2442 
     2436        rc = VERR_NOT_FOUND;
    24432437
    24442438    return rc;
     
    24652459        Log(("Get next handle %#x\n", u16Handle));
    24662460
     2461        pSASDevice = pPagesSas->pSASDeviceHead;
     2462
    24672463        /* Get the first device? */
    2468         if (u16Handle == 0xffff)
    2469             pSASDevice = pPagesSas->pSASDeviceHead;
    2470         else
    2471         {
     2464        if (u16Handle != 0xffff)
     2465        {
     2466            /* No, search for the right one. */
     2467
    24722468            while (   pSASDevice
    24732469                   && pSASDevice->SASDevicePage0.u.fields.u16DevHandle != u16Handle)
     
    26022598                                               PMptConfigurationReply pReply)
    26032599{
    2604     int rc = VINF_SUCCESS;
    2605     uint8_t                     *pbPageData;
    2606     PMptConfigurationPageHeader         pPageHeader;
    2607     PMptExtendedConfigurationPageHeader pExtPageHeader;
    2608     uint8_t                     u8PageType, u8PageAttribute;
    2609     size_t                      cbPage;
     2600    int                                 rc             = VINF_SUCCESS;
     2601    uint8_t                            *pbPageData     = NULL;
     2602    PMptConfigurationPageHeader         pPageHeader    = NULL;
     2603    PMptExtendedConfigurationPageHeader pExtPageHeader = NULL;
     2604    uint8_t                             u8PageType;
     2605    uint8_t                             u8PageAttribute;
     2606    size_t                              cbPage = 0;
    26102607
    26112608    LogFlowFunc(("pLsiLogic=%#p\n", pLsiLogic));
     
    29182915
    29192916    /* SAS I/O unit page 0 - Port specific informations. */
    2920     pPages->SASIOUnitPage0.u.fields.ExtHeader.u8PageType       =   MPT_CONFIGURATION_PAGE_ATTRIBUTE_READONLY
    2921                                                                  | MPT_CONFIGURATION_PAGE_TYPE_EXTENDED;
    2922     pPages->SASIOUnitPage0.u.fields.ExtHeader.u8PageNumber     = 0;
    2923     pPages->SASIOUnitPage0.u.fields.ExtHeader.u8ExtPageType    = MPT_CONFIGURATION_PAGE_TYPE_EXTENDED_SASIOUNIT;
    2924     pPages->SASIOUnitPage0.u.fields.ExtHeader.u16ExtPageLength = sizeof(MptConfigurationPageSASIOUnit0) / 4;
    2925     pPages->SASIOUnitPage0.u.fields.u8NumPhys = 8;
     2917    pPages->cbSASIOUnitPage0 = LSILOGICSCSI_SASIOUNIT0_GET_SIZE(pThis->cPorts);
     2918    PMptConfigurationPageSASIOUnit0 pSASPage0 = (PMptConfigurationPageSASIOUnit0)RTMemAllocZ(pPages->cbSASIOUnitPage0);
     2919    AssertPtr(pSASPage0);
     2920
     2921    MPT_CONFIG_EXTENDED_PAGE_HEADER_INIT(pSASPage0, pPages->cbSASIOUnitPage0,
     2922                                         0, MPT_CONFIGURATION_PAGE_ATTRIBUTE_READONLY,
     2923                                         MPT_CONFIGURATION_PAGE_TYPE_EXTENDED_SASIOUNIT);
     2924    pSASPage0->u.fields.u8NumPhys = pThis->cPorts;
     2925    pPages->pSASIOUnitPage0 = pSASPage0;
    29262926
    29272927    /* SAS I/O unit page 1 - Port specific settings. */
    2928     pPages->SASIOUnitPage1.u.fields.ExtHeader.u8PageType       =   MPT_CONFIGURATION_PAGE_ATTRIBUTE_CHANGEABLE
    2929                                                                  | MPT_CONFIGURATION_PAGE_TYPE_EXTENDED;
    2930     pPages->SASIOUnitPage1.u.fields.ExtHeader.u8PageNumber     = 1;
    2931     pPages->SASIOUnitPage1.u.fields.ExtHeader.u8ExtPageType    = MPT_CONFIGURATION_PAGE_TYPE_EXTENDED_SASIOUNIT;
    2932     pPages->SASIOUnitPage1.u.fields.ExtHeader.u16ExtPageLength = sizeof(MptConfigurationPageSASIOUnit1) / 4;
    2933     pPages->SASIOUnitPage1.u.fields.u8NumPhys = pPages->SASIOUnitPage0.u.fields.u8NumPhys;
    2934     pPages->SASIOUnitPage1.u.fields.u16ControlFlags = 0;
    2935     pPages->SASIOUnitPage1.u.fields.u16AdditionalControlFlags = 0;
     2928    pPages->cbSASIOUnitPage1 = LSILOGICSCSI_SASIOUNIT1_GET_SIZE(pThis->cPorts);
     2929    PMptConfigurationPageSASIOUnit1 pSASPage1 = (PMptConfigurationPageSASIOUnit1)RTMemAllocZ(pPages->cbSASIOUnitPage1);
     2930    AssertPtr(pSASPage1);
     2931
     2932    MPT_CONFIG_EXTENDED_PAGE_HEADER_INIT(pSASPage1, pPages->cbSASIOUnitPage1,
     2933                                         1, MPT_CONFIGURATION_PAGE_ATTRIBUTE_CHANGEABLE,
     2934                                         MPT_CONFIGURATION_PAGE_TYPE_EXTENDED_SASIOUNIT);
     2935    pSASPage1->u.fields.u8NumPhys = pSASPage0->u.fields.u8NumPhys;
     2936    pSASPage1->u.fields.u16ControlFlags = 0;
     2937    pSASPage1->u.fields.u16AdditionalControlFlags = 0;
     2938    pPages->pSASIOUnitPage1 = pSASPage1;
    29362939
    29372940    /* SAS I/O unit page 2 - Port specific informations. */
     
    29492952    pPages->SASIOUnitPage3.u.fields.ExtHeader.u16ExtPageLength = sizeof(MptConfigurationPageSASIOUnit3) / 4;
    29502953
     2954    pPages->cPHYs  = pThis->cPorts;
     2955    pPages->paPHYs = (PMptPHY)RTMemAllocZ(pPages->cPHYs * sizeof(MptPHY));
     2956    AssertPtr(pPages->paPHYs);
     2957
    29512958    /* Initialize the PHY configuration */
    2952     for (unsigned i = 0; i < pPages->SASIOUnitPage0.u.fields.u8NumPhys; i++)
    2953     {
     2959    for (unsigned i = 0; i < pThis->cPorts; i++)
     2960    {
     2961        PMptPHY pPHYPages = &pPages->paPHYs[i];
    29542962        uint16_t u16ControllerHandle = lsilogicGetHandle(pThis);
    29552963
    2956         pPages->SASIOUnitPage0.u.fields.aPHY[i].u8Port      = i;
    2957         pPages->SASIOUnitPage0.u.fields.aPHY[i].u8PortFlags = 0;
    2958         pPages->SASIOUnitPage0.u.fields.aPHY[i].u8PhyFlags  = 0;
    2959         pPages->SASIOUnitPage0.u.fields.aPHY[i].u8NegotiatedLinkRate = LSILOGICSCSI_SASIOUNIT0_NEGOTIATED_RATE_FAILED;
    2960         pPages->SASIOUnitPage0.u.fields.aPHY[i].u32ControllerPhyDeviceInfo = LSILOGICSCSI_SASIOUNIT0_DEVICE_TYPE_SET(LSILOGICSCSI_SASIOUNIT0_DEVICE_TYPE_NO);
    2961         pPages->SASIOUnitPage0.u.fields.aPHY[i].u16ControllerDevHandle     = u16ControllerHandle;
    2962         pPages->SASIOUnitPage0.u.fields.aPHY[i].u16AttachedDevHandle       = 0; /* No device attached. */
    2963         pPages->SASIOUnitPage0.u.fields.aPHY[i].u32DiscoveryStatus         = 0; /* No errors */
    2964 
    2965         pPages->SASIOUnitPage1.u.fields.aPHY[i].u8Port           = i;
    2966         pPages->SASIOUnitPage1.u.fields.aPHY[i].u8PortFlags      = 0;
    2967         pPages->SASIOUnitPage1.u.fields.aPHY[i].u8PhyFlags       = 0;
    2968         pPages->SASIOUnitPage1.u.fields.aPHY[i].u8MaxMinLinkRate =   LSILOGICSCSI_SASIOUNIT1_LINK_RATE_MIN_SET(LSILOGICSCSI_SASIOUNIT1_LINK_RATE_15GB)
    2969                                                                    | LSILOGICSCSI_SASIOUNIT1_LINK_RATE_MAX_SET(LSILOGICSCSI_SASIOUNIT1_LINK_RATE_30GB);
    2970         pPages->SASIOUnitPage1.u.fields.aPHY[i].u32ControllerPhyDeviceInfo = LSILOGICSCSI_SASIOUNIT0_DEVICE_TYPE_SET(LSILOGICSCSI_SASIOUNIT0_DEVICE_TYPE_NO);
     2964        pSASPage0->u.fields.aPHY[i].u8Port      = i;
     2965        pSASPage0->u.fields.aPHY[i].u8PortFlags = 0;
     2966        pSASPage0->u.fields.aPHY[i].u8PhyFlags  = 0;
     2967        pSASPage0->u.fields.aPHY[i].u8NegotiatedLinkRate = LSILOGICSCSI_SASIOUNIT0_NEGOTIATED_RATE_FAILED;
     2968        pSASPage0->u.fields.aPHY[i].u32ControllerPhyDeviceInfo = LSILOGICSCSI_SASIOUNIT0_DEVICE_TYPE_SET(LSILOGICSCSI_SASIOUNIT0_DEVICE_TYPE_NO);
     2969        pSASPage0->u.fields.aPHY[i].u16ControllerDevHandle     = u16ControllerHandle;
     2970        pSASPage0->u.fields.aPHY[i].u16AttachedDevHandle       = 0; /* No device attached. */
     2971        pSASPage0->u.fields.aPHY[i].u32DiscoveryStatus         = 0; /* No errors */
     2972
     2973        pSASPage1->u.fields.aPHY[i].u8Port           = i;
     2974        pSASPage1->u.fields.aPHY[i].u8PortFlags      = 0;
     2975        pSASPage1->u.fields.aPHY[i].u8PhyFlags       = 0;
     2976        pSASPage1->u.fields.aPHY[i].u8MaxMinLinkRate =   LSILOGICSCSI_SASIOUNIT1_LINK_RATE_MIN_SET(LSILOGICSCSI_SASIOUNIT1_LINK_RATE_15GB)
     2977                                                       | LSILOGICSCSI_SASIOUNIT1_LINK_RATE_MAX_SET(LSILOGICSCSI_SASIOUNIT1_LINK_RATE_30GB);
     2978        pSASPage1->u.fields.aPHY[i].u32ControllerPhyDeviceInfo = LSILOGICSCSI_SASIOUNIT0_DEVICE_TYPE_SET(LSILOGICSCSI_SASIOUNIT0_DEVICE_TYPE_NO);
    29712979
    29722980        /* SAS PHY page 0. */
    2973         pPages->aPHY[i].SASPHYPage0.u.fields.ExtHeader.u8PageType       =   MPT_CONFIGURATION_PAGE_ATTRIBUTE_READONLY
     2981        pPHYPages->SASPHYPage0.u.fields.ExtHeader.u8PageType       =   MPT_CONFIGURATION_PAGE_ATTRIBUTE_READONLY
    29742982                                                                          | MPT_CONFIGURATION_PAGE_TYPE_EXTENDED;
    2975         pPages->aPHY[i].SASPHYPage0.u.fields.ExtHeader.u8PageNumber     = 0;
    2976         pPages->aPHY[i].SASPHYPage0.u.fields.ExtHeader.u8ExtPageType    = MPT_CONFIGURATION_PAGE_TYPE_EXTENDED_SASPHYS;
    2977         pPages->aPHY[i].SASPHYPage0.u.fields.ExtHeader.u16ExtPageLength = sizeof(MptConfigurationPageSASPHY0) / 4;
    2978         pPages->aPHY[i].SASPHYPage0.u.fields.u8AttachedPhyIdentifier = i;
    2979         pPages->aPHY[i].SASPHYPage0.u.fields.u32AttachedDeviceInfo   = LSILOGICSCSI_SASPHY0_DEV_INFO_DEVICE_TYPE_SET(LSILOGICSCSI_SASPHY0_DEV_INFO_DEVICE_TYPE_NO);
    2980         pPages->aPHY[i].SASPHYPage0.u.fields.u8ProgrammedLinkRate =   LSILOGICSCSI_SASIOUNIT1_LINK_RATE_MIN_SET(LSILOGICSCSI_SASIOUNIT1_LINK_RATE_15GB)
    2981                                                                     | LSILOGICSCSI_SASIOUNIT1_LINK_RATE_MAX_SET(LSILOGICSCSI_SASIOUNIT1_LINK_RATE_30GB);
    2982         pPages->aPHY[i].SASPHYPage0.u.fields.u8HwLinkRate         =   LSILOGICSCSI_SASIOUNIT1_LINK_RATE_MIN_SET(LSILOGICSCSI_SASIOUNIT1_LINK_RATE_15GB)
    2983                                                                     | LSILOGICSCSI_SASIOUNIT1_LINK_RATE_MAX_SET(LSILOGICSCSI_SASIOUNIT1_LINK_RATE_30GB);
     2983        pPHYPages->SASPHYPage0.u.fields.ExtHeader.u8PageNumber     = 0;
     2984        pPHYPages->SASPHYPage0.u.fields.ExtHeader.u8ExtPageType    = MPT_CONFIGURATION_PAGE_TYPE_EXTENDED_SASPHYS;
     2985        pPHYPages->SASPHYPage0.u.fields.ExtHeader.u16ExtPageLength = sizeof(MptConfigurationPageSASPHY0) / 4;
     2986        pPHYPages->SASPHYPage0.u.fields.u8AttachedPhyIdentifier    = i;
     2987        pPHYPages->SASPHYPage0.u.fields.u32AttachedDeviceInfo      = LSILOGICSCSI_SASPHY0_DEV_INFO_DEVICE_TYPE_SET(LSILOGICSCSI_SASPHY0_DEV_INFO_DEVICE_TYPE_NO);
     2988        pPHYPages->SASPHYPage0.u.fields.u8ProgrammedLinkRate      =   LSILOGICSCSI_SASIOUNIT1_LINK_RATE_MIN_SET(LSILOGICSCSI_SASIOUNIT1_LINK_RATE_15GB)
     2989                                                                     | LSILOGICSCSI_SASIOUNIT1_LINK_RATE_MAX_SET(LSILOGICSCSI_SASIOUNIT1_LINK_RATE_30GB);
     2990        pPHYPages->SASPHYPage0.u.fields.u8HwLinkRate               =   LSILOGICSCSI_SASIOUNIT1_LINK_RATE_MIN_SET(LSILOGICSCSI_SASIOUNIT1_LINK_RATE_15GB)
     2991                                                                     | LSILOGICSCSI_SASIOUNIT1_LINK_RATE_MAX_SET(LSILOGICSCSI_SASIOUNIT1_LINK_RATE_30GB);
    29842992
    29852993        /* SAS PHY page 1. */
    2986         pPages->aPHY[i].SASPHYPage1.u.fields.ExtHeader.u8PageType       =   MPT_CONFIGURATION_PAGE_ATTRIBUTE_READONLY
    2987                                                                           | MPT_CONFIGURATION_PAGE_TYPE_EXTENDED;
    2988         pPages->aPHY[i].SASPHYPage1.u.fields.ExtHeader.u8PageNumber     = 1;
    2989         pPages->aPHY[i].SASPHYPage1.u.fields.ExtHeader.u8ExtPageType    = MPT_CONFIGURATION_PAGE_TYPE_EXTENDED_SASPHYS;
    2990         pPages->aPHY[i].SASPHYPage1.u.fields.ExtHeader.u16ExtPageLength = sizeof(MptConfigurationPageSASPHY1) / 4;
     2994        pPHYPages->SASPHYPage1.u.fields.ExtHeader.u8PageType       =   MPT_CONFIGURATION_PAGE_ATTRIBUTE_READONLY
     2995                                                                     | MPT_CONFIGURATION_PAGE_TYPE_EXTENDED;
     2996        pPHYPages->SASPHYPage1.u.fields.ExtHeader.u8PageNumber     = 1;
     2997        pPHYPages->SASPHYPage1.u.fields.ExtHeader.u8ExtPageType    = MPT_CONFIGURATION_PAGE_TYPE_EXTENDED_SASPHYS;
     2998        pPHYPages->SASPHYPage1.u.fields.ExtHeader.u16ExtPageLength = sizeof(MptConfigurationPageSASPHY1) / 4;
    29912999
    29923000        /* Settings for present devices. */
    2993         if (pThis->aDeviceStates[i].pDrvBase)
     3001        if (pThis->paDeviceStates[i].pDrvBase)
    29943002        {
    29953003            uint16_t u16DeviceHandle = lsilogicGetHandle(pThis);
     
    30013009            lsilogicSASAddressGenerate(&SASAddress, i);
    30023010
    3003             pPages->SASIOUnitPage0.u.fields.aPHY[i].u8NegotiatedLinkRate       = LSILOGICSCSI_SASIOUNIT0_NEGOTIATED_RATE_SET(LSILOGICSCSI_SASIOUNIT0_NEGOTIATED_RATE_30GB);
    3004             pPages->SASIOUnitPage0.u.fields.aPHY[i].u32ControllerPhyDeviceInfo =   LSILOGICSCSI_SASIOUNIT0_DEVICE_TYPE_SET(LSILOGICSCSI_SASIOUNIT0_DEVICE_TYPE_END)
    3005                                                                                  | LSILOGICSCSI_SASIOUNIT0_DEVICE_SSP_TARGET;
    3006             pPages->SASIOUnitPage0.u.fields.aPHY[i].u16AttachedDevHandle       = u16DeviceHandle;
    3007             pPages->SASIOUnitPage1.u.fields.aPHY[i].u32ControllerPhyDeviceInfo =   LSILOGICSCSI_SASIOUNIT0_DEVICE_TYPE_SET(LSILOGICSCSI_SASIOUNIT0_DEVICE_TYPE_END)
    3008                                                                                  | LSILOGICSCSI_SASIOUNIT0_DEVICE_SSP_TARGET;
    3009             pPages->SASIOUnitPage0.u.fields.aPHY[i].u16ControllerDevHandle     = u16DeviceHandle;
    3010 
    3011             pPages->aPHY[i].SASPHYPage0.u.fields.u32AttachedDeviceInfo         = LSILOGICSCSI_SASPHY0_DEV_INFO_DEVICE_TYPE_SET(LSILOGICSCSI_SASPHY0_DEV_INFO_DEVICE_TYPE_END);
    3012             pPages->aPHY[i].SASPHYPage0.u.fields.SASAddress                    = SASAddress;
    3013             pPages->aPHY[i].SASPHYPage0.u.fields.u16OwnerDevHandle             = u16DeviceHandle;
    3014             pPages->aPHY[i].SASPHYPage0.u.fields.u16AttachedDevHandle          = u16DeviceHandle;
     3011            pSASPage0->u.fields.aPHY[i].u8NegotiatedLinkRate       = LSILOGICSCSI_SASIOUNIT0_NEGOTIATED_RATE_SET(LSILOGICSCSI_SASIOUNIT0_NEGOTIATED_RATE_30GB);
     3012            pSASPage0->u.fields.aPHY[i].u32ControllerPhyDeviceInfo =   LSILOGICSCSI_SASIOUNIT0_DEVICE_TYPE_SET(LSILOGICSCSI_SASIOUNIT0_DEVICE_TYPE_END)
     3013                                                                     | LSILOGICSCSI_SASIOUNIT0_DEVICE_SSP_TARGET;
     3014            pSASPage0->u.fields.aPHY[i].u16AttachedDevHandle       = u16DeviceHandle;
     3015            pSASPage1->u.fields.aPHY[i].u32ControllerPhyDeviceInfo =   LSILOGICSCSI_SASIOUNIT0_DEVICE_TYPE_SET(LSILOGICSCSI_SASIOUNIT0_DEVICE_TYPE_END)
     3016                                                                     | LSILOGICSCSI_SASIOUNIT0_DEVICE_SSP_TARGET;
     3017            pSASPage0->u.fields.aPHY[i].u16ControllerDevHandle     = u16DeviceHandle;
     3018
     3019            pPHYPages->SASPHYPage0.u.fields.u32AttachedDeviceInfo  = LSILOGICSCSI_SASPHY0_DEV_INFO_DEVICE_TYPE_SET(LSILOGICSCSI_SASPHY0_DEV_INFO_DEVICE_TYPE_END);
     3020            pPHYPages->SASPHYPage0.u.fields.SASAddress             = SASAddress;
     3021            pPHYPages->SASPHYPage0.u.fields.u16OwnerDevHandle      = u16DeviceHandle;
     3022            pPHYPages->SASPHYPage0.u.fields.u16AttachedDevHandle   = u16DeviceHandle;
    30153023
    30163024            /* SAS device page 0. */
     
    30903098
    30913099    /* Manufacturing Page 0. */
    3092     pPages->ManufacturingPage0.u.fields.Header.u8PageType   =   MPT_CONFIGURATION_PAGE_ATTRIBUTE_PERSISTENT_READONLY
    3093                                                               | MPT_CONFIGURATION_PAGE_TYPE_MANUFACTURING;
    3094     pPages->ManufacturingPage0.u.fields.Header.u8PageNumber = 0;
    3095     pPages->ManufacturingPage0.u.fields.Header.u8PageLength = sizeof(MptConfigurationPageManufacturing0) / 4;
     3100    MPT_CONFIG_PAGE_HEADER_INIT_MANUFACTURING(&pPages->ManufacturingPage0,
     3101                                              MptConfigurationPageManufacturing0, 0,
     3102                                              MPT_CONFIGURATION_PAGE_ATTRIBUTE_PERSISTENT_READONLY);
    30963103    strncpy((char *)pPages->ManufacturingPage0.u.fields.abChipName,          "VBox MPT Fusion", 16);
    30973104    strncpy((char *)pPages->ManufacturingPage0.u.fields.abChipRevision,      "1.0", 8);
     
    31013108
    31023109    /* Manufacturing Page 1 - I don't know what this contains so we leave it 0 for now. */
    3103     pPages->ManufacturingPage1.Header.u8PageType   =   MPT_CONFIGURATION_PAGE_ATTRIBUTE_PERSISTENT_READONLY
    3104                                                      | MPT_CONFIGURATION_PAGE_TYPE_MANUFACTURING;
    3105     pPages->ManufacturingPage1.Header.u8PageNumber = 1;
    3106     pPages->ManufacturingPage1.Header.u8PageLength = sizeof(MptConfigurationPageManufacturing1) / 4;
     3110    MPT_CONFIG_PAGE_HEADER_INIT_MANUFACTURING(&pPages->ManufacturingPage1,
     3111                                              MptConfigurationPageManufacturing1, 1,
     3112                                              MPT_CONFIGURATION_PAGE_ATTRIBUTE_PERSISTENT_READONLY);
    31073113
    31083114    /* Manufacturing Page 2. */
    3109     pPages->ManufacturingPage2.u.fields.Header.u8PageType   =   MPT_CONFIGURATION_PAGE_ATTRIBUTE_READONLY
    3110                                                               | MPT_CONFIGURATION_PAGE_TYPE_MANUFACTURING;
    3111     pPages->ManufacturingPage2.u.fields.Header.u8PageNumber = 2;
    3112     pPages->ManufacturingPage2.u.fields.Header.u8PageLength = sizeof(MptConfigurationPageManufacturing2) / 4;
     3115    MPT_CONFIG_PAGE_HEADER_INIT_MANUFACTURING(&pPages->ManufacturingPage2,
     3116                                              MptConfigurationPageManufacturing2, 2,
     3117                                              MPT_CONFIGURATION_PAGE_ATTRIBUTE_PERSISTENT_READONLY);
    31133118
    31143119    if (pLsiLogic->enmCtrlType == LSILOGICCTRLTYPE_SCSI_SPI)
     
    31243129
    31253130    /* Manufacturing Page 3. */
    3126     pPages->ManufacturingPage3.u.fields.Header.u8PageType   =   MPT_CONFIGURATION_PAGE_ATTRIBUTE_READONLY
    3127                                                               | MPT_CONFIGURATION_PAGE_TYPE_MANUFACTURING;
    3128     pPages->ManufacturingPage3.u.fields.Header.u8PageNumber = 3;
    3129     pPages->ManufacturingPage3.u.fields.Header.u8PageLength = sizeof(MptConfigurationPageManufacturing3) / 4;
     3131    MPT_CONFIG_PAGE_HEADER_INIT_MANUFACTURING(&pPages->ManufacturingPage3,
     3132                                              MptConfigurationPageManufacturing3, 3,
     3133                                              MPT_CONFIGURATION_PAGE_ATTRIBUTE_PERSISTENT_READONLY);
    31303134
    31313135    if (pLsiLogic->enmCtrlType == LSILOGICCTRLTYPE_SCSI_SPI)
     
    31413145
    31423146    /* Manufacturing Page 4 - I don't know what this contains so we leave it 0 for now. */
    3143     pPages->ManufacturingPage4.u.fields.Header.u8PageType   =   MPT_CONFIGURATION_PAGE_ATTRIBUTE_PERSISTENT_READONLY
    3144                                                               | MPT_CONFIGURATION_PAGE_TYPE_MANUFACTURING;
    3145     pPages->ManufacturingPage4.u.fields.Header.u8PageNumber = 4;
    3146     pPages->ManufacturingPage4.u.fields.Header.u8PageLength = sizeof(MptConfigurationPageManufacturing4) / 4;
     3147    MPT_CONFIG_PAGE_HEADER_INIT_MANUFACTURING(&pPages->ManufacturingPage4,
     3148                                              MptConfigurationPageManufacturing4, 4,
     3149                                              MPT_CONFIGURATION_PAGE_ATTRIBUTE_PERSISTENT_READONLY);
    31473150
    31483151    /* Manufacturing Page 5 - WWID settings. */
    3149     pPages->ManufacturingPage5.u.fields.Header.u8PageType   =   MPT_CONFIGURATION_PAGE_ATTRIBUTE_PERSISTENT_READONLY
    3150                                                               | MPT_CONFIGURATION_PAGE_TYPE_MANUFACTURING;
    3151     pPages->ManufacturingPage5.u.fields.Header.u8PageNumber = 5;
    3152     pPages->ManufacturingPage5.u.fields.Header.u8PageLength = sizeof(MptConfigurationPageManufacturing5) / 4;
     3152    MPT_CONFIG_PAGE_HEADER_INIT_MANUFACTURING(&pPages->ManufacturingPage5,
     3153                                              MptConfigurationPageManufacturing5, 5,
     3154                                              MPT_CONFIGURATION_PAGE_ATTRIBUTE_PERSISTENT_READONLY);
    31533155
    31543156    /* Manufacturing Page 6 - Product sepcific settings. */
    3155     pPages->ManufacturingPage6.u.fields.Header.u8PageType   =   MPT_CONFIGURATION_PAGE_ATTRIBUTE_CHANGEABLE
    3156                                                               | MPT_CONFIGURATION_PAGE_TYPE_MANUFACTURING;
    3157     pPages->ManufacturingPage6.u.fields.Header.u8PageNumber = 6;
    3158     pPages->ManufacturingPage6.u.fields.Header.u8PageLength = sizeof(MptConfigurationPageManufacturing6) / 4;
     3157    MPT_CONFIG_PAGE_HEADER_INIT_MANUFACTURING(&pPages->ManufacturingPage6,
     3158                                              MptConfigurationPageManufacturing6, 6,
     3159                                              MPT_CONFIGURATION_PAGE_ATTRIBUTE_CHANGEABLE);
    31593160
    31603161    /* Manufacturing Page 7 - Connector settings. */
    3161     pPages->ManufacturingPage7.u.fields.Header.u8PageType   =   MPT_CONFIGURATION_PAGE_ATTRIBUTE_PERSISTENT_READONLY
    3162                                                               | MPT_CONFIGURATION_PAGE_TYPE_MANUFACTURING;
    3163     pPages->ManufacturingPage7.u.fields.Header.u8PageNumber = 7;
    3164     pPages->ManufacturingPage7.u.fields.Header.u8PageLength = sizeof(MptConfigurationPageManufacturing7) / 4;
     3162    MPT_CONFIG_PAGE_HEADER_INIT_MANUFACTURING(&pPages->ManufacturingPage7,
     3163                                              MptConfigurationPageManufacturing7, 7,
     3164                                              MPT_CONFIGURATION_PAGE_ATTRIBUTE_PERSISTENT_READONLY);
    31653165
    31663166    /* Manufacturing Page 8 -  Product sepcific settings. */
    3167     pPages->ManufacturingPage8.u.fields.Header.u8PageType   =   MPT_CONFIGURATION_PAGE_ATTRIBUTE_CHANGEABLE
    3168                                                               | MPT_CONFIGURATION_PAGE_TYPE_MANUFACTURING;
    3169     pPages->ManufacturingPage8.u.fields.Header.u8PageNumber = 8;
    3170     pPages->ManufacturingPage8.u.fields.Header.u8PageLength = sizeof(MptConfigurationPageManufacturing8) / 4;
     3167    MPT_CONFIG_PAGE_HEADER_INIT_MANUFACTURING(&pPages->ManufacturingPage8,
     3168                                              MptConfigurationPageManufacturing8, 8,
     3169                                              MPT_CONFIGURATION_PAGE_ATTRIBUTE_CHANGEABLE);
    31713170
    31723171    /* Manufacturing Page 9 -  Product sepcific settings. */
    3173     pPages->ManufacturingPage9.u.fields.Header.u8PageType   =   MPT_CONFIGURATION_PAGE_ATTRIBUTE_CHANGEABLE
    3174                                                               | MPT_CONFIGURATION_PAGE_TYPE_MANUFACTURING;
    3175     pPages->ManufacturingPage9.u.fields.Header.u8PageNumber = 9;
    3176     pPages->ManufacturingPage9.u.fields.Header.u8PageLength = sizeof(MptConfigurationPageManufacturing9) / 4;
     3172    MPT_CONFIG_PAGE_HEADER_INIT_MANUFACTURING(&pPages->ManufacturingPage9,
     3173                                              MptConfigurationPageManufacturing9, 9,
     3174                                              MPT_CONFIGURATION_PAGE_ATTRIBUTE_CHANGEABLE);
    31773175
    31783176    /* Manufacturing Page 10 -  Product sepcific settings. */
    3179     pPages->ManufacturingPage10.u.fields.Header.u8PageType   =   MPT_CONFIGURATION_PAGE_ATTRIBUTE_CHANGEABLE
    3180                                                               | MPT_CONFIGURATION_PAGE_TYPE_MANUFACTURING;
    3181     pPages->ManufacturingPage10.u.fields.Header.u8PageNumber = 10;
    3182     pPages->ManufacturingPage10.u.fields.Header.u8PageLength = sizeof(MptConfigurationPageManufacturing10) / 4;
     3177    MPT_CONFIG_PAGE_HEADER_INIT_MANUFACTURING(&pPages->ManufacturingPage10,
     3178                                              MptConfigurationPageManufacturing10, 10,
     3179                                              MPT_CONFIGURATION_PAGE_ATTRIBUTE_CHANGEABLE);
    31833180
    31843181    /* I/O Unit page 0. */
    3185     pPages->IOUnitPage0.u.fields.Header.u8PageType   =   MPT_CONFIGURATION_PAGE_ATTRIBUTE_READONLY
    3186                                                        | MPT_CONFIGURATION_PAGE_TYPE_IO_UNIT;
    3187     pPages->IOUnitPage0.u.fields.Header.u8PageNumber = 0;
    3188     pPages->IOUnitPage0.u.fields.Header.u8PageLength = sizeof(MptConfigurationPageIOUnit0) / 4;
     3182    MPT_CONFIG_PAGE_HEADER_INIT_IO_UNIT(&pPages->IOUnitPage0,
     3183                                        MptConfigurationPageIOUnit0, 0,
     3184                                        MPT_CONFIGURATION_PAGE_ATTRIBUTE_READONLY);
    31893185    pPages->IOUnitPage0.u.fields.u64UniqueIdentifier = 0xcafe;
    31903186
    31913187    /* I/O Unit page 1. */
    3192     pPages->IOUnitPage1.u.fields.Header.u8PageType   =   MPT_CONFIGURATION_PAGE_ATTRIBUTE_READONLY
    3193                                                        | MPT_CONFIGURATION_PAGE_TYPE_IO_UNIT;
    3194     pPages->IOUnitPage1.u.fields.Header.u8PageNumber = 1;
    3195     pPages->IOUnitPage1.u.fields.Header.u8PageLength = sizeof(MptConfigurationPageIOUnit1) / 4;
     3188    MPT_CONFIG_PAGE_HEADER_INIT_IO_UNIT(&pPages->IOUnitPage1,
     3189                                        MptConfigurationPageIOUnit1, 1,
     3190                                        MPT_CONFIGURATION_PAGE_ATTRIBUTE_READONLY);
    31963191    pPages->IOUnitPage1.u.fields.fSingleFunction         = true;
    31973192    pPages->IOUnitPage1.u.fields.fAllPathsMapped         = false;
     
    32003195
    32013196    /* I/O Unit page 2. */
    3202     pPages->IOUnitPage2.u.fields.Header.u8PageType   =   MPT_CONFIGURATION_PAGE_ATTRIBUTE_PERSISTENT
    3203                                                        | MPT_CONFIGURATION_PAGE_TYPE_IO_UNIT;
    3204     pPages->IOUnitPage2.u.fields.Header.u8PageNumber = 2;
    3205     pPages->IOUnitPage2.u.fields.Header.u8PageLength = sizeof(MptConfigurationPageIOUnit2) / 4;
     3197    MPT_CONFIG_PAGE_HEADER_INIT_IO_UNIT(&pPages->IOUnitPage2,
     3198                                        MptConfigurationPageIOUnit2, 2,
     3199                                        MPT_CONFIGURATION_PAGE_ATTRIBUTE_PERSISTENT);
    32063200    pPages->IOUnitPage2.u.fields.fPauseOnError       = false;
    32073201    pPages->IOUnitPage2.u.fields.fVerboseModeEnabled = false;
     
    32153209
    32163210    /* I/O Unit page 3. */
    3217     pPages->IOUnitPage3.u.fields.Header.u8PageType   =   MPT_CONFIGURATION_PAGE_ATTRIBUTE_CHANGEABLE
    3218                                                        | MPT_CONFIGURATION_PAGE_TYPE_IO_UNIT;
    3219     pPages->IOUnitPage3.u.fields.Header.u8PageNumber = 3;
    3220     pPages->IOUnitPage3.u.fields.Header.u8PageLength = sizeof(MptConfigurationPageIOUnit3) / 4;
     3211    MPT_CONFIG_PAGE_HEADER_INIT_IO_UNIT(&pPages->IOUnitPage3,
     3212                                        MptConfigurationPageIOUnit3, 3,
     3213                                        MPT_CONFIGURATION_PAGE_ATTRIBUTE_CHANGEABLE);
    32213214    pPages->IOUnitPage3.u.fields.u8GPIOCount = 0;
    32223215
    32233216    /* I/O Unit page 4. */
    3224     pPages->IOUnitPage4.u.fields.Header.u8PageType   =   MPT_CONFIGURATION_PAGE_ATTRIBUTE_CHANGEABLE
    3225                                                        | MPT_CONFIGURATION_PAGE_TYPE_IO_UNIT;
    3226     pPages->IOUnitPage4.u.fields.Header.u8PageNumber = 4;
    3227     pPages->IOUnitPage4.u.fields.Header.u8PageLength = sizeof(MptConfigurationPageIOUnit4) / 4;
     3217    MPT_CONFIG_PAGE_HEADER_INIT_IO_UNIT(&pPages->IOUnitPage4,
     3218                                        MptConfigurationPageIOUnit4, 4,
     3219                                        MPT_CONFIGURATION_PAGE_ATTRIBUTE_CHANGEABLE);
    32283220
    32293221    /* IOC page 0. */
    3230     pPages->IOCPage0.u.fields.Header.u8PageType   =   MPT_CONFIGURATION_PAGE_ATTRIBUTE_READONLY
    3231                                                     | MPT_CONFIGURATION_PAGE_TYPE_IOC;
    3232     pPages->IOCPage0.u.fields.Header.u8PageNumber = 0;
    3233     pPages->IOCPage0.u.fields.Header.u8PageLength = sizeof(MptConfigurationPageIOC0) / 4;
     3222    MPT_CONFIG_PAGE_HEADER_INIT_IOC(&pPages->IOCPage0,
     3223                                    MptConfigurationPageIOC0, 0,
     3224                                    MPT_CONFIGURATION_PAGE_ATTRIBUTE_READONLY);
    32343225    pPages->IOCPage0.u.fields.u32TotalNVStore      = 0;
    32353226    pPages->IOCPage0.u.fields.u32FreeNVStore       = 0;
     
    32553246
    32563247    /* IOC page 1. */
    3257     pPages->IOCPage1.u.fields.Header.u8PageType   =   MPT_CONFIGURATION_PAGE_ATTRIBUTE_CHANGEABLE
    3258                                                     | MPT_CONFIGURATION_PAGE_TYPE_IOC;
    3259     pPages->IOCPage1.u.fields.Header.u8PageNumber = 1;
    3260     pPages->IOCPage1.u.fields.Header.u8PageLength = sizeof(MptConfigurationPageIOC1) / 4;
     3248    MPT_CONFIG_PAGE_HEADER_INIT_IOC(&pPages->IOCPage1,
     3249                                    MptConfigurationPageIOC1, 1,
     3250                                    MPT_CONFIGURATION_PAGE_ATTRIBUTE_CHANGEABLE);
    32613251    pPages->IOCPage1.u.fields.fReplyCoalescingEnabled = false;
    32623252    pPages->IOCPage1.u.fields.u32CoalescingTimeout    = 0;
     
    32643254
    32653255    /* IOC page 2. */
    3266     pPages->IOCPage2.u.fields.Header.u8PageType   =   MPT_CONFIGURATION_PAGE_ATTRIBUTE_READONLY
    3267                                                     | MPT_CONFIGURATION_PAGE_TYPE_IOC;
    3268     pPages->IOCPage2.u.fields.Header.u8PageNumber = 2;
    3269     pPages->IOCPage2.u.fields.Header.u8PageLength = sizeof(MptConfigurationPageIOC2) / 4;
     3256    MPT_CONFIG_PAGE_HEADER_INIT_IOC(&pPages->IOCPage2,
     3257                                    MptConfigurationPageIOC2, 2,
     3258                                    MPT_CONFIGURATION_PAGE_ATTRIBUTE_READONLY);
    32703259    /* Everything else here is 0. */
    32713260
    32723261    /* IOC page 3. */
    3273     pPages->IOCPage3.u.fields.Header.u8PageType   =   MPT_CONFIGURATION_PAGE_ATTRIBUTE_READONLY
    3274                                                     | MPT_CONFIGURATION_PAGE_TYPE_IOC;
    3275     pPages->IOCPage3.u.fields.Header.u8PageNumber = 3;
    3276     pPages->IOCPage3.u.fields.Header.u8PageLength = sizeof(MptConfigurationPageIOC3) / 4;
     3262    MPT_CONFIG_PAGE_HEADER_INIT_IOC(&pPages->IOCPage3,
     3263                                    MptConfigurationPageIOC3, 3,
     3264                                    MPT_CONFIGURATION_PAGE_ATTRIBUTE_READONLY);
    32773265    /* Everything else here is 0. */
    32783266
    32793267    /* IOC page 4. */
    3280     pPages->IOCPage4.u.fields.Header.u8PageType   =   MPT_CONFIGURATION_PAGE_ATTRIBUTE_READONLY
    3281                                                     | MPT_CONFIGURATION_PAGE_TYPE_IOC;
    3282     pPages->IOCPage4.u.fields.Header.u8PageNumber = 4;
    3283     pPages->IOCPage4.u.fields.Header.u8PageLength = sizeof(MptConfigurationPageIOC4) / 4;
     3268    MPT_CONFIG_PAGE_HEADER_INIT_IOC(&pPages->IOCPage4,
     3269                                    MptConfigurationPageIOC4, 4,
     3270                                    MPT_CONFIGURATION_PAGE_ATTRIBUTE_READONLY);
    32843271    /* Everything else here is 0. */
    32853272
    32863273    /* IOC page 6. */
    3287     pPages->IOCPage6.u.fields.Header.u8PageType   =   MPT_CONFIGURATION_PAGE_ATTRIBUTE_READONLY
    3288                                                     | MPT_CONFIGURATION_PAGE_TYPE_IOC;
    3289     pPages->IOCPage6.u.fields.Header.u8PageNumber = 6;
    3290     pPages->IOCPage6.u.fields.Header.u8PageLength = sizeof(MptConfigurationPageIOC6) / 4;
     3274    MPT_CONFIG_PAGE_HEADER_INIT_IOC(&pPages->IOCPage6,
     3275                                    MptConfigurationPageIOC6, 6,
     3276                                    MPT_CONFIGURATION_PAGE_ATTRIBUTE_READONLY);
    32913277    /* Everything else here is 0. */
    32923278
    32933279    /* BIOS page 1. */
    3294     pPages->BIOSPage1.u.fields.Header.u8PageType   =   MPT_CONFIGURATION_PAGE_ATTRIBUTE_CHANGEABLE
    3295                                                      | MPT_CONFIGURATION_PAGE_TYPE_BIOS;
    3296     pPages->BIOSPage1.u.fields.Header.u8PageNumber = 1;
    3297     pPages->BIOSPage1.u.fields.Header.u8PageLength = sizeof(MptConfigurationPageBIOS1) / 4;
     3280    MPT_CONFIG_PAGE_HEADER_INIT_BIOS(&pPages->BIOSPage1,
     3281                                     MptConfigurationPageBIOS1, 1,
     3282                                     MPT_CONFIGURATION_PAGE_ATTRIBUTE_CHANGEABLE);
    32983283
    32993284    /* BIOS page 2. */
    3300     pPages->BIOSPage2.u.fields.Header.u8PageType   =   MPT_CONFIGURATION_PAGE_ATTRIBUTE_CHANGEABLE
    3301                                                      | MPT_CONFIGURATION_PAGE_TYPE_BIOS;
    3302     pPages->BIOSPage2.u.fields.Header.u8PageNumber = 2;
    3303     pPages->BIOSPage2.u.fields.Header.u8PageLength = sizeof(MptConfigurationPageBIOS2) / 4;
     3285    MPT_CONFIG_PAGE_HEADER_INIT_BIOS(&pPages->BIOSPage2,
     3286                                     MptConfigurationPageBIOS2, 2,
     3287                                     MPT_CONFIGURATION_PAGE_ATTRIBUTE_CHANGEABLE);
    33043288
    33053289    /* BIOS page 4. */
    3306     pPages->BIOSPage4.u.fields.Header.u8PageType   =   MPT_CONFIGURATION_PAGE_ATTRIBUTE_CHANGEABLE
    3307                                                      | MPT_CONFIGURATION_PAGE_TYPE_BIOS;
    3308     pPages->BIOSPage4.u.fields.Header.u8PageNumber = 4;
    3309     pPages->BIOSPage4.u.fields.Header.u8PageLength = sizeof(MptConfigurationPageBIOS4) / 4;
     3290    MPT_CONFIG_PAGE_HEADER_INIT_BIOS(&pPages->BIOSPage4,
     3291                                     MptConfigurationPageBIOS4, 4,
     3292                                     MPT_CONFIGURATION_PAGE_ATTRIBUTE_CHANGEABLE);
    33103293
    33113294    if (pLsiLogic->enmCtrlType == LSILOGICCTRLTYPE_SCSI_SPI)
     
    35013484    pTaskState->PDMScsiRequest.pvUser = pTaskState;
    35023485
    3503     pTaskState->pTargetDevice = &pLsiLogic->aDeviceStates[uTargetDevice];
    3504 
    3505     if (!pTaskState->pTargetDevice->pDrvBase)
    3506     {
    3507         /* Device is not present. */
    3508         AssertMsg(pTaskState->PDMScsiRequest.pbCDB[0] == SCSI_INQUIRY,
    3509                     ("Device is not present but command is not inquiry\n"));
    3510 
    3511         SCSIINQUIRYDATA ScsiInquiryData;
    3512 
    3513         memset(&ScsiInquiryData, 0, sizeof(SCSIINQUIRYDATA));
    3514         ScsiInquiryData.u5PeripheralDeviceType = SCSI_INQUIRY_DATA_PERIPHERAL_DEVICE_TYPE_UNKNOWN;
    3515         ScsiInquiryData.u3PeripheralQualifier = SCSI_INQUIRY_DATA_PERIPHERAL_QUALIFIER_NOT_CONNECTED_NOT_SUPPORTED;
    3516 
    3517         memcpy(pLsiLogic->VBoxSCSI.pBuf, &ScsiInquiryData, 5);
    3518 
    3519         rc = vboxscsiRequestFinished(&pLsiLogic->VBoxSCSI, &pTaskState->PDMScsiRequest);
    3520         AssertMsgRCReturn(rc, ("Finishing BIOS SCSI request failed rc=%Rrc\n", rc), rc);
    3521 
    3522         rc = RTCacheInsert(pLsiLogic->pTaskCache, pTaskState);
    3523         AssertMsgRCReturn(rc, ("Getting task from cache failed rc=%Rrc\n", rc), rc);
    3524     }
    3525     else
    3526     {
    3527         ASMAtomicIncU32(&pTaskState->pTargetDevice->cOutstandingRequests);
    3528 
    3529         rc = pTaskState->pTargetDevice->pDrvSCSIConnector->pfnSCSIRequestSend(pTaskState->pTargetDevice->pDrvSCSIConnector,
    3530                                                                                 &pTaskState->PDMScsiRequest);
    3531         AssertMsgRCReturn(rc, ("Sending request to SCSI layer failed rc=%Rrc\n", rc), rc);
    3532     }
     3486    if (uTargetDevice < pLsiLogic->cDeviceStates)
     3487    {
     3488        pTaskState->pTargetDevice = &pLsiLogic->paDeviceStates[uTargetDevice];
     3489
     3490        if (pTaskState->pTargetDevice->pDrvBase)
     3491        {
     3492            ASMAtomicIncU32(&pTaskState->pTargetDevice->cOutstandingRequests);
     3493
     3494            rc = pTaskState->pTargetDevice->pDrvSCSIConnector->pfnSCSIRequestSend(pTaskState->pTargetDevice->pDrvSCSIConnector,
     3495                                                                                    &pTaskState->PDMScsiRequest);
     3496            AssertMsgRCReturn(rc, ("Sending request to SCSI layer failed rc=%Rrc\n", rc), rc);
     3497            return VINF_SUCCESS;
     3498        }
     3499    }
     3500
     3501    /* Device is not present. */
     3502    AssertMsg(pTaskState->PDMScsiRequest.pbCDB[0] == SCSI_INQUIRY,
     3503                ("Device is not present but command is not inquiry\n"));
     3504
     3505    SCSIINQUIRYDATA ScsiInquiryData;
     3506
     3507    memset(&ScsiInquiryData, 0, sizeof(SCSIINQUIRYDATA));
     3508    ScsiInquiryData.u5PeripheralDeviceType = SCSI_INQUIRY_DATA_PERIPHERAL_DEVICE_TYPE_UNKNOWN;
     3509    ScsiInquiryData.u3PeripheralQualifier = SCSI_INQUIRY_DATA_PERIPHERAL_QUALIFIER_NOT_CONNECTED_NOT_SUPPORTED;
     3510
     3511    memcpy(pLsiLogic->VBoxSCSI.pBuf, &ScsiInquiryData, 5);
     3512
     3513    rc = vboxscsiRequestFinished(&pLsiLogic->VBoxSCSI, &pTaskState->PDMScsiRequest);
     3514    AssertMsgRCReturn(rc, ("Finishing BIOS SCSI request failed rc=%Rrc\n", rc), rc);
     3515
     3516    rc = RTCacheInsert(pLsiLogic->pTaskCache, pTaskState);
     3517    AssertMsgRCReturn(rc, ("Getting task from cache failed rc=%Rrc\n", rc), rc);
    35333518
    35343519    return rc;
     
    37093694
    37103695    SSMR3PutU32(pSSM, pThis->enmCtrlType);
     3696    SSMR3PutU32(pSSM, pThis->cDeviceStates);
     3697    SSMR3PutU32(pSSM, pThis->cPorts);
    37113698
    37123699    /* Save the device config. */
    3713     for (unsigned i = 0; i < RT_ELEMENTS(pThis->aDeviceStates); i++)
    3714         SSMR3PutBool(pSSM, pThis->aDeviceStates[i].pDrvBase != NULL);
     3700    for (unsigned i = 0; i < pThis->cDeviceStates; i++)
     3701        SSMR3PutBool(pSSM, pThis->paDeviceStates[i].pDrvBase != NULL);
    37153702
    37163703    return VINF_SSM_DONT_CALL_AGAIN;
     
    37203707{
    37213708    PLSILOGICSCSI pLsiLogic = PDMINS_2_DATA(pDevIns, PLSILOGICSCSI);
    3722 
    3723     SSMR3PutU32   (pSSM, pLsiLogic->enmCtrlType);
    37243709
    37253710    /* Every device first. */
    37263711    lsilogicLiveExec(pDevIns, pSSM, SSM_PASS_FINAL);
    3727     for (unsigned i = 0; i < RT_ELEMENTS(pLsiLogic->aDeviceStates); i++)
    3728     {
    3729         PLSILOGICDEVICE pDevice = &pLsiLogic->aDeviceStates[i];
     3712    for (unsigned i = 0; i < pLsiLogic->cDeviceStates; i++)
     3713    {
     3714        PLSILOGICDEVICE pDevice = &pLsiLogic->paDeviceStates[i];
    37303715
    37313716        AssertMsg(!pDevice->cOutstandingRequests,
     
    38233808        PMptConfigurationPagesSas pSasPages = &pPages->u.SasPages;
    38243809
    3825         SSMR3PutMem(pSSM, &pSasPages->SASIOUnitPage0, sizeof(MptConfigurationPageSASIOUnit0));
    3826         SSMR3PutMem(pSSM, &pSasPages->SASIOUnitPage1, sizeof(MptConfigurationPageSASIOUnit1));
     3810        SSMR3PutU32(pSSM, pSasPages->cbSASIOUnitPage0);
     3811        SSMR3PutU32(pSSM, pSasPages->cbSASIOUnitPage1);
     3812
     3813        SSMR3PutMem(pSSM, pSasPages->pSASIOUnitPage0, pSasPages->cbSASIOUnitPage0);
     3814        SSMR3PutMem(pSSM, pSasPages->pSASIOUnitPage1, pSasPages->cbSASIOUnitPage1);
     3815
    38273816        SSMR3PutMem(pSSM, &pSasPages->SASIOUnitPage2, sizeof(MptConfigurationPageSASIOUnit2));
    38283817        SSMR3PutMem(pSSM, &pSasPages->SASIOUnitPage3, sizeof(MptConfigurationPageSASIOUnit3));
    38293818
    3830         for (unsigned i = 0; i < RT_ELEMENTS(pSasPages->aPHY); i++)
    3831         {
    3832             SSMR3PutMem(pSSM, &pSasPages->aPHY[i].SASPHYPage0, sizeof(MptConfigurationPageSASPHY0));
    3833             SSMR3PutMem(pSSM, &pSasPages->aPHY[i].SASPHYPage1, sizeof(MptConfigurationPageSASPHY1));
     3819        SSMR3PutU32(pSSM, pSasPages->cPHYs);
     3820        for (unsigned i = 0; i < pSasPages->cPHYs; i++)
     3821        {
     3822            SSMR3PutMem(pSSM, &pSasPages->paPHYs[i].SASPHYPage0, sizeof(MptConfigurationPageSASPHY0));
     3823            SSMR3PutMem(pSSM, &pSasPages->paPHYs[i].SASPHYPage1, sizeof(MptConfigurationPageSASPHY1));
    38343824        }
    38353825
     
    38823872    {
    38833873        LSILOGICCTRLTYPE enmCtrlType;
     3874        uint32_t cDeviceStates, cPorts;
    38843875
    38853876        rc = SSMR3GetU32(pSSM, (uint32_t *)&enmCtrlType);
    38863877        AssertRCReturn(rc, rc);
     3878        rc = SSMR3GetU32(pSSM, &cDeviceStates);
     3879        AssertRCReturn(rc, rc);
     3880        rc = SSMR3GetU32(pSSM, &cPorts);
     3881        AssertRCReturn(rc, rc);
    38873882
    38883883        if (enmCtrlType != pLsiLogic->enmCtrlType)
    3889             return SSMR3SetCfgError(pSSM, RT_SRC_POS, N_("Target config mismatch: config=%d state=%d"),
     3884            return SSMR3SetCfgError(pSSM, RT_SRC_POS, N_("Target config mismatch (Controller type): config=%d state=%d"),
    38903885                                    pLsiLogic->enmCtrlType, enmCtrlType);
     3886        if (cDeviceStates != pLsiLogic->cDeviceStates)
     3887            return SSMR3SetCfgError(pSSM, RT_SRC_POS, N_("Target config mismatch (Device states): config=%u state=%u"),
     3888                                    pLsiLogic->cDeviceStates, cDeviceStates);
     3889        if (cPorts != pLsiLogic->cPorts)
     3890            return SSMR3SetCfgError(pSSM, RT_SRC_POS, N_("Target config mismatch (Ports): config=%u state=%u"),
     3891                                    pLsiLogic->cPorts, cPorts);
    38913892    }
    38923893    if (uVersion > LSILOGIC_SAVED_STATE_VERSION_VBOX_30)
    38933894    {
    3894         for (unsigned i = 0; i < RT_ELEMENTS(pLsiLogic->aDeviceStates); i++)
     3895        for (unsigned i = 0; i < pLsiLogic->cDeviceStates; i++)
    38953896        {
    38963897            bool fPresent;
    38973898            rc = SSMR3GetBool(pSSM, &fPresent);
    38983899            AssertRCReturn(rc, rc);
    3899             if (fPresent != (pLsiLogic->aDeviceStates[i].pDrvBase != NULL))
     3900            if (fPresent != (pLsiLogic->paDeviceStates[i].pDrvBase != NULL))
    39003901                return SSMR3SetCfgError(pSSM, RT_SRC_POS, N_("Target %u config mismatch: config=%RTbool state=%RTbool"),
    3901                                          i, pLsiLogic->aDeviceStates[i].pDrvBase != NULL, fPresent);
     3902                                         i, pLsiLogic->paDeviceStates[i].pDrvBase != NULL, fPresent);
    39023903        }
    39033904    }
     
    39063907
    39073908    /* Every device first. */
    3908     for (unsigned i = 0; i < RT_ELEMENTS(pLsiLogic->aDeviceStates); i++)
    3909     {
    3910         PLSILOGICDEVICE pDevice = &pLsiLogic->aDeviceStates[i];
     3909    for (unsigned i = 0; i < pLsiLogic->cDeviceStates; i++)
     3910    {
     3911        PLSILOGICDEVICE pDevice = &pLsiLogic->paDeviceStates[i];
    39113912
    39123913        AssertMsg(!pDevice->cOutstandingRequests,
     
    40454046        else if (pLsiLogic->enmCtrlType == LSILOGICCTRLTYPE_SCSI_SAS)
    40464047        {
     4048            uint32_t cbPage0, cbPage1, cPHYs;
    40474049            PMptConfigurationPagesSas pSasPages = &pPages->u.SasPages;
    40484050
    4049             SSMR3GetMem(pSSM, &pSasPages->SASIOUnitPage0, sizeof(MptConfigurationPageSASIOUnit0));
    4050             SSMR3GetMem(pSSM, &pSasPages->SASIOUnitPage1, sizeof(MptConfigurationPageSASIOUnit1));
     4051            SSMR3GetU32(pSSM, &cbPage0);
     4052            SSMR3GetU32(pSSM, &cbPage1);
     4053
     4054            if (   (cbPage0 != pSasPages->cbSASIOUnitPage0)
     4055                || (cbPage1 != pSasPages->cbSASIOUnitPage1))
     4056                return VERR_SSM_LOAD_CONFIG_MISMATCH;
     4057
     4058            AssertPtr(pSasPages->pSASIOUnitPage0);
     4059            AssertPtr(pSasPages->pSASIOUnitPage1);
     4060
     4061            SSMR3GetMem(pSSM, pSasPages->pSASIOUnitPage0, pSasPages->cbSASIOUnitPage0);
     4062            SSMR3GetMem(pSSM, pSasPages->pSASIOUnitPage1, pSasPages->cbSASIOUnitPage1);
     4063
    40514064            SSMR3GetMem(pSSM, &pSasPages->SASIOUnitPage2, sizeof(MptConfigurationPageSASIOUnit2));
    40524065            SSMR3GetMem(pSSM, &pSasPages->SASIOUnitPage3, sizeof(MptConfigurationPageSASIOUnit3));
    40534066
    4054             for (unsigned i = 0; i < RT_ELEMENTS(pSasPages->aPHY); i++)
     4067            SSMR3GetU32(pSSM, &cPHYs);
     4068            if (cPHYs != pSasPages->cPHYs)
     4069                return VERR_SSM_LOAD_CONFIG_MISMATCH;
     4070
     4071            AssertPtr(pSasPages->paPHYs);
     4072            for (unsigned i = 0; i < pSasPages->cPHYs; i++)
    40554073            {
    4056                 SSMR3GetMem(pSSM, &pSasPages->aPHY[i].SASPHYPage0, sizeof(MptConfigurationPageSASPHY0));
    4057                 SSMR3GetMem(pSSM, &pSasPages->aPHY[i].SASPHYPage1, sizeof(MptConfigurationPageSASPHY1));
     4074                SSMR3GetMem(pSSM, &pSasPages->paPHYs[i].SASPHYPage0, sizeof(MptConfigurationPageSASPHY0));
     4075                SSMR3GetMem(pSSM, &pSasPages->paPHYs[i].SASPHYPage1, sizeof(MptConfigurationPageSASPHY1));
    40584076            }
    40594077
     
    41654183{
    41664184    PLSILOGICSCSI pLsiLogic = PDMILEDPORTS_2_PLSILOGICSCSI(pInterface);
    4167     if (iLUN < LSILOGIC_DEVICES_MAX)
    4168     {
    4169         *ppLed = &pLsiLogic->aDeviceStates[iLUN].Led;
     4185    if (iLUN < pLsiLogic->cDeviceStates)
     4186    {
     4187        *ppLed = &pLsiLogic->paDeviceStates[iLUN].Led;
    41704188        Assert((*ppLed)->u32Magic == PDMLED_MAGIC);
    41714189        return VINF_SUCCESS;
     
    42094227{
    42104228    PLSILOGICSCSI   pThis = PDMINS_2_DATA(pDevIns, PLSILOGICSCSI);
    4211     PLSILOGICDEVICE pDevice = &pThis->aDeviceStates[iLUN];
     4229    PLSILOGICDEVICE pDevice = &pThis->paDeviceStates[iLUN];
     4230
     4231    if (iLUN >= pThis->cDeviceStates)
     4232        return;
    42124233
    42134234    AssertMsg(fFlags & PDM_TACH_FLAGS_NOT_HOT_PLUG,
     
    42364257{
    42374258    PLSILOGICSCSI   pThis = PDMINS_2_DATA(pDevIns, PLSILOGICSCSI);
    4238     PLSILOGICDEVICE pDevice = &pThis->aDeviceStates[iLUN];
     4259    PLSILOGICDEVICE pDevice = &pThis->paDeviceStates[iLUN];
    42394260    int rc;
     4261
     4262    if (iLUN >= pThis->cDeviceStates)
     4263        return VERR_PDM_LUN_NOT_FOUND;
    42404264
    42414265    AssertMsgReturn(fFlags & PDM_TACH_FLAGS_NOT_HOT_PLUG,
     
    43104334    PDMR3CritSectDelete(&pThis->ReplyFreeQueueCritSect);
    43114335    PDMR3CritSectDelete(&pThis->ReplyPostQueueCritSect);
     4336
     4337    if (pThis->paDeviceStates)
     4338        RTMemFree(pThis->paDeviceStates);
    43124339
    43134340    /* Destroy task cache. */
     
    43374364                                          "ReplyQueueDepth\0"
    43384365                                          "RequestQueueDepth\0"
    4339                                           "ControllerType\0");
     4366                                          "ControllerType\0"
     4367                                          "NumPorts\0");
    43404368    if (RT_FAILURE(rc))
    43414369        return PDMDEV_SET_ERROR(pDevIns, VERR_PDM_DEVINS_UNKNOWN_CFG_VALUES,
     
    43834411                                N_("LsiLogic configuration error: failed to determine controller type from string"));
    43844412
     4413    rc = CFGMR3QueryU8(pCfgHandle, "NumPorts",
     4414                       &pThis->cPorts);
     4415    if (rc == VERR_CFGM_VALUE_NOT_FOUND)
     4416    {
     4417        if (pThis->enmCtrlType == LSILOGICCTRLTYPE_SCSI_SPI)
     4418            pThis->cPorts = LSILOGICSCSI_PCI_SPI_PORTS_MAX;
     4419        else if (pThis->enmCtrlType == LSILOGICCTRLTYPE_SCSI_SAS)
     4420            pThis->cPorts = LSILOGICSCSI_PCI_SAS_PORTS_DEFAULT;
     4421        else
     4422            AssertMsgFailed(("Invalid controller type: %d\n", pThis->enmCtrlType));
     4423    }
     4424    else if (RT_FAILURE(rc))
     4425        return PDMDEV_SET_ERROR(pDevIns, rc,
     4426                                N_("LsiLogic configuration error: failed to read NumPorts as integer"));
     4427
    43854428    /* Init static parts. */
    43864429    PCIDevSetVendorId(&pThis->PciDev, LSILOGICSCSI_PCI_VENDOR_ID); /* LsiLogic */
     
    44884531                                N_("Cannot create task cache"));
    44894532
    4490     for (unsigned i = 0; i < RT_ELEMENTS(pThis->aDeviceStates); i++)
    4491     {
    4492         PLSILOGICDEVICE pDevice = &pThis->aDeviceStates[i];
     4533    if (pThis->enmCtrlType == LSILOGICCTRLTYPE_SCSI_SPI)
     4534        pThis->cDeviceStates = pThis->cPorts * LSILOGICSCSI_PCI_SPI_DEVICES_PER_BUS_MAX;
     4535    else if (pThis->enmCtrlType == LSILOGICCTRLTYPE_SCSI_SAS)
     4536        pThis->cDeviceStates = pThis->cPorts * LSILOGICSCSI_PCI_SAS_DEVICES_PER_PORT_MAX;
     4537    else
     4538        AssertMsgFailed(("Invalid controller type: %d\n", pThis->enmCtrlType));
     4539
     4540    /*
     4541     * Allocate device states.
     4542     */
     4543    pThis->paDeviceStates = (PLSILOGICDEVICE)RTMemAllocZ(sizeof(LSILOGICDEVICE) * pThis->cDeviceStates);
     4544    if (!pThis->paDeviceStates)
     4545        return PDMDEV_SET_ERROR(pDevIns, rc,
     4546                                N_("Failed to allocate memory for device states"));
     4547
     4548    for (unsigned i = 0; i < pThis->cDeviceStates; i++)
     4549    {
     4550        char szName[24];
     4551        PLSILOGICDEVICE pDevice = &pThis->paDeviceStates[i];
    44934552
    44944553        /* Initialize static parts of the device. */
    4495         pDevice->iLUN = i;
    4496         pDevice->pLsiLogicR3  = pThis;
    4497         pDevice->pLsiLogicR0  = PDMINS_2_DATA_R0PTR(pDevIns);
    4498         pDevice->pLsiLogicRC  = PDMINS_2_DATA_RCPTR(pDevIns);
    4499         pDevice->Led.u32Magic = PDMLED_MAGIC;
     4554        pDevice->iLUN                              = i;
     4555        pDevice->pLsiLogicR3                       = pThis;
     4556        pDevice->Led.u32Magic                      = PDMLED_MAGIC;
    45004557        pDevice->IBase.pfnQueryInterface           = lsilogicDeviceQueryInterface;
    45014558        pDevice->ISCSIPort.pfnSCSIRequestCompleted = lsilogicDeviceSCSIRequestCompleted;
    45024559        pDevice->ILed.pfnQueryStatusLed            = lsilogicDeviceQueryStatusLed;
    4503     }
    4504 
    4505     unsigned cMaxDevices;
    4506 
    4507     if (pThis->enmCtrlType == LSILOGICCTRLTYPE_SCSI_SPI)
    4508         cMaxDevices = LSILOGICSCSI_PCI_SPI_DEVICES_MAX;
    4509     else if (pThis->enmCtrlType == LSILOGICCTRLTYPE_SCSI_SAS)
    4510         cMaxDevices = LSILOGICSCSI_PCI_SAS_DEVICES_MAX;
    4511     else
    4512         AssertMsgFailed(("Invalid controller type: %d\n", pThis->enmCtrlType));
    4513 
    4514     /* Initialize per device state. */
    4515     for (unsigned i = 0; i < cMaxDevices; i++)
    4516     {
    4517         char szName[24];
    4518         PLSILOGICDEVICE pDevice = &pThis->aDeviceStates[i];
    45194560
    45204561        RTStrPrintf(szName, sizeof(szName), "Device%d", i);
  • trunk/src/VBox/Devices/Storage/DevLsiLogicSCSI.h

    r25587 r25675  
    5959#define LSILOGICSCSI_PCI_SAS_SUBSYSTEM_VENDOR_ID  (0x1000)
    6060#define LSILOGICSCSI_PCI_SAS_SUBSYSTEM_ID         (0x8000)
    61 #define LSILOGICSCSI_PCI_SAS_PORTS_MAX             8
    62 #define LSILOGICSCSI_PCI_SAS_DEVICES_PER_PORT_MAX  1
     61#define LSILOGICSCSI_PCI_SAS_PORTS_MAX             256
     62#define LSILOGICSCSI_PCI_SAS_PORTS_DEFAULT           8
     63#define LSILOGICSCSI_PCI_SAS_DEVICES_PER_PORT_MAX    1
    6364#define LSILOGICSCSI_PCI_SAS_DEVICES_MAX          (LSILOGICSCSI_PCI_SAS_PORTS_MAX * LSILOGICSCSI_PCI_SAS_DEVICES_PER_PORT_MAX)
    64 
    65 /** Maximum number of devices for both types */
    66 #define LSILOGIC_DEVICES_MAX LSILOGICSCSI_PCI_SPI_DEVICES_MAX
    6765
    6866/**
     
    11521150typedef struct MptConfigurationPageManufacturing1
    11531151{
    1154     /** The omnipresent header. */
    1155     MptConfigurationPageHeader    Header;
    1156     /** VPD info - don't know what belongs here so all zero. */
    1157     uint8_t                       abVPDInfo[256];
     1152    /** Union */
     1153    union
     1154    {
     1155        /** Byte view */
     1156        uint8_t                           abPageData[260];
     1157        /** Field view */
     1158        struct
     1159        {
     1160            /** The omnipresent header. */
     1161            MptConfigurationPageHeader    Header;
     1162            /** VPD info - don't know what belongs here so all zero. */
     1163            uint8_t                       abVPDInfo[256];
     1164        } fields;
     1165    } u;
    11581166} MptConfigurationPageManufacturing1, *PMptConfigurationPageManufacturing1;
    11591167#pragma pack()
     
    24372445
    24382446/**
     2447 * PHY entry for the SAS I/O unit page 0
     2448 */
     2449#pragma pack(1)
     2450typedef struct MptConfigurationPageSASIOUnit0PHY
     2451{
     2452    /** Port number */
     2453    uint8_t                           u8Port;
     2454    /** Port flags */
     2455    uint8_t                           u8PortFlags;
     2456    /** Phy flags */
     2457    uint8_t                           u8PhyFlags;
     2458    /** negotiated link rate */
     2459    uint8_t                           u8NegotiatedLinkRate;
     2460    /** Controller phy device info */
     2461    uint32_t                          u32ControllerPhyDeviceInfo;
     2462    /** Attached device handle */
     2463    uint16_t                          u16AttachedDevHandle;
     2464    /** Controller device handle */
     2465    uint16_t                          u16ControllerDevHandle;
     2466    /** Discovery status */
     2467    uint32_t                          u32DiscoveryStatus;
     2468} MptConfigurationPageSASIOUnit0PHY, *PMptConfigurationPageSASIOUnit0PHY;
     2469#pragma pack()
     2470AssertCompileSize(MptConfigurationPageSASIOUnit0PHY, 16);
     2471
     2472/**
    24392473 * SAS I/O  Unit page 0 - Readonly
    24402474 */
     
    24602494            /** Reserved */
    24612495            uint8_t                               au8Reserved[3];
    2462             /** Content for each physical port */
    2463             struct
    2464             {
    2465                 /** Port number */
    2466                 uint8_t                           u8Port;
    2467                 /** Port flags */
    2468                 uint8_t                           u8PortFlags;
    2469                 /** Phy flags */
    2470                 uint8_t                           u8PhyFlags;
    2471                 /** negotiated link rate */
    2472                 uint8_t                           u8NegotiatedLinkRate;
    2473                 /** Controller phy device info */
    2474                 uint32_t                          u32ControllerPhyDeviceInfo;
    2475                 /** Attached device handle */
    2476                 uint16_t                          u16AttachedDevHandle;
    2477                 /** Controller device handle */
    2478                 uint16_t                          u16ControllerDevHandle;
    2479                 /** Discovery status */
    2480                 uint32_t                          u32DiscoveryStatus;
    2481             } aPHY[LSILOGICSCSI_PCI_SAS_PORTS_MAX];
     2496            /** Content for each physical port - variable depending on the amount of ports. */
     2497            MptConfigurationPageSASIOUnit0PHY     aPHY[1];
    24822498        } fields;
    24832499    } u;
    24842500} MptConfigurationPageSASIOUnit0, *PMptConfigurationPageSASIOUnit0;
    24852501#pragma pack()
    2486 AssertCompileSize(MptConfigurationPageSASIOUnit0, 8+2+2+1+3+(LSILOGICSCSI_PCI_SAS_PORTS_MAX*16));
     2502AssertCompileSize(MptConfigurationPageSASIOUnit0, 8+2+2+1+3+sizeof(MptConfigurationPageSASIOUnit0PHY));
     2503
     2504#define LSILOGICSCSI_SASIOUNIT0_GET_SIZE(ports) (sizeof(MptConfigurationPageSASIOUnit0) + ((ports) - 1) * sizeof(MptConfigurationPageSASIOUnit0PHY))
    24872505
    24882506#define LSILOGICSCSI_SASIOUNIT0_PORT_CONFIGURATION_AUTO  RT_BIT(0)
     
    25362554#define LSILOGICSCSI_SASIOUNIT0_DISCOVERY_STATUS_MAX_SATA_TGTS   RT_BIT(12)
    25372555#define LSILOGICSCSI_SASIOUNIT0_DISCOVERY_STATUS_MULT_CTRLS      RT_BIT(13)
     2556
     2557/**
     2558 * PHY entry for the SAS I/O unit page 1
     2559 */
     2560#pragma pack(1)
     2561typedef struct MptConfigurationPageSASIOUnit1PHY
     2562{
     2563    /** Port number */
     2564    uint8_t                           u8Port;
     2565    /** Port flags */
     2566    uint8_t                           u8PortFlags;
     2567    /** Phy flags */
     2568    uint8_t                           u8PhyFlags;
     2569    /** Max link rate */
     2570    uint8_t                           u8MaxMinLinkRate;
     2571    /** Controller phy device info */
     2572    uint32_t                          u32ControllerPhyDeviceInfo;
     2573    /** Maximum target port connect time */
     2574    uint16_t                          u16MaxTargetPortConnectTime;
     2575    /** Reserved */
     2576    uint16_t                          u16Reserved;
     2577} MptConfigurationPageSASIOUnit1PHY, *PMptConfigurationPageSASIOUnit1PHY;
     2578#pragma pack()
     2579AssertCompileSize(MptConfigurationPageSASIOUnit1PHY, 12);
    25382580
    25392581/**
     
    25692611            /** I/O device missing delay */
    25702612            uint8_t                               u8IODeviceMissingDelay;
    2571             /** Content for each physical port */
    2572             struct
    2573             {
    2574                 /** Port number */
    2575                 uint8_t                           u8Port;
    2576                 /** Port flags */
    2577                 uint8_t                           u8PortFlags;
    2578                 /** Phy flags */
    2579                 uint8_t                           u8PhyFlags;
    2580                 /** Max link rate */
    2581                 uint8_t                           u8MaxMinLinkRate;
    2582                 /** Controller phy device info */
    2583                 uint32_t                          u32ControllerPhyDeviceInfo;
    2584                 /** Maximum target port connect time */
    2585                 uint16_t                          u16MaxTargetPortConnectTime;
    2586                 /** Reserved */
    2587                 uint16_t                          u16Reserved;
    2588             } aPHY[LSILOGICSCSI_PCI_SAS_PORTS_MAX];
     2613            /** Content for each physical port - variable depending on the number of ports */
     2614            MptConfigurationPageSASIOUnit1PHY     aPHY[1];
    25892615        } fields;
    25902616    } u;
    25912617} MptConfigurationPageSASIOUnit1, *PMptConfigurationPageSASIOUnit1;
    25922618#pragma pack()
    2593 AssertCompileSize(MptConfigurationPageSASIOUnit1, 8+12+(LSILOGICSCSI_PCI_SAS_PORTS_MAX*12));
     2619AssertCompileSize(MptConfigurationPageSASIOUnit1, 8+12+sizeof(MptConfigurationPageSASIOUnit1PHY));
     2620
     2621#define LSILOGICSCSI_SASIOUNIT1_GET_SIZE(ports) (sizeof(MptConfigurationPageSASIOUnit1) + ((ports) - 1) * sizeof(MptConfigurationPageSASIOUnit1PHY))
    25942622
    25952623#define LSILOGICSCSI_SASIOUNIT1_CONTROL_CLEAR_SATA_AFFILIATION     RT_BIT(0)
     
    31483176} MptConfigurationPagesSpi, *PMptConfigurationPagesSpi;
    31493177
     3178typedef struct MptPHY
     3179{
     3180    MptConfigurationPageSASPHY0     SASPHYPage0;
     3181    MptConfigurationPageSASPHY1     SASPHYPage1;
     3182} MptPHY, *PMptPHY;
     3183
    31503184#pragma pack(1)
    31513185typedef struct MptConfigurationPagesSas
    31523186{
    3153     MptConfigurationPageSASIOUnit0      SASIOUnitPage0;
    3154     MptConfigurationPageSASIOUnit1      SASIOUnitPage1;
     3187    /** Size of the I/O unit page 0 */
     3188    uint32_t                            cbSASIOUnitPage0;
     3189    /** Pointer to the I/O unit page 0 */
     3190    PMptConfigurationPageSASIOUnit0     pSASIOUnitPage0;
     3191    /** Size of the I/O unit page 1 */
     3192    uint32_t                            cbSASIOUnitPage1;
     3193    /** Pointer to the I/O unit page 1 */
     3194    PMptConfigurationPageSASIOUnit1     pSASIOUnitPage1;
     3195    /** I/O unit page 2 */
    31553196    MptConfigurationPageSASIOUnit2      SASIOUnitPage2;
     3197    /** I/O unit page 3 */
    31563198    MptConfigurationPageSASIOUnit3      SASIOUnitPage3;
    3157     struct
    3158     {
    3159         MptConfigurationPageSASPHY0     SASPHYPage0;
    3160         MptConfigurationPageSASPHY1     SASPHYPage1;
    3161     } aPHY[LSILOGICSCSI_PCI_SAS_PORTS_MAX];
     3199
     3200    /** Number of PHYs in the array. */
     3201    uint32_t                            cPHYs;
     3202    /** Pointer to an array of per PHYS pages. */
     3203    R3PTRTYPE(PMptPHY)                  paPHYs;
    31623204
    31633205    /** Number of devices detected. */
     
    32123254
    32133255/**
     3256 * Initializes a page header.
     3257 */
     3258#define MPT_CONFIG_PAGE_HEADER_INIT(pg, type, nr, flags) \
     3259    (pg)->u.fields.Header.u8PageType   = flags; \
     3260    (pg)->u.fields.Header.u8PageNumber = nr; \
     3261    (pg)->u.fields.Header.u8PageLength = sizeof(type) / 4
     3262
     3263#define MPT_CONFIG_PAGE_HEADER_INIT_MANUFACTURING(pg, type, nr, flags) \
     3264    MPT_CONFIG_PAGE_HEADER_INIT(pg, type, nr, flags | MPT_CONFIGURATION_PAGE_TYPE_MANUFACTURING)
     3265
     3266#define MPT_CONFIG_PAGE_HEADER_INIT_IO_UNIT(pg, type, nr, flags) \
     3267    MPT_CONFIG_PAGE_HEADER_INIT(pg, type, nr, flags | MPT_CONFIGURATION_PAGE_TYPE_IO_UNIT)
     3268
     3269#define MPT_CONFIG_PAGE_HEADER_INIT_IOC(pg, type, nr, flags) \
     3270    MPT_CONFIG_PAGE_HEADER_INIT(pg, type, nr, flags | MPT_CONFIGURATION_PAGE_TYPE_IOC)
     3271
     3272#define MPT_CONFIG_PAGE_HEADER_INIT_BIOS(pg, type, nr, flags) \
     3273    MPT_CONFIG_PAGE_HEADER_INIT(pg, type, nr, flags | MPT_CONFIGURATION_PAGE_TYPE_BIOS)
     3274
     3275/**
     3276 * Initializes a extended page header.
     3277 */
     3278#define MPT_CONFIG_EXTENDED_PAGE_HEADER_INIT(pg, cb, nr, flags, exttype) \
     3279    (pg)->u.fields.ExtHeader.u8PageType   = flags | MPT_CONFIGURATION_PAGE_TYPE_EXTENDED; \
     3280    (pg)->u.fields.ExtHeader.u8PageNumber = nr; \
     3281    (pg)->u.fields.ExtHeader.u8ExtPageType = exttype; \
     3282    (pg)->u.fields.ExtHeader.u16ExtPageLength = cb / 4
     3283
     3284/**
    32143285 * Possible SG element types.
    32153286 */
  • trunk/src/VBox/Devices/testcase/tstDeviceStructSizeGC.cpp

    r25587 r25675  
    14541454
    14551455#ifdef VBOX_WITH_LSILOGIC
    1456     GEN_CHECK_SIZE(LSILOGICDEVICE);
    1457     GEN_CHECK_OFF(LSILOGICDEVICE, pLsiLogicR3);
    1458     GEN_CHECK_OFF(LSILOGICDEVICE, pLsiLogicR0);
    1459     GEN_CHECK_OFF(LSILOGICDEVICE, pLsiLogicRC);
    1460     GEN_CHECK_OFF(LSILOGICDEVICE, iLUN);
    1461     GEN_CHECK_OFF(LSILOGICDEVICE, cOutstandingRequests);
    1462     GEN_CHECK_OFF(LSILOGICDEVICE, IBase);
    1463     GEN_CHECK_OFF(LSILOGICDEVICE, ISCSIPort);
    1464     GEN_CHECK_OFF(LSILOGICDEVICE, ILed);
    1465     GEN_CHECK_OFF(LSILOGICDEVICE, pDrvBase);
    1466     GEN_CHECK_OFF(LSILOGICDEVICE, pDrvSCSIConnector);
    1467     GEN_CHECK_OFF(LSILOGICDEVICE, Led);
    1468 
    14691456    GEN_CHECK_SIZE(LSILOGICSCSI);
    14701457    GEN_CHECK_OFF(LSILOGICSCSI, PciDev);
     
    14831470    GEN_CHECK_OFF(LSILOGICSCSI, pNotificationQueueR0);
    14841471    GEN_CHECK_OFF(LSILOGICSCSI, pNotificationQueueRC);
    1485     GEN_CHECK_OFF(LSILOGICSCSI, aDeviceStates);
    1486     GEN_CHECK_OFF(LSILOGICSCSI, aDeviceStates[LSILOGIC_DEVICES_MAX-1]);
     1472    GEN_CHECK_OFF(LSILOGICSCSI, cDeviceStates);
     1473    GEN_CHECK_OFF(LSILOGICSCSI, paDeviceStates);
    14871474    GEN_CHECK_OFF(LSILOGICSCSI, GCPhysMMIOBase);
    14881475    GEN_CHECK_OFF(LSILOGICSCSI, IOPortBase);
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