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