Completed SCSIOP_READ_CAPACITY, SCSIOP_REPORT_LUNS, SCSIOP_READ
[reactos.git] / drivers / storage / scsiport / scsiport_int.h
1 /*
2 * SCSI_PORT_TIMER_STATES
3 *
4 * DESCRIPTION
5 * An enumeration containing the states in the timer DFA
6 */
7
8 #pragma once
9
10 #define VERSION "0.0.3"
11
12 #ifndef PAGE_ROUND_UP
13 #define PAGE_ROUND_UP(x) ( (((ULONG_PTR)x)%PAGE_SIZE) ? ((((ULONG_PTR)x)&(~(PAGE_SIZE-1)))+PAGE_SIZE) : ((ULONG_PTR)x) )
14 #endif
15 #ifndef ROUND_UP
16 #define ROUND_UP(N, S) ((((N) + (S) - 1) / (S)) * (S))
17 #endif
18
19 #define TAG_SCSIPORT 'ISCS'
20
21 /* Defines how many logical unit arrays will be in a device extension */
22 #define LUS_NUMBER 8
23
24 #define MAX_SG_LIST 17
25
26 /* Flags */
27 #define SCSI_PORT_DEVICE_BUSY 0x0001
28 #define SCSI_PORT_LU_ACTIVE 0x0002
29 #define SCSI_PORT_NOTIFICATION_NEEDED 0x0004
30 #define SCSI_PORT_NEXT_REQUEST_READY 0x0008
31 #define SCSI_PORT_FLUSH_ADAPTERS 0x0010
32 #define SCSI_PORT_MAP_TRANSFER 0x0020
33 #define SCSI_PORT_RESET 0x0080
34 #define SCSI_PORT_RESET_REQUEST 0x0100
35 #define SCSI_PORT_RESET_REPORTED 0x0200
36 #define SCSI_PORT_REQUEST_PENDING 0x0800
37 #define SCSI_PORT_DISCONNECT_ALLOWED 0x1000
38 #define SCSI_PORT_DISABLE_INT_REQUESET 0x2000
39 #define SCSI_PORT_DISABLE_INTERRUPTS 0x4000
40 #define SCSI_PORT_ENABLE_INT_REQUEST 0x8000
41 #define SCSI_PORT_TIMER_NEEDED 0x10000
42
43 /* LUN Extension flags*/
44 #define LUNEX_FROZEN_QUEUE 0x0001
45 #define LUNEX_NEED_REQUEST_SENSE 0x0004
46 #define LUNEX_BUSY 0x0008
47 #define LUNEX_FULL_QUEUE 0x0010
48 #define LUNEX_REQUEST_PENDING 0x0020
49 #define SCSI_PORT_SCAN_IN_PROGRESS 0x8000
50
51
52 typedef enum _SCSI_PORT_TIMER_STATES
53 {
54 IDETimerIdle,
55 IDETimerCmdWait,
56 IDETimerResetWaitForBusyNegate,
57 IDETimerResetWaitForDrdyAssert
58 } SCSI_PORT_TIMER_STATES;
59
60 typedef struct _CONFIGURATION_INFO
61 {
62 /* Identify info */
63 ULONG AdapterNumber;
64 ULONG LastAdapterNumber;
65 ULONG BusNumber;
66
67 /* Registry related */
68 HANDLE BusKey;
69 HANDLE ServiceKey;
70 HANDLE DeviceKey;
71
72 /* Features */
73 BOOLEAN DisableTaggedQueueing;
74 BOOLEAN DisableMultipleLun;
75
76 /* Parameters */
77 PVOID Parameter;
78 PACCESS_RANGE AccessRanges;
79 } CONFIGURATION_INFO, *PCONFIGURATION_INFO;
80
81 typedef struct _SCSI_PORT_DEVICE_BASE
82 {
83 LIST_ENTRY List;
84
85 PVOID MappedAddress;
86 ULONG NumberOfBytes;
87 SCSI_PHYSICAL_ADDRESS IoAddress;
88 ULONG SystemIoBusNumber;
89 } SCSI_PORT_DEVICE_BASE, *PSCSI_PORT_DEVICE_BASE;
90
91 typedef struct _SCSI_SG_ADDRESS
92 {
93 PHYSICAL_ADDRESS PhysicalAddress;
94 ULONG Length;
95 } SCSI_SG_ADDRESS, *PSCSI_SG_ADDRESS;
96
97 typedef struct _SCSI_REQUEST_BLOCK_INFO
98 {
99 LIST_ENTRY Requests;
100 PSCSI_REQUEST_BLOCK Srb;
101 PCHAR DataOffset;
102 PVOID SaveSenseRequest;
103
104 ULONG SequenceNumber;
105
106 /* DMA stuff */
107 PVOID BaseOfMapRegister;
108 ULONG NumberOfMapRegisters;
109
110 struct _SCSI_REQUEST_BLOCK_INFO *CompletedRequests;
111
112 /* Scatter-gather list */
113 PSCSI_SG_ADDRESS ScatterGather;
114 SCSI_SG_ADDRESS ScatterGatherList[MAX_SG_LIST];
115 } SCSI_REQUEST_BLOCK_INFO, *PSCSI_REQUEST_BLOCK_INFO;
116
117 typedef struct _SCSI_PORT_LUN_EXTENSION
118 {
119 UCHAR PathId;
120 UCHAR TargetId;
121 UCHAR Lun;
122
123 ULONG Flags;
124
125 struct _SCSI_PORT_LUN_EXTENSION *Next;
126
127 BOOLEAN DeviceClaimed;
128 PDEVICE_OBJECT DeviceObject;
129
130 INQUIRYDATA InquiryData;
131
132 KDEVICE_QUEUE DeviceQueue;
133 ULONG SortKey;
134 ULONG QueueCount;
135 ULONG MaxQueueCount;
136
137 ULONG AttemptCount;
138 LONG RequestTimeout;
139
140 PIRP BusyRequest;
141 PIRP PendingRequest;
142
143 struct _SCSI_PORT_LUN_EXTENSION *ReadyLun;
144 struct _SCSI_PORT_LUN_EXTENSION *CompletedAbortRequests;
145
146 SCSI_REQUEST_BLOCK_INFO SrbInfo;
147
148 /* More data? */
149
150 UCHAR MiniportLunExtension[1]; /* must be the last entry */
151 } SCSI_PORT_LUN_EXTENSION, *PSCSI_PORT_LUN_EXTENSION;
152
153 /* Structures for inquiries support */
154
155 typedef struct _SCSI_LUN_INFO
156 {
157 UCHAR PathId;
158 UCHAR TargetId;
159 UCHAR Lun;
160 BOOLEAN DeviceClaimed;
161 PVOID DeviceObject;
162 struct _SCSI_LUN_INFO *Next;
163 UCHAR InquiryData[INQUIRYDATABUFFERSIZE];
164 } SCSI_LUN_INFO, *PSCSI_LUN_INFO;
165
166 typedef struct _SCSI_BUS_SCAN_INFO
167 {
168 USHORT Length;
169 UCHAR LogicalUnitsCount;
170 UCHAR BusIdentifier;
171 PSCSI_LUN_INFO LunInfo;
172 } SCSI_BUS_SCAN_INFO, *PSCSI_BUS_SCAN_INFO;
173
174 typedef struct _BUSES_CONFIGURATION_INFORMATION
175 {
176 UCHAR NumberOfBuses;
177 PSCSI_BUS_SCAN_INFO BusScanInfo[1];
178 } BUSES_CONFIGURATION_INFORMATION, *PBUSES_CONFIGURATION_INFORMATION;
179
180
181 typedef struct _SCSI_PORT_INTERRUPT_DATA
182 {
183 ULONG Flags; /* Interrupt-time flags */
184 PSCSI_REQUEST_BLOCK_INFO CompletedRequests; /* Linked list of Srb info data */
185 PSCSI_PORT_LUN_EXTENSION CompletedAbort;
186 PSCSI_PORT_LUN_EXTENSION ReadyLun;
187 PHW_TIMER HwScsiTimer;
188 ULONG MiniportTimerValue;
189 } SCSI_PORT_INTERRUPT_DATA, *PSCSI_PORT_INTERRUPT_DATA;
190
191
192 /* Only for interrupt data saving function */
193 typedef struct _SCSI_PORT_SAVE_INTERRUPT
194 {
195 PSCSI_PORT_INTERRUPT_DATA InterruptData;
196 struct _SCSI_PORT_DEVICE_EXTENSION *DeviceExtension;
197 } SCSI_PORT_SAVE_INTERRUPT, *PSCSI_PORT_SAVE_INTERRUPT;
198
199 /*
200 * SCSI_PORT_DEVICE_EXTENSION
201 *
202 * DESCRIPTION
203 * First part of the port objects device extension. The second
204 * part is the miniport-specific device extension.
205 */
206
207 typedef struct _SCSI_PORT_DEVICE_EXTENSION
208 {
209 ULONG Length;
210 ULONG MiniPortExtensionSize;
211 PPORT_CONFIGURATION_INFORMATION PortConfig;
212 PBUSES_CONFIGURATION_INFORMATION BusesConfig;
213 PVOID NonCachedExtension;
214 ULONG PortNumber;
215
216 LONG ActiveRequestCounter;
217 ULONG SrbFlags;
218 ULONG Flags;
219
220 ULONG BusNum;
221 ULONG MaxTargedIds;
222 ULONG MaxLunCount;
223
224 KSPIN_LOCK IrqLock; /* Used when there are 2 irqs */
225 ULONG SequenceNumber; /* Global sequence number for packets */
226 KSPIN_LOCK SpinLock;
227 PKINTERRUPT Interrupt[2];
228 PIRP CurrentIrp;
229 ULONG IrpFlags;
230
231 SCSI_PORT_TIMER_STATES TimerState;
232 LONG TimerCount;
233
234 KTIMER MiniportTimer;
235 KDPC MiniportTimerDpc;
236
237 PMAPPED_ADDRESS MappedAddressList;
238
239 ULONG LunExtensionSize;
240 PSCSI_PORT_LUN_EXTENSION LunExtensionList[LUS_NUMBER];
241
242 SCSI_PORT_INTERRUPT_DATA InterruptData;
243
244 /* SRB extension stuff*/
245 ULONG SrbExtensionSize;
246 PVOID SrbExtensionBuffer;
247 PVOID FreeSrbExtensions;
248
249 /* SRB information */
250 PSCSI_REQUEST_BLOCK_INFO SrbInfo;
251 PSCSI_REQUEST_BLOCK_INFO FreeSrbInfo;
252 ULONG SrbDataCount;
253
254 IO_SCSI_CAPABILITIES PortCapabilities;
255
256 PDEVICE_OBJECT DeviceObject;
257 PCONTROLLER_OBJECT ControllerObject;
258
259 PHW_INITIALIZE HwInitialize;
260 PHW_STARTIO HwStartIo;
261 PHW_INTERRUPT HwInterrupt;
262 PHW_RESET_BUS HwResetBus;
263 PHW_DMA_STARTED HwDmaStarted;
264 PHW_TIMER HwScsiTimer;
265
266 PSCSI_REQUEST_BLOCK OriginalSrb;
267 SCSI_REQUEST_BLOCK InternalSrb;
268 SENSE_DATA InternalSenseData;
269
270 /* DMA related stuff */
271 PADAPTER_OBJECT AdapterObject;
272 ULONG MapRegisterCount;
273 BOOLEAN MapBuffers;
274 BOOLEAN MapRegisters;
275 PVOID MapRegisterBase;
276
277 /* Features */
278 BOOLEAN CachesData;
279 BOOLEAN SupportsTaggedQueuing;
280 BOOLEAN SupportsAutoSense;
281 BOOLEAN MultipleReqsPerLun;
282 BOOLEAN ReceiveEvent;
283
284 PHYSICAL_ADDRESS PhysicalAddress;
285 ULONG CommonBufferLength;
286 ULONG InterruptLevel[2];
287 ULONG IoAddress;
288
289 BOOLEAN NeedSrbExtensionAlloc;
290 BOOLEAN NeedSrbDataAlloc;
291
292 ULONG RequestsNumber;
293
294 ULONG InterruptCount;
295
296 UCHAR MiniPortDeviceExtension[1]; /* must be the last entry */
297 } SCSI_PORT_DEVICE_EXTENSION, *PSCSI_PORT_DEVICE_EXTENSION;
298
299 typedef struct _RESETBUS_PARAMS
300 {
301 ULONG PathId;
302 PSCSI_PORT_DEVICE_EXTENSION DeviceExtension;
303 } RESETBUS_PARAMS, *PRESETBUS_PARAMS;