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