Author: apriyadarshi
Date: Thu Jun 9 23:47:19 2016
New Revision: 71605
URL:
http://svn.reactos.org/svn/reactos?rev=71605&view=rev
Log:
changes after code review
Modified:
branches/GSoC_2016/AHCI/drivers/storage/storahci/makefile
branches/GSoC_2016/AHCI/drivers/storage/storahci/storahci.c
branches/GSoC_2016/AHCI/drivers/storage/storahci/storahci.h
branches/GSoC_2016/AHCI/drivers/storage/storahci/storahci.inf
Modified: branches/GSoC_2016/AHCI/drivers/storage/storahci/makefile
URL:
http://svn.reactos.org/svn/reactos/branches/GSoC_2016/AHCI/drivers/storage/…
==============================================================================
--- branches/GSoC_2016/AHCI/drivers/storage/storahci/makefile [iso-8859-1] (original)
+++ branches/GSoC_2016/AHCI/drivers/storage/storahci/makefile [iso-8859-1] Thu Jun 9
23:47:19 2016
@@ -1,3 +1,2 @@
-
MINIMUM_NT_TARGET_VERSION=0x502
-!INCLUDE $(NTMAKEENV)\makefile.def
+!INCLUDE $(NTMAKEENV)\makefile.def
Modified: branches/GSoC_2016/AHCI/drivers/storage/storahci/storahci.c
URL:
http://svn.reactos.org/svn/reactos/branches/GSoC_2016/AHCI/drivers/storage/…
==============================================================================
--- branches/GSoC_2016/AHCI/drivers/storage/storahci/storahci.c [iso-8859-1] (original)
+++ branches/GSoC_2016/AHCI/drivers/storage/storahci/storahci.c [iso-8859-1] Thu Jun 9
23:47:19 2016
@@ -18,38 +18,59 @@
* @return
* Return true if intialization was successful
*/
-BOOLEAN AhciPortInitialize(
- __in PAHCI_PORT_EXTENSION portExtension
-)
+BOOLEAN
+AhciPortInitialize (
+ __in PAHCI_PORT_EXTENSION portExtension
+ )
{
ULONG mappedLength;
PAHCI_MEMORY_REGISTERS abar;
PAHCI_ADAPTER_EXTENSION adapterExtension;
STOR_PHYSICAL_ADDRESS commandListPhysical, receivedFISPhysical;
- StorPortDebugPrint(0, "AhciPortInitialize()\n");
+ DebugPrint("AhciPortInitialize()\n");
+
+ NT_ASSERT(portExtension != NULL);
adapterExtension = portExtension->AdapterExtension;
abar = adapterExtension->ABAR_Address;
+ NT_ASSERT(abar != NULL);
+
portExtension->Port = &abar->PortList[portExtension->PortNumber];
- commandListPhysical = StorPortGetPhysicalAddress(adapterExtension, NULL,
portExtension->CommandList, &mappedLength);
- if (mappedLength == 0 || (commandListPhysical.LowPart % 1024) != 0){
- StorPortDebugPrint(0, "\tcommandListPhysical mappedLength:%d\n",
mappedLength);
+ commandListPhysical = StorPortGetPhysicalAddress( adapterExtension,
+ NULL,
+ portExtension->CommandList,
+ &mappedLength);
+
+ if ((mappedLength) == 0 || ((commandListPhysical.LowPart % 1024) != 0))
+ {
+ DebugPrint("\tcommandListPhysical mappedLength:%d\n", mappedLength);
return FALSE;
}
- receivedFISPhysical = StorPortGetPhysicalAddress(adapterExtension, NULL,
portExtension->ReceivedFIS, &mappedLength);
- if (mappedLength == 0 || (receivedFISPhysical.LowPart % 256) != 0){
- StorPortDebugPrint(0, "\treceivedFISPhysical mappedLength:%d\n",
mappedLength);
+ receivedFISPhysical = StorPortGetPhysicalAddress( adapterExtension,
+ NULL,
+ portExtension->ReceivedFIS,
+ &mappedLength);
+
+ if ((mappedLength) == 0 || ((receivedFISPhysical.LowPart % 1024) != 0))
+ {
+ DebugPrint("\treceivedFISPhysical mappedLength:%d\n", mappedLength);
+ 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
+ // Note: Assuming 32bit support only
StorPortWriteRegisterUlong(adapterExtension, &portExtension->Port->CLB,
commandListPhysical.LowPart);
StorPortWriteRegisterUlong(adapterExtension, &portExtension->Port->FB,
receivedFISPhysical.LowPart);
@@ -76,60 +97,64 @@
* @return
* return TRUE if allocation was successful
*/
-BOOLEAN AhciAllocateResourceForAdapter(
- __in PAHCI_ADAPTER_EXTENSION adapterExtension,
- __in PPORT_CONFIGURATION_INFORMATION ConfigInfo
-)
+BOOLEAN
+AhciAllocateResourceForAdapter (
+ __in PAHCI_ADAPTER_EXTENSION adapterExtension,
+ __in PPORT_CONFIGURATION_INFORMATION ConfigInfo
+ )
{
PVOID portsExtension = NULL;
PCHAR nonCachedExtension;
- ULONG portCount, portImplemented, status, index, NCS, AlignedNCS,
nonCachedExtensionSize, currentCount;
-
- StorPortDebugPrint(0, "AhciAllocateResourceForAdapter()\n");
-
- // 3.1.1 NCS = CAP[12:08] -> Align
- NCS = (adapterExtension->CAP & 0xF00) >> 8;
- AlignedNCS = ((NCS/8) + 1) * 8;
+ ULONG status, index, NCS, AlignedNCS;
+ ULONG portCount, portImplemented, nonCachedExtensionSize;
+
+ DebugPrint("AhciAllocateResourceForAdapter()\n");
+
+ NCS = AHCI_Global_Port_CAP_NCS(adapterExtension->CAP);
+ AlignedNCS = ROUND_UP(NCS, 8);
// get port count -- Number of set bits in `adapterExtension->PortImplemented`
portCount = 0;
portImplemented = adapterExtension->PortImplemented;
- while(portImplemented > 0)
+ while (portImplemented > 0)
{
portCount++;
- portImplemented &= (portImplemented-1);
- }
- StorPortDebugPrint(0, "\tPort Count: %d\n", portCount);
+ portImplemented &= (portImplemented - 1);
+ }
+
+ NT_ASSERT(portCount != 0);
+ DebugPrint("\tPort Count: %d\n", portCount);
nonCachedExtensionSize = sizeof(AHCI_COMMAND_HEADER) * AlignedNCS + //should be 1K
aligned
sizeof(AHCI_RECEIVED_FIS);
- //align nonCachedExtensionSize to 1K
- nonCachedExtensionSize = (((nonCachedExtensionSize - 1) / 0x400) + 1) * 0x400;
- nonCachedExtensionSize *= portCount;
-
- adapterExtension->NonCachedExtension =
StorPortGetUncachedExtension(adapterExtension, ConfigInfo, nonCachedExtensionSize);
- if (adapterExtension->NonCachedExtension == NULL) {
- StorPortDebugPrint(0, "\tadapterExtension->NonCachedExtension ==
NULL\n");
+
+ // align nonCachedExtensionSize to 1024
+ nonCachedExtensionSize = ROUND_UP(nonCachedExtensionSize, 1024);
+
+ adapterExtension->NonCachedExtension = StorPortGetUncachedExtension(
adapterExtension,
+ ConfigInfo,
+
nonCachedExtensionSize * portCount);
+
+ if (adapterExtension->NonCachedExtension == NULL)
+ {
+ DebugPrint("\tadapterExtension->NonCachedExtension == NULL\n");
return FALSE;
}
- nonCachedExtension = (PCHAR)adapterExtension->NonCachedExtension;
-
- AhciZeroMemory(nonCachedExtension, nonCachedExtensionSize);
-
- nonCachedExtensionSize /= portCount;
- currentCount = 0;
+ nonCachedExtension = adapterExtension->NonCachedExtension;
+ AhciZeroMemory(nonCachedExtension, nonCachedExtensionSize * portCount);
+
for (index = 0; index < MAXIMUM_AHCI_PORT_COUNT; index++)
{
adapterExtension->PortExtension[index].IsActive = FALSE;
- if ((adapterExtension->PortImplemented & (1<<index)) != 0)
+ if ((adapterExtension->PortImplemented & (1 << index)) != 0)
{
adapterExtension->PortExtension[index].PortNumber = index;
adapterExtension->PortExtension[index].IsActive = TRUE;
adapterExtension->PortExtension[index].AdapterExtension =
adapterExtension;
- adapterExtension->PortExtension[index].CommandList =
(PAHCI_COMMAND_HEADER)(nonCachedExtension + (currentCount*nonCachedExtensionSize));
- adapterExtension->PortExtension[index].ReceivedFIS =
(PAHCI_RECEIVED_FIS)((PCHAR)adapterExtension->PortExtension[index].CommandList +
sizeof(AHCI_COMMAND_HEADER) * AlignedNCS);
- currentCount++;
+ adapterExtension->PortExtension[index].CommandList = nonCachedExtension;
+ adapterExtension->PortExtension[index].ReceivedFIS =
(PAHCI_RECEIVED_FIS)(nonCachedExtension + sizeof(AHCI_COMMAND_HEADER) * AlignedNCS);
+ nonCachedExtension += nonCachedExtensionSize;
}
}
@@ -147,29 +172,30 @@
* @return
* return TRUE if intialization was successful
*/
-BOOLEAN AhciHwInitialize(
- __in PVOID AdapterExtension
-)
+BOOLEAN
+AhciHwInitialize (
+ __in PVOID AdapterExtension
+ )
{
ULONG ghc, messageCount, status;
PAHCI_ADAPTER_EXTENSION adapterExtension;
- StorPortDebugPrint(0, "AhciHwInitialize()\n");
-
- adapterExtension = (PAHCI_ADAPTER_EXTENSION)AdapterExtension;
+ DebugPrint("AhciHwInitialize()\n");
+
+ adapterExtension = AdapterExtension;
adapterExtension->StateFlags.MessagePerPort = FALSE;
// First check what type of interrupt/synchronization device is using
ghc = StorPortReadRegisterUlong(adapterExtension,
&adapterExtension->ABAR_Address->GHC);
- //When set to â1â by hardware, indicates that the HBA requested more than one MSI
vector
- //but has reverted to using the first vector only. When this bit is cleared to
â0â,
- //the HBA has not reverted to single MSI mode (i.e. hardware is already in single MSI
mode,
- //software has allocated the number of messages requested
+ // When set to â1â by hardware, indicates that the HBA requested more than one
MSI vector
+ // but has reverted to using the first vector only. When this bit is cleared to
â0â,
+ // the HBA has not reverted to single MSI mode (i.e. hardware is already in single
MSI mode,
+ // software has allocated the number of messages requested
if ((ghc & AHCI_Global_HBA_CONTROL_MRSM) == 0)
{
adapterExtension->StateFlags.MessagePerPort = TRUE;
- StorPortDebugPrint(0, "\tMultiple MSI based message not supported\n");
+ DebugPrint("\tMultiple MSI based message not supported\n");
}
return TRUE;
@@ -184,12 +210,13 @@
* @param portExtension
*
*/
-VOID AhciInterruptHandler(
- __in PAHCI_PORT_EXTENSION portExtension
-)
-{
- StorPortDebugPrint(0, "AhciInterruptHandler()\n");
- StorPortDebugPrint(0, "\tPort Number: %d\n",
portExtension->PortNumber);
+VOID
+AhciInterruptHandler (
+ __in PAHCI_PORT_EXTENSION portExtension
+ )
+{
+ DebugPrint("AhciInterruptHandler()\n");
+ DebugPrint("\tPort Number: %d\n", portExtension->PortNumber);
}// -- AhciInterruptHandler();
@@ -205,26 +232,31 @@
* return TRUE Indicates that an interrupt was pending on adapter.
* return FALSE Indicates the interrupt was not ours.
*/
-BOOLEAN AhciHwInterrupt(
- __in PVOID AdapterExtension
-)
+BOOLEAN
+AhciHwInterrupt(
+ __in PVOID AdapterExtension
+ )
{
ULONG portPending, nextPort, i;
PAHCI_ADAPTER_EXTENSION adapterExtension;
- StorPortDebugPrint(0, "AhciHwInterrupt()\n");
-
- adapterExtension = (PAHCI_ADAPTER_EXTENSION)AdapterExtension;
+ DebugPrint("AhciHwInterrupt()\n");
+
+ adapterExtension = AdapterExtension;
if (adapterExtension->StateFlags.Removed)
+ {
return FALSE;
+ }
portPending = StorPortReadRegisterUlong(adapterExtension, adapterExtension->IS);
// we process interrupt for implemented ports only
portPending = portPending & adapterExtension->PortImplemented;
if (portPending == 0)
+ {
return FALSE;
+ }
for (i = 1; i <= MAXIMUM_AHCI_PORT_COUNT; i++)
{
@@ -233,16 +265,19 @@
if ((portPending & (0x1 << nextPort)) == 0)
continue;
- if (nextPort == adapterExtension->LastInterruptPort
- || adapterExtension->PortExtension[nextPort].IsActive == FALSE)
+ if ((nextPort == adapterExtension->LastInterruptPort)
+ || (adapterExtension->PortExtension[nextPort].IsActive == FALSE))
+ {
return FALSE;
+ }
// we can assign this interrupt to this port
adapterExtension->LastInterruptPort = nextPort;
- AhciInterruptHandler(nextPort);
+ AhciInterruptHandler(&adapterExtension->PortExtension[nextPort]);
return TRUE;
}
+ DebugPrint("\tSomething wrong");
return FALSE;
}// -- AhciHwInterrupt();
@@ -259,20 +294,20 @@
* return TRUE if the request was accepted
* return FALSE if the request must be submitted later
*/
-BOOLEAN AhciHwStartIo(
- __in PVOID AdapterExtension,
- __in PSCSI_REQUEST_BLOCK Srb
-
-)
+BOOLEAN
+AhciHwStartIo (
+ __in PVOID AdapterExtension,
+ __in PSCSI_REQUEST_BLOCK Srb
+ )
{
UCHAR function, pathId;
PAHCI_ADAPTER_EXTENSION adapterExtension;
- StorPortDebugPrint(0, "AhciHwStartIo()\n");
+ DebugPrint("AhciHwStartIo()\n");
pathId = Srb->PathId;
function = Srb->Function;
- adapterExtension = (PAHCI_ADAPTER_EXTENSION)AdapterExtension;
+ adapterExtension = AdapterExtension;
if (!IsPortValid(adapterExtension, pathId))
{
@@ -291,20 +326,23 @@
pnpRequest = (PSCSI_PNP_REQUEST_BLOCK)Srb;
if ((pnpRequest->SrbPnPFlags & SRB_PNP_FLAGS_ADAPTER_REQUEST) != 0)
{
- if (pnpRequest->PnPAction == StorRemoveDevice ||
- pnpRequest->PnPAction == StorSurpriseRemoval)
+ if ((pnpRequest->PnPAction == StorRemoveDevice) ||
+ (pnpRequest->PnPAction == StorSurpriseRemoval))
{
Srb->SrbStatus = SRB_STATUS_SUCCESS;
adapterExtension->StateFlags.Removed = 1;
- StorPortDebugPrint(0, "\tadapter removed\n");
+ DebugPrint("\tadapter removed\n");
}
else if (pnpRequest->PnPAction == StorStopDevice)
{
Srb->SrbStatus = SRB_STATUS_SUCCESS;
- StorPortDebugPrint(0, "\tRequested to Stop the adapter\n");
+ DebugPrint("\tRequested to Stop the adapter\n");
}
else
+ {
Srb->SrbStatus = SRB_STATUS_INVALID_REQUEST;
+ }
+
StorPortNotification(RequestComplete, adapterExtension, Srb);
return TRUE;
}
@@ -346,7 +384,7 @@
}
}
- StorPortDebugPrint(0, "\tUnknow function code recieved: %x\n", function);
+ DebugPrint("\tUnknow function code recieved: %x\n", function);
Srb->SrbStatus = SRB_STATUS_BAD_FUNCTION;
StorPortNotification(RequestComplete, adapterExtension, Srb);
return TRUE;
@@ -354,7 +392,7 @@
/**
* @name AhciHwResetBus
- * @implemented
+ * @not_implemented
*
* The HwStorResetBus routine is called by the port driver to clear error conditions.
*
@@ -364,17 +402,17 @@
* @return
* return TRUE if bus was successfully reset
*/
-BOOLEAN AhciHwResetBus(
- __in PVOID AdapterExtension,
- __in ULONG PathId
-
-)
+BOOLEAN
+AhciHwResetBus (
+ __in PVOID AdapterExtension,
+ __in ULONG PathId
+ )
{
PAHCI_ADAPTER_EXTENSION adapterExtension;
- StorPortDebugPrint(0, "AhciHwResetBus()\n");
-
- adapterExtension = (PAHCI_ADAPTER_EXTENSION)AdapterExtension;
+ DebugPrint("AhciHwResetBus()\n");
+
+ adapterExtension = AdapterExtension;
return FALSE;
}// -- AhciHwResetBus();
@@ -411,28 +449,30 @@
*
* @remarks Called by Storport.
*/
-ULONG AhciHwFindAdapter(
- __in PVOID AdapterExtension,
- __in PVOID HwContext,
- __in PVOID BusInformation,
- __in PVOID ArgumentString,
- __inout PPORT_CONFIGURATION_INFORMATION ConfigInfo,
- __in PBOOLEAN Reserved3
-)
+ULONG
+AhciHwFindAdapter (
+ __in PVOID AdapterExtension,
+ __in PVOID HwContext,
+ __in PVOID BusInformation,
+ __in PVOID ArgumentString,
+ __inout PPORT_CONFIGURATION_INFORMATION ConfigInfo,
+ __in PBOOLEAN Reserved3
+ )
{
ULONG ghc;
ULONG index;
ULONG portCount, portImplemented;
ULONG pci_cfg_len;
- UCHAR pci_cfg_buf[0x30];
+ UCHAR pci_cfg_buf[sizeof(PCI_COMMON_CONFIG)];
+ PACCESS_RANGE accessRange;
PAHCI_MEMORY_REGISTERS abar;
PPCI_COMMON_CONFIG pciConfigData;
PAHCI_ADAPTER_EXTENSION adapterExtension;
- StorPortDebugPrint(0, "AhciHwFindAdapter()\n");
-
- adapterExtension = (PAHCI_ADAPTER_EXTENSION)AdapterExtension;
+ DebugPrint("AhciHwFindAdapter()\n");
+
+ adapterExtension = AdapterExtension;
adapterExtension->SlotNumber = ConfigInfo->SlotNumber;
adapterExtension->SystemIoBusNumber = ConfigInfo->SystemIoBusNumber;
@@ -442,22 +482,23 @@
PCIConfiguration,
adapterExtension->SystemIoBusNumber,
adapterExtension->SlotNumber,
- (PVOID)pci_cfg_buf,
- (ULONG)0x30);
-
- if (pci_cfg_len != 0x30){
- StorPortDebugPrint(0, "\tpci_cfg_len != 0x30 :: %d", pci_cfg_len);
+ pci_cfg_buf,
+ sizeof(PCI_COMMON_CONFIG));
+
+ if (pci_cfg_len != sizeof(PCI_COMMON_CONFIG))
+ {
+ DebugPrint("\tpci_cfg_len != %d :: %d", sizeof(PCI_COMMON_CONFIG),
pci_cfg_len);
return SP_RETURN_ERROR;//Not a valid device at the given bus number
}
- pciConfigData = (PPCI_COMMON_CONFIG)pci_cfg_buf;
+ pciConfigData = pci_cfg_buf;
adapterExtension->VendorID = pciConfigData->VendorID;
adapterExtension->DeviceID = pciConfigData->DeviceID;
adapterExtension->RevisionID = pciConfigData->RevisionID;
// The last PCI base address register (BAR[5], header offset 0x24) points to the AHCI
base memory, itâs called ABAR (AHCI Base Memory Register).
adapterExtension->AhciBaseAddress = pciConfigData->u.type0.BaseAddresses[5]
& (0xFFFFFFF0);
- StorPortDebugPrint(0, "\tVendorID:%d DeviceID:%d RevisionID:%d\n",
adapterExtension->VendorID, adapterExtension->DeviceID,
adapterExtension->RevisionID);
+ DebugPrint("\tVendorID:%d DeviceID:%d RevisionID:%d\n",
adapterExtension->VendorID, adapterExtension->DeviceID,
adapterExtension->RevisionID);
// 2.1.11
abar = NULL;
@@ -465,22 +506,24 @@
{
for (index = 0; index < ConfigInfo->NumberOfAccessRanges; index++)
{
- if ((*(ConfigInfo->AccessRanges))[index].RangeStart.QuadPart ==
adapterExtension->AhciBaseAddress)
+ accessRange = *ConfigInfo->AccessRanges;
+ if (accessRange[index].RangeStart.QuadPart ==
adapterExtension->AhciBaseAddress)
{
- abar = (PAHCI_MEMORY_REGISTERS)StorPortGetDeviceBase(
+ abar = StorPortGetDeviceBase(
adapterExtension,
ConfigInfo->AdapterInterfaceType,
ConfigInfo->SystemIoBusNumber,
- (*(ConfigInfo->AccessRanges))[index].RangeStart,
- (*(ConfigInfo->AccessRanges))[index].RangeLength,
-
(BOOLEAN)!(*(ConfigInfo->AccessRanges))[index].RangeInMemory);
+ accessRange[index].RangeStart,
+ accessRange[index].RangeLength,
+ !accessRange[index].RangeInMemory);
break;
}
}
}
- if (abar == NULL){
- StorPortDebugPrint(0, "\tabar == NULL\n");
+ if (abar == NULL)
+ {
+ DebugPrint("\tabar == NULL\n");
return SP_RETURN_ERROR; // corrupted information supplied
}
@@ -498,9 +541,9 @@
if ((ghc & AHCI_Global_HBA_CONTROL_AE) != 0)//Hmm, controller was already in
power state
{
// reset controller to have it in known state
- StorPortDebugPrint(0, "\tAE Already set, Reset()\n");
+ DebugPrint("\tAE Already set, Reset()\n");
if (!AhciAdapterReset(adapterExtension)){
- StorPortDebugPrint(0, "\tReset Failed!\n");
+ DebugPrint("\tReset Failed!\n");
return SP_RETURN_ERROR;// reset failed
}
}
@@ -511,12 +554,13 @@
adapterExtension->IS = &abar->IS;
adapterExtension->PortImplemented = StorPortReadRegisterUlong(adapterExtension,
&abar->PI);
- if (adapterExtension->PortImplemented == 0){
- StorPortDebugPrint(0, "\tadapterExtension->PortImplemented ==
0\n");
+ if (adapterExtension->PortImplemented == 0)
+ {
+ DebugPrint("\tadapterExtension->PortImplemented == 0\n");
return SP_RETURN_ERROR;
}
- ConfigInfo->MaximumTransferLength = 128 * 1024;//128 KB
+ ConfigInfo->MaximumTransferLength = MAXIMUM_TRANSFER_LENGTH;//128 KB
ConfigInfo->NumberOfPhysicalBreaks = 0x21;
ConfigInfo->MaximumNumberOfTargets = 1;
ConfigInfo->MaximumNumberOfLogicalUnits = 1;
@@ -530,8 +574,9 @@
StorPortWriteRegisterUlong(adapterExtension, &abar->GHC, ghc);
// allocate necessary resource for each port
- if (!AhciAllocateResourceForAdapter(adapterExtension, ConfigInfo)){
- StorPortDebugPrint(0, "\tAhciAllocateResourceForAdapter() ==
FALSE\n");
+ if (!AhciAllocateResourceForAdapter(adapterExtension, ConfigInfo))
+ {
+ DebugPrint("\tAhciAllocateResourceForAdapter() == FALSE\n");
return SP_RETURN_ERROR;
}
@@ -556,18 +601,19 @@
* @return
* NT_STATUS in case of driver loaded successfully.
*/
-ULONG DriverEntry(
- __in PVOID DriverObject,
- __in PVOID RegistryPath
-)
+ULONG
+DriverEntry (
+ __in PVOID DriverObject,
+ __in PVOID RegistryPath
+ )
{
HW_INITIALIZATION_DATA hwInitializationData;
ULONG i, status;
- StorPortDebugPrint(0, "Storahci Loaded\n");
+ DebugPrint("Storahci Loaded\n");
// initialize the hardware data structure
- AhciZeroMemory((PCHAR)&hwInitializationData, sizeof(HW_INITIALIZATION_DATA));
+ AhciZeroMemory(&hwInitializationData, sizeof(HW_INITIALIZATION_DATA));
// set size of hardware initialization structure
hwInitializationData.HwInitializationDataSize = sizeof(HW_INITIALIZATION_DATA);
@@ -600,7 +646,7 @@
&hwInitializationData,
NULL);
- StorPortDebugPrint(0, "\tstatus:%x\n", status);
+ DebugPrint("\tstatus:%x\n", status);
return status;
}// -- DriverEntry();
@@ -623,29 +669,38 @@
* @return
* TRUE in case AHCI Controller RESTARTED successfully. i.e GHC.HR == 0
*/
-BOOLEAN AhciAdapterReset(
- __in PAHCI_ADAPTER_EXTENSION adapterExtension
-)
+BOOLEAN
+AhciAdapterReset (
+ __in PAHCI_ADAPTER_EXTENSION adapterExtension
+ )
{
ULONG ghc, ticks;
PAHCI_MEMORY_REGISTERS abar = NULL;
- StorPortDebugPrint(0, "AhciAdapterReset()\n");
+ DebugPrint("AhciAdapterReset()\n");
abar = adapterExtension->ABAR_Address;
if (abar == NULL) // basic sanity
+ {
return FALSE;
+ }
// HR -- Very first bit (lowest significant)
ghc = AHCI_Global_HBA_CONTROL_HR;
StorPortWriteRegisterUlong(adapterExtension, &abar->GHC, ghc);
- for (ticks = 0; (ticks < 50) &&
- (StorPortReadRegisterUlong(adapterExtension, &abar->GHC) ==
1);
- StorPortStallExecution(20000), ticks++);
-
- if (ticks == 50) { //1 second
- StorPortDebugPrint(0, "\tDevice Timeout\n");
+ for (ticks = 0; ticks < 50; ++ticks)
+ {
+ if ((StorPortReadRegisterUlong(adapterExtension, &abar->GHC) &
AHCI_Global_HBA_CONTROL_HR) == 0)
+ {
+ break;
+ }
+ StorPortStallExecution(20000);
+ }
+
+ if (ticks == 50)// 1 second
+ {
+ DebugPrint("\tDevice Timeout\n");
return FALSE;
}
@@ -661,10 +716,11 @@
* @param buffer
*/
__inline
-VOID AhciZeroMemory(
- __in PCHAR buffer,
- __in ULONG bufferSize
-)
+VOID
+AhciZeroMemory (
+ __out PCHAR buffer,
+ __in ULONG bufferSize
+ )
{
ULONG i;
for (i = 0; i < bufferSize; i++)
@@ -684,13 +740,18 @@
* return TRUE if provided port is valid (implemented) or not
*/
__inline
-BOOLEAN IsPortValid(
- __in PAHCI_ADAPTER_EXTENSION adapterExtension,
- __in UCHAR pathId
-)
-{
+BOOLEAN
+IsPortValid (
+ __in PAHCI_ADAPTER_EXTENSION adapterExtension,
+ __in UCHAR pathId
+ )
+{
+ NT_ASSERT(pathId >= 0);
+
if (pathId >= MAXIMUM_AHCI_PORT_COUNT)
+ {
return FALSE;
+ }
return adapterExtension->PortExtension[pathId].IsActive;
}// -- IsPortValid()
@@ -711,26 +772,27 @@
* @remark
*
http://www.seagate.com/staticfiles/support/disc/manuals/Interface%20manuals…
*/
-ULONG DeviceInquiryRequest(
- __in PAHCI_ADAPTER_EXTENSION adapterExtension,
- __in PSCSI_REQUEST_BLOCK Srb,
- __in PCDB Cdb
-)
+ULONG
+DeviceInquiryRequest (
+ __in PAHCI_ADAPTER_EXTENSION adapterExtension,
+ __in PSCSI_REQUEST_BLOCK Srb,
+ __in PCDB Cdb
+ )
{
PVOID DataBuffer;
ULONG DataBufferLength;
- StorPortDebugPrint(0, "DeviceInquiryRequest()\n");
+ DebugPrint("DeviceInquiryRequest()\n");
// 3.6.1
// If the EVPD bit is set to zero, the device server shall return the standard
INQUIRY data
if (Cdb->CDB6INQUIRY3.EnableVitalProductData == 0)
{
- StorPortDebugPrint(0, "\tEVPD Inquired\n");
+ DebugPrint("\tEVPD Inquired\n");
}
else
{
- StorPortDebugPrint(0, "\tVPD Inquired\n");
+ DebugPrint("\tVPD Inquired\n");
DataBuffer = Srb->DataBuffer;
DataBufferLength = Srb->DataTransferLength;
@@ -738,7 +800,7 @@
if (DataBuffer == NULL)
return SRB_STATUS_INVALID_REQUEST;
- AhciZeroMemory((PCHAR)DataBuffer, DataBufferLength);
+ AhciZeroMemory(DataBuffer, DataBufferLength);
}
return SRB_STATUS_BAD_FUNCTION;
Modified: branches/GSoC_2016/AHCI/drivers/storage/storahci/storahci.h
URL:
http://svn.reactos.org/svn/reactos/branches/GSoC_2016/AHCI/drivers/storage/…
==============================================================================
--- branches/GSoC_2016/AHCI/drivers/storage/storahci/storahci.h [iso-8859-1] (original)
+++ branches/GSoC_2016/AHCI/drivers/storage/storahci/storahci.h [iso-8859-1] Thu Jun 9
23:47:19 2016
@@ -5,17 +5,28 @@
* PROGRAMMERS: Aman Priyadarshi (aman.eureka(a)gmail.com)
*/
-#include "miniport.h"
-#include "storport.h"
-
-#define AHCI_POOL_TAG 'ahci'
-#define MAXIMUM_AHCI_PORT_COUNT 12
+#include <ntddk.h>
+#include <storport.h>
+
+#define DEBUG 1
+
+#define MAXIMUM_AHCI_PORT_COUNT 12
+#define MAXIMUM_TRANSFER_LENGTH (128*1024) // 128 KB
// section 3.1.2
-#define AHCI_Global_HBA_CONTROL_HR (0x1<<0)
-#define AHCI_Global_HBA_CONTROL_IE (0x1<<1)
-#define AHCI_Global_HBA_CONTROL_MRSM (0x1<<2)
-#define AHCI_Global_HBA_CONTROL_AE (0x1<<31)
+#define AHCI_Global_HBA_CONTROL_HR (1 << 0)
+#define AHCI_Global_HBA_CONTROL_IE (1 << 1)
+#define AHCI_Global_HBA_CONTROL_MRSM (1 << 2)
+#define AHCI_Global_HBA_CONTROL_AE (1 << 31)
+#define AHCI_Global_HBA_CAP_S64A (1 << 31)
+
+// 3.1.1 NCS = CAP[12:08] -> Align
+#define AHCI_Global_Port_CAP_NCS(x) (((x) & 0xF00) >> 8)
+
+#define ROUND_UP(N, S) ((((N) + (S) - 1) / (S)) * (S))
+#if DEBUG
+ #define DebugPrint(format, ...) StorPortDebugPrint(0, format, __VA_ARGS__)
+#endif
//////////////////////////////////////////////////////////////
// ---- Support Structures --- //
@@ -32,17 +43,17 @@
UCHAR Reserved[2]; // Reserved
ULONG DmaBufferLow; // DMA Buffer Identifier. Used to Identify DMA buffer in host
memory. SATA Spec says host specific and not in Spec. Trying AHCI spec might work.
ULONG DmaBufferHigh;
- ULONG Reserved2; //More reserved
- ULONG DmaBufferOffset; //Byte offset into buffer. First 2 bits must be 0
- ULONG TranferCount; //Number of bytes to transfer. Bit 0 must be 0
- ULONG Reserved3; //Reserved
+ ULONG Reserved2; // More reserved
+ ULONG DmaBufferOffset; // Byte offset into buffer. First 2 bits must be 0
+ ULONG TranferCount; // Number of bytes to transfer. Bit 0 must be 0
+ ULONG Reserved3; // Reserved
} AHCI_FIS_DMA_SETUP;
typedef struct _AHCI_PIO_SETUP_FIS
{
- UCHAR FisType; //0x5F
+ UCHAR FisType;
UCHAR Reserved1 :5;
- UCHAR D :1; // 1 is write (device to host)
+ UCHAR D :1;
UCHAR I :1;
UCHAR Reserved2 :1;
UCHAR Status;
@@ -237,24 +248,28 @@
// Declarations //
//////////////////////////////////////////////////////////////
-BOOLEAN AhciAdapterReset(
- __in PAHCI_ADAPTER_EXTENSION adapterExtension
-);
+BOOLEAN
+AhciAdapterReset (
+ __in PAHCI_ADAPTER_EXTENSION adapterExtension
+ );
__inline
-VOID AhciZeroMemory(
- __in PCHAR buffer,
- __in ULONG bufferSize
-);
+VOID
+AhciZeroMemory (
+ __out PCHAR buffer,
+ __in ULONG bufferSize
+ );
__inline
-BOOLEAN IsPortValid(
- __in PAHCI_ADAPTER_EXTENSION adapterExtension,
- __in UCHAR pathId
-);
-
-ULONG DeviceInquiryRequest(
- __in PAHCI_ADAPTER_EXTENSION adapterExtension,
- __in PSCSI_REQUEST_BLOCK Srb,
- __in PCDB Cdb
-);
+BOOLEAN
+IsPortValid (
+ __in PAHCI_ADAPTER_EXTENSION adapterExtension,
+ __in UCHAR pathId
+ );
+
+ULONG
+DeviceInquiryRequest (
+ __in PAHCI_ADAPTER_EXTENSION adapterExtension,
+ __in PSCSI_REQUEST_BLOCK Srb,
+ __in PCDB Cdb
+ );
Modified: branches/GSoC_2016/AHCI/drivers/storage/storahci/storahci.inf
URL:
http://svn.reactos.org/svn/reactos/branches/GSoC_2016/AHCI/drivers/storage/…
==============================================================================
--- branches/GSoC_2016/AHCI/drivers/storage/storahci/storahci.inf [iso-8859-1] (original)
+++ branches/GSoC_2016/AHCI/drivers/storage/storahci/storahci.inf [iso-8859-1] Thu Jun 9
23:47:19 2016
@@ -1,9 +1,9 @@
-/*
- * PROJECT: ROS Kernel
- * LICENSE: GNU GPLv2 only as published by the Free Software Foundation
- * PURPOSE: Storahci Driver INF
- * PROGRAMMERS: Aman Priyadarshi (aman.eureka(a)gmail.com)
- */
+;
+; PROJECT: ROS Kernel
+; LICENSE: GNU GPLv2 only as published by the Free Software Foundation
+; PURPOSE: Storahci Driver INF
+; PROGRAMMERS: Aman Priyadarshi (aman.eureka(a)gmail.com)
+;
[version]
signature="$Windows NT$"
@@ -21,7 +21,7 @@
DefaultDestDir = 12 ; DIRID_DRIVERS
[Manufacturer]
-%STORAHCI%=STORAHCI,NTx86
+%ROS%=STORAHCI,NTx86
[STORAHCI]
@@ -65,7 +65,7 @@
HKR,,TypesSupported,%REG_DWORD%,7
[Strings]
-ROS = "React OS"
+ROS = "ROS"
DeviceDesc = "AHCI SATA Driver"
SATA_AHCI.DeviceDesc = "Standard SATA AHCI Controller"