ReactOS 0.4.17-dev-1321-g5c122a9
storahci.h File Reference
#include <ntddk.h>
#include <ata.h>
#include <storport.h>
#include <debug.h>
Include dependency graph for storahci.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

union  _AHCI_INTERRUPT_STATUS
 
struct  _AHCI_FIS_DMA_SETUP
 
struct  _AHCI_PIO_SETUP_FIS
 
struct  _AHCI_D2H_REGISTER_FIS
 
struct  _AHCI_SET_DEVICE_BITS_FIS
 
struct  _AHCI_QUEUE
 
union  _AHCI_COMMAND_HEADER_DESCRIPTION
 
union  _AHCI_GHC
 
union  _AHCI_PORT_CMD
 
union  _AHCI_SERIAL_ATA_CONTROL
 
union  _AHCI_SERIAL_ATA_STATUS
 
union  _AHCI_TASK_FILE_DATA
 
struct  _AHCI_PRDT
 
struct  _AHCI_COMMAND_TABLE
 
struct  _AHCI_COMMAND_HEADER
 
struct  _AHCI_RECEIVED_FIS
 
struct  _AHCI_PORT
 
union  _AHCI_INTERRUPT_ENABLE
 
struct  _AHCI_MEMORY_REGISTERS
 
struct  _AHCI_PORT_EXTENSION
 
struct  _AHCI_ADAPTER_EXTENSION
 
struct  _LOCAL_SCATTER_GATHER_LIST
 
struct  _AHCI_SRB_EXTENSION
 

Macros

#define NDEBUG
 
#define DEBUG   1
 
#define MAXIMUM_AHCI_PORT_COUNT   32
 
#define MAXIMUM_AHCI_PRDT_ENTRIES   32
 
#define MAXIMUM_AHCI_PORT_NCS   30
 
#define MAXIMUM_QUEUE_BUFFER_SIZE   255
 
#define MAXIMUM_TRANSFER_LENGTH   (128*1024)
 
#define DEVICE_ATA_BLOCK_SIZE   512
 
#define AHCI_DEVICE_TYPE_ATA   1
 
#define AHCI_DEVICE_TYPE_ATAPI   2
 
#define AHCI_DEVICE_TYPE_NODEVICE   3
 
#define AHCI_Global_HBA_CAP_S64A   (1 << 31)
 
#define FIS_TYPE_REG_H2D   0x27
 
#define FIS_TYPE_REG_D2H   0x34
 
#define FIS_TYPE_DMA_ACT   0x39
 
#define FIS_TYPE_DMA_SETUP   0x41
 
#define FIS_TYPE_BIST   0x58
 
#define FIS_TYPE_PIO_SETUP   0x5F
 
#define FIS_TYPE_DEV_BITS   0xA1
 
#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
 
#define ATA_FUNCTION_ATA_COMMAND   0x100
 
#define ATA_FUNCTION_ATA_IDENTIFY   0x101
 
#define ATA_FUNCTION_ATA_READ   0x102
 
#define ATA_FUNCTION_ATAPI_COMMAND   0x200
 
#define ATA_FLAGS_DATA_IN   (1 << 1)
 
#define ATA_FLAGS_DATA_OUT   (1 << 2)
 
#define ATA_FLAGS_48BIT_COMMAND   (1 << 3)
 
#define ATA_FLAGS_USE_DMA   (1 << 4)
 
#define IsAtaCommand(AtaFunction)   (AtaFunction & ATA_FUNCTION_ATA_COMMAND)
 
#define IsAtapiCommand(AtaFunction)   (AtaFunction & ATA_FUNCTION_ATAPI_COMMAND)
 
#define IsDataTransferNeeded(SrbExtension)   (SrbExtension->Flags & (ATA_FLAGS_DATA_IN | ATA_FLAGS_DATA_OUT))
 
#define IsAdapterCAPS64(CAP)   (CAP & AHCI_Global_HBA_CAP_S64A)
 
#define AHCI_Global_Port_CAP_NCS(x)   (((x) & 0xF00) >> 8)
 
#define ROUND_UP(N, S)   ((((N) + (S) - 1) / (S)) * (S))
 
#define AhciDebugPrint(format, ...)   DbgPrint("(%s:%d) " format, __RELFILE__, __LINE__, ##__VA_ARGS__)
 

Typedefs

typedef VOID(* PAHCI_COMPLETION_ROUTINE) (__in PVOID PortExtension, __in PVOID Srb)
 
typedef union _AHCI_INTERRUPT_STATUS AHCI_INTERRUPT_STATUS
 
typedef struct _AHCI_FIS_DMA_SETUP AHCI_FIS_DMA_SETUP
 
typedef struct _AHCI_PIO_SETUP_FIS AHCI_PIO_SETUP_FIS
 
typedef struct _AHCI_D2H_REGISTER_FIS AHCI_D2H_REGISTER_FIS
 
typedef struct _AHCI_SET_DEVICE_BITS_FIS AHCI_SET_DEVICE_BITS_FIS
 
typedef struct _AHCI_QUEUE AHCI_QUEUE
 
typedef struct _AHCI_QUEUE * PAHCI_QUEUE
 
typedef union _AHCI_COMMAND_HEADER_DESCRIPTION AHCI_COMMAND_HEADER_DESCRIPTION
 
typedef union _AHCI_GHC AHCI_GHC
 
typedef union _AHCI_PORT_CMD AHCI_PORT_CMD
 
typedef union _AHCI_SERIAL_ATA_CONTROL AHCI_SERIAL_ATA_CONTROL
 
typedef union _AHCI_SERIAL_ATA_STATUS AHCI_SERIAL_ATA_STATUS
 
typedef union _AHCI_TASK_FILE_DATA AHCI_TASK_FILE_DATA
 
typedef struct _AHCI_PRDT AHCI_PRDT
 
typedef struct _AHCI_PRDT * PAHCI_PRDT
 
typedef struct _AHCI_COMMAND_TABLE AHCI_COMMAND_TABLE
 
typedef struct _AHCI_COMMAND_TABLE * PAHCI_COMMAND_TABLE
 
typedef struct _AHCI_COMMAND_HEADER AHCI_COMMAND_HEADER
 
typedef struct _AHCI_COMMAND_HEADER * PAHCI_COMMAND_HEADER
 
typedef struct _AHCI_RECEIVED_FIS AHCI_RECEIVED_FIS
 
typedef struct _AHCI_RECEIVED_FIS * PAHCI_RECEIVED_FIS
 
typedef struct _AHCI_PORT AHCI_PORT
 
typedef struct _AHCI_PORT * PAHCI_PORT
 
typedef union _AHCI_INTERRUPT_ENABLE AHCI_INTERRUPT_ENABLE
 
typedef struct _AHCI_MEMORY_REGISTERS AHCI_MEMORY_REGISTERS
 
typedef struct _AHCI_MEMORY_REGISTERS * PAHCI_MEMORY_REGISTERS
 
typedef struct _AHCI_PORT_EXTENSION AHCI_PORT_EXTENSION
 
typedef struct _AHCI_PORT_EXTENSION * PAHCI_PORT_EXTENSION
 
typedef struct _AHCI_ADAPTER_EXTENSION AHCI_ADAPTER_EXTENSION
 
typedef struct _AHCI_ADAPTER_EXTENSION * PAHCI_ADAPTER_EXTENSION
 
typedef struct _LOCAL_SCATTER_GATHER_LIST LOCAL_SCATTER_GATHER_LIST
 
typedef struct _LOCAL_SCATTER_GATHER_LIST * PLOCAL_SCATTER_GATHER_LIST
 
typedef struct _AHCI_SRB_EXTENSION AHCI_SRB_EXTENSION
 
typedef struct _AHCI_SRB_EXTENSION * PAHCI_SRB_EXTENSION
 

Functions

VOID AhciProcessIO (__in PAHCI_ADAPTER_EXTENSION AdapterExtension, __in UCHAR PathId, __in PSCSI_REQUEST_BLOCK Srb)
 
BOOLEAN AhciAdapterReset (__in PAHCI_ADAPTER_EXTENSION AdapterExtension)
 
FORCEINLINE VOID AhciZeroMemory (__out PCHAR Buffer, __in ULONG BufferSize)
 
FORCEINLINE BOOLEAN IsPortValid (__in PAHCI_ADAPTER_EXTENSION AdapterExtension, __in ULONG pathId)
 
UCHAR DeviceRequestSense (__in PAHCI_ADAPTER_EXTENSION AdapterExtension, __in PSCSI_REQUEST_BLOCK Srb, __in PCDB Cdb)
 
UCHAR DeviceRequestReadWrite (__in PAHCI_ADAPTER_EXTENSION AdapterExtension, __in PSCSI_REQUEST_BLOCK Srb, __in PCDB Cdb)
 
UCHAR DeviceRequestCapacity (__in PAHCI_ADAPTER_EXTENSION AdapterExtension, __in PSCSI_REQUEST_BLOCK Srb, __in PCDB Cdb)
 
UCHAR DeviceInquiryRequest (__in PAHCI_ADAPTER_EXTENSION AdapterExtension, __in PSCSI_REQUEST_BLOCK Srb, __in PCDB Cdb)
 
UCHAR DeviceRequestComplete (__in PAHCI_ADAPTER_EXTENSION AdapterExtension, __in PSCSI_REQUEST_BLOCK Srb, __in PCDB Cdb)
 
UCHAR DeviceReportLuns (__in PAHCI_ADAPTER_EXTENSION AdapterExtension, __in PSCSI_REQUEST_BLOCK Srb, __in PCDB Cdb)
 
FORCEINLINE BOOLEAN AddQueue (__inout PAHCI_QUEUE Queue, __in PVOID Srb)
 
FORCEINLINE PVOID RemoveQueue (__inout PAHCI_QUEUE Queue)
 
FORCEINLINE PAHCI_SRB_EXTENSION GetSrbExtension (__in PSCSI_REQUEST_BLOCK Srb)
 
FORCEINLINE ULONG64 AhciGetLba (__in PCDB Cdb, __in ULONG CdbLength)
 
 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)
 
 C_ASSERT (FIELD_OFFSET(AHCI_MEMORY_REGISTERS, PortList)==0x100)
 
 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)
 
 C_ASSERT ((sizeof(AHCI_COMMAND_TABLE) % 128)==0)
 
 C_ASSERT (sizeof(AHCI_GHC)==sizeof(ULONG))
 
 C_ASSERT (sizeof(AHCI_PORT_CMD)==sizeof(ULONG))
 
 C_ASSERT (sizeof(AHCI_TASK_FILE_DATA)==sizeof(ULONG))
 
 C_ASSERT (sizeof(AHCI_INTERRUPT_ENABLE)==sizeof(ULONG))
 
 C_ASSERT (sizeof(AHCI_SERIAL_ATA_STATUS)==sizeof(ULONG))
 
 C_ASSERT (sizeof(AHCI_SERIAL_ATA_CONTROL)==sizeof(ULONG))
 
 C_ASSERT (sizeof(AHCI_COMMAND_HEADER_DESCRIPTION)==sizeof(ULONG))
 
 C_ASSERT (FIELD_OFFSET(AHCI_COMMAND_TABLE, CFIS)==0x00)
 
 C_ASSERT (FIELD_OFFSET(AHCI_COMMAND_TABLE, ACMD)==0x40)
 
 C_ASSERT (FIELD_OFFSET(AHCI_COMMAND_TABLE, RSV0)==0x50)
 
 C_ASSERT (FIELD_OFFSET(AHCI_COMMAND_TABLE, PRDT)==0x80)
 

Macro Definition Documentation

◆ AHCI_ATA_CFIS_CommandReg

#define AHCI_ATA_CFIS_CommandReg   2

Definition at line 48 of file storahci.h.

◆ AHCI_ATA_CFIS_Device

#define AHCI_ATA_CFIS_Device   7

Definition at line 53 of file storahci.h.

◆ AHCI_ATA_CFIS_FeaturesHigh

#define AHCI_ATA_CFIS_FeaturesHigh   11

Definition at line 57 of file storahci.h.

◆ AHCI_ATA_CFIS_FeaturesLow

#define AHCI_ATA_CFIS_FeaturesLow   3

Definition at line 49 of file storahci.h.

◆ AHCI_ATA_CFIS_FisType

#define AHCI_ATA_CFIS_FisType   0

Definition at line 46 of file storahci.h.

◆ AHCI_ATA_CFIS_LBA0

#define AHCI_ATA_CFIS_LBA0   4

Definition at line 50 of file storahci.h.

◆ AHCI_ATA_CFIS_LBA1

#define AHCI_ATA_CFIS_LBA1   5

Definition at line 51 of file storahci.h.

◆ AHCI_ATA_CFIS_LBA2

#define AHCI_ATA_CFIS_LBA2   6

Definition at line 52 of file storahci.h.

◆ AHCI_ATA_CFIS_LBA3

#define AHCI_ATA_CFIS_LBA3   8

Definition at line 54 of file storahci.h.

◆ AHCI_ATA_CFIS_LBA4

#define AHCI_ATA_CFIS_LBA4   9

Definition at line 55 of file storahci.h.

◆ AHCI_ATA_CFIS_LBA5

#define AHCI_ATA_CFIS_LBA5   10

Definition at line 56 of file storahci.h.

◆ AHCI_ATA_CFIS_PMPort_C

#define AHCI_ATA_CFIS_PMPort_C   1

Definition at line 47 of file storahci.h.

◆ AHCI_ATA_CFIS_SectorCountHigh

#define AHCI_ATA_CFIS_SectorCountHigh   13

Definition at line 59 of file storahci.h.

◆ AHCI_ATA_CFIS_SectorCountLow

#define AHCI_ATA_CFIS_SectorCountLow   12

Definition at line 58 of file storahci.h.

◆ AHCI_DEVICE_TYPE_ATA

#define AHCI_DEVICE_TYPE_ATA   1

Definition at line 30 of file storahci.h.

◆ AHCI_DEVICE_TYPE_ATAPI

#define AHCI_DEVICE_TYPE_ATAPI   2

Definition at line 31 of file storahci.h.

◆ AHCI_DEVICE_TYPE_NODEVICE

#define AHCI_DEVICE_TYPE_NODEVICE   3

Definition at line 32 of file storahci.h.

◆ AHCI_Global_HBA_CAP_S64A

#define AHCI_Global_HBA_CAP_S64A   (1 << 31)

Definition at line 35 of file storahci.h.

◆ AHCI_Global_Port_CAP_NCS

#define AHCI_Global_Port_CAP_NCS (   x)    (((x) & 0xF00) >> 8)

Definition at line 81 of file storahci.h.

◆ AhciDebugPrint

#define AhciDebugPrint (   format,
  ... 
)    DbgPrint("(%s:%d) " format, __RELFILE__, __LINE__, ##__VA_ARGS__)

Definition at line 85 of file storahci.h.

◆ ATA_FLAGS_48BIT_COMMAND

#define ATA_FLAGS_48BIT_COMMAND   (1 << 3)

Definition at line 72 of file storahci.h.

◆ ATA_FLAGS_DATA_IN

#define ATA_FLAGS_DATA_IN   (1 << 1)

Definition at line 70 of file storahci.h.

◆ ATA_FLAGS_DATA_OUT

#define ATA_FLAGS_DATA_OUT   (1 << 2)

Definition at line 71 of file storahci.h.

◆ ATA_FLAGS_USE_DMA

#define ATA_FLAGS_USE_DMA   (1 << 4)

Definition at line 73 of file storahci.h.

◆ ATA_FUNCTION_ATA_COMMAND

#define ATA_FUNCTION_ATA_COMMAND   0x100

Definition at line 62 of file storahci.h.

◆ ATA_FUNCTION_ATA_IDENTIFY

#define ATA_FUNCTION_ATA_IDENTIFY   0x101

Definition at line 63 of file storahci.h.

◆ ATA_FUNCTION_ATA_READ

#define ATA_FUNCTION_ATA_READ   0x102

Definition at line 64 of file storahci.h.

◆ ATA_FUNCTION_ATAPI_COMMAND

#define ATA_FUNCTION_ATAPI_COMMAND   0x200

Definition at line 67 of file storahci.h.

◆ DEBUG

#define DEBUG   1

Definition at line 15 of file storahci.h.

◆ DEVICE_ATA_BLOCK_SIZE

#define DEVICE_ATA_BLOCK_SIZE   512

Definition at line 27 of file storahci.h.

◆ FIS_TYPE_BIST

#define FIS_TYPE_BIST   0x58

Definition at line 42 of file storahci.h.

◆ FIS_TYPE_DEV_BITS

#define FIS_TYPE_DEV_BITS   0xA1

Definition at line 44 of file storahci.h.

◆ FIS_TYPE_DMA_ACT

#define FIS_TYPE_DMA_ACT   0x39

Definition at line 40 of file storahci.h.

◆ FIS_TYPE_DMA_SETUP

#define FIS_TYPE_DMA_SETUP   0x41

Definition at line 41 of file storahci.h.

◆ FIS_TYPE_PIO_SETUP

#define FIS_TYPE_PIO_SETUP   0x5F

Definition at line 43 of file storahci.h.

◆ FIS_TYPE_REG_D2H

#define FIS_TYPE_REG_D2H   0x34

Definition at line 39 of file storahci.h.

◆ FIS_TYPE_REG_H2D

#define FIS_TYPE_REG_H2D   0x27

Definition at line 38 of file storahci.h.

◆ IsAdapterCAPS64

#define IsAdapterCAPS64 (   CAP)    (CAP & AHCI_Global_HBA_CAP_S64A)

Definition at line 78 of file storahci.h.

◆ IsAtaCommand

#define IsAtaCommand (   AtaFunction)    (AtaFunction & ATA_FUNCTION_ATA_COMMAND)

Definition at line 75 of file storahci.h.

◆ IsAtapiCommand

#define IsAtapiCommand (   AtaFunction)    (AtaFunction & ATA_FUNCTION_ATAPI_COMMAND)

Definition at line 76 of file storahci.h.

◆ IsDataTransferNeeded

#define IsDataTransferNeeded (   SrbExtension)    (SrbExtension->Flags & (ATA_FLAGS_DATA_IN | ATA_FLAGS_DATA_OUT))

Definition at line 77 of file storahci.h.

◆ MAXIMUM_AHCI_PORT_COUNT

#define MAXIMUM_AHCI_PORT_COUNT   32

Definition at line 21 of file storahci.h.

◆ MAXIMUM_AHCI_PORT_NCS

#define MAXIMUM_AHCI_PORT_NCS   30

Definition at line 23 of file storahci.h.

◆ MAXIMUM_AHCI_PRDT_ENTRIES

#define MAXIMUM_AHCI_PRDT_ENTRIES   32

Definition at line 22 of file storahci.h.

◆ MAXIMUM_QUEUE_BUFFER_SIZE

#define MAXIMUM_QUEUE_BUFFER_SIZE   255

Definition at line 24 of file storahci.h.

◆ MAXIMUM_TRANSFER_LENGTH

#define MAXIMUM_TRANSFER_LENGTH   (128*1024)

Definition at line 25 of file storahci.h.

◆ NDEBUG

#define NDEBUG

Definition at line 12 of file storahci.h.

◆ ROUND_UP

#define ROUND_UP (   N,
  S 
)    ((((N) + (S) - 1) / (S)) * (S))

Definition at line 83 of file storahci.h.

Typedef Documentation

◆ AHCI_ADAPTER_EXTENSION

◆ AHCI_COMMAND_HEADER

◆ AHCI_COMMAND_HEADER_DESCRIPTION

◆ AHCI_COMMAND_TABLE

◆ AHCI_D2H_REGISTER_FIS

◆ AHCI_FIS_DMA_SETUP

◆ AHCI_GHC

typedef union _AHCI_GHC AHCI_GHC

◆ AHCI_INTERRUPT_ENABLE

◆ AHCI_INTERRUPT_STATUS

◆ AHCI_MEMORY_REGISTERS

◆ AHCI_PIO_SETUP_FIS

◆ AHCI_PORT

◆ AHCI_PORT_CMD

◆ AHCI_PORT_EXTENSION

◆ AHCI_PRDT

◆ AHCI_QUEUE

◆ AHCI_RECEIVED_FIS

◆ AHCI_SERIAL_ATA_CONTROL

◆ AHCI_SERIAL_ATA_STATUS

◆ AHCI_SET_DEVICE_BITS_FIS

◆ AHCI_SRB_EXTENSION

◆ AHCI_TASK_FILE_DATA

◆ LOCAL_SCATTER_GATHER_LIST

◆ PAHCI_ADAPTER_EXTENSION

◆ PAHCI_COMMAND_HEADER

◆ PAHCI_COMMAND_TABLE

◆ PAHCI_COMPLETION_ROUTINE

typedef VOID(* PAHCI_COMPLETION_ROUTINE) (__in PVOID PortExtension, __in PVOID Srb)

Definition at line 88 of file storahci.h.

◆ PAHCI_MEMORY_REGISTERS

◆ PAHCI_PORT

◆ PAHCI_PORT_EXTENSION

◆ PAHCI_PRDT

◆ PAHCI_QUEUE

◆ PAHCI_RECEIVED_FIS

◆ PAHCI_SRB_EXTENSION

◆ PLOCAL_SCATTER_GATHER_LIST

Function Documentation

◆ AddQueue()

FORCEINLINE BOOLEAN AddQueue ( __inout PAHCI_QUEUE  Queue,
__in PVOID  Srb 
)

Definition at line 2503 of file storahci.c.

2507{
2510
2511 if (Queue->Tail == ((Queue->Head + 1) % MAXIMUM_QUEUE_BUFFER_SIZE))
2512 return FALSE;
2513
2514 Queue->Buffer[Queue->Head++] = Srb;
2516
2517 return TRUE;
2518}// -- AddQueue();
_In_ PSCSI_REQUEST_BLOCK Srb
Definition: cdrom.h:989
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define MAXIMUM_QUEUE_BUFFER_SIZE
Definition: storahci.h:24
_Must_inspect_result_ _In_ WDFDEVICE _In_ PIRP _In_ WDFQUEUE Queue
Definition: wdfdevice.h:2231
#define NT_ASSERT
Definition: rtlfuncs.h:3334

Referenced by AhciCompleteIssuedSrb(), and AhciProcessIO().

◆ AhciAdapterReset()

BOOLEAN AhciAdapterReset ( __in PAHCI_ADAPTER_EXTENSION  AdapterExtension)

Definition at line 2395 of file storahci.c.

2398{
2399 ULONG ticks;
2400 AHCI_GHC ghc;
2402
2403 AhciDebugPrint("AhciAdapterReset()\n");
2404
2405 abar = AdapterExtension->ABAR_Address;
2406 if (abar == NULL) // basic sanity
2407 {
2408 return FALSE;
2409 }
2410
2411 // HR -- Very first bit (lowest significant)
2412 ghc.HR = 1;
2413 StorPortWriteRegisterUlong(AdapterExtension, &abar->GHC, ghc.Status);
2414
2415 for (ticks = 0; ticks < 50; ++ticks)
2416 {
2417 ghc.Status = StorPortReadRegisterUlong(AdapterExtension, &abar->GHC);
2418 if (ghc.HR == 0)
2419 {
2420 break;
2421 }
2423 }
2424
2425 if (ticks == 50)// 1 second
2426 {
2427 AhciDebugPrint("\tDevice Timeout\n");
2428 return FALSE;
2429 }
2430
2431 return TRUE;
2432}// -- AhciAdapterReset();
#define NULL
Definition: types.h:112
STORPORT_API ULONG NTAPI StorPortReadRegisterUlong(_In_ PVOID HwDeviceExtension, _In_ PULONG Register)
Definition: stubs.c:143
STORPORT_API VOID NTAPI StorPortWriteRegisterUlong(_In_ PVOID HwDeviceExtension, _In_ PULONG Register, _In_ ULONG Value)
Definition: stubs.c:291
#define AhciDebugPrint(format,...)
Definition: storahci.h:85
STORPORT_API VOID NTAPI StorPortStallExecution(_In_ ULONG Delay)
Definition: storport.c:1969
uint32_t ULONG
Definition: typedefs.h:59
ULONG Status
Definition: storahci.h:261
ULONG HR
Definition: storahci.h:254

Referenced by AhciHwFindAdapter().

◆ AhciGetLba()

FORCEINLINE ULONG64 AhciGetLba ( __in PCDB  Cdb,
__in ULONG  CdbLength 
)

Definition at line 2597 of file storahci.c.

2601{
2602 ULONG64 lba = 0;
2603
2604 NT_ASSERT(Cdb != NULL);
2605 NT_ASSERT(CdbLength != 0);
2606
2607 if (CdbLength == 0x10)
2608 {
2609 REVERSE_BYTES_QUAD(&lba, Cdb->CDB16.LogicalBlock);
2610 }
2611 else
2612 {
2613 lba |= Cdb->CDB10.LogicalBlockByte3 << 0;
2614 lba |= Cdb->CDB10.LogicalBlockByte2 << 8;
2615 lba |= Cdb->CDB10.LogicalBlockByte1 << 16;
2616 lba |= Cdb->CDB10.LogicalBlockByte0 << 24;
2617 }
2618
2619 return lba;
2620}// -- AhciGetLba();
unsigned __int64 ULONG64
Definition: imports.h:198
_In_opt_ WDFREQUEST _In_ ULONG _In_ BOOLEAN _In_ PCDB Cdb
Definition: scratch.h:159
#define REVERSE_BYTES_QUAD(Destination, Source)
Definition: scsi.h:3498
#define lba
struct _CDB::_CDB10 CDB10
struct _CDB::_CDB16 CDB16

Referenced by DeviceRequestReadWrite().

◆ AhciProcessIO()

VOID AhciProcessIO ( __in PAHCI_ADAPTER_EXTENSION  AdapterExtension,
__in UCHAR  PathId,
__in PSCSI_REQUEST_BLOCK  Srb 
)

Definition at line 1557 of file storahci.c.

1562{
1563 PSCSI_REQUEST_BLOCK tmpSrb;
1564 STOR_LOCK_HANDLE lockhandle = {0};
1565 PAHCI_PORT_EXTENSION PortExtension;
1566 ULONG commandSlotMask, occupiedSlots, slotIndex, NCS;
1567
1568 AhciDebugPrint("AhciProcessIO()\n");
1569 AhciDebugPrint("\tPathId: %d\n", PathId);
1570
1571 PortExtension = &AdapterExtension->PortExtension[PathId];
1572
1573 NT_ASSERT(PathId < AdapterExtension->PortCount);
1574
1575 // Acquire Lock
1576 StorPortAcquireSpinLock(AdapterExtension, InterruptLock, NULL, &lockhandle);
1577
1578 // add Srb to queue
1579 AddQueue(&PortExtension->SrbQueue, Srb);
1580
1581 if (PortExtension->DeviceParams.IsActive == FALSE)
1582 {
1583 // Release Lock
1584 StorPortReleaseSpinLock(AdapterExtension, &lockhandle);
1585 return; // we should wait for device to get active
1586 }
1587
1588 occupiedSlots = (PortExtension->QueueSlots | PortExtension->CommandIssuedSlots); // Busy command slots for given port
1589 NCS = AHCI_Global_Port_CAP_NCS(AdapterExtension->CAP);
1590 commandSlotMask = (1 << NCS) - 1; // available slots mask
1591
1592 commandSlotMask = (commandSlotMask & ~occupiedSlots);
1593 if(commandSlotMask != 0)
1594 {
1595 // iterate over HBA port slots
1596 for (slotIndex = 0; slotIndex < NCS; slotIndex++)
1597 {
1598 // find first free slot
1599 if ((commandSlotMask & (1 << slotIndex)) != 0)
1600 {
1601 tmpSrb = RemoveQueue(&PortExtension->SrbQueue);
1602 if (tmpSrb != NULL)
1603 {
1604 NT_ASSERT(tmpSrb->PathId == PathId);
1605 AhciProcessSrb(PortExtension, tmpSrb, slotIndex);
1606 }
1607 else
1608 {
1609 break;
1610 }
1611 }
1612 else
1613 {
1614 break;
1615 }
1616 }
1617 }
1618
1619 // program HBA port
1620 AhciActivatePort(PortExtension);
1621
1622 // Release Lock
1623 StorPortReleaseSpinLock(AdapterExtension, &lockhandle);
1624
1625 return;
1626}// -- AhciProcessIO();
_In_ ULONG _In_ BOOLEAN _In_ ULONG _In_ UCHAR PathId
Definition: classpnp.h:1313
FORCEINLINE BOOLEAN AddQueue(__inout PAHCI_QUEUE Queue, __in PVOID Srb)
Definition: storahci.c:2503
FORCEINLINE PVOID RemoveQueue(__inout PAHCI_QUEUE Queue)
Definition: storahci.c:2534
VOID AhciProcessSrb(__in PAHCI_PORT_EXTENSION PortExtension, __in PSCSI_REQUEST_BLOCK Srb, __in ULONG SlotIndex)
Definition: storahci.c:1366
VOID AhciActivatePort(__in PAHCI_PORT_EXTENSION PortExtension)
Definition: storahci.c:1492
#define AHCI_Global_Port_CAP_NCS(x)
Definition: storahci.h:81
FORCEINLINE VOID StorPortReleaseSpinLock(_In_ PVOID DeviceExtension, _Inout_ PSTOR_LOCK_HANDLE LockHandle)
Definition: storport.h:7951
FORCEINLINE VOID StorPortAcquireSpinLock(_In_ PVOID DeviceExtension, _In_ STOR_SPINLOCK SpinLock, _In_ PVOID LockContext, _Inout_ PSTOR_LOCK_HANDLE LockHandle)
Definition: storport.h:7936
@ InterruptLock
Definition: storport.h:1434
struct _AHCI_PORT_EXTENSION::@1584 DeviceParams
ULONG CommandIssuedSlots
Definition: storahci.h:466
AHCI_QUEUE SrbQueue
Definition: storahci.h:486
UCHAR PathId
Definition: srb.h:253

Referenced by AhciHwStartIo().

◆ AhciZeroMemory()

FORCEINLINE VOID AhciZeroMemory ( __out PCHAR  Buffer,
__in ULONG  BufferSize 
)

Definition at line 2445 of file storahci.c.

2449{
2450 ULONG i;
2451 for (i = 0; i < BufferSize; i++)
2452 {
2453 Buffer[i] = 0;
2454 }
2455
2456 return;
2457}// -- AhciZeroMemory();
Definition: bufpool.h:45
#define BufferSize
Definition: mmc.h:75
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248

Referenced by AhciAllocateResourceForAdapter(), AhciATA_CFIS(), AhciATAPI_CFIS(), DeviceInquiryRequest(), DeviceReportLuns(), and DeviceRequestSense().

◆ C_ASSERT() [1/45]

C_ASSERT ( (sizeof(AHCI_COMMAND_TABLE) % 128)  = =0)

◆ C_ASSERT() [2/45]

C_ASSERT ( FIELD_OFFSET(AHCI_COMMAND_TABLE, ACMD)  = =0x40)

◆ C_ASSERT() [3/45]

C_ASSERT ( FIELD_OFFSET(AHCI_COMMAND_TABLE, CFIS)  = =0x00)

◆ C_ASSERT() [4/45]

C_ASSERT ( FIELD_OFFSET(AHCI_COMMAND_TABLE, PRDT)  = =0x80)

◆ C_ASSERT() [5/45]

C_ASSERT ( FIELD_OFFSET(AHCI_COMMAND_TABLE, RSV0)  = =0x50)

◆ C_ASSERT() [6/45]

C_ASSERT ( FIELD_OFFSET(AHCI_MEMORY_REGISTERS, BOHC)  = =0x28)

◆ C_ASSERT() [7/45]

C_ASSERT ( FIELD_OFFSET(AHCI_MEMORY_REGISTERS, CAP)  = =0x00)

◆ C_ASSERT() [8/45]

C_ASSERT ( FIELD_OFFSET(AHCI_MEMORY_REGISTERS, CAP2)  = =0x24)

◆ C_ASSERT() [9/45]

C_ASSERT ( FIELD_OFFSET(AHCI_MEMORY_REGISTERS, CCC_CTL)  = =0x14)

◆ C_ASSERT() [10/45]

C_ASSERT ( FIELD_OFFSET(AHCI_MEMORY_REGISTERS, CCC_PTS)  = =0x18)

◆ C_ASSERT() [11/45]

C_ASSERT ( FIELD_OFFSET(AHCI_MEMORY_REGISTERS, EM_CTL)  = =0x20)

◆ C_ASSERT() [12/45]

C_ASSERT ( FIELD_OFFSET(AHCI_MEMORY_REGISTERS, EM_LOC)  = =0x1C)

◆ C_ASSERT() [13/45]

C_ASSERT ( FIELD_OFFSET(AHCI_MEMORY_REGISTERS, GHC)  = =0x04)

◆ C_ASSERT() [14/45]

C_ASSERT ( FIELD_OFFSET(AHCI_MEMORY_REGISTERS, IS)  = =0x08)

◆ C_ASSERT() [15/45]

C_ASSERT ( FIELD_OFFSET(AHCI_MEMORY_REGISTERS, PI)  = =0x0C)

◆ C_ASSERT() [16/45]

C_ASSERT ( FIELD_OFFSET(AHCI_MEMORY_REGISTERS, PortList)  = =0x100)

◆ C_ASSERT() [17/45]

C_ASSERT ( FIELD_OFFSET(AHCI_MEMORY_REGISTERS, Reserved)  = =0x2C)

◆ C_ASSERT() [18/45]

C_ASSERT ( FIELD_OFFSET(AHCI_MEMORY_REGISTERS, VendorSpecific)  = =0xA0)

◆ C_ASSERT() [19/45]

C_ASSERT ( FIELD_OFFSET(AHCI_MEMORY_REGISTERS, VS)  = =0x10)

◆ C_ASSERT() [20/45]

C_ASSERT ( FIELD_OFFSET(AHCI_PORT, CI)  = =0x38)

◆ C_ASSERT() [21/45]

C_ASSERT ( FIELD_OFFSET(AHCI_PORT, CLB)  = =0x00)

◆ C_ASSERT() [22/45]

C_ASSERT ( FIELD_OFFSET(AHCI_PORT, CLBU)  = =0x04)

◆ C_ASSERT() [23/45]

C_ASSERT ( FIELD_OFFSET(AHCI_PORT, CMD)  = =0x18)

◆ C_ASSERT() [24/45]

C_ASSERT ( FIELD_OFFSET(AHCI_PORT, FB)  = =0x08)

◆ C_ASSERT() [25/45]

C_ASSERT ( FIELD_OFFSET(AHCI_PORT, FBS)  = =0x40)

◆ C_ASSERT() [26/45]

C_ASSERT ( FIELD_OFFSET(AHCI_PORT, FBU)  = =0x0C)

◆ C_ASSERT() [27/45]

C_ASSERT ( FIELD_OFFSET(AHCI_PORT, IE)  = =0x14)

◆ C_ASSERT() [28/45]

C_ASSERT ( FIELD_OFFSET(AHCI_PORT, IS)  = =0x10)

◆ C_ASSERT() [29/45]

C_ASSERT ( FIELD_OFFSET(AHCI_PORT, RSV0)  = =0x1C)

◆ C_ASSERT() [30/45]

C_ASSERT ( FIELD_OFFSET(AHCI_PORT, RSV1)  = =0x44)

◆ C_ASSERT() [31/45]

C_ASSERT ( FIELD_OFFSET(AHCI_PORT, SACT)  = =0x34)

◆ C_ASSERT() [32/45]

C_ASSERT ( FIELD_OFFSET(AHCI_PORT, SCTL)  = =0x2C)

◆ C_ASSERT() [33/45]

C_ASSERT ( FIELD_OFFSET(AHCI_PORT, SERR)  = =0x30)

◆ C_ASSERT() [34/45]

C_ASSERT ( FIELD_OFFSET(AHCI_PORT, SIG)  = =0x24)

◆ C_ASSERT() [35/45]

C_ASSERT ( FIELD_OFFSET(AHCI_PORT, SNTF)  = =0x3C)

◆ C_ASSERT() [36/45]

C_ASSERT ( FIELD_OFFSET(AHCI_PORT, SSTS)  = =0x28)

◆ C_ASSERT() [37/45]

C_ASSERT ( FIELD_OFFSET(AHCI_PORT, TFD)  = =0x20)

◆ C_ASSERT() [38/45]

C_ASSERT ( FIELD_OFFSET(AHCI_PORT, Vendor)  = =0x70)

◆ C_ASSERT() [39/45]

◆ C_ASSERT() [40/45]

C_ASSERT ( sizeof(AHCI_GHC)  = =sizeof(ULONG))

◆ C_ASSERT() [41/45]

◆ C_ASSERT() [42/45]

C_ASSERT ( sizeof(AHCI_PORT_CMD)  = =sizeof(ULONG))

◆ C_ASSERT() [43/45]

◆ C_ASSERT() [44/45]

◆ C_ASSERT() [45/45]

C_ASSERT ( sizeof(AHCI_TASK_FILE_DATA)  = =sizeof(ULONG))

◆ DeviceInquiryRequest()

UCHAR DeviceInquiryRequest ( __in PAHCI_ADAPTER_EXTENSION  AdapterExtension,
__in PSCSI_REQUEST_BLOCK  Srb,
__in PCDB  Cdb 
)

Definition at line 2252 of file storahci.c.

2257{
2258 PVOID DataBuffer;
2259 PAHCI_SRB_EXTENSION SrbExtension;
2260 PAHCI_PORT_EXTENSION PortExtension;
2261 PVPD_SUPPORTED_PAGES_PAGE VpdOutputBuffer;
2262 ULONG DataBufferLength, RequiredDataBufferLength;
2263
2264 AhciDebugPrint("DeviceInquiryRequest()\n");
2265
2266 NT_ASSERT(Cdb->CDB10.OperationCode == SCSIOP_INQUIRY);
2267 NT_ASSERT(IsPortValid(AdapterExtension, Srb->PathId));
2268
2269 SrbExtension = GetSrbExtension(Srb);
2270 PortExtension = &AdapterExtension->PortExtension[Srb->PathId];
2271
2272 if (PortExtension->DeviceParams.DeviceType == AHCI_DEVICE_TYPE_ATAPI)
2273 {
2274 return AhciATAPICommand(AdapterExtension, Srb, Cdb);
2275 }
2276
2277 if (Srb->Lun != 0)
2278 {
2280 }
2281 else if (Cdb->CDB6INQUIRY3.EnableVitalProductData == 0)
2282 {
2283 // 3.6.1
2284 // If the EVPD bit is set to zero, the device server shall return the standard INQUIRY data
2285 AhciDebugPrint("\tEVPD Inquired\n");
2286 NT_ASSERT(SrbExtension != NULL);
2287
2288 SrbExtension->AtaFunction = ATA_FUNCTION_ATA_IDENTIFY;
2289 SrbExtension->Flags |= ATA_FLAGS_DATA_IN;
2290 SrbExtension->CompletionRoutine = InquiryCompletion;
2291 SrbExtension->CommandReg = IDE_COMMAND_NOT_VALID;
2292
2293 // TODO: Should use AhciZeroMemory
2294 SrbExtension->FeaturesLow = 0;
2295 SrbExtension->LBA0 = 0;
2296 SrbExtension->LBA1 = 0;
2297 SrbExtension->LBA2 = 0;
2298 SrbExtension->Device = 0xA0;
2299 SrbExtension->LBA3 = 0;
2300 SrbExtension->LBA4 = 0;
2301 SrbExtension->LBA5 = 0;
2302 SrbExtension->FeaturesHigh = 0;
2303 SrbExtension->SectorCountLow = 0;
2304 SrbExtension->SectorCountHigh = 0;
2305
2306 SrbExtension->Sgl.NumberOfElements = 1;
2307 SrbExtension->Sgl.List[0].PhysicalAddress.LowPart = PortExtension->IdentifyDeviceDataPhysicalAddress.LowPart;
2309 SrbExtension->Sgl.List[0].Length = sizeof(IDENTIFY_DEVICE_DATA);
2310
2311 SrbExtension->pSgl = &SrbExtension->Sgl;
2312 return SRB_STATUS_PENDING;
2313 }
2314 else
2315 {
2316 AhciDebugPrint("\tVPD Inquired\n");
2317
2318 DataBuffer = Srb->DataBuffer;
2320 RequiredDataBufferLength = DataBufferLength; // make the compiler happy :p
2321
2322 if (DataBuffer == NULL)
2323 {
2325 }
2326
2327 AhciZeroMemory(DataBuffer, DataBufferLength);
2328
2329 switch(Cdb->CDB6INQUIRY3.PageCode)
2330 {
2332 {
2333 AhciDebugPrint("\tVPD_SUPPORTED_PAGES\n");
2334 RequiredDataBufferLength = sizeof(VPD_SUPPORTED_PAGES_PAGE) + 1;
2335
2336 if (DataBufferLength < RequiredDataBufferLength)
2337 {
2338 AhciDebugPrint("\tDataBufferLength: %d Required: %d\n", DataBufferLength, RequiredDataBufferLength);
2340 }
2341
2342 VpdOutputBuffer = (PVPD_SUPPORTED_PAGES_PAGE)DataBuffer;
2343
2344 VpdOutputBuffer->DeviceType = PortExtension->DeviceParams.AccessType;
2345 VpdOutputBuffer->DeviceTypeQualifier = 0;
2346 VpdOutputBuffer->PageCode = VPD_SUPPORTED_PAGES;
2347 VpdOutputBuffer->PageLength = 1;
2348 VpdOutputBuffer->SupportedPageList[0] = VPD_SUPPORTED_PAGES;
2349 //VpdOutputBuffer->SupportedPageList[1] = VPD_SERIAL_NUMBER;
2350 //VpdOutputBuffer->SupportedPageList[2] = VPD_DEVICE_IDENTIFIERS;
2351
2352 NT_ASSERT(VpdOutputBuffer->DeviceType == DIRECT_ACCESS_DEVICE);
2353 }
2354 break;
2355 case VPD_SERIAL_NUMBER:
2356 {
2357 AhciDebugPrint("\tVPD_SERIAL_NUMBER\n");
2358 }
2359 break;
2361 {
2362 AhciDebugPrint("\tVPD_DEVICE_IDENTIFIERS\n");
2363 }
2364 break;
2365 default:
2366 AhciDebugPrint("\tPageCode: %x\n", Cdb->CDB6INQUIRY3.PageCode);
2368 }
2369
2370 Srb->DataTransferLength = RequiredDataBufferLength;
2371 return SRB_STATUS_SUCCESS;
2372 }
2373}// -- DeviceInquiryRequest();
#define IDE_COMMAND_NOT_VALID
Definition: ata.h:709
struct _IDENTIFY_DEVICE_DATA IDENTIFY_DEVICE_DATA
#define SCSIOP_INQUIRY
Definition: cdrw_hw.h:888
#define DIRECT_ACCESS_DEVICE
Definition: cdrw_hw.h:1144
#define SRB_STATUS_PENDING
Definition: srb.h:340
#define SRB_STATUS_SELECTION_TIMEOUT
Definition: srb.h:350
#define SRB_STATUS_SUCCESS
Definition: srb.h:341
#define SRB_STATUS_INVALID_REQUEST
Definition: srb.h:346
_Must_inspect_result_ _In_ PFILE_OBJECT _In_ ULONG _In_opt_ GUID _In_ USHORT DataBufferLength
Definition: fltkernel.h:1270
struct _VPD_SUPPORTED_PAGES_PAGE VPD_SUPPORTED_PAGES_PAGE
struct _VPD_SUPPORTED_PAGES_PAGE * PVPD_SUPPORTED_PAGES_PAGE
#define VPD_SUPPORTED_PAGES
Definition: scsi.h:2450
#define VPD_SERIAL_NUMBER
Definition: scsi.h:2451
#define VPD_DEVICE_IDENTIFIERS
Definition: scsi.h:2452
FORCEINLINE BOOLEAN IsPortValid(__in PAHCI_ADAPTER_EXTENSION AdapterExtension, __in ULONG pathId)
Definition: storahci.c:2473
UCHAR AhciATAPICommand(__in PAHCI_ADAPTER_EXTENSION AdapterExtension, __in PSCSI_REQUEST_BLOCK Srb, __in PCDB Cdb)
Definition: storahci.c:1845
VOID InquiryCompletion(__in PVOID _Extension, __in PVOID _Srb)
Definition: storahci.c:1683
FORCEINLINE VOID AhciZeroMemory(__out PCHAR Buffer, __in ULONG BufferSize)
Definition: storahci.c:2445
FORCEINLINE PAHCI_SRB_EXTENSION GetSrbExtension(__in PSCSI_REQUEST_BLOCK Srb)
Definition: storahci.c:2566
#define AHCI_DEVICE_TYPE_ATAPI
Definition: storahci.h:31
#define ATA_FUNCTION_ATA_IDENTIFY
Definition: storahci.h:63
STOR_PHYSICAL_ADDRESS IdentifyDeviceDataPhysicalAddress
Definition: storahci.h:493
PAHCI_COMPLETION_ROUTINE CompletionRoutine
Definition: storahci.h:561
PLOCAL_SCATTER_GATHER_LIST pSgl
Definition: storahci.h:560
LOCAL_SCATTER_GATHER_LIST Sgl
Definition: storahci.h:559
STOR_SCATTER_GATHER_ELEMENT List[MAXIMUM_AHCI_PRDT_ENTRIES]
Definition: storahci.h:535
PVOID DataBuffer
Definition: srb.h:263
ULONG DataTransferLength
Definition: srb.h:261
STOR_PHYSICAL_ADDRESS PhysicalAddress
Definition: storport.h:5673
UCHAR SupportedPageList[0]
Definition: scsi.h:2679
#define ATA_FLAGS_DATA_IN
Definition: uata_ctl.h:222
struct _CDB::_CDB6INQUIRY3 CDB6INQUIRY3
ULONG LowPart
Definition: typedefs.h:106

Referenced by AhciHwStartIo().

◆ DeviceReportLuns()

UCHAR DeviceReportLuns ( __in PAHCI_ADAPTER_EXTENSION  AdapterExtension,
__in PSCSI_REQUEST_BLOCK  Srb,
__in PCDB  Cdb 
)

Definition at line 2198 of file storahci.c.

2203{
2204 PLUN_LIST LunList;
2205 PAHCI_PORT_EXTENSION PortExtension;
2206
2207 AhciDebugPrint("DeviceReportLuns()\n");
2208
2210
2211 PortExtension = &AdapterExtension->PortExtension[Srb->PathId];
2212
2214 NT_ASSERT(Cdb->CDB10.OperationCode == SCSIOP_REPORT_LUNS);
2215
2216 if (PortExtension->DeviceParams.DeviceType == AHCI_DEVICE_TYPE_ATAPI)
2217 {
2218 return AhciATAPICommand(AdapterExtension, Srb, Cdb);
2219 }
2220
2221 LunList = (PLUN_LIST)Srb->DataBuffer;
2222
2223 NT_ASSERT(LunList != NULL);
2224
2225 AhciZeroMemory((PCHAR)LunList, sizeof(LUN_LIST));
2226
2227 LunList->LunListLength[3] = 8;
2228
2230 Srb->DataTransferLength = sizeof(LUN_LIST);
2231
2232 return SRB_STATUS_SUCCESS;
2233}// -- DeviceReportLuns();
#define SCSISTAT_GOOD
Definition: cdrw_hw.h:1078
#define SCSIOP_REPORT_LUNS
Definition: scsi.h:921
#define UNREFERENCED_PARAMETER(P)
Definition: ntbasedef.h:329
struct _LUN_LIST LUN_LIST
struct _LUN_LIST * PLUN_LIST
UCHAR ScsiStatus
Definition: srb.h:252
char * PCHAR
Definition: typedefs.h:51

Referenced by AhciHwStartIo().

◆ DeviceRequestCapacity()

UCHAR DeviceRequestCapacity ( __in PAHCI_ADAPTER_EXTENSION  AdapterExtension,
__in PSCSI_REQUEST_BLOCK  Srb,
__in PCDB  Cdb 
)

Definition at line 2100 of file storahci.c.

2105{
2106 ULONG MaxLba, BytesPerLogicalSector;
2107 PREAD_CAPACITY_DATA ReadCapacity;
2108 PAHCI_PORT_EXTENSION PortExtension;
2109
2110 AhciDebugPrint("DeviceRequestCapacity()\n");
2111
2112 UNREFERENCED_PARAMETER(AdapterExtension);
2114
2116 NT_ASSERT(IsPortValid(AdapterExtension, Srb->PathId));
2117
2118
2119 PortExtension = &AdapterExtension->PortExtension[Srb->PathId];
2120
2121 if (PortExtension->DeviceParams.DeviceType == AHCI_DEVICE_TYPE_ATAPI)
2122 {
2123 return AhciATAPICommand(AdapterExtension, Srb, Cdb);
2124 }
2125
2126 if (Cdb->CDB10.OperationCode == SCSIOP_READ_CAPACITY)
2127 {
2128 ReadCapacity = (PREAD_CAPACITY_DATA)Srb->DataBuffer;
2129
2130 BytesPerLogicalSector = PortExtension->DeviceParams.BytesPerLogicalSector;
2131 MaxLba = (ULONG)PortExtension->DeviceParams.MaxLba.QuadPart - 1;
2132
2133 // I trust you windows :D
2135
2136 // I trust you user :D
2137 NT_ASSERT(PortExtension->DeviceParams.MaxLba.QuadPart < (ULONG)-1);
2138
2139 // Actually I don't trust anyone :p
2141
2142 REVERSE_BYTES(&ReadCapacity->BytesPerBlock, &BytesPerLogicalSector);
2143 REVERSE_BYTES(&ReadCapacity->LogicalBlockAddress, &MaxLba);
2144 }
2145 else
2146 {
2147 AhciDebugPrint("\tSCSIOP_READ_CAPACITY16 not supported\n");
2149 }
2150
2151 return SRB_STATUS_SUCCESS;
2152}// -- DeviceRequestCapacity();
struct _READ_CAPACITY_DATA * PREAD_CAPACITY_DATA
struct _READ_CAPACITY_DATA READ_CAPACITY_DATA
#define SCSIOP_READ_CAPACITY
Definition: cdrw_hw.h:904
#define REVERSE_BYTES(Destination, Source)
Definition: scsi.h:3511
ULONG LogicalBlockAddress
Definition: cdrw_hw.h:1471

Referenced by AhciHwStartIo().

◆ DeviceRequestComplete()

UCHAR DeviceRequestComplete ( __in PAHCI_ADAPTER_EXTENSION  AdapterExtension,
__in PSCSI_REQUEST_BLOCK  Srb,
__in PCDB  Cdb 
)

Definition at line 2168 of file storahci.c.

2173{
2174 AhciDebugPrint("DeviceRequestComplete()\n");
2175
2176 UNREFERENCED_PARAMETER(AdapterExtension);
2178
2180
2181 return SRB_STATUS_SUCCESS;
2182}// -- DeviceRequestComplete();

◆ DeviceRequestReadWrite()

UCHAR DeviceRequestReadWrite ( __in PAHCI_ADAPTER_EXTENSION  AdapterExtension,
__in PSCSI_REQUEST_BLOCK  Srb,
__in PCDB  Cdb 
)

Definition at line 1990 of file storahci.c.

1995{
1996 BOOLEAN IsReading;
1997 ULONG64 StartOffset;
1998 PAHCI_SRB_EXTENSION SrbExtension;
1999 PAHCI_PORT_EXTENSION PortExtension;
2000 ULONG DataTransferLength, BytesPerSector, SectorCount;
2001
2002 AhciDebugPrint("DeviceRequestReadWrite()\n");
2003
2004 NT_ASSERT(IsPortValid(AdapterExtension, Srb->PathId));
2005 NT_ASSERT((Cdb->CDB10.OperationCode == SCSIOP_READ) || (Cdb->CDB10.OperationCode == SCSIOP_WRITE));
2006
2007 SrbExtension = GetSrbExtension(Srb);
2008 PortExtension = &AdapterExtension->PortExtension[Srb->PathId];
2009
2010 if (PortExtension->DeviceParams.DeviceType == AHCI_DEVICE_TYPE_ATAPI)
2011 {
2012 return AhciATAPICommand(AdapterExtension, Srb, Cdb);
2013 }
2014
2015 DataTransferLength = Srb->DataTransferLength;
2016 BytesPerSector = PortExtension->DeviceParams.BytesPerLogicalSector;
2017
2018 NT_ASSERT(BytesPerSector > 0);
2019
2020 //ROUND_UP(DataTransferLength, BytesPerSector);
2021
2022 SectorCount = DataTransferLength / BytesPerSector;
2023
2024 Srb->DataTransferLength = SectorCount * BytesPerSector;
2025
2026 StartOffset = AhciGetLba(Cdb, Srb->CdbLength);
2027 IsReading = (Cdb->CDB10.OperationCode == SCSIOP_READ);
2028
2030
2031 SrbExtension->AtaFunction = ATA_FUNCTION_ATA_READ;
2032 SrbExtension->Flags |= ATA_FLAGS_USE_DMA;
2033 SrbExtension->CompletionRoutine = NULL;
2034
2035 if (IsReading)
2036 {
2037 SrbExtension->Flags |= ATA_FLAGS_DATA_IN;
2038 SrbExtension->CommandReg = IDE_COMMAND_READ_DMA;
2039 }
2040 else
2041 {
2042 SrbExtension->Flags |= ATA_FLAGS_DATA_OUT;
2043 SrbExtension->CommandReg = IDE_COMMAND_WRITE_DMA;
2044 }
2045
2046 SrbExtension->FeaturesLow = 0;
2047 SrbExtension->LBA0 = (StartOffset >> 0) & 0xFF;
2048 SrbExtension->LBA1 = (StartOffset >> 8) & 0xFF;
2049 SrbExtension->LBA2 = (StartOffset >> 16) & 0xFF;
2050
2051 SrbExtension->Device = (0xA0 | IDE_LBA_MODE);
2052
2053 if (PortExtension->DeviceParams.Lba48BitMode)
2054 {
2055 SrbExtension->Flags |= ATA_FLAGS_48BIT_COMMAND;
2056
2057 if (IsReading)
2058 {
2059 SrbExtension->CommandReg = IDE_COMMAND_READ_DMA_EXT;
2060 }
2061 else
2062 {
2063 SrbExtension->CommandReg = IDE_COMMAND_WRITE_DMA_EXT;
2064 }
2065
2066 SrbExtension->LBA3 = (StartOffset >> 24) & 0xFF;
2067 SrbExtension->LBA4 = (StartOffset >> 32) & 0xFF;
2068 SrbExtension->LBA5 = (StartOffset >> 40) & 0xFF;
2069 }
2070 else
2071 {
2073 }
2074
2075 SrbExtension->FeaturesHigh = 0;
2076 SrbExtension->SectorCountLow = (SectorCount >> 0) & 0xFF;
2077 SrbExtension->SectorCountHigh = (SectorCount >> 8) & 0xFF;
2078
2079 NT_ASSERT(SectorCount < 0x100);
2080
2081 SrbExtension->pSgl = (PLOCAL_SCATTER_GATHER_LIST)StorPortGetScatterGatherList(AdapterExtension, Srb);
2082
2083 return SRB_STATUS_PENDING;
2084}// -- DeviceRequestReadWrite();
unsigned char BOOLEAN
Definition: actypes.h:127
#define IDE_COMMAND_READ_DMA_EXT
Definition: ata.h:646
#define IDE_LBA_MODE
Definition: ata.h:613
#define IDE_COMMAND_WRITE_DMA_EXT
Definition: ata.h:652
#define IDE_COMMAND_WRITE_DMA
Definition: atapi.h:115
#define IDE_COMMAND_READ_DMA
Definition: atapi.h:114
#define SCSIOP_WRITE
Definition: cdrw_hw.h:906
#define SCSIOP_READ
Definition: cdrw_hw.h:905
ULONG SectorCount
Definition: part_brfr.c:22
FORCEINLINE ULONG64 AhciGetLba(__in PCDB Cdb, __in ULONG CdbLength)
Definition: storahci.c:2597
#define ATA_FUNCTION_ATA_READ
Definition: storahci.h:64
struct _LOCAL_SCATTER_GATHER_LIST * PLOCAL_SCATTER_GATHER_LIST
STORPORT_API PSTOR_SCATTER_GATHER_LIST NTAPI StorPortGetScatterGatherList(_In_ PVOID HwDeviceExtension, _In_ PSCSI_REQUEST_BLOCK Srb)
Definition: storport.c:1269
UCHAR CdbLength
Definition: srb.h:258
#define ATA_FLAGS_USE_DMA
Definition: uata_ctl.h:226
#define ATA_FLAGS_DATA_OUT
Definition: uata_ctl.h:221
#define ATA_FLAGS_48BIT_COMMAND
Definition: uata_ctl.h:223

Referenced by AhciHwStartIo().

◆ DeviceRequestSense()

UCHAR DeviceRequestSense ( __in PAHCI_ADAPTER_EXTENSION  AdapterExtension,
__in PSCSI_REQUEST_BLOCK  Srb,
__in PCDB  Cdb 
)

Definition at line 1935 of file storahci.c.

1940{
1941 PMODE_PARAMETER_HEADER ModeHeader;
1942 PAHCI_PORT_EXTENSION PortExtension;
1943
1944 AhciDebugPrint("DeviceRequestSense()\n");
1945
1946 NT_ASSERT(IsPortValid(AdapterExtension, Srb->PathId));
1947 NT_ASSERT(Cdb->CDB10.OperationCode == SCSIOP_MODE_SENSE);
1948
1949 PortExtension = &AdapterExtension->PortExtension[Srb->PathId];
1950
1951 if (PortExtension->DeviceParams.DeviceType == AHCI_DEVICE_TYPE_ATAPI)
1952 {
1953 return AhciATAPICommand(AdapterExtension, Srb, Cdb);
1954 }
1955
1956 ModeHeader = (PMODE_PARAMETER_HEADER)Srb->DataBuffer;
1957
1958 NT_ASSERT(ModeHeader != NULL);
1959
1961
1962 ModeHeader->ModeDataLength = sizeof(MODE_PARAMETER_HEADER);
1963 ModeHeader->MediumType = 0;
1964 ModeHeader->DeviceSpecificParameter = 0;
1965 ModeHeader->BlockDescriptorLength = 0;
1966
1967 if (Cdb->MODE_SENSE.PageCode == MODE_SENSE_CURRENT_VALUES)
1968 {
1969 ModeHeader->ModeDataLength = sizeof(MODE_PARAMETER_HEADER) + sizeof(MODE_PARAMETER_BLOCK);
1970 ModeHeader->BlockDescriptorLength = sizeof(MODE_PARAMETER_BLOCK);
1971 }
1972
1973 return SRB_STATUS_SUCCESS;
1974}// -- DeviceRequestSense();
struct _MODE_PARAMETER_HEADER MODE_PARAMETER_HEADER
#define MODE_SENSE_CURRENT_VALUES
Definition: cdrw_hw.h:859
#define SCSIOP_MODE_SENSE
Definition: cdrw_hw.h:896
struct _MODE_PARAMETER_BLOCK MODE_PARAMETER_BLOCK
struct _MODE_PARAMETER_HEADER * PMODE_PARAMETER_HEADER
UCHAR DeviceSpecificParameter
Definition: cdrw_hw.h:2507
struct _CDB::_MODE_SENSE MODE_SENSE

Referenced by AhciHwStartIo().

◆ GetSrbExtension()

Definition at line 2566 of file storahci.c.

2569{
2570 ULONG Offset;
2571 ULONG_PTR SrbExtension;
2572
2573 SrbExtension = (ULONG_PTR)Srb->SrbExtension;
2574 Offset = SrbExtension % 128;
2575
2576 // CommandTable should be 128 byte aligned
2577 if (Offset != 0)
2578 Offset = 128 - Offset;
2579
2580 return (PAHCI_SRB_EXTENSION)(SrbExtension + Offset);
2581}// -- PAHCI_SRB_EXTENSION();
#define ULONG_PTR
Definition: config.h:101
if(dx< 0)
Definition: linetemp.h:194
_In_ ULONG _In_ ULONG Offset
Definition: ntddpcm.h:101
PVOID SrbExtension
Definition: srb.h:267
uint32_t ULONG_PTR
Definition: typedefs.h:65

Referenced by AhciATAPICommand(), AhciCommandCompletionDpcRoutine(), AhciCompleteIssuedSrb(), AhciProcessSrb(), DeviceInquiryRequest(), DeviceRequestReadWrite(), and InquiryCompletion().

◆ IsPortValid()

FORCEINLINE BOOLEAN IsPortValid ( __in PAHCI_ADAPTER_EXTENSION  AdapterExtension,
__in ULONG  pathId 
)

Definition at line 2473 of file storahci.c.

2477{
2479
2480 if (pathId >= AdapterExtension->PortCount)
2481 {
2482 return FALSE;
2483 }
2484
2485 return AdapterExtension->PortExtension[pathId].DeviceParams.IsActive;
2486}// -- IsPortValid()
#define MAXIMUM_AHCI_PORT_COUNT
Definition: storahci.h:21

Referenced by AhciHwInterrupt(), AhciHwResetBus(), AhciHwStartIo(), AhciInterruptHandler(), DeviceInquiryRequest(), DeviceRequestCapacity(), DeviceRequestReadWrite(), and DeviceRequestSense().

◆ RemoveQueue()

FORCEINLINE PVOID RemoveQueue ( __inout PAHCI_QUEUE  Queue)

Definition at line 2534 of file storahci.c.

2537{
2538 PVOID Srb;
2539
2542
2543 if (Queue->Head == Queue->Tail)
2544 return NULL;
2545
2546 Srb = Queue->Buffer[Queue->Tail++];
2548
2549 return Srb;
2550}// -- RemoveQueue();

Referenced by AhciCommandCompletionDpcRoutine(), and AhciProcessIO().