Index: /trunk/include/VBox/scsi.h
===================================================================
--- /trunk/include/VBox/scsi.h	(revision 65077)
+++ /trunk/include/VBox/scsi.h	(revision 65078)
@@ -29,4 +29,8 @@
 #include <iprt/assert.h>
 
+/**
+ * @todo: Remove when the splitting code was removed from DevATA.
+ *        The limit doesn't belong here but is specific for each host platform.
+ */
 #ifdef RT_OS_FREEBSD
 /* The cam subsystem doesn't allow more */
Index: /trunk/src/VBox/Devices/Storage/DrvHostBase-darwin.cpp
===================================================================
--- /trunk/src/VBox/Devices/Storage/DrvHostBase-darwin.cpp	(revision 65077)
+++ /trunk/src/VBox/Devices/Storage/DrvHostBase-darwin.cpp	(revision 65078)
@@ -26,4 +26,7 @@
 #include <mach/mach_error.h>
 #include <VBox/scsi.h>
+
+/** Maximum buffer size we support, check whether darwin has some real upper limit. */
+#define DARWIN_SCSI_MAX_BUFFER_SIZE (100 * _1K)
 
 /**
@@ -322,4 +325,12 @@
 
 
+DECLHIDDEN(size_t) drvHostBaseScsiCmdGetBufLimitOs(PDRVHOSTBASE pThis)
+{
+    RT_NOREF(pThis);
+
+    return DARWIN_SCSI_MAX_BUFFER_SIZE;
+}
+
+
 DECLHIDDEN(int) drvHostBaseGetMediaSizeOs(PDRVHOSTBASE pThis, uint64_t *pcb)
 {
Index: /trunk/src/VBox/Devices/Storage/DrvHostBase-freebsd.cpp
===================================================================
--- /trunk/src/VBox/Devices/Storage/DrvHostBase-freebsd.cpp	(revision 65077)
+++ /trunk/src/VBox/Devices/Storage/DrvHostBase-freebsd.cpp	(revision 65078)
@@ -27,4 +27,7 @@
 #include <iprt/log.h>
 
+/** Maximum buffer size supported by the CAM subsystem. */
+#define FBSD_SCSI_MAX_BUFFER_SIZE (64 * _1K)
+
 /**
  * Host backend specific data.
@@ -149,4 +152,12 @@
 
 
+DECLHIDDEN(size_t) drvHostBaseScsiCmdGetBufLimitOs(PDRVHOSTBASE pThis)
+{
+    RT_NOREF(pThis);
+
+    return FBSD_SCSI_MAX_BUFFER_SIZE;
+}
+
+
 DECLHIDDEN(int) drvHostBaseGetMediaSizeOs(PDRVHOSTBASE pThis, uint64_t *pcb)
 {
@@ -194,6 +205,6 @@
             const uint32_t  LBA       = off / pThis->Os.cbBlock;
             AssertReturn(!(off % pThis->Os.cbBlock), VERR_INVALID_PARAMETER);
-            uint32_t        cbRead32  =   cbRead > SCSI_MAX_BUFFER_SIZE
-                                        ? SCSI_MAX_BUFFER_SIZE
+            uint32_t        cbRead32  =   cbRead > FBSD_SCSI_MAX_BUFFER_SIZE
+                                        ? FBSD_SCSI_MAX_BUFFER_SIZE
                                         : (uint32_t)cbRead;
             const uint32_t  cBlocks   = cbRead32 / pThis->Os.cbBlock;
Index: /trunk/src/VBox/Devices/Storage/DrvHostBase-linux.cpp
===================================================================
--- /trunk/src/VBox/Devices/Storage/DrvHostBase-linux.cpp	(revision 65077)
+++ /trunk/src/VBox/Devices/Storage/DrvHostBase-linux.cpp	(revision 65078)
@@ -39,4 +39,7 @@
 #include <VBox/scsi.h>
 
+/** Maximum buffer size supported by the kernel interface. */
+#define LNX_SCSI_MAX_BUFFER_SIZE (100 * _1K)
+
 /**
  * Host backend specific data.
@@ -75,5 +78,5 @@
     if(RT_UNLIKELY(!pThis->Os.pbDoubleBuffer))
     {
-        pThis->Os.pbDoubleBuffer = (uint8_t *)RTMemAlloc(SCSI_MAX_BUFFER_SIZE);
+        pThis->Os.pbDoubleBuffer = (uint8_t *)RTMemAlloc(LNX_SCSI_MAX_BUFFER_SIZE);
         if (!pThis->Os.pbDoubleBuffer)
             return VERR_NO_MEMORY;
@@ -92,5 +95,5 @@
         case PDMMEDIATXDIR_FROM_DEVICE:
             Assert(*pcbBuf != 0);
-            Assert(*pcbBuf <= SCSI_MAX_BUFFER_SIZE);
+            Assert(*pcbBuf <= LNX_SCSI_MAX_BUFFER_SIZE);
             /* Make sure that the buffer is clear for commands reading
              * data. The actually received data may be shorter than what
@@ -105,5 +108,5 @@
         case PDMMEDIATXDIR_TO_DEVICE:
             Assert(*pcbBuf != 0);
-            Assert(*pcbBuf <= SCSI_MAX_BUFFER_SIZE);
+            Assert(*pcbBuf <= LNX_SCSI_MAX_BUFFER_SIZE);
             memcpy(pThis->Os.pbDoubleBuffer, pvBuf, *pcbBuf);
             direction = CGC_DATA_WRITE;
@@ -154,4 +157,13 @@
 }
 
+
+DECLHIDDEN(size_t) drvHostBaseScsiCmdGetBufLimitOs(PDRVHOSTBASE pThis)
+{
+    RT_NOREF(pThis);
+
+    return LNX_SCSI_MAX_BUFFER_SIZE;
+}
+
+
 DECLHIDDEN(int) drvHostBaseGetMediaSizeOs(PDRVHOSTBASE pThis, uint64_t *pcb)
 {
Index: /trunk/src/VBox/Devices/Storage/DrvHostBase-solaris.cpp
===================================================================
--- /trunk/src/VBox/Devices/Storage/DrvHostBase-solaris.cpp	(revision 65077)
+++ /trunk/src/VBox/Devices/Storage/DrvHostBase-solaris.cpp	(revision 65078)
@@ -33,4 +33,7 @@
 
 #include <iprt/file.h>
+
+/** Maximum buffer size we support, check whether darwin has some real upper limit. */
+#define SOL_SCSI_MAX_BUFFER_SIZE (100 * _1K)
 
 /**
@@ -203,4 +206,13 @@
 }
 
+
+DECLHIDDEN(size_t) drvHostBaseScsiCmdGetBufLimitOs(PDRVHOSTBASE pThis)
+{
+    RT_NOREF(pThis);
+
+    return SOL_SCSI_MAX_BUFFER_SIZE;
+}
+
+
 DECLHIDDEN(int) drvHostBaseGetMediaSizeOs(PDRVHOSTBASE pThis, uint64_t *pcb)
 {
Index: /trunk/src/VBox/Devices/Storage/DrvHostBase-win.cpp
===================================================================
--- /trunk/src/VBox/Devices/Storage/DrvHostBase-win.cpp	(revision 65077)
+++ /trunk/src/VBox/Devices/Storage/DrvHostBase-win.cpp	(revision 65078)
@@ -80,4 +80,7 @@
 #include <iprt/file.h>
 #include <VBox/scsi.h>
+
+/** Maximum buffer size we support, check whether darwin has some real upper limit. */
+#define SOL_SCSI_MAX_BUFFER_SIZE (100 * _1K)
 
 /**
@@ -305,4 +308,13 @@
     return rc;
 }
+
+
+DECLHIDDEN(size_t) drvHostBaseScsiCmdGetBufLimitOs(PDRVHOSTBASE pThis)
+{
+    RT_NOREF(pThis);
+
+    return WIN_SCSI_MAX_BUFFER_SIZE;
+}
+
 
 DECLHIDDEN(int) drvHostBaseGetMediaSizeOs(PDRVHOSTBASE pThis, uint64_t *pcb)
Index: /trunk/src/VBox/Devices/Storage/DrvHostBase.h
===================================================================
--- /trunk/src/VBox/Devices/Storage/DrvHostBase.h	(revision 65077)
+++ /trunk/src/VBox/Devices/Storage/DrvHostBase.h	(revision 65078)
@@ -167,4 +167,5 @@
 DECLHIDDEN(int) drvHostBaseScsiCmdOs(PDRVHOSTBASE pThis, const uint8_t *pbCmd, size_t cbCmd, PDMMEDIATXDIR enmTxDir,
                                      void *pvBuf, uint32_t *pcbBuf, uint8_t *pbSense, size_t cbSense, uint32_t cTimeoutMillies);
+DECLHIDDEN(size_t) drvHostBaseScsiCmdGetBufLimitOs(PDRVHOSTBASE pThis);
 DECLHIDDEN(int) drvHostBaseGetMediaSizeOs(PDRVHOSTBASE pThis, uint64_t *pcb);
 DECLHIDDEN(int) drvHostBaseReadOs(PDRVHOSTBASE pThis, uint64_t off, void *pvBuf, size_t cbRead);
Index: /trunk/src/VBox/Devices/Storage/DrvHostDVD.cpp
===================================================================
--- /trunk/src/VBox/Devices/Storage/DrvHostDVD.cpp	(revision 65077)
+++ /trunk/src/VBox/Devices/Storage/DrvHostDVD.cpp	(revision 65078)
@@ -555,4 +555,5 @@
     size_t cbXfer = 0;
     size_t cbSector = 0;
+    size_t cbScsiCmdBufLimit = drvHostBaseScsiCmdGetBufLimitOs(&pThis->Core);
     bool fPassthrough = drvHostDvdParseCdb(pThis, pReq, pbCdb, cbCdb, cbBuf,
                                            &enmXferDir, &cbXfer, &cbSector, pu8ScsiSts);
@@ -568,5 +569,5 @@
             rc = drvHostBaseBufferRetain(&pThis->Core, pReq, cbXfer, enmXferDir == PDMMEDIATXDIR_TO_DEVICE, &pvBuf);
 
-        if (cbXfer > SCSI_MAX_BUFFER_SIZE)
+        if (cbXfer > cbScsiCmdBufLimit)
         {
             /* Linux accepts commands with up to 100KB of data, but expects
@@ -610,6 +611,6 @@
             for (uint32_t i = cSectors; i > 0; i -= cReqSectors)
             {
-                if (i * cbSector > SCSI_MAX_BUFFER_SIZE)
-                    cReqSectors = SCSI_MAX_BUFFER_SIZE / (uint32_t)cbSector;
+                if (i * cbSector > cbScsiCmdBufLimit)
+                    cReqSectors = cbScsiCmdBufLimit / (uint32_t)cbSector;
                 else
                     cReqSectors = i;
