Index: atacmd_map.h =================================================================== --- drivers/storage/ide/uniata/atacmd_map.h (revision 71722) +++ drivers/storage/ide/uniata/atacmd_map.h (working copy) @@ -1,5 +1,5 @@ -// Build Version 0.46d7 +// Build Version 0.46d8 UCHAR const AtaCommands48[256] = { Index: atapi.h =================================================================== --- drivers/storage/ide/uniata/atapi.h (revision 71722) +++ drivers/storage/ide/uniata/atapi.h (working copy) @@ -1302,7 +1302,8 @@ IN ULONG DeviceNumber ); -ULONG NTAPI +ULONG +NTAPI AtapiFindIsaController( IN PVOID HwDeviceExtension, IN PVOID Context, @@ -1314,6 +1315,17 @@ ULONG NTAPI +AtapiReadArgumentString( + IN PVOID HwDeviceExtension, + IN PVOID Context, + IN PVOID BusInformation, + IN PCHAR ArgumentString, + IN OUT PPORT_CONFIGURATION_INFORMATION ConfigInfo, + OUT PBOOLEAN Again + ); + +ULONG +NTAPI AtapiParseArgumentString( IN PCCH String, IN PCCH KeyWord Index: bsmaster.h =================================================================== --- drivers/storage/ide/uniata/bsmaster.h (revision 71722) +++ drivers/storage/ide/uniata/bsmaster.h (working copy) @@ -1881,6 +1881,7 @@ extern BOOLEAN hasPCI; extern BOOLEAN InDriverEntry; +extern BOOLEAN g_Dump; extern BOOLEAN g_opt_Verbose; extern ULONG g_opt_VirtualMachine; Index: id_ata.cpp =================================================================== --- drivers/storage/ide/uniata/id_ata.cpp (revision 71722) +++ drivers/storage/ide/uniata/id_ata.cpp (working copy) @@ -105,6 +105,7 @@ ULONG g_opt_VirtualMachine = 0; // Auto BOOLEAN InDriverEntry = TRUE; +BOOLEAN g_Dump = FALSE; BOOLEAN g_opt_Verbose = 0; @@ -5036,7 +5037,7 @@ return TRUE; } - if(!DmaTransfer && !atapiDev) { + if((!DmaTransfer && !atapiDev) || deviceExtension->DriverMustPoll) { KdPrint2((PRINT_PREFIX " service PIO HDD\n")); UseDpc = FALSE; } @@ -10516,16 +10517,56 @@ LARGE_INTEGER t0, t1; - Connect_DbgPrint(); 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); - if(g_opt_Verbose) { - _PrintNtConsole("Universal ATA driver v 0." UNIATA_VER_STR "\n"); + statusToReturn = 0xffffffff; + + // Zero out structure. + RtlZeroMemory(((PCHAR)&hwInitializationData), sizeof(hwInitializationData)); + + // Set size of hwInitializationData. + hwInitializationData.comm.HwInitializationDataSize = + sizeof(hwInitializationData.comm) + +// sizeof(hwInitializationData.nt4) + + ((WinVer_Id() <= WinVer_NT) ? 0 : sizeof(hwInitializationData.w2k)); + KdPrint(("HwInitializationDataSize = %x\n", hwInitializationData.comm.HwInitializationDataSize)); + + // Set entry points. + hwInitializationData.comm.HwInitialize = (PHW_INITIALIZE)AtapiHwInitialize; + hwInitializationData.comm.HwResetBus = (PHW_RESET_BUS)AtapiResetController; + hwInitializationData.comm.HwStartIo = (PHW_STARTIO)AtapiStartIo; + hwInitializationData.comm.HwInterrupt = (PHW_INTERRUPT)AtapiInterrupt; + + // Specify size of extensions. + hwInitializationData.comm.DeviceExtensionSize = sizeof(HW_DEVICE_EXTENSION); + hwInitializationData.comm.SpecificLuExtensionSize = sizeof(HW_LU_EXTENSION); + hwInitializationData.comm.SrbExtensionSize = sizeof(ATA_REQ); + + // Indicate PIO device. + hwInitializationData.comm.MapBuffers = TRUE; + + // Request and parse arument string. + KdPrint2((PRINT_PREFIX "\n\nUniATA: parse ArgumentString\n")); + // Zero out structure. + hwInitializationData.comm.NumberOfAccessRanges = 2; + hwInitializationData.comm.HwFindAdapter = AtapiReadArgumentString; + ScsiPortInitialize(DriverObject, + Argument2, + &hwInitializationData.comm, + &adapterCount); + + if(!g_Dump) { + Connect_DbgPrint(); + g_opt_Verbose = (BOOLEAN)AtapiRegCheckDevValue(NULL, CHAN_NOT_SPECIFIED, DEVNUM_NOT_SPECIFIED, L"PrintLogo", 0); + if(g_opt_Verbose) { + _PrintNtConsole("Universal ATA driver v 0." UNIATA_VER_STR "\n"); + } + IgnoreIsaCompatiblePci = (BOOLEAN)AtapiRegCheckDevValue(NULL, CHAN_NOT_SPECIFIED, DEVNUM_NOT_SPECIFIED, L"IgnoreIsaCompatiblePci", IgnoreIsaCompatiblePci) ? TRUE : FALSE; + IgnoreNativePci = (BOOLEAN)AtapiRegCheckDevValue(NULL, CHAN_NOT_SPECIFIED, DEVNUM_NOT_SPECIFIED, L"IgnoreNativePci", IgnoreNativePci) ? TRUE : FALSE; + } else { + KdPrint(("crashdump mode\n")); } - IgnoreIsaCompatiblePci = (BOOLEAN)AtapiRegCheckDevValue(NULL, CHAN_NOT_SPECIFIED, DEVNUM_NOT_SPECIFIED, L"IgnoreIsaCompatiblePci", IgnoreIsaCompatiblePci) ? TRUE : FALSE; - IgnoreNativePci = (BOOLEAN)AtapiRegCheckDevValue(NULL, CHAN_NOT_SPECIFIED, DEVNUM_NOT_SPECIFIED, L"IgnoreNativePci", IgnoreNativePci) ? TRUE : FALSE; if(!SavedDriverObject) { SavedDriverObject = (PDRIVER_OBJECT)DriverObject; @@ -10597,31 +10638,6 @@ g_LogToDisplay = AtapiRegCheckDevValue(NULL, CHAN_NOT_SPECIFIED, DEVNUM_NOT_SPECIFIED, L"LogToDisplay", 0); #endif //_DEBUG - statusToReturn = 0xffffffff; - - // Zero out structure. - RtlZeroMemory(((PCHAR)&hwInitializationData), sizeof(hwInitializationData)); - - // Set size of hwInitializationData. - hwInitializationData.comm.HwInitializationDataSize = - sizeof(hwInitializationData.comm) + -// sizeof(hwInitializationData.nt4) + - ((WinVer_Id() <= WinVer_NT) ? 0 : sizeof(hwInitializationData.w2k)); - KdPrint(("HwInitializationDataSize = %x\n", hwInitializationData.comm.HwInitializationDataSize)); - - // Set entry points. - hwInitializationData.comm.HwInitialize = (PHW_INITIALIZE)AtapiHwInitialize; - hwInitializationData.comm.HwResetBus = (PHW_RESET_BUS)AtapiResetController; - hwInitializationData.comm.HwStartIo = (PHW_STARTIO)AtapiStartIo; - hwInitializationData.comm.HwInterrupt = (PHW_INTERRUPT)AtapiInterrupt; - - // Specify size of extensions. - hwInitializationData.comm.DeviceExtensionSize = sizeof(HW_DEVICE_EXTENSION); - hwInitializationData.comm.SpecificLuExtensionSize = sizeof(HW_LU_EXTENSION); - hwInitializationData.comm.SrbExtensionSize = sizeof(ATA_REQ); - - // Indicate PIO device. - hwInitializationData.comm.MapBuffers = TRUE; // Set PnP-specific API if(WinVer_Id() > WinVer_NT) { KdPrint(("set NeedPhysicalAddresses = TRUE\n")); @@ -10723,7 +10739,7 @@ SecondaryClaimed = TRUE; pref_alt = 0; - if(!WinVer_WDM_Model && !PrimaryClaimed && !SecondaryClaimed && + if(!WinVer_WDM_Model && !PrimaryClaimed && !SecondaryClaimed && !g_Dump && !(BMList[i].ChanInitOk & 0x80)) { // We just want to claim our PCI device in compatible mode, since we shall not @@ -11295,6 +11311,10 @@ UNICODE_STRING paramPath; + if(g_Dump) { + goto failed; + } + // \ -> // KdPrint(( "AtapiCheckRegValue: %ws -> %ws\n", PathSuffix, Name)); // KdPrint(( "AtapiCheckRegValue: RegistryPath %ws\n", RegistryPath->Buffer)); @@ -11332,6 +11352,7 @@ ExFreePool(paramPath.Buffer); if(!NT_SUCCESS(status)) { +failed: doRun = Default; } Index: id_init.cpp =================================================================== --- drivers/storage/ide/uniata/id_init.cpp (revision 71722) +++ drivers/storage/ide/uniata/id_init.cpp (working copy) @@ -623,6 +623,7 @@ } if(deviceExtension->MaxTransferMode >= ATA_SA150) { + KdPrint2((PRINT_PREFIX "setting UNIATA_SATA flag\n")); deviceExtension->HwFlags |= UNIATA_SATA; } @@ -977,13 +978,16 @@ i = AtapiFindListedDev((BUSMASTER_CONTROLLER_INFORMATION_BASE*)&SiSSouthAdapters[0], -1, HwDeviceExtension, SystemIoBusNumber, PCISLOTNUM_NOT_SPECIFIED, NULL); if(i != BMLIST_TERMINATOR) { + KdPrint2((PRINT_PREFIX "SIS South\n")); deviceExtension->HwFlags = (deviceExtension->HwFlags & ~CHIPTYPE_MASK) | SIS133OLD; deviceExtension->MaxTransferMode = ATA_UDMA6; //deviceExtension->MaxTransferMode = SiSSouthAdapters[i].MaxTransferMode; if(SiSSouthAdapters[i].RaidFlags & UNIATA_SATA) { + KdPrint2((PRINT_PREFIX "SIS South SATA\n")); deviceExtension->HwFlags |= UNIATA_SATA; if(SiSSouthAdapters[i].nDeviceId == 0x1182 || SiSSouthAdapters[i].nDeviceId == 0x1183) { + KdPrint2((PRINT_PREFIX "SIS_182\n")); SIS_182 = TRUE; } } Index: id_probe.cpp =================================================================== --- drivers/storage/ide/uniata/id_probe.cpp (revision 71722) +++ drivers/storage/ide/uniata/id_probe.cpp (working copy) @@ -1256,6 +1256,14 @@ /***********************************************************/ deviceExtension->UseDpc = TRUE; +#ifndef UNIATA_CORE + if (g_Dump) { + deviceExtension->DriverMustPoll = TRUE; + deviceExtension->UseDpc = FALSE; + deviceExtension->simplexOnly = TRUE; + deviceExtension->HwFlags |= UNIATA_NO_DPC; + } +#endif //UNIATA_CORE KdPrint2((PRINT_PREFIX "HwFlags = %x\n (3)", deviceExtension->HwFlags)); if(deviceExtension->HwFlags & UNIATA_NO_DPC) { /* CMD 649, ROSB SWK33, ICH4 */ @@ -2036,10 +2044,21 @@ KdPrint2((PRINT_PREFIX "Init ISR:\n")); + /* + We MUST register 2nd ISR for multichannel controllers even for UP systems. + This is needed for cases when + multichannel controller generate interrupt while we are still in its ISR for + other channle's interrupt. New interrupt must be detected and queued for + further processing. If we do not do this, system will not route this + interrupt to main ISR (since it is busy) and we shall get to infinite loop + looking for interrupt handler. + */ + if(!deviceExtension->MasterDev && (deviceExtension->NumberChannels > 1) && // do not touch MasterDev !deviceExtension->simplexOnly && /* // this is unnecessary on simplex controllers !BMList[i].Isr2DevObj*/ // handle re-init under w2k+ /*!ForceSimplex*/ + /*(CPU_num > 1) && // unnecessary for UP systems*/ TRUE) { // Ok, continue... KdPrint2((PRINT_PREFIX "Multichannel native mode, go...\n")); @@ -2340,6 +2359,9 @@ // if not, we go and find ourselves if (preConfig == FALSE) { + ULONG portBase_reg = 0; + ULONG irq_reg = 0; + if (!portBase) { portBase = AdapterAddresses[*adapterCount]; KdPrint2((PRINT_PREFIX "portBase[%d]=%x\n", *adapterCount, portBase)); @@ -2346,8 +2368,14 @@ } else { KdPrint2((PRINT_PREFIX "portBase=%x\n", portBase)); } - portBase = AtapiRegCheckDevValue(deviceExtension, CHAN_NOT_SPECIFIED, DEVNUM_NOT_SPECIFIED, L"PortBase", portBase); - irq = AtapiRegCheckDevValue(deviceExtension, CHAN_NOT_SPECIFIED, DEVNUM_NOT_SPECIFIED, L"Irq", irq); + + portBase_reg = AtapiRegCheckDevValue(deviceExtension, CHAN_NOT_SPECIFIED, DEVNUM_NOT_SPECIFIED, L"PortBase", 0); + irq_reg = AtapiRegCheckDevValue(deviceExtension, CHAN_NOT_SPECIFIED, DEVNUM_NOT_SPECIFIED, L"Irq", 0); + if(portBase_reg && irq_reg) { + KdPrint2((PRINT_PREFIX "use registry settings portBase=%x, irq=%d\n", portBase_reg, irq_reg)); + portBase = portBase_reg; + irq = irq_reg; + } // check if Primary/Secondary Master IDE claimed if(AtapiCheckIOInterference(ConfigInfo, portBase)) { goto next_adapter; @@ -2587,26 +2615,11 @@ // Determine whether this driver is being initialized by the // system or as a crash dump driver. - if (ArgumentString) { - + if (g_Dump) { #ifndef UNIATA_CORE - if (AtapiParseArgumentString(ArgumentString, "dump") == 1) { - KdPrint2((PRINT_PREFIX - "AtapiFindIsaController: Crash dump\n")); - //atapiOnly = FALSE; - deviceExtension->DriverMustPoll = TRUE; - } else { - KdPrint2((PRINT_PREFIX - "AtapiFindIsaController: Atapi Only\n")); - //atapiOnly = TRUE; - deviceExtension->DriverMustPoll = FALSE; - } + deviceExtension->DriverMustPoll = TRUE; #endif //UNIATA_CORE } else { - - KdPrint2((PRINT_PREFIX - "AtapiFindIsaController: Atapi Only (2)\n")); - //atapiOnly = TRUE; deviceExtension->DriverMustPoll = FALSE; } @@ -2690,6 +2703,8 @@ (*ConfigInfo->AccessRanges)[i].RangeLength = 0; (*ConfigInfo->AccessRanges)[i].RangeInMemory = FALSE; } + irq = 0; + portBase = 0; } #ifndef UNIATA_CORE } @@ -2714,8 +2729,36 @@ } // end AtapiFindIsaController() +/* + Do nothing, but parse ScsiPort ArgumentString and setup global variables. +*/ + ULONG NTAPI +AtapiReadArgumentString( + IN PVOID HwDeviceExtension, + IN PVOID Context, + IN PVOID BusInformation, + IN PCHAR ArgumentString, + IN OUT PPORT_CONFIGURATION_INFORMATION ConfigInfo, + OUT PBOOLEAN Again + ) +{ +#ifndef __REACTOS__ + PHW_DEVICE_EXTENSION deviceExtension = (PHW_DEVICE_EXTENSION)HwDeviceExtension; +#endif + + if (AtapiParseArgumentString(ArgumentString, "dump") == 1) { + KdPrint2((PRINT_PREFIX + "AtapiReadArgumentString: Crash dump\n")); + //atapiOnly = FALSE; + g_Dump = TRUE; + } + return(SP_RETURN_NOT_FOUND); +} // end AtapiReadArgumentString() + +ULONG +NTAPI UniataAnybodyHome( IN PVOID HwDeviceExtension, IN ULONG lChannel, @@ -3017,7 +3060,7 @@ // Issue the ATAPI identify command if this // is not for the crash dump utility. try_atapi: - if (!deviceExtension->DriverMustPoll) { + if (g_Dump) { // Issue ATAPI packet identify command. if (IssueIdentify(HwDeviceExtension, Index: uniata_ver.h =================================================================== --- drivers/storage/ide/uniata/uniata_ver.h (revision 71722) +++ drivers/storage/ide/uniata/uniata_ver.h (working copy) @@ -1,10 +1,10 @@ -#define UNIATA_VER_STR "46d7" -#define UNIATA_VER_DOT 0.46.4.7 +#define UNIATA_VER_STR "46d8" +#define UNIATA_VER_DOT 0.46.4.8 #define UNIATA_VER_MJ 0 #define UNIATA_VER_MN 46 #define UNIATA_VER_SUB_MJ 4 -#define UNIATA_VER_SUB_MN 7 -#define UNIATA_VER_DOT_COMMA 0,46,4,7 -#define UNIATA_VER_DOT_STR "0.46.4.7" +#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"