e3b022e0e3571e168725dac89e05881014897503
[mirror/winof/.git] / hw / mt23108 / vapi / mlxsys / os_dep / win / tdriver / MdIoctl.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 #undef BYTE_OFFSET\r
34 //#include <MT21108.h>\r
35 //#include "mtib.h"\r
36 \r
37 \r
38 NTSTATUS\r
39 MdProcessIoctl(\r
40     IN PDEVICE_OBJECT   pi_pDeviceObject,\r
41     IN PIRP                             pi_pIrp\r
42     )\r
43 /*++\r
44 \r
45 Routine Description:\r
46 \r
47     Dispatch table handler for IRP_MJ_DEVICE_CONTROL; \r
48     Handle DeviceIoControl() calls  from User mode\r
49 \r
50 \r
51 Arguments:\r
52 \r
53     DeviceObject - pointer to the FDO for this instance of the 82930 device.\r
54 \r
55 \r
56 Return Value:\r
57 \r
58     NT status code\r
59 \r
60 --*/\r
61 { /* MdProcessIoctl */\r
62                 \r
63   NTSTATUS                              l_Status;\r
64   PIO_STACK_LOCATION            l_pIrpStack;\r
65   PVOID                                 l_pInBuffer;\r
66   PVOID                                 l_pOutBuffer;\r
67   ULONG                                 l_nInBufLength;\r
68   ULONG                                 l_nOutBufLength;\r
69   PMD_DEV_CONTEXT_T             l_pMdDevContext = (PMD_DEV_CONTEXT_T)pi_pDeviceObject->DeviceExtension;\r
70   ULONG                                 l_nIoControlCode;\r
71   PCHAR                                 l_pTmp;\r
72   PFILE_OBJECT                  l_pFileObject;\r
73   PMD_PCS_CONTEXT_T             l_pPcs;\r
74 \r
75         /* register ioctl */\r
76     MdKdPrint( DBGLVL_MAXIMUM,("(MdProcessIoctl) Enter\n"));\r
77     MdIncrementIoCount(l_pMdDevContext);\r
78 \r
79         /* handle service call */    \r
80         if ( l_pMdDevContext->m_eDevType == MD_DEV_IX_TAVOR_SD ) {\r
81                 KSEM_ACQ(&l_pMdDevContext->m_Sem);\r
82                 l_Status = PciIoctlFast( l_pMdDevContext, pi_pIrp );\r
83                 KSEM_REL(&l_pMdDevContext->m_Sem);\r
84                 goto Done;\r
85         }\r
86         if (l_pMdDevContext->m_eDevType == MD_DEV_IX_TAVOR_BD) {\r
87                 KSEM_ACQ(&l_pMdDevContext->m_Sem);\r
88                 l_Status = ConfIoctlFast( l_pMdDevContext, pi_pIrp );\r
89                 KSEM_REL(&l_pMdDevContext->m_Sem);\r
90                 goto Done;\r
91         }\r
92 \r
93         /* handle functional call */    \r
94 \r
95         /* set default status */\r
96     pi_pIrp->IoStatus.Status = STATUS_SUCCESS;\r
97     pi_pIrp->IoStatus.Information = 0;\r
98 \r
99     // Can't accept a new io request if:\r
100     //  1) device is removed, \r
101     //  2) has never been started, \r
102     //  3) is stopped,\r
103     //  4) has a remove request pending,\r
104     //  5) has a stop device pending\r
105     if ( !MdCanAcceptIoRequests( pi_pDeviceObject ) ) \r
106         { /* the request can't be accepted */\r
107 \r
108         l_Status                = STATUS_DELETE_PENDING;\r
109                 goto Done;\r
110 \r
111     } /* the request can't be accepted */\r
112 \r
113   /* get pointer to IRP stack */\r
114   l_pIrpStack           = IoGetCurrentIrpStackLocation (pi_pIrp);\r
115 \r
116   /* get file handle, serving as Process Id */\r
117   l_pFileObject = l_pIrpStack->FileObject;\r
118   l_pPcs = (PMD_PCS_CONTEXT_T)  l_pFileObject->FsContext;\r
119   MdKdPrint( DBGLVL_HIGH,("(RunRequest) File Object 0x%x, Pid 0x%x\n", l_pFileObject, MOSAL_getpid() ));\r
120 \r
121     // get pointers and lengths of the caller's (user's) IO buffer\r
122     l_nOutBufLength             = l_pIrpStack->Parameters.DeviceIoControl.OutputBufferLength;\r
123     l_pOutBuffer                = l_nOutBufLength ? MmGetSystemAddressForMdlSafe(pi_pIrp->MdlAddress, HighPagePriority ) : NULL; \r
124     l_nInBufLength              = l_pIrpStack->Parameters.DeviceIoControl.InputBufferLength;\r
125     l_pInBuffer         = l_nInBufLength ? pi_pIrp->AssociatedIrp.SystemBuffer : NULL;\r
126     l_nIoControlCode    = l_pIrpStack->Parameters.DeviceIoControl.IoControlCode;\r
127         l_pTmp                          = l_pInBuffer;\r
128 \r
129 \r
130     //\r
131     // Handle Ioctls from User mode\r
132     //\r
133 \r
134         switch (l_pMdDevContext->m_eDevType) \r
135         { /* handle Ioctls */\r
136                 case MD_DEV_IX_TAVOR_BD:\r
137                         l_Status = ConfIoctl( l_pMdDevContext, l_pPcs, l_nIoControlCode, l_pInBuffer, \r
138                                 l_nInBufLength, l_pOutBuffer, l_nOutBufLength, (PULONG)&pi_pIrp->IoStatus.Information );\r
139                         break;\r
140                                 \r
141                 case MD_DEV_IX_TAVOR_SD:\r
142                 case MD_DEV_IX_TAVOR:\r
143                         l_Status = PciIoctl( l_pMdDevContext, l_pPcs, l_nIoControlCode, l_pInBuffer, \r
144                                 l_nInBufLength, l_pOutBuffer, l_nOutBufLength, (PULONG)&pi_pIrp->IoStatus.Information );\r
145                         break;\r
146                         \r
147                 //case MD_DEV_IX_CTRL:\r
148                 //      l_Status = CtlIoctl( l_pMdDevContext, l_pPcs, l_nIoControlCode, l_pInBuffer, \r
149                 //              l_nInBufLength, l_pOutBuffer, l_nOutBufLength, (PULONG)&pi_pIrp->IoStatus.Information );\r
150                 //      break;\r
151 \r
152                 default:\r
153                         MdKdPrint( DBGLVL_DEFAULT,("(RunRequest) Internal error - unknown device type %d\n", l_pMdDevContext->m_eDevType));\r
154                         l_Status = STATUS_NOT_IMPLEMENTED;\r
155                         break;\r
156                         \r
157         } /* handle Ioctls */\r
158         \r
159         \r
160 Done:\r
161 \r
162         /* store status */\r
163         pi_pIrp->IoStatus.Status = l_Status;\r
164 \r
165         /* complete IRP */\r
166     IoCompleteRequest( pi_pIrp, IO_NO_INCREMENT );\r
167 \r
168         /* de-register ioctl */\r
169         MdDecrementIoCount(l_pMdDevContext);                       \r
170         \r
171         return l_Status;\r
172 \r
173 } /* MdProcessIoctl */\r
174 \r
175 /*------------------------------------------------------------------------------------------------------*/\r
176 \r
177 NTSTATUS\r
178 MdResetDevice(\r
179     IN PDEVICE_OBJECT DeviceObject\r
180     )\r
181 /*++\r
182 \r
183 Routine Description:\r
184         Checks port status; if OK, return success and  do no more;\r
185         If bad, attempt reset\r
186 \r
187 Arguments:\r
188 \r
189     DeviceObject - pointer to the device object for this instance of the 82930\r
190                     device.\r
191 \r
192 \r
193 Return Value:\r
194 \r
195     NT status code\r
196 \r
197 --*/\r
198 {\r
199     NTSTATUS ntStatus = STATUS_SUCCESS;\r
200 \r
201     MdKdPrint(DBGLVL_MAXIMUM,("(MdResetDevice) Enter \n"));\r
202         return ntStatus;\r
203 }\r
204 \r
205 \r
206 \r
207 \r
208 \r
209 \r