[IBAL, HW] Remove pointers from ci_umv_buf_t.
[mirror/winof/.git] / hw / mthca / user / mlnx_ual_cq.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  * Portions Copyright (c) 2008 Microsoft Corporation.  All rights reserved.\r
5  *\r
6  * This software is available to you under the OpenIB.org BSD license\r
7  * below:\r
8  *\r
9  *     Redistribution and use in source and binary forms, with or\r
10  *     without modification, are permitted provided that the following\r
11  *     conditions are met:\r
12  *\r
13  *      - Redistributions of source code must retain the above\r
14  *        copyright notice, this list of conditions and the following\r
15  *        disclaimer.\r
16  *\r
17  *      - Redistributions in binary form must reproduce the above\r
18  *        copyright notice, this list of conditions and the following\r
19  *        disclaimer in the documentation and/or other materials\r
20  *        provided with the distribution.\r
21  *\r
22  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
23  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
24  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
25  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\r
26  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\r
27  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
28  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r
29  * SOFTWARE.\r
30  *\r
31  * $Id$\r
32  */\r
33 \r
34 #include "mt_l2w.h"\r
35 #include "mlnx_ual_main.h"\r
36 #include "mlnx_uvp.h"\r
37 #include "mx_abi.h"\r
38 \r
39 #if defined(EVENT_TRACING)\r
40 #include "mlnx_ual_cq.tmh"\r
41 #endif\r
42 \r
43 \r
44 extern uint32_t mlnx_dbg_lvl;\r
45 \r
46 static ib_api_status_t\r
47 __pre_create_cq (\r
48                 IN              const ib_ca_handle_t                            h_uvp_ca,\r
49                 IN      OUT             uint32_t*                       const           p_size,\r
50                 IN      OUT             ci_umv_buf_t                            *p_umv_buf,\r
51                         OUT                     ib_cq_handle_t                          *ph_uvp_cq)\r
52 {\r
53         struct ibv_cq *ibv_cq;\r
54         ib_api_status_t status = IB_SUCCESS;\r
55         size_t size = max( sizeof(struct ibv_create_cq), sizeof(struct ibv_create_cq_resp) );\r
56         mlnx_ual_hobul_t *p_hobul = (mlnx_ual_hobul_t *)((void *)h_uvp_ca);\r
57         struct ibv_create_cq *p_create_cq;\r
58         int err;\r
59 \r
60         UNREFERENCED_PARAMETER(ph_uvp_cq);\r
61 \r
62         UVP_ENTER(UVP_DBG_CQ);\r
63 \r
64         CL_ASSERT(p_umv_buf);\r
65 \r
66         if( !p_umv_buf->p_inout_buf )\r
67         {\r
68                 p_umv_buf->p_inout_buf = (ULONG_PTR)cl_zalloc( size );\r
69                 if( !p_umv_buf->p_inout_buf )\r
70                 {\r
71                         status = IB_INSUFFICIENT_MEMORY;\r
72                         goto err_memory;\r
73                 }\r
74         }\r
75         p_umv_buf->input_size = sizeof(struct ibv_create_cq);\r
76         p_umv_buf->output_size = sizeof(struct ibv_create_cq_resp);\r
77         p_umv_buf->command = TRUE;\r
78 \r
79         /* allocate ibv_cq */\r
80         p_create_cq = (struct ibv_create_cq *)p_umv_buf->p_inout_buf;\r
81         ibv_cq = p_hobul->ibv_ctx->ops.create_cq_pre(p_hobul->ibv_ctx, p_size, p_create_cq);\r
82         if (IS_ERR(ibv_cq)) {\r
83                 err = PTR_ERR(ibv_cq);\r
84                 UVP_PRINT(TRACE_LEVEL_ERROR ,UVP_DBG_CQ , ("mthca_alloc_cq_pre failed (%d)\n", err));\r
85                 status = (err == -ENOMEM) ? IB_INVALID_CQ_SIZE : errno_to_iberr(err);\r
86                 goto err_alloc_cq;\r
87         }\r
88 \r
89         goto end;\r
90                 \r
91 err_alloc_cq:\r
92         cl_free((void*)(ULONG_PTR)p_umv_buf->p_inout_buf);\r
93 err_memory:\r
94 end:\r
95         UVP_EXIT(UVP_DBG_CQ);\r
96         return status;\r
97 }\r
98 \r
99 \r
100 static void\r
101 __post_create_cq (\r
102         IN              const   ib_ca_handle_t                          h_uvp_ca,\r
103         IN                              ib_api_status_t                         ioctl_status,\r
104         IN              const   uint32_t                                        size,\r
105         IN      OUT                     ib_cq_handle_t                          *ph_uvp_cq,\r
106         IN                              ci_umv_buf_t                            *p_umv_buf )\r
107 {\r
108         int err;\r
109         ib_api_status_t status = IB_SUCCESS;\r
110         struct ibv_create_cq_resp *p_resp;\r
111         struct ibv_cq *ibv_cq;\r
112         mlnx_ual_hobul_t *p_hobul = (mlnx_ual_hobul_t *)((void *)h_uvp_ca);\r
113 \r
114 \r
115         UVP_ENTER(UVP_DBG_CQ);\r
116 \r
117         CL_ASSERT(p_hobul);\r
118         CL_ASSERT(p_umv_buf);\r
119         p_resp = (struct ibv_create_cq_resp *)p_umv_buf->p_inout_buf;\r
120 \r
121         if (IB_SUCCESS == ioctl_status) {\r
122 \r
123                 /* allocate ibv_cq */\r
124                 ibv_cq = p_hobul->ibv_ctx->ops.create_cq_post(p_hobul->ibv_ctx, p_resp);\r
125                 if (IS_ERR(ibv_cq)) {\r
126                         err = PTR_ERR(ibv_cq);\r
127                         UVP_PRINT(TRACE_LEVEL_ERROR ,UVP_DBG_CQ , ("mthca_create_cq failed (%d)\n", err));\r
128                         status = errno_to_iberr(err);\r
129                         goto err_create_cq;\r
130                 }\r
131 \r
132                 *ph_uvp_cq = (ib_cq_handle_t)ibv_cq;\r
133         }\r
134         goto end;\r
135 \r
136         p_hobul->ibv_ctx->ops.destroy_cq(ibv_cq);\r
137 err_create_cq:\r
138 end:    \r
139         if (p_resp)\r
140                 cl_free( p_resp );\r
141         UVP_EXIT(UVP_DBG_CQ);\r
142         return;\r
143 }\r
144 \r
145 \r
146 static ib_api_status_t\r
147 __pre_query_cq (\r
148         IN              const   ib_cq_handle_t          h_uvp_cq,\r
149                 OUT                     uint32_t* const         p_size,\r
150         IN      OUT                     ci_umv_buf_t            *p_umv_buf)\r
151 {\r
152         struct ibv_cq *ibv_cq = (struct ibv_cq *)h_uvp_cq;\r
153 \r
154         UVP_ENTER(UVP_DBG_CQ);\r
155 \r
156         *p_size = ibv_cq->cqe;\r
157 \r
158         UVP_EXIT(UVP_DBG_CQ);\r
159         return IB_VERBS_PROCESSING_DONE;\r
160 }\r
161 \r
162 \r
163 static ib_api_status_t\r
164 __pre_destroy_cq (\r
165         IN              const ib_cq_handle_t                    h_uvp_cq)\r
166 {\r
167         UVP_ENTER(UVP_DBG_CQ);\r
168         UVP_EXIT(UVP_DBG_CQ);\r
169         return IB_SUCCESS;\r
170 }\r
171 \r
172 static void\r
173 __post_destroy_cq (\r
174         IN              const ib_cq_handle_t    h_uvp_cq,\r
175         IN              ib_api_status_t                 ioctl_status)\r
176 {\r
177         int err;\r
178         struct ibv_cq *ibv_cq = (struct ibv_cq *)h_uvp_cq;\r
179         UNREFERENCED_PARAMETER(ioctl_status);\r
180 \r
181         UVP_ENTER(UVP_DBG_CQ);\r
182 \r
183         CL_ASSERT(ibv_cq);\r
184 \r
185         if (IB_SUCCESS == ioctl_status) {\r
186                 err = ibv_cq->context->ops.destroy_cq( ibv_cq );\r
187                 if (err) \r
188                         UVP_PRINT(TRACE_LEVEL_ERROR ,UVP_DBG_CQ, ("mthca_destroy_cq failed (%d)\n", err));\r
189                 //cl_free (p_cq_info);\r
190         }\r
191 \r
192         UVP_EXIT(UVP_DBG_CQ);\r
193 }\r
194 \r
195 void\r
196 mlnx_get_cq_interface (\r
197         IN OUT  uvp_interface_t         *p_uvp )\r
198 {\r
199         UVP_ENTER(UVP_DBG_DEV);\r
200 \r
201         CL_ASSERT(p_uvp);\r
202 \r
203         /*\r
204          * Completion Queue Management Verbs\r
205          */\r
206         p_uvp->pre_create_cq  = __pre_create_cq;\r
207         p_uvp->post_create_cq = __post_create_cq;\r
208 \r
209         p_uvp->pre_query_cq  = __pre_query_cq;\r
210         p_uvp->post_query_cq = NULL;\r
211 \r
212         p_uvp->pre_resize_cq  = NULL; /* __pre_resize_cq: not supported in kernel */\r
213         p_uvp->post_resize_cq = NULL;   /* __post_resize_cq:not supported in kernel */ \r
214 \r
215         p_uvp->pre_destroy_cq  = __pre_destroy_cq;\r
216         p_uvp->post_destroy_cq = __post_destroy_cq;\r
217 \r
218         UVP_EXIT(UVP_DBG_DEV);\r
219 }\r
220 \r
221 \r