diff --git a/hdr/device.h b/hdr/device.h
index b192505..0e81fbf 100644
--- a/hdr/device.h
+++ b/hdr/device.h
@@ -253,6 +253,7 @@ typedef struct ddtstruct {
 /* freedos specific flag bits */
 #define DF_LBA        0x400
 #define DF_WRTVERIFY  0x800
+#define DF_DMA_TRANSPARENT   0x1000 /* DMA boundary errors are handled transparently */
 
 /* typedef struct ddtstruct ddt;*/
 
diff --git a/kernel/dsk.c b/kernel/dsk.c
index 41f32c4..8495a19 100644
--- a/kernel/dsk.c
+++ b/kernel/dsk.c
@@ -1021,8 +1021,13 @@ STATIC int LBA_Transfer(ddt * pddt, UWORD mode, VOID FAR * buffer,
   buffer = adjust_far(buffer);
   for (; totaltodo != 0;)
   {
-    /* avoid overflowing 64K DMA boundary */
-    count = DMA_max_transfer(buffer, totaltodo);
+    count = totaltodo;
+    if ((pddt->ddt_descflags & DF_DMA_TRANSPARENT) == 0)
+    {
+        /* avoid overflowing 64K DMA boundary
+        for drives that don't handle this transparently */
+        count = DMA_max_transfer(buffer, totaltodo);
+    }     
 
     if (FP_SEG(buffer) >= 0xa000 || count == 0)
     {
diff --git a/kernel/initdisk.c b/kernel/initdisk.c
index 16a6929..227ab16 100644
--- a/kernel/initdisk.c
+++ b/kernel/initdisk.c
@@ -710,6 +710,11 @@ STATIC int LBA_Get_Drive_Parameters(int drive, struct DriveParamS *driveParam)
   driveParam->descflags = DF_LBA;
   if (lba_bios_parameters.information & 8)
     driveParam->descflags |= DF_WRTVERIFY;
+
+  if (lba_bios_parameters.information & 1)
+  {
+    driveParam->descflags |= DF_DMA_TRANSPARENT;        /* DMA boundary errors are handled transparently */
+  }
   
 StandardBios:                  /* old way to get parameters */