xref: /onnv-gate/usr/src/lib/udapl/udapl_tavor/common/dapl_srq.c (revision 9517:b4839b0aa7a4)
1*9517SBill.Taylor@Sun.COM /*
2*9517SBill.Taylor@Sun.COM  * CDDL HEADER START
3*9517SBill.Taylor@Sun.COM  *
4*9517SBill.Taylor@Sun.COM  * The contents of this file are subject to the terms of the
5*9517SBill.Taylor@Sun.COM  * Common Development and Distribution License (the "License").
6*9517SBill.Taylor@Sun.COM  * You may not use this file except in compliance with the License.
7*9517SBill.Taylor@Sun.COM  *
8*9517SBill.Taylor@Sun.COM  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*9517SBill.Taylor@Sun.COM  * or http://www.opensolaris.org/os/licensing.
10*9517SBill.Taylor@Sun.COM  * See the License for the specific language governing permissions
11*9517SBill.Taylor@Sun.COM  * and limitations under the License.
12*9517SBill.Taylor@Sun.COM  *
13*9517SBill.Taylor@Sun.COM  * When distributing Covered Code, include this CDDL HEADER in each
14*9517SBill.Taylor@Sun.COM  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*9517SBill.Taylor@Sun.COM  * If applicable, add the following below this CDDL HEADER, with the
16*9517SBill.Taylor@Sun.COM  * fields enclosed by brackets "[]" replaced with your own identifying
17*9517SBill.Taylor@Sun.COM  * information: Portions Copyright [yyyy] [name of copyright owner]
18*9517SBill.Taylor@Sun.COM  *
19*9517SBill.Taylor@Sun.COM  * CDDL HEADER END
20*9517SBill.Taylor@Sun.COM  */
21*9517SBill.Taylor@Sun.COM 
22*9517SBill.Taylor@Sun.COM /*
23*9517SBill.Taylor@Sun.COM  * Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
24*9517SBill.Taylor@Sun.COM  * Use is subject to license terms.
25*9517SBill.Taylor@Sun.COM  */
26*9517SBill.Taylor@Sun.COM 
27*9517SBill.Taylor@Sun.COM /*
28*9517SBill.Taylor@Sun.COM  *
29*9517SBill.Taylor@Sun.COM  * MODULE: dapl_srq.c
30*9517SBill.Taylor@Sun.COM  *
31*9517SBill.Taylor@Sun.COM  * PURPOSE: Shared Receive Queue
32*9517SBill.Taylor@Sun.COM  * Description: Interfaces in this file are completely described in
33*9517SBill.Taylor@Sun.COM  *		the DAPL 1.2 API, Chapter 6, section 5
34*9517SBill.Taylor@Sun.COM  *
35*9517SBill.Taylor@Sun.COM  */
36*9517SBill.Taylor@Sun.COM 
37*9517SBill.Taylor@Sun.COM #include "dapl.h"
38*9517SBill.Taylor@Sun.COM #include "dapl_adapter_util.h"
39*9517SBill.Taylor@Sun.COM #include "dapl_ia_util.h"
40*9517SBill.Taylor@Sun.COM #include "dapl_srq_util.h"
41*9517SBill.Taylor@Sun.COM #include "dapl_cookie.h"
42*9517SBill.Taylor@Sun.COM 
43*9517SBill.Taylor@Sun.COM /*
44*9517SBill.Taylor@Sun.COM  * dapl_srq_create
45*9517SBill.Taylor@Sun.COM  *
46*9517SBill.Taylor@Sun.COM  * uDAPL: User Direct Access Program Library Version 1.2, 6.5.1
47*9517SBill.Taylor@Sun.COM  *
48*9517SBill.Taylor@Sun.COM  * creates an instance of a Shared Receive Queue (SRQ) that is provided
49*9517SBill.Taylor@Sun.COM  * to the Consumer as srq_handle.
50*9517SBill.Taylor@Sun.COM  *
51*9517SBill.Taylor@Sun.COM  * Input:
52*9517SBill.Taylor@Sun.COM  * 	ia_handle
53*9517SBill.Taylor@Sun.COM  * 	pz_handle
54*9517SBill.Taylor@Sun.COM  * 	srq_attr
55*9517SBill.Taylor@Sun.COM  *
56*9517SBill.Taylor@Sun.COM  * Output:
57*9517SBill.Taylor@Sun.COM  * 	srq_handle
58*9517SBill.Taylor@Sun.COM  *
59*9517SBill.Taylor@Sun.COM  * Returns:
60*9517SBill.Taylor@Sun.COM  * 	DAT_SUCCESS
61*9517SBill.Taylor@Sun.COM  * 	DAT_INSUFFICIENT_RESOURCES
62*9517SBill.Taylor@Sun.COM  * 	DAT_INVALID_HANDLE
63*9517SBill.Taylor@Sun.COM  * 	DAT_INVALID_PARAMETER
64*9517SBill.Taylor@Sun.COM  * 	DAT_MODEL_NOT_SUPPORTED
65*9517SBill.Taylor@Sun.COM  */
66*9517SBill.Taylor@Sun.COM 
67*9517SBill.Taylor@Sun.COM DAT_RETURN
dapl_srq_create(IN DAT_IA_HANDLE ia_handle,IN DAT_PZ_HANDLE pz_handle,IN DAT_SRQ_ATTR * srq_attr,OUT DAT_SRQ_HANDLE * srq_handle)68*9517SBill.Taylor@Sun.COM dapl_srq_create(
69*9517SBill.Taylor@Sun.COM 	IN	DAT_IA_HANDLE ia_handle,
70*9517SBill.Taylor@Sun.COM 	IN	DAT_PZ_HANDLE pz_handle,
71*9517SBill.Taylor@Sun.COM 	IN	DAT_SRQ_ATTR *srq_attr,
72*9517SBill.Taylor@Sun.COM 	OUT	DAT_SRQ_HANDLE *srq_handle)
73*9517SBill.Taylor@Sun.COM {
74*9517SBill.Taylor@Sun.COM 	DAPL_IA		*ia_ptr;
75*9517SBill.Taylor@Sun.COM 	DAPL_SRQ	*srq_ptr;
76*9517SBill.Taylor@Sun.COM 	DAT_SRQ_ATTR	srq_attr_limit;
77*9517SBill.Taylor@Sun.COM 	DAT_RETURN	dat_status;
78*9517SBill.Taylor@Sun.COM 
79*9517SBill.Taylor@Sun.COM 	ia_ptr = (DAPL_IA *)ia_handle;
80*9517SBill.Taylor@Sun.COM 	dat_status = DAT_SUCCESS;
81*9517SBill.Taylor@Sun.COM 	/*
82*9517SBill.Taylor@Sun.COM 	 * Verify parameters
83*9517SBill.Taylor@Sun.COM 	 */
84*9517SBill.Taylor@Sun.COM 	if (DAPL_BAD_HANDLE(ia_ptr, DAPL_MAGIC_IA)) {
85*9517SBill.Taylor@Sun.COM 		dat_status = DAT_ERROR(DAT_INVALID_HANDLE,
86*9517SBill.Taylor@Sun.COM 		    DAT_INVALID_HANDLE_IA);
87*9517SBill.Taylor@Sun.COM 		goto bail;
88*9517SBill.Taylor@Sun.COM 	}
89*9517SBill.Taylor@Sun.COM 
90*9517SBill.Taylor@Sun.COM 	if ((pz_handle == NULL) || DAPL_BAD_HANDLE(pz_handle, DAPL_MAGIC_PZ)) {
91*9517SBill.Taylor@Sun.COM 		dat_status = DAT_ERROR(DAT_INVALID_HANDLE,
92*9517SBill.Taylor@Sun.COM 		    DAT_INVALID_HANDLE_PZ);
93*9517SBill.Taylor@Sun.COM 		goto bail;
94*9517SBill.Taylor@Sun.COM 	}
95*9517SBill.Taylor@Sun.COM 
96*9517SBill.Taylor@Sun.COM 	if ((srq_attr == NULL) || ((uintptr_t)srq_attr & 3)) {
97*9517SBill.Taylor@Sun.COM 		dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG3);
98*9517SBill.Taylor@Sun.COM 		goto bail;
99*9517SBill.Taylor@Sun.COM 	}
100*9517SBill.Taylor@Sun.COM 
101*9517SBill.Taylor@Sun.COM 	if (srq_handle == NULL) {
102*9517SBill.Taylor@Sun.COM 		dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG4);
103*9517SBill.Taylor@Sun.COM 		goto bail;
104*9517SBill.Taylor@Sun.COM 	}
105*9517SBill.Taylor@Sun.COM 
106*9517SBill.Taylor@Sun.COM 	if (srq_attr->max_recv_dtos == 0 || srq_attr->max_recv_iov == 0 ||
107*9517SBill.Taylor@Sun.COM 	    srq_attr->low_watermark != DAT_SRQ_LW_DEFAULT) {
108*9517SBill.Taylor@Sun.COM 		dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG3);
109*9517SBill.Taylor@Sun.COM 		goto bail;
110*9517SBill.Taylor@Sun.COM 	}
111*9517SBill.Taylor@Sun.COM 
112*9517SBill.Taylor@Sun.COM 	/* Verify the attributes against the transport */
113*9517SBill.Taylor@Sun.COM 	(void) dapl_os_memzero(&srq_attr_limit, sizeof (DAT_SRQ_ATTR));
114*9517SBill.Taylor@Sun.COM 	dat_status = dapls_ib_query_hca(ia_ptr->hca_ptr, NULL, NULL, NULL,
115*9517SBill.Taylor@Sun.COM 	    &srq_attr_limit);
116*9517SBill.Taylor@Sun.COM 	if (dat_status != DAT_SUCCESS) {
117*9517SBill.Taylor@Sun.COM 			goto bail;
118*9517SBill.Taylor@Sun.COM 	}
119*9517SBill.Taylor@Sun.COM 	if (srq_attr->max_recv_dtos > srq_attr_limit.max_recv_dtos ||
120*9517SBill.Taylor@Sun.COM 	    srq_attr->max_recv_iov > srq_attr_limit.max_recv_iov) {
121*9517SBill.Taylor@Sun.COM 		dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG3);
122*9517SBill.Taylor@Sun.COM 		goto bail;
123*9517SBill.Taylor@Sun.COM 	}
124*9517SBill.Taylor@Sun.COM 
125*9517SBill.Taylor@Sun.COM 	/* Allocate SRQ */
126*9517SBill.Taylor@Sun.COM 	srq_ptr = dapl_srq_alloc(ia_ptr, srq_attr);
127*9517SBill.Taylor@Sun.COM 	if (srq_ptr == NULL) {
128*9517SBill.Taylor@Sun.COM 		dat_status = DAT_ERROR(DAT_INSUFFICIENT_RESOURCES,
129*9517SBill.Taylor@Sun.COM 		    DAT_RESOURCE_MEMORY);
130*9517SBill.Taylor@Sun.COM 		goto bail;
131*9517SBill.Taylor@Sun.COM 	}
132*9517SBill.Taylor@Sun.COM 
133*9517SBill.Taylor@Sun.COM 	/* Take a reference on the PZ handle */
134*9517SBill.Taylor@Sun.COM 	dapl_os_atomic_inc(&((DAPL_PZ *)pz_handle)->pz_ref_count);
135*9517SBill.Taylor@Sun.COM 
136*9517SBill.Taylor@Sun.COM 	/*
137*9517SBill.Taylor@Sun.COM 	 * Fill in the SRQ
138*9517SBill.Taylor@Sun.COM 	 */
139*9517SBill.Taylor@Sun.COM 	srq_ptr->param.ia_handle	= ia_handle;
140*9517SBill.Taylor@Sun.COM 	srq_ptr->param.srq_state	= DAT_SRQ_STATE_OPERATIONAL;
141*9517SBill.Taylor@Sun.COM 	srq_ptr->param.pz_handle	= pz_handle;
142*9517SBill.Taylor@Sun.COM 	srq_ptr->param.max_recv_dtos	= srq_attr->max_recv_dtos;
143*9517SBill.Taylor@Sun.COM 	srq_ptr->param.max_recv_iov	= srq_attr->max_recv_iov;
144*9517SBill.Taylor@Sun.COM 	srq_ptr->param.low_watermark	= DAT_SRQ_LW_DEFAULT;
145*9517SBill.Taylor@Sun.COM 
146*9517SBill.Taylor@Sun.COM 	srq_ptr->param.available_dto_count	= DAT_VALUE_UNKNOWN;
147*9517SBill.Taylor@Sun.COM 	srq_ptr->param.outstanding_dto_count	= 0;
148*9517SBill.Taylor@Sun.COM 
149*9517SBill.Taylor@Sun.COM 	dat_status = dapls_ib_srq_alloc(ia_ptr, srq_ptr);
150*9517SBill.Taylor@Sun.COM 	if (dat_status != DAT_SUCCESS) {
151*9517SBill.Taylor@Sun.COM 		dapl_os_atomic_dec(&((DAPL_PZ *)pz_handle)->pz_ref_count);
152*9517SBill.Taylor@Sun.COM 		dapl_srq_dealloc(srq_ptr);
153*9517SBill.Taylor@Sun.COM 		goto bail;
154*9517SBill.Taylor@Sun.COM 	}
155*9517SBill.Taylor@Sun.COM 	/* Link it onto the IA */
156*9517SBill.Taylor@Sun.COM 	dapl_ia_link_srq(ia_ptr, srq_ptr);
157*9517SBill.Taylor@Sun.COM 
158*9517SBill.Taylor@Sun.COM 	*srq_handle = srq_ptr;
159*9517SBill.Taylor@Sun.COM bail:
160*9517SBill.Taylor@Sun.COM 	return (dat_status);
161*9517SBill.Taylor@Sun.COM }
162*9517SBill.Taylor@Sun.COM 
163*9517SBill.Taylor@Sun.COM /*
164*9517SBill.Taylor@Sun.COM  * dapl_srq_free
165*9517SBill.Taylor@Sun.COM  *
166*9517SBill.Taylor@Sun.COM  * uDAPL: User Direct Access Program Library Version 1.2, 6.5.5
167*9517SBill.Taylor@Sun.COM  *
168*9517SBill.Taylor@Sun.COM  * destroys an instance of the SRQ. The SRQ cannot be destroyed if it is
169*9517SBill.Taylor@Sun.COM  * in use by an EP.
170*9517SBill.Taylor@Sun.COM  *
171*9517SBill.Taylor@Sun.COM  * Input:
172*9517SBill.Taylor@Sun.COM  * 	srq_handle
173*9517SBill.Taylor@Sun.COM  *
174*9517SBill.Taylor@Sun.COM  * Output:
175*9517SBill.Taylor@Sun.COM  * 	none
176*9517SBill.Taylor@Sun.COM  *
177*9517SBill.Taylor@Sun.COM  * Returns:
178*9517SBill.Taylor@Sun.COM  * 	DAT_SUCCESS
179*9517SBill.Taylor@Sun.COM  * 	DAT_INVALID_HANDLE
180*9517SBill.Taylor@Sun.COM  * 	DAT_INVALID_STATE
181*9517SBill.Taylor@Sun.COM  */
182*9517SBill.Taylor@Sun.COM 
183*9517SBill.Taylor@Sun.COM DAT_RETURN
dapl_srq_free(IN DAT_SRQ_HANDLE srq_handle)184*9517SBill.Taylor@Sun.COM dapl_srq_free(
185*9517SBill.Taylor@Sun.COM 	IN	DAT_SRQ_HANDLE srq_handle)
186*9517SBill.Taylor@Sun.COM {
187*9517SBill.Taylor@Sun.COM 	DAPL_SRQ	*srq_ptr;
188*9517SBill.Taylor@Sun.COM 	DAPL_IA		*ia_ptr;
189*9517SBill.Taylor@Sun.COM 	DAT_SRQ_PARAM	*param;
190*9517SBill.Taylor@Sun.COM 	DAT_RETURN	dat_status = DAT_SUCCESS;
191*9517SBill.Taylor@Sun.COM 
192*9517SBill.Taylor@Sun.COM 	if (DAPL_BAD_HANDLE(srq_handle, DAPL_MAGIC_SRQ)) {
193*9517SBill.Taylor@Sun.COM 		dat_status = DAT_ERROR(DAT_INVALID_HANDLE,
194*9517SBill.Taylor@Sun.COM 		    DAT_INVALID_HANDLE_SRQ);
195*9517SBill.Taylor@Sun.COM 		goto bail;
196*9517SBill.Taylor@Sun.COM 	}
197*9517SBill.Taylor@Sun.COM 
198*9517SBill.Taylor@Sun.COM 	srq_ptr = (DAPL_SRQ *)srq_handle;
199*9517SBill.Taylor@Sun.COM 	param = &srq_ptr->param;
200*9517SBill.Taylor@Sun.COM 	if (0 != srq_ptr->srq_ref_count) {
201*9517SBill.Taylor@Sun.COM 		dapl_dbg_log(DAPL_DBG_TYPE_EP,
202*9517SBill.Taylor@Sun.COM 		    "dapl_srq_free: Free SRQ: %p, refcnt %d\n",
203*9517SBill.Taylor@Sun.COM 		    srq_ptr, srq_ptr->srq_ref_count);
204*9517SBill.Taylor@Sun.COM 		dat_status = DAT_ERROR(DAT_INVALID_HANDLE,
205*9517SBill.Taylor@Sun.COM 		    DAT_INVALID_STATE_SRQ_IN_USE);
206*9517SBill.Taylor@Sun.COM 		goto bail;
207*9517SBill.Taylor@Sun.COM 	}
208*9517SBill.Taylor@Sun.COM 
209*9517SBill.Taylor@Sun.COM 	ia_ptr = srq_ptr->header.owner_ia;
210*9517SBill.Taylor@Sun.COM 	param->srq_state = DAT_SRQ_STATE_ERROR;
211*9517SBill.Taylor@Sun.COM 
212*9517SBill.Taylor@Sun.COM 	dapls_ib_srq_free(ia_ptr, srq_ptr);
213*9517SBill.Taylor@Sun.COM 
214*9517SBill.Taylor@Sun.COM 	/* Remove link from the IA */
215*9517SBill.Taylor@Sun.COM 	dapl_ia_unlink_srq(ia_ptr, srq_ptr);
216*9517SBill.Taylor@Sun.COM 
217*9517SBill.Taylor@Sun.COM 	dapl_os_assert(param->pz_handle != NULL);
218*9517SBill.Taylor@Sun.COM 	dapl_os_atomic_dec(&((DAPL_PZ *)param->pz_handle)->pz_ref_count);
219*9517SBill.Taylor@Sun.COM 	param->pz_handle = NULL;
220*9517SBill.Taylor@Sun.COM 
221*9517SBill.Taylor@Sun.COM 	dapl_srq_dealloc(srq_ptr);
222*9517SBill.Taylor@Sun.COM 
223*9517SBill.Taylor@Sun.COM bail:
224*9517SBill.Taylor@Sun.COM 	return (dat_status);
225*9517SBill.Taylor@Sun.COM }
226*9517SBill.Taylor@Sun.COM 
227*9517SBill.Taylor@Sun.COM /*
228*9517SBill.Taylor@Sun.COM  * dapl_srq_post_recv
229*9517SBill.Taylor@Sun.COM  *
230*9517SBill.Taylor@Sun.COM  * uDAPL: User Direct Access Program Library Version 1.2, 6.5.8
231*9517SBill.Taylor@Sun.COM  *
232*9517SBill.Taylor@Sun.COM  * posts the receive buffer that can be used for the incoming message into
233*9517SBill.Taylor@Sun.COM  * the local_iov by any connected EP that uses SRQ.
234*9517SBill.Taylor@Sun.COM  *
235*9517SBill.Taylor@Sun.COM  * Input:
236*9517SBill.Taylor@Sun.COM  * 	srq_handle
237*9517SBill.Taylor@Sun.COM  * 	num_segments
238*9517SBill.Taylor@Sun.COM  * 	local_iov
239*9517SBill.Taylor@Sun.COM  *	user_cookie
240*9517SBill.Taylor@Sun.COM  *
241*9517SBill.Taylor@Sun.COM  * Output:
242*9517SBill.Taylor@Sun.COM  * 	none
243*9517SBill.Taylor@Sun.COM  *
244*9517SBill.Taylor@Sun.COM  * Returns:
245*9517SBill.Taylor@Sun.COM  * 	DAT_SUCCESS
246*9517SBill.Taylor@Sun.COM  * 	DAT_INVALID_HANDLE
247*9517SBill.Taylor@Sun.COM  * 	DAT_INSUFFICIENT_RESOURCES
248*9517SBill.Taylor@Sun.COM  * 	DAT_INVALID_PARAMETER
249*9517SBill.Taylor@Sun.COM  * 	DAT_PROTECTION_VIOLATION
250*9517SBill.Taylor@Sun.COM  * 	DAT_PRIVILEGES_VIOLATION
251*9517SBill.Taylor@Sun.COM  */
252*9517SBill.Taylor@Sun.COM 
253*9517SBill.Taylor@Sun.COM DAT_RETURN
dapl_srq_post_recv(IN DAT_SRQ_HANDLE srq_handle,IN DAT_COUNT num_segments,IN DAT_LMR_TRIPLET * local_iov,IN DAT_DTO_COOKIE user_cookie)254*9517SBill.Taylor@Sun.COM dapl_srq_post_recv(
255*9517SBill.Taylor@Sun.COM 	IN	DAT_SRQ_HANDLE srq_handle,
256*9517SBill.Taylor@Sun.COM 	IN	DAT_COUNT num_segments,
257*9517SBill.Taylor@Sun.COM 	IN	DAT_LMR_TRIPLET *local_iov,
258*9517SBill.Taylor@Sun.COM 	IN	DAT_DTO_COOKIE user_cookie)
259*9517SBill.Taylor@Sun.COM {
260*9517SBill.Taylor@Sun.COM 	DAPL_SRQ 		*srq_ptr;
261*9517SBill.Taylor@Sun.COM 	DAPL_COOKIE		*cookie;
262*9517SBill.Taylor@Sun.COM 	DAT_RETURN		dat_status;
263*9517SBill.Taylor@Sun.COM 
264*9517SBill.Taylor@Sun.COM 	dapl_dbg_log(DAPL_DBG_TYPE_API,
265*9517SBill.Taylor@Sun.COM 	    "dapl_srq_post_recv (%p, %d, %p, %P)\n",
266*9517SBill.Taylor@Sun.COM 	    srq_handle,
267*9517SBill.Taylor@Sun.COM 	    num_segments,
268*9517SBill.Taylor@Sun.COM 	    local_iov,
269*9517SBill.Taylor@Sun.COM 	    user_cookie.as_64);
270*9517SBill.Taylor@Sun.COM 
271*9517SBill.Taylor@Sun.COM 	if (DAPL_BAD_HANDLE(srq_handle, DAPL_MAGIC_SRQ)) {
272*9517SBill.Taylor@Sun.COM 		dat_status = DAT_ERROR(DAT_INVALID_HANDLE,
273*9517SBill.Taylor@Sun.COM 		    DAT_INVALID_HANDLE_SRQ);
274*9517SBill.Taylor@Sun.COM 		goto bail;
275*9517SBill.Taylor@Sun.COM 	}
276*9517SBill.Taylor@Sun.COM 
277*9517SBill.Taylor@Sun.COM 	srq_ptr = (DAPL_SRQ *) srq_handle;
278*9517SBill.Taylor@Sun.COM 
279*9517SBill.Taylor@Sun.COM 	/*
280*9517SBill.Taylor@Sun.COM 	 * Synchronization ok since this buffer is only used for receive
281*9517SBill.Taylor@Sun.COM 	 * requests, which aren't allowed to race with each other.
282*9517SBill.Taylor@Sun.COM 	 */
283*9517SBill.Taylor@Sun.COM 	dat_status = dapls_dto_cookie_alloc(&srq_ptr->recv_buffer,
284*9517SBill.Taylor@Sun.COM 	    DAPL_DTO_TYPE_RECV,
285*9517SBill.Taylor@Sun.COM 	    user_cookie,
286*9517SBill.Taylor@Sun.COM 	    &cookie);
287*9517SBill.Taylor@Sun.COM 	if (DAT_SUCCESS != dat_status) {
288*9517SBill.Taylor@Sun.COM 		goto bail;
289*9517SBill.Taylor@Sun.COM 	}
290*9517SBill.Taylor@Sun.COM 
291*9517SBill.Taylor@Sun.COM 	/*
292*9517SBill.Taylor@Sun.COM 	 * Invoke provider specific routine to post DTO
293*9517SBill.Taylor@Sun.COM 	 */
294*9517SBill.Taylor@Sun.COM 	dat_status = dapls_ib_post_srq(srq_ptr, cookie, num_segments,
295*9517SBill.Taylor@Sun.COM 	    local_iov);
296*9517SBill.Taylor@Sun.COM 
297*9517SBill.Taylor@Sun.COM 	if (dat_status != DAT_SUCCESS) {
298*9517SBill.Taylor@Sun.COM 		dapls_cookie_dealloc(&srq_ptr->recv_buffer, cookie);
299*9517SBill.Taylor@Sun.COM 	} else {
300*9517SBill.Taylor@Sun.COM 		dapl_os_atomic_inc(&srq_ptr->recv_count);
301*9517SBill.Taylor@Sun.COM 	}
302*9517SBill.Taylor@Sun.COM 
303*9517SBill.Taylor@Sun.COM bail:
304*9517SBill.Taylor@Sun.COM 	dapl_dbg_log(DAPL_DBG_TYPE_RTN,
305*9517SBill.Taylor@Sun.COM 	    "dapl_srq_post_recv () returns 0x%x\n", dat_status);
306*9517SBill.Taylor@Sun.COM 
307*9517SBill.Taylor@Sun.COM 	return (dat_status);
308*9517SBill.Taylor@Sun.COM }
309*9517SBill.Taylor@Sun.COM 
310*9517SBill.Taylor@Sun.COM 
311*9517SBill.Taylor@Sun.COM /*
312*9517SBill.Taylor@Sun.COM  * dapl_srq_query
313*9517SBill.Taylor@Sun.COM  *
314*9517SBill.Taylor@Sun.COM  * uDAPL: User Direct Access Program Library Version 1.2, 6.5.6
315*9517SBill.Taylor@Sun.COM  *
316*9517SBill.Taylor@Sun.COM  * provides to the Consumer SRQ parameters. The Consumer passes in a pointer
317*9517SBill.Taylor@Sun.COM  * to the Consumer-allocated structures for SRQ parameters that the Provider
318*9517SBill.Taylor@Sun.COM  * fills.
319*9517SBill.Taylor@Sun.COM  *
320*9517SBill.Taylor@Sun.COM  * Input:
321*9517SBill.Taylor@Sun.COM  * 	srq_handle
322*9517SBill.Taylor@Sun.COM  * 	srq_param_mask
323*9517SBill.Taylor@Sun.COM  *
324*9517SBill.Taylor@Sun.COM  * Output:
325*9517SBill.Taylor@Sun.COM  * 	srq_param
326*9517SBill.Taylor@Sun.COM  *
327*9517SBill.Taylor@Sun.COM  * Returns:
328*9517SBill.Taylor@Sun.COM  * 	DAT_SUCCESS
329*9517SBill.Taylor@Sun.COM  * 	DAT_INVALID_HANDLE
330*9517SBill.Taylor@Sun.COM  * 	DAT_INVALID_PARAMETER
331*9517SBill.Taylor@Sun.COM  */
332*9517SBill.Taylor@Sun.COM 
333*9517SBill.Taylor@Sun.COM DAT_RETURN
dapl_srq_query(IN DAT_SRQ_HANDLE srq_handle,IN DAT_SRQ_PARAM_MASK srq_param_mask,OUT DAT_SRQ_PARAM * srq_param)334*9517SBill.Taylor@Sun.COM dapl_srq_query(
335*9517SBill.Taylor@Sun.COM 	IN	DAT_SRQ_HANDLE srq_handle,
336*9517SBill.Taylor@Sun.COM 	IN	DAT_SRQ_PARAM_MASK srq_param_mask,
337*9517SBill.Taylor@Sun.COM 	OUT	DAT_SRQ_PARAM *srq_param)
338*9517SBill.Taylor@Sun.COM {
339*9517SBill.Taylor@Sun.COM 	DAPL_SRQ	    *srq_ptr;
340*9517SBill.Taylor@Sun.COM 	DAT_RETURN	    dat_status;
341*9517SBill.Taylor@Sun.COM 
342*9517SBill.Taylor@Sun.COM 	dat_status = DAT_SUCCESS;
343*9517SBill.Taylor@Sun.COM 
344*9517SBill.Taylor@Sun.COM 	if (srq_param_mask & ~DAT_SRQ_FIELD_ALL) {
345*9517SBill.Taylor@Sun.COM 		dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG2);
346*9517SBill.Taylor@Sun.COM 		goto bail;
347*9517SBill.Taylor@Sun.COM 	}
348*9517SBill.Taylor@Sun.COM 
349*9517SBill.Taylor@Sun.COM 	if (NULL == srq_param) {
350*9517SBill.Taylor@Sun.COM 		dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG3);
351*9517SBill.Taylor@Sun.COM 		goto bail;
352*9517SBill.Taylor@Sun.COM 	}
353*9517SBill.Taylor@Sun.COM 
354*9517SBill.Taylor@Sun.COM 
355*9517SBill.Taylor@Sun.COM 	if (DAPL_BAD_HANDLE(srq_handle, DAPL_MAGIC_SRQ)) {
356*9517SBill.Taylor@Sun.COM 		dat_status = DAT_ERROR(DAT_INVALID_HANDLE, 0);
357*9517SBill.Taylor@Sun.COM 		goto bail;
358*9517SBill.Taylor@Sun.COM 	}
359*9517SBill.Taylor@Sun.COM 
360*9517SBill.Taylor@Sun.COM 	srq_ptr = (DAPL_SRQ *)srq_handle;
361*9517SBill.Taylor@Sun.COM 	/* Do a struct copy */
362*9517SBill.Taylor@Sun.COM 	*srq_param = srq_ptr->param;
363*9517SBill.Taylor@Sun.COM 	/* update the outstanding dto count */
364*9517SBill.Taylor@Sun.COM 	srq_param->outstanding_dto_count  = srq_ptr->recv_count;
365*9517SBill.Taylor@Sun.COM 
366*9517SBill.Taylor@Sun.COM bail:
367*9517SBill.Taylor@Sun.COM 	return (dat_status);
368*9517SBill.Taylor@Sun.COM }
369*9517SBill.Taylor@Sun.COM 
370*9517SBill.Taylor@Sun.COM /*
371*9517SBill.Taylor@Sun.COM  * dapl_srq_set_lw
372*9517SBill.Taylor@Sun.COM  *
373*9517SBill.Taylor@Sun.COM  * uDAPL: User Direct Access Program Library Version 1.2, 6.5.4
374*9517SBill.Taylor@Sun.COM  *
375*9517SBill.Taylor@Sun.COM  * sets the low watermark value for SRQ and arms SRQ for generating an
376*9517SBill.Taylor@Sun.COM  * asynchronous event for low watermark. An asynchronous event will be
377*9517SBill.Taylor@Sun.COM  * generated when the number of buffers on SRQ is below the low watermark
378*9517SBill.Taylor@Sun.COM  * for the first time. This may happen during this call or when an
379*9517SBill.Taylor@Sun.COM  * associated EP takes a buffer from the SRQ.
380*9517SBill.Taylor@Sun.COM  *
381*9517SBill.Taylor@Sun.COM  * Input:
382*9517SBill.Taylor@Sun.COM  * 	srq_handle
383*9517SBill.Taylor@Sun.COM  * 	low_watermark
384*9517SBill.Taylor@Sun.COM  *
385*9517SBill.Taylor@Sun.COM  * Output:
386*9517SBill.Taylor@Sun.COM  * 	none
387*9517SBill.Taylor@Sun.COM  *
388*9517SBill.Taylor@Sun.COM  * Returns:
389*9517SBill.Taylor@Sun.COM  * 	DAT_SUCCESS
390*9517SBill.Taylor@Sun.COM  * 	DAT_INVALID_HANDLE
391*9517SBill.Taylor@Sun.COM  * 	DAT_INVALID_PARAMETER
392*9517SBill.Taylor@Sun.COM  * 	DAT_MODEL_NOT_SUPPORTED
393*9517SBill.Taylor@Sun.COM  */
394*9517SBill.Taylor@Sun.COM 
395*9517SBill.Taylor@Sun.COM /* ARGSUSED */
396*9517SBill.Taylor@Sun.COM DAT_RETURN
dapl_srq_set_lw(IN DAT_SRQ_HANDLE srq_handle,IN DAT_COUNT low_watermark)397*9517SBill.Taylor@Sun.COM dapl_srq_set_lw(
398*9517SBill.Taylor@Sun.COM 	IN	DAT_SRQ_HANDLE srq_handle,
399*9517SBill.Taylor@Sun.COM 	IN	DAT_COUNT low_watermark)
400*9517SBill.Taylor@Sun.COM {
401*9517SBill.Taylor@Sun.COM 	return (DAT_MODEL_NOT_SUPPORTED);
402*9517SBill.Taylor@Sun.COM }
403*9517SBill.Taylor@Sun.COM 
404*9517SBill.Taylor@Sun.COM /*
405*9517SBill.Taylor@Sun.COM  * dapl_srq_resize
406*9517SBill.Taylor@Sun.COM  *
407*9517SBill.Taylor@Sun.COM  * uDAPL: User Direct Access Program Library Version 1.2, 6.5.7
408*9517SBill.Taylor@Sun.COM  *
409*9517SBill.Taylor@Sun.COM  * modifies the size of the queue of SRQ. Resizing of SRQ shall not cause
410*9517SBill.Taylor@Sun.COM  * any incoming messages on any of the EPs that use the SRQ to be lost.
411*9517SBill.Taylor@Sun.COM  *
412*9517SBill.Taylor@Sun.COM  * Input:
413*9517SBill.Taylor@Sun.COM  * 	srq_handle
414*9517SBill.Taylor@Sun.COM  * 	srq_max_recv_dto
415*9517SBill.Taylor@Sun.COM  *
416*9517SBill.Taylor@Sun.COM  * Output:
417*9517SBill.Taylor@Sun.COM  * 	none
418*9517SBill.Taylor@Sun.COM  *
419*9517SBill.Taylor@Sun.COM  * Returns:
420*9517SBill.Taylor@Sun.COM  * 	DAT_SUCCESS
421*9517SBill.Taylor@Sun.COM  * 	DAT_INVALID_HANDLE
422*9517SBill.Taylor@Sun.COM  * 	DAT_INVALID_PARAMETER
423*9517SBill.Taylor@Sun.COM  * 	DAT_INSUFFICIENT_RESOURCES
424*9517SBill.Taylor@Sun.COM  * 	DAT_INVALID_STATE
425*9517SBill.Taylor@Sun.COM  */
426*9517SBill.Taylor@Sun.COM 
427*9517SBill.Taylor@Sun.COM /* ARGSUSED */
428*9517SBill.Taylor@Sun.COM DAT_RETURN
dapl_srq_resize(IN DAT_SRQ_HANDLE srq_handle,IN DAT_COUNT srq_max_recv_dtos)429*9517SBill.Taylor@Sun.COM dapl_srq_resize(
430*9517SBill.Taylor@Sun.COM 	IN	DAT_SRQ_HANDLE srq_handle,
431*9517SBill.Taylor@Sun.COM 	IN	DAT_COUNT srq_max_recv_dtos)
432*9517SBill.Taylor@Sun.COM {
433*9517SBill.Taylor@Sun.COM 	DAPL_SRQ		*srq_ptr;
434*9517SBill.Taylor@Sun.COM 	DAT_SRQ_ATTR		srq_attr_limit;
435*9517SBill.Taylor@Sun.COM 	DAPL_COOKIE_BUFFER	new_cb;
436*9517SBill.Taylor@Sun.COM 	DAT_RETURN		dat_status;
437*9517SBill.Taylor@Sun.COM 
438*9517SBill.Taylor@Sun.COM 
439*9517SBill.Taylor@Sun.COM 	srq_ptr = (DAPL_SRQ *)srq_handle;
440*9517SBill.Taylor@Sun.COM 	dat_status = DAT_SUCCESS;
441*9517SBill.Taylor@Sun.COM 
442*9517SBill.Taylor@Sun.COM 	if (DAPL_BAD_HANDLE(srq_handle, DAPL_MAGIC_SRQ)) {
443*9517SBill.Taylor@Sun.COM 		return (DAT_ERROR(DAT_INVALID_HANDLE, DAT_HANDLE_TYPE_SRQ));
444*9517SBill.Taylor@Sun.COM 	}
445*9517SBill.Taylor@Sun.COM 
446*9517SBill.Taylor@Sun.COM 	/* can't shrink below the number of outstanding recvs */
447*9517SBill.Taylor@Sun.COM 	if (srq_max_recv_dtos < srq_ptr->recv_count) {
448*9517SBill.Taylor@Sun.COM 		return (DAT_ERROR(DAT_INVALID_STATE, 0));
449*9517SBill.Taylor@Sun.COM 	}
450*9517SBill.Taylor@Sun.COM 
451*9517SBill.Taylor@Sun.COM 	/*
452*9517SBill.Taylor@Sun.COM 	 * shrinking SRQs is not supported on tavor return success without
453*9517SBill.Taylor@Sun.COM 	 * any modification.
454*9517SBill.Taylor@Sun.COM 	 */
455*9517SBill.Taylor@Sun.COM 	if (srq_max_recv_dtos <= srq_ptr->param.max_recv_dtos) {
456*9517SBill.Taylor@Sun.COM 		return (DAT_SUCCESS);
457*9517SBill.Taylor@Sun.COM 	}
458*9517SBill.Taylor@Sun.COM 
459*9517SBill.Taylor@Sun.COM 	/* Verify the attributes against the transport */
460*9517SBill.Taylor@Sun.COM 	(void) dapl_os_memzero(&srq_attr_limit, sizeof (DAT_SRQ_ATTR));
461*9517SBill.Taylor@Sun.COM 	dat_status = dapls_ib_query_hca(srq_ptr->header.owner_ia->hca_ptr,
462*9517SBill.Taylor@Sun.COM 	    NULL, NULL, NULL, &srq_attr_limit);
463*9517SBill.Taylor@Sun.COM 	if (dat_status != DAT_SUCCESS) {
464*9517SBill.Taylor@Sun.COM 		return (dat_status);
465*9517SBill.Taylor@Sun.COM 	}
466*9517SBill.Taylor@Sun.COM 
467*9517SBill.Taylor@Sun.COM 	if (srq_max_recv_dtos > srq_attr_limit.max_recv_dtos) {
468*9517SBill.Taylor@Sun.COM 		dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG2);
469*9517SBill.Taylor@Sun.COM 		return (dat_status);
470*9517SBill.Taylor@Sun.COM 	}
471*9517SBill.Taylor@Sun.COM 
472*9517SBill.Taylor@Sun.COM 	dat_status = dapls_cb_resize(&srq_ptr->recv_buffer, srq_max_recv_dtos,
473*9517SBill.Taylor@Sun.COM 	    &new_cb);
474*9517SBill.Taylor@Sun.COM 	if (dat_status != DAT_SUCCESS) {
475*9517SBill.Taylor@Sun.COM 		return (dat_status);
476*9517SBill.Taylor@Sun.COM 	}
477*9517SBill.Taylor@Sun.COM 
478*9517SBill.Taylor@Sun.COM 	dat_status = dapls_ib_srq_resize(srq_ptr, srq_max_recv_dtos);
479*9517SBill.Taylor@Sun.COM 	if (dat_status != DAT_SUCCESS) {
480*9517SBill.Taylor@Sun.COM 		goto bail;
481*9517SBill.Taylor@Sun.COM 	}
482*9517SBill.Taylor@Sun.COM 
483*9517SBill.Taylor@Sun.COM 	dapls_cb_free(&srq_ptr->recv_buffer);
484*9517SBill.Taylor@Sun.COM 	srq_ptr->recv_buffer = new_cb; /* struct copy */
485*9517SBill.Taylor@Sun.COM 	srq_ptr->param.max_recv_dtos = srq_max_recv_dtos;
486*9517SBill.Taylor@Sun.COM 
487*9517SBill.Taylor@Sun.COM 	return (DAT_SUCCESS);
488*9517SBill.Taylor@Sun.COM bail:
489*9517SBill.Taylor@Sun.COM 	dapls_cb_free(&new_cb);
490*9517SBill.Taylor@Sun.COM 
491*9517SBill.Taylor@Sun.COM 	return (dat_status);
492*9517SBill.Taylor@Sun.COM }
493