8398471a60de0a8f9ed120915409645c85f5aca0
[mirror/winof/.git] / hw / mt23108 / vapi / mlxsys / os_dep / win / tdriver / MdRdWr.c
1 /*\r
2  * Copyright (c) 2004-2005 Mellanox Technologies Ltd.  All rights reserved.\r
3  *\r
4  * This software is available to you under the OpenIB.org BSD license\r
5  * below:\r
6  *\r
7  *     Redistribution and use in source and binary forms, with or\r
8  *     without modification, are permitted provided that the following\r
9  *     conditions are met:\r
10  *\r
11  *      - Redistributions of source code must retain the above\r
12  *        copyright notice, this list of conditions and the following\r
13  *        disclaimer.\r
14  *\r
15  *      - Redistributions in binary form must reproduce the above\r
16  *        copyright notice, this list of conditions and the following\r
17  *        disclaimer in the documentation and/or other materials\r
18  *        provided with the distribution.\r
19  *\r
20  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
21  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
22  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
23  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\r
24  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\r
25  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
26  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r
27  * SOFTWARE.\r
28  *\r
29  * $Id$\r
30  */\r
31 \r
32 #include "MdGen.h"\r
33 \r
34 //void* VIPKL_open(void);\r
35 //void VIPKL_close(void* hca_stat_p);\r
36 //void * IB_MGT_dev_open(void);\r
37 //void IB_MGT_dev_close(void * proc_state_p);\r
38 void *MOSAL_rsct_open(MOSAL_pid_t pid);\r
39 void MOSAL_rsct_close(void *p_rsct, MOSAL_pid_t pid);\r
40 //int IsIbMgtOn();\r
41 \r
42 \r
43 \r
44 \r
45 NTSTATUS\r
46 MdClose(\r
47     IN PDEVICE_OBJECT   pi_pFdo,\r
48     IN PIRP                             pi_pIrp\r
49     )\r
50 /*++\r
51 \r
52 Routine Description:\r
53 \r
54     This is the dispatch table routine for IRP_MJ_CLOSE.\r
55     It handles user mode CloseHandle() calls for a pipe\r
56     It closes the File Object for the pipe handle it represents.\r
57 \r
58 Arguments:\r
59 \r
60     pi_pFdo - pointer to our FDO (Functional Device Object )\r
61 \r
62 \r
63 Return Value:\r
64 \r
65     NT status code\r
66 \r
67 --*/\r
68 {\r
69     NTSTATUS                            l_Status= STATUS_SUCCESS;\r
70     PFILE_OBJECT                        l_pFileObject;\r
71     PIO_STACK_LOCATION          l_pIrpStack;\r
72     PMD_DEV_CONTEXT_T           l_pMdDevContext = (PMD_DEV_CONTEXT_T)pi_pFdo->DeviceExtension;\r
73         PMD_PCS_CONTEXT_T               l_pPcs;\r
74 \r
75     MdKdPrint( DBGLVL_HIGH,("entering MdClose\n"));\r
76     \r
77     MdIncrementIoCount(l_pMdDevContext);\r
78 \r
79         // get file handle \r
80     l_pIrpStack = IoGetCurrentIrpStackLocation (pi_pIrp);\r
81     l_pFileObject = l_pIrpStack->FileObject;\r
82 \r
83     // sanity check\r
84     if (l_pFileObject->FsContext == NULL)\r
85     { /* unexpectable: noone is using this field ! We can't proceed !! */\r
86 #pragma warning( push )\r
87 #pragma warning( disable:4296 )\r
88       MdKdPrint( DBGLVL_ALWAYS,("MdClose: Someone has taken our private file context (FsContext=%p)- can't proceed \n",\r
89         l_pFileObject->FsContext));\r
90 #pragma warning( pop )\r
91       l_Status = STATUS_UNSUCCESSFUL;\r
92       goto done;\r
93     } /* unexpectable: someone is using this field ! We can't proceed !! */\r
94 \r
95     // get process context    \r
96     l_pPcs = (PMD_PCS_CONTEXT_T)l_pFileObject->FsContext;\r
97 \r
98     // resource tracking\r
99    switch (l_pMdDevContext->m_eDevType) \r
100         { /* handle Ioctls */\r
101                         case MD_DEV_IX_TAVOR_SD:\r
102                                 PciRelease( l_pMdDevContext, l_pPcs );\r
103                                 break;\r
104                                 \r
105                         case MD_DEV_IX_TAVOR:\r
106                           // MDCTL\r
107             PciRelease( l_pMdDevContext, l_pPcs );\r
108                                 break;\r
109                                 \r
110                         case MD_DEV_IX_TAVOR_BD:\r
111                                 break;\r
112                                 \r
113                         case MD_DEV_IX_CTRL:\r
114                           // IB_MGT\r
115                           //if (IsIbMgtOn()) \r
116                    //         IB_MGT_dev_close(l_pPcs->m_hIbMgt);\r
117                           // VIPKL\r
118                    //         VIPKL_close(l_pPcs->m_hVipkl);\r
119             // MOSAL\r
120                 MOSAL_rsct_close(l_pPcs->m_hMosal, l_pPcs->m_Pid);      \r
121                                 break;\r
122         \r
123                         default:\r
124                                 MdKdPrint( DBGLVL_DEFAULT,("(MdClose) Internal error - unknown device type %d\n", l_pMdDevContext->m_eDevType));\r
125                                 l_Status = STATUS_NOT_IMPLEMENTED;\r
126                                 break;\r
127                                 \r
128                 } /* handle Ioctls */\r
129         \r
130 \r
131       // remove the process context \r
132           MdExFreePool( (PVOID)l_pPcs );\r
133 \r
134         /* decrement reference counter */\r
135         InterlockedDecrement( &l_pMdDevContext->m_nOpenCount );\r
136 \r
137         /* remove control device on need */\r
138         if (l_pMdDevContext->m_fDeletePending == TRUE && l_pMdDevContext->m_nOpenCount == 0)\r
139         { /* no applications - one can remove the control device */\r
140 \r
141                 // The final decrement to device extension PendingIoCount == 0\r
142         // will set l_pMdDevContext->m_RemoveEvent, enabling device removal.\r
143         // If there is no pending IO at this point, the below decrement will be it.\r
144         MdDecrementIoCount(l_pMdDevContext);\r
145 \r
146         } /* no applications - one can remove the control device */\r
147 \r
148 done:\r
149     pi_pIrp->IoStatus.Status = l_Status;\r
150     pi_pIrp->IoStatus.Information = 0;\r
151 \r
152     IoCompleteRequest (pi_pIrp,\r
153                        IO_NO_INCREMENT\r
154                        );\r
155                        \r
156         MdDecrementIoCount(l_pMdDevContext);\r
157 \r
158         // try to power down device if this is the last pipe\r
159         // ??? actStat = MdSelfSuspendOrActivate( DeviceObject, TRUE );\r
160 \r
161     MdKdPrint( DBGLVL_HIGH,("exit MdClose  status %x\n", l_Status));\r
162 \r
163     return l_Status;\r
164 }\r
165 \r
166 \r
167 NTSTATUS\r
168 MdCreate(\r
169     IN PDEVICE_OBJECT   pi_pFdo,\r
170     IN PIRP                             pi_pIrp\r
171     )\r
172 /*++\r
173 \r
174 Routine Description:\r
175 \r
176     This is the dispatch table routine for IRP_MJ_CREATE.\r
177     It's the entry point for CreateFile() calls\r
178     user mode apps may open "<name genned fron GUID>.\yy"\r
179     where yy is the internal pipe id\r
180 \r
181 Arguments:\r
182 \r
183     pi_pFdo - pointer to our FDO ( Functional Device Object )\r
184 \r
185 \r
186 Return Value:\r
187 \r
188     NT status code\r
189 \r
190 --*/\r
191 {\r
192     NTSTATUS                            l_Status = STATUS_SUCCESS;\r
193     PIO_STACK_LOCATION          l_pIrpStack;\r
194     PMD_DEV_CONTEXT_T           l_pMdDevContext = (PMD_DEV_CONTEXT_T)pi_pFdo->DeviceExtension;\r
195     PFILE_OBJECT                        l_pFileObject;\r
196         PMD_PCS_CONTEXT_T               l_pPcs;\r
197 \r
198     MdKdPrint( DBGLVL_HIGH,("entering MdCreate\n"));\r
199 \r
200     MdIncrementIoCount(l_pMdDevContext);\r
201 \r
202     // Can't accept a new io request if:\r
203     //  1) device is removed, \r
204     //  2) has never been started, \r
205     //  3) is stopped,\r
206     //  4) has a remove request pending,\r
207     //  5) has a stop device pending\r
208     if ( !MdCanAcceptIoRequests( pi_pFdo ) ) {\r
209         l_Status = STATUS_DELETE_PENDING;\r
210                 MdKdPrint( DBGLVL_DEFAULT,("ABORTING MdCreate\n"));\r
211         goto done;\r
212     }\r
213     \r
214         // get file handle \r
215     l_pIrpStack = IoGetCurrentIrpStackLocation (pi_pIrp);\r
216     l_pFileObject       = l_pIrpStack->FileObject;\r
217     //MdKdPrint( DBGLVL_ALWAYS,("MdCreate: file handle %p\n",l_pFileObject));\r
218 \r
219     // sanity check\r
220     if (l_pFileObject->FsContext != NULL)\r
221     { /* unexpectable: someone is using this field ! We can't proceed !! */\r
222 #pragma warning( push )\r
223 #pragma warning( disable:4296 )\r
224       MdKdPrint( DBGLVL_ALWAYS,("MdCreate: Someone is using private file context (FsContext=%p)- can't proceed \n",l_pFileObject->FsContext));\r
225 #pragma warning( pop )\r
226       l_Status = STATUS_UNSUCCESSFUL;\r
227       goto done;\r
228     } /* unexpectable: someone is using this field ! We can't proceed !! */\r
229     \r
230     // create process context\r
231         l_pPcs = (PMD_PCS_CONTEXT_T)MdExAllocatePool(NonPagedPool, sizeof(MD_PCS_CONTEXT_T));\r
232         if (l_pPcs == NULL )\r
233         {\r
234                 l_Status = STATUS_INSUFFICIENT_RESOURCES;\r
235                 goto done;\r
236         }\r
237     l_pFileObject->FsContext = (PVOID)l_pPcs;\r
238 \r
239     // fill process context\r
240         RtlZeroMemory( l_pPcs, sizeof(MD_PCS_CONTEXT_T) );\r
241         l_pPcs->m_Pid   = MOSAL_getpid();\r
242     \r
243     // resource tracking\r
244     if ( l_pMdDevContext->m_eDevType    == MD_DEV_IX_CTRL ) {\r
245       // MOSAL\r
246           l_pPcs->m_hMosal = MOSAL_rsct_open(l_pPcs->m_Pid);    \r
247    //   // VIPKL  \r
248           //l_pPcs->m_hVipkl = VIPKL_open();    \r
249    //   // IB_MGT\r
250    //   l_pPcs->m_hIbMgt = IB_MGT_dev_open();\r
251     }\r
252 \r
253         // increment counter of open files (= counter of processes, working with this device)\r
254         InterlockedIncrement( &l_pMdDevContext->m_nOpenCount );\r
255 \r
256     MdKdPrint( DBGLVL_HIGH,("(MdCreate) File Object 0x%x, Pcs 0x%x, Pid 0x%x \n", \r
257                                 l_pFileObject, l_pPcs, l_pPcs->m_Pid ));\r
258 done:\r
259     pi_pIrp->IoStatus.Status = l_Status;\r
260     pi_pIrp->IoStatus.Information = 0;\r
261 \r
262 \r
263     IoCompleteRequest (pi_pIrp,\r
264                        IO_NO_INCREMENT\r
265                        );\r
266 \r
267     MdDecrementIoCount(l_pMdDevContext);                               \r
268 \r
269     MdKdPrint( DBGLVL_HIGH,("exit MdCreate %x\n", l_Status));\r
270 \r
271 \r
272     return l_Status;\r
273 }\r
274 \r
275 BOOLEAN\r
276 MdCancelPendingIo(\r
277     IN PDEVICE_OBJECT DeviceObject\r
278     )\r
279 /*++\r
280 \r
281 Routine Description:\r
282         Cancels pending IO, as on a sudden IRP_MN_REMOVE_DEVICE \r
283 \r
284 Arguments:\r
285 \r
286     DeviceObject - pointer to the device object for this instance of the 82930\r
287                     device.\r
288 \r
289 \r
290 Return Value:\r
291 \r
292     TRUE if cancelled any, else FALSE\r
293 \r
294 --*/\r
295 {\r
296         return TRUE;\r
297 }\r
298 \r
299 \r
300 \r
301 NTSTATUS\r
302 MdAbortInPgsReqs(\r
303     IN PDEVICE_OBJECT DeviceObject\r
304     )\r
305 /*++\r
306 \r
307 Routine Description:\r
308 \r
309         Called as part of sudden device removal handling.\r
310     Cancels all in progress requests. \r
311 \r
312 Arguments:\r
313 \r
314     Ptrs to our FDO\r
315 \r
316 Return Value:\r
317 \r
318     NT status code\r
319 \r
320 --*/\r
321 {\r
322     NTSTATUS ntStatus = STATUS_SUCCESS;\r
323     return ntStatus;\r
324 }\r
325 \r
326 \r
327 \r
328 \r