From dd91e3c005c7573a775d2ea8a01af66b00f7031d Mon Sep 17 00:00:00 2001 From: Kenneth J Davis Date: Fri, 30 Jul 2021 23:04:06 -0400 Subject: [PATCH] From Tom Ehlert: don't split disk transfers crossing DMA boundary if BIOS indicates can handle transparently --- hdr/device.h | 1 + kernel/dsk.c | 9 +++++++-- kernel/initdisk.c | 5 +++++ 3 files changed, 13 insertions(+), 2 deletions(-) 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 */