)
{
PCHAR nonCachedExtension, tmp;
- ULONG status, index, NCS, AlignedNCS;
+ ULONG index, NCS, AlignedNCS;
ULONG portCount, portImplemented, nonCachedExtensionSize;
DebugPrint("AhciAllocateResourceForAdapter()\n");
AdapterExtension->PortExtension[index].PortNumber = index;
AdapterExtension->PortExtension[index].IsActive = TRUE;
AdapterExtension->PortExtension[index].AdapterExtension = AdapterExtension;
- AdapterExtension->PortExtension[index].CommandList = nonCachedExtension;
+ AdapterExtension->PortExtension[index].CommandList = (PAHCI_COMMAND_HEADER)nonCachedExtension;
tmp = (PCHAR)(nonCachedExtension + sizeof(AHCI_COMMAND_HEADER) * AlignedNCS);
return FALSE;
}
- DebugPrint("\tDET: %d %x %x\n", ssts.DET, PortExtension->Port->CMD, PortExtension->Port->SSTS);
+ DebugPrint("\tDET: %d %d\n", ssts.DET, cmd.ST);
return FALSE;
}// -- AhciStartPort();
__in PVOID AdapterExtension
)
{
- ULONG ghc, messageCount, status, cmd, index;
+ ULONG ghc, index;
PAHCI_PORT_EXTENSION PortExtension;
PAHCI_ADAPTER_EXTENSION adapterExtension;
- AHCI_SERIAL_ATA_STATUS ssts;
DebugPrint("AhciHwInitialize()\n");
__in PBOOLEAN Reserved3
)
{
- ULONG ghc;
- ULONG index;
- ULONG portCount, portImplemented;
- ULONG pci_cfg_len;
+ ULONG ghc, index, pci_cfg_len;
UCHAR pci_cfg_buf[sizeof(PCI_COMMON_CONFIG)];
PACCESS_RANGE accessRange;
DebugPrint("AhciHwFindAdapter()\n");
+ UNREFERENCED_PARAMETER(HwContext);
+ UNREFERENCED_PARAMETER(BusInformation);
+ UNREFERENCED_PARAMETER(ArgumentString);
+ UNREFERENCED_PARAMETER(Reserved3);
+
adapterExtension = AdapterExtension;
adapterExtension->SlotNumber = ConfigInfo->SlotNumber;
adapterExtension->SystemIoBusNumber = ConfigInfo->SystemIoBusNumber;
abar = NULL;
if (ConfigInfo->NumberOfAccessRanges > 0)
{
+ accessRange = *(ConfigInfo->AccessRanges);
for (index = 0; index < ConfigInfo->NumberOfAccessRanges; index++)
{
- accessRange = *ConfigInfo->AccessRanges;
if (accessRange[index].RangeStart.QuadPart == adapterExtension->AhciBaseAddress)
{
abar = StorPortGetDeviceBase(adapterExtension,
__in PVOID RegistryPath
)
{
+ ULONG status;
HW_INITIALIZATION_DATA hwInitializationData;
- ULONG i, status;
DebugPrint("Storahci Loaded\n");
{
PAHCI_COMMAND_TABLE cmdTable;
+ UNREFERENCED_PARAMETER(PortExtension);
+
DebugPrint("AhciATA_CFIS()\n");
cmdTable = (PAHCI_COMMAND_TABLE)SrbExtension;
__in PAHCI_SRB_EXTENSION SrbExtension
)
{
+ UNREFERENCED_PARAMETER(PortExtension);
+ UNREFERENCED_PARAMETER(SrbExtension);
+
DebugPrint("AhciATAPI_CFIS()\n");
+ return;
}// -- AhciATAPI_CFIS();
/**
* @remark
* http://www.seagate.com/staticfiles/support/disc/manuals/Interface%20manuals/100293068c.pdf
*/
-ULONG
+UCHAR
DeviceInquiryRequest (
__in PAHCI_ADAPTER_EXTENSION AdapterExtension,
__in PSCSI_REQUEST_BLOCK Srb,
BOOLEAN
IsPortValid (
__in PAHCI_ADAPTER_EXTENSION AdapterExtension,
- __in UCHAR pathId
+ __in ULONG pathId
)
{
- NT_ASSERT(pathId >= 0);
+ NT_ASSERT(pathId < MAXIMUM_AHCI_PORT_COUNT);
if (pathId >= AdapterExtension->PortCount)
{
ULONG Offset;
ULONG_PTR SrbExtension;
- SrbExtension = Srb->SrbExtension;
+ SrbExtension = (ULONG_PTR)Srb->SrbExtension;
Offset = SrbExtension % 128;
// CommandTable should be 128 byte aligned
#include <storport.h>
#define DEBUG 1
+#pragma warning(disable:4214) // bit field types other than int
+#pragma warning(disable:4201) // nameless struct/union
-#define MAXIMUM_AHCI_PORT_COUNT 25
+#define MAXIMUM_AHCI_PORT_COUNT 32
#define MAXIMUM_AHCI_PRDT_ENTRIES 32
#define MAXIMUM_AHCI_PORT_NCS 30
#define MAXIMUM_QUEUE_BUFFER_SIZE 255
ULONG Vendor[4]; // 0x70 ~ 0x7F, vendor specific
} AHCI_PORT, *PAHCI_PORT;
+#ifdef DEBUG
+ C_ASSERT(FIELD_OFFSET(AHCI_PORT, CLB) == 0x00);
+ C_ASSERT(FIELD_OFFSET(AHCI_PORT, CLBU) == 0x04);
+ C_ASSERT(FIELD_OFFSET(AHCI_PORT, FB) == 0x08);
+ C_ASSERT(FIELD_OFFSET(AHCI_PORT, FBU) == 0x0C);
+ C_ASSERT(FIELD_OFFSET(AHCI_PORT, IS) == 0x10);
+ C_ASSERT(FIELD_OFFSET(AHCI_PORT, IE) == 0x14);
+ C_ASSERT(FIELD_OFFSET(AHCI_PORT, CMD) == 0x18);
+ C_ASSERT(FIELD_OFFSET(AHCI_PORT, RSV0) == 0x1C);
+ C_ASSERT(FIELD_OFFSET(AHCI_PORT, TFD) == 0x20);
+ C_ASSERT(FIELD_OFFSET(AHCI_PORT, SIG) == 0x24);
+ C_ASSERT(FIELD_OFFSET(AHCI_PORT, SSTS) == 0x28);
+ C_ASSERT(FIELD_OFFSET(AHCI_PORT, SCTL) == 0x2C);
+ C_ASSERT(FIELD_OFFSET(AHCI_PORT, SERR) == 0x30);
+ C_ASSERT(FIELD_OFFSET(AHCI_PORT, SACT) == 0x34);
+ C_ASSERT(FIELD_OFFSET(AHCI_PORT, CI) == 0x38);
+ C_ASSERT(FIELD_OFFSET(AHCI_PORT, SNTF) == 0x3C);
+ C_ASSERT(FIELD_OFFSET(AHCI_PORT, FBS) == 0x40);
+ C_ASSERT(FIELD_OFFSET(AHCI_PORT, RSV1) == 0x44);
+ C_ASSERT(FIELD_OFFSET(AHCI_PORT, Vendor) == 0x70);
+#endif
+
typedef struct _AHCI_MEMORY_REGISTERS
{
// 0x00 - 0x2B, Generic Host Control
ULONG EM_CTL; // 0x20, Enclosure management control
ULONG CAP2; // 0x24, Host capabilities extended
ULONG BOHC; // 0x28, BIOS/OS handoff control and status
- ULONG Reserved[0xA0-0x2C]; // 0x2C - 0x9F, Reserved
- ULONG VendorSpecific[0x100-0xA0]; // 0xA0 - 0xFF, Vendor specific registers
+ ULONG Reserved[0x1d]; // 0x2C - 0x9F, Reserved
+ ULONG VendorSpecific[0x18]; // 0xA0 - 0xFF, Vendor specific registers
AHCI_PORT PortList[MAXIMUM_AHCI_PORT_COUNT];
-
} AHCI_MEMORY_REGISTERS, *PAHCI_MEMORY_REGISTERS;
+#ifdef DEBUG
+ C_ASSERT(FIELD_OFFSET(AHCI_MEMORY_REGISTERS, CAP) == 0x00);
+ C_ASSERT(FIELD_OFFSET(AHCI_MEMORY_REGISTERS, GHC) == 0x04);
+ C_ASSERT(FIELD_OFFSET(AHCI_MEMORY_REGISTERS, IS) == 0x08);
+ C_ASSERT(FIELD_OFFSET(AHCI_MEMORY_REGISTERS, PI) == 0x0C);
+ C_ASSERT(FIELD_OFFSET(AHCI_MEMORY_REGISTERS, VS) == 0x10);
+ C_ASSERT(FIELD_OFFSET(AHCI_MEMORY_REGISTERS, CCC_CTL) == 0x14);
+ C_ASSERT(FIELD_OFFSET(AHCI_MEMORY_REGISTERS, CCC_PTS) == 0x18);
+ C_ASSERT(FIELD_OFFSET(AHCI_MEMORY_REGISTERS, EM_LOC) == 0x1C);
+ C_ASSERT(FIELD_OFFSET(AHCI_MEMORY_REGISTERS, EM_CTL) == 0x20);
+ C_ASSERT(FIELD_OFFSET(AHCI_MEMORY_REGISTERS, CAP2) == 0x24);
+ C_ASSERT(FIELD_OFFSET(AHCI_MEMORY_REGISTERS, BOHC) == 0x28);
+ C_ASSERT(FIELD_OFFSET(AHCI_MEMORY_REGISTERS, Reserved) == 0x2C);
+ C_ASSERT(FIELD_OFFSET(AHCI_MEMORY_REGISTERS, VendorSpecific) == 0xA0);
+#endif
+
// Holds information for each attached attached port to a given adapter.
typedef struct _AHCI_PORT_EXTENSION
{
BOOLEAN
IsPortValid (
__in PAHCI_ADAPTER_EXTENSION AdapterExtension,
- __in UCHAR pathId
+ __in ULONG pathId
);
-ULONG
+UCHAR
DeviceInquiryRequest (
__in PAHCI_ADAPTER_EXTENSION AdapterExtension,
__in PSCSI_REQUEST_BLOCK Srb,