[HCA] Distinguish between Tavor and Arbel HCAs, report correct device ID
[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                         case MD_DEV_IX_ARBEL_TM:\r
107                           // MDCTL\r
108                                 PciRelease( l_pMdDevContext, l_pPcs );\r
109                                 break;\r
110                                 \r
111                         case MD_DEV_IX_TAVOR_BD:\r
112                                 break;\r
113                                 \r
114                         case MD_DEV_IX_CTRL:\r
115                           // IB_MGT\r
116                           //if (IsIbMgtOn()) \r
117                    //         IB_MGT_dev_close(l_pPcs->m_hIbMgt);\r
118                           // VIPKL\r
119                    //         VIPKL_close(l_pPcs->m_hVipkl);\r
120             // MOSAL\r
121                 MOSAL_rsct_close(l_pPcs->m_hMosal, l_pPcs->m_Pid);      \r
122                                 break;\r
123         \r
124                         default:\r
125                                 MdKdPrint( DBGLVL_DEFAULT,("(MdClose) Internal error - unknown device type %d\n", l_pMdDevContext->m_eDevType));\r
126                                 l_Status = STATUS_NOT_IMPLEMENTED;\r
127                                 break;\r
128                                 \r
129                 } /* handle Ioctls */\r
130         \r
131 \r
132       // remove the process context \r
133           MdExFreePool( (PVOID)l_pPcs );\r
134 \r
135         /* decrement reference counter */\r
136         InterlockedDecrement( &l_pMdDevContext->m_nOpenCount );\r
137 \r
138         /* remove control device on need */\r
139         if (l_pMdDevContext->m_fDeletePending == TRUE && l_pMdDevContext->m_nOpenCount == 0)\r
140         { /* no applications - one can remove the control device */\r
141 \r
142                 // The final decrement to device extension PendingIoCount == 0\r
143         // will set l_pMdDevContext->m_RemoveEvent, enabling device removal.\r
144         // If there is no pending IO at this point, the below decrement will be it.\r
145         MdDecrementIoCount(l_pMdDevContext);\r
146 \r
147         } /* no applications - one can remove the control device */\r
148 \r
149 done:\r
150     pi_pIrp->IoStatus.Status = l_Status;\r
151     pi_pIrp->IoStatus.Information = 0;\r
152 \r
153     IoCompleteRequest (pi_pIrp,\r
154                        IO_NO_INCREMENT\r
155                        );\r
156                        \r
157         MdDecrementIoCount(l_pMdDevContext);\r
158 \r
159         // try to power down device if this is the last pipe\r
160         // ??? actStat = MdSelfSuspendOrActivate( DeviceObject, TRUE );\r
161 \r
162     MdKdPrint( DBGLVL_HIGH,("exit MdClose  status %x\n", l_Status));\r
163 \r
164     return l_Status;\r
165 }\r
166 \r
167 \r
168 NTSTATUS\r
169 MdCreate(\r
170     IN PDEVICE_OBJECT   pi_pFdo,\r
171     IN PIRP                             pi_pIrp\r
172     )\r
173 /*++\r
174 \r
175 Routine Description:\r
176 \r
177     This is the dispatch table routine for IRP_MJ_CREATE.\r
178     It's the entry point for CreateFile() calls\r
179     user mode apps may open "<name genned fron GUID>.\yy"\r
180     where yy is the internal pipe id\r
181 \r
182 Arguments:\r
183 \r
184     pi_pFdo - pointer to our FDO ( Functional Device Object )\r
185 \r
186 \r
187 Return Value:\r
188 \r
189     NT status code\r
190 \r
191 --*/\r
192 {\r
193     NTSTATUS                            l_Status = STATUS_SUCCESS;\r
194     PIO_STACK_LOCATION          l_pIrpStack;\r
195     PMD_DEV_CONTEXT_T           l_pMdDevContext = (PMD_DEV_CONTEXT_T)pi_pFdo->DeviceExtension;\r
196     PFILE_OBJECT                        l_pFileObject;\r
197         PMD_PCS_CONTEXT_T               l_pPcs;\r
198 \r
199     MdKdPrint( DBGLVL_HIGH,("entering MdCreate\n"));\r
200 \r
201     MdIncrementIoCount(l_pMdDevContext);\r
202 \r
203     // Can't accept a new io request if:\r
204     //  1) device is removed, \r
205     //  2) has never been started, \r
206     //  3) is stopped,\r
207     //  4) has a remove request pending,\r
208     //  5) has a stop device pending\r
209     if ( !MdCanAcceptIoRequests( pi_pFdo ) ) {\r
210         l_Status = STATUS_DELETE_PENDING;\r
211                 MdKdPrint( DBGLVL_DEFAULT,("ABORTING MdCreate\n"));\r
212         goto done;\r
213     }\r
214     \r
215         // get file handle \r
216     l_pIrpStack = IoGetCurrentIrpStackLocation (pi_pIrp);\r
217     l_pFileObject       = l_pIrpStack->FileObject;\r
218     //MdKdPrint( DBGLVL_ALWAYS,("MdCreate: file handle %p\n",l_pFileObject));\r
219 \r
220     // sanity check\r
221     if (l_pFileObject->FsContext != NULL)\r
222     { /* unexpectable: someone is using this field ! We can't proceed !! */\r
223 #pragma warning( push )\r
224 #pragma warning( disable:4296 )\r
225       MdKdPrint( DBGLVL_ALWAYS,("MdCreate: Someone is using private file context (FsContext=%p)- can't proceed \n",l_pFileObject->FsContext));\r
226 #pragma warning( pop )\r
227       l_Status = STATUS_UNSUCCESSFUL;\r
228       goto done;\r
229     } /* unexpectable: someone is using this field ! We can't proceed !! */\r
230     \r
231     // create process context\r
232         l_pPcs = (PMD_PCS_CONTEXT_T)MdExAllocatePool(NonPagedPool, sizeof(MD_PCS_CONTEXT_T));\r
233         if (l_pPcs == NULL )\r
234         {\r
235                 l_Status = STATUS_INSUFFICIENT_RESOURCES;\r
236                 goto done;\r
237         }\r
238     l_pFileObject->FsContext = (PVOID)l_pPcs;\r
239 \r
240     // fill process context\r
241         RtlZeroMemory( l_pPcs, sizeof(MD_PCS_CONTEXT_T) );\r
242         l_pPcs->m_Pid   = MOSAL_getpid();\r
243     \r
244     // resource tracking\r
245     if ( l_pMdDevContext->m_eDevType    == MD_DEV_IX_CTRL ) {\r
246       // MOSAL\r
247           l_pPcs->m_hMosal = MOSAL_rsct_open(l_pPcs->m_Pid);    \r
248    //   // VIPKL  \r
249           //l_pPcs->m_hVipkl = VIPKL_open();    \r
250    //   // IB_MGT\r
251    //   l_pPcs->m_hIbMgt = IB_MGT_dev_open();\r
252     }\r
253 \r
254         // increment counter of open files (= counter of processes, working with this device)\r
255         InterlockedIncrement( &l_pMdDevContext->m_nOpenCount );\r
256 \r
257     MdKdPrint( DBGLVL_HIGH,("(MdCreate) File Object 0x%x, Pcs 0x%x, Pid 0x%x \n", \r
258                                 l_pFileObject, l_pPcs, l_pPcs->m_Pid ));\r
259 done:\r
260     pi_pIrp->IoStatus.Status = l_Status;\r
261     pi_pIrp->IoStatus.Information = 0;\r
262 \r
263 \r
264     IoCompleteRequest (pi_pIrp,\r
265                        IO_NO_INCREMENT\r
266                        );\r
267 \r
268     MdDecrementIoCount(l_pMdDevContext);                               \r
269 \r
270     MdKdPrint( DBGLVL_HIGH,("exit MdCreate %x\n", l_Status));\r
271 \r
272 \r
273     return l_Status;\r
274 }\r
275 \r
276 BOOLEAN\r
277 MdCancelPendingIo(\r
278     IN PDEVICE_OBJECT DeviceObject\r
279     )\r
280 /*++\r
281 \r
282 Routine Description:\r
283         Cancels pending IO, as on a sudden IRP_MN_REMOVE_DEVICE \r
284 \r
285 Arguments:\r
286 \r
287     DeviceObject - pointer to the device object for this instance of the 82930\r
288                     device.\r
289 \r
290 \r
291 Return Value:\r
292 \r
293     TRUE if cancelled any, else FALSE\r
294 \r
295 --*/\r
296 {\r
297         return TRUE;\r
298 }\r
299 \r
300 \r
301 \r
302 NTSTATUS\r
303 MdAbortInPgsReqs(\r
304     IN PDEVICE_OBJECT DeviceObject\r
305     )\r
306 /*++\r
307 \r
308 Routine Description:\r
309 \r
310         Called as part of sudden device removal handling.\r
311     Cancels all in progress requests. \r
312 \r
313 Arguments:\r
314 \r
315     Ptrs to our FDO\r
316 \r
317 Return Value:\r
318 \r
319     NT status code\r
320 \r
321 --*/\r
322 {\r
323     NTSTATUS ntStatus = STATUS_SUCCESS;\r
324     return ntStatus;\r
325 }\r
326 \r
327 \r
328 \r
329 \r