a30b34b02f39d42f05ae65c064ad27808835c445
[mirror/winof/.git] / hw / mthca / user / mlnx_ual_pd.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 \r
35 #include "mt_l2w.h"\r
36 #include "mlnx_ual_main.h"\r
37 #include "mlnx_uvp.h"\r
38 #include "mx_abi.h"\r
39 \r
40 #if defined(EVENT_TRACING)\r
41 #include "mlnx_ual_pd.tmh"\r
42 #endif\r
43 \r
44 static ib_api_status_t\r
45 __pre_allocate_pd (\r
46         IN              const ib_ca_handle_t    h_uvp_ca,\r
47         IN OUT  ci_umv_buf_t                    *p_umv_buf,\r
48             OUT ib_pd_handle_t                  *ph_uvp_pd)\r
49 {\r
50         ib_api_status_t status = IB_SUCCESS;\r
51 \r
52         UNREFERENCED_PARAMETER(ph_uvp_pd);\r
53         \r
54         UVP_ENTER(UVP_DBG_SHIM);\r
55 \r
56         CL_ASSERT(p_umv_buf);\r
57 \r
58         if( !p_umv_buf->p_inout_buf )\r
59         {\r
60                 p_umv_buf->p_inout_buf = cl_zalloc( sizeof(struct ibv_alloc_pd_resp) );\r
61                 if( !p_umv_buf->p_inout_buf )\r
62                 {\r
63                         status = IB_INSUFFICIENT_MEMORY;\r
64                         goto err_memory;\r
65                 }\r
66         }\r
67         p_umv_buf->input_size = p_umv_buf->output_size = sizeof(struct ibv_alloc_pd_resp);\r
68         p_umv_buf->command = TRUE;\r
69         \r
70 err_memory:\r
71                 UVP_EXIT(UVP_DBG_SHIM);\r
72                 return status;\r
73 }\r
74 \r
75 \r
76 static void\r
77 __post_allocate_pd (\r
78         IN                              ib_ca_handle_t                          h_uvp_ca,\r
79         IN                              ib_api_status_t                         ioctl_status,\r
80         IN      OUT                     ib_pd_handle_t                          *ph_uvp_pd,\r
81         IN                              ci_umv_buf_t                            *p_umv_buf )\r
82 {\r
83         int err;\r
84         ib_api_status_t status = IB_SUCCESS;\r
85         struct ibv_alloc_pd_resp *p_resp;\r
86         struct ibv_pd *ibv_pd;\r
87         mlnx_ual_hobul_t *p_hobul = (mlnx_ual_hobul_t *)((void *)h_uvp_ca);\r
88         mlnx_ual_pd_info_t *p_new_pd;\r
89 \r
90         UVP_ENTER(UVP_DBG_SHIM);\r
91 \r
92         CL_ASSERT(p_hobul);\r
93         CL_ASSERT(p_umv_buf);\r
94         p_resp = (struct ibv_alloc_pd_resp *)p_umv_buf->p_inout_buf;\r
95 \r
96         if (IB_SUCCESS == ioctl_status) {\r
97 \r
98                 /* allocate ibv_pd */\r
99                 ibv_pd = p_hobul->ibv_ctx->ops.alloc_pd(p_hobul->ibv_ctx, p_resp);\r
100                 if (IS_ERR(ibv_pd)) {\r
101                         err = PTR_ERR(ibv_pd);\r
102                         UVP_PRINT(TRACE_LEVEL_ERROR ,UVP_DBG_SHIM , ("mthca_alloc_pd failed (%d)\n", err));\r
103                         status = errno_to_iberr(err);\r
104                         goto err_alloc_pd;\r
105                 }\r
106 \r
107                 /* allocate pd */\r
108                 p_new_pd = (mlnx_ual_pd_info_t *)cl_zalloc( sizeof(mlnx_ual_pd_info_t) );\r
109                 if( !p_new_pd ) {\r
110                         status = IB_INSUFFICIENT_MEMORY;\r
111                         goto err_memory;\r
112                 }\r
113 \r
114                 /* return results */\r
115                 p_new_pd->ibv_pd = ibv_pd;\r
116                 p_new_pd->p_hobul = p_hobul;\r
117                 *ph_uvp_pd = (ib_pd_handle_t)p_new_pd;\r
118         }\r
119         goto end;\r
120         \r
121 err_memory: \r
122         p_hobul->ibv_ctx->ops.dealloc_pd(ibv_pd);\r
123 err_alloc_pd:\r
124 end:    \r
125         if (p_resp)\r
126                 cl_free( p_resp );\r
127         UVP_EXIT(UVP_DBG_SHIM);\r
128         return;\r
129 }\r
130 \r
131 \r
132 static ib_api_status_t\r
133 __pre_deallocate_pd (\r
134         IN              const ib_pd_handle_t            h_uvp_pd)\r
135 {\r
136         mlnx_ual_pd_info_t *p_pd_info = (mlnx_ual_pd_info_t *)((void *)h_uvp_pd);\r
137         UVP_ENTER(UVP_DBG_SHIM);\r
138         CL_ASSERT(p_pd_info);\r
139         UVP_EXIT(UVP_DBG_SHIM);\r
140         return IB_SUCCESS;\r
141 }\r
142 \r
143 \r
144 static void\r
145 __post_deallocate_pd (\r
146         IN              const ib_pd_handle_t    h_uvp_pd,\r
147         IN              ib_api_status_t                 ioctl_status )\r
148 {\r
149         int err;\r
150         mlnx_ual_pd_info_t *p_pd_info = (mlnx_ual_pd_info_t *)((void *)h_uvp_pd);\r
151 \r
152         UVP_ENTER(UVP_DBG_SHIM);\r
153 \r
154         CL_ASSERT(p_pd_info || p_pd_info->ibv_pd);\r
155 \r
156         if (IB_SUCCESS == ioctl_status) {\r
157                 err = p_pd_info->p_hobul->ibv_ctx->ops.dealloc_pd( p_pd_info->ibv_pd );\r
158                 if (err) \r
159                         UVP_PRINT(TRACE_LEVEL_ERROR ,UVP_DBG_SHIM , ("mthca_alloc_pd failed (%d)\n", err));\r
160 \r
161                 cl_free (p_pd_info);\r
162         }\r
163         UVP_EXIT(UVP_DBG_SHIM);\r
164 }\r
165 \r
166 void\r
167 mlnx_get_pd_interface (\r
168         IN OUT  uvp_interface_t         *p_uvp )\r
169 {\r
170         UVP_ENTER(UVP_DBG_SHIM);\r
171 \r
172         CL_ASSERT(p_uvp);\r
173 \r
174         /*\r
175          * Protection Domain\r
176          */\r
177         p_uvp->pre_allocate_pd    = __pre_allocate_pd;\r
178         p_uvp->post_allocate_pd   = __post_allocate_pd;\r
179         p_uvp->pre_deallocate_pd  = __pre_deallocate_pd;\r
180         p_uvp->post_deallocate_pd = __post_deallocate_pd;\r
181 \r
182         UVP_EXIT(UVP_DBG_SHIM);\r
183 }\r
184 \r
185 \r