Author: apriyadarshi
Date: Mon Jun 27 12:58:04 2016
New Revision: 71681
URL:
http://svn.reactos.org/svn/reactos?rev=71681&view=rev
Log:
Next: Interrupt Handler for completed FIS commands.
Notes.txt
Modified:
branches/GSoC_2016/AHCI/drivers/storage/storahci/Notes.txt
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.rc
Modified: branches/GSoC_2016/AHCI/drivers/storage/storahci/Notes.txt
URL:
http://svn.reactos.org/svn/reactos/branches/GSoC_2016/AHCI/drivers/storage/…
==============================================================================
--- branches/GSoC_2016/AHCI/drivers/storage/storahci/Notes.txt [iso-8859-1] (original)
+++ branches/GSoC_2016/AHCI/drivers/storage/storahci/Notes.txt [iso-8859-1] Mon Jun 27
12:58:04 2016
@@ -24,11 +24,12 @@
AhciInterruptHandler
Flags
- IMPLEMENTED
+ NOT_IMPLEMENTED
TESTED
Comment
Fatal Error not supported
Error Recovery not supported
+ Complete Request Routine
AhciHwInterrupt
Flags
@@ -70,9 +71,9 @@
AhciATA_CFIS
Flags
- NOT_IMPLEMENTED
+ IMPLEMENTED
Comment
- Need to configure command table according to Srb function
+ Need to implement NCQ
AhciATAPI_CFIS
Flags
@@ -95,9 +96,9 @@
AhciActivatePort
Flags
- NOT_IMPLEMENTED
+ IMPLEMENTED
Comment
- NONE
+ NCQ not supported
AhciProcessIO
Flags
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] Mon Jun 27
12:58:04 2016
@@ -77,6 +77,13 @@
StorPortWriteRegisterUlong(adapterExtension, &PortExtension->Port->FBU,
receivedFISPhysical.HighPart);
}
+ PortExtension->IdentifyDeviceDataPhysicalAddress =
StorPortGetPhysicalAddress(adapterExtension,
+ NULL,
+
PortExtension->IdentifyDeviceData,
+
&mappedLength);
+
+ NT_ASSERT(mappedLength == sizeof(IDENTIFY_DEVICE_DATA));
+
// set device power state flag to D0
PortExtension->DevicePowerState = StorPowerDeviceD0;
@@ -107,7 +114,7 @@
)
{
PVOID portsExtension = NULL;
- PCHAR nonCachedExtension;
+ PCHAR nonCachedExtension, tmp;
ULONG status, index, NCS, AlignedNCS;
ULONG portCount, portImplemented, nonCachedExtensionSize;
@@ -130,7 +137,8 @@
AdapterExtension->PortCount = portCount;
nonCachedExtensionSize = sizeof(AHCI_COMMAND_HEADER) * AlignedNCS + //should be 1K
aligned
- sizeof(AHCI_RECEIVED_FIS);
+ sizeof(AHCI_RECEIVED_FIS) +
+ sizeof(IDENTIFY_DEVICE_DATA);
// align nonCachedExtensionSize to 1024
nonCachedExtensionSize = ROUND_UP(nonCachedExtensionSize, 1024);
@@ -157,7 +165,11 @@
AdapterExtension->PortExtension[index].IsActive = TRUE;
AdapterExtension->PortExtension[index].AdapterExtension =
AdapterExtension;
AdapterExtension->PortExtension[index].CommandList = nonCachedExtension;
- AdapterExtension->PortExtension[index].ReceivedFIS =
(PAHCI_RECEIVED_FIS)(nonCachedExtension + sizeof(AHCI_COMMAND_HEADER) * AlignedNCS);
+
+ tmp = (PCHAR)(nonCachedExtension + sizeof(AHCI_COMMAND_HEADER) *
AlignedNCS);
+
+ AdapterExtension->PortExtension[index].ReceivedFIS =
(PAHCI_RECEIVED_FIS)tmp;
+ AdapterExtension->PortExtension[index].IdentifyDeviceData =
(PIDENTIFY_DEVICE_DATA)(tmp + sizeof(AHCI_RECEIVED_FIS));
nonCachedExtension += nonCachedExtensionSize;
}
}
@@ -219,7 +231,7 @@
__in PAHCI_PORT_EXTENSION PortExtension
)
{
- ULONG IS;
+ ULONG is, ci, sact, outstanding;
AHCI_INTERRUPT_STATUS PxIS;
AHCI_INTERRUPT_STATUS PxISMasked;
PAHCI_ADAPTER_EXTENSION AdapterExtension;
@@ -283,8 +295,18 @@
// 10.7.1.1
// Clear port interrupt
// It is set by the level of the virtual interrupt line being a set, and cleared by a
write of â1â from the software.
- IS = (1 << PortExtension->PortNumber);
- StorPortWriteRegisterUlong(AdapterExtension, AdapterExtension->IS, IS);
+ is = (1 << PortExtension->PortNumber);
+ StorPortWriteRegisterUlong(AdapterExtension, AdapterExtension->IS, is);
+
+ ci = StorPortReadRegisterUlong(AdapterExtension,
&PortExtension->Port->CI);
+ sact = StorPortReadRegisterUlong(AdapterExtension,
&PortExtension->Port->SACT);
+
+ outstanding = ci | sact; // NOTE: Including both non-NCQ and NCQ based commands
+ if ((PortExtension->CommandIssuedSlots & (~outstanding)) != 0)
+ {
+ DebugPrint("\tCompleted Commands: %d\n",
(PortExtension->CommandIssuedSlots & (~outstanding)));
+ PortExtension->CommandIssuedSlots &= outstanding;
+ }
return;
}// -- AhciInterruptHandler();
@@ -741,7 +763,7 @@
/**
* @name AhciATA_CFIS
- * @not_implemented
+ * @implemented
*
* create ATA CFIS from Srb
*
@@ -755,8 +777,33 @@
__in PAHCI_SRB_EXTENSION SrbExtension
)
{
+ PAHCI_COMMAND_TABLE cmdTable;
+
DebugPrint("AhciATA_CFIS()\n");
+ cmdTable = (PAHCI_COMMAND_TABLE)SrbExtension;
+
+ NT_ASSERT(sizeof(cmdTable->CFIS) == 64);
+
+ AhciZeroMemory(&cmdTable->CFIS, sizeof(cmdTable->CFIS));
+
+ cmdTable->CFIS[AHCI_ATA_CFIS_FisType] = 0x27; // FIS Type
+ cmdTable->CFIS[AHCI_ATA_CFIS_PMPort_C] = (1 << 7); // PM Port & C
+ cmdTable->CFIS[AHCI_ATA_CFIS_CommandReg] = SrbExtension->CommandReg;
+
+ cmdTable->CFIS[AHCI_ATA_CFIS_FeaturesLow] = SrbExtension->FeaturesLow;
+ cmdTable->CFIS[AHCI_ATA_CFIS_LBA0] = SrbExtension->LBA0;
+ cmdTable->CFIS[AHCI_ATA_CFIS_LBA1] = SrbExtension->LBA1;
+ cmdTable->CFIS[AHCI_ATA_CFIS_LBA2] = SrbExtension->LBA2;
+ cmdTable->CFIS[AHCI_ATA_CFIS_Device] = SrbExtension->Device;
+ cmdTable->CFIS[AHCI_ATA_CFIS_LBA3] = SrbExtension->LBA3;
+ cmdTable->CFIS[AHCI_ATA_CFIS_LBA4] = SrbExtension->LBA4;
+ cmdTable->CFIS[AHCI_ATA_CFIS_LBA5] = SrbExtension->LBA5;
+ cmdTable->CFIS[AHCI_ATA_CFIS_FeaturesHigh] = SrbExtension->FeaturesHigh;
+ cmdTable->CFIS[AHCI_ATA_CFIS_SectorCountLow] = SrbExtension->SectorCountLow;
+ cmdTable->CFIS[AHCI_ATA_CFIS_SectorCountHigh] = SrbExtension->SectorCountHigh;
+
+ return;
}// -- AhciATA_CFIS();
/**
@@ -934,13 +981,13 @@
}
// mark this slot
- PortExtension->OccupiedSlots |= SlotIndex;
+ PortExtension->QueueSlots |= SlotIndex;
return;
}// -- AhciProcessSrb();
/**
* @name AhciActivatePort
- * @not_implemented
+ * @implemented
*
* Program Port and populate command list
*
@@ -952,7 +999,39 @@
__in PAHCI_PORT_EXTENSION PortExtension
)
{
+ ULONG cmd, QueueSlots, slotToActivate, tmp;
+ PAHCI_ADAPTER_EXTENSION AdapterExtension;
+
DebugPrint("AhciActivatePort()\n");
+
+ AdapterExtension = PortExtension->AdapterExtension;
+ QueueSlots = PortExtension->QueueSlots;
+
+ if (QueueSlots == 0)
+ return;
+
+ // section 3.3.14
+ // Bits in this field shall only be set to â1â by software when PxCMD.ST is set
to â1â
+ cmd = StorPortReadRegisterUlong(AdapterExtension,
&PortExtension->Port->CMD);
+
+ if ((cmd&1) == 0) // PxCMD.ST == 0
+ return;
+
+ // get the lowest set bit
+ tmp = QueueSlots & (QueueSlots - 1);
+
+ if (tmp == 0)
+ slotToActivate = QueueSlots;
+ else
+ slotToActivate = (QueueSlots & (~tmp));
+
+ // mark that bit off in QueueSlots
+ PortExtension->QueueSlots &= ~slotToActivate;
+ // mark this CommandIssuedSlots
+ PortExtension->CommandIssuedSlots |= slotToActivate;
+
+ // tell the HBA to issue this Command Slot to the given port
+ StorPortWriteRegisterUlong(AdapterExtension, &PortExtension->Port->CI,
slotToActivate);
return;
}// -- AhciActivatePort();
@@ -999,7 +1078,7 @@
// Acquire Lock
StorPortAcquireSpinLock(AdapterExtension, InterruptLock, NULL, &lockhandle);
- occupiedSlots = PortExtension->OccupiedSlots; // Busy command slots for given
port
+ occupiedSlots = (PortExtension->QueueSlots |
PortExtension->CommandIssuedSlots); // Busy command slots for given port
NCS = AHCI_Global_Port_CAP_NCS(AdapterExtension->CAP);
commandSlotMask = (1 << NCS) - 1; // available slots mask
@@ -1064,11 +1143,15 @@
{
PVOID DataBuffer;
ULONG DataBufferLength;
+ PAHCI_PORT_EXTENSION PortExtension;
PAHCI_SRB_EXTENSION SrbExtension;
DebugPrint("DeviceInquiryRequest()\n");
+ NT_ASSERT(IsPortValid(AdapterExtension, Srb->PathId));
+
SrbExtension = GetSrbExtension(Srb);
+ PortExtension = &AdapterExtension->PortExtension[Srb->PathId];
// 3.6.1
// If the EVPD bit is set to zero, the device server shall return the standard
INQUIRY data
@@ -1078,7 +1161,25 @@
NT_ASSERT(SrbExtension != NULL);
SrbExtension->AtaFunction = ATA_FUNCTION_ATA_IDENTIFY;
+ SrbExtension->Flags |= ATA_FLAGS_DATA_IN;
SrbExtension->CommandReg = IDE_COMMAND_NOT_VALID;
+
+ SrbExtension->FeaturesLow = 0;
+ SrbExtension->LBA0 = 0;
+ SrbExtension->LBA1 = 0;
+ SrbExtension->LBA2 = 0;
+ SrbExtension->Device = 0;
+ SrbExtension->LBA3 = 0;
+ SrbExtension->LBA4 = 0;
+ SrbExtension->LBA5 = 0;
+ SrbExtension->FeaturesHigh = 0;
+ SrbExtension->SectorCountLow = 0;
+ SrbExtension->SectorCountHigh = 0;
+
+ SrbExtension->Sgl.NumberOfElements = 1;
+ SrbExtension->Sgl.List[0].PhysicalAddress.LowPart =
PortExtension->IdentifyDeviceDataPhysicalAddress.LowPart;
+ SrbExtension->Sgl.List[0].PhysicalAddress.HighPart =
PortExtension->IdentifyDeviceDataPhysicalAddress.HighPart;
+ SrbExtension->Sgl.List[0].Length = sizeof(IDENTIFY_DEVICE_DATA);
}
else
{
@@ -1093,10 +1194,13 @@
}
AhciZeroMemory(DataBuffer, DataBufferLength);
+
+ // not supported
+ return SRB_STATUS_BAD_FUNCTION;
}
AhciProcessIO(AdapterExtension, Srb->PathId, Srb);
- return SRB_STATUS_SUCCESS;
+ return SRB_STATUS_PENDING;
}// -- DeviceInquiryRequest();
/**
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] Mon Jun 27
12:58:04 2016
@@ -22,6 +22,21 @@
#define AHCI_Global_HBA_CONTROL_MRSM (1 << 2)
#define AHCI_Global_HBA_CONTROL_AE (1 << 31)
#define AHCI_Global_HBA_CAP_S64A (1 << 31)
+
+#define AHCI_ATA_CFIS_FisType 0
+#define AHCI_ATA_CFIS_PMPort_C 1
+#define AHCI_ATA_CFIS_CommandReg 2
+#define AHCI_ATA_CFIS_FeaturesLow 3
+#define AHCI_ATA_CFIS_LBA0 4
+#define AHCI_ATA_CFIS_LBA1 5
+#define AHCI_ATA_CFIS_LBA2 6
+#define AHCI_ATA_CFIS_Device 7
+#define AHCI_ATA_CFIS_LBA3 8
+#define AHCI_ATA_CFIS_LBA4 9
+#define AHCI_ATA_CFIS_LBA5 10
+#define AHCI_ATA_CFIS_FeaturesHigh 11
+#define AHCI_ATA_CFIS_SectorCountLow 12
+#define AHCI_ATA_CFIS_SectorCountHigh 13
// ATA Functions
#define ATA_FUNCTION_ATA_COMMAND 0x100
@@ -297,13 +312,16 @@
typedef struct _AHCI_PORT_EXTENSION
{
ULONG PortNumber;
- ULONG OccupiedSlots; // slots to which we have already
assigned task
+ ULONG QueueSlots; // slots to which we have already
assigned task
+ ULONG CommandIssuedSlots;
BOOLEAN IsActive;
PAHCI_PORT Port; // AHCI Port Infomation
AHCI_QUEUE SrbQueue;
PAHCI_RECEIVED_FIS ReceivedFIS;
PAHCI_COMMAND_HEADER CommandList;
STOR_DEVICE_POWER_STATE DevicePowerState; // Device Power State
+ PIDENTIFY_DEVICE_DATA IdentifyDeviceData;
+ STOR_PHYSICAL_ADDRESS IdentifyDeviceDataPhysicalAddress;
struct _AHCI_ADAPTER_EXTENSION* AdapterExtension; // Port's Adapter
Information
} AHCI_PORT_EXTENSION, *PAHCI_PORT_EXTENSION;
@@ -353,7 +371,21 @@
AHCI_COMMAND_TABLE CommandTable;
ULONG AtaFunction;
ULONG Flags;
- ULONG CommandReg;
+
+ UCHAR CommandReg;
+ UCHAR FeaturesLow;
+ UCHAR LBA0;
+ UCHAR LBA1;
+ UCHAR LBA2;
+ UCHAR Device;
+ UCHAR LBA3;
+ UCHAR LBA4;
+ UCHAR LBA5;
+ UCHAR FeaturesHigh;
+
+ UCHAR SectorCountLow;
+ UCHAR SectorCountHigh;
+
ULONG SlotIndex;
LOCAL_SCATTER_GATHER_LIST Sgl;
} AHCI_SRB_EXTENSION, *PAHCI_SRB_EXTENSION;
Modified: branches/GSoC_2016/AHCI/drivers/storage/storahci/storahci.rc
URL:
http://svn.reactos.org/svn/reactos/branches/GSoC_2016/AHCI/drivers/storage/…
==============================================================================
--- branches/GSoC_2016/AHCI/drivers/storage/storahci/storahci.rc [iso-8859-1] (original)
+++ branches/GSoC_2016/AHCI/drivers/storage/storahci/storahci.rc [iso-8859-1] Mon Jun 27
12:58:04 2016
@@ -17,6 +17,6 @@
#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_LEGAL_COPYRIGHT "Copyright 2016 ReactOS Team"
#define REACTOS_STR_PRODUCT_NAME "AHCI Driver for ReactOS"
#define REACTOS_STR_PRODUCT_VERSION VERSION_STR