// ATI/SII chipsets with memory-mapped IO hangs when
// I call ReadBuffer(), probably due to PCI burst/prefetch enabled
// Unfortunately, I don't know yet how to workaround it except
- // specifying manual delay in the way you see below.
+ // spacifying manual delay in the way you see below.
ReadBuffer(chan, (PUSHORT)&deviceExtension->FullIdentifyData, 256, PIO0_TIMING);
// Work around for some IDE and one model Atapi that will present more than
// Check for HDDs > 8Gb
if ((deviceExtension->FullIdentifyData.NumberOfCylinders == 0x3fff) &&
/* (deviceExtension->FullIdentifyData.TranslationFieldsValid) &&*/
+ deviceExtension->FullIdentifyData.NumberOfHeads &&
+ deviceExtension->FullIdentifyData.SectorsPerTrack &&
(NumOfSectors < deviceExtension->FullIdentifyData.UserAddressableSectors)) {
KdPrint2((PRINT_PREFIX "NumberOfCylinders == 0x3fff\n"));
cylinders =
if(LunExt->DeviceFlags & DFLAGS_LBA_ENABLED) {
if(deviceExtension->FullIdentifyData.FeaturesSupport.Address48 &&
deviceExtension->FullIdentifyData.FeaturesEnabled.Address48 &&
+ deviceExtension->FullIdentifyData.NumberOfHeads &&
+ deviceExtension->FullIdentifyData.SectorsPerTrack &&
(deviceExtension->FullIdentifyData.UserAddressableSectors48 > NumOfSectors)
) {
KdPrint2((PRINT_PREFIX "LBA48\n"));
// fill IdentifyData with bogus geometry
KdPrint2((PRINT_PREFIX "requested LunExt->GeomType=%x\n", LunExt->opt_GeomType));
- tmp_cylinders = NumOfSectors / (deviceExtension->FullIdentifyData.CurrentSectorsPerTrack *
- deviceExtension->FullIdentifyData.NumberOfCurrentHeads);
+ if(deviceExtension->FullIdentifyData.CurrentSectorsPerTrack &&
+ deviceExtension->FullIdentifyData.NumberOfCurrentHeads) {
+ tmp_cylinders = NumOfSectors / (deviceExtension->FullIdentifyData.CurrentSectorsPerTrack *
+ deviceExtension->FullIdentifyData.NumberOfCurrentHeads);
+ } else
+ if(deviceExtension->FullIdentifyData.SectorsPerTrack &&
+ deviceExtension->FullIdentifyData.NumberOfHeads) {
+ KdPrint2((PRINT_PREFIX "Current C/H = %#I64x/%#I64x\n",
+ deviceExtension->FullIdentifyData.CurrentSectorsPerTrack,
+ deviceExtension->FullIdentifyData.NumberOfCurrentHeads));
+ tmp_cylinders = NumOfSectors / (deviceExtension->FullIdentifyData.SectorsPerTrack *
+ deviceExtension->FullIdentifyData.NumberOfHeads);
+ } else {
+ tmp_cylinders = 0;
+ }
KdPrint2((PRINT_PREFIX "tmp_cylinders = %#I64x\n", tmp_cylinders));
if((tmp_cylinders < 0xffff) || (LunExt->opt_GeomType == GEOM_ORIG)) {
// ok, we can keep original values
}
}
+ if(!deviceExtension->FullIdentifyData.SectorsPerTrack ||
+ !deviceExtension->FullIdentifyData.NumberOfHeads) {
+ KdPrint2((PRINT_PREFIX "Zero S/H -> Force Use GEOM_STD\n"));
+ }
+
if(LunExt->opt_GeomType == GEOM_STD) {
deviceExtension->FullIdentifyData.CurrentSectorsPerTrack =
deviceExtension->FullIdentifyData.SectorsPerTrack = 63;
statusByte = WaitOnBusy(chan);
+ if(wordCount&1 && atapiDev && (g_opt_VirtualMachine == VM_BOCHS)) {
+ KdPrint2((PRINT_PREFIX
+ "IdeIntr: unaligned ATAPI %#x Words\n", wordCount));
+ } else
if(LunExt->DeviceFlags & DFLAGS_DWORDIO_ENABLED) {
KdPrint2((PRINT_PREFIX
"IdeIntr: pre-Read %#x Dwords\n", wordCount/2));
-#define UNIATA_VER_STR "46d8"
-#define UNIATA_VER_DOT 0.46.4.8
+#define UNIATA_VER_STR "46e3"
+#define UNIATA_VER_DOT 0.46.5.3
#define UNIATA_VER_MJ 0
#define UNIATA_VER_MN 46
-#define UNIATA_VER_SUB_MJ 4
-#define UNIATA_VER_SUB_MN 8
-#define UNIATA_VER_DOT_COMMA 0,46,4,8
-#define UNIATA_VER_DOT_STR "0.46.4.8"
-#define UNIATA_VER_YEAR 2016
-#define UNIATA_VER_YEAR_STR "2016"
+#define UNIATA_VER_SUB_MJ 5
+#define UNIATA_VER_SUB_MN 3
+#define UNIATA_VER_DOT_COMMA 0,46,5,3
+#define UNIATA_VER_DOT_STR "0.46.5.3"
+#define UNIATA_VER_YEAR 2017
+#define UNIATA_VER_YEAR_STR "2017"