[UNIATA]
authorThomas Faber <thomas.faber@reactos.org>
Sat, 15 Apr 2017 20:24:43 +0000 (20:24 +0000)
committerThomas Faber <thomas.faber@reactos.org>
Sat, 15 Apr 2017 20:24:43 +0000 (20:24 +0000)
- Update to version 0.46e3 (and fix up the version numbers)
- Un-"fix" insignificant typo corrections that only serve to make syncing harder
CORE-13032 #resolve
CORE-11894 CORE-11277 CORE-12909

svn path=/trunk/; revision=74319

reactos/drivers/storage/ide/uniata/atacmd_map.h
reactos/drivers/storage/ide/uniata/atapi.h
reactos/drivers/storage/ide/uniata/bsmaster.h
reactos/drivers/storage/ide/uniata/id_ata.cpp
reactos/drivers/storage/ide/uniata/id_dma.cpp
reactos/drivers/storage/ide/uniata/uniata_ver.h

index 7da7409..6332feb 100644 (file)
@@ -1,5 +1,5 @@
 
-// Build Version 0.46d8
+// Build Version 0.46e3
 
 
 UCHAR const AtaCommands48[256] = {
index ebbfacf..405cfb8 100644 (file)
@@ -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;
     };
index 3984365..9ea8af3 100644 (file)
@@ -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;
 
index a1722b6..799b2d0 100644 (file)
@@ -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));
index 8674645..d789616 100644 (file)
@@ -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) {
index 52b7242..3a00321 100644 (file)
@@ -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"