[HCA] Fix copy of CA attributes to properly update internal pointers.
[mirror/winof/.git] / hw / mt23108 / user / mlnx_ual_ca.c
1 /*\r
2  * Copyright (c) 2005 SilverStorm Technologies.  All rights reserved.\r
3  * Copyright (c) 2004-2005 Mellanox Technologies, Inc. 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 #include "mlnx_ual_main.h"\r
34 //#include "hca_dev.h"\r
35 \r
36 extern u_int32_t        mlnx_dbg_lvl;\r
37 \r
38 void\r
39 mlnx_get_ca_interface (\r
40     IN OUT      uvp_interface_t         *p_uvp )\r
41 {\r
42     CL_ASSERT(p_uvp);\r
43 \r
44     /*\r
45      * HCA Access Verbs\r
46      */\r
47     p_uvp->pre_open_ca  = mlnx_pre_open_ca;\r
48     p_uvp->post_open_ca = mlnx_post_open_ca;\r
49 \r
50   \r
51     p_uvp->pre_query_ca  = mlnx_pre_query_ca;\r
52     p_uvp->post_query_ca = mlnx_post_query_ca;\r
53 \r
54     p_uvp->pre_modify_ca  = NULL;\r
55     p_uvp->post_modify_ca = NULL;\r
56 \r
57     p_uvp->pre_close_ca  = mlnx_pre_close_ca;\r
58     p_uvp->post_close_ca = mlnx_post_close_ca;\r
59 \r
60 }\r
61 \r
62 \r
63 \r
64 ib_api_status_t\r
65 mlnx_pre_open_ca (\r
66         IN              const   ib_net64_t                                      ca_guid,\r
67         IN      OUT                     ci_umv_buf_t                            *p_umv_buf )\r
68 {\r
69         FUNC_ENTER;\r
70         if( p_umv_buf )\r
71         {\r
72                 if( !p_umv_buf->p_inout_buf )\r
73                 {\r
74                         p_umv_buf->p_inout_buf = cl_zalloc( sizeof(mlnx_ual_hobul_t) );\r
75                         if( !p_umv_buf->p_inout_buf )\r
76                         {\r
77                                 return IB_INSUFFICIENT_MEMORY;\r
78                         }\r
79                 }\r
80                 p_umv_buf->input_size = p_umv_buf->output_size = sizeof(mlnx_ual_hobul_t);\r
81                 p_umv_buf->command = TRUE;\r
82         }\r
83         FUNC_EXIT;\r
84         return IB_SUCCESS;\r
85 }\r
86 \r
87 \r
88 ib_api_status_t\r
89 mlnx_post_open_ca (\r
90         IN                              const ib_net64_t                        ca_guid,\r
91         IN                              ib_api_status_t                         ioctl_status,\r
92                 OUT                     ib_ca_handle_t                          *ph_uvp_ca,\r
93         IN                              ci_umv_buf_t                            *p_umv_buf )\r
94 {\r
95         ib_api_status_t  status = ioctl_status;\r
96         mlnx_ual_hobul_t *new_ca = (mlnx_ual_hobul_t *)p_umv_buf->p_inout_buf;\r
97 \r
98         FUNC_ENTER;\r
99 \r
100         if (IB_SUCCESS == status)\r
101         {\r
102                 *ph_uvp_ca = (ib_ca_handle_t)new_ca;\r
103 \r
104                 /*\r
105                  * hca_ul_info will be intialized now\r
106                  */\r
107                 new_ca->p_hca_ul_resources = (new_ca->p_hca_ul_info + 1 );\r
108                 new_ca->p_hca_attr = NULL;\r
109 \r
110                 /* Create user layer CA Object */\r
111                 if (HH_OK != \r
112                         THHUL_hob_create(new_ca->p_hca_ul_resources, \r
113                         new_ca->p_hca_ul_info->dev_id,\r
114                         &new_ca->hhul_hca_hndl)) \r
115                 {\r
116                         CL_TRACE (MLNX_TRACE_LVL_1, mlnx_dbg_lvl,\r
117                                 ("Failed to create THHUL_hob object\n"));\r
118                         status = IB_INSUFFICIENT_RESOURCES;\r
119                 }\r
120         }\r
121 \r
122         /* \r
123          * Free resources for ERROR cases\r
124          * Clean-up if required\r
125          */\r
126         if( status != IB_SUCCESS )\r
127                 cl_free( new_ca );\r
128 \r
129         FUNC_EXIT;\r
130         return status;\r
131 }\r
132 \r
133 ib_api_status_t\r
134 mlnx_pre_query_ca (\r
135         IN                              ib_ca_handle_t                          h_uvp_ca,\r
136         IN                              ib_ca_attr_t                            *p_ca_attr,\r
137         IN                              size_t                                          byte_count,\r
138         IN                              ci_umv_buf_t                            *p_umv_buf )\r
139 {\r
140         ib_api_status_t status = IB_SUCCESS;\r
141 \r
142         FUNC_ENTER;\r
143 \r
144         CL_ASSERT(h_uvp_ca);\r
145 \r
146         /* hca_ul_info should be filled up by open_ca() */\r
147         if ( h_uvp_ca->p_hca_ul_info->status != HH_HCA_STATUS_OPENED )\r
148         {\r
149                 CL_TRACE (MLNX_TRACE_LVL_1, mlnx_dbg_lvl,\r
150                         ("Device is not opened\n"));\r
151                 status = IB_INVALID_CA_HANDLE;\r
152                 return status;\r
153         }\r
154         /*\r
155          * First time call query_ca - populate our internal cached attributes\r
156          * so we can access the GID table.  Note that query_ca calls *always*\r
157          * get their attributes from the kernel.\r
158          */\r
159         if ( !h_uvp_ca->p_hca_attr )\r
160         {\r
161                 /*\r
162                  * Assume if user buffer is valid then byte_cnt is valid too \r
163                  * so we can preallocate ca attr buffer for post ioctl data saving\r
164                  *\r
165                  * Note that we squirel the buffer away into the umv_buf and only\r
166                  * set it into the HCA if the query is successful.\r
167                  */\r
168                 if ( p_ca_attr != NULL )\r
169                 {\r
170                         p_umv_buf->p_inout_buf = cl_zalloc(byte_count);\r
171                         if ( !p_umv_buf->p_inout_buf )\r
172                         {\r
173                                 CL_TRACE (MLNX_TRACE_LVL_1, mlnx_dbg_lvl,\r
174                                         ("Failed to alloc new_ca\n"));\r
175                                 status = IB_INSUFFICIENT_RESOURCES;\r
176                                 return status;\r
177                         }\r
178                 }\r
179                 p_umv_buf->input_size = p_umv_buf->output_size = 0;\r
180         }\r
181 \r
182         FUNC_EXIT;\r
183         return status;\r
184 }\r
185 \r
186 \r
187 void\r
188 mlnx_post_query_ca (\r
189         IN                              ib_ca_handle_t                          h_uvp_ca,\r
190         IN                              ib_api_status_t                         ioctl_status,\r
191         IN                              ib_ca_attr_t                            *p_ca_attr,\r
192         IN                              size_t                                          byte_count,\r
193         IN                              ci_umv_buf_t                            *p_umv_buf )\r
194 {\r
195         FUNC_ENTER;\r
196 \r
197         CL_ASSERT(h_uvp_ca);\r
198         CL_ASSERT(p_umv_buf);\r
199 \r
200         if ( ioctl_status == IB_SUCCESS && p_ca_attr &&\r
201                 byte_count && !h_uvp_ca->p_hca_attr )\r
202         {\r
203                 CL_ASSERT( byte_count >= p_ca_attr->size );\r
204                 h_uvp_ca->p_hca_attr = p_umv_buf->p_inout_buf;\r
205                 ib_copy_ca_attr( h_uvp_ca->p_hca_attr, p_ca_attr );\r
206         }\r
207         else if (p_umv_buf->p_inout_buf) \r
208         {\r
209                 cl_free (p_umv_buf->p_inout_buf);\r
210         }\r
211 \r
212         FUNC_EXIT;\r
213         return;\r
214 }\r
215 \r
216 \r
217 ib_api_status_t\r
218 mlnx_pre_modify_ca (\r
219     IN          ib_ca_handle_t                          h_uvp_ca,\r
220     IN          uint8_t                                         port_num,\r
221     IN          ib_ca_mod_t                                     ca_mod,\r
222     IN          const ib_port_attr_mod_t*       p_port_attr_mod)\r
223 {\r
224     FUNC_ENTER;\r
225     FUNC_EXIT;\r
226     return IB_SUCCESS;\r
227 }\r
228 \r
229 \r
230 void\r
231 mlnx_post_modify_ca (\r
232     IN          ib_ca_handle_t                  h_uvp_ca,\r
233     IN          ib_api_status_t                 ioctl_status)\r
234 {\r
235     FUNC_ENTER;\r
236     FUNC_EXIT;\r
237     return;\r
238 }\r
239 \r
240 \r
241 ib_api_status_t\r
242 mlnx_pre_close_ca (\r
243     IN          ib_ca_handle_t          h_uvp_ca)\r
244 {\r
245     FUNC_ENTER;\r
246     FUNC_EXIT;\r
247     return IB_SUCCESS;\r
248 }\r
249 \r
250 \r
251 ib_api_status_t\r
252 mlnx_post_close_ca (\r
253     IN          ib_ca_handle_t          h_uvp_ca,\r
254     IN          ib_api_status_t         ioctl_status )\r
255 {\r
256     mlnx_ual_hobul_t *p_hobul = (mlnx_ual_hobul_t *)((void*)h_uvp_ca);\r
257 \r
258     FUNC_ENTER;\r
259 \r
260     CL_ASSERT(p_hobul);\r
261 \r
262     if (p_hobul->hhul_hca_hndl)\r
263     {\r
264         if (HH_OK != THHUL_hob_destroy (p_hobul->hhul_hca_hndl))\r
265         {\r
266             CL_TRACE (MLNX_TRACE_LVL_1, mlnx_dbg_lvl,\r
267                 ("Failed to destroy THHUL_hob object\n"));\r
268             return IB_SUCCESS;\r
269         }\r
270     }\r
271 \r
272     if (p_hobul->p_hca_attr)\r
273     {\r
274         cl_free( p_hobul->p_hca_attr);\r
275         p_hobul->p_hca_attr = NULL;\r
276     }\r
277     cl_free(p_hobul);\r
278     \r
279     FUNC_EXIT;\r
280     return IB_SUCCESS;\r
281 }\r
282 \r