072e72f6cf9c0607801577739787417784651b15
[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                 h_uvp_ca->p_hca_attr = p_umv_buf->p_inout_buf;\r
204                 cl_memcpy(h_uvp_ca->p_hca_attr, p_ca_attr, byte_count);\r
205         }\r
206         else if (p_umv_buf->p_inout_buf) \r
207         {\r
208                 cl_free (p_umv_buf->p_inout_buf);\r
209         }\r
210 \r
211         FUNC_EXIT;\r
212         return;\r
213 }\r
214 \r
215 \r
216 ib_api_status_t\r
217 mlnx_pre_modify_ca (\r
218     IN          ib_ca_handle_t                          h_uvp_ca,\r
219     IN          uint8_t                                         port_num,\r
220     IN          ib_ca_mod_t                                     ca_mod,\r
221     IN          const ib_port_attr_mod_t*       p_port_attr_mod)\r
222 {\r
223     FUNC_ENTER;\r
224     FUNC_EXIT;\r
225     return IB_SUCCESS;\r
226 }\r
227 \r
228 \r
229 void\r
230 mlnx_post_modify_ca (\r
231     IN          ib_ca_handle_t                  h_uvp_ca,\r
232     IN          ib_api_status_t                 ioctl_status)\r
233 {\r
234     FUNC_ENTER;\r
235     FUNC_EXIT;\r
236     return;\r
237 }\r
238 \r
239 \r
240 ib_api_status_t\r
241 mlnx_pre_close_ca (\r
242     IN          ib_ca_handle_t          h_uvp_ca)\r
243 {\r
244     FUNC_ENTER;\r
245     FUNC_EXIT;\r
246     return IB_SUCCESS;\r
247 }\r
248 \r
249 \r
250 ib_api_status_t\r
251 mlnx_post_close_ca (\r
252     IN          ib_ca_handle_t          h_uvp_ca,\r
253     IN          ib_api_status_t         ioctl_status )\r
254 {\r
255     mlnx_ual_hobul_t *p_hobul = (mlnx_ual_hobul_t *)((void*)h_uvp_ca);\r
256 \r
257     FUNC_ENTER;\r
258 \r
259     CL_ASSERT(p_hobul);\r
260 \r
261     if (p_hobul->hhul_hca_hndl)\r
262     {\r
263         if (HH_OK != THHUL_hob_destroy (p_hobul->hhul_hca_hndl))\r
264         {\r
265             CL_TRACE (MLNX_TRACE_LVL_1, mlnx_dbg_lvl,\r
266                 ("Failed to destroy THHUL_hob object\n"));\r
267             return IB_SUCCESS;\r
268         }\r
269     }\r
270 \r
271     if (p_hobul->p_hca_attr)\r
272     {\r
273         cl_free( p_hobul->p_hca_attr);\r
274         p_hobul->p_hca_attr = NULL;\r
275     }\r
276     cl_free(p_hobul);\r
277     \r
278     FUNC_EXIT;\r
279     return IB_SUCCESS;\r
280 }\r
281 \r