Changeset 25675 in vbox
- Timestamp:
- Jan 7, 2010 1:11:59 AM (15 years ago)
- svn:sync-xref-src-repo-rev:
- 56391
- Location:
- trunk/src/VBox/Devices
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Storage/DevLsiLogicSCSI.cpp
r25588 r25675 70 70 /** Pointer to the owning lsilogic device instance. - R3 pointer */ 71 71 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;76 72 77 73 /** LUN of the device. */ … … 149 145 #endif 150 146 147 /** Number of device states allocated. */ 148 uint32_t cDeviceStates; 151 149 /** States for attached devices. */ 152 LSILOGICDEVICE aDeviceStates[LSILOGIC_DEVICES_MAX];150 R3PTRTYPE(PLSILOGICDEVICE) paDeviceStates; 153 151 154 152 /** MMIO address the device is mapped to. */ 155 RTGCPHYS GCPhysMMIOBase;153 RTGCPHYS GCPhysMMIOBase; 156 154 /** I/O port address the device is mapped to. */ 157 RTIOPORT IOPortBase;155 RTIOPORT IOPortBase; 158 156 159 157 /** Interrupt mask. */ 160 volatile uint32_t uInterruptMask;158 volatile uint32_t uInterruptMask; 161 159 /** Interrupt status register. */ 162 volatile uint32_t uInterruptStatus;160 volatile uint32_t uInterruptStatus; 163 161 164 162 /** Buffer for messages which are passed … … 181 179 uint16_t u16IOCFaultCode; 182 180 183 /** Upper 32 bits of the m oessage frame address to locate requests in guest memory. */181 /** Upper 32 bits of the message frame address to locate requests in guest memory. */ 184 182 uint32_t u32HostMFAHighAddr; 185 183 /** Upper 32 bits of the sense buffer address. */ … … 251 249 uint16_t u16Alignment3; 252 250 uint32_t u32Alignment4; 251 252 /** Number of ports this controller has. */ 253 uint8_t cPorts; 253 254 254 255 /** BIOS emulation. */ … … 477 478 478 479 /* Set default values. */ 479 pThis->cMaxDevices = LSILOGIC_DEVICES_MAX;480 pThis->cMaxDevices = pThis->cDeviceStates; 480 481 pThis->cMaxBuses = 1; 481 482 pThis->cbReplyFrame = 128; /* @todo Figure out where it is needed. */ … … 727 728 { 728 729 pReply->IOCFacts.u16MessageVersion = 0x0102; /* Version from the specification. */ 729 pReply->IOCFacts.u8NumberOfPorts = 1;730 pReply->IOCFacts.u8NumberOfPorts = pLsiLogic->cPorts; 730 731 } 731 732 else if (pLsiLogic->enmCtrlType == LSILOGICCTRLTYPE_SCSI_SAS) 732 733 { 733 734 pReply->IOCFacts.u16MessageVersion = 0x0105; /* Version from the specification. */ 734 pReply->IOCFacts.u8NumberOfPorts = 8;735 pReply->IOCFacts.u8NumberOfPorts = pLsiLogic->cPorts; 735 736 } 736 737 else … … 768 769 { 769 770 /* This controller only supports one bus with bus number 0. */ 770 if (pPortFactsReq->u8PortNumber != 0)771 if (pPortFactsReq->u8PortNumber >= pLsiLogic->cPorts) 771 772 { 772 773 pReply->PortFacts.u8PortType = 0; /* Not existant. */ … … 775 776 { 776 777 pReply->PortFacts.u8PortType = 0x01; /* SCSI Port. */ 777 pReply->PortFacts.u16MaxDevices = LSILOGIC _DEVICES_MAX;778 pReply->PortFacts.u16MaxDevices = LSILOGICSCSI_PCI_SPI_DEVICES_PER_BUS_MAX; 778 779 pReply->PortFacts.u16ProtocolFlags = RT_BIT(3) | RT_BIT(0); /* SCSI initiator and LUN supported. */ 779 780 pReply->PortFacts.u16PortSCSIID = 7; /* Default */ … … 785 786 else if (pLsiLogic->enmCtrlType == LSILOGICCTRLTYPE_SCSI_SAS) 786 787 { 787 if (pPortFactsReq->u8PortNumber >= 8)788 if (pPortFactsReq->u8PortNumber >= pLsiLogic->cPorts) 788 789 { 789 790 pReply->PortFacts.u8PortType = 0; /* Not existant. */ … … 792 793 { 793 794 pReply->PortFacts.u8PortType = 0x30; /* SAS Port. */ 794 pReply->PortFacts.u16MaxDevices = 1;795 pReply->PortFacts.u16MaxDevices = pLsiLogic->cPorts; 795 796 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; 797 798 pReply->PortFacts.u16MaxPersistentIDs = 0; 798 799 pReply->PortFacts.u16MaxPostedCmdBuffers = 0; /* Only applies for target mode which we dont support. */ … … 1849 1850 #endif 1850 1851 1851 if (RT_LIKELY( (pTaskState->GuestRequest.SCSIIO.u8TargetID < LSILOGIC_DEVICES_MAX)1852 if (RT_LIKELY( (pTaskState->GuestRequest.SCSIIO.u8TargetID < pLsiLogic->cDeviceStates) 1852 1853 && (pTaskState->GuestRequest.SCSIIO.u8Bus == 0))) 1853 1854 { 1854 1855 PLSILOGICDEVICE pTargetDevice; 1855 pTargetDevice = &pLsiLogic-> aDeviceStates[pTaskState->GuestRequest.SCSIIO.u8TargetID];1856 pTargetDevice = &pLsiLogic->paDeviceStates[pTaskState->GuestRequest.SCSIIO.u8TargetID]; 1856 1857 1857 1858 if (pTargetDevice->pDrvBase) … … 1901 1902 1902 1903 /* 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; 1908 1909 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; 1916 1917 1917 1918 lsilogicFinishAddressReply(pLsiLogic, &pTaskState->IOCReply, false); … … 1968 1969 /* The SCSI target encountered an error during processing post a reply. */ 1969 1970 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; 1975 1976 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; 1985 1986 1986 1987 lsilogicFinishAddressReply(pLsiLogic, &pTaskState->IOCReply, true); … … 2134 2135 break; 2135 2136 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; 2138 2139 *pcbPage = sizeof(pPages->ManufacturingPage1); 2139 2140 break; … … 2349 2350 { 2350 2351 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; 2354 2355 break; 2355 2356 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; 2359 2360 break; 2360 2361 case 2: … … 2385 2386 uint8_t uAddressForm = MPT_CONFIGURATION_PAGE_ADDRESS_GET_SAS_FORM(PageAddress); 2386 2387 PMptConfigurationPagesSas pPagesSas = &pPages->u.SasPages; 2388 PMptPHY pPHYPages = NULL; 2387 2389 2388 2390 Log(("Address form %d\n", uAddressForm)); … … 2394 2396 Log(("PHY number %d\n", u8PhyNumber)); 2395 2397 2396 if (u8PhyNumber >= RT_ELEMENTS(pPagesSas->aPHY))2398 if (u8PhyNumber >= pPagesSas->cPHYs) 2397 2399 return VERR_NOT_FOUND; 2398 2400 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 { 2399 2419 switch(u8PageNumber) 2400 2420 { 2401 2421 case 0: 2402 *ppPageHeader = &pP agesSas->aPHY[u8PhyNumber].SASPHYPage0.u.fields.ExtHeader;2403 *ppbPageData = pPagesSas->aPHY[u8PhyNumber].SASPHYPage0.u.abPageData;2404 *pcbPage = sizeof(pP agesSas->aPHY[u8PhyNumber].SASPHYPage0);2422 *ppPageHeader = &pPHYPages->SASPHYPage0.u.fields.ExtHeader; 2423 *ppbPageData = pPHYPages->SASPHYPage0.u.abPageData; 2424 *pcbPage = sizeof(pPHYPages->SASPHYPage0); 2405 2425 break; 2406 2426 case 1: 2407 *ppPageHeader = &pP agesSas->aPHY[u8PhyNumber].SASPHYPage1.u.fields.ExtHeader;2408 *ppbPageData = pP agesSas->aPHY[u8PhyNumber].SASPHYPage1.u.abPageData;2409 *pcbPage = sizeof(pP agesSas->aPHY[u8PhyNumber].SASPHYPage1);2427 *ppPageHeader = &pPHYPages->SASPHYPage1.u.fields.ExtHeader; 2428 *ppbPageData = pPHYPages->SASPHYPage1.u.abPageData; 2429 *pcbPage = sizeof(pPHYPages->SASPHYPage1); 2410 2430 break; 2411 2431 default: … … 2413 2433 } 2414 2434 } 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 }2440 2435 else 2441 rc = VERR_NOT_FOUND; /* Correct? */ 2442 2436 rc = VERR_NOT_FOUND; 2443 2437 2444 2438 return rc; … … 2465 2459 Log(("Get next handle %#x\n", u16Handle)); 2466 2460 2461 pSASDevice = pPagesSas->pSASDeviceHead; 2462 2467 2463 /* Get the first device? */ 2468 if (u16Handle == 0xffff)2469 pSASDevice = pPagesSas->pSASDeviceHead;2470 else2471 { 2464 if (u16Handle != 0xffff) 2465 { 2466 /* No, search for the right one. */ 2467 2472 2468 while ( pSASDevice 2473 2469 && pSASDevice->SASDevicePage0.u.fields.u16DevHandle != u16Handle) … … 2602 2598 PMptConfigurationReply pReply) 2603 2599 { 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; 2610 2607 2611 2608 LogFlowFunc(("pLsiLogic=%#p\n", pLsiLogic)); … … 2918 2915 2919 2916 /* 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; 2926 2926 2927 2927 /* 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; 2936 2939 2937 2940 /* SAS I/O unit page 2 - Port specific informations. */ … … 2949 2952 pPages->SASIOUnitPage3.u.fields.ExtHeader.u16ExtPageLength = sizeof(MptConfigurationPageSASIOUnit3) / 4; 2950 2953 2954 pPages->cPHYs = pThis->cPorts; 2955 pPages->paPHYs = (PMptPHY)RTMemAllocZ(pPages->cPHYs * sizeof(MptPHY)); 2956 AssertPtr(pPages->paPHYs); 2957 2951 2958 /* 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]; 2954 2962 uint16_t u16ControllerHandle = lsilogicGetHandle(pThis); 2955 2963 2956 p Pages->SASIOUnitPage0.u.fields.aPHY[i].u8Port = i;2957 p Pages->SASIOUnitPage0.u.fields.aPHY[i].u8PortFlags = 0;2958 p Pages->SASIOUnitPage0.u.fields.aPHY[i].u8PhyFlags = 0;2959 p Pages->SASIOUnitPage0.u.fields.aPHY[i].u8NegotiatedLinkRate = LSILOGICSCSI_SASIOUNIT0_NEGOTIATED_RATE_FAILED;2960 p Pages->SASIOUnitPage0.u.fields.aPHY[i].u32ControllerPhyDeviceInfo = LSILOGICSCSI_SASIOUNIT0_DEVICE_TYPE_SET(LSILOGICSCSI_SASIOUNIT0_DEVICE_TYPE_NO);2961 p Pages->SASIOUnitPage0.u.fields.aPHY[i].u16ControllerDevHandle = u16ControllerHandle;2962 p Pages->SASIOUnitPage0.u.fields.aPHY[i].u16AttachedDevHandle = 0; /* No device attached. */2963 p Pages->SASIOUnitPage0.u.fields.aPHY[i].u32DiscoveryStatus = 0; /* No errors */2964 2965 p Pages->SASIOUnitPage1.u.fields.aPHY[i].u8Port = i;2966 p Pages->SASIOUnitPage1.u.fields.aPHY[i].u8PortFlags = 0;2967 p Pages->SASIOUnitPage1.u.fields.aPHY[i].u8PhyFlags = 0;2968 p Pages->SASIOUnitPage1.u.fields.aPHY[i].u8MaxMinLinkRate = LSILOGICSCSI_SASIOUNIT1_LINK_RATE_MIN_SET(LSILOGICSCSI_SASIOUNIT1_LINK_RATE_15GB)2969 2970 p Pages->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); 2971 2979 2972 2980 /* SAS PHY page 0. */ 2973 pP ages->aPHY[i].SASPHYPage0.u.fields.ExtHeader.u8PageType = MPT_CONFIGURATION_PAGE_ATTRIBUTE_READONLY2981 pPHYPages->SASPHYPage0.u.fields.ExtHeader.u8PageType = MPT_CONFIGURATION_PAGE_ATTRIBUTE_READONLY 2974 2982 | MPT_CONFIGURATION_PAGE_TYPE_EXTENDED; 2975 pP ages->aPHY[i].SASPHYPage0.u.fields.ExtHeader.u8PageNumber = 0;2976 pP ages->aPHY[i].SASPHYPage0.u.fields.ExtHeader.u8ExtPageType = MPT_CONFIGURATION_PAGE_TYPE_EXTENDED_SASPHYS;2977 pP ages->aPHY[i].SASPHYPage0.u.fields.ExtHeader.u16ExtPageLength = sizeof(MptConfigurationPageSASPHY0) / 4;2978 pP ages->aPHY[i].SASPHYPage0.u.fields.u8AttachedPhyIdentifier= i;2979 pP ages->aPHY[i].SASPHYPage0.u.fields.u32AttachedDeviceInfo= LSILOGICSCSI_SASPHY0_DEV_INFO_DEVICE_TYPE_SET(LSILOGICSCSI_SASPHY0_DEV_INFO_DEVICE_TYPE_NO);2980 pP ages->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 pP ages->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); 2984 2992 2985 2993 /* SAS PHY page 1. */ 2986 pP ages->aPHY[i].SASPHYPage1.u.fields.ExtHeader.u8PageType = MPT_CONFIGURATION_PAGE_ATTRIBUTE_READONLY2987 2988 pP ages->aPHY[i].SASPHYPage1.u.fields.ExtHeader.u8PageNumber = 1;2989 pP ages->aPHY[i].SASPHYPage1.u.fields.ExtHeader.u8ExtPageType = MPT_CONFIGURATION_PAGE_TYPE_EXTENDED_SASPHYS;2990 pP ages->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; 2991 2999 2992 3000 /* Settings for present devices. */ 2993 if (pThis-> aDeviceStates[i].pDrvBase)3001 if (pThis->paDeviceStates[i].pDrvBase) 2994 3002 { 2995 3003 uint16_t u16DeviceHandle = lsilogicGetHandle(pThis); … … 3001 3009 lsilogicSASAddressGenerate(&SASAddress, i); 3002 3010 3003 p Pages->SASIOUnitPage0.u.fields.aPHY[i].u8NegotiatedLinkRate = LSILOGICSCSI_SASIOUNIT0_NEGOTIATED_RATE_SET(LSILOGICSCSI_SASIOUNIT0_NEGOTIATED_RATE_30GB);3004 p Pages->SASIOUnitPage0.u.fields.aPHY[i].u32ControllerPhyDeviceInfo = LSILOGICSCSI_SASIOUNIT0_DEVICE_TYPE_SET(LSILOGICSCSI_SASIOUNIT0_DEVICE_TYPE_END)3005 3006 p Pages->SASIOUnitPage0.u.fields.aPHY[i].u16AttachedDevHandle = u16DeviceHandle;3007 p Pages->SASIOUnitPage1.u.fields.aPHY[i].u32ControllerPhyDeviceInfo = LSILOGICSCSI_SASIOUNIT0_DEVICE_TYPE_SET(LSILOGICSCSI_SASIOUNIT0_DEVICE_TYPE_END)3008 3009 p Pages->SASIOUnitPage0.u.fields.aPHY[i].u16ControllerDevHandle = u16DeviceHandle;3010 3011 pP ages->aPHY[i].SASPHYPage0.u.fields.u32AttachedDeviceInfo= LSILOGICSCSI_SASPHY0_DEV_INFO_DEVICE_TYPE_SET(LSILOGICSCSI_SASPHY0_DEV_INFO_DEVICE_TYPE_END);3012 pP ages->aPHY[i].SASPHYPage0.u.fields.SASAddress= SASAddress;3013 pP ages->aPHY[i].SASPHYPage0.u.fields.u16OwnerDevHandle= u16DeviceHandle;3014 pP ages->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; 3015 3023 3016 3024 /* SAS device page 0. */ … … 3090 3098 3091 3099 /* 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); 3096 3103 strncpy((char *)pPages->ManufacturingPage0.u.fields.abChipName, "VBox MPT Fusion", 16); 3097 3104 strncpy((char *)pPages->ManufacturingPage0.u.fields.abChipRevision, "1.0", 8); … … 3101 3108 3102 3109 /* 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); 3107 3113 3108 3114 /* 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); 3113 3118 3114 3119 if (pLsiLogic->enmCtrlType == LSILOGICCTRLTYPE_SCSI_SPI) … … 3124 3129 3125 3130 /* 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); 3130 3134 3131 3135 if (pLsiLogic->enmCtrlType == LSILOGICCTRLTYPE_SCSI_SPI) … … 3141 3145 3142 3146 /* 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); 3147 3150 3148 3151 /* 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); 3153 3155 3154 3156 /* 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); 3159 3160 3160 3161 /* 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); 3165 3165 3166 3166 /* 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); 3171 3170 3172 3171 /* 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); 3177 3175 3178 3176 /* 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); 3183 3180 3184 3181 /* 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); 3189 3185 pPages->IOUnitPage0.u.fields.u64UniqueIdentifier = 0xcafe; 3190 3186 3191 3187 /* 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); 3196 3191 pPages->IOUnitPage1.u.fields.fSingleFunction = true; 3197 3192 pPages->IOUnitPage1.u.fields.fAllPathsMapped = false; … … 3200 3195 3201 3196 /* 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); 3206 3200 pPages->IOUnitPage2.u.fields.fPauseOnError = false; 3207 3201 pPages->IOUnitPage2.u.fields.fVerboseModeEnabled = false; … … 3215 3209 3216 3210 /* 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); 3221 3214 pPages->IOUnitPage3.u.fields.u8GPIOCount = 0; 3222 3215 3223 3216 /* 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); 3228 3220 3229 3221 /* 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); 3234 3225 pPages->IOCPage0.u.fields.u32TotalNVStore = 0; 3235 3226 pPages->IOCPage0.u.fields.u32FreeNVStore = 0; … … 3255 3246 3256 3247 /* 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); 3261 3251 pPages->IOCPage1.u.fields.fReplyCoalescingEnabled = false; 3262 3252 pPages->IOCPage1.u.fields.u32CoalescingTimeout = 0; … … 3264 3254 3265 3255 /* 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); 3270 3259 /* Everything else here is 0. */ 3271 3260 3272 3261 /* 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); 3277 3265 /* Everything else here is 0. */ 3278 3266 3279 3267 /* 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); 3284 3271 /* Everything else here is 0. */ 3285 3272 3286 3273 /* 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); 3291 3277 /* Everything else here is 0. */ 3292 3278 3293 3279 /* 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); 3298 3283 3299 3284 /* 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); 3304 3288 3305 3289 /* 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); 3310 3293 3311 3294 if (pLsiLogic->enmCtrlType == LSILOGICCTRLTYPE_SCSI_SPI) … … 3501 3484 pTaskState->PDMScsiRequest.pvUser = pTaskState; 3502 3485 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); 3533 3518 3534 3519 return rc; … … 3709 3694 3710 3695 SSMR3PutU32(pSSM, pThis->enmCtrlType); 3696 SSMR3PutU32(pSSM, pThis->cDeviceStates); 3697 SSMR3PutU32(pSSM, pThis->cPorts); 3711 3698 3712 3699 /* 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); 3715 3702 3716 3703 return VINF_SSM_DONT_CALL_AGAIN; … … 3720 3707 { 3721 3708 PLSILOGICSCSI pLsiLogic = PDMINS_2_DATA(pDevIns, PLSILOGICSCSI); 3722 3723 SSMR3PutU32 (pSSM, pLsiLogic->enmCtrlType);3724 3709 3725 3710 /* Every device first. */ 3726 3711 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]; 3730 3715 3731 3716 AssertMsg(!pDevice->cOutstandingRequests, … … 3823 3808 PMptConfigurationPagesSas pSasPages = &pPages->u.SasPages; 3824 3809 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 3827 3816 SSMR3PutMem(pSSM, &pSasPages->SASIOUnitPage2, sizeof(MptConfigurationPageSASIOUnit2)); 3828 3817 SSMR3PutMem(pSSM, &pSasPages->SASIOUnitPage3, sizeof(MptConfigurationPageSASIOUnit3)); 3829 3818 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)); 3834 3824 } 3835 3825 … … 3882 3872 { 3883 3873 LSILOGICCTRLTYPE enmCtrlType; 3874 uint32_t cDeviceStates, cPorts; 3884 3875 3885 3876 rc = SSMR3GetU32(pSSM, (uint32_t *)&enmCtrlType); 3886 3877 AssertRCReturn(rc, rc); 3878 rc = SSMR3GetU32(pSSM, &cDeviceStates); 3879 AssertRCReturn(rc, rc); 3880 rc = SSMR3GetU32(pSSM, &cPorts); 3881 AssertRCReturn(rc, rc); 3887 3882 3888 3883 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"), 3890 3885 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); 3891 3892 } 3892 3893 if (uVersion > LSILOGIC_SAVED_STATE_VERSION_VBOX_30) 3893 3894 { 3894 for (unsigned i = 0; i < RT_ELEMENTS(pLsiLogic->aDeviceStates); i++)3895 for (unsigned i = 0; i < pLsiLogic->cDeviceStates; i++) 3895 3896 { 3896 3897 bool fPresent; 3897 3898 rc = SSMR3GetBool(pSSM, &fPresent); 3898 3899 AssertRCReturn(rc, rc); 3899 if (fPresent != (pLsiLogic-> aDeviceStates[i].pDrvBase != NULL))3900 if (fPresent != (pLsiLogic->paDeviceStates[i].pDrvBase != NULL)) 3900 3901 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); 3902 3903 } 3903 3904 } … … 3906 3907 3907 3908 /* 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]; 3911 3912 3912 3913 AssertMsg(!pDevice->cOutstandingRequests, … … 4045 4046 else if (pLsiLogic->enmCtrlType == LSILOGICCTRLTYPE_SCSI_SAS) 4046 4047 { 4048 uint32_t cbPage0, cbPage1, cPHYs; 4047 4049 PMptConfigurationPagesSas pSasPages = &pPages->u.SasPages; 4048 4050 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 4051 4064 SSMR3GetMem(pSSM, &pSasPages->SASIOUnitPage2, sizeof(MptConfigurationPageSASIOUnit2)); 4052 4065 SSMR3GetMem(pSSM, &pSasPages->SASIOUnitPage3, sizeof(MptConfigurationPageSASIOUnit3)); 4053 4066 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++) 4055 4073 { 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)); 4058 4076 } 4059 4077 … … 4165 4183 { 4166 4184 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; 4170 4188 Assert((*ppLed)->u32Magic == PDMLED_MAGIC); 4171 4189 return VINF_SUCCESS; … … 4209 4227 { 4210 4228 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; 4212 4233 4213 4234 AssertMsg(fFlags & PDM_TACH_FLAGS_NOT_HOT_PLUG, … … 4236 4257 { 4237 4258 PLSILOGICSCSI pThis = PDMINS_2_DATA(pDevIns, PLSILOGICSCSI); 4238 PLSILOGICDEVICE pDevice = &pThis-> aDeviceStates[iLUN];4259 PLSILOGICDEVICE pDevice = &pThis->paDeviceStates[iLUN]; 4239 4260 int rc; 4261 4262 if (iLUN >= pThis->cDeviceStates) 4263 return VERR_PDM_LUN_NOT_FOUND; 4240 4264 4241 4265 AssertMsgReturn(fFlags & PDM_TACH_FLAGS_NOT_HOT_PLUG, … … 4310 4334 PDMR3CritSectDelete(&pThis->ReplyFreeQueueCritSect); 4311 4335 PDMR3CritSectDelete(&pThis->ReplyPostQueueCritSect); 4336 4337 if (pThis->paDeviceStates) 4338 RTMemFree(pThis->paDeviceStates); 4312 4339 4313 4340 /* Destroy task cache. */ … … 4337 4364 "ReplyQueueDepth\0" 4338 4365 "RequestQueueDepth\0" 4339 "ControllerType\0"); 4366 "ControllerType\0" 4367 "NumPorts\0"); 4340 4368 if (RT_FAILURE(rc)) 4341 4369 return PDMDEV_SET_ERROR(pDevIns, VERR_PDM_DEVINS_UNKNOWN_CFG_VALUES, … … 4383 4411 N_("LsiLogic configuration error: failed to determine controller type from string")); 4384 4412 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 4385 4428 /* Init static parts. */ 4386 4429 PCIDevSetVendorId(&pThis->PciDev, LSILOGICSCSI_PCI_VENDOR_ID); /* LsiLogic */ … … 4488 4531 N_("Cannot create task cache")); 4489 4532 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]; 4493 4552 4494 4553 /* 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; 4500 4557 pDevice->IBase.pfnQueryInterface = lsilogicDeviceQueryInterface; 4501 4558 pDevice->ISCSIPort.pfnSCSIRequestCompleted = lsilogicDeviceSCSIRequestCompleted; 4502 4559 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 else4512 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];4519 4560 4520 4561 RTStrPrintf(szName, sizeof(szName), "Device%d", i); -
trunk/src/VBox/Devices/Storage/DevLsiLogicSCSI.h
r25587 r25675 59 59 #define LSILOGICSCSI_PCI_SAS_SUBSYSTEM_VENDOR_ID (0x1000) 60 60 #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 63 64 #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_MAX67 65 68 66 /** … … 1152 1150 typedef struct MptConfigurationPageManufacturing1 1153 1151 { 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; 1158 1166 } MptConfigurationPageManufacturing1, *PMptConfigurationPageManufacturing1; 1159 1167 #pragma pack() … … 2437 2445 2438 2446 /** 2447 * PHY entry for the SAS I/O unit page 0 2448 */ 2449 #pragma pack(1) 2450 typedef 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() 2470 AssertCompileSize(MptConfigurationPageSASIOUnit0PHY, 16); 2471 2472 /** 2439 2473 * SAS I/O Unit page 0 - Readonly 2440 2474 */ … … 2460 2494 /** Reserved */ 2461 2495 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]; 2482 2498 } fields; 2483 2499 } u; 2484 2500 } MptConfigurationPageSASIOUnit0, *PMptConfigurationPageSASIOUnit0; 2485 2501 #pragma pack() 2486 AssertCompileSize(MptConfigurationPageSASIOUnit0, 8+2+2+1+3+(LSILOGICSCSI_PCI_SAS_PORTS_MAX*16)); 2502 AssertCompileSize(MptConfigurationPageSASIOUnit0, 8+2+2+1+3+sizeof(MptConfigurationPageSASIOUnit0PHY)); 2503 2504 #define LSILOGICSCSI_SASIOUNIT0_GET_SIZE(ports) (sizeof(MptConfigurationPageSASIOUnit0) + ((ports) - 1) * sizeof(MptConfigurationPageSASIOUnit0PHY)) 2487 2505 2488 2506 #define LSILOGICSCSI_SASIOUNIT0_PORT_CONFIGURATION_AUTO RT_BIT(0) … … 2536 2554 #define LSILOGICSCSI_SASIOUNIT0_DISCOVERY_STATUS_MAX_SATA_TGTS RT_BIT(12) 2537 2555 #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) 2561 typedef 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() 2579 AssertCompileSize(MptConfigurationPageSASIOUnit1PHY, 12); 2538 2580 2539 2581 /** … … 2569 2611 /** I/O device missing delay */ 2570 2612 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]; 2589 2615 } fields; 2590 2616 } u; 2591 2617 } MptConfigurationPageSASIOUnit1, *PMptConfigurationPageSASIOUnit1; 2592 2618 #pragma pack() 2593 AssertCompileSize(MptConfigurationPageSASIOUnit1, 8+12+(LSILOGICSCSI_PCI_SAS_PORTS_MAX*12)); 2619 AssertCompileSize(MptConfigurationPageSASIOUnit1, 8+12+sizeof(MptConfigurationPageSASIOUnit1PHY)); 2620 2621 #define LSILOGICSCSI_SASIOUNIT1_GET_SIZE(ports) (sizeof(MptConfigurationPageSASIOUnit1) + ((ports) - 1) * sizeof(MptConfigurationPageSASIOUnit1PHY)) 2594 2622 2595 2623 #define LSILOGICSCSI_SASIOUNIT1_CONTROL_CLEAR_SATA_AFFILIATION RT_BIT(0) … … 3148 3176 } MptConfigurationPagesSpi, *PMptConfigurationPagesSpi; 3149 3177 3178 typedef struct MptPHY 3179 { 3180 MptConfigurationPageSASPHY0 SASPHYPage0; 3181 MptConfigurationPageSASPHY1 SASPHYPage1; 3182 } MptPHY, *PMptPHY; 3183 3150 3184 #pragma pack(1) 3151 3185 typedef struct MptConfigurationPagesSas 3152 3186 { 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 */ 3155 3196 MptConfigurationPageSASIOUnit2 SASIOUnitPage2; 3197 /** I/O unit page 3 */ 3156 3198 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; 3162 3204 3163 3205 /** Number of devices detected. */ … … 3212 3254 3213 3255 /** 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 /** 3214 3285 * Possible SG element types. 3215 3286 */ -
trunk/src/VBox/Devices/testcase/tstDeviceStructSizeGC.cpp
r25587 r25675 1454 1454 1455 1455 #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 1469 1456 GEN_CHECK_SIZE(LSILOGICSCSI); 1470 1457 GEN_CHECK_OFF(LSILOGICSCSI, PciDev); … … 1483 1470 GEN_CHECK_OFF(LSILOGICSCSI, pNotificationQueueR0); 1484 1471 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); 1487 1474 GEN_CHECK_OFF(LSILOGICSCSI, GCPhysMMIOBase); 1488 1475 GEN_CHECK_OFF(LSILOGICSCSI, IOPortBase);
Note:
See TracChangeset
for help on using the changeset viewer.