1*9e39c5baSBill Taylor /*
2*9e39c5baSBill Taylor  * CDDL HEADER START
3*9e39c5baSBill Taylor  *
4*9e39c5baSBill Taylor  * The contents of this file are subject to the terms of the
5*9e39c5baSBill Taylor  * Common Development and Distribution License (the "License").
6*9e39c5baSBill Taylor  * You may not use this file except in compliance with the License.
7*9e39c5baSBill Taylor  *
8*9e39c5baSBill Taylor  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*9e39c5baSBill Taylor  * or http://www.opensolaris.org/os/licensing.
10*9e39c5baSBill Taylor  * See the License for the specific language governing permissions
11*9e39c5baSBill Taylor  * and limitations under the License.
12*9e39c5baSBill Taylor  *
13*9e39c5baSBill Taylor  * When distributing Covered Code, include this CDDL HEADER in each
14*9e39c5baSBill Taylor  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*9e39c5baSBill Taylor  * If applicable, add the following below this CDDL HEADER, with the
16*9e39c5baSBill Taylor  * fields enclosed by brackets "[]" replaced with your own identifying
17*9e39c5baSBill Taylor  * information: Portions Copyright [yyyy] [name of copyright owner]
18*9e39c5baSBill Taylor  *
19*9e39c5baSBill Taylor  * CDDL HEADER END
20*9e39c5baSBill Taylor  */
21*9e39c5baSBill Taylor 
22*9e39c5baSBill Taylor /*
23*9e39c5baSBill Taylor  * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved.
24*9e39c5baSBill Taylor  */
25*9e39c5baSBill Taylor 
26*9e39c5baSBill Taylor /*
27*9e39c5baSBill Taylor  * Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
28*9e39c5baSBill Taylor  * Use is subject to license terms.
29*9e39c5baSBill Taylor  */
30*9e39c5baSBill Taylor 
31*9e39c5baSBill Taylor /*
32*9e39c5baSBill Taylor  *
33*9e39c5baSBill Taylor  * MODULE: dapl_sp_util.c
34*9e39c5baSBill Taylor  *
35*9e39c5baSBill Taylor  * PURPOSE: Manage PSP Info structure
36*9e39c5baSBill Taylor  *
37*9e39c5baSBill Taylor  * $Id: dapl_sp_util.c,v 1.10 2003/08/20 14:55:39 sjs2 Exp $
38*9e39c5baSBill Taylor  */
39*9e39c5baSBill Taylor 
40*9e39c5baSBill Taylor #include "dapl.h"
41*9e39c5baSBill Taylor #include "dapl_sp_util.h"
42*9e39c5baSBill Taylor 
43*9e39c5baSBill Taylor /*
44*9e39c5baSBill Taylor  * Local definitions
45*9e39c5baSBill Taylor  */
46*9e39c5baSBill Taylor 
47*9e39c5baSBill Taylor 
48*9e39c5baSBill Taylor /*
49*9e39c5baSBill Taylor  * dapl_sp_alloc
50*9e39c5baSBill Taylor  *
51*9e39c5baSBill Taylor  * alloc and initialize a PSP INFO struct
52*9e39c5baSBill Taylor  *
53*9e39c5baSBill Taylor  * Input:
54*9e39c5baSBill Taylor  * 	IA INFO struct ptr
55*9e39c5baSBill Taylor  *
56*9e39c5baSBill Taylor  * Output:
57*9e39c5baSBill Taylor  * 	sp_ptr
58*9e39c5baSBill Taylor  *
59*9e39c5baSBill Taylor  * Returns:
60*9e39c5baSBill Taylor  * 	NULL
61*9e39c5baSBill Taylor  *	pointer to sp info struct
62*9e39c5baSBill Taylor  *
63*9e39c5baSBill Taylor  */
64*9e39c5baSBill Taylor DAPL_SP *
dapls_sp_alloc(IN DAPL_IA * ia_ptr,IN DAT_BOOLEAN is_psp)65*9e39c5baSBill Taylor dapls_sp_alloc(
66*9e39c5baSBill Taylor 	IN DAPL_IA *ia_ptr,
67*9e39c5baSBill Taylor 	IN DAT_BOOLEAN is_psp)
68*9e39c5baSBill Taylor {
69*9e39c5baSBill Taylor 	DAPL_SP *sp_ptr;
70*9e39c5baSBill Taylor 
71*9e39c5baSBill Taylor 	/* Allocate EP */
72*9e39c5baSBill Taylor 	sp_ptr = (DAPL_SP *)dapl_os_alloc(sizeof (DAPL_SP));
73*9e39c5baSBill Taylor 	if (sp_ptr == NULL) {
74*9e39c5baSBill Taylor 		return (NULL);
75*9e39c5baSBill Taylor 	}
76*9e39c5baSBill Taylor 
77*9e39c5baSBill Taylor 	/* zero the structure */
78*9e39c5baSBill Taylor 	(void) dapl_os_memzero(sp_ptr, sizeof (DAPL_SP));
79*9e39c5baSBill Taylor 
80*9e39c5baSBill Taylor 	/*
81*9e39c5baSBill Taylor 	 * initialize the header
82*9e39c5baSBill Taylor 	 */
83*9e39c5baSBill Taylor 	sp_ptr->header.provider = ia_ptr->header.provider;
84*9e39c5baSBill Taylor 	if (is_psp) {
85*9e39c5baSBill Taylor 		sp_ptr->header.magic = DAPL_MAGIC_PSP;
86*9e39c5baSBill Taylor 		sp_ptr->header.handle_type = DAT_HANDLE_TYPE_PSP;
87*9e39c5baSBill Taylor 	} else {
88*9e39c5baSBill Taylor 		sp_ptr->header.magic = DAPL_MAGIC_RSP;
89*9e39c5baSBill Taylor 		sp_ptr->header.handle_type = DAT_HANDLE_TYPE_RSP;
90*9e39c5baSBill Taylor 	}
91*9e39c5baSBill Taylor 	sp_ptr->header.owner_ia = ia_ptr;
92*9e39c5baSBill Taylor 	sp_ptr->header.user_context.as_64 = 0;
93*9e39c5baSBill Taylor 	sp_ptr->header.user_context.as_ptr = NULL;
94*9e39c5baSBill Taylor 	dapl_llist_init_entry(&sp_ptr->header.ia_list_entry);
95*9e39c5baSBill Taylor 	dapl_os_lock_init(&sp_ptr->header.lock);
96*9e39c5baSBill Taylor 
97*9e39c5baSBill Taylor 	/*
98*9e39c5baSBill Taylor 	 * Initialize the Body (set to NULL above)
99*9e39c5baSBill Taylor 	 */
100*9e39c5baSBill Taylor 	dapl_llist_init_head(&sp_ptr->cr_list_head);
101*9e39c5baSBill Taylor 
102*9e39c5baSBill Taylor 	return (sp_ptr);
103*9e39c5baSBill Taylor }
104*9e39c5baSBill Taylor 
105*9e39c5baSBill Taylor 
106*9e39c5baSBill Taylor /*
107*9e39c5baSBill Taylor  * dapl_sp_free
108*9e39c5baSBill Taylor  *
109*9e39c5baSBill Taylor  * Free the passed in PSP structure.
110*9e39c5baSBill Taylor  *
111*9e39c5baSBill Taylor  * Input:
112*9e39c5baSBill Taylor  * 	entry point pointer
113*9e39c5baSBill Taylor  *
114*9e39c5baSBill Taylor  * Output:
115*9e39c5baSBill Taylor  * 	none
116*9e39c5baSBill Taylor  *
117*9e39c5baSBill Taylor  * Returns:
118*9e39c5baSBill Taylor  * 	none
119*9e39c5baSBill Taylor  *
120*9e39c5baSBill Taylor  */
121*9e39c5baSBill Taylor void
dapls_sp_free_sp(IN DAPL_SP * sp_ptr)122*9e39c5baSBill Taylor dapls_sp_free_sp(
123*9e39c5baSBill Taylor 	IN DAPL_SP *sp_ptr)
124*9e39c5baSBill Taylor {
125*9e39c5baSBill Taylor 	dapl_os_assert(sp_ptr->header.magic == DAPL_MAGIC_PSP ||
126*9e39c5baSBill Taylor 	    sp_ptr->header.magic == DAPL_MAGIC_RSP);
127*9e39c5baSBill Taylor 	dapl_os_assert(dapl_llist_is_empty(&sp_ptr->cr_list_head));
128*9e39c5baSBill Taylor 
129*9e39c5baSBill Taylor 	dapl_os_lock(&sp_ptr->header.lock);
130*9e39c5baSBill Taylor 	/* reset magic to prevent reuse */
131*9e39c5baSBill Taylor 	sp_ptr->header.magic = DAPL_MAGIC_INVALID;
132*9e39c5baSBill Taylor 	dapl_os_unlock(&sp_ptr->header.lock);
133*9e39c5baSBill Taylor 	dapl_os_free(sp_ptr, sizeof (DAPL_SP));
134*9e39c5baSBill Taylor }
135*9e39c5baSBill Taylor 
136*9e39c5baSBill Taylor 
137*9e39c5baSBill Taylor /*
138*9e39c5baSBill Taylor  * dapl_cr_link_cr
139*9e39c5baSBill Taylor  *
140*9e39c5baSBill Taylor  * Add a cr to a PSP structure
141*9e39c5baSBill Taylor  *
142*9e39c5baSBill Taylor  * Input:
143*9e39c5baSBill Taylor  *	sp_ptr
144*9e39c5baSBill Taylor  *	cr_ptr
145*9e39c5baSBill Taylor  *
146*9e39c5baSBill Taylor  * Output:
147*9e39c5baSBill Taylor  * 	none
148*9e39c5baSBill Taylor  *
149*9e39c5baSBill Taylor  * Returns:
150*9e39c5baSBill Taylor  * 	none
151*9e39c5baSBill Taylor  *
152*9e39c5baSBill Taylor  */
153*9e39c5baSBill Taylor void
dapl_sp_link_cr(IN DAPL_SP * sp_ptr,IN DAPL_CR * cr_ptr)154*9e39c5baSBill Taylor dapl_sp_link_cr(
155*9e39c5baSBill Taylor 	IN DAPL_SP *sp_ptr,
156*9e39c5baSBill Taylor 	IN DAPL_CR *cr_ptr)
157*9e39c5baSBill Taylor {
158*9e39c5baSBill Taylor 	dapl_os_lock(&sp_ptr->header.lock);
159*9e39c5baSBill Taylor 	dapl_llist_add_tail(&sp_ptr->cr_list_head,
160*9e39c5baSBill Taylor 	    &cr_ptr->header.ia_list_entry, cr_ptr);
161*9e39c5baSBill Taylor 	sp_ptr->cr_list_count++;
162*9e39c5baSBill Taylor 	dapl_os_unlock(&sp_ptr->header.lock);
163*9e39c5baSBill Taylor }
164*9e39c5baSBill Taylor 
165*9e39c5baSBill Taylor 
166*9e39c5baSBill Taylor /*
167*9e39c5baSBill Taylor  * dapl_sp_search_cr
168*9e39c5baSBill Taylor  *
169*9e39c5baSBill Taylor  * Search for a CR on the PSP cr_list with a matching cm_handle. When
170*9e39c5baSBill Taylor  * found, remove it from the list and update fields.
171*9e39c5baSBill Taylor  *
172*9e39c5baSBill Taylor  * Input:
173*9e39c5baSBill Taylor  *	sp_ptr
174*9e39c5baSBill Taylor  *	ib_cm_handle
175*9e39c5baSBill Taylor  *
176*9e39c5baSBill Taylor  * Output:
177*9e39c5baSBill Taylor  * 	none
178*9e39c5baSBill Taylor  *
179*9e39c5baSBill Taylor  * Returns:
180*9e39c5baSBill Taylor  * 	cr_ptr_fnd	Pointer to matching DAPL_CR
181*9e39c5baSBill Taylor  *
182*9e39c5baSBill Taylor  */
183*9e39c5baSBill Taylor DAPL_CR *
dapl_sp_search_cr(IN DAPL_SP * sp_ptr,IN ib_cm_handle_t ib_cm_handle)184*9e39c5baSBill Taylor dapl_sp_search_cr(
185*9e39c5baSBill Taylor 	IN DAPL_SP *sp_ptr,
186*9e39c5baSBill Taylor 	IN  ib_cm_handle_t ib_cm_handle)
187*9e39c5baSBill Taylor {
188*9e39c5baSBill Taylor 	DAPL_CR	*cr_ptr;
189*9e39c5baSBill Taylor 	DAPL_CR	*cr_ptr_fnd;
190*9e39c5baSBill Taylor 
191*9e39c5baSBill Taylor 	dapl_os_lock(&sp_ptr->header.lock);
192*9e39c5baSBill Taylor 	cr_ptr_fnd = NULL;
193*9e39c5baSBill Taylor 	cr_ptr = (DAPL_CR *) dapl_llist_peek_head(&sp_ptr->cr_list_head);
194*9e39c5baSBill Taylor 
195*9e39c5baSBill Taylor 	do {
196*9e39c5baSBill Taylor 		if (cr_ptr->ib_cm_handle == ib_cm_handle) {
197*9e39c5baSBill Taylor 			cr_ptr_fnd = cr_ptr;
198*9e39c5baSBill Taylor 			break;
199*9e39c5baSBill Taylor 		}
200*9e39c5baSBill Taylor 		cr_ptr = cr_ptr->header.ia_list_entry.flink->data;
201*9e39c5baSBill Taylor 	} while ((void *)cr_ptr != (void *)sp_ptr->cr_list_head->data);
202*9e39c5baSBill Taylor 
203*9e39c5baSBill Taylor 	dapl_os_unlock(&sp_ptr->header.lock);
204*9e39c5baSBill Taylor 	return (cr_ptr_fnd);
205*9e39c5baSBill Taylor }
206*9e39c5baSBill Taylor 
207*9e39c5baSBill Taylor 
208*9e39c5baSBill Taylor 
209*9e39c5baSBill Taylor /*
210*9e39c5baSBill Taylor  * dapl_sp_remove_cr
211*9e39c5baSBill Taylor  *
212*9e39c5baSBill Taylor  * Remove the CR from the PSP. Done prior to freeing the CR resource.
213*9e39c5baSBill Taylor  *
214*9e39c5baSBill Taylor  * Input:
215*9e39c5baSBill Taylor  *	sp_ptr
216*9e39c5baSBill Taylor  *	cr_ptr
217*9e39c5baSBill Taylor  *
218*9e39c5baSBill Taylor  * Output:
219*9e39c5baSBill Taylor  * 	none
220*9e39c5baSBill Taylor  *
221*9e39c5baSBill Taylor  * Returns:
222*9e39c5baSBill Taylor  * 	void
223*9e39c5baSBill Taylor  *
224*9e39c5baSBill Taylor  */
225*9e39c5baSBill Taylor void
dapl_sp_remove_cr(IN DAPL_SP * sp_ptr,IN DAPL_CR * cr_ptr)226*9e39c5baSBill Taylor dapl_sp_remove_cr(
227*9e39c5baSBill Taylor 	IN  DAPL_SP *sp_ptr,
228*9e39c5baSBill Taylor 	IN  DAPL_CR *cr_ptr)
229*9e39c5baSBill Taylor {
230*9e39c5baSBill Taylor 	dapl_os_lock(&sp_ptr->header.lock);
231*9e39c5baSBill Taylor 
232*9e39c5baSBill Taylor 	if (dapl_llist_is_empty(&sp_ptr->cr_list_head)) {
233*9e39c5baSBill Taylor 		dapl_dbg_log(DAPL_DBG_TYPE_ERR,
234*9e39c5baSBill Taylor 		    "***dapl_sp_remove_cr: removing from empty queue! sp %p\n",
235*9e39c5baSBill Taylor 		    sp_ptr);
236*9e39c5baSBill Taylor 		dapl_os_unlock(&sp_ptr->header.lock);
237*9e39c5baSBill Taylor 		return;
238*9e39c5baSBill Taylor 	}
239*9e39c5baSBill Taylor 
240*9e39c5baSBill Taylor 	(void) dapl_llist_remove_entry(&sp_ptr->cr_list_head,
241*9e39c5baSBill Taylor 	    &cr_ptr->header.ia_list_entry);
242*9e39c5baSBill Taylor 	sp_ptr->cr_list_count--;
243*9e39c5baSBill Taylor 
244*9e39c5baSBill Taylor 	dapl_os_unlock(&sp_ptr->header.lock);
245*9e39c5baSBill Taylor }
246