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