[CORE] Expose vendor defined device in ibiou.
[mirror/winof/.git] / core / iou / kernel / iou_driver.h
1 /*\r
2  * Copyright (c) 2005 SilverStorm Technologies.  All rights reserved.\r
3  * Portions Copyright (c) 2008 Microsoft Corporation.  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 \r
34 \r
35 #if !defined _IOU_DRIVER_H_\r
36 #define _IOU_DRIVER_H_\r
37 \r
38 #include "complib/cl_types.h"\r
39 #include "complib/cl_atomic.h"\r
40 #include "complib/cl_debug.h"\r
41 #include "complib/cl_mutex.h"\r
42 #include "complib/cl_qlist.h"\r
43 #include "complib/cl_ptr_vector.h"\r
44 #include "complib/cl_pnp_po.h"\r
45 #include "iba/ib_al.h"\r
46 #include "iou_ioc_mgr.h"\r
47 \r
48 /* Safe string functions. */\r
49 #if WINVER == 0x500\r
50 /*\r
51  * Windows 2000 doesn't support the inline version of safe strings.\r
52  * Force the use of the library version of safe strings.\r
53  */\r
54 #define NTSTRSAFE_LIB\r
55 #endif\r
56 #include <ntstrsafe.h>\r
57 \r
58 extern uint32_t         g_iou_dbg_level;\r
59 extern uint32_t         g_iou_dbg_flags;\r
60 \r
61 #if defined(EVENT_TRACING)\r
62 //\r
63 // Software Tracing Definitions \r
64 //\r
65 \r
66 #define WPP_CONTROL_GUIDS \\r
67         WPP_DEFINE_CONTROL_GUID(IOUCtlGuid,(A0090FEF,01BB,4617,AF1E,FD02FD5B24ED),  \\r
68         WPP_DEFINE_BIT( IOU_DBG_ERROR) \\r
69         WPP_DEFINE_BIT( IOU_DBG_DRV) \\r
70         WPP_DEFINE_BIT( IOU_DBG_PNP) \\r
71         WPP_DEFINE_BIT( IOU_DBG_POWER) \\r
72         WPP_DEFINE_BIT( IOU_DBG_PORT) \\r
73         WPP_DEFINE_BIT( IOU_DBG_IOU))\r
74 \r
75 \r
76 \r
77 #define WPP_LEVEL_FLAGS_ENABLED(lvl, flags) (WPP_LEVEL_ENABLED(flags) && WPP_CONTROL(WPP_BIT_ ## flags).Level  >= lvl)\r
78 #define WPP_LEVEL_FLAGS_LOGGER(lvl,flags) WPP_LEVEL_LOGGER(flags)\r
79 #define WPP_FLAG_ENABLED(flags)(WPP_LEVEL_ENABLED(flags) && WPP_CONTROL(WPP_BIT_ ## flags).Level  >= TRACE_LEVEL_VERBOSE)\r
80 #define WPP_FLAG_LOGGER(flags) WPP_LEVEL_LOGGER(flags)\r
81 \r
82 \r
83 // begin_wpp config\r
84 // IOU_ENTER(FLAG);\r
85 // IOU_EXIT(FLAG);\r
86 // USEPREFIX(IOU_PRINT, "%!STDPREFIX! [IOU] :%!FUNC!() :");\r
87 // USESUFFIX(IOU_ENTER, " [IOU] :%!FUNC!():[");\r
88 // USESUFFIX(IOU_EXIT, " [IOU] :%!FUNC!():]");\r
89 // end_wpp\r
90 \r
91 \r
92 #else\r
93 \r
94 \r
95 #include <evntrace.h>\r
96 \r
97 /*\r
98  * Debug macros\r
99  */\r
100 \r
101 \r
102 #define IOU_DBG_ERR             (1 << 0)\r
103 #define IOU_DBG_DRV             (1 << 1)\r
104 #define IOU_DBG_PNP             (1 << 2)\r
105 #define IOU_DBG_POWER   (1 << 3)\r
106 #define IOU_DBG_PORT    (1 << 4)\r
107 #define IOU_DBG_IOU             (1 << 5)\r
108 \r
109 #define IOU_DBG_ERROR   (CL_DBG_ERROR | IOU_DBG_ERR)\r
110 #define IOU_DBG_ALL             CL_DBG_ALL\r
111 \r
112 #if DBG\r
113 \r
114 // assignment of _level_ is need to to overcome warning C4127\r
115 #define IOU_PRINT(_level_,_flag_,_msg_) \\r
116         { \\r
117                 if( g_iou_dbg_level >= (_level_) ) \\r
118                         CL_TRACE( _flag_, g_iou_dbg_flags, _msg_ ); \\r
119         }\r
120 \r
121 #define IOU_PRINT_EXIT(_level_,_flag_,_msg_) \\r
122         { \\r
123                 if( g_iou_dbg_level >= (_level_) ) \\r
124                         CL_TRACE( _flag_, g_iou_dbg_flags, _msg_ );\\r
125                 IOU_EXIT(_flag_);\\r
126         }\r
127 \r
128 #define IOU_ENTER(_flag_) \\r
129         { \\r
130                 if( g_iou_dbg_level >= TRACE_LEVEL_VERBOSE ) \\r
131                         CL_ENTER( _flag_, g_iou_dbg_flags ); \\r
132         }\r
133 \r
134 #define IOU_EXIT(_flag_)\\r
135         { \\r
136                 if( g_iou_dbg_level >= TRACE_LEVEL_VERBOSE ) \\r
137                         CL_EXIT( _flag_, g_iou_dbg_flags ); \\r
138         }\r
139 \r
140 \r
141 #else\r
142 \r
143 #define IOU_PRINT(lvl, flags, msg)\r
144 \r
145 #define IOU_PRINT_EXIT(_level_,_flag_,_msg_)\r
146 \r
147 #define IOU_ENTER(_flag_)\r
148 \r
149 #define IOU_EXIT(_flag_)\r
150 \r
151 \r
152 #endif\r
153 \r
154 \r
155 #endif //EVENT_TRACING\r
156 \r
157 /*\r
158  * Main header for IB Bus driver.\r
159  */\r
160 \r
161 \r
162 \r
163 /*\r
164  * ALLOC_PRAGMA sections:\r
165  *      PAGE\r
166  *              Default pagable code.  Won't be locked in memory.\r
167  *\r
168  *      PAGE_PNP\r
169  *              Code that needs to be locked in memory when the device is\r
170  *              in the paging, crash dump, or hibernation path.\r
171  */\r
172 \r
173 \r
174 /*\r
175  * Device extension for the device object that serves as entry point for \r
176  * the interface and IOCTL requests.\r
177  */\r
178 typedef struct _iou_fdo_ext\r
179 {\r
180         cl_pnp_po_ext_t                 cl_ext;\r
181 \r
182         /*\r
183          * Device power map returned by the bus driver for the device, used \r
184          * when sending IRP_MN_SET_POWER for device state in response to \r
185          * IRP_MN_SET_POWER for system state.\r
186          */\r
187         DEVICE_POWER_STATE              po_state[PowerSystemMaximum];\r
188 \r
189         ioc_mgr_t                               ioc_mgr;\r
190 \r
191 }       iou_fdo_ext_t;\r
192 \r
193 /*\r
194  * Device extension for bus driver PDOs.\r
195  */\r
196 typedef struct _iou_pdo_ext\r
197 {\r
198         cl_pnp_po_ext_t                 cl_ext;\r
199 \r
200         cl_list_item_t                  list_item;\r
201 \r
202         /* All reported PDOs are children of an HCA. */\r
203         ib_ca_handle_t                  h_ca;\r
204 \r
205         /*\r
206          * CA GUID copy - in case we get IRPs after the CA\r
207          * handle has been released.\r
208          */\r
209         net64_t                                 ca_guid;\r
210         POWER_STATE                             dev_po_state;\r
211 \r
212         /*\r
213          * Pointer to the bus root device extension.  Used to manage access to\r
214          * child PDO pointer vector when a child is removed politely.\r
215          */\r
216         iou_fdo_ext_t                   *p_parent_ext;\r
217 \r
218         /*\r
219          * The following two flags are exclusively set, but can both be FALSE.\r
220          * Flag that indicates whether the device is present in the system or not.\r
221          * This affects how a IRP_MN_REMOVE_DEVICE IRP is handled for a child PDO.\r
222          * This flag is cleared when:\r
223          *      - an HCA (for IPoIB devices) is removed from the system for all port\r
224          *      devices loaded for that HCA\r
225          *      - an IOU is reported as removed by the CIA.\r
226          */\r
227         boolean_t                               b_present;\r
228 \r
229         /*\r
230          * Flag that indicates whether the device has been reported to the PnP\r
231          * manager as having been removed.  That is, the device was reported\r
232          * in a previous BusRelations query and not in a subsequent one.\r
233          * This flag is set when\r
234          *      - the device is in the surprise remove state when the parent bus\r
235          *      device is removed\r
236          *      - the device is found to be not present during a BusRelations query\r
237          *      and thus not reported.\r
238          */\r
239         boolean_t                               b_reported_missing;\r
240         struct _child_device_info                       *p_pdo_device_info;\r
241 }       iou_pdo_ext_t;\r
242 \r
243 \r
244 /*\r
245  * Global Driver parameters.\r
246  */\r
247 typedef struct _iou_globals\r
248 {\r
249         /* Driver object.  Used for creating child devices. */\r
250         DRIVER_OBJECT                   *p_driver_obj;\r
251         struct _child_device_info_list *p_device_list;\r
252         cl_mutex_t                      list_mutex;\r
253         cl_qlist_t                      ca_ioc_map_list;\r
254         PDEVICE_OBJECT                  p_config_device;\r
255 }       iou_globals_t;\r
256 \r
257 \r
258 extern iou_globals_t    iou_globals;\r
259 \r
260 \r
261 \r
262 \r
263 #endif  /* !defined _IOU_DRIVER_H_ */\r