Document what r44552 is all about.
[reactos.git] / reactos / drivers / storage / ide / uniata / id_ata.cpp
index 58f8313..7097668 100644 (file)
@@ -102,6 +102,7 @@ AtapiResetController__(
     );
 
 VOID
+NTAPI
 AtapiHwInitialize__(
     IN PHW_DEVICE_EXTENSION deviceExtension,
     IN ULONG lChannel
@@ -140,6 +141,7 @@ AtapiEnableInterrupts__(
     );
 
 VOID
+NTAPI
 AtapiQueueTimerDpc(
     IN PVOID HwDeviceExtension,
     IN ULONG lChannel,
@@ -158,6 +160,7 @@ AtapiAdapterControl(
 #endif //UNIATA_CORE
 
 BOOLEAN
+NTAPI
 AtapiCheckInterrupt__(
     IN PVOID HwDeviceExtension,
     IN UCHAR c
@@ -167,6 +170,7 @@ AtapiCheckInterrupt__(
 #ifndef UNIATA_CORE
 
 BOOLEAN
+NTAPI
 AtapiRegGetStringParameterValue(
     IN PWSTR RegistryPath,
     IN PWSTR Name,
@@ -675,7 +679,7 @@ AtapiSoftReset(
     )
 {
     //ULONG c = chan->lChannel;
-    ULONG i;
+    ULONG i = 30 * 1000;
     UCHAR dma_status = 0;
     KdPrint2((PRINT_PREFIX "AtapiSoftReset:\n"));
     UCHAR statusByte2;
@@ -685,9 +689,17 @@ AtapiSoftReset(
     SelectDrive(chan, DeviceNumber);
     AtapiStallExecution(10000);
     AtapiWritePort1(chan, IDX_IO1_o_Command, IDE_COMMAND_ATAPI_RESET);
-    for (i = 0; i < 1000; i++) {
-        AtapiStallExecution(999);
+
+    // ReactOS modification: Already stop looping when we know that the drive has finished resetting.
+    // Not all controllers clear the IDE_STATUS_BUSY flag (e.g. not the VMware one), so ensure that
+    // the maximum waiting time (30 * i = 0.9 seconds) does not exceed the one of the original
+    // implementation. (which is around 1 second)
+    while ((AtapiReadPort1(chan, IDX_IO1_i_Status) & IDE_STATUS_BUSY) &&
+           i--)
+    {
+        AtapiStallExecution(30);
     }
+
     SelectDrive(chan, DeviceNumber);
     WaitOnBusy(chan);
     GetBaseStatus(chan, statusByte2);
@@ -718,6 +730,7 @@ AtapiSoftReset(
     Translate to 48-Lba form if required
 */
 UCHAR
+NTAPI
 AtaCommand48(
     IN PHW_DEVICE_EXTENSION deviceExtension,
     IN ULONG DeviceNumber,
@@ -896,6 +909,7 @@ AtaCommand48(
     This is simply wrapper for AtaCommand48()
 */
 UCHAR
+NTAPI
 AtaCommand(
     IN PHW_DEVICE_EXTENSION deviceExtension,
     IN ULONG DeviceNumber,
@@ -916,6 +930,7 @@ AtaCommand(
 } // end AtaCommand()
 
 LONG
+NTAPI
 AtaPio2Mode(LONG pio)
 {
     switch (pio) {
@@ -930,6 +945,7 @@ AtaPio2Mode(LONG pio)
 } // end AtaPio2Mode()
 
 LONG
+NTAPI
 AtaPioMode(PIDENTIFY_DATA2 ident)
 {
     if (ident->PioTimingsValid) {
@@ -950,6 +966,7 @@ AtaPioMode(PIDENTIFY_DATA2 ident)
 } // end AtaPioMode()
 
 LONG
+NTAPI
 AtaWmode(PIDENTIFY_DATA2 ident)
 {
     if (ident->MultiWordDMASupport & 0x04)
@@ -962,6 +979,7 @@ AtaWmode(PIDENTIFY_DATA2 ident)
 } // end AtaWmode()
 
 LONG
+NTAPI
 AtaUmode(PIDENTIFY_DATA2 ident)
 {
     if (!ident->UdmaModesValid)
@@ -1067,6 +1085,7 @@ AtapiTimerDpc(
     cancels previous Dpc request (if any), but we need Dpc queue.
 */
 VOID
+NTAPI
 AtapiQueueTimerDpc(
     IN PVOID HwDeviceExtension,
     IN ULONG lChannel,
@@ -1128,6 +1147,7 @@ AtapiQueueTimerDpc(
 #endif //UNIATA_CORE
 
 VOID
+NTAPI
 UniataDumpATARegs(
     IN PHW_CHANNEL chan
     )
@@ -1175,6 +1195,7 @@ Return Value:
 
 --*/
 BOOLEAN
+NTAPI
 IssueIdentify(
     IN PVOID HwDeviceExtension,
     IN ULONG DeviceNumber,
@@ -1769,6 +1790,7 @@ Return Value:
 
 --*/
 BOOLEAN
+NTAPI
 SetDriveParameters(
     IN PVOID HwDeviceExtension,
     IN ULONG DeviceNumber,
@@ -1811,6 +1833,7 @@ SetDriveParameters(
 } // end SetDriveParameters()
 
 VOID
+NTAPI
 UniataForgetDevice(
     PHW_LU_EXTENSION   LunExt
     )
@@ -1845,6 +1868,7 @@ AtapiResetController(
 
 
 BOOLEAN
+NTAPI
 AtapiResetController__(
     IN PVOID HwDeviceExtension,
     IN ULONG PathId,
@@ -2193,6 +2217,7 @@ Return Value:
 
 --*/
 ULONG
+NTAPI
 MapError(
     IN PVOID HwDeviceExtension,
     IN PSCSI_REQUEST_BLOCK Srb
@@ -2604,6 +2629,7 @@ AtapiHwInitialize(
 } // end AtapiHwInitialize()
 
 VOID
+NTAPI
 AtapiHwInitialize__(
     IN PHW_DEVICE_EXTENSION deviceExtension,
     IN ULONG lChannel
@@ -2826,6 +2852,7 @@ AtapiHwInitialize__(
 #ifndef UNIATA_CORE
 
 VOID
+NTAPI
 AtapiHwInitializeChanger(
     IN PVOID HwDeviceExtension,
     IN PSCSI_REQUEST_BLOCK Srb,
@@ -2860,13 +2887,14 @@ Return Values:
 
 --*/
 ULONG
+NTAPI
 AtapiParseArgumentString(
-    IN PCHAR String,
-    IN PCHAR KeyWord
+    IN PCCH String,
+    IN PCCH KeyWord
     )
 {
-    PCHAR cptr;
-    PCHAR kptr;
+    PCCH cptr;
+    PCCH kptr;
     ULONG value;
     ULONG stringLength = 0;
     ULONG keyWordLength = 0;
@@ -2879,24 +2907,15 @@ AtapiParseArgumentString(
         return 0;
     }
 
-    // Calculate the string length and lower case all characters.
+    // Calculate the string length.
     cptr = String;
-    while (*cptr) {
-        if (*cptr >= 'A' && *cptr <= 'Z') {
-            *cptr = *cptr + ('a' - 'A');
-        }
-        cptr++;
+    while (*cptr++) {
         stringLength++;
     }
 
-    // Calculate the keyword length and lower case all characters.
-    cptr = KeyWord;
-    while (*cptr) {
-
-        if (*cptr >= 'A' && *cptr <= 'Z') {
-            *cptr = *cptr + ('a' - 'A');
-        }
-        cptr++;
+    // Calculate the keyword length.
+    kptr = KeyWord;
+    while (*kptr++) {
         keyWordLength++;
     }
 
@@ -2922,18 +2941,21 @@ ContinueSearch:
     }
 
     kptr = KeyWord;
-    while (*cptr++ == *kptr++) {
+    while ((*cptr == *kptr) ||
+           (*cptr <= 'Z' && *cptr + ('a' - 'A') == *kptr) ||
+           (*cptr >= 'a' && *cptr - ('a' - 'A') == *kptr)) {
+        cptr++;
+        kptr++;
 
-        if (*(cptr - 1) == '\0') {
+        if (*cptr == '\0') {
             // end of string
             return 0;
         }
     }
 
-    if (*(kptr - 1) == '\0') {
+    if (*kptr == '\0') {
 
         // May have a match backup and check for blank or equals.
-        cptr--;
         while (*cptr == ' ' || *cptr == '\t') {
             cptr++;
         }
@@ -2969,7 +2991,7 @@ ContinueSearch:
         }
 
         value = 0;
-        if ((*cptr == '0') && (*(cptr + 1) == 'x')) {
+        if ((*cptr == '0') && ((*(cptr + 1) == 'x') || (*(cptr + 1) == 'X'))) {
             // Value is in Hex.  Skip the "0x"
             cptr += 2;
             for (index = 0; *(cptr + index); index++) {
@@ -2985,6 +3007,8 @@ ContinueSearch:
                 } else {
                     if ((*(cptr + index) >= 'a') && (*(cptr + index) <= 'f')) {
                         value = (16 * value) + (*(cptr + index) - 'a' + 10);
+                    } else if ((*(cptr + index) >= 'A') && (*(cptr + index) <= 'F')) {
+                        value = (16 * value) + (*(cptr + index) - 'A' + 10);
                     } else {
                         // Syntax error, return not found.
                         return 0;
@@ -3030,6 +3054,7 @@ ContinueSearch:
     Timer callback
 */
 VOID
+NTAPI
 AtapiCallBack__(
     IN PVOID HwDeviceExtension,
     IN UCHAR lChannel
@@ -3060,7 +3085,7 @@ AtapiCallBack__(
         goto ReturnCallback;
     }
 
-#ifdef DBG
+#if DBG
     if (!IS_RDP((srb->Cdb[0]))) {
         KdPrint2((PRINT_PREFIX "AtapiCallBack: Invalid CDB marked as RDP - %#x\n", srb->Cdb[0]));
     }
@@ -3159,6 +3184,7 @@ ReturnCallback:
 } // end AtapiCallBack__()
 
 VOID
+NTAPI
 AtapiCallBack_X(
     IN PVOID HwDeviceExtension
     )
@@ -3304,6 +3330,7 @@ AtapiInterrupt(
 #ifndef UNIATA_CORE
 
 BOOLEAN
+NTAPI
 AtapiInterrupt2(
     IN PKINTERRUPT Interrupt,
     IN PVOID Isr2HwDeviceExtension
@@ -3474,6 +3501,7 @@ AtapiEnableInterrupts__(
 
 
 VOID
+NTAPI
 AtapiEnableInterrupts(
     IN PVOID HwDeviceExtension,
     IN ULONG c
@@ -3496,6 +3524,7 @@ AtapiEnableInterrupts(
 } // end AtapiEnableInterrupts()
 
 VOID
+NTAPI
 AtapiDisableInterrupts(
     IN PVOID HwDeviceExtension,
     IN ULONG c
@@ -3521,6 +3550,7 @@ AtapiDisableInterrupts(
     Check hardware for interrupt state
  */
 BOOLEAN
+NTAPI
 AtapiCheckInterrupt__(
     IN PVOID HwDeviceExtension,
     IN UCHAR c // logical channel
@@ -3899,6 +3929,7 @@ skip_dma_stat_check:
 
 
 BOOLEAN
+NTAPI
 AtapiInterrupt__(
     IN PVOID HwDeviceExtension,
     IN UCHAR c
@@ -4282,7 +4313,7 @@ continue_err:
         for (k = atapiDev ? 0 : 200; k; k--) {
             GetStatus(chan, statusByte);
             if (!(statusByte & IDE_STATUS_DRQ)) {
-                AtapiStallExecution(50);
+                AtapiStallExecution(100);
             } else {
                 break;
             }
@@ -5285,6 +5316,7 @@ Return Value:
 
 --*/
 ULONG
+NTAPI
 IdeSendSmartCommand(
     IN PVOID HwDeviceExtension,
     IN PSCSI_REQUEST_BLOCK Srb
@@ -5398,6 +5430,7 @@ IdeSendSmartCommand(
 #endif //UNIATA_CORE
 
 ULONGLONG
+NTAPI
 UniAtaCalculateLBARegs(
     PHW_LU_EXTENSION     LunExt,
     ULONG                startingSector,
@@ -5408,6 +5441,8 @@ UniAtaCalculateLBARegs(
     USHORT               cylinder;
     ULONG                tmp;
 
+    (*max_bcount) = 0;
+
     if(LunExt->DeviceFlags & DFLAGS_LBA_ENABLED) {
         if(LunExt->LimitedTransferMode >= ATA_DMA) {
             if(LunExt->DeviceExtension) {
@@ -5432,12 +5467,12 @@ UniAtaCalculateLBARegs(
         KdPrint2((PRINT_PREFIX "UniAtaCalculateLBARegs: C:H:S=%#x:%#x:%#x, max_bc %#x\n",
             cylinder, drvSelect, sectorNumber, (*max_bcount)));
     }
-        (*max_bcount) = 0;
 
     return (ULONG)(sectorNumber&0xff) | (((ULONG)cylinder&0xffff)<<8) | (((ULONG)drvSelect&0xf)<<24);
 } // end UniAtaCalculateLBARegs()
 
 ULONGLONG
+NTAPI
 UniAtaCalculateLBARegsBack(
     PHW_LU_EXTENSION     LunExt,
     ULONGLONG            lba
@@ -5482,6 +5517,7 @@ Return Value:
 
 --*/
 ULONG
+NTAPI
 IdeReadWrite(
     IN PVOID HwDeviceExtension,
     IN PSCSI_REQUEST_BLOCK Srb,
@@ -5740,6 +5776,7 @@ Return Value:
 
 --*/
 ULONG
+NTAPI
 IdeVerify(
     IN PVOID HwDeviceExtension,
     IN PSCSI_REQUEST_BLOCK Srb
@@ -5841,6 +5878,7 @@ Return Value:
 
 --*/
 ULONG
+NTAPI
 AtapiSendCommand(
     IN PVOID HwDeviceExtension,
     IN PSCSI_REQUEST_BLOCK Srb,
@@ -6335,7 +6373,7 @@ make_reset:
         InterlockedExchange(&(chan->CheckIntr),
                                       CHECK_INTR_IDLE);
 
-        AtapiDisableInterrupts(deviceExtension, lChannel);
+        //AtapiDisableInterrupts(deviceExtension, lChannel);
 
         // Write ATAPI packet command.
         AtapiWritePort1(chan, IDX_IO1_o_Command, IDE_COMMAND_ATAPI_PACKET);
@@ -6370,7 +6408,7 @@ make_reset:
 
     GetBaseStatus(chan, statusByte);
 
-    AtapiEnableInterrupts(deviceExtension, lChannel);
+    //AtapiEnableInterrupts(deviceExtension, lChannel);
 
     WriteBuffer(chan,
                 (PUSHORT)Srb->Cdb,
@@ -6413,6 +6451,7 @@ ULONG check_point = 0;
 #endif
 
 ULONG
+NTAPI
 IdeSendCommand(
     IN PVOID HwDeviceExtension,
     IN PSCSI_REQUEST_BLOCK Srb,
@@ -7007,6 +7046,7 @@ Arguments:
 
 --*/
 VOID
+NTAPI
 IdeMediaStatus(
     BOOLEAN EnableMSN,
     IN PVOID HwDeviceExtension,
@@ -7081,6 +7121,7 @@ Return Value:
 
 --*/
 ULONG
+NTAPI
 IdeBuildSenseBuffer(
     IN PVOID HwDeviceExtension,
     IN PSCSI_REQUEST_BLOCK Srb
@@ -7133,6 +7174,7 @@ IdeBuildSenseBuffer(
 }// End of IdeBuildSenseBuffer
 
 VOID
+NTAPI
 UniataUserDeviceReset(
     PHW_DEVICE_EXTENSION deviceExtension,
     PHW_LU_EXTENSION LunExt,
@@ -7156,6 +7198,7 @@ UniataUserDeviceReset(
 } // end UniataUserDeviceReset()
 
 BOOLEAN
+NTAPI
 UniataNeedQueueing(
     PHW_DEVICE_EXTENSION deviceExtension,
     PHW_CHANNEL          chan,
@@ -7218,6 +7261,7 @@ AtapiStartIo(
 } // end AtapiStartIo()
 
 BOOLEAN
+NTAPI
 AtapiStartIo__(
     IN PVOID HwDeviceExtension,
     IN PSCSI_REQUEST_BLOCK Srb,
@@ -8167,6 +8211,7 @@ complete_req:
 
 
 void
+NTAPI
 UniataInitAtaCommands()
 {
     int i;
@@ -8319,7 +8364,7 @@ DriverEntry(
     LARGE_INTEGER t0, t1;
 
     Connect_DbgPrint();
-    KdPrint2((PRINT_PREFIX (PCCHAR)ver_string));
+    KdPrint2((PRINT_PREFIX "%s", (PCCHAR)ver_string));
     a = (WCHAR)strlen(ver_string);
 
     g_opt_Verbose = (BOOLEAN)AtapiRegCheckDevValue(NULL, CHAN_NOT_SPECIFIED, DEVNUM_NOT_SPECIFIED, L"PrintLogo", 0);
@@ -8670,6 +8715,7 @@ DriverEntry(
 
 
 PSCSI_REQUEST_BLOCK
+NTAPI
 BuildMechanismStatusSrb(
     IN PVOID HwDeviceExtension,
     IN PSCSI_REQUEST_BLOCK Srb
@@ -8711,6 +8757,7 @@ BuildMechanismStatusSrb(
 #endif //UNIATA_CORE
 
 PSCSI_REQUEST_BLOCK
+NTAPI
 BuildRequestSenseSrb (
     IN PVOID HwDeviceExtension,
     IN PSCSI_REQUEST_BLOCK Srb
@@ -8752,12 +8799,13 @@ BuildRequestSenseSrb (
 #ifndef UNIATA_CORE
 
 ULONG
+NTAPI
 AtapiRegCheckDevLunValue(
     IN PVOID HwDeviceExtension,
-    IN PWCHAR NamePrefix,
+    IN PCWCH NamePrefix,
     IN ULONG chan,
     IN ULONG dev,
-    IN PWSTR Name,
+    IN PCWSTR Name,
     IN ULONG Default
     )
 {
@@ -8781,6 +8829,7 @@ AtapiRegCheckDevLunValue(
 } // end AtapiRegCheckDevLunValue()
 
 ULONG
+NTAPI
 EncodeVendorStr(
    OUT PWCHAR Buffer,
     IN PUCHAR Str,
@@ -8820,11 +8869,12 @@ EncodeVendorStr(
 } // end EncodeVendorStr()
 
 ULONG
+NTAPI
 AtapiRegCheckDevValue(
     IN PVOID HwDeviceExtension,
     IN ULONG chan,
     IN ULONG dev,
-    IN PWSTR Name,
+    IN PCWSTR Name,
     IN ULONG Default
     )
 {
@@ -8940,10 +8990,11 @@ AtapiRegCheckDevValue(
     Returns:    Registry Key value
  */
 ULONG
+NTAPI
 AtapiRegCheckParameterValue(
     IN PVOID HwDeviceExtension,
-    IN PWSTR PathSuffix,
-    IN PWSTR Name,
+    IN PCWSTR PathSuffix,
+    IN PCWSTR Name,
     IN ULONG Default
     )
 {
@@ -9110,7 +9161,7 @@ extern "C"
 VOID
 _cdecl
 _PrintNtConsole(
-    PCHAR DebugMessage,
+    PCCH DebugMessage,
     ...
     )
 {