mirror of
https://github.com/reactos/reactos.git
synced 2025-03-10 18:24:02 +00:00
- Fixed Offset Issue (VendorId and Reversed space offset in Memory Registers)
- DET = 03h Device is Ready! - Fixed some warnings svn path=/branches/GSoC_2016/AHCI/; revision=71810
This commit is contained in:
parent
b6081b04fc
commit
49f68f18d2
2 changed files with 67 additions and 21 deletions
|
@ -130,7 +130,7 @@ AhciAllocateResourceForAdapter (
|
|||
)
|
||||
{
|
||||
PCHAR nonCachedExtension, tmp;
|
||||
ULONG status, index, NCS, AlignedNCS;
|
||||
ULONG index, NCS, AlignedNCS;
|
||||
ULONG portCount, portImplemented, nonCachedExtensionSize;
|
||||
|
||||
DebugPrint("AhciAllocateResourceForAdapter()\n");
|
||||
|
@ -179,7 +179,7 @@ AhciAllocateResourceForAdapter (
|
|||
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);
|
||||
|
||||
|
@ -274,7 +274,7 @@ AhciStartPort (
|
|||
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();
|
||||
|
||||
|
@ -294,10 +294,9 @@ AhciHwInitialize (
|
|||
__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");
|
||||
|
||||
|
@ -750,10 +749,7 @@ AhciHwFindAdapter (
|
|||
__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;
|
||||
|
||||
|
@ -763,6 +759,11 @@ AhciHwFindAdapter (
|
|||
|
||||
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;
|
||||
|
@ -797,9 +798,9 @@ AhciHwFindAdapter (
|
|||
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,
|
||||
|
@ -902,8 +903,8 @@ DriverEntry (
|
|||
__in PVOID RegistryPath
|
||||
)
|
||||
{
|
||||
ULONG status;
|
||||
HW_INITIALIZATION_DATA hwInitializationData;
|
||||
ULONG i, status;
|
||||
|
||||
DebugPrint("Storahci Loaded\n");
|
||||
|
||||
|
@ -962,6 +963,8 @@ AhciATA_CFIS (
|
|||
{
|
||||
PAHCI_COMMAND_TABLE cmdTable;
|
||||
|
||||
UNREFERENCED_PARAMETER(PortExtension);
|
||||
|
||||
DebugPrint("AhciATA_CFIS()\n");
|
||||
|
||||
cmdTable = (PAHCI_COMMAND_TABLE)SrbExtension;
|
||||
|
@ -1005,8 +1008,12 @@ AhciATAPI_CFIS (
|
|||
__in PAHCI_SRB_EXTENSION SrbExtension
|
||||
)
|
||||
{
|
||||
UNREFERENCED_PARAMETER(PortExtension);
|
||||
UNREFERENCED_PARAMETER(SrbExtension);
|
||||
|
||||
DebugPrint("AhciATAPI_CFIS()\n");
|
||||
|
||||
return;
|
||||
}// -- AhciATAPI_CFIS();
|
||||
|
||||
/**
|
||||
|
@ -1377,7 +1384,7 @@ InquiryCompletion (
|
|||
* @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,
|
||||
|
@ -1547,10 +1554,10 @@ __inline
|
|||
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)
|
||||
{
|
||||
|
@ -1645,7 +1652,7 @@ GetSrbExtension (
|
|||
ULONG Offset;
|
||||
ULONG_PTR SrbExtension;
|
||||
|
||||
SrbExtension = Srb->SrbExtension;
|
||||
SrbExtension = (ULONG_PTR)Srb->SrbExtension;
|
||||
Offset = SrbExtension % 128;
|
||||
|
||||
// CommandTable should be 128 byte aligned
|
||||
|
|
|
@ -10,8 +10,10 @@
|
|||
#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
|
||||
|
@ -363,6 +365,28 @@ typedef struct _AHCI_PORT
|
|||
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
|
||||
|
@ -377,12 +401,27 @@ typedef struct _AHCI_MEMORY_REGISTERS
|
|||
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
|
||||
{
|
||||
|
@ -492,10 +531,10 @@ __inline
|
|||
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,
|
||||
|
|
Loading…
Reference in a new issue