[IBAL] Fix race between user-mode PnP deregistration and PnP callbacks.
[mirror/winof/.git] / core / al / al_pnp.h
1 /*\r
2  * Copyright (c) 2005 SilverStorm Technologies.  All rights reserved.\r
3  * Copyright (c) 1996-2003 Intel 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 #if !defined(__AL_PNP_H__)\r
34 #define __AL_PNP_H__\r
35 \r
36 \r
37 #include "al_common.h"\r
38 #include "al_ca.h"\r
39 #include <iba/ib_al_ioctl.h>\r
40 #include <complib/cl_ptr_vector.h>\r
41 #include <complib/cl_qmap.h>\r
42 \r
43 \r
44 extern char*    ib_pnp_event_str[];\r
45 \r
46 \r
47 typedef struct _al_pnp\r
48 {\r
49         al_obj_t                                obj;\r
50 \r
51         cl_async_proc_item_t    async_item;\r
52 #if defined( CL_KERNEL )\r
53         KEVENT                                  *p_sync_event;\r
54         cl_list_item_t                  list_item;\r
55         cl_async_proc_item_t    dereg_item;\r
56         ib_pnp_class_t                  pnp_class;\r
57         cl_qmap_t                               context_map;\r
58         IRP                                             *p_rearm_irp;\r
59         IRP                                             *p_dereg_irp;\r
60 #else   /* defined( CL_KERNEL ) */\r
61         ual_rearm_pnp_ioctl_out_t       rearm;\r
62         OVERLAPPED                                      ov;\r
63         OVERLAPPED                                      destroy_ov;\r
64 #endif  /* defined( CL_KERNEL ) */\r
65         ib_pfn_pnp_cb_t                 pfn_pnp_cb;\r
66 \r
67 }       al_pnp_t;\r
68 /*\r
69 * FIELDS\r
70 *       obj\r
71 *               AL object, used to manage relationships and destruction\r
72 *               synchronization.\r
73 *\r
74 *       list_item\r
75 *               Used to store the registration in the proper list for the class.\r
76 *\r
77 *       async_item\r
78 *               Asynchronous processing item used to handle registration and events.\r
79 *\r
80 *       dereg_item\r
81 *               Asynchronous processing item used to handle deregistration.  This item\r
82 *               is separate from the registration item to allow a user to immediately\r
83 *               call ib_dereg_pnp after ib_reg_pnp.\r
84 *\r
85 *       pnp_class\r
86 *               Class of PnP events for this registration.\r
87 *\r
88 *       pfn_pnp_cb\r
89 *               Client's PnP notification callback.\r
90 *\r
91 *       context_map\r
92 *               map of client contexts.\r
93 *********/\r
94 \r
95 \r
96 /*\r
97  * Context information stored in a registration structure.\r
98  */\r
99 typedef struct _al_pnp_context\r
100 {\r
101         /* List item must be first. */\r
102         cl_map_item_t                   map_item;\r
103         ib_net64_t                              guid;\r
104         const void                              *context;\r
105 \r
106 }       al_pnp_context_t;\r
107 \r
108 /****f* Access Layer/create_pnp\r
109 * DESCRIPTION\r
110 *       Initialized the plug and play manager.\r
111 *\r
112 * SYNOPSIS\r
113 */\r
114 ib_api_status_t\r
115 create_pnp(\r
116         IN                              al_obj_t* const                 p_parent_obj );\r
117 /******/\r
118 \r
119 \r
120 #ifdef CL_KERNEL\r
121 \r
122 /****f* Access Layer/al_pnp_ca_event\r
123 * NAME\r
124 *       pnp_ca_event\r
125 *\r
126 * DESCRIPTION\r
127 *       Reports a CA event to the plug and play manager.\r
128 *\r
129 * SYNOPSIS\r
130 */\r
131 ib_api_status_t\r
132 pnp_ca_event(\r
133         IN                              al_ci_ca_t* const               p_ci_ca,\r
134         IN              const   ib_pnp_event_t                  event );\r
135 /*\r
136 * PARAMETERS\r
137 *       p_ci_ca\r
138 *               Pointer to the al_ci_ca_t structure for the ca for which the event\r
139 *               is being reported.\r
140 *\r
141 *       event\r
142 *               One of IB_PNP_CA_ADD, IB_PNP_CA_REMOVE to indicate the type of CA\r
143 *               event being reported.\r
144 *****/\r
145 \r
146 \r
147 /****f* Access Layer/pnp_ca_change\r
148 * NAME\r
149 *       pnp_ca_change\r
150 *\r
151 * DESCRIPTION\r
152 *       Called by user mode AL to report a CA attribute change.\r
153 *\r
154 * SYNOPSIS\r
155 */\r
156 ib_api_status_t\r
157 pnp_ca_change(\r
158         IN                              al_ci_ca_t* const               p_ci_ca,\r
159         IN              const   ib_ca_attr_t*                   p_ca_attr );\r
160 /*\r
161 * PARAMETERS\r
162 *       p_ci_ca\r
163 *               Pointer to the al_ci_ca_t structure for the ca for which the change\r
164 *               is being reported.\r
165 *\r
166 *       p_ca_attr\r
167 *               Pointer to the updated CA attributes.\r
168 *****/\r
169 \r
170 \r
171 /****f* Access Layer/pnp_check_events\r
172 * NAME\r
173 *       pnp_poll\r
174 *\r
175 * DESCRIPTION\r
176 *       Check for PnP new events and report changes to registered clients.\r
177 *\r
178 * SYNOPSIS\r
179 */\r
180 void\r
181 pnp_poll(\r
182         void );\r
183 /******/\r
184 \r
185 \r
186 /****f* Access Layer/pnp_create_context\r
187 * NAME\r
188 *       pnp_create_context\r
189 *\r
190 * DESCRIPTION\r
191 *       Creates a context structure for a reported PnP event.\r
192 *\r
193 * SYNOPSIS\r
194 */\r
195 al_pnp_context_t*\r
196 pnp_create_context(\r
197         IN                              al_pnp_t* const                         p_reg,\r
198         IN              const   net64_t                                         guid );\r
199 /******/\r
200 \r
201 al_pnp_context_t*\r
202 pnp_get_context(\r
203         IN              const   al_pnp_t* const                         p_reg,\r
204         IN              const   ib_net64_t                                      guid );\r
205 \r
206 void\r
207 pnp_reg_complete(\r
208         IN                              al_pnp_t* const                         p_reg );\r
209 \r
210 ib_api_status_t\r
211 al_reg_pnp(\r
212         IN              const   ib_al_handle_t                          h_al,\r
213         IN              const   ib_pnp_req_t* const                     p_pnp_req,\r
214         IN                              KEVENT                                          *p_sync_event,\r
215                 OUT                     ib_pnp_handle_t* const          ph_pnp );\r
216 \r
217 #endif  /* CL_KERNEL */\r
218 \r
219 static inline ib_pnp_class_t\r
220 pnp_get_class(\r
221         IN              const   ib_pnp_class_t                          pnp_class )\r
222 {\r
223         return pnp_class & IB_PNP_CLASS_MASK;\r
224 }\r
225 \r
226 static inline ib_pnp_class_t\r
227 pnp_get_flag(\r
228         IN              const   ib_pnp_class_t                          pnp_class )\r
229 {\r
230         return pnp_class & IB_PNP_FLAG_MASK;\r
231 }\r
232 \r
233 #endif  /* __AL_PNP_H__ */\r