diff --git a/drivers/storage/storahci/CMakeLists.txt b/drivers/storage/storahci/CMakeLists.txt new file mode 100644 index 00000000000..0f09d56ef09 --- /dev/null +++ b/drivers/storage/storahci/CMakeLists.txt @@ -0,0 +1,28 @@ + +set_cpp() + +include_directories( + BEFORE ${CMAKE_CURRENT_SOURCE_DIR} + inc) + +#add_definitions(-DDEBUG) + +list(APPEND SOURCE + storahci.cpp + ros_glue/ros_glue.cpp + stdafx.h) + +add_library(storahci SHARED ${SOURCE} storahci.rc) + +if(NOT MSVC) + add_target_compile_flags(storahci "-Wno-narrowing") + if(NOT CMAKE_C_COMPILER_ID STREQUAL "Clang") + add_target_compile_flags(storahci "-Wno-unused-but-set-variable") + endif() +endif() + +add_pch(storahci stdafx.h SOURCE) +set_module_type(storahci kernelmodedriver) +add_importlibs(storahci storport ntoskrnl hal) +add_cd_file(TARGET storahci DESTINATION reactos/system32/drivers NO_CAB FOR all) +add_registry_inf(storahci.inf) diff --git a/drivers/storage/storahci/sources b/drivers/storage/storahci/sources index a586e71368b..a1772aeb55f 100644 --- a/drivers/storage/storahci/sources +++ b/drivers/storage/storahci/sources @@ -6,4 +6,5 @@ TARGETLIBS=$(DDK_LIB_PATH)\storport.lib INCLUDES = %BUILD%\inc LIBS = %BUILD%\lib -SOURCES = storahci.c +SOURCES = storahci.c \ + storahci.rc diff --git a/drivers/storage/storahci/storahci.c b/drivers/storage/storahci/storahci.c index b81c76c8487..473e88cd483 100644 --- a/drivers/storage/storahci/storahci.c +++ b/drivers/storage/storahci/storahci.c @@ -61,18 +61,21 @@ AhciPortInitialize ( return FALSE; } - if ((adapterExtension->CAP & AHCI_Global_HBA_CAP_S64A) != 0) - { - DebugPrint("\tCAP.S64A not supported\n"); - return FALSE; - } - // 10.1.2 For each implemented port, system software shall allocate memory for and program: //  PxCLB and PxCLBU (if CAP.S64A is set to ‘1’) //  PxFB and PxFBU (if CAP.S64A is set to ‘1’) // Note: Assuming 32bit support only StorPortWriteRegisterUlong(adapterExtension, &PortExtension->Port->CLB, commandListPhysical.LowPart); + if ((adapterExtension->CAP & AHCI_Global_HBA_CAP_S64A) != 0) + { + StorPortWriteRegisterUlong(adapterExtension, &PortExtension->Port->CLBU, commandListPhysical.HighPart); + } + StorPortWriteRegisterUlong(adapterExtension, &PortExtension->Port->FB, receivedFISPhysical.LowPart); + if ((adapterExtension->CAP & AHCI_Global_HBA_CAP_S64A) != 0) + { + StorPortWriteRegisterUlong(adapterExtension, &PortExtension->Port->FBU, receivedFISPhysical.HighPart); + } // set device power state flag to D0 PortExtension->DevicePowerState = StorPowerDeviceD0; @@ -207,14 +210,17 @@ AhciHwInitialize ( /** * @name AhciInterruptHandler - * @implemented + * @not_implemented * * Interrupt Handler for PortExtension * * @param PortExtension * + * @return + * return TRUE Indicates the interrupt was handled correctly + * return FALSE Indicates something went wrong */ -VOID +BOOLEAN AhciInterruptHandler ( __in PAHCI_PORT_EXTENSION PortExtension ) @@ -222,6 +228,7 @@ AhciInterruptHandler ( DebugPrint("AhciInterruptHandler()\n"); DebugPrint("\tPort Number: %d\n", PortExtension->PortNumber); + return FALSE; }// -- AhciInterruptHandler(); /** @@ -277,11 +284,10 @@ AhciHwInterrupt( // we can assign this interrupt to this port adapterExtension->LastInterruptPort = nextPort; - AhciInterruptHandler(&adapterExtension->PortExtension[nextPort]); - return TRUE; + return AhciInterruptHandler(&adapterExtension->PortExtension[nextPort]); } - DebugPrint("\tSomething wrong"); + DebugPrint("\tSomething went wrong"); return FALSE; }// -- AhciHwInterrupt(); @@ -376,7 +382,6 @@ AhciHwStartIo ( { Srb->SrbStatus = DeviceInquiryRequest(adapterExtension, Srb, cdb); StorPortNotification(RequestComplete, adapterExtension, Srb); - return TRUE; } } @@ -418,6 +423,11 @@ AhciHwResetBus ( adapterExtension = AdapterExtension; + if (IsPortValid(AdapterExtension, PathId)) + { + // TODO: Reset Port + } + return FALSE; }// -- AhciHwResetBus(); @@ -515,13 +525,12 @@ AhciHwFindAdapter ( accessRange = *ConfigInfo->AccessRanges; if (accessRange[index].RangeStart.QuadPart == adapterExtension->AhciBaseAddress) { - abar = StorPortGetDeviceBase( - adapterExtension, - ConfigInfo->AdapterInterfaceType, - ConfigInfo->SystemIoBusNumber, - accessRange[index].RangeStart, - accessRange[index].RangeLength, - !accessRange[index].RangeInMemory); + abar = StorPortGetDeviceBase(adapterExtension, + ConfigInfo->AdapterInterfaceType, + ConfigInfo->SystemIoBusNumber, + accessRange[index].RangeStart, + accessRange[index].RangeLength, + !accessRange[index].RangeInMemory); break; } } @@ -647,11 +656,10 @@ DriverEntry ( hwInitializationData.DeviceExtensionSize = sizeof(AHCI_ADAPTER_EXTENSION); // register our hw init data - status = StorPortInitialize( - DriverObject, - RegistryPath, - &hwInitializationData, - NULL); + status = StorPortInitialize(DriverObject, + RegistryPath, + &hwInitializationData, + NULL); DebugPrint("\tstatus:%x\n", status); return status; @@ -767,6 +775,63 @@ IsPortValid ( return AdapterExtension->PortExtension[pathId].IsActive; }// -- IsPortValid() +/** + * @name AhciProcessIO + * @not_implemented + * + * Acquire Exclusive lock to port, populate pending commands to command List + * program controller's port to process new commands in command list. + * + * @param AdapterExtension + * @param pathId + * @param Srb + * + */ +VOID +AhciProcessIO ( + __in PAHCI_ADAPTER_EXTENSION AdapterExtension, + __in UCHAR pathId + ) +{ + STOR_LOCK_HANDLE lockhandle; + PAHCI_PORT_EXTENSION PortExtension; + ULONG commandSlotMask, occupiedSlots, slotIndex; + + DebugPrint("AhciProcessIO()\n"); + DebugPrint("\tPathId: %d\n", pathId); + + PortExtension = &AdapterExtension->PortExtension[pathId]; + + NT_ASSERT(pathId < MAXIMUM_AHCI_PORT_COUNT); + + if (PortExtension->IsActive == FALSE) + return; // we should wait for device to get active + + AhciZeroMemory(&lockhandle, sizeof(lockhandle)); + + // Acquire Lock + StorPortAcquireSpinLock(AdapterExtension, InterruptLock, NULL, &lockhandle); + + occupiedSlots = PortExtension->OccupiedSlots; // Busy command slots for given port + commandSlotMask = (1 << AHCI_Global_Port_CAP_NCS(AdapterExtension->CAP)) - 1; // available slots mask + + commandSlotMask = (commandSlotMask & ~occupiedSlots); + if(commandSlotMask != 0) + { + for (slotIndex = 0; slotIndex <= AHCI_Global_Port_CAP_NCS(AdapterExtension->CAP); slotIndex++) + { + // find first free slot + if ((commandSlotMask & (1 << slotIndex)) != 0) + { + // TODO: remove from queue and process it + } + } + } + + // Release Lock + StorPortReleaseSpinLock(AdapterExtension, &lockhandle); +}// -- AhciProcessIO(); + /** * @name DeviceInquiryRequest * @implemented @@ -816,5 +881,6 @@ DeviceInquiryRequest ( AhciZeroMemory(DataBuffer, DataBufferLength); } - return SRB_STATUS_BAD_FUNCTION; + AhciProcessIO(AdapterExtension, Srb->PathId, Srb); + return SRB_STATUS_SUCCESS; }// -- DeviceInquiryRequest(); diff --git a/drivers/storage/storahci/storahci.h b/drivers/storage/storahci/storahci.h index 8181138d2ec..07a2749a916 100644 --- a/drivers/storage/storahci/storahci.h +++ b/drivers/storage/storahci/storahci.h @@ -199,6 +199,7 @@ typedef struct _AHCI_MEMORY_REGISTERS typedef struct _AHCI_PORT_EXTENSION { ULONG PortNumber; + ULONG OccupiedSlots; // slots to which we have already assigned task BOOLEAN IsActive; PAHCI_PORT Port; // AHCI Port Infomation PAHCI_RECEIVED_FIS ReceivedFIS; diff --git a/drivers/storage/storahci/storahci.rc b/drivers/storage/storahci/storahci.rc new file mode 100644 index 00000000000..1cc6dbff11a --- /dev/null +++ b/drivers/storage/storahci/storahci.rc @@ -0,0 +1,22 @@ +// +// PROJECT: ReactOS Kernel +// LICENSE: GNU GPLv2 only as published by the Free Software Foundation +// PURPOSE: To Implement AHCI Miniport driver targeting storport NT 5.2 +// PROGRAMMERS: Aman Priyadarshi (aman.eureka@gmail.com) +// + +#define VERSION 1 +#define VERSION_STR "1.0" + +#define REACTOS_FILETYPE VFT_DRV +#define REACTOS_FILESUBTYPE VFT2_DRV_SYSTEM +#define REACTOS_FILEVERSION VERSION +#define REACTOS_PRODUCTVERSION VERSION +#define REACTOS_STR_COMPANY_NAME "ReactOS Development Team" +#define REACTOS_STR_FILE_DESCRIPTION "AHCI Storport Miniport Driver" +#define REACTOS_STR_FILE_VERSION VERSION_STR +#define REACTOS_STR_INTERNAL_NAME "storahci.sys" +#define REACTOS_STR_ORIGINAL_FILENAME "storahci.sys" +#define REACTOS_STR_LEGAL_COPYRIGHT "Copyright 2010 ReactOS Team" +#define REACTOS_STR_PRODUCT_NAME "AHCI Driver for ReactOS" +#define REACTOS_STR_PRODUCT_VERSION VERSION_STR