[RTL][NTDLL]
[reactos.git] / reactos / drivers / filesystems / udfs / CDRW / scsi_port.h
1 ////////////////////////////////////////////////////////////////////
2 // Copyright (C) Alexander Telyatnikov, Ivan Keliukh, Yegor Anchishkin, SKIF Software, 1999-2013. Kiev, Ukraine
3 // All rights reserved
4 // This file was released under the GPLv2 on June 2015.
5 ////////////////////////////////////////////////////////////////////
6 /*
7
8 Module Name:
9
10 scsi_port.h
11
12 Abstract:
13
14 This is the include file that defines all constants and types for
15 accessing the SCSI port adapters.
16
17 Environment:
18
19 kernel mode only
20 */
21
22 #ifndef __SCSI_PORT_H__
23 #define __SCSI_PORT_H__
24
25 #ifndef WIN64
26
27 #include "srb.h"
28
29 #ifdef SCSIPORT_API
30 #undef SCSIPORT_API
31 #endif
32
33 // Device Name - this string is the name of the device. It is the name
34 // that should be passed to NtOpenFile when accessing the device.
35 //
36 // Note: For devices that support multiple units, it should be suffixed
37 // with the Ascii representation of the unit number.
38
39 #define IOCTL_SCSI_BASE FILE_DEVICE_CONTROLLER
40
41 #define DD_SCSI_DEVICE_NAME "\\Device\\ScsiPort"
42
43
44 // NtDeviceIoControlFile IoControlCode values for this device.
45 //
46 // Warning: Remember that the low two bits of the code specify how the
47 // buffers are passed to the driver!
48
49 #define IOCTL_SCSI_PASS_THROUGH CTL_CODE(IOCTL_SCSI_BASE, 0x0401, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
50 #define IOCTL_SCSI_MINIPORT CTL_CODE(IOCTL_SCSI_BASE, 0x0402, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
51 #define IOCTL_SCSI_GET_INQUIRY_DATA CTL_CODE(IOCTL_SCSI_BASE, 0x0403, METHOD_BUFFERED, FILE_ANY_ACCESS)
52 #define IOCTL_SCSI_GET_CAPABILITIES CTL_CODE(IOCTL_SCSI_BASE, 0x0404, METHOD_BUFFERED, FILE_ANY_ACCESS)
53 #define IOCTL_SCSI_PASS_THROUGH_DIRECT CTL_CODE(IOCTL_SCSI_BASE, 0x0405, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
54 #define IOCTL_SCSI_GET_ADDRESS CTL_CODE(IOCTL_SCSI_BASE, 0x0406, METHOD_BUFFERED, FILE_ANY_ACCESS)
55 #define IOCTL_SCSI_RESCAN_BUS CTL_CODE(IOCTL_SCSI_BASE, 0x0407, METHOD_BUFFERED, FILE_ANY_ACCESS)
56 #define IOCTL_SCSI_GET_DUMP_POINTERS CTL_CODE(IOCTL_SCSI_BASE, 0x0408, METHOD_BUFFERED, FILE_ANY_ACCESS)
57
58 // Define the SCSI pass through structure.
59
60 typedef struct _SCSI_PASS_THROUGH {
61 USHORT Length;
62 UCHAR ScsiStatus;
63 UCHAR PathId;
64 UCHAR TargetId;
65 UCHAR Lun;
66 UCHAR CdbLength;
67 UCHAR SenseInfoLength;
68 UCHAR DataIn;
69 ULONG DataTransferLength;
70 ULONG TimeOutValue;
71 ULONG DataBufferOffset;
72 ULONG SenseInfoOffset;
73 UCHAR Cdb[16];
74 }SCSI_PASS_THROUGH, *PSCSI_PASS_THROUGH;
75
76 // Define the SCSI pass through direct structure.
77
78 typedef struct _SCSI_PASS_THROUGH_DIRECT {
79 USHORT Length;
80 UCHAR ScsiStatus;
81 UCHAR PathId;
82 UCHAR TargetId;
83 UCHAR Lun;
84 UCHAR CdbLength;
85 UCHAR SenseInfoLength;
86 UCHAR DataIn;
87 ULONG DataTransferLength;
88 ULONG TimeOutValue;
89 PVOID DataBuffer;
90 ULONG SenseInfoOffset;
91 UCHAR Cdb[16];
92 }SCSI_PASS_THROUGH_DIRECT, *PSCSI_PASS_THROUGH_DIRECT;
93
94 // Define SCSI information.
95 // Used with the IOCTL_SCSI_GET_INQUIRY_DATA IOCTL.
96
97 typedef struct _SCSI_BUS_DATA {
98 UCHAR NumberOfLogicalUnits;
99 UCHAR InitiatorBusId;
100 ULONG InquiryDataOffset;
101 }SCSI_BUS_DATA, *PSCSI_BUS_DATA;
102
103 // Define SCSI adapter bus information structure..
104 // Used with the IOCTL_SCSI_GET_INQUIRY_DATA IOCTL.
105
106 typedef struct _SCSI_ADAPTER_BUS_INFO {
107 UCHAR NumberOfBuses;
108 SCSI_BUS_DATA BusData[1];
109 } SCSI_ADAPTER_BUS_INFO, *PSCSI_ADAPTER_BUS_INFO;
110
111 // Define SCSI adapter bus information.
112 // Used with the IOCTL_SCSI_GET_INQUIRY_DATA IOCTL.
113
114 typedef struct _SCSI_INQUIRY_DATA {
115 UCHAR PathId;
116 UCHAR TargetId;
117 UCHAR Lun;
118 BOOLEAN DeviceClaimed;
119 ULONG InquiryDataLength;
120 ULONG NextInquiryDataOffset;
121 UCHAR InquiryData[1];
122 }SCSI_INQUIRY_DATA, *PSCSI_INQUIRY_DATA;
123
124 // Define header for I/O control SRB.
125
126 typedef struct _SRB_IO_CONTROL {
127 ULONG HeaderLength;
128 UCHAR Signature[8];
129 ULONG Timeout;
130 ULONG ControlCode;
131 ULONG ReturnCode;
132 ULONG Length;
133 } SRB_IO_CONTROL, *PSRB_IO_CONTROL;
134
135 // SCSI port driver capabilities structure.
136
137 typedef struct _IO_SCSI_CAPABILITIES {
138 ULONG Length; // Length of this structure
139 ULONG MaximumTransferLength; // Maximum transfer size in single SRB (obsolete)
140 ULONG MaximumPhysicalPages; // Maximum number of physical pages per data buffer
141 ULONG SupportedAsynchronousEvents; // Async calls from port to class
142 ULONG AlignmentMask; // Alignment mask for data transfers.
143 BOOLEAN TaggedQueuing; // Supports tagged queuing
144 BOOLEAN AdapterScansDown; // Host adapter scans down for bios devices.
145 BOOLEAN AdapterUsesPio; // The host adapter uses programmed I/O.
146 } IO_SCSI_CAPABILITIES, *PIO_SCSI_CAPABILITIES;
147
148 typedef struct _SCSI_ADDRESS {
149 ULONG Length;
150 UCHAR PortNumber;
151 UCHAR PathId;
152 UCHAR TargetId;
153 UCHAR Lun;
154 }SCSI_ADDRESS, *PSCSI_ADDRESS;
155
156 // Define structure for returning crash dump pointers.
157
158 struct _ADAPTER_OBJECT;
159
160 typedef struct _DUMP_POINTERS {
161 struct _ADAPTER_OBJECT *AdapterObject;
162 PVOID MappedRegisterBase;
163 PVOID PortConfiguration;
164 PVOID CommonBufferVa;
165 LARGE_INTEGER CommonBufferPa;
166 ULONG CommonBufferSize;
167 } DUMP_POINTERS, *PDUMP_POINTERS;
168
169 #endif //WIN64
170
171
172 // Define values for pass-through DataIn field.
173
174 #define SCSI_IOCTL_DATA_OUT 0
175 #define SCSI_IOCTL_DATA_IN 1
176 #define SCSI_IOCTL_DATA_UNSPECIFIED 2
177
178 #define CLASS_SPECIAL_CAUSE_NOT_REPORTABLE_HACK 0x00000020
179
180 #define SCSIPORT_API
181
182 #ifndef USER_MODE
183 extern NTSTATUS ScsiClassGetInquiryData(IN PDEVICE_OBJECT PortDeviceObject,
184 IN PSCSI_ADAPTER_BUS_INFO *ConfigInfo);
185 extern NTSTATUS ScsiClassReadDeviceInquiryData(IN PDEVICE_OBJECT DeviceObject,
186 IN BOOLEAN DirectAccess);
187 extern NTSTATUS ScsiClassReadDriveCapacity(IN PDEVICE_OBJECT DeviceObject);
188
189 #ifndef CDRW_W32
190
191 // Class dll routines called by class drivers
192
193 extern NTSTATUS ScsiClassGetCapabilities(IN PDEVICE_OBJECT PortDeviceObject,
194 OUT PIO_SCSI_CAPABILITIES *PortCapabilities);
195 extern NTSTATUS ScsiClassGetAddress(IN PDEVICE_OBJECT ClassDeviceObject,
196 OUT PSCSI_ADDRESS Address);
197 extern VOID ScsiClassReleaseQueue(IN PDEVICE_OBJECT DeviceObject);
198 extern NTSTATUS ScsiClassRemoveDevice(IN PDEVICE_OBJECT PortDeviceObject, IN UCHAR PathId,
199 IN UCHAR TargetId, IN UCHAR Lun);
200 extern NTSTATUS ScsiClassClaimDevice(IN PDEVICE_OBJECT PortDeviceObject,
201 IN PSCSI_INQUIRY_DATA LunInfo, IN BOOLEAN Release,
202 OUT PDEVICE_OBJECT *NewPortDeviceObject OPTIONAL);
203 extern NTSTATUS ScsiClassInternalIoControl (IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp);
204 extern NTSTATUS ScsiClassIoCompletion(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp,
205 IN PVOID Context);
206 extern NTSTATUS ScsiClassSendSrbSynchronous(IN PDEVICE_OBJECT TargetDeviceObject,
207 IN PSCSI_REQUEST_BLOCK _srb,
208 IN PKEVENT event);
209
210 #endif //CDRW_W32
211
212 extern VOID ScsiClassInitSrbBusAddr(PSCSI_REQUEST_BLOCK Srb,
213 PVOID DeviceExtension);
214
215 extern NTSTATUS
216 DbgWaitForSingleObject_(
217 IN PVOID Object,
218 IN PLARGE_INTEGER Timeout OPTIONAL
219 );
220 #endif //USER_MODE
221
222 #endif //__SCSI_PORT_H__