* Copyright (C) 2014 Raghava Aditya <Raghava.Aditya@pmcs.com>
* Copyright (C) 2015 Nidhi Malhotra <Nidhi.Malhotra@pmcs.com>
*
* SPDX-License-Identifier: GPL-2.0-or-later
*/
#if defined(_WIN32) || defined(_WIN64)
#ifdef _WIN64
#define ENVIRONMENT64
#else
#define ENVIRONMENT32
#endif
#endif
#if __GNUC__
#if __x86_64__ || __ppc64__
#define ENVIRONMENT64
#else
#define ENVIRONMENT32
#endif
#endif
#define METHOD_BUFFERED 0
#define METHOD_NEITHER 3
#if defined(_WIN32) || defined(_WIN64)
#define FSAMPCTL_SCSI_BASE IOCTL_SCSI_BASE
#define ARCIOCTL_SEND_RAW_SRB CTL_CODE(FSAMPCTL_SCSI_BASE, 2201, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define AACRAID_SAS_SIGNATURE "ARCSAS"
#define SRB_FLAGS_DATA_IN 0x00000040
#define SRB_FLAGS_DATA_OUT 0x00000080
#define SRB_FLAGS_NO_DATA_TRANSFER 0x00000000
#else
#define CTL_CODE(function, method) ((4<< 16) | ((function) << 2) | (method) )
#define FSACTL_SEND_RAW_SRB CTL_CODE(2067, METHOD_BUFFERED)
#endif
#define SRB_FUNCTION_EXECUTE_SCSI 0X00
#define SRB_DataIn 0x0040
#define SRB_DataOut 0x0080
#define SRB_NoDataXfer 0x0000
typedef struct {
uint32_t lo32;
uint32_t hi32;
} address64;
typedef struct {
address64 addr64;
uint32_t length;
} user_sgentry64;
typedef struct {
uint32_t addr32;
uint32_t length;
} user_sgentry32;
typedef struct {
uint32_t count;
user_sgentry64 sg64[1];
} user_sgmap64;
typedef struct {
uint32_t count;
user_sgentry32 sg32[1];
} user_sgmap32;
#if defined(_WIN32) || defined(_WIN64)
typedef struct _SCSI_REQUEST_BLOCK {
USHORT Length;
UCHAR Function;
UCHAR SrbStatus;
UCHAR ScsiStatus;
UCHAR PathId;
UCHAR TargetId;
UCHAR Lun;
UCHAR QueueTag;
UCHAR QueueAction;
UCHAR CdbLength;
UCHAR SenseInfoBufferLength;
ULONG SrbFlags;
ULONG DataTransferLength;
ULONG TimeOutValue;
PVOID DataBuffer;
PVOID SenseInfoBuffer;
struct _SCSI_REQUEST_BLOCK *NextSrb;
PVOID OriginalRequest;
PVOID SrbExtension;
union {
ULONG InternalStatus;
ULONG QueueSortKey;
};
#if defined(_WIN64)
ULONG Reserved;
#endif
UCHAR Cdb[16];
} SCSI_REQUEST_BLOCK, *PSCSI_REQUEST_BLOCK;
#define SCSI_REQUEST_BLOCK_SIZE sizeof(SCSI_REQUEST_BLOCK)
#else
typedef struct {
uint32_t function;
uint32_t channel;
uint32_t id;
uint32_t lun;
uint32_t timeout;
uint32_t flags;
uint32_t count;
uint32_t retry_limit;
uint32_t cdb_size;
uint8_t cdb[16];
user_sgmap64 sg64;
} user_aac_srb64;
typedef struct {
uint32_t function;
uint32_t channel;
uint32_t id;
uint32_t lun;
uint32_t timeout;
uint32_t flags;
uint32_t count;
uint32_t retry_limit;
uint32_t cdb_size;
uint8_t cdb[16];
user_sgmap32 sg32;
} user_aac_srb32;
typedef struct {
uint32_t status;
uint32_t srb_status;
uint32_t scsi_status;
uint32_t data_xfer_length;
uint32_t sense_data_size;
uint8_t sense_data[30];
} user_aac_reply;
#endif