7d41a389409fad672d2c2f29025635f303d738ba
[mirror/winof/.git] / core / bus / kernel / bus_driver.h
1 /*\r
2  * Copyright (c) 2005 SilverStorm Technologies.  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 \r
33 \r
34 #if !defined _BUS_DRIVER_H_\r
35 #define _BUS_DRIVER_H_\r
36 \r
37 #include "complib/cl_types.h"\r
38 #include "complib/cl_atomic.h"\r
39 #include "complib/cl_debug.h"\r
40 #include "complib/cl_mutex.h"\r
41 #include "complib/cl_qlist.h"\r
42 #include "complib/cl_ptr_vector.h"\r
43 #include "complib/cl_pnp_po.h"\r
44 #include "iba/ib_al.h"\r
45 #include "bus_port_mgr.h"\r
46 #include "bus_iou_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 \r
59 /*\r
60  * Main header for IB Bus driver.\r
61  */\r
62 \r
63 #define BUS_ENTER( lvl )                        \\r
64         CL_ENTER( lvl, bus_globals.dbg_lvl )\r
65 \r
66 #define BUS_EXIT( lvl )                         \\r
67         CL_EXIT( lvl, bus_globals.dbg_lvl )\r
68 \r
69 #define BUS_TRACE( lvl, msg )           \\r
70         CL_TRACE( lvl, bus_globals.dbg_lvl, msg )\r
71 \r
72 #define BUS_TRACE_EXIT( lvl, msg )      \\r
73         CL_TRACE_EXIT( lvl, bus_globals.dbg_lvl, msg )\r
74 \r
75 #define BUS_PRINT( lvl, msg )           \\r
76         CL_PRINT( lvl, bus_globals.dbl_lvl, msg )\r
77 \r
78 #define BUS_DBG_ERROR   CL_DBG_ERROR\r
79 #define BUS_DBG_DRV             (1 << 0)\r
80 #define BUS_DBG_PNP             (1 << 1)\r
81 #define BUS_DBG_POWER   (1 << 2)\r
82 #define BUS_DBG_PORT    (1 << 3)\r
83 #define BUS_DBG_IOU             (1 << 4)\r
84 \r
85 /*\r
86  * ALLOC_PRAGMA sections:\r
87  *      PAGE\r
88  *              Default pagable code.  Won't be locked in memory.\r
89  *\r
90  *      PAGE_PNP\r
91  *              Code that needs to be locked in memory when the device is\r
92  *              in the paging, crash dump, or hibernation path.\r
93  */\r
94 \r
95 \r
96 /*\r
97  * Device extension for the device object that serves as entry point for \r
98  * the interface and IOCTL requests.\r
99  */\r
100 typedef struct _bus_fdo_ext\r
101 {\r
102         cl_pnp_po_ext_t                 cl_ext;\r
103 \r
104         /*\r
105          * Device power map returned by the bus driver for the device, used \r
106          * when sending IRP_MN_SET_POWER for device state in response to \r
107          * IRP_MN_SET_POWER for system state.\r
108          */\r
109         DEVICE_POWER_STATE              po_state[PowerSystemMaximum];\r
110 \r
111         port_mgr_t                              *p_port_mgr;\r
112         iou_mgr_t                               *p_iou_mgr;\r
113 \r
114         /* Interface names are generated by IoRegisterDeviceInterface. */\r
115         UNICODE_STRING                  al_ifc_name;\r
116         UNICODE_STRING                  ci_ifc_name;\r
117 \r
118         /* Number of references on the upper interface. */\r
119         atomic32_t                              n_al_ifc_ref;\r
120         /* Number of references on the CI interface. */\r
121         atomic32_t                              n_ci_ifc_ref;\r
122 \r
123 }       bus_fdo_ext_t;\r
124 \r
125 \r
126 /*\r
127  * Device extension for bus driver PDOs.\r
128  */\r
129 typedef struct _bus_pdo_ext\r
130 {\r
131         cl_pnp_po_ext_t                 cl_ext;\r
132 \r
133         cl_list_item_t                  list_item;\r
134 \r
135         /* All reported PDOs are children of an HCA. */\r
136 TO_LONG_PTR(    ib_ca_handle_t ,                        h_ca) ; \r
137 \r
138         /*\r
139          * CA GUID copy - in case we get IRPs after the CA\r
140          * handle has been released.\r
141          */\r
142         net64_t                                 ca_guid;\r
143 \r
144         POWER_STATE                             dev_po_state;\r
145 \r
146         /*\r
147          * Pointer to the bus root device extension.  Used to manage access to\r
148          * child PDO pointer vector when a child is removed politely.\r
149          */\r
150         bus_fdo_ext_t                   *p_parent_ext;\r
151 \r
152         /*\r
153          * The following two flags are exclusively set, but can both be FALSE.\r
154          * Flag that indicates whether the device is present in the system or not.\r
155          * This affects how a IRP_MN_REMOVE_DEVICE IRP is handled for a child PDO.\r
156          * This flag is cleared when:\r
157          *      - an HCA (for IPoIB devices) is removed from the system for all port\r
158          *      devices loaded for that HCA\r
159          *      - an IOU is reported as removed by the CIA.\r
160          */\r
161         boolean_t                               b_present;\r
162 \r
163         /*\r
164          * Flag that indicates whether the device has been reported to the PnP\r
165          * manager as having been removed.  That is, the device was reported\r
166          * in a previous BusRelations query and not in a subsequent one.\r
167          * This flag is set when\r
168          *      - the device is in the surprise remove state when the parent bus\r
169          *      device is removed\r
170          *      - the device is found to be not present during a BusRelations query\r
171          *      and thus not reported.\r
172          */\r
173         boolean_t                               b_reported_missing;\r
174 \r
175         /* Flag to control the behaviour of the driver during hibernation */\r
176         uint32_t                                        b_hibernating;\r
177 \r
178         /* work item for handling Power Management request */\r
179         PIO_WORKITEM                    p_po_work_item;\r
180         \r
181 }       bus_pdo_ext_t;\r
182 \r
183 \r
184 /*\r
185  * Global Driver parameters.\r
186  */\r
187 typedef struct _bus_globals\r
188 {\r
189         /* Debug level. */\r
190         uint32_t                                dbg_lvl;\r
191 \r
192         /* Flag to control loading of Ip Over Ib driver for each HCA port. */\r
193         uint32_t                                b_report_port_nic;\r
194 \r
195         /* Driver object.  Used for registering of Plug and Play notifications. */\r
196         DRIVER_OBJECT                   *p_driver_obj;\r
197 \r
198         /* Pointer to the one and only bus root. */\r
199         bus_fdo_ext_t                   *p_bus_ext;\r
200 \r
201 }       bus_globals_t;\r
202 \r
203 \r
204 extern bus_globals_t    bus_globals;\r
205 \r
206 \r
207 #endif  /* !defined _BUS_DRIVER_H_ */\r