2 * Copyright (C) 2014 Raghava Aditya <Raghava.Aditya@pmcs.com>
3 * Copyright (C) 2015 Nidhi Malhotra <Nidhi.Malhotra@pmcs.com>
5 * SPDX-License-Identifier: GPL-2.0-or-later
9 #if defined(_WIN32) || defined(_WIN64)
19 #if __x86_64__ || __ppc64__
26 #define METHOD_BUFFERED 0
27 #define METHOD_NEITHER 3
29 #if defined(_WIN32) || defined(_WIN64)
30 #define FSAMPCTL_SCSI_BASE IOCTL_SCSI_BASE
31 #define ARCIOCTL_SEND_RAW_SRB CTL_CODE(FSAMPCTL_SCSI_BASE, 2201, METHOD_BUFFERED, FILE_ANY_ACCESS)
32 #define AACRAID_SAS_SIGNATURE "ARCSAS"
33 #define SRB_FLAGS_DATA_IN 0x00000040
34 #define SRB_FLAGS_DATA_OUT 0x00000080
35 #define SRB_FLAGS_NO_DATA_TRANSFER 0x00000000
37 #define CTL_CODE(function, method) ((4<< 16) | ((function) << 2) | (method) )
39 #define FSACTL_SEND_RAW_SRB CTL_CODE(2067, METHOD_BUFFERED)
41 #define SRB_FUNCTION_EXECUTE_SCSI 0X00
43 #define SRB_DataIn 0x0040
44 #define SRB_DataOut 0x0080
45 #define SRB_NoDataXfer 0x0000
54 uint32_t length
; /* Length. */
64 user_sgentry64 sg64
[1];
69 user_sgentry32 sg32
[1];
72 #if defined(_WIN32) || defined(_WIN64)
73 typedef struct _SCSI_REQUEST_BLOCK
{
74 USHORT Length
; // offset 0
75 UCHAR Function
; // offset 2
76 UCHAR SrbStatus
; // offset 3
77 UCHAR ScsiStatus
; // offset 4
78 UCHAR PathId
; // offset 5
79 UCHAR TargetId
; // offset 6
80 UCHAR Lun
; // offset 7
81 UCHAR QueueTag
; // offset 8
82 UCHAR QueueAction
; // offset 9
83 UCHAR CdbLength
; // offset a
84 UCHAR SenseInfoBufferLength
; // offset b
85 ULONG SrbFlags
; // offset c
86 ULONG DataTransferLength
; // offset 10
87 ULONG TimeOutValue
; // offset 14
88 PVOID DataBuffer
; // offset 18
89 PVOID SenseInfoBuffer
; // offset 1c
90 struct _SCSI_REQUEST_BLOCK
*NextSrb
; // offset 20
91 PVOID OriginalRequest
; // offset 24
92 PVOID SrbExtension
; // offset 28
94 ULONG InternalStatus
; // offset 2c
95 ULONG QueueSortKey
; // offset 2c
100 // Force PVOID alignment of Cdb
105 UCHAR Cdb
[16]; // offset 30
106 } SCSI_REQUEST_BLOCK
, *PSCSI_REQUEST_BLOCK
;
108 #define SCSI_REQUEST_BLOCK_SIZE sizeof(SCSI_REQUEST_BLOCK)
112 uint32_t function
; //SRB_FUNCTION_EXECUTE_SCSI 0x00
113 uint32_t channel
; //bus
114 uint32_t id
; //use the ID number this is wrong
115 uint32_t lun
; //Logical unit number
117 uint32_t flags
; //Interesting stuff I must say
118 uint32_t count
; // Data xfer size
119 uint32_t retry_limit
; // We shall see
120 uint32_t cdb_size
; // Length of CDB
121 uint8_t cdb
[16]; // The actual cdb command
122 user_sgmap64 sg64
; // pDatabuffer and address of Databuffer
126 uint32_t function
; //SRB_FUNCTION_EXECUTE_SCSI 0x00
127 uint32_t channel
; //bus
128 uint32_t id
; //use the ID number this is wrong
129 uint32_t lun
; //Logical unit number
131 uint32_t flags
; //Interesting stuff I must say
132 uint32_t count
; // Data xfer size
133 uint32_t retry_limit
; // We shall see
134 uint32_t cdb_size
; // Length of CDB
135 uint8_t cdb
[16]; // The actual cdb command
136 user_sgmap32 sg32
; // pDatabuffer and address of Databuffer
142 uint32_t scsi_status
;
143 uint32_t data_xfer_length
;
144 uint32_t sense_data_size
;
145 uint8_t sense_data
[30];