diff --git a/reactos/drivers/storage/ide/uniata/atacmd_map.h b/reactos/drivers/storage/ide/uniata/atacmd_map.h index 7da74097957..6332feb3c38 100644 --- a/reactos/drivers/storage/ide/uniata/atacmd_map.h +++ b/reactos/drivers/storage/ide/uniata/atacmd_map.h @@ -1,5 +1,5 @@ -// Build Version 0.46d8 +// Build Version 0.46e3 UCHAR const AtaCommands48[256] = { diff --git a/reactos/drivers/storage/ide/uniata/atapi.h b/reactos/drivers/storage/ide/uniata/atapi.h index ebbfacfed1d..405cfb8467a 100644 --- a/reactos/drivers/storage/ide/uniata/atapi.h +++ b/reactos/drivers/storage/ide/uniata/atapi.h @@ -712,7 +712,7 @@ typedef struct _IDENTIFY_DATA { USHORT UDMASupport : 7; // 62 ATAPI USHORT MultiWordDMASupport : 3; USHORT DMASupport : 1; - USHORT Reserved62_11_14 : 4; + USHORT Reseved62_11_14 : 4; USHORT DMADirRequired : 1; } AtapiDMA; }; diff --git a/reactos/drivers/storage/ide/uniata/bsmaster.h b/reactos/drivers/storage/ide/uniata/bsmaster.h index 39843651792..9ea8af390d7 100644 --- a/reactos/drivers/storage/ide/uniata/bsmaster.h +++ b/reactos/drivers/storage/ide/uniata/bsmaster.h @@ -1896,8 +1896,9 @@ extern ULONG CPU_num; #define VM_VMWARE 0x03 #define VM_QEMU 0x04 #define VM_BOCHS 0x05 +#define VM_PCEM 0x06 -#define VM_MAX_KNOWN VM_BOCHS +#define VM_MAX_KNOWN VM_PCEM extern BOOLEAN WinVer_WDM_Model; diff --git a/reactos/drivers/storage/ide/uniata/id_ata.cpp b/reactos/drivers/storage/ide/uniata/id_ata.cpp index a1722b6d5b9..799b2d0ef59 100644 --- a/reactos/drivers/storage/ide/uniata/id_ata.cpp +++ b/reactos/drivers/storage/ide/uniata/id_ata.cpp @@ -1762,7 +1762,7 @@ IssueIdentify( // 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 @@ -1917,6 +1917,8 @@ IssueIdentify( // 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 = @@ -1960,6 +1962,8 @@ IssueIdentify( 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")); @@ -2093,8 +2097,21 @@ IssueIdentify( // 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 @@ -2116,6 +2133,11 @@ IssueIdentify( } } + 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; @@ -5845,6 +5867,10 @@ continue_read_drq: 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)); diff --git a/reactos/drivers/storage/ide/uniata/id_dma.cpp b/reactos/drivers/storage/ide/uniata/id_dma.cpp index 8674645c9f4..d789616ae13 100644 --- a/reactos/drivers/storage/ide/uniata/id_dma.cpp +++ b/reactos/drivers/storage/ide/uniata/id_dma.cpp @@ -107,6 +107,8 @@ AtapiVirtToPhysAddr_( PHYSICAL_ADDRESS ph_addr; ULONG addr; + *(volatile char*)data; // Touch memory, this will prevent condition of not-ready page table for valid addresses + // See ROS-11894 bug ph_addr = MmGetPhysicalAddress(data); KdPrint3((PRINT_PREFIX "AtapiVirtToPhysAddr_: %x -> %8.8x:%8.8x\n", data, ph_addr.HighPart, ph_addr.LowPart)); if(!ph_addru && ph_addr.HighPart) { diff --git a/reactos/drivers/storage/ide/uniata/uniata_ver.h b/reactos/drivers/storage/ide/uniata/uniata_ver.h index 52b7242e52f..3a00321dfcd 100644 --- a/reactos/drivers/storage/ide/uniata/uniata_ver.h +++ b/reactos/drivers/storage/ide/uniata/uniata_ver.h @@ -1,10 +1,10 @@ -#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"