Index: /trunk/src/VBox/Devices/Storage/DevLsiLogicSCSI.cpp
===================================================================
--- /trunk/src/VBox/Devices/Storage/DevLsiLogicSCSI.cpp	(revision 25696)
+++ /trunk/src/VBox/Devices/Storage/DevLsiLogicSCSI.cpp	(revision 25697)
@@ -515,5 +515,6 @@
         if (pThis->enmCtrlType == LSILOGICCTRLTYPE_SCSI_SAS)
         {
-            PMptSASDevice pSASDeviceCurr = pThis->pConfigurationPages->u.SasPages.pSASDeviceHead;
+            PMptConfigurationPagesSas pSasPages = &pThis->pConfigurationPages->u.SasPages;
+            PMptSASDevice pSASDeviceCurr = pSasPages->pSASDeviceHead;
 
             while (pSASDeviceCurr)
@@ -524,4 +525,12 @@
                 RTMemFree(pFree);
             }
+            if (pSasPages->paPHYs)
+                RTMemFree(pSasPages->paPHYs);
+            if (pSasPages->pManufacturingPage7)
+                RTMemFree(pSasPages->pManufacturingPage7);
+            if (pSasPages->pSASIOUnitPage0)
+                RTMemFree(pSasPages->pSASIOUnitPage0);
+            if (pSasPages->pSASIOUnitPage1)
+                RTMemFree(pSasPages->pSASIOUnitPage1);
         }
 
@@ -2174,7 +2183,12 @@
             break;
         case 7:
-            *ppPageHeader = &pPages->ManufacturingPage7.u.fields.Header;
-            *ppbPageData  =  pPages->ManufacturingPage7.u.abPageData;
-            *pcbPage      = sizeof(pPages->ManufacturingPage7);
+            if (pLsiLogic->enmCtrlType == LSILOGICCTRLTYPE_SCSI_SAS)
+            {
+                *ppPageHeader = &pPages->u.SasPages.pManufacturingPage7->u.fields.Header;
+                *ppbPageData  =  pPages->u.SasPages.pManufacturingPage7->u.abPageData;
+                *pcbPage      = pPages->u.SasPages.cbManufacturingPage7;
+            }
+            else
+                rc = VERR_NOT_FOUND;
             break;
         case 8:
@@ -2923,4 +2937,19 @@
     LogFlowFunc(("pThis=%#p\n", pThis));
 
+    /* Manufacturing Page 7 - Connector settings. */
+    pPages->cbManufacturingPage7 = LSILOGICSCSI_MANUFACTURING7_GET_SIZE(pThis->cPorts);
+    PMptConfigurationPageManufacturing7 pManufacturingPage7 = (PMptConfigurationPageManufacturing7)RTMemAllocZ(pPages->cbManufacturingPage7);
+    AssertPtr(pManufacturingPage7);
+    MPT_CONFIG_PAGE_HEADER_INIT_MANUFACTURING(pManufacturingPage7,
+                                              0, 7,
+                                              MPT_CONFIGURATION_PAGE_ATTRIBUTE_PERSISTENT_READONLY);
+    /* Set size manually. */
+    if (pPages->cbManufacturingPage7 / 4 > 255)
+        pManufacturingPage7->u.fields.Header.u8PageLength = 255;
+    else
+        pManufacturingPage7->u.fields.Header.u8PageLength = pPages->cbManufacturingPage7 / 4;
+    pManufacturingPage7->u.fields.u8NumPhys = pThis->cPorts;
+    pPages->pManufacturingPage7 = pManufacturingPage7;
+
     /* SAS I/O unit page 0 - Port specific informations. */
     pPages->cbSASIOUnitPage0 = LSILOGICSCSI_SASIOUNIT0_GET_SIZE(pThis->cPorts);
@@ -2970,4 +2999,6 @@
         PMptPHY pPHYPages = &pPages->paPHYs[i];
         uint16_t u16ControllerHandle = lsilogicGetHandle(pThis);
+
+        pManufacturingPage7->u.fields.aPHY[i].u8Location = LSILOGICSCSI_MANUFACTURING7_LOCATION_AUTO;
 
         pSASPage0->u.fields.aPHY[i].u8Port      = i;
@@ -3167,9 +3198,4 @@
                                               MptConfigurationPageManufacturing6, 6,
                                               MPT_CONFIGURATION_PAGE_ATTRIBUTE_CHANGEABLE);
-
-    /* Manufacturing Page 7 - Connector settings. */
-    MPT_CONFIG_PAGE_HEADER_INIT_MANUFACTURING(&pPages->ManufacturingPage7,
-                                              MptConfigurationPageManufacturing7, 7,
-                                              MPT_CONFIGURATION_PAGE_ATTRIBUTE_PERSISTENT_READONLY);
 
     /* Manufacturing Page 8 -  Product sepcific settings. */
@@ -3777,5 +3803,4 @@
     SSMR3PutMem   (pSSM, &pPages->ManufacturingPage5, sizeof(MptConfigurationPageManufacturing5));
     SSMR3PutMem   (pSSM, &pPages->ManufacturingPage6, sizeof(MptConfigurationPageManufacturing6));
-    SSMR3PutMem   (pSSM, &pPages->ManufacturingPage7, sizeof(MptConfigurationPageManufacturing7));
     SSMR3PutMem   (pSSM, &pPages->ManufacturingPage8, sizeof(MptConfigurationPageManufacturing8));
     SSMR3PutMem   (pSSM, &pPages->ManufacturingPage9, sizeof(MptConfigurationPageManufacturing9));
@@ -3817,7 +3842,9 @@
         PMptConfigurationPagesSas pSasPages = &pPages->u.SasPages;
 
+        SSMR3PutU32(pSSM, pSasPages->cbManufacturingPage7);
         SSMR3PutU32(pSSM, pSasPages->cbSASIOUnitPage0);
         SSMR3PutU32(pSSM, pSasPages->cbSASIOUnitPage1);
 
+        SSMR3PutMem(pSSM, pSasPages->pManufacturingPage7, pSasPages->cbManufacturingPage7);
         SSMR3PutMem(pSSM, pSasPages->pSASIOUnitPage0, pSasPages->cbSASIOUnitPage0);
         SSMR3PutMem(pSSM, pSasPages->pSASIOUnitPage1, pSasPages->cbSASIOUnitPage1);
@@ -4017,5 +4044,4 @@
         SSMR3GetMem(pSSM, &pPages->ManufacturingPage5, sizeof(MptConfigurationPageManufacturing5));
         SSMR3GetMem(pSSM, &pPages->ManufacturingPage6, sizeof(MptConfigurationPageManufacturing6));
-        SSMR3GetMem(pSSM, &pPages->ManufacturingPage7, sizeof(MptConfigurationPageManufacturing7));
         SSMR3GetMem(pSSM, &pPages->ManufacturingPage8, sizeof(MptConfigurationPageManufacturing8));
         SSMR3GetMem(pSSM, &pPages->ManufacturingPage9, sizeof(MptConfigurationPageManufacturing9));
@@ -4055,17 +4081,21 @@
         else if (pLsiLogic->enmCtrlType == LSILOGICCTRLTYPE_SCSI_SAS)
         {
-            uint32_t cbPage0, cbPage1, cPHYs;
+            uint32_t cbPage0, cbPage1, cPHYs, cbManufacturingPage7;
             PMptConfigurationPagesSas pSasPages = &pPages->u.SasPages;
 
+            SSMR3GetU32(pSSM, &cbManufacturingPage7);
             SSMR3GetU32(pSSM, &cbPage0);
             SSMR3GetU32(pSSM, &cbPage1);
 
             if (   (cbPage0 != pSasPages->cbSASIOUnitPage0)
-                || (cbPage1 != pSasPages->cbSASIOUnitPage1))
+                || (cbPage1 != pSasPages->cbSASIOUnitPage1)
+                || (cbManufacturingPage7 != pSasPages->cbManufacturingPage7))
                 return VERR_SSM_LOAD_CONFIG_MISMATCH;
 
+            AssertPtr(pSasPages->pManufacturingPage7);
             AssertPtr(pSasPages->pSASIOUnitPage0);
             AssertPtr(pSasPages->pSASIOUnitPage1);
 
+            SSMR3GetMem(pSSM, pSasPages->pManufacturingPage7, pSasPages->cbManufacturingPage7);
             SSMR3GetMem(pSSM, pSasPages->pSASIOUnitPage0, pSasPages->cbSASIOUnitPage0);
             SSMR3GetMem(pSSM, pSasPages->pSASIOUnitPage1, pSasPages->cbSASIOUnitPage1);
Index: /trunk/src/VBox/Devices/Storage/DevLsiLogicSCSI.h
===================================================================
--- /trunk/src/VBox/Devices/Storage/DevLsiLogicSCSI.h	(revision 25696)
+++ /trunk/src/VBox/Devices/Storage/DevLsiLogicSCSI.h	(revision 25697)
@@ -1328,4 +1328,24 @@
 
 /**
+ * Manufacutring page 7 - PHY element.
+ */
+#pragma pack(1)
+typedef struct MptConfigurationPageManufacturing7PHY
+{
+    /** Pinout */
+    uint32_t                  u32Pinout;
+    /** Connector name */
+    uint8_t                   szConnector[16];
+    /** Location */
+    uint8_t                   u8Location;
+    /** reserved */
+    uint8_t                   u8Reserved;
+    /** Slot */
+    uint16_t                  u16Slot;
+} MptConfigurationPageManufacturing7PHY, *PMptConfigurationPageManufacturing7PHY;
+#pragma pack()
+AssertCompileSize(MptConfigurationPageManufacturing7PHY, 24);
+
+/**
  * Manufacturing page 7 - Readonly.
  */
@@ -1337,5 +1357,5 @@
     {
         /** Byte view. */
-        uint8_t                           abPageData[228];
+        uint8_t                           abPageData[1];
         /** Field view. */
         struct
@@ -1353,23 +1373,13 @@
             /** Reserved */
             uint8_t                       au8Reserved[3];
-            /** PHY list for the SAS controller */
-            struct
-            {
-                /** Pinout */
-                uint32_t                  u32Pinout;
-                /** Connector name */
-                uint8_t                   szConnector[16];
-                /** Location */
-                uint8_t                   u8Location;
-                /** reserved */
-                uint8_t                   u8Reserved;
-                /** Slot */
-                uint16_t                  u16Slot;
-            } aPHYs[LSILOGICSCSI_PCI_SAS_PORTS_MAX];
+            /** PHY list for the SAS controller - variable depending on the number of ports */
+            MptConfigurationPageManufacturing7PHY aPHY[1];
         } fields;
     } u;
 } MptConfigurationPageManufacturing7, *PMptConfigurationPageManufacturing7;
 #pragma pack()
-AssertCompileSize(MptConfigurationPageManufacturing7, 36+(LSILOGICSCSI_PCI_SAS_PORTS_MAX * 24));
+AssertCompileSize(MptConfigurationPageManufacturing7, 36+sizeof(MptConfigurationPageManufacturing7PHY));
+
+#define LSILOGICSCSI_MANUFACTURING7_GET_SIZE(ports) (sizeof(MptConfigurationPageManufacturing7) + ((ports) - 1) * sizeof(MptConfigurationPageManufacturing7PHY))
 
 /** Flags for the flags field */
@@ -3185,4 +3195,8 @@
 typedef struct MptConfigurationPagesSas
 {
+    /** Size of the manufacturing page 7 */
+    uint32_t                            cbManufacturingPage7;
+    /** Pointer to the manufacturing page 7 */
+    PMptConfigurationPageManufacturing7 pManufacturingPage7;
     /** Size of the I/O unit page 0 */
     uint32_t                            cbSASIOUnitPage0;
@@ -3224,5 +3238,4 @@
     MptConfigurationPageManufacturing5  ManufacturingPage5;
     MptConfigurationPageManufacturing6  ManufacturingPage6;
-    MptConfigurationPageManufacturing7  ManufacturingPage7;
     MptConfigurationPageManufacturing8  ManufacturingPage8;
     MptConfigurationPageManufacturing9  ManufacturingPage9;
