Fixed Id keyword in source files
[mirror/winof/.git] / hw / mt23108 / vapi / mlxsys / os_dep / win / tdriver / MdCard.h
1 /*\r
2  * Copyright (c) 2005 SilverStorm Technologies.  All rights reserved.\r
3  * Copyright (c) 2004-2005 Mellanox Technologies Ltd.  All rights reserved.\r
4  *\r
5  * This software is available to you under the OpenIB.org BSD license\r
6  * below:\r
7  *\r
8  *     Redistribution and use in source and binary forms, with or\r
9  *     without modification, are permitted provided that the following\r
10  *     conditions are met:\r
11  *\r
12  *      - Redistributions of source code must retain the above\r
13  *        copyright notice, this list of conditions and the following\r
14  *        disclaimer.\r
15  *\r
16  *      - Redistributions in binary form must reproduce the above\r
17  *        copyright notice, this list of conditions and the following\r
18  *        disclaimer in the documentation and/or other materials\r
19  *        provided with the distribution.\r
20  *\r
21  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
22  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
23  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
24  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\r
25  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\r
26  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
27  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r
28  * SOFTWARE.\r
29  *\r
30  * $Id$\r
31  */\r
32 \r
33 #ifndef _MD_CARD_H\r
34 #define _MD_CARD_H\r
35 \r
36 #include <ntddk.h>\r
37 #include <mtl_common.h>\r
38 #include "MdDbg.h"\r
39 #include "mosal.h"\r
40 #include "mosal_util.h"\r
41 #include <vapi_common.h>\r
42 #include <hh.h>\r
43 \r
44 ////////////////////////////////////////////////////////////////////////////\r
45 // RESTRICTIONS\r
46 ////////////////////////////////////////////////////////////////////////////\r
47 \r
48 /* \r
49  * Maximal device name length \r
50  */\r
51 #define MD_MAX_DEV_NAME_LEN                     255\r
52 \r
53 /* \r
54  * Maximal device params length \r
55  */\r
56 #define MD_MAX_DEV_PARAMS_LEN           255\r
57 \r
58 /* \r
59  * Device name DB size\r
60  */\r
61  #define MD_MAX_DEV_DB_SIZE                     1024\r
62 \r
63 /* \r
64  * PCI header size\r
65  */\r
66  #define PCI_HDR_SIZE                           64\r
67  \r
68 ////////////////////////////////////////////////////////////////////////////\r
69 // DEFAULTS\r
70 ////////////////////////////////////////////////////////////////////////////\r
71 #define MD_DFLT_CONF_ADDR                       88\r
72 #define MD_DFLT_CONF_DATA                       92\r
73 #define MD_DFLT_DDR_OFFSET                      0\r
74 #define MD_DFLT_DDR_SIZE                        0x10000000\r
75 \r
76 \r
77 ////////////////////////////////////////////////////////////////////////////\r
78 // CONSTANTS\r
79 ////////////////////////////////////////////////////////////////////////////\r
80 \r
81 /* \r
82  * Driver control device name\r
83  */\r
84 #define MD_CTL_DEVICE_NAME                      "MDCTL"\r
85 #define MLX_VENDOR_ID                           0x15B3\r
86 \r
87 ////////////////////////////////////////////////////////////////////////////\r
88 // ENUMERATIONS\r
89 ////////////////////////////////////////////////////////////////////////////\r
90 \r
91 // Device Ids \r
92 typedef enum { \r
93         MD_DEV_ID_CTRL=0, \r
94         MD_DEV_ID_TAVOR=23108, \r
95         MD_DEV_ID_TAVOR_BD=23109, \r
96         MD_DEV_ID_TAVOR_SD=23130, \r
97         MD_DEV_ID_ARBEL_TM=25208        /* ARBEL in TAvor mode */\r
98 } MD_DEV_ID_E;\r
99 \r
100 // IB Device type\r
101 typedef enum { \r
102         MD_DEV_IX_CTRL=0, \r
103         MD_DEV_IX_TAVOR, \r
104         MD_DEV_IX_TAVOR_BD, \r
105         MD_DEV_IX_TAVOR_SD, \r
106         MD_DEV_IX_ARBEL_TM,             /* ARBEL in TAvor mode */\r
107         MD_DEV_IX_LAST \r
108 } MD_DEV_IX_E;\r
109 \r
110  \r
111 ////////////////////////////////////////////////////////////////////////////\r
112 // MACROS\r
113 ////////////////////////////////////////////////////////////////////////////\r
114         \r
115 \r
116 /*\r
117  * Work with CR_SPACE\r
118  */\r
119 #define MD_CR_DWORD_WRITE(dev,addr,value)               \\r
120         if (dev->m_fUsePorts) ? WRITE_PORT_ULONG((addr),(value)) : WRITE_REGISTER_ULONG((addr),(value))\r
121 #define MD_CR_DWORD_READ(dev,addr,value)                \\r
122         value = (dev->m_fUsePorts) ? READ_PORT_ULONG((addr)) : READ_REGISTER_ULONG((addr))\r
123 \r
124 // for WinNt\r
125 #define PRE_LOCK_IT                     KIRQL   l_OldIrql\r
126 #define INIT_LOCK_IT(a)         KeInitializeSpinLock(a)\r
127 #define LOCK_IT(a)                      KeAcquireSpinLock((a),&l_OldIrql)\r
128 #define UNLOCK_IT(a)            KeReleaseSpinLock((a),l_OldIrql)\r
129 \r
130 // mutexes\r
131 #define KMUTEX_INIT(a)          KeInitializeMutex(a,0)\r
132 #define KMUTEX_ACQ(a)           KeWaitForMutexObject( a, Executive, KernelMode, FALSE,  NULL )\r
133 #define KMUTEX_REL(a)           KeReleaseMutex(a, FALSE)\r
134 \r
135 #define FMUTEX_INIT(a)          ExInitializeFastMutex(a)\r
136 #define FMUTEX_ACQ(a)           ExAcquireFastMutex(a)\r
137 #define FMUTEX_REL(a)           ExReleaseFastMutex(a)\r
138 \r
139 // semaphores\r
140 #define KSEM_INIT(a)            KeInitializeSemaphore(a,1,1)\r
141 #define KSEM_ACQ(a)                     KeWaitForSingleObject( a, Executive, KernelMode, FALSE,  NULL )\r
142 #define KSEM_REL(a)                     KeReleaseSemaphore(a, 0, 1, FALSE)\r
143 \r
144 \r
145 \r
146 ////////////////////////////////////////////////////////////////////////////\r
147 // STRUCTURES\r
148 ////////////////////////////////////////////////////////////////////////////\r
149 \r
150 //\r
151 // MDHAL DB \r
152 //\r
153 typedef struct MD_HAL_DEV_PARAMS_S {\r
154 \r
155         /* buffer for DevId string */\r
156         WCHAR                                   m_DevIdWstr[5];\r
157         // format string for building internal name\r
158         PCHAR                                   m_Format;               \r
159         // format string for building exported name\r
160         PCHAR                                   m_ExFormat;             \r
161         // Device ID  (in PCI configuration)                            \r
162     MD_DEV_ID_E                         m_DevId;        \r
163         // Device IX  (in PCI configuration)                            \r
164     MD_DEV_IX_E                         m_DevIx; \r
165     // export to user\r
166     BOOLEAN                                     m_fExpose;\r
167     // BAR sizes (approximately)\r
168     ULONG                                       m_SizeBar0;\r
169     ULONG                                       m_SizeBar1;\r
170     ULONG                                       m_SizeBar2;\r
171         // the device clock frequency             \r
172     u_int32_t                           m_ClockFreq;  \r
173         // number of bits per device word         \r
174     u_int8_t                            m_WordSize;     \r
175         // 1 means opposite to platform endianess \r
176     u_int8_t                            m_Endianess;     \r
177 \r
178 } MD_HAL_DEV_PARAMS_T, *PMD_HAL_DEV_PARAMS_T;\r
179 \r
180 \r
181 typedef struct MD_DEV_CONTEXT_S *PMD_DEV_CONTEXT_T;\r
182 \r
183 typedef PFILE_OBJECT                            PCS_HANDLE_T;\r
184 \r
185 //\r
186 // Process context - saved in PFILE_OBJECT->FsContext\r
187 //\r
188 typedef struct MD_PCS_CONTEXT_S {\r
189 \r
190     // TAVOR (VIPKL) info\r
191         // IB_MGT resource tracking\r
192         PVOID                                         m_hIbMgt;\r
193         // VIPKL resource tracking\r
194         PVOID                                         m_hVipkl;\r
195     // MOSAL info\r
196         PVOID                                         m_hMosal;\r
197 \r
198     // IB_MGT info\r
199     \r
200     // MDCTL info\r
201         // MDL for CR\r
202         PMDL                                                    m_pCrMdl;\r
203         // MDL for UAR\r
204         PMDL                                                    m_pUarMdl;\r
205         // MDL for DDR\r
206         PMDL                                                    m_pDdrMdl;\r
207 \r
208         // SANITY CHECK info\r
209         // PID\r
210         MOSAL_pid_t                                             m_Pid;\r
211 \r
212 } MD_PCS_CONTEXT_T, *PMD_PCS_CONTEXT_T;\r
213 \r
214 #define MAKE_PCS(a)                                     ((PMD_PCS_CONTEXT_T)(a))\r
215 \r
216 \r
217 //\r
218 // Driver context\r
219 //\r
220 typedef struct MD_DRV_CONTEXT_S {\r
221 \r
222         // driver object\r
223         PDRIVER_OBJECT                                  m_pDrvObject;\r
224 \r
225         // Debug Print Level\r
226         ULONG                                                   m_nDebugPrintLevel;\r
227 \r
228         // FIFO queue of devices, added (for debug purposes)\r
229         LIST_ENTRY                                              m_DevQue;\r
230 \r
231         // current number of devices\r
232         ULONG                                                   m_uDevNo;\r
233         \r
234         // current number of adapters\r
235         ULONG                                                   m_uCardNo;\r
236         \r
237 \r
238         /* control device context */\r
239         PMD_DEV_CONTEXT_T                               m_pCtlDevContext;\r
240 \r
241         /* device name DB */\r
242         ULONG                                                   m_DevNamesDbSize;\r
243         ULONG                                                   m_DevNamesDbCnt;\r
244         char                                                    m_DevNamesDb[MD_MAX_DEV_DB_SIZE];\r
245 \r
246         /* protection */\r
247         KSPIN_LOCK                                              m_SpinLock;\r
248         \r
249         /* various features support */\r
250         ULONG                                                       m_ThhLegacySqp;\r
251         BOOLEAN                                                 m_fSupportIbMgt;\r
252         BOOLEAN                                                 m_fSupportTavor;\r
253         ULONG                                   m_AvInHostMem;              /* AV in host memory (and not in DDR) */                                                    \r
254         ULONG                                                       m_InfiniteCmdTimeout;   /* when 1 we use inifinite timeouts on commands completion */\r
255         ULONG                                                       m_NumCmdsOuts;            /* max number of outstanding commands */\r
256         ULONG                                                           m_FatalDelayHalt;\r
257         ULONG                                                           m_AsyncEqSize;\r
258         ULONG                                                           m_CmdifUseUar0;\r
259         ULONG                                                           m_IgnoreSubsystemId;\r
260 \r
261         int                                                             m_IbMgtQp0Only;         /* for IB_MGT: use QP0 only */\r
262 \r
263 } MD_DRV_CONTEXT_T, *PMD_DRV_CONTEXT_T;\r
264 \r
265 //\r
266 // Control device context\r
267 //\r
268 typedef struct MD_CTL_DEV_CONTEXT_S {\r
269         int                                             m_DummyCtl;\r
270 } MD_CTL_DEV_CONTEXT_T, *PMD_CTL_DEV_CONTEXT_T;\r
271 \r
272 typedef struct MD_IB_DEV_TAVOR_S {\r
273         VAPI_hca_hndl_t                 m_hHca;\r
274         HH_hca_hndl_t           m_hHhHca;\r
275 } MD_IB_DEV_TAVOR_T, *PMD_IB_DEV_TAVOR_T;\r
276 \r
277 typedef struct MD_IB_DEV_TAVOR_BD_S {\r
278         int                                             m_DummyTavorBd;\r
279 } MD_IB_DEV_TAVOR_BD_T, *PMD_IB_DEV_TAVOR_BD_T;\r
280 \r
281 typedef struct MD_IB_DEV_TAVOR_SD_S {\r
282         PMD_DEV_CONTEXT_T               m_pBdDevContext;\r
283 } MD_IB_DEV_TAVOR_SD_T, *PMD_IB_DEV_TAVOR_SD_T;\r
284 \r
285 //\r
286 // PCI Header info\r
287 //\r
288 typedef struct MD_PCI_HDR_S {\r
289         ULONG                                   m_Hdr[PCI_HDR_SIZE];\r
290         ULONG                                   m_Bus;\r
291         ULONG                                   m_Slot;\r
292 } MD_PCI_HDR_T, *PMD_PCI_HDR_T;\r
293 \r
294 //\r
295 // IB device context\r
296 //\r
297 typedef struct MD_IB_DEV_CONTEXT_S {\r
298 \r
299 \r
300         ////////////////////////////////////////////////////////////////////////////\r
301         // Device stack information\r
302         ////////////////////////////////////////////////////////////////////////////\r
303         \r
304     // next-lower driver's device object, representing the target device \r
305     PDEVICE_OBJECT                      m_pLdo;\r
306 \r
307         // The bus driver object\r
308     PDEVICE_OBJECT                      m_pPdo;\r
309 \r
310         /* buffer for ASCII device name */\r
311         char                                    m_AsciiDevName[MD_MAX_DEV_NAME_LEN + 1];\r
312 \r
313         /* card number */\r
314         ULONG                                   m_uCardNo;\r
315         \r
316         ////////////////////////////////////////////////////////////////////////////\r
317         // Device configuration information\r
318         ////////////////////////////////////////////////////////////////////////////\r
319         \r
320         // device location\r
321         ULONG                                   m_BusNumber;\r
322         ULONG                                   m_DevNumber;\r
323         ULONG                                   m_Function;\r
324         \r
325         // IRQL\r
326         ULONG                                   m_ulIntVector;\r
327         KIRQL                                   m_ulIntLevel;\r
328         KAFFINITY                               m_Affinity;\r
329         BOOLEAN                                 m_fIntShared;\r
330         KINTERRUPT_MODE                 m_IntMode;\r
331 \r
332         // CR space\r
333         MD_BAR_T                                m_Cr;\r
334 \r
335         // UAR-space region\r
336         MD_BAR_T                                m_Uar;\r
337 \r
338         // memory range\r
339         MD_BAR_T                                m_Ddr;\r
340         ULONG                                   m_ulDdrMapOffset;\r
341         ULONG                                   m_ulDdrMapSize;\r
342         \r
343         // register offsets\r
344         ULONG                                   m_ulAddrOffset;\r
345         ULONG                                   m_ulDataOffset;\r
346 \r
347         // PCI headers\r
348         BOOLEAN                                 m_fMayReset;\r
349         MD_PCI_HDR_T                    m_MyHdr;\r
350         MD_PCI_HDR_T                    m_HcaHdr;\r
351         MD_PCI_HDR_T                    m_BridgeHdr;\r
352         ULONG                                   m_PerformReset;\r
353         \r
354         ////////////////////////////////////////////////////////////////////////////\r
355         // Power management\r
356         ////////////////////////////////////////////////////////////////////////////\r
357 \r
358         // current device power state\r
359     DEVICE_POWER_STATE          m_CurrentDevicePowerState;\r
360 \r
361         //Bus drivers set the appropriate values in this structure in response\r
362         //to an IRP_MN_QUERY_CAPABILITIES IRP. Function and filter drivers might\r
363         //alter the capabilities set by the bus driver.\r
364     DEVICE_CAPABILITIES         m_DeviceCapabilities;\r
365 \r
366         // used to save the currently-being-handled system-requested power irp request\r
367     PIRP                                        m_PowerIrp;\r
368 \r
369         // set to signal driver-generated power request is finished\r
370     KEVENT                                      m_SelfRequestedPowerIrpEvent;\r
371 \r
372     // flag set when IRP_MN_WAIT_WAKE is received and we're in a power state\r
373     // where we can signal a wait\r
374     BOOLEAN                                     m_EnabledForWakeup;\r
375 \r
376         // used to flag that we're currently handling a self-generated power request\r
377     BOOLEAN                                     m_SelfPowerIrp;\r
378 \r
379         // default power state to power down to on self-suspend \r
380         ULONG                                   m_PowerDownLevel; \r
381 \r
382         ////////////////////////////////////////////////////////////////////////////\r
383         // PnP handling\r
384         ////////////////////////////////////////////////////////////////////////////\r
385 \r
386         //flag set when processing IRP_MN_REMOVE_DEVICE\r
387     BOOLEAN                                     m_DeviceRemoved;\r
388 \r
389         // flag set when driver has answered success to IRP_MN_QUERY_REMOVE_DEVICE\r
390     BOOLEAN                                     m_RemoveDeviceRequested;\r
391 \r
392         // flag set when driver has answered success to IRP_MN_QUERY_STOP_DEVICE\r
393     BOOLEAN                                     m_StopDeviceRequested;\r
394 \r
395         // MOSAL device handle\r
396         MOSAL_dev_handle_t              m_hMosal;\r
397         \r
398         // pointer to device parameters\r
399         PMD_HAL_DEV_PARAMS_T    m_pMdhalParams;\r
400         \r
401         /* DEVICE SPECIFIC PART */\r
402         union {\r
403                 MD_IB_DEV_TAVOR_T;\r
404                 MD_IB_DEV_TAVOR_BD_T;\r
405                 MD_IB_DEV_TAVOR_SD_T;\r
406         };\r
407 \r
408 } MD_IB_DEV_CONTEXT_T, *PMD_IB_DEV_CONTEXT_T;\r
409 \r
410 //\r
411 // A structure representing the instance information associated with\r
412 // this particular device.\r
413 //\r
414 \r
415 typedef struct MD_DEV_CONTEXT_S {\r
416 \r
417         // FIFO queue of devices\r
418         LIST_ENTRY                                              m_Link;\r
419 \r
420         // global context\r
421         PMD_DRV_CONTEXT_T                               m_pDrvContext;\r
422 \r
423         // device type\r
424         MD_DEV_IX_E                                             m_eDevType;\r
425 \r
426         // NT device handle\r
427         PDEVICE_OBJECT                                  m_pFdo;\r
428 \r
429         /* NT device name */\r
430         UNICODE_STRING                                  m_usNtDeviceName;\r
431 \r
432         /* DOS device name */\r
433         UNICODE_STRING                                  m_usDosDeviceName;\r
434 \r
435         /* device level spinlock */\r
436         KSPIN_LOCK                                              m_SpinLock;\r
437 \r
438         /* signature - for checking the handle */\r
439         ULONG                                                   m_Signature;\r
440 \r
441         // spinlock used to protect inc/dec iocount logic\r
442         KSPIN_LOCK                                              m_IoCntSpinLock;\r
443 \r
444         /* pending IRP count */\r
445         int                                                             m_nPendingIoCnt;\r
446 \r
447         // set when PendingIoCount goes to 0; flags device can be removed\r
448         KEVENT                                                  m_RemoveEvent;\r
449         \r
450         // set when PendingIoCount goes to 1 ( 1st increment was on add device )\r
451         // this indicates no IO requests outstanding, either user, system, or self-staged\r
452         KEVENT                                                  m_NoPendingIoEvent;\r
453 \r
454         // flag set when device has been successfully started\r
455         BOOLEAN                                                 m_DeviceStarted;\r
456 \r
457         // process list\r
458         LIST_ENTRY                                              m_PcsQue;\r
459         \r
460         // flag\r
461         BOOLEAN                                                 m_fDeletePending;\r
462 \r
463         // semaphore\r
464         KSEMAPHORE                                              m_Sem;\r
465         \r
466         // mutex\r
467         KMUTEX                                          m_Mutex;\r
468         \r
469         // number of OPENs for this device\r
470         int                                                             m_nOpenCount;\r
471 \r
472         // interface for r/w to PCI config space\r
473         BUS_INTERFACE_STANDARD                  m_Interface;\r
474         \r
475         /* DEVICE SPECIFIC PART */\r
476         union {\r
477                 MD_CTL_DEV_CONTEXT_T;\r
478                 MD_IB_DEV_CONTEXT_T;\r
479         };\r
480 \r
481 } MD_DEV_CONTEXT_T, *PMD_DEV_CONTEXT_T;\r
482 \r
483 \r
484 ////////////////////////////////////////////////////////////////////////////\r
485 // GLOBAL VARIABLES\r
486 ////////////////////////////////////////////////////////////////////////////\r
487 \r
488 #ifdef _MD_C_\r
489         PMD_DRV_CONTEXT_T               g_pDrvContext = NULL;\r
490         MD_HAL_DEV_PARAMS_T             g_DevParams[MD_DEV_IX_LAST] = {\r
491                 /* for CTRL */\r
492                 { L"0000", "",  "",                             MD_DEV_ID_CTRL,         MD_DEV_IX_CTRL,         FALSE,  0,0,0, 0, 0, 0 },\r
493                 /* for TAVOR */\r
494                 { L"5A44", "InfiniHost%d", "InfiniHost%d",      MD_DEV_ID_TAVOR,        MD_DEV_IX_TAVOR,        TRUE,   0x00100000, 0x01000000, 0x00000000, 167000000,  4, 0 },\r
495                 /* for TAVOR_BD */\r
496                 { L"5A45","mt%d_pciconf%d", "mt%d_pciconf%d", MD_DEV_ID_TAVOR_BD, MD_DEV_IX_TAVOR_BD, TRUE,     0x00000000, 0x00000000, 0x00000000, 167000000,  4, 0 },\r
497                 /* for TAVOR_SD */\r
498                 { L"5A5A", "mt%d_pci%d", "mt%d_pci%d",  MD_DEV_ID_TAVOR_SD, MD_DEV_IX_TAVOR_SD, TRUE,   0x00100000, 0x01000000, 0x00000000, 167000000,  4, 0 },\r
499                 /* for TAVOR_SD */\r
500                 { L"6278", "InfiniHost%d", "InfiniHosA%d",      MD_DEV_ID_ARBEL_TM, MD_DEV_IX_ARBEL_TM, TRUE,   0x00100000, 0x01000000, 0x00000000, 167000000,  4, 0 },\r
501         };\r
502 \r
503 #else\r
504         extern  PMD_DRV_CONTEXT_T       g_pDrvContext;\r
505         extern  MD_HAL_DEV_PARAMS_T g_DevParams[MD_DEV_IX_LAST];\r
506 #endif\r
507 \r
508 ////////////////////////////////////////////////////////////////////////////\r
509 // function prototypes\r
510 ////////////////////////////////////////////////////////////////////////////\r
511 \r
512 NTSTATUS\r
513 MdProcessPnPIrp(\r
514     IN PDEVICE_OBJECT DeviceObject,\r
515     IN PIRP           Irp\r
516     );\r
517 \r
518 NTSTATUS\r
519 MdProcessSysControlIrp(\r
520     IN PDEVICE_OBJECT DeviceObject,\r
521     IN PIRP           Irp\r
522     );\r
523 \r
524 VOID\r
525 MdUnload(\r
526     IN PDRIVER_OBJECT DriverObject\r
527     );\r
528 \r
529 NTSTATUS\r
530 MdStartDevice(\r
531     IN  PDEVICE_OBJECT          pi_pFdo,\r
532         IN      PIRP                            pi_pIrp\r
533     );\r
534 \r
535 NTSTATUS\r
536 MdStopDevice(\r
537     IN  PDEVICE_OBJECT DeviceObject\r
538     );\r
539 \r
540 NTSTATUS\r
541 MdRemoveDevice(\r
542     IN  PDEVICE_OBJECT DeviceObject\r
543     );\r
544 \r
545 NTSTATUS\r
546 MdPnPAddDevice(\r
547     IN PDRIVER_OBJECT DriverObject,\r
548     IN PDEVICE_OBJECT pi_pPdo\r
549     );\r
550 \r
551 NTSTATUS\r
552 MdCreateDeviceObject(\r
553     IN PDRIVER_OBJECT DriverObject,\r
554     IN PDEVICE_OBJECT pi_pPdo,\r
555     IN PDEVICE_OBJECT *DeviceObject\r
556     );\r
557 \r
558 NTSTATUS\r
559 MdConfigureDevice(\r
560     IN  PDEVICE_OBJECT DeviceObject\r
561     );\r
562 \r
563 NTSTATUS\r
564 MdIrpCompletionRoutine(\r
565     IN PDEVICE_OBJECT DeviceObject,\r
566     IN PIRP Irp,\r
567     IN PVOID Context\r
568     );\r
569 \r
570 NTSTATUS\r
571 MdPoRequestCompletion(\r
572     IN PDEVICE_OBJECT       DeviceObject,\r
573     IN UCHAR                MinorFunction,\r
574     IN POWER_STATE          PowerState,\r
575     IN PVOID                Context,\r
576     IN PIO_STATUS_BLOCK     IoStatus\r
577     );\r
578 \r
579 NTSTATUS\r
580 MdPoSelfRequestCompletion(\r
581     IN PDEVICE_OBJECT       DeviceObject,\r
582     IN UCHAR                MinorFunction,\r
583     IN POWER_STATE          PowerState,\r
584     IN PVOID                Context,\r
585     IN PIO_STATUS_BLOCK     IoStatus\r
586     );\r
587 \r
588 NTSTATUS\r
589 MdGetPortStatus(\r
590     IN PDEVICE_OBJECT DeviceObject,\r
591     IN PULONG PortStatus\r
592     );\r
593 \r
594 NTSTATUS\r
595 MdResetParentPort(\r
596     IN IN PDEVICE_OBJECT DeviceObject\r
597     );\r
598 \r
599 NTSTATUS\r
600 MdSelfRequestPowerIrp(\r
601     IN PDEVICE_OBJECT DeviceObject,\r
602     IN POWER_STATE PowerState\r
603     );\r
604 \r
605 BOOLEAN\r
606 MdSetDevicePowerState(\r
607     IN PDEVICE_OBJECT DeviceObject,\r
608     IN DEVICE_POWER_STATE DeviceState\r
609     );\r
610 \r
611 NTSTATUS\r
612 MdAsyncReadWrite_Complete(\r
613     IN PDEVICE_OBJECT DeviceObject,\r
614     IN PIRP Irp,\r
615     IN PVOID Context\r
616     );\r
617 \r
618 NTSTATUS\r
619 MdSimpleReadWrite_Complete(\r
620     IN PDEVICE_OBJECT DeviceObject,\r
621     IN PIRP Irp,\r
622     IN PVOID Context\r
623     );\r
624 \r
625 \r
626 NTSTATUS\r
627 MdPowerIrp_Complete(\r
628     IN PDEVICE_OBJECT NullDeviceObject,\r
629     IN PIRP Irp,\r
630     IN PVOID Context\r
631     );\r
632 \r
633 NTSTATUS\r
634 MdQueryCapabilities(\r
635     IN PDEVICE_OBJECT pi_pLowerDevObject,\r
636     OUT PDEVICE_CAPABILITIES po_pDeviceCapabilities\r
637     );\r
638 \r
639 \r
640 NTSTATUS\r
641 MdWrite(\r
642     IN PDEVICE_OBJECT DeviceObject,\r
643     IN PIRP Irp\r
644     );\r
645 \r
646 NTSTATUS\r
647 MdCreate(\r
648     IN PDEVICE_OBJECT DeviceObject,\r
649     IN PIRP Irp\r
650     );\r
651 \r
652 \r
653 NTSTATUS\r
654 MdRead(\r
655     IN PDEVICE_OBJECT DeviceObject,\r
656     IN PIRP Irp\r
657     );\r
658 \r
659 \r
660 NTSTATUS\r
661 MdAbortInPgsReqs(\r
662     IN PDEVICE_OBJECT DeviceObject\r
663     );\r
664 \r
665 \r
666 NTSTATUS\r
667 MdProcessIoctl(\r
668     IN PDEVICE_OBJECT DeviceObject,\r
669     IN PIRP Irp\r
670     );\r
671 \r
672 \r
673 NTSTATUS\r
674 MdResetDevice(\r
675     IN PDEVICE_OBJECT DeviceObject\r
676     );\r
677 \r
678 NTSTATUS\r
679 MdClose(\r
680     IN PDEVICE_OBJECT DeviceObject,\r
681     IN PIRP Irp\r
682     );\r
683 \r
684 \r
685 VOID\r
686 MdIncrementIoCount(\r
687         IN      PMD_DEV_CONTEXT_T       pi_pMdDevContext\r
688     );\r
689 \r
690 LONG\r
691 MdDecrementIoCount(\r
692         IN      PMD_DEV_CONTEXT_T       pi_pMdDevContext\r
693     );\r
694 \r
695 \r
696 NTSTATUS\r
697 MdProcessPowerIrp(\r
698     IN PDEVICE_OBJECT DeviceObject,\r
699     IN PIRP           Irp\r
700     );    \r
701 \r
702 \r
703 NTSTATUS\r
704 MdStagedReadWrite(\r
705     IN PDEVICE_OBJECT DeviceObject,\r
706     IN PIRP Irp,\r
707     IN BOOLEAN Read\r
708     );\r
709 \r
710 NTSTATUS\r
711 MdSelfSuspendOrActivate(\r
712     IN PDEVICE_OBJECT DeviceObject,\r
713         IN BOOLEAN fSuspend\r
714     );\r
715 \r
716 NTSTATUS \r
717 MdSymbolicLink(\r
718     IN PDEVICE_OBJECT DeviceObject, \r
719         IN OUT PUNICODE_STRING deviceLinkUnicodeString\r
720     );\r
721 \r
722 \r
723 BOOLEAN\r
724 MdCancelPendingIo(\r
725     IN PDEVICE_OBJECT DeviceObject\r
726     );\r
727 \r
728 BOOLEAN\r
729 MdCanAcceptIoRequests(\r
730     IN PDEVICE_OBJECT DeviceObject\r
731     );\r
732 \r
733 #endif // already included\r
734 \r
735 /*\r
736  * Interface GUID - defined outside of conditional include statement on purpose.\r
737  */\r
738 // {4FAD14C1-D7D3-40bc-9C83-88498FE114F3}\r
739 DEFINE_GUID(GUID_MD_INTERFACE, \r
740 0x4fad14c1, 0xd7d3, 0x40bc, 0x9c, 0x83, 0x88, 0x49, 0x8f, 0xe1, 0x14, 0xf3);\r