2 * Copyright (c) 2005 SilverStorm Technologies. All rights reserved.
\r
3 * Copyright (c) 1996-2003 Intel Corporation. All rights reserved.
\r
5 * This software is available to you under the OpenIB.org BSD license
\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
12 * - Redistributions of source code must retain the above
\r
13 * copyright notice, this list of conditions and the following
\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
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
33 #if !defined(__AL_VERBS_H__)
\r
34 #define __AL_VERBS_H__
\r
42 #include "ual_mad.h"
\r
44 #include "ual_mcast.h"
\r
49 /* Macros for kernel-mode only */
\r
50 #define verbs_create_av(h_pd, p_av_attr, h_av) \
\r
51 h_av->obj.p_ci_ca->verbs.create_av( h_pd->h_ci_pd,\
\r
52 p_av_attr, &h_av->h_ci_av, p_umv_buf )
\r
54 #define verbs_check_av(h_av) ((h_av)->h_ci_av)
\r
55 #define convert_av_handle(h_qp, h_av) ((h_av)->h_ci_av)
\r
56 #define verbs_destroy_av(h_av) \
\r
57 h_av->obj.p_ci_ca->verbs.destroy_av( h_av->h_ci_av )
\r
59 #define verbs_query_av(h_av, p_av_attr, ph_pd) \
\r
60 h_av->obj.p_ci_ca->verbs.query_av( h_av->h_ci_av,\
\r
61 p_av_attr, ph_pd, p_umv_buf )
\r
63 #define verbs_modify_av(h_av, p_av_mod) \
\r
64 h_av->obj.p_ci_ca->verbs.modify_av( h_av->h_ci_av, p_av_mod, p_umv_buf )
\r
66 #define verbs_query_ca(h_ca, p_ca_attr, p_size) \
\r
67 h_ca->obj.p_ci_ca->verbs.query_ca( h_ca->obj.p_ci_ca->h_ci_ca,\
\r
68 p_ca_attr, p_size, p_umv_buf )
\r
70 #define verbs_modify_ca(h_ca, port_num, ca_mod, p_port_attr_mod) \
\r
71 h_ca->obj.p_ci_ca->verbs.modify_ca( h_ca->obj.p_ci_ca->h_ci_ca,\
\r
72 port_num, ca_mod, p_port_attr_mod )
\r
74 static inline ib_api_status_t
\r
76 IN const ib_ca_handle_t h_ca,
\r
77 IN OUT ib_cq_create_t* const p_cq_create,
\r
78 IN ib_cq_handle_t h_cq,
\r
79 IN OUT ci_umv_buf_t* const p_umv_buf )
\r
81 return h_ca->obj.p_ci_ca->verbs.create_cq(
\r
82 (p_umv_buf) ? h_ca->h_um_ca : h_ca->obj.p_ci_ca->h_ci_ca,
\r
83 h_cq, &p_cq_create->size, &h_cq->h_ci_cq, p_umv_buf );
\r
86 #define verbs_check_cq(h_cq) ((h_cq)->h_ci_cq)
\r
87 #define verbs_destroy_cq(h_cq) \
\r
88 h_cq->obj.p_ci_ca->verbs.destroy_cq( h_cq->h_ci_cq )
\r
90 #define verbs_modify_cq(h_cq, p_size) \
\r
91 h_cq->obj.p_ci_ca->verbs.resize_cq( h_cq->h_ci_cq, p_size, p_umv_buf )
\r
93 #define verbs_query_cq(h_cq, p_size) \
\r
94 h_cq->obj.p_ci_ca->verbs.query_cq( h_cq->h_ci_cq, p_size, p_umv_buf )
\r
96 #define verbs_peek_cq(h_cq, p_n_cqes) \
\r
97 ( ( h_cq->obj.p_ci_ca->verbs.peek_cq ) ? \
\r
98 h_cq->obj.p_ci_ca->verbs.peek_cq( h_cq->h_ci_cq, p_n_cqes) : \
\r
101 #define verbs_poll_cq(h_cq, pp_free_wclist, pp_done_wclist) \
\r
102 h_cq->obj.p_ci_ca->verbs.poll_cq( h_cq->h_ci_cq,\
\r
103 pp_free_wclist, pp_done_wclist )
\r
105 #define verbs_rearm_cq(h_cq, solicited) \
\r
106 h_cq->obj.p_ci_ca->verbs.enable_cq_notify( h_cq->h_ci_cq,\
\r
109 #define verbs_rearm_n_cq(h_cq, n_cqes) \
\r
110 ( ( h_cq->obj.p_ci_ca->verbs.enable_ncomp_cq_notify ) ? \
\r
111 h_cq->obj.p_ci_ca->verbs.enable_ncomp_cq_notify(h_cq->h_ci_cq,n_cqes): \
\r
114 #define verbs_register_mr(h_pd, p_mr_create, p_lkey, p_rkey, h_mr) \
\r
115 h_mr->obj.p_ci_ca->verbs.register_mr( h_pd->h_ci_pd,\
\r
116 p_mr_create, p_lkey, p_rkey, &h_mr->h_ci_mr, um_call )
\r
118 #define verbs_register_pmr(h_pd, p_phys_create, p_vaddr,\
\r
119 p_lkey, p_rkey, h_mr) \
\r
120 h_mr->obj.p_ci_ca->verbs.register_pmr( h_pd->h_ci_pd,\
\r
121 p_phys_create, p_vaddr, p_lkey, p_rkey, &h_mr->h_ci_mr, FALSE )
\r
123 #define verbs_check_mr(h_mr) ((h_mr)->h_ci_mr)
\r
124 #define verbs_check_mlnx_fmr(h_fmr) ((h_fmr)->h_ci_fmr)
\r
125 #define verbs_deregister_mr(h_mr) \
\r
126 h_mr->obj.p_ci_ca->verbs.deregister_mr( h_mr->h_ci_mr )
\r
129 * Remove this registration from the shmid's list to prevent any
\r
130 * new registrations from accessing it once it is deregistered.
\r
132 #define verbs_release_shmid(h_mr) \
\r
133 if( h_mr->p_shmid ) \
\r
135 cl_spinlock_acquire( &h_mr->p_shmid->obj.lock ); \
\r
136 cl_list_remove_object( &h_mr->p_shmid->mr_list, h_mr ); \
\r
137 cl_spinlock_release( &h_mr->p_shmid->obj.lock ); \
\r
138 release_shmid( h_mr->p_shmid ); \
\r
139 h_mr->p_shmid = NULL; \
\r
141 #define verbs_query_mr(h_mr, p_mr_attr) \
\r
142 h_mr->obj.p_ci_ca->verbs.query_mr( h_mr->h_ci_mr, p_mr_attr )
\r
144 #define verbs_modify_mr(h_mr, mr_modify_mask, p_mr_create, \
\r
145 p_lkey, p_rkey, h_pd ) \
\r
146 h_mr->obj.p_ci_ca->verbs.modify_mr( h_mr->h_ci_mr, mr_modify_mask, \
\r
147 p_mr_create, p_lkey, p_rkey, h_pd ? h_pd->h_ci_pd : NULL, \
\r
150 #define verbs_modify_pmr(h_mr, mr_modify_mask, p_pmr_create, \
\r
151 p_vaddr, p_lkey, p_rkey, h_pd ) \
\r
152 h_mr->obj.p_ci_ca->verbs.modify_pmr( h_mr->h_ci_mr, mr_modify_mask, \
\r
153 p_pmr_create, p_vaddr, p_lkey, p_rkey, \
\r
154 h_pd ? h_pd->h_ci_pd : NULL, FALSE )
\r
156 #define verbs_register_smr(h_mr, h_pd, access_ctrl, p_vaddr, p_lkey, \
\r
158 h_mr->obj.p_ci_ca->verbs.register_smr( h_mr->h_ci_mr, h_pd->h_ci_pd,\
\r
159 access_ctrl, p_vaddr, p_lkey, p_rkey, &(ph_mr->h_ci_mr), \
\r
162 #define verbs_create_mlnx_fmr(h_pd, p_fmr_create, h_fmr ) \
\r
163 h_fmr->obj.p_ci_ca->verbs.alloc_mlnx_fmr( h_pd->h_ci_pd,\
\r
164 p_fmr_create, &h_fmr->h_ci_fmr )
\r
166 #define verbs_map_phys_mlnx_fmr( h_fmr, plist_addr, list_len, p_vaddr, p_lkey, p_rkey) \
\r
167 h_fmr->obj.p_ci_ca->verbs.map_phys_mlnx_fmr( h_fmr->h_ci_fmr,\
\r
168 plist_addr, list_len, p_vaddr, p_lkey, p_rkey )
\r
170 #define verbs_unmap_mlnx_fmr( h_fmr ) \
\r
171 h_fmr->obj.p_ci_ca->verbs.unmap_mlnx_fmr( h_fmr->h_ci_fmr)
\r
173 #define verbs_destroy_mlnx_fmr( h_fmr ) \
\r
174 h_fmr->obj.p_ci_ca->verbs.dealloc_mlnx_fmr( h_fmr->h_ci_fmr )
\r
177 #define verbs_create_mw(h_pd, p_rkey, h_mw) \
\r
178 h_mw->obj.p_ci_ca->verbs.create_mw( h_pd->h_ci_pd,\
\r
179 p_rkey, &h_mw->h_ci_mw, p_umv_buf )
\r
181 #define verbs_check_mw(h_mw) ((h_mw)->h_ci_mw)
\r
182 #define verbs_destroy_mw(h_mw) \
\r
183 h_mw->obj.p_ci_ca->verbs.destroy_mw( h_mw->h_ci_mw )
\r
185 #define verbs_query_mw(h_mw, ph_pd, p_rkey) \
\r
186 h_mw->obj.p_ci_ca->verbs.query_mw(\
\r
187 h_mw->h_ci_mw, ph_pd, p_rkey, p_umv_buf )
\r
189 #define convert_mr_handle(h_mr) ((h_mr)->h_ci_mr)
\r
191 #define verbs_bind_mw(h_mw, h_qp, p_mw_bind, p_rkey) \
\r
192 h_qp->obj.p_ci_ca->verbs.bind_mw( h_mw->h_ci_mw,\
\r
193 h_qp->h_ci_qp, p_mw_bind, p_rkey )
\r
195 static inline ib_api_status_t
\r
197 IN const ib_ca_handle_t h_ca,
\r
198 IN ib_pd_handle_t h_pd,
\r
199 IN OUT ci_umv_buf_t* const p_umv_buf )
\r
201 return h_ca->obj.p_ci_ca->verbs.allocate_pd(
\r
202 (p_umv_buf) ? h_ca->h_um_ca : h_ca->obj.p_ci_ca->h_ci_ca,
\r
203 h_pd->type, &h_pd->h_ci_pd, p_umv_buf );
\r
207 * Reference the hardware PD.
\r
209 static inline ib_api_status_t
\r
211 IN const ib_ca_handle_t h_ca,
\r
212 IN const ib_pd_handle_t h_pd )
\r
214 UNUSED_PARAM( h_ca );
\r
215 h_pd->h_ci_pd = h_pd->obj.p_ci_ca->h_pd->h_ci_pd;
\r
216 ref_al_obj( &h_pd->obj.p_ci_ca->h_pd->obj );
\r
221 deallocate_pd_alias(
\r
222 IN const ib_pd_handle_t h_pd )
\r
224 deref_al_obj( &h_pd->obj.p_ci_ca->h_pd->obj );
\r
229 #define verbs_check_pd(h_pd) ((h_pd)->h_ci_pd)
\r
230 #define verbs_deallocate_pd(h_pd) \
\r
231 h_pd->obj.p_ci_ca->verbs.deallocate_pd( h_pd->h_ci_pd )
\r
233 #define convert_qp_handle( qp_create ) {\
\r
234 CL_ASSERT( qp_create.h_rq_cq ); \
\r
235 qp_create.h_rq_cq = qp_create.h_rq_cq->h_ci_cq; \
\r
236 CL_ASSERT( qp_create.h_sq_cq ); \
\r
237 qp_create.h_sq_cq = qp_create.h_sq_cq->h_ci_cq; \
\r
241 static inline ib_api_status_t
\r
243 IN ib_pd_handle_t h_pd,
\r
244 IN uint8_t port_num,
\r
245 IN ib_qp_handle_t h_qp,
\r
246 IN ib_qp_create_t *p_qp_create,
\r
247 IN ib_qp_attr_t *p_qp_attr )
\r
249 ib_api_status_t status;
\r
251 status = h_qp->obj.p_ci_ca->verbs.create_spl_qp(
\r
252 h_pd->h_ci_pd, port_num, h_qp, p_qp_create,
\r
253 p_qp_attr, &h_qp->h_ci_qp );
\r
255 h_qp->h_recv_qp = h_qp->h_ci_qp;
\r
256 h_qp->h_send_qp = h_qp->h_ci_qp;
\r
258 h_qp->pfn_post_send = h_qp->obj.p_ci_ca->verbs.post_send;
\r
259 h_qp->pfn_post_recv = h_qp->obj.p_ci_ca->verbs.post_recv;
\r
264 static inline ib_api_status_t
\r
266 IN ib_pd_handle_t h_pd,
\r
267 IN ib_qp_handle_t h_qp,
\r
268 IN ib_qp_create_t *p_qp_create,
\r
269 IN ib_qp_attr_t *p_qp_attr,
\r
270 IN OUT ci_umv_buf_t* const p_umv_buf )
\r
272 ib_api_status_t status;
\r
274 status = h_qp->obj.p_ci_ca->verbs.create_qp(
\r
275 h_pd->h_ci_pd, h_qp, p_qp_create, p_qp_attr,
\r
276 &h_qp->h_ci_qp, p_umv_buf );
\r
278 h_qp->h_recv_qp = h_qp->h_ci_qp;
\r
279 h_qp->h_send_qp = h_qp->h_ci_qp;
\r
281 h_qp->pfn_post_send = h_qp->obj.p_ci_ca->verbs.post_send;
\r
282 h_qp->pfn_post_recv = h_qp->obj.p_ci_ca->verbs.post_recv;
\r
287 #define verbs_check_qp(h_qp) ((h_qp)->h_ci_qp)
\r
288 #define verbs_destroy_qp(h_qp) \
\r
289 h_qp->obj.p_ci_ca->verbs.destroy_qp( h_qp->h_ci_qp, h_qp->timewait )
\r
291 #define verbs_query_qp(h_qp, p_qp_attr) \
\r
292 h_qp->obj.p_ci_ca->verbs.query_qp( h_qp->h_ci_qp,\
\r
293 p_qp_attr, p_umv_buf )
\r
295 #define verbs_modify_qp(h_qp, p_qp_mod, qp_attr) \
\r
296 h_qp->obj.p_ci_ca->verbs.modify_qp( h_qp->h_ci_qp,\
\r
297 p_qp_mod, &qp_attr, p_umv_buf )
\r
299 #define verbs_post_send(h_qp, p_send_wr, pp_send_failure) \
\r
300 h_qp->obj.p_ci_ca->verbs.post_send( h_qp->h_ci_qp,\
\r
301 p_send_wr, pp_send_failure )
\r
303 #define verbs_post_recv(h_qp, p_recv_wr, pp_recv_failure) \
\r
304 h_qp->obj.p_ci_ca->verbs.post_recv( h_qp->h_ci_qp,\
\r
305 p_recv_wr, pp_recv_failure )
\r
307 #define verbs_local_mad(h_ca, port_num, p_src_av_attr, p_mad_in, p_mad_out) \
\r
308 h_ca->obj.p_ci_ca->verbs.local_mad( h_ca->obj.p_ci_ca->h_ci_ca,\
\r
309 port_num, p_src_av_attr, p_mad_in, p_mad_out)
\r
311 #define check_local_mad(h_qp) \
\r
312 (h_qp->obj.p_ci_ca->verbs.local_mad)
\r
314 #define init_alias_qp( h_qp, h_pd, port_guid, p_qp_create ) \
\r
315 init_qp_alias( h_qp, h_pd, port_guid, p_qp_create )
\r
317 #define spl_qp_mad_send( h_mad_svc, p_mad_element_list, pp_mad_failure ) \
\r
320 #define spl_qp_cancel_mad( h_mad_svc, h_mad_send ) \
\r
323 #define create_reg_mad_pool( h_pool, h_pd, p_pool_key ) \
\r
326 #define dereg_destroy_mad_pool( pool_key )
\r
328 #define verbs_attach_mcast(h_mcast) \
\r
329 h_mcast->obj.p_ci_ca->verbs.attach_mcast( \
\r
330 ((ib_qp_handle_t)h_mcast->obj.p_parent_obj)->h_ci_qp, &h_mcast->member_rec.mgid, \
\r
331 h_mcast->member_rec.mlid, &h_mcast->h_ci_mcast, \
\r
334 #define verbs_detach_mcast(h_mcast) \
\r
335 h_mcast->obj.p_ci_ca->verbs.detach_mcast( \
\r
336 h_mcast->h_ci_mcast )
\r
338 static inline ib_api_status_t
\r
340 IN ib_ca_handle_t h_ca,
\r
341 IN const void* __ptr64 * const handle_array OPTIONAL,
\r
342 IN uint32_t num_handles,
\r
343 IN ib_ci_op_t* const p_ci_op,
\r
344 IN ci_umv_buf_t* const p_umv_buf OPTIONAL )
\r
346 return h_ca->obj.p_ci_ca->verbs.vendor_call(
\r
347 p_umv_buf ? h_ca->h_um_ca : h_ca->obj.p_ci_ca->h_ci_ca,
\r
348 handle_array, num_handles, p_ci_op, p_umv_buf );
\r
356 /* Macros for user-mode only */
\r
357 #define verbs_create_av(h_pd, p_av_attr, h_av) \
\r
358 (h_pd->type == IB_PDT_ALIAS) ?\
\r
359 ual_pd_alias_create_av(h_pd, p_av_attr, h_av):\
\r
360 ual_create_av(h_pd, p_av_attr, h_av); \
\r
361 UNUSED_PARAM( p_umv_buf )
\r
363 #define verbs_check_av(h_av) ((h_av)->h_ci_av || (h_av)->obj.hdl)
\r
364 #define convert_av_handle(h_qp, h_av) \
\r
365 ((h_qp)->h_ci_qp?(h_av)->h_ci_av:(ib_av_handle_t)(h_av)->obj.hdl)
\r
366 #define verbs_destroy_av(h_av) \
\r
367 ual_destroy_av(h_av)
\r
369 #define verbs_query_av(h_av, p_av_attr, ph_pd) \
\r
370 ual_query_av(h_av, p_av_attr, ph_pd); \
\r
371 UNUSED_PARAM( p_umv_buf )
\r
373 #define verbs_modify_av(h_av, p_av_mod) \
\r
374 ual_modify_av(h_av, p_av_mod); \
\r
375 UNUSED_PARAM( p_umv_buf )
\r
377 #define verbs_query_ca(h_ca, p_ca_attr, p_size) \
\r
378 ual_query_ca(h_ca, p_ca_attr, p_size); \
\r
379 UNUSED_PARAM( p_umv_buf )
\r
381 #define verbs_modify_ca(h_ca, port_num, ca_mod, p_port_attr_mod) \
\r
382 ual_modify_ca(h_ca, port_num, ca_mod, p_port_attr_mod)
\r
384 static inline ib_api_status_t
\r
386 IN const ib_ca_handle_t h_ca,
\r
387 IN OUT ib_cq_create_t* const p_cq_create,
\r
388 IN ib_cq_handle_t h_cq,
\r
389 IN OUT ci_umv_buf_t* const p_umv_buf )
\r
391 UNUSED_PARAM( p_umv_buf );
\r
392 return ual_create_cq( h_ca->obj.p_ci_ca, p_cq_create, h_cq );
\r
396 #define verbs_check_cq(h_cq) ((h_cq)->h_ci_cq || (h_cq)->obj.hdl)
\r
397 #define verbs_destroy_cq(h_cq) \
\r
398 ual_destroy_cq(h_cq)
\r
400 #define verbs_modify_cq(h_cq, p_size) \
\r
401 ual_modify_cq(h_cq, p_size); \
\r
402 UNUSED_PARAM( p_umv_buf )
\r
404 #define verbs_query_cq(h_cq, p_size) \
\r
405 ual_query_cq(h_cq, p_size); \
\r
406 UNUSED_PARAM( p_umv_buf )
\r
408 #define verbs_peek_cq(h_cq, p_n_cqes) \
\r
409 h_cq->pfn_peek( h_cq->h_peek_cq, p_n_cqes )
\r
411 #define verbs_poll_cq(h_cq, pp_free_wclist, pp_done_wclist) \
\r
412 h_cq->pfn_poll( h_cq->h_poll_cq, pp_free_wclist, pp_done_wclist )
\r
414 #define verbs_rearm_cq(h_cq, solicited) \
\r
415 h_cq->pfn_rearm( h_cq->h_rearm_cq, solicited )
\r
417 #define verbs_rearm_n_cq(h_cq, n_cqes) \
\r
418 h_cq->pfn_rearm_n( h_cq->h_rearm_n_cq, n_cqes )
\r
420 #define verbs_register_mr(h_pd, p_mr_create, p_lkey, p_rkey, h_mr) \
\r
421 ual_reg_mem(h_pd, p_mr_create, p_lkey, p_rkey, h_mr); \
\r
422 UNUSED_PARAM( um_call )
\r
424 #define verbs_register_pmr(h_pd, p_phys_create, p_vaddr, p_lkey, p_rkey, h_mr) \
\r
426 UNUSED_PARAM( h_pd ); \
\r
427 UNUSED_PARAM( p_phys_create ); \
\r
428 UNUSED_PARAM( p_vaddr ); \
\r
429 UNUSED_PARAM( p_lkey ); \
\r
430 UNUSED_PARAM( p_rkey ); \
\r
431 UNUSED_PARAM( h_mr )
\r
433 #define verbs_check_mr(h_mr) ((h_mr)->h_ci_mr || (h_mr)->obj.hdl)
\r
434 #define verbs_deregister_mr(h_mr) \
\r
437 /* For user-mode, this is nop */
\r
438 #define verbs_release_shmid(h_mr)
\r
440 #define verbs_query_mr(h_mr, p_mr_attr) \
\r
441 ual_query_mr(h_mr, p_mr_attr)
\r
443 #define verbs_modify_mr(h_mr, mr_modify_mask, p_mr_create, \
\r
444 p_lkey, p_rkey, h_pd ) \
\r
445 ual_modify_mr( h_mr, mr_modify_mask, p_mr_create, \
\r
446 p_lkey, p_rkey, h_pd ); \
\r
447 UNUSED_PARAM( um_call )
\r
449 #define verbs_modify_pmr( h_mr, mr_mod_mask, p_phys_create, \
\r
450 p_vaddr, p_lkey, p_rkey, h_pd ) \
\r
452 UNUSED_PARAM( h_mr ); \
\r
453 UNUSED_PARAM( mr_mod_mask ); \
\r
454 UNUSED_PARAM( p_phys_create ); \
\r
455 UNUSED_PARAM( p_vaddr ); \
\r
456 UNUSED_PARAM( p_lkey ); \
\r
457 UNUSED_PARAM( p_rkey ); \
\r
458 UNUSED_PARAM( h_pd )
\r
460 #define verbs_register_smr(h_mr, h_pd, access_ctrl, p_vaddr, p_lkey, \
\r
462 ual_reg_shared( h_mr, h_pd, access_ctrl, p_vaddr, p_lkey, \
\r
464 UNUSED_PARAM( um_call )
\r
466 #define verbs_create_mw(h_pd, p_rkey, h_mw) \
\r
467 ual_create_mw(h_pd, p_rkey, h_mw); \
\r
468 UNUSED_PARAM( p_umv_buf )
\r
470 #define verbs_check_mw(h_mw) ((h_mw)->h_ci_mw || (h_mw)->obj.hdl)
\r
471 #define verbs_destroy_mw(h_mw) \
\r
472 ual_destroy_mw(h_mw)
\r
474 #define verbs_query_mw(h_mw, ph_pd, p_rkey) \
\r
475 ual_query_mw(h_mw, ph_pd, p_rkey); \
\r
476 UNUSED_PARAM( p_umv_buf )
\r
478 #define convert_mr_handle(h_mr) (h_mr)
\r
480 #define verbs_bind_mw(h_mw, h_qp, p_mw_bind, p_rkey) \
\r
481 ual_bind_mw(h_mw, h_qp, p_mw_bind, p_rkey)
\r
483 static inline ib_api_status_t
\r
485 IN const ib_ca_handle_t h_ca,
\r
486 IN ib_pd_handle_t h_pd,
\r
487 IN OUT ci_umv_buf_t* const p_umv_buf )
\r
489 UNUSED_PARAM( p_umv_buf );
\r
490 return ual_allocate_pd( h_ca, h_pd->type, h_pd );
\r
494 * Get an alias to the kernel's hardware PD.
\r
496 static inline ib_api_status_t
\r
498 IN const ib_ca_handle_t h_ca,
\r
499 IN const ib_pd_handle_t h_pd )
\r
501 return ual_allocate_pd( h_ca, h_pd->type, h_pd );
\r
504 #define deallocate_pd_alias( h_pd ) /* no action to take */
\r
506 #define verbs_check_pd(h_pd) ((h_pd)->h_ci_pd || (h_pd)->obj.hdl)
\r
507 #define verbs_deallocate_pd(h_pd) \
\r
508 ual_deallocate_pd(h_pd)
\r
510 /* For user-mode, handle conversion is done in ual files */
\r
512 #define convert_qp_handle( qp_create )
\r
514 /* TBD: Do we need to support this in user-mode? */
\r
515 #define verbs_get_spl_qp(h_pd, port_num, h_qp, p_qp_create, p_qp_attr) \
\r
518 #define verbs_create_qp(h_pd, h_qp, p_qp_create, p_qp_attr, p_umv_buf) \
\r
519 ual_create_qp (h_pd, h_qp, p_qp_create, p_qp_attr); \
\r
520 UNUSED_PARAM( p_umv_buf )
\r
522 #define verbs_check_qp(h_qp) ((h_qp)->h_ci_qp || (h_qp)->obj.hdl)
\r
523 #define verbs_destroy_qp(h_qp) \
\r
524 ual_destroy_qp(h_qp)
\r
526 #define verbs_query_qp(h_qp, p_qp_attr) \
\r
527 ual_query_qp(h_qp, p_qp_attr); \
\r
528 UNUSED_PARAM( p_umv_buf );
\r
530 #define verbs_modify_qp(h_qp, p_qp_mod, qp_attr) \
\r
531 ual_modify_qp(h_qp, p_qp_mod, &qp_attr); \
\r
532 UNUSED_PARAM( p_umv_buf );
\r
534 #define verbs_post_send(h_qp, p_send_wr, pp_send_failure) \
\r
535 ual_post_send(h_qp, p_send_wr, pp_send_failure)
\r
537 #define verbs_post_recv(h_qp, p_recv_wr, pp_recv_failure) \
\r
538 ual_post_recv(h_qp, p_recv_wr, pp_recv_failure)
\r
540 static inline ib_api_status_t
\r
542 IN const ib_ca_handle_t h_ca,
\r
543 IN const uint8_t port_num,
\r
544 IN const ib_av_attr_t* p_src_av_attr,
\r
545 IN const void* const p_mad_in,
\r
546 IN void* p_mad_out )
\r
548 return ual_local_mad( h_ca, port_num, p_mad_in, p_mad_out );
\r
549 UNUSED_PARAM( p_src_av_attr );
\r
552 #define check_local_mad(h_qp) \
\r
555 #define init_alias_qp( h_qp, h_pd, port_guid, p_qp_create ) \
\r
556 ual_init_qp_alias( h_qp, h_pd, port_guid, p_qp_create )
\r
558 #define spl_qp_mad_send( h_mad_svc, p_mad_element_list, pp_mad_failure ) \
\r
559 ual_spl_qp_mad_send( h_mad_svc, p_mad_element_list, pp_mad_failure )
\r
561 #define spl_qp_cancel_mad( h_mad_svc, p_mad_element ) \
\r
562 ual_spl_qp_cancel_mad( h_mad_svc, p_mad_element )
\r
564 #define create_reg_mad_pool( h_pool, h_pd, p_pool_key ) \
\r
565 ual_create_reg_mad_pool( h_pool, h_pd, p_pool_key )
\r
567 #define dereg_destroy_mad_pool( pool_key ) \
\r
568 ual_dereg_destroy_mad_pool( pool_key )
\r
570 #define verbs_attach_mcast(h_mcast) \
\r
571 ual_attach_mcast( h_mcast )
\r
573 #define verbs_detach_mcast(h_mcast) \
\r
574 ual_detach_mcast( h_mcast )
\r
576 #endif /* CL_KERNEL */
\r
579 #endif /* __AL_VERBS_H__ */
\r