Index: /trunk/src/VBox/Devices/Storage/UsbMsd.cpp
===================================================================
--- /trunk/src/VBox/Devices/Storage/UsbMsd.cpp	(revision 43814)
+++ /trunk/src/VBox/Devices/Storage/UsbMsd.cpp	(revision 43815)
@@ -40,4 +40,5 @@
 #define USBMSD_STR_ID_MANUFACTURER  1
 #define USBMSD_STR_ID_PRODUCT_HD    2
+#define USBMSD_STR_ID_PRODUCT_CDROM 3
 /** @} */
 
@@ -265,4 +266,5 @@
     { USBMSD_STR_ID_MANUFACTURER,   "VirtualBox"   },
     { USBMSD_STR_ID_PRODUCT_HD,     "USB Harddisk" },
+    { USBMSD_STR_ID_PRODUCT_CDROM,  "USB CD-ROM"   }
 };
 
@@ -272,5 +274,5 @@
 };
 
-static const VUSBDESCENDPOINTEX g_aUsbMsdEndpointDescs[2] =
+static const VUSBDESCENDPOINTEX g_aUsbMsdEndpointDescsFS[2] =
 {
     {
@@ -280,6 +282,6 @@
             /* .bEndpointAddress = */   0x81 /* ep=1, in */,
             /* .bmAttributes = */       2 /* bulk */,
-            /* .wMaxPacketSize = */     64,//512 /* or 64? */,  <-- depends on device speed!
-            /* .bInterval = */          0,
+            /* .wMaxPacketSize = */     64 /* maximum possible */,
+            /* .bInterval = */          0 /* not applicable for bulk EP */
         },
         /* .pvMore = */     NULL,
@@ -293,6 +295,6 @@
             /* .bEndpointAddress = */   0x02 /* ep=2, out */,
             /* .bmAttributes = */       2 /* bulk */,
-            /* .wMaxPacketSize = */     64,//512 /* or 64? */,  <-- depends on device speed!
-            /* .bInterval = */          0,
+            /* .wMaxPacketSize = */     64 /* maximum possible */,
+            /* .bInterval = */          0 /* not applicable for bulk EP */
         },
         /* .pvMore = */     NULL,
@@ -302,5 +304,35 @@
 };
 
-static const VUSBDESCINTERFACEEX g_UsbMsdInterfaceDesc =
+static const VUSBDESCENDPOINTEX g_aUsbMsdEndpointDescsHS[2] =
+{
+    {
+        {
+            /* .bLength = */            sizeof(VUSBDESCENDPOINT),
+            /* .bDescriptorType = */    VUSB_DT_ENDPOINT,
+            /* .bEndpointAddress = */   0x81 /* ep=1, in */,
+            /* .bmAttributes = */       2 /* bulk */,
+            /* .wMaxPacketSize = */     512 /* HS bulk packet size */,
+            /* .bInterval = */          0 /* no NAKs */
+        },
+        /* .pvMore = */     NULL,
+        /* .pvClass = */    NULL,
+        /* .cbClass = */    0
+    },
+    {
+        {
+            /* .bLength = */            sizeof(VUSBDESCENDPOINT),
+            /* .bDescriptorType = */    VUSB_DT_ENDPOINT,
+            /* .bEndpointAddress = */   0x02 /* ep=2, out */,
+            /* .bmAttributes = */       2 /* bulk */,
+            /* .wMaxPacketSize = */     512 /* HS bulk packet size */,
+            /* .bInterval = */          0 /* no NAKs */
+        },
+        /* .pvMore = */     NULL,
+        /* .pvClass = */    NULL,
+        /* .cbClass = */    0
+    }
+};
+
+static const VUSBDESCINTERFACEEX g_UsbMsdInterfaceDescFS =
 {
     {
@@ -318,13 +350,37 @@
     /* .pvClass = */    NULL,
     /* .cbClass = */    0,
-    &g_aUsbMsdEndpointDescs[0]
+    &g_aUsbMsdEndpointDescsFS[0]
 };
 
-static const VUSBINTERFACE g_aUsbMsdInterfaces[] =
-{
-    { &g_UsbMsdInterfaceDesc, /* .cSettings = */ 1 },
+static const VUSBDESCINTERFACEEX g_UsbMsdInterfaceDescHS =
+{
+    {
+        /* .bLength = */                sizeof(VUSBDESCINTERFACE),
+        /* .bDescriptorType = */        VUSB_DT_INTERFACE,
+        /* .bInterfaceNumber = */       0,
+        /* .bAlternateSetting = */      0,
+        /* .bNumEndpoints = */          2,
+        /* .bInterfaceClass = */        8 /* Mass Storage */,
+        /* .bInterfaceSubClass = */     6 /* SCSI transparent command set */,
+        /* .bInterfaceProtocol = */     0x50 /* Bulk-Only Transport */,
+        /* .iInterface = */             0
+    },
+    /* .pvMore = */     NULL,
+    /* .pvClass = */    NULL,
+    /* .cbClass = */    0,
+    &g_aUsbMsdEndpointDescsHS[0]
 };
 
-static const VUSBDESCCONFIGEX g_UsbMsdConfigDesc =
+static const VUSBINTERFACE g_aUsbMsdInterfacesFS[] =
+{
+    { &g_UsbMsdInterfaceDescFS, /* .cSettings = */ 1 },
+};
+
+static const VUSBINTERFACE g_aUsbMsdInterfacesHS[] =
+{
+    { &g_UsbMsdInterfaceDescHS, /* .cSettings = */ 1 },
+};
+
+static const VUSBDESCCONFIGEX g_UsbMsdConfigDescFS =
 {
     {
@@ -332,5 +388,5 @@
         /* .bDescriptorType = */    VUSB_DT_CONFIG,
         /* .wTotalLength = */       0 /* recalculated on read */,
-        /* .bNumInterfaces = */     RT_ELEMENTS(g_aUsbMsdInterfaces),
+        /* .bNumInterfaces = */     RT_ELEMENTS(g_aUsbMsdInterfacesFS),
         /* .bConfigurationValue =*/ 1,
         /* .iConfiguration = */     0,
@@ -339,5 +395,22 @@
     },
     NULL,                           /* pvMore */
-    &g_aUsbMsdInterfaces[0],
+    &g_aUsbMsdInterfacesFS[0],
+    NULL                            /* pvOriginal */
+};
+
+static const VUSBDESCCONFIGEX g_UsbMsdConfigDescHS =
+{
+    {
+        /* .bLength = */            sizeof(VUSBDESCCONFIG),
+        /* .bDescriptorType = */    VUSB_DT_CONFIG,
+        /* .wTotalLength = */       0 /* recalculated on read */,
+        /* .bNumInterfaces = */     RT_ELEMENTS(g_aUsbMsdInterfacesHS),
+        /* .bConfigurationValue =*/ 1,
+        /* .iConfiguration = */     0,
+        /* .bmAttributes = */       RT_BIT(7),
+        /* .MaxPower = */           50 /* 100mA */
+    },
+    NULL,                           /* pvMore */
+    &g_aUsbMsdInterfacesHS[0],
     NULL                            /* pvOriginal */
 };
@@ -374,8 +447,18 @@
 };
 
-static const PDMUSBDESCCACHE g_UsbMsdDescCache =
+static const PDMUSBDESCCACHE g_UsbMsdDescCacheFS =
 {
     /* .pDevice = */                &g_UsbMsdDeviceDesc,
-    /* .paConfigs = */              &g_UsbMsdConfigDesc,
+    /* .paConfigs = */              &g_UsbMsdConfigDescFS,
+    /* .paLanguages = */            g_aUsbMsdLanguages,
+    /* .cLanguages = */             RT_ELEMENTS(g_aUsbMsdLanguages),
+    /* .fUseCachedDescriptors = */  true,
+    /* .fUseCachedStringsDescriptors = */ true
+};
+
+static const PDMUSBDESCCACHE g_UsbMsdDescCacheHS =
+{
+    /* .pDevice = */                &g_UsbMsdDeviceDesc,
+    /* .paConfigs = */              &g_UsbMsdConfigDescHS,
     /* .paLanguages = */            g_aUsbMsdLanguages,
     /* .cLanguages = */             RT_ELEMENTS(g_aUsbMsdLanguages),
@@ -1171,4 +1254,5 @@
                 }
             }
+LogRel(("DATA_FROM_HOST: %d bytes\n", cbData));
             return usbMsdCompleteOk(pThis, pUrb, cbData);
         }
@@ -1231,4 +1315,5 @@
                 pReq->enmState = USBMSDREQSTATE_STATUS;
             }
+LogRel(("DATA_TO_HOST: %d bytes\n", cbCopy));
             return usbMsdCompleteOk(pThis, pUrb, cbCopy);
         }
@@ -1517,5 +1602,8 @@
     PUSBMSD pThis = PDMINS_2_DATA(pUsbIns, PUSBMSD);
     LogFlow(("usbMsdUsbGetDescriptorCache/#%u:\n", pUsbIns->iInstance));
-    return &g_UsbMsdDescCache;
+    if (pThis->pUsbIns->iUsbHubVersion & VUSB_STDVER_20)
+        return &g_UsbMsdDescCacheHS;
+    else
+        return &g_UsbMsdDescCacheFS;
 }
 
@@ -1635,5 +1723,5 @@
     "USB Mass Storage Device, one LUN.",
     /* fFlags */
-    0,
+    PDM_USBREG_HIGHSPEED_CAPABLE,
     /* cMaxInstances */
     ~0U,
