Set a lower maximum number of iterations in AtapiSoftReset.
[reactos.git] / reactos / drivers / storage / ide / uniata / id_ata.cpp
index e1fbe3b..e1950a4 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,8 +689,10 @@ AtapiSoftReset(
     SelectDrive(chan, DeviceNumber);
     AtapiStallExecution(10000);
     AtapiWritePort1(chan, IDX_IO1_o_Command, IDE_COMMAND_ATAPI_RESET);
-    for (i = 0; i < 1000; i++) {
-        AtapiStallExecution(999);
+    while ((AtapiReadPort1(chan, IDX_IO1_i_Status) & IDE_STATUS_BUSY) &&
+           i--)
+    {
+        AtapiStallExecution(30);
     }
     SelectDrive(chan, DeviceNumber);
     WaitOnBusy(chan);
@@ -718,6 +724,7 @@ AtapiSoftReset(
     Translate to 48-Lba form if required
 */
 UCHAR
+NTAPI
 AtaCommand48(
     IN PHW_DEVICE_EXTENSION deviceExtension,
     IN ULONG DeviceNumber,
@@ -896,6 +903,7 @@ AtaCommand48(
     This is simply wrapper for AtaCommand48()
 */
 UCHAR
+NTAPI
 AtaCommand(
     IN PHW_DEVICE_EXTENSION deviceExtension,
     IN ULONG DeviceNumber,
@@ -916,6 +924,7 @@ AtaCommand(
 } // end AtaCommand()
 
 LONG
+NTAPI
 AtaPio2Mode(LONG pio)
 {
     switch (pio) {
@@ -930,6 +939,7 @@ AtaPio2Mode(LONG pio)
 } // end AtaPio2Mode()
 
 LONG
+NTAPI
 AtaPioMode(PIDENTIFY_DATA2 ident)
 {
     if (ident->PioTimingsValid) {
@@ -950,6 +960,7 @@ AtaPioMode(PIDENTIFY_DATA2 ident)
 } // end AtaPioMode()
 
 LONG
+NTAPI
 AtaWmode(PIDENTIFY_DATA2 ident)
 {
     if (ident->MultiWordDMASupport & 0x04)
@@ -962,6 +973,7 @@ AtaWmode(PIDENTIFY_DATA2 ident)
 } // end AtaWmode()
 
 LONG
+NTAPI
 AtaUmode(PIDENTIFY_DATA2 ident)
 {
     if (!ident->UdmaModesValid)
@@ -1067,6 +1079,7 @@ AtapiTimerDpc(
     cancels previous Dpc request (if any), but we need Dpc queue.
 */
 VOID
+NTAPI
 AtapiQueueTimerDpc(
     IN PVOID HwDeviceExtension,
     IN ULONG lChannel,
@@ -1128,6 +1141,7 @@ AtapiQueueTimerDpc(
 #endif //UNIATA_CORE
 
 VOID
+NTAPI
 UniataDumpATARegs(
     IN PHW_CHANNEL chan
     )
@@ -1175,6 +1189,7 @@ Return Value:
 
 --*/
 BOOLEAN
+NTAPI
 IssueIdentify(
     IN PVOID HwDeviceExtension,
     IN ULONG DeviceNumber,
@@ -1769,6 +1784,7 @@ Return Value:
 
 --*/
 BOOLEAN
+NTAPI
 SetDriveParameters(
     IN PVOID HwDeviceExtension,
     IN ULONG DeviceNumber,
@@ -1811,6 +1827,7 @@ SetDriveParameters(
 } // end SetDriveParameters()
 
 VOID
+NTAPI
 UniataForgetDevice(
     PHW_LU_EXTENSION   LunExt
     )
@@ -1845,6 +1862,7 @@ AtapiResetController(
 
 
 BOOLEAN
+NTAPI
 AtapiResetController__(
     IN PVOID HwDeviceExtension,
     IN ULONG PathId,
@@ -1864,7 +1882,9 @@ AtapiResetController__(
     ULONG slotNumber = deviceExtension->slotNumber;
     ULONG SystemIoBusNumber = deviceExtension->SystemIoBusNumber;
     ULONG VendorID =  deviceExtension->DevID        & 0xffff;
+#ifdef _DEBUG
     ULONG DeviceID = (deviceExtension->DevID >> 16) & 0xffff;
+#endif
     //ULONG RevID    =  deviceExtension->RevID;
     ULONG ChipFlags = deviceExtension->HwFlags & CHIPFLAG_MASK;
     UCHAR tmp8;
@@ -2191,6 +2211,7 @@ Return Value:
 
 --*/
 ULONG
+NTAPI
 MapError(
     IN PVOID HwDeviceExtension,
     IN PSCSI_REQUEST_BLOCK Srb
@@ -2602,6 +2623,7 @@ AtapiHwInitialize(
 } // end AtapiHwInitialize()
 
 VOID
+NTAPI
 AtapiHwInitialize__(
     IN PHW_DEVICE_EXTENSION deviceExtension,
     IN ULONG lChannel
@@ -2824,6 +2846,7 @@ AtapiHwInitialize__(
 #ifndef UNIATA_CORE
 
 VOID
+NTAPI
 AtapiHwInitializeChanger(
     IN PVOID HwDeviceExtension,
     IN PSCSI_REQUEST_BLOCK Srb,
@@ -2858,13 +2881,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;
@@ -2877,24 +2901,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++;
     }
 
@@ -2920,18 +2935,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++;
         }
@@ -2967,7 +2985,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++) {
@@ -2983,6 +3001,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;
@@ -3028,6 +3048,7 @@ ContinueSearch:
     Timer callback
 */
 VOID
+NTAPI
 AtapiCallBack__(
     IN PVOID HwDeviceExtension,
     IN UCHAR lChannel
@@ -3058,7 +3079,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]));
     }
@@ -3157,6 +3178,7 @@ ReturnCallback:
 } // end AtapiCallBack__()
 
 VOID
+NTAPI
 AtapiCallBack_X(
     IN PVOID HwDeviceExtension
     )
@@ -3302,6 +3324,7 @@ AtapiInterrupt(
 #ifndef UNIATA_CORE
 
 BOOLEAN
+NTAPI
 AtapiInterrupt2(
     IN PKINTERRUPT Interrupt,
     IN PVOID Isr2HwDeviceExtension
@@ -3472,6 +3495,7 @@ AtapiEnableInterrupts__(
 
 
 VOID
+NTAPI
 AtapiEnableInterrupts(
     IN PVOID HwDeviceExtension,
     IN ULONG c
@@ -3494,6 +3518,7 @@ AtapiEnableInterrupts(
 } // end AtapiEnableInterrupts()
 
 VOID
+NTAPI
 AtapiDisableInterrupts(
     IN PVOID HwDeviceExtension,
     IN ULONG c
@@ -3519,6 +3544,7 @@ AtapiDisableInterrupts(
     Check hardware for interrupt state
  */
 BOOLEAN
+NTAPI
 AtapiCheckInterrupt__(
     IN PVOID HwDeviceExtension,
     IN UCHAR c // logical channel
@@ -3897,6 +3923,7 @@ skip_dma_stat_check:
 
 
 BOOLEAN
+NTAPI
 AtapiInterrupt__(
     IN PVOID HwDeviceExtension,
     IN UCHAR c
@@ -4280,7 +4307,7 @@ continue_err:
         for (k = atapiDev ? 0 : 200; k; k--) {
             GetStatus(chan, statusByte);
             if (!(statusByte & IDE_STATUS_DRQ)) {
-                AtapiStallExecution(50);
+                AtapiStallExecution(100);
             } else {
                 break;
             }
@@ -5283,6 +5310,7 @@ Return Value:
 
 --*/
 ULONG
+NTAPI
 IdeSendSmartCommand(
     IN PVOID HwDeviceExtension,
     IN PSCSI_REQUEST_BLOCK Srb
@@ -5396,6 +5424,7 @@ IdeSendSmartCommand(
 #endif //UNIATA_CORE
 
 ULONGLONG
+NTAPI
 UniAtaCalculateLBARegs(
     PHW_LU_EXTENSION     LunExt,
     ULONG                startingSector,
@@ -5406,6 +5435,8 @@ UniAtaCalculateLBARegs(
     USHORT               cylinder;
     ULONG                tmp;
 
+    (*max_bcount) = 0;
+
     if(LunExt->DeviceFlags & DFLAGS_LBA_ENABLED) {
         if(LunExt->LimitedTransferMode >= ATA_DMA) {
             if(LunExt->DeviceExtension) {
@@ -5430,12 +5461,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
@@ -5480,6 +5511,7 @@ Return Value:
 
 --*/
 ULONG
+NTAPI
 IdeReadWrite(
     IN PVOID HwDeviceExtension,
     IN PSCSI_REQUEST_BLOCK Srb,
@@ -5738,6 +5770,7 @@ Return Value:
 
 --*/
 ULONG
+NTAPI
 IdeVerify(
     IN PVOID HwDeviceExtension,
     IN PSCSI_REQUEST_BLOCK Srb
@@ -5839,6 +5872,7 @@ Return Value:
 
 --*/
 ULONG
+NTAPI
 AtapiSendCommand(
     IN PVOID HwDeviceExtension,
     IN PSCSI_REQUEST_BLOCK Srb,
@@ -6333,7 +6367,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);
@@ -6368,7 +6402,7 @@ make_reset:
 
     GetBaseStatus(chan, statusByte);
 
-    AtapiEnableInterrupts(deviceExtension, lChannel);
+    //AtapiEnableInterrupts(deviceExtension, lChannel);
 
     WriteBuffer(chan,
                 (PUSHORT)Srb->Cdb,
@@ -6411,6 +6445,7 @@ ULONG check_point = 0;
 #endif
 
 ULONG
+NTAPI
 IdeSendCommand(
     IN PVOID HwDeviceExtension,
     IN PSCSI_REQUEST_BLOCK Srb,
@@ -7005,6 +7040,7 @@ Arguments:
 
 --*/
 VOID
+NTAPI
 IdeMediaStatus(
     BOOLEAN EnableMSN,
     IN PVOID HwDeviceExtension,
@@ -7079,6 +7115,7 @@ Return Value:
 
 --*/
 ULONG
+NTAPI
 IdeBuildSenseBuffer(
     IN PVOID HwDeviceExtension,
     IN PSCSI_REQUEST_BLOCK Srb
@@ -7131,6 +7168,7 @@ IdeBuildSenseBuffer(
 }// End of IdeBuildSenseBuffer
 
 VOID
+NTAPI
 UniataUserDeviceReset(
     PHW_DEVICE_EXTENSION deviceExtension,
     PHW_LU_EXTENSION LunExt,
@@ -7154,6 +7192,7 @@ UniataUserDeviceReset(
 } // end UniataUserDeviceReset()
 
 BOOLEAN
+NTAPI
 UniataNeedQueueing(
     PHW_DEVICE_EXTENSION deviceExtension,
     PHW_CHANNEL          chan,
@@ -7216,6 +7255,7 @@ AtapiStartIo(
 } // end AtapiStartIo()
 
 BOOLEAN
+NTAPI
 AtapiStartIo__(
     IN PVOID HwDeviceExtension,
     IN PSCSI_REQUEST_BLOCK Srb,
@@ -8165,6 +8205,7 @@ complete_req:
 
 
 void
+NTAPI
 UniataInitAtaCommands()
 {
     int i;
@@ -8317,7 +8358,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);
@@ -8668,6 +8709,7 @@ DriverEntry(
 
 
 PSCSI_REQUEST_BLOCK
+NTAPI
 BuildMechanismStatusSrb(
     IN PVOID HwDeviceExtension,
     IN PSCSI_REQUEST_BLOCK Srb
@@ -8709,6 +8751,7 @@ BuildMechanismStatusSrb(
 #endif //UNIATA_CORE
 
 PSCSI_REQUEST_BLOCK
+NTAPI
 BuildRequestSenseSrb (
     IN PVOID HwDeviceExtension,
     IN PSCSI_REQUEST_BLOCK Srb
@@ -8750,12 +8793,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
     )
 {
@@ -8779,6 +8823,7 @@ AtapiRegCheckDevLunValue(
 } // end AtapiRegCheckDevLunValue()
 
 ULONG
+NTAPI
 EncodeVendorStr(
    OUT PWCHAR Buffer,
     IN PUCHAR Str,
@@ -8818,11 +8863,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
     )
 {
@@ -8938,10 +8984,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
     )
 {
@@ -9108,7 +9155,7 @@ extern "C"
 VOID
 _cdecl
 _PrintNtConsole(
-    PCHAR DebugMessage,
+    PCCH DebugMessage,
     ...
     )
 {