xref: /freebsd/contrib/ofed/opensm/libvendor/osm_vendor_umadt.c (revision 87181516ef48be852d5e5fee53c6e0dbfc62f21e)
1*d6b92ffaSHans Petter Selasky /*
2*d6b92ffaSHans Petter Selasky  * Copyright (c) 2004-2008 Voltaire, Inc. All rights reserved.
3*d6b92ffaSHans Petter Selasky  * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved.
4*d6b92ffaSHans Petter Selasky  * Copyright (c) 1996-2003 Intel Corporation. All rights reserved.
5*d6b92ffaSHans Petter Selasky  *
6*d6b92ffaSHans Petter Selasky  * This software is available to you under a choice of one of two
7*d6b92ffaSHans Petter Selasky  * licenses.  You may choose to be licensed under the terms of the GNU
8*d6b92ffaSHans Petter Selasky  * General Public License (GPL) Version 2, available from the file
9*d6b92ffaSHans Petter Selasky  * COPYING in the main directory of this source tree, or the
10*d6b92ffaSHans Petter Selasky  * OpenIB.org BSD license below:
11*d6b92ffaSHans Petter Selasky  *
12*d6b92ffaSHans Petter Selasky  *     Redistribution and use in source and binary forms, with or
13*d6b92ffaSHans Petter Selasky  *     without modification, are permitted provided that the following
14*d6b92ffaSHans Petter Selasky  *     conditions are met:
15*d6b92ffaSHans Petter Selasky  *
16*d6b92ffaSHans Petter Selasky  *      - Redistributions of source code must retain the above
17*d6b92ffaSHans Petter Selasky  *        copyright notice, this list of conditions and the following
18*d6b92ffaSHans Petter Selasky  *        disclaimer.
19*d6b92ffaSHans Petter Selasky  *
20*d6b92ffaSHans Petter Selasky  *      - Redistributions in binary form must reproduce the above
21*d6b92ffaSHans Petter Selasky  *        copyright notice, this list of conditions and the following
22*d6b92ffaSHans Petter Selasky  *        disclaimer in the documentation and/or other materials
23*d6b92ffaSHans Petter Selasky  *        provided with the distribution.
24*d6b92ffaSHans Petter Selasky  *
25*d6b92ffaSHans Petter Selasky  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
26*d6b92ffaSHans Petter Selasky  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
27*d6b92ffaSHans Petter Selasky  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
28*d6b92ffaSHans Petter Selasky  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
29*d6b92ffaSHans Petter Selasky  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
30*d6b92ffaSHans Petter Selasky  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
31*d6b92ffaSHans Petter Selasky  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
32*d6b92ffaSHans Petter Selasky  * SOFTWARE.
33*d6b92ffaSHans Petter Selasky  *
34*d6b92ffaSHans Petter Selasky  */
35*d6b92ffaSHans Petter Selasky 
36*d6b92ffaSHans Petter Selasky /*
37*d6b92ffaSHans Petter Selasky  * Abstract:
38*d6b92ffaSHans Petter Selasky  *    Implementation of osm_req_t.
39*d6b92ffaSHans Petter Selasky  * This object represents the generic attribute requester.
40*d6b92ffaSHans Petter Selasky  * This object is part of the opensm family of objects.
41*d6b92ffaSHans Petter Selasky  *
42*d6b92ffaSHans Petter Selasky  */
43*d6b92ffaSHans Petter Selasky 
44*d6b92ffaSHans Petter Selasky /*
45*d6b92ffaSHans Petter Selasky   Next available error code: 0x300
46*d6b92ffaSHans Petter Selasky */
47*d6b92ffaSHans Petter Selasky 
48*d6b92ffaSHans Petter Selasky #if HAVE_CONFIG_H
49*d6b92ffaSHans Petter Selasky #  include <config.h>
50*d6b92ffaSHans Petter Selasky #endif				/* HAVE_CONFIG_H */
51*d6b92ffaSHans Petter Selasky 
52*d6b92ffaSHans Petter Selasky #ifdef OSM_VENDOR_INTF_UMADT
53*d6b92ffaSHans Petter Selasky 
54*d6b92ffaSHans Petter Selasky #include <stdlib.h>
55*d6b92ffaSHans Petter Selasky #include <stdio.h>
56*d6b92ffaSHans Petter Selasky #include <dlfcn.h>
57*d6b92ffaSHans Petter Selasky #include <string.h>
58*d6b92ffaSHans Petter Selasky 
59*d6b92ffaSHans Petter Selasky #include <complib/cl_qlist.h>
60*d6b92ffaSHans Petter Selasky #include <complib/cl_thread.h>
61*d6b92ffaSHans Petter Selasky #include <complib/cl_timer.h>
62*d6b92ffaSHans Petter Selasky #include <iba/ib_types.h>
63*d6b92ffaSHans Petter Selasky #include <opensm/osm_madw.h>
64*d6b92ffaSHans Petter Selasky #include <opensm/osm_log.h>
65*d6b92ffaSHans Petter Selasky #include <opensm/osm_mad_pool.h>
66*d6b92ffaSHans Petter Selasky 
67*d6b92ffaSHans Petter Selasky #include <vendor/osm_vendor_umadt.h>
68*d6b92ffaSHans Petter Selasky #include <vendor/osm_umadt.h>
69*d6b92ffaSHans Petter Selasky 
70*d6b92ffaSHans Petter Selasky /*  GEN1 includes */
71*d6b92ffaSHans Petter Selasky #include "umadt_so.h"
72*d6b92ffaSHans Petter Selasky #include "ibt.h"
73*d6b92ffaSHans Petter Selasky #include "statustext.h"
74*d6b92ffaSHans Petter Selasky 
75*d6b92ffaSHans Petter Selasky /* //////////////////////////////////////////////////////////////////////// */
76*d6b92ffaSHans Petter Selasky /* //////////////////////////////////////////////////////////////////////// */
77*d6b92ffaSHans Petter Selasky /* //////////////////////////////////////////////////////////////////////// */
78*d6b92ffaSHans Petter Selasky /* //////////////////////////////////////////////////////////////////////// */
79*d6b92ffaSHans Petter Selasky /* //////////////////////////////////////////////////////////////////////// */
80*d6b92ffaSHans Petter Selasky /*  */
81*d6b92ffaSHans Petter Selasky /*      VENDOR_MAD_INTF */
82*d6b92ffaSHans Petter Selasky /*  */
83*d6b92ffaSHans Petter Selasky /* //////////////////////////////////////////////////////////////////////// */
84*d6b92ffaSHans Petter Selasky /* //////////////////////////////////////////////////////////////////////// */
85*d6b92ffaSHans Petter Selasky /* //////////////////////////////////////////////////////////////////////// */
86*d6b92ffaSHans Petter Selasky /* //////////////////////////////////////////////////////////////////////// */
87*d6b92ffaSHans Petter Selasky /* //////////////////////////////////////////////////////////////////////// */
88*d6b92ffaSHans Petter Selasky 
89*d6b92ffaSHans Petter Selasky /* //////////////////// */
90*d6b92ffaSHans Petter Selasky /*  Globals        // */
91*d6b92ffaSHans Petter Selasky /* //////////////////// */
92*d6b92ffaSHans Petter Selasky typedef struct _ib_sa_mad_vM3 {
93*d6b92ffaSHans Petter Selasky 	uint8_t base_ver;
94*d6b92ffaSHans Petter Selasky 	uint8_t mgmt_class;
95*d6b92ffaSHans Petter Selasky 	uint8_t class_ver;
96*d6b92ffaSHans Petter Selasky 	uint8_t method;
97*d6b92ffaSHans Petter Selasky 	ib_net16_t status;
98*d6b92ffaSHans Petter Selasky 	ib_net16_t resv;
99*d6b92ffaSHans Petter Selasky 	ib_net64_t trans_id;
100*d6b92ffaSHans Petter Selasky 	ib_net16_t attr_id;
101*d6b92ffaSHans Petter Selasky 	ib_net16_t resv1;
102*d6b92ffaSHans Petter Selasky 	ib_net32_t attr_mod;
103*d6b92ffaSHans Petter Selasky 	ib_net64_t resv2;
104*d6b92ffaSHans Petter Selasky 	ib_net64_t sm_key;
105*d6b92ffaSHans Petter Selasky 
106*d6b92ffaSHans Petter Selasky 	ib_net32_t seg_num;
107*d6b92ffaSHans Petter Selasky 	ib_net32_t payload_len;
108*d6b92ffaSHans Petter Selasky 	uint8_t frag_flag;
109*d6b92ffaSHans Petter Selasky 	uint8_t edit_mod;
110*d6b92ffaSHans Petter Selasky 	ib_net16_t window;
111*d6b92ffaSHans Petter Selasky 	ib_net16_t attr_offset;
112*d6b92ffaSHans Petter Selasky 	ib_net16_t resv3;
113*d6b92ffaSHans Petter Selasky 
114*d6b92ffaSHans Petter Selasky 	ib_net64_t comp_mask;
115*d6b92ffaSHans Petter Selasky 
116*d6b92ffaSHans Petter Selasky 	uint8_t data[IB_SA_DATA_SIZE];
117*d6b92ffaSHans Petter Selasky } ib_sa_mad_t_vM3;
118*d6b92ffaSHans Petter Selasky #define  DEFAULT_TIMER_INTERVAL_MSEC   500	/*  500msec timer interval */
119*d6b92ffaSHans Petter Selasky 
120*d6b92ffaSHans Petter Selasky void __mad_recv_processor(void *context);
121*d6b92ffaSHans Petter Selasky 
122*d6b92ffaSHans Petter Selasky boolean_t __valid_mad_handle(IN mad_bind_info_t * p_mad_bind_info);
123*d6b92ffaSHans Petter Selasky 
124*d6b92ffaSHans Petter Selasky cl_status_t
125*d6b92ffaSHans Petter Selasky __match_tid_context(const cl_list_item_t * const p_list_item, void *context);
126*d6b92ffaSHans Petter Selasky void __osm_vendor_timer_callback(IN void *context);
127*d6b92ffaSHans Petter Selasky 
osm_vendor_new(IN osm_log_t * const p_log,IN const uint32_t timeout)128*d6b92ffaSHans Petter Selasky osm_vendor_t *osm_vendor_new(IN osm_log_t * const p_log,
129*d6b92ffaSHans Petter Selasky 			     IN const uint32_t timeout)
130*d6b92ffaSHans Petter Selasky {
131*d6b92ffaSHans Petter Selasky 	ib_api_status_t status;
132*d6b92ffaSHans Petter Selasky 	umadt_obj_t *p_umadt_obj;
133*d6b92ffaSHans Petter Selasky 
134*d6b92ffaSHans Petter Selasky 	OSM_LOG_ENTER(p_log);
135*d6b92ffaSHans Petter Selasky 
136*d6b92ffaSHans Petter Selasky 	p_umadt_obj = malloc(sizeof(umadt_obj_t));
137*d6b92ffaSHans Petter Selasky 	if (p_umadt_obj) {
138*d6b92ffaSHans Petter Selasky 		memset(p_umadt_obj, 0, sizeof(umadt_obj_t));
139*d6b92ffaSHans Petter Selasky 
140*d6b92ffaSHans Petter Selasky 		status = osm_vendor_init((osm_vendor_t *) p_umadt_obj, p_log,
141*d6b92ffaSHans Petter Selasky 					 timeout);
142*d6b92ffaSHans Petter Selasky 		if (status != IB_SUCCESS) {
143*d6b92ffaSHans Petter Selasky 			osm_vendor_delete((osm_vendor_t **) & p_umadt_obj);
144*d6b92ffaSHans Petter Selasky 		}
145*d6b92ffaSHans Petter Selasky 	} else {
146*d6b92ffaSHans Petter Selasky 		printf
147*d6b92ffaSHans Petter Selasky 		    ("osm_vendor_construct: ERROR! Unable to create Umadt object!\n");
148*d6b92ffaSHans Petter Selasky 	}
149*d6b92ffaSHans Petter Selasky 
150*d6b92ffaSHans Petter Selasky 	OSM_LOG_EXIT(p_log);
151*d6b92ffaSHans Petter Selasky 
152*d6b92ffaSHans Petter Selasky 	return ((osm_vendor_t *) p_umadt_obj);
153*d6b92ffaSHans Petter Selasky }
154*d6b92ffaSHans Petter Selasky 
osm_vendor_delete(IN osm_vendor_t ** const pp_vend)155*d6b92ffaSHans Petter Selasky void osm_vendor_delete(IN osm_vendor_t ** const pp_vend)
156*d6b92ffaSHans Petter Selasky {
157*d6b92ffaSHans Petter Selasky 	umadt_obj_t *p_umadt_obj = (umadt_obj_t *) * pp_vend;
158*d6b92ffaSHans Petter Selasky 	cl_list_item_t *p_list_item;
159*d6b92ffaSHans Petter Selasky 	uint32_t count, i;
160*d6b92ffaSHans Petter Selasky 	mad_bind_info_t *p_mad_bind_info;
161*d6b92ffaSHans Petter Selasky 
162*d6b92ffaSHans Petter Selasky 	OSM_LOG_ENTER(p_umadt_obj->p_log);
163*d6b92ffaSHans Petter Selasky 
164*d6b92ffaSHans Petter Selasky 	cl_spinlock_acquire(&p_umadt_obj->register_lock);
165*d6b92ffaSHans Petter Selasky 	p_mad_bind_info =
166*d6b92ffaSHans Petter Selasky 	    (mad_bind_info_t *) cl_qlist_head(&p_umadt_obj->register_list);
167*d6b92ffaSHans Petter Selasky 	count = cl_qlist_count(&p_umadt_obj->register_list);
168*d6b92ffaSHans Petter Selasky 	cl_spinlock_release(&p_umadt_obj->register_lock);
169*d6b92ffaSHans Petter Selasky 	for (i = 0; i < count; i++) {
170*d6b92ffaSHans Petter Selasky 		cl_spinlock_acquire(&p_umadt_obj->register_lock);
171*d6b92ffaSHans Petter Selasky 		p_list_item = cl_qlist_next(&p_mad_bind_info->list_item);
172*d6b92ffaSHans Petter Selasky 		cl_spinlock_release(&p_umadt_obj->register_lock);
173*d6b92ffaSHans Petter Selasky 		/*  Unbind this handle */
174*d6b92ffaSHans Petter Selasky 		/*  osm_vendor_ubind also removesd the item from the list */
175*d6b92ffaSHans Petter Selasky 		/*  osm_vendor_unbind takes the list lock so release it here */
176*d6b92ffaSHans Petter Selasky 		osm_vendor_unbind((osm_bind_handle_t) p_mad_bind_info);
177*d6b92ffaSHans Petter Selasky 		p_mad_bind_info = (mad_bind_info_t *) p_list_item;
178*d6b92ffaSHans Petter Selasky 	}
179*d6b92ffaSHans Petter Selasky 	dlclose(p_umadt_obj->umadt_handle);
180*d6b92ffaSHans Petter Selasky 	free(p_umadt_obj);
181*d6b92ffaSHans Petter Selasky 	*pp_vend = NULL;
182*d6b92ffaSHans Petter Selasky 
183*d6b92ffaSHans Petter Selasky 	OSM_LOG_EXIT(p_umadt_obj->p_log);
184*d6b92ffaSHans Petter Selasky }
185*d6b92ffaSHans Petter Selasky 
186*d6b92ffaSHans Petter Selasky /* //////////////////////////////////////////////////////////////////////// */
187*d6b92ffaSHans Petter Selasky /*  See VendorAbstractMadIntf.h for info */
188*d6b92ffaSHans Petter Selasky /* //////////////////////////////////////////////////////////////////////// */
189*d6b92ffaSHans Petter Selasky /*  */
190*d6b92ffaSHans Petter Selasky ib_api_status_t
osm_vendor_init(IN osm_vendor_t * const p_vend,IN osm_log_t * const p_log,IN const uint32_t timeout)191*d6b92ffaSHans Petter Selasky osm_vendor_init(IN osm_vendor_t * const p_vend,
192*d6b92ffaSHans Petter Selasky 		IN osm_log_t * const p_log, IN const uint32_t timeout)
193*d6b92ffaSHans Petter Selasky {
194*d6b92ffaSHans Petter Selasky 	FSTATUS Status;
195*d6b92ffaSHans Petter Selasky 	PUMADT_GET_INTERFACE uMadtGetInterface;
196*d6b92ffaSHans Petter Selasky 	char *error;
197*d6b92ffaSHans Petter Selasky 	umadt_obj_t *p_umadt_obj = (umadt_obj_t *) p_vend;
198*d6b92ffaSHans Petter Selasky 
199*d6b92ffaSHans Petter Selasky 	OSM_LOG_ENTER(p_log);
200*d6b92ffaSHans Petter Selasky 
201*d6b92ffaSHans Petter Selasky 	p_umadt_obj->p_log = p_log;
202*d6b92ffaSHans Petter Selasky 	p_umadt_obj->timeout = timeout;
203*d6b92ffaSHans Petter Selasky 
204*d6b92ffaSHans Petter Selasky 	p_umadt_obj->umadt_handle = dlopen("libibt.so", RTLD_NOW);
205*d6b92ffaSHans Petter Selasky 
206*d6b92ffaSHans Petter Selasky 	if (!p_umadt_obj->umadt_handle) {
207*d6b92ffaSHans Petter Selasky 		printf("Could not load libibt.so <%s>\n", dlerror());
208*d6b92ffaSHans Petter Selasky 		return IB_ERROR;
209*d6b92ffaSHans Petter Selasky 	}
210*d6b92ffaSHans Petter Selasky 	uMadtGetInterface =
211*d6b92ffaSHans Petter Selasky 	    dlsym(p_umadt_obj->umadt_handle, "uMadtGetInterface");
212*d6b92ffaSHans Petter Selasky 	if ((error = dlerror()) != NULL) {
213*d6b92ffaSHans Petter Selasky 		printf("Could not resolve symbol uMadtGetInterface ERROR<%s>\n",
214*d6b92ffaSHans Petter Selasky 		       error);
215*d6b92ffaSHans Petter Selasky 		return IB_ERROR;
216*d6b92ffaSHans Petter Selasky 	}
217*d6b92ffaSHans Petter Selasky 
218*d6b92ffaSHans Petter Selasky 	Status = (*uMadtGetInterface) (&p_umadt_obj->uMadtInterface);
219*d6b92ffaSHans Petter Selasky 	if (Status != FSUCCESS) {
220*d6b92ffaSHans Petter Selasky 		printf(" Error in getting uMADT interface ERROR<%d>\n", Status);
221*d6b92ffaSHans Petter Selasky 		return IB_ERROR;
222*d6b92ffaSHans Petter Selasky 	}
223*d6b92ffaSHans Petter Selasky 
224*d6b92ffaSHans Petter Selasky 	/*  Initialize the register list and register list lock */
225*d6b92ffaSHans Petter Selasky 	cl_qlist_init(&p_umadt_obj->register_list);
226*d6b92ffaSHans Petter Selasky 
227*d6b92ffaSHans Petter Selasky 	cl_spinlock_construct(&p_umadt_obj->register_lock);
228*d6b92ffaSHans Petter Selasky 	CL_ASSERT(cl_spinlock_init(&p_umadt_obj->register_lock) == CL_SUCCESS);
229*d6b92ffaSHans Petter Selasky 	p_umadt_obj->init_done = TRUE;
230*d6b92ffaSHans Petter Selasky 	printf("*****SUCCESS*****\n");
231*d6b92ffaSHans Petter Selasky 
232*d6b92ffaSHans Petter Selasky 	OSM_LOG_EXIT(p_log);
233*d6b92ffaSHans Petter Selasky 	return IB_SUCCESS;
234*d6b92ffaSHans Petter Selasky 
235*d6b92ffaSHans Petter Selasky }
236*d6b92ffaSHans Petter Selasky 
237*d6b92ffaSHans Petter Selasky /* //////////////////////////////////////////////////////////////////////// */
238*d6b92ffaSHans Petter Selasky /*  See VendorAbstractMadIntf.h for info */
239*d6b92ffaSHans Petter Selasky /* //////////////////////////////////////////////////////////////////////// */
240*d6b92ffaSHans Petter Selasky ib_api_status_t
osm_vendor_get_ports(IN osm_vendor_t * const p_vend,IN ib_net64_t * const p_guids,IN uint32_t * const p_num_guids)241*d6b92ffaSHans Petter Selasky osm_vendor_get_ports(IN osm_vendor_t * const p_vend,
242*d6b92ffaSHans Petter Selasky 		     IN ib_net64_t * const p_guids,
243*d6b92ffaSHans Petter Selasky 		     IN uint32_t * const p_num_guids)
244*d6b92ffaSHans Petter Selasky {
245*d6b92ffaSHans Petter Selasky 	char *error = NULL;
246*d6b92ffaSHans Petter Selasky 	PIBT_GET_INTERFACE pfnIbtGetInterface;
247*d6b92ffaSHans Petter Selasky 	PIBT_INIT pfnIbtInitFunc;
248*d6b92ffaSHans Petter Selasky 
249*d6b92ffaSHans Petter Selasky 	FSTATUS Status;
250*d6b92ffaSHans Petter Selasky 	uint32_t caCount, caGuidCount;
251*d6b92ffaSHans Petter Selasky 	IB_CA_ATTRIBUTES caAttributes;
252*d6b92ffaSHans Petter Selasky 	IB_HANDLE caHandle;
253*d6b92ffaSHans Petter Selasky 	uint32_t i;
254*d6b92ffaSHans Petter Selasky 	IB_PORT_ATTRIBUTES *pPortAttributesList;
255*d6b92ffaSHans Petter Selasky 	EUI64 CaGuidArray[8];
256*d6b92ffaSHans Petter Selasky 	void *context;
257*d6b92ffaSHans Petter Selasky 	uint64_t *p_port_guid;
258*d6b92ffaSHans Petter Selasky 	uint32_t free_guids;
259*d6b92ffaSHans Petter Selasky 
260*d6b92ffaSHans Petter Selasky 	umadt_obj_t *p_umadt_obj = (umadt_obj_t *) p_vend;
261*d6b92ffaSHans Petter Selasky 
262*d6b92ffaSHans Petter Selasky 	OSM_LOG_ENTER(p_umadt_obj->p_log);
263*d6b92ffaSHans Petter Selasky 
264*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_guids);
265*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_num_guids);
266*d6b92ffaSHans Petter Selasky 
267*d6b92ffaSHans Petter Selasky 	pfnIbtInitFunc =
268*d6b92ffaSHans Petter Selasky 	    (PIBT_INIT) dlsym(p_umadt_obj->umadt_handle, "IbtInit");
269*d6b92ffaSHans Petter Selasky 
270*d6b92ffaSHans Petter Selasky 	if (!pfnIbtInitFunc) {
271*d6b92ffaSHans Petter Selasky 		printf("Error getting IbtInit function address.\n");
272*d6b92ffaSHans Petter Selasky 		return IB_ERROR;
273*d6b92ffaSHans Petter Selasky 	}
274*d6b92ffaSHans Petter Selasky 
275*d6b92ffaSHans Petter Selasky 	(*pfnIbtInitFunc) ();
276*d6b92ffaSHans Petter Selasky 
277*d6b92ffaSHans Petter Selasky 	pfnIbtGetInterface =
278*d6b92ffaSHans Petter Selasky 	    (PIBT_GET_INTERFACE) dlsym(p_umadt_obj->umadt_handle,
279*d6b92ffaSHans Petter Selasky 				       "IbtGetInterface");
280*d6b92ffaSHans Petter Selasky 
281*d6b92ffaSHans Petter Selasky 	if (!pfnIbtGetInterface || (error = dlerror()) != NULL) {
282*d6b92ffaSHans Petter Selasky 		printf("Error getting IbtGetInterface function address.<%s>\n",
283*d6b92ffaSHans Petter Selasky 		       error);
284*d6b92ffaSHans Petter Selasky 		return FALSE;
285*d6b92ffaSHans Petter Selasky 	}
286*d6b92ffaSHans Petter Selasky 	(*pfnIbtGetInterface) (&p_umadt_obj->IbtInterface);
287*d6b92ffaSHans Petter Selasky 
288*d6b92ffaSHans Petter Selasky 	caGuidCount = 8;
289*d6b92ffaSHans Petter Selasky 	Status =
290*d6b92ffaSHans Petter Selasky 	    p_umadt_obj->IbtInterface.GetCaGuidArray(&caGuidCount,
291*d6b92ffaSHans Petter Selasky 						     &CaGuidArray[0]);
292*d6b92ffaSHans Petter Selasky 
293*d6b92ffaSHans Petter Selasky 	if ((Status != FSUCCESS) || (caGuidCount == 0)) {
294*d6b92ffaSHans Petter Selasky 		return FALSE;
295*d6b92ffaSHans Petter Selasky 	}
296*d6b92ffaSHans Petter Selasky 
297*d6b92ffaSHans Petter Selasky 	free_guids = *p_num_guids;
298*d6b92ffaSHans Petter Selasky 	p_port_guid = p_guids;
299*d6b92ffaSHans Petter Selasky 
300*d6b92ffaSHans Petter Selasky 	/* query each ca & copy its info into callers buffer */
301*d6b92ffaSHans Petter Selasky 	for (caCount = 0; caCount < caGuidCount; caCount++) {
302*d6b92ffaSHans Petter Selasky 		memset(&caAttributes, 0, sizeof(IB_CA_ATTRIBUTES));
303*d6b92ffaSHans Petter Selasky 
304*d6b92ffaSHans Petter Selasky 		/* Open the CA */
305*d6b92ffaSHans Petter Selasky 		Status = p_umadt_obj->IbtInterface.Vpi.OpenCA(CaGuidArray[caCount], NULL,	/*  CACompletionCallback */
306*d6b92ffaSHans Petter Selasky 							      NULL,	/*  AsyncEventCallback */
307*d6b92ffaSHans Petter Selasky 							      NULL, &caHandle);
308*d6b92ffaSHans Petter Selasky 		if (Status != FSUCCESS) {
309*d6b92ffaSHans Petter Selasky 			return IB_ERROR;
310*d6b92ffaSHans Petter Selasky 		}
311*d6b92ffaSHans Petter Selasky 
312*d6b92ffaSHans Petter Selasky 		Status = p_umadt_obj->IbtInterface.Vpi.QueryCA(caHandle,
313*d6b92ffaSHans Petter Selasky 							       &caAttributes,
314*d6b92ffaSHans Petter Selasky 							       &context);
315*d6b92ffaSHans Petter Selasky 
316*d6b92ffaSHans Petter Selasky 		if (Status != FSUCCESS) {
317*d6b92ffaSHans Petter Selasky 			p_umadt_obj->IbtInterface.Vpi.CloseCA(caHandle);
318*d6b92ffaSHans Petter Selasky 			return IB_ERROR;
319*d6b92ffaSHans Petter Selasky 		}
320*d6b92ffaSHans Petter Selasky 
321*d6b92ffaSHans Petter Selasky 		if (caAttributes.Ports > free_guids) {
322*d6b92ffaSHans Petter Selasky 			*p_num_guids = 0;
323*d6b92ffaSHans Petter Selasky 			memset(p_guids, 0, (*p_num_guids) * sizeof(uint64_t));
324*d6b92ffaSHans Petter Selasky 			return IB_INSUFFICIENT_MEMORY;
325*d6b92ffaSHans Petter Selasky 		}
326*d6b92ffaSHans Petter Selasky 
327*d6b92ffaSHans Petter Selasky 		pPortAttributesList =
328*d6b92ffaSHans Petter Selasky 		    (IB_PORT_ATTRIBUTES *) malloc(caAttributes.
329*d6b92ffaSHans Petter Selasky 						  PortAttributesListSize);
330*d6b92ffaSHans Petter Selasky 
331*d6b92ffaSHans Petter Selasky 		if (pPortAttributesList == NULL) {
332*d6b92ffaSHans Petter Selasky 			p_umadt_obj->IbtInterface.Vpi.CloseCA(caHandle);
333*d6b92ffaSHans Petter Selasky 			*p_num_guids = 0;
334*d6b92ffaSHans Petter Selasky 			memset(p_guids, 0, (*p_num_guids) * sizeof(uint64_t));
335*d6b92ffaSHans Petter Selasky 			return IB_INSUFFICIENT_MEMORY;
336*d6b92ffaSHans Petter Selasky 		}
337*d6b92ffaSHans Petter Selasky 
338*d6b92ffaSHans Petter Selasky 		memset(pPortAttributesList, 0,
339*d6b92ffaSHans Petter Selasky 		       caAttributes.PortAttributesListSize);
340*d6b92ffaSHans Petter Selasky 
341*d6b92ffaSHans Petter Selasky 		caAttributes.PortAttributesList = pPortAttributesList;
342*d6b92ffaSHans Petter Selasky 
343*d6b92ffaSHans Petter Selasky 		Status = p_umadt_obj->IbtInterface.Vpi.QueryCA(caHandle,
344*d6b92ffaSHans Petter Selasky 							       &caAttributes,
345*d6b92ffaSHans Petter Selasky 							       &context);
346*d6b92ffaSHans Petter Selasky 
347*d6b92ffaSHans Petter Selasky 		if (Status != FSUCCESS) {
348*d6b92ffaSHans Petter Selasky 			p_umadt_obj->IbtInterface.Vpi.CloseCA(caHandle);
349*d6b92ffaSHans Petter Selasky 			*p_num_guids = 0;
350*d6b92ffaSHans Petter Selasky 			memset(p_guids, 0, (*p_num_guids) * sizeof(uint64_t));
351*d6b92ffaSHans Petter Selasky 			return IB_ERROR;
352*d6b92ffaSHans Petter Selasky 		}
353*d6b92ffaSHans Petter Selasky 
354*d6b92ffaSHans Petter Selasky 		pPortAttributesList = caAttributes.PortAttributesList;
355*d6b92ffaSHans Petter Selasky 
356*d6b92ffaSHans Petter Selasky 		for (i = 0; i < caAttributes.Ports; i++) {
357*d6b92ffaSHans Petter Selasky 			*(p_port_guid) =
358*d6b92ffaSHans Petter Selasky 			    cl_hton64((uint64_t) pPortAttributesList->GUID);
359*d6b92ffaSHans Petter Selasky 			pPortAttributesList = pPortAttributesList->Next;
360*d6b92ffaSHans Petter Selasky 			p_port_guid++;
361*d6b92ffaSHans Petter Selasky 		}
362*d6b92ffaSHans Petter Selasky 		free(caAttributes.PortAttributesList);
363*d6b92ffaSHans Petter Selasky 		p_umadt_obj->IbtInterface.Vpi.CloseCA(caHandle);
364*d6b92ffaSHans Petter Selasky 
365*d6b92ffaSHans Petter Selasky 		free_guids = free_guids - caAttributes.Ports;
366*d6b92ffaSHans Petter Selasky 
367*d6b92ffaSHans Petter Selasky 	}
368*d6b92ffaSHans Petter Selasky 	*p_num_guids = *p_num_guids - free_guids;
369*d6b92ffaSHans Petter Selasky 	return IB_SUCCESS;
370*d6b92ffaSHans Petter Selasky }
371*d6b92ffaSHans Petter Selasky 
372*d6b92ffaSHans Petter Selasky /* //////////////////////////////////////////////////////////////////////// */
373*d6b92ffaSHans Petter Selasky /*  See VendorAbstractMadIntf.h for info */
374*d6b92ffaSHans Petter Selasky /* //////////////////////////////////////////////////////////////////////// */
osm_vendor_get(IN osm_bind_handle_t h_bind,IN const uint32_t mad_size,IN osm_vend_wrap_t * p_vend_wrap)375*d6b92ffaSHans Petter Selasky ib_mad_t *osm_vendor_get(IN osm_bind_handle_t h_bind,
376*d6b92ffaSHans Petter Selasky 			 IN const uint32_t mad_size,
377*d6b92ffaSHans Petter Selasky 			 IN osm_vend_wrap_t * p_vend_wrap)
378*d6b92ffaSHans Petter Selasky {
379*d6b92ffaSHans Petter Selasky 	/* FSTATUS Status; */
380*d6b92ffaSHans Petter Selasky 	/* uint32_t mad_count = 0; */
381*d6b92ffaSHans Petter Selasky 	/* MadtStruct *p_madt_struct; */
382*d6b92ffaSHans Petter Selasky 	mad_bind_info_t *p_mad_bind_info = (mad_bind_info_t *) h_bind;
383*d6b92ffaSHans Petter Selasky 	umadt_obj_t *p_umadt_obj = p_mad_bind_info->p_umadt_obj;
384*d6b92ffaSHans Petter Selasky 	ib_mad_t *p_mad;
385*d6b92ffaSHans Petter Selasky 	OSM_LOG_ENTER(p_umadt_obj->p_log);
386*d6b92ffaSHans Petter Selasky 
387*d6b92ffaSHans Petter Selasky 	CL_ASSERT(h_bind);
388*d6b92ffaSHans Petter Selasky 
389*d6b92ffaSHans Petter Selasky 	p_umadt_obj = p_mad_bind_info->p_umadt_obj;
390*d6b92ffaSHans Petter Selasky 
391*d6b92ffaSHans Petter Selasky 	/*  Sanity check */
392*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_umadt_obj->init_done);
393*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_vend_wrap);
394*d6b92ffaSHans Petter Selasky 	CL_ASSERT(__valid_mad_handle(p_mad_bind_info));
395*d6b92ffaSHans Petter Selasky 
396*d6b92ffaSHans Petter Selasky #if 0
397*d6b92ffaSHans Petter Selasky 	mad_count = 1;
398*d6b92ffaSHans Petter Selasky 	Status =
399*d6b92ffaSHans Petter Selasky 	    p_umadt_obj->uMadtInterface.uMadtGetSendMad(p_mad_bind_info->
400*d6b92ffaSHans Petter Selasky 							umadt_handle,
401*d6b92ffaSHans Petter Selasky 							&mad_count,
402*d6b92ffaSHans Petter Selasky 							&p_madt_struct);
403*d6b92ffaSHans Petter Selasky 
404*d6b92ffaSHans Petter Selasky 	if (Status != FSUCCESS || p_madt_struct == NULL) {
405*d6b92ffaSHans Petter Selasky 		p_vend_wrap->p_madt_struct = NULL;
406*d6b92ffaSHans Petter Selasky 		return NULL;
407*d6b92ffaSHans Petter Selasky 	}
408*d6b92ffaSHans Petter Selasky 	p_vend_wrap->p_madt_struct = p_madt_struct;
409*d6b92ffaSHans Petter Selasky 	p_vend_wrap->direction = SEND;
410*d6b92ffaSHans Petter Selasky 	return ((ib_mad_t *) & p_madt_struct->IBMad);
411*d6b92ffaSHans Petter Selasky #endif				/*  0 */
412*d6b92ffaSHans Petter Selasky 	p_mad = (ib_mad_t *) malloc(mad_size);
413*d6b92ffaSHans Petter Selasky 	if (!p_mad) {
414*d6b92ffaSHans Petter Selasky 		p_vend_wrap->p_madt_struct = NULL;
415*d6b92ffaSHans Petter Selasky 		return NULL;
416*d6b92ffaSHans Petter Selasky 	}
417*d6b92ffaSHans Petter Selasky 
418*d6b92ffaSHans Petter Selasky 	memset(p_mad, 0, mad_size);
419*d6b92ffaSHans Petter Selasky 
420*d6b92ffaSHans Petter Selasky 	p_vend_wrap->p_madt_struct = NULL;
421*d6b92ffaSHans Petter Selasky 	p_vend_wrap->direction = SEND;
422*d6b92ffaSHans Petter Selasky 	p_vend_wrap->size = mad_size;
423*d6b92ffaSHans Petter Selasky 	return (p_mad);
424*d6b92ffaSHans Petter Selasky 
425*d6b92ffaSHans Petter Selasky }
426*d6b92ffaSHans Petter Selasky 
427*d6b92ffaSHans Petter Selasky /* //////////////////////////////////////////////////////////////////////// */
428*d6b92ffaSHans Petter Selasky /*  See VendorAbstractMadIntf.h for info */
429*d6b92ffaSHans Petter Selasky /* //////////////////////////////////////////////////////////////////////// */
430*d6b92ffaSHans Petter Selasky void
osm_vendor_put(IN osm_bind_handle_t h_bind,IN osm_vend_wrap_t * const p_vend_wrap,IN ib_mad_t * const p_mad)431*d6b92ffaSHans Petter Selasky osm_vendor_put(IN osm_bind_handle_t h_bind,
432*d6b92ffaSHans Petter Selasky 	       IN osm_vend_wrap_t * const p_vend_wrap,
433*d6b92ffaSHans Petter Selasky 	       IN ib_mad_t * const p_mad)
434*d6b92ffaSHans Petter Selasky {
435*d6b92ffaSHans Petter Selasky 
436*d6b92ffaSHans Petter Selasky 	FSTATUS Status;
437*d6b92ffaSHans Petter Selasky 
438*d6b92ffaSHans Petter Selasky 	mad_bind_info_t *p_mad_bind_info;
439*d6b92ffaSHans Petter Selasky 	umadt_obj_t *p_umadt_obj;
440*d6b92ffaSHans Petter Selasky 
441*d6b92ffaSHans Petter Selasky 	/*  */
442*d6b92ffaSHans Petter Selasky 	/*  Validate the vendor mad transport handle */
443*d6b92ffaSHans Petter Selasky 	/*  */
444*d6b92ffaSHans Petter Selasky 	CL_ASSERT(h_bind);
445*d6b92ffaSHans Petter Selasky 	p_mad_bind_info = (mad_bind_info_t *) h_bind;
446*d6b92ffaSHans Petter Selasky 	p_umadt_obj = p_mad_bind_info->p_umadt_obj;
447*d6b92ffaSHans Petter Selasky 
448*d6b92ffaSHans Petter Selasky 	/*  sanity check */
449*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_umadt_obj->init_done);
450*d6b92ffaSHans Petter Selasky 	CL_ASSERT(h_bind);
451*d6b92ffaSHans Petter Selasky 	CL_ASSERT(__valid_mad_handle(p_mad_bind_info));
452*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_vend_wrap);
453*d6b92ffaSHans Petter Selasky 	/* CL_ASSERT( (ib_mad_t*)&p_vend_wrap->p_madt_struct->IBMad == p_mad ); */
454*d6b92ffaSHans Petter Selasky 
455*d6b92ffaSHans Petter Selasky 	/*  Release the MAD based on the direction of the MAD */
456*d6b92ffaSHans Petter Selasky 	if (p_vend_wrap->direction == SEND) {
457*d6b92ffaSHans Petter Selasky 		/*  */
458*d6b92ffaSHans Petter Selasky 		/* For a send the PostSend released the MAD with Umadt. Simply dealloacte the */
459*d6b92ffaSHans Petter Selasky 		/* local memory that was allocated on the osm_vendor_get() call. */
460*d6b92ffaSHans Petter Selasky 		/*  */
461*d6b92ffaSHans Petter Selasky 		free(p_mad);
462*d6b92ffaSHans Petter Selasky #if 0
463*d6b92ffaSHans Petter Selasky 		Status =
464*d6b92ffaSHans Petter Selasky 		    p_umadt_obj->uMadtInterface.
465*d6b92ffaSHans Petter Selasky 		    uMadtReleaseSendMad(p_mad_bind_info->umadt_handle,
466*d6b92ffaSHans Petter Selasky 					p_vend_wrap->p_madt_struct);
467*d6b92ffaSHans Petter Selasky 		if (Status != FSUCCESS) {
468*d6b92ffaSHans Petter Selasky 			/* printf("uMadtReleaseSendMad: Status  = <%d>\n", Status); */
469*d6b92ffaSHans Petter Selasky 			return;
470*d6b92ffaSHans Petter Selasky 		}
471*d6b92ffaSHans Petter Selasky #endif
472*d6b92ffaSHans Petter Selasky 	} else if (p_vend_wrap->direction == RECEIVE) {
473*d6b92ffaSHans Petter Selasky 		CL_ASSERT((ib_mad_t *) & p_vend_wrap->p_madt_struct->IBMad ==
474*d6b92ffaSHans Petter Selasky 			  p_mad);
475*d6b92ffaSHans Petter Selasky 		Status =
476*d6b92ffaSHans Petter Selasky 		    p_umadt_obj->uMadtInterface.
477*d6b92ffaSHans Petter Selasky 		    uMadtReleaseRecvMad(p_mad_bind_info->umadt_handle,
478*d6b92ffaSHans Petter Selasky 					p_vend_wrap->p_madt_struct);
479*d6b92ffaSHans Petter Selasky 		if (Status != FSUCCESS) {
480*d6b92ffaSHans Petter Selasky 			/* printf("uMadtReleaseRecvMad Status=<%d>\n", Status); */
481*d6b92ffaSHans Petter Selasky 			return;
482*d6b92ffaSHans Petter Selasky 		}
483*d6b92ffaSHans Petter Selasky 	} else {
484*d6b92ffaSHans Petter Selasky 		return;
485*d6b92ffaSHans Petter Selasky 	}
486*d6b92ffaSHans Petter Selasky 	return;
487*d6b92ffaSHans Petter Selasky }
488*d6b92ffaSHans Petter Selasky 
489*d6b92ffaSHans Petter Selasky /* //////////////////////////////////////////////////////////////////////// */
490*d6b92ffaSHans Petter Selasky /*  See VendorAbstractMadIntf.h for info */
491*d6b92ffaSHans Petter Selasky /* //////////////////////////////////////////////////////////////////////// */
492*d6b92ffaSHans Petter Selasky ib_api_status_t
osm_vendor_send(IN osm_bind_handle_t h_bind,IN osm_vend_wrap_t * const p_vend_wrap,IN osm_mad_addr_t * const p_mad_addr,IN ib_mad_t * const p_mad,IN void * transaction_context,IN boolean_t const resp_expected)493*d6b92ffaSHans Petter Selasky osm_vendor_send(IN osm_bind_handle_t h_bind,
494*d6b92ffaSHans Petter Selasky 		IN osm_vend_wrap_t * const p_vend_wrap,
495*d6b92ffaSHans Petter Selasky 		IN osm_mad_addr_t * const p_mad_addr,
496*d6b92ffaSHans Petter Selasky 		IN ib_mad_t * const p_mad,
497*d6b92ffaSHans Petter Selasky 		IN void *transaction_context, IN boolean_t const resp_expected)
498*d6b92ffaSHans Petter Selasky {
499*d6b92ffaSHans Petter Selasky 	FSTATUS Status;
500*d6b92ffaSHans Petter Selasky 
501*d6b92ffaSHans Petter Selasky 	MadAddrStruct destAddr = { 0 };
502*d6b92ffaSHans Petter Selasky 
503*d6b92ffaSHans Petter Selasky 	mad_bind_info_t *p_mad_bind_info;
504*d6b92ffaSHans Petter Selasky 	trans_context_t *p_trans_context;
505*d6b92ffaSHans Petter Selasky 
506*d6b92ffaSHans Petter Selasky 	umadt_obj_t *p_umadt_obj = NULL;
507*d6b92ffaSHans Petter Selasky 
508*d6b92ffaSHans Petter Selasky 	uint32_t mad_count = 0;
509*d6b92ffaSHans Petter Selasky 	MadtStruct *p_madt_struct = NULL;
510*d6b92ffaSHans Petter Selasky 	uint32_t i;
511*d6b92ffaSHans Petter Selasky 	uint32_t num_mads = 0;
512*d6b92ffaSHans Petter Selasky 	uint32_t seg_num = 0;
513*d6b92ffaSHans Petter Selasky 	uint8_t *p_frag_data = NULL;
514*d6b92ffaSHans Petter Selasky 	ib_sa_mad_t_vM3 *p_sa_mad = NULL;
515*d6b92ffaSHans Petter Selasky 
516*d6b92ffaSHans Petter Selasky 	CL_ASSERT(h_bind);
517*d6b92ffaSHans Petter Selasky 	p_mad_bind_info = (mad_bind_info_t *) h_bind;
518*d6b92ffaSHans Petter Selasky 	p_umadt_obj = p_mad_bind_info->p_umadt_obj;
519*d6b92ffaSHans Petter Selasky 
520*d6b92ffaSHans Petter Selasky 	/*  sanity check */
521*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_umadt_obj);
522*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_umadt_obj->init_done);
523*d6b92ffaSHans Petter Selasky 	CL_ASSERT(__valid_mad_handle(p_mad_bind_info));
524*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_vend_wrap);
525*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_mad_addr);
526*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_mad);
527*d6b92ffaSHans Petter Selasky 	/* CL_ASSERT( (ib_mad_t*)&p_vend_wrap->p_madt_struct->IBMad == p_mad ); */
528*d6b92ffaSHans Petter Selasky 
529*d6b92ffaSHans Petter Selasky 	/*  */
530*d6b92ffaSHans Petter Selasky 	/*  based on the class, fill out the address info */
531*d6b92ffaSHans Petter Selasky 	/*  */
532*d6b92ffaSHans Petter Selasky 	destAddr.DestLid = p_mad_addr->dest_lid;
533*d6b92ffaSHans Petter Selasky 	destAddr.PathBits = p_mad_addr->path_bits;
534*d6b92ffaSHans Petter Selasky 	destAddr.StaticRate = p_mad_addr->static_rate;
535*d6b92ffaSHans Petter Selasky 
536*d6b92ffaSHans Petter Selasky 	if (p_mad_bind_info->umadt_reg_class.ClassId == IB_MCLASS_SUBN_LID ||
537*d6b92ffaSHans Petter Selasky 	    p_mad_bind_info->umadt_reg_class.ClassId == IB_MCLASS_SUBN_DIR) {
538*d6b92ffaSHans Petter Selasky 		CL_ASSERT(p_mad_addr->addr_type.smi.source_lid);
539*d6b92ffaSHans Petter Selasky 		destAddr.AddrType.Smi.SourceLid =
540*d6b92ffaSHans Petter Selasky 		    p_mad_addr->addr_type.smi.source_lid;
541*d6b92ffaSHans Petter Selasky 	} else {
542*d6b92ffaSHans Petter Selasky 		destAddr.AddrType.Gsi.RemoteQpNumber =
543*d6b92ffaSHans Petter Selasky 		    p_mad_addr->addr_type.gsi.remote_qp;
544*d6b92ffaSHans Petter Selasky 		destAddr.AddrType.Gsi.RemoteQkey =
545*d6b92ffaSHans Petter Selasky 		    p_mad_addr->addr_type.gsi.remote_qkey;
546*d6b92ffaSHans Petter Selasky 		destAddr.AddrType.Gsi.PKey = OSM_DEFAULT_PKEY;
547*d6b92ffaSHans Petter Selasky 		destAddr.AddrType.Gsi.ServiceLevel =
548*d6b92ffaSHans Petter Selasky 		    p_mad_addr->addr_type.gsi.service_level;
549*d6b92ffaSHans Petter Selasky 		destAddr.AddrType.Gsi.GlobalRoute =
550*d6b92ffaSHans Petter Selasky 		    p_mad_addr->addr_type.gsi.global_route;
551*d6b92ffaSHans Petter Selasky 		/* destAddr.AddrType.Gsi.GRHInfo = p_mad_addr->addr_type.gsi.grh_info; */
552*d6b92ffaSHans Petter Selasky 	}
553*d6b92ffaSHans Petter Selasky 	p_mad->trans_id = cl_ntoh64(p_mad->trans_id) << 24;
554*d6b92ffaSHans Petter Selasky 
555*d6b92ffaSHans Petter Selasky 	/*  */
556*d6b92ffaSHans Petter Selasky 	/*  Create a transaction context for this send and save the TID and client context. */
557*d6b92ffaSHans Petter Selasky 	/*  */
558*d6b92ffaSHans Petter Selasky 
559*d6b92ffaSHans Petter Selasky 	if (resp_expected) {
560*d6b92ffaSHans Petter Selasky 		p_trans_context = malloc(sizeof(trans_context_t));
561*d6b92ffaSHans Petter Selasky 		CL_ASSERT(p_trans_context);
562*d6b92ffaSHans Petter Selasky 
563*d6b92ffaSHans Petter Selasky 		memset(p_trans_context, 0, sizeof(trans_context_t));
564*d6b92ffaSHans Petter Selasky 		p_trans_context->trans_id = p_mad->trans_id;
565*d6b92ffaSHans Petter Selasky 		p_trans_context->context = transaction_context;
566*d6b92ffaSHans Petter Selasky 		p_trans_context->sent_time = cl_get_time_stamp();
567*d6b92ffaSHans Petter Selasky 
568*d6b92ffaSHans Petter Selasky 		cl_spinlock_acquire(&p_mad_bind_info->trans_ctxt_lock);
569*d6b92ffaSHans Petter Selasky 		cl_qlist_insert_tail(&p_mad_bind_info->trans_ctxt_list,
570*d6b92ffaSHans Petter Selasky 				     &p_trans_context->list_item);
571*d6b92ffaSHans Petter Selasky 		cl_spinlock_release(&p_mad_bind_info->trans_ctxt_lock);
572*d6b92ffaSHans Petter Selasky 	}
573*d6b92ffaSHans Petter Selasky 
574*d6b92ffaSHans Petter Selasky 	if (p_mad_bind_info->umadt_reg_class.ClassId == IB_MCLASS_SUBN_LID ||
575*d6b92ffaSHans Petter Selasky 	    p_mad_bind_info->umadt_reg_class.ClassId == IB_MCLASS_SUBN_DIR) {
576*d6b92ffaSHans Petter Selasky 		/*  Get one mad from uMadt */
577*d6b92ffaSHans Petter Selasky 		mad_count = 1;
578*d6b92ffaSHans Petter Selasky 		Status =
579*d6b92ffaSHans Petter Selasky 		    p_umadt_obj->uMadtInterface.
580*d6b92ffaSHans Petter Selasky 		    uMadtGetSendMad(p_mad_bind_info->umadt_handle, &mad_count,
581*d6b92ffaSHans Petter Selasky 				    &p_madt_struct);
582*d6b92ffaSHans Petter Selasky 
583*d6b92ffaSHans Petter Selasky 		if (Status != FSUCCESS || p_madt_struct == NULL) {
584*d6b92ffaSHans Petter Selasky 			return IB_ERROR;
585*d6b92ffaSHans Petter Selasky 		}
586*d6b92ffaSHans Petter Selasky 
587*d6b92ffaSHans Petter Selasky 		/*  No Segmentation required */
588*d6b92ffaSHans Petter Selasky 		memcpy(&p_madt_struct->IBMad, p_mad, MAD_BLOCK_SIZE);
589*d6b92ffaSHans Petter Selasky 
590*d6b92ffaSHans Petter Selasky 		/*  Post the MAD */
591*d6b92ffaSHans Petter Selasky 
592*d6b92ffaSHans Petter Selasky 		Status =
593*d6b92ffaSHans Petter Selasky 		    p_umadt_obj->uMadtInterface.uMadtPostSend(p_mad_bind_info->
594*d6b92ffaSHans Petter Selasky 							      umadt_handle,
595*d6b92ffaSHans Petter Selasky 							      p_madt_struct,
596*d6b92ffaSHans Petter Selasky 							      &destAddr);
597*d6b92ffaSHans Petter Selasky 		if (Status != FSUCCESS) {
598*d6b92ffaSHans Petter Selasky 			printf("uMadtPostSendMad: Status  = <%d>\n", Status);
599*d6b92ffaSHans Petter Selasky 			return IB_ERROR;
600*d6b92ffaSHans Petter Selasky 		}
601*d6b92ffaSHans Petter Selasky 
602*d6b92ffaSHans Petter Selasky 		/*  Release send MAD */
603*d6b92ffaSHans Petter Selasky 		Status =
604*d6b92ffaSHans Petter Selasky 		    p_umadt_obj->uMadtInterface.
605*d6b92ffaSHans Petter Selasky 		    uMadtReleaseSendMad(p_mad_bind_info->umadt_handle,
606*d6b92ffaSHans Petter Selasky 					p_madt_struct);
607*d6b92ffaSHans Petter Selasky 		if (Status != FSUCCESS) {
608*d6b92ffaSHans Petter Selasky 			printf("uMadtReleaseSendMad: Status  = <%d>\n", Status);
609*d6b92ffaSHans Petter Selasky 			return IB_ERROR;
610*d6b92ffaSHans Petter Selasky 		}
611*d6b92ffaSHans Petter Selasky 	} else {
612*d6b92ffaSHans Petter Selasky 
613*d6b92ffaSHans Petter Selasky 		/*  */
614*d6b92ffaSHans Petter Selasky 		/*  Segment the MAD, get the required send mads from uMadt and post the MADs. */
615*d6b92ffaSHans Petter Selasky 		/*  */
616*d6b92ffaSHans Petter Selasky 		uint32_t payload_len;
617*d6b92ffaSHans Petter Selasky 
618*d6b92ffaSHans Petter Selasky 		payload_len =
619*d6b92ffaSHans Petter Selasky 		    cl_ntoh32(((ib_sa_mad_t_vM3 *) p_mad)->payload_len);
620*d6b92ffaSHans Petter Selasky 		num_mads = payload_len / IB_SA_DATA_SIZE;
621*d6b92ffaSHans Petter Selasky 		if (payload_len % IB_SA_DATA_SIZE != 0) {
622*d6b92ffaSHans Petter Selasky 			num_mads++;	/*  Get one additional mad for the remainder */
623*d6b92ffaSHans Petter Selasky 		}
624*d6b92ffaSHans Petter Selasky 		for (i = 0; i < num_mads; i++) {
625*d6b92ffaSHans Petter Selasky 			/*  Get one mad from uMadt */
626*d6b92ffaSHans Petter Selasky 			mad_count = 1;
627*d6b92ffaSHans Petter Selasky 			Status =
628*d6b92ffaSHans Petter Selasky 			    p_umadt_obj->uMadtInterface.
629*d6b92ffaSHans Petter Selasky 			    uMadtGetSendMad(p_mad_bind_info->umadt_handle,
630*d6b92ffaSHans Petter Selasky 					    &mad_count, &p_madt_struct);
631*d6b92ffaSHans Petter Selasky 
632*d6b92ffaSHans Petter Selasky 			if (Status != FSUCCESS || p_madt_struct == NULL) {
633*d6b92ffaSHans Petter Selasky 				return IB_ERROR;
634*d6b92ffaSHans Petter Selasky 			}
635*d6b92ffaSHans Petter Selasky 			/*  Copy client MAD into uMadt's MAD. */
636*d6b92ffaSHans Petter Selasky 			if (i == 0) {	/*  First Packet */
637*d6b92ffaSHans Petter Selasky 				/*  Since this is the first MAD, copy the entire MAD_SIZE */
638*d6b92ffaSHans Petter Selasky 				memcpy(&p_madt_struct->IBMad, p_mad,
639*d6b92ffaSHans Petter Selasky 				       MAD_BLOCK_SIZE);
640*d6b92ffaSHans Petter Selasky 
641*d6b92ffaSHans Petter Selasky 				p_frag_data =
642*d6b92ffaSHans Petter Selasky 				    (uint8_t *) p_mad + MAD_BLOCK_SIZE;
643*d6b92ffaSHans Petter Selasky 
644*d6b92ffaSHans Petter Selasky 				p_sa_mad =
645*d6b92ffaSHans Petter Selasky 				    (ib_sa_mad_t_vM3 *) & p_madt_struct->IBMad;
646*d6b92ffaSHans Petter Selasky 				if (num_mads == 1) {	/*  Only one Packet */
647*d6b92ffaSHans Petter Selasky 					p_sa_mad->seg_num = 0;
648*d6b92ffaSHans Petter Selasky 					p_sa_mad->frag_flag = 5;	/*  Set bit 0 for first pkt and b4 for last pkt */
649*d6b92ffaSHans Petter Selasky 					/*  the payload length gets copied with the mad header above */
650*d6b92ffaSHans Petter Selasky 				} else {	/*  More than one packet in this response */
651*d6b92ffaSHans Petter Selasky 
652*d6b92ffaSHans Petter Selasky 					seg_num = 1;
653*d6b92ffaSHans Petter Selasky 					p_sa_mad->seg_num =
654*d6b92ffaSHans Petter Selasky 					    cl_ntoh32(seg_num++);
655*d6b92ffaSHans Petter Selasky 					p_sa_mad->frag_flag = 1;	/*  Set bit 0 for first pkt */
656*d6b92ffaSHans Petter Selasky 					/*  the payload length gets copied with the mad header above */
657*d6b92ffaSHans Petter Selasky 				}
658*d6b92ffaSHans Petter Selasky 
659*d6b92ffaSHans Petter Selasky 			} else if (i < num_mads - 1) {	/*  Not last packet */
660*d6b92ffaSHans Petter Selasky 				/*  First copy only the header */
661*d6b92ffaSHans Petter Selasky 				memcpy(&p_madt_struct->IBMad, p_mad,
662*d6b92ffaSHans Petter Selasky 				       IB_SA_MAD_HDR_SIZE);
663*d6b92ffaSHans Petter Selasky 				/*  Set the relevant fields in the SA_MAD_HEADER */
664*d6b92ffaSHans Petter Selasky 				p_sa_mad =
665*d6b92ffaSHans Petter Selasky 				    (ib_sa_mad_t_vM3 *) & p_madt_struct->IBMad;
666*d6b92ffaSHans Petter Selasky 				p_sa_mad->payload_len =
667*d6b92ffaSHans Petter Selasky 				    cl_ntoh32(IB_SA_DATA_SIZE);
668*d6b92ffaSHans Petter Selasky 				p_sa_mad->seg_num = cl_ntoh32(seg_num++);
669*d6b92ffaSHans Petter Selasky 				p_sa_mad->frag_flag = 0;
670*d6b92ffaSHans Petter Selasky 				/*  Now copy the fragmented data */
671*d6b92ffaSHans Petter Selasky 				memcpy(((uint8_t *) & p_madt_struct->IBMad) +
672*d6b92ffaSHans Petter Selasky 				       IB_SA_MAD_HDR_SIZE, p_frag_data,
673*d6b92ffaSHans Petter Selasky 				       IB_SA_DATA_SIZE);
674*d6b92ffaSHans Petter Selasky 				p_frag_data = p_frag_data + IB_SA_DATA_SIZE;
675*d6b92ffaSHans Petter Selasky 
676*d6b92ffaSHans Petter Selasky 			} else if (i == num_mads - 1) {	/*  Last packet */
677*d6b92ffaSHans Petter Selasky 				/*  First copy only the header */
678*d6b92ffaSHans Petter Selasky 				memcpy(&p_madt_struct->IBMad, p_mad,
679*d6b92ffaSHans Petter Selasky 				       IB_SA_MAD_HDR_SIZE);
680*d6b92ffaSHans Petter Selasky 				/*  Set the relevant fields in the SA_MAD_HEADER */
681*d6b92ffaSHans Petter Selasky 				p_sa_mad =
682*d6b92ffaSHans Petter Selasky 				    (ib_sa_mad_t_vM3 *) & p_madt_struct->IBMad;
683*d6b92ffaSHans Petter Selasky 				p_sa_mad->seg_num = cl_ntoh32(seg_num++);
684*d6b92ffaSHans Petter Selasky 				p_sa_mad->frag_flag = 4;	/*  Set Bit 2 for last pkt */
685*d6b92ffaSHans Petter Selasky 				p_sa_mad->payload_len =
686*d6b92ffaSHans Petter Selasky 				    cl_ntoh32(cl_ntoh32
687*d6b92ffaSHans Petter Selasky 					      (((ib_sa_mad_t_vM3 *) p_mad)->
688*d6b92ffaSHans Petter Selasky 					       payload_len) % IB_SA_DATA_SIZE);
689*d6b92ffaSHans Petter Selasky 				/*  Now copy the fragmented data */
690*d6b92ffaSHans Petter Selasky 				memcpy((((uint8_t *) & p_madt_struct->IBMad)) +
691*d6b92ffaSHans Petter Selasky 				       IB_SA_MAD_HDR_SIZE, p_frag_data,
692*d6b92ffaSHans Petter Selasky 				       cl_ntoh32(p_sa_mad->payload_len));
693*d6b92ffaSHans Petter Selasky 				p_frag_data = p_frag_data + IB_SA_DATA_SIZE;
694*d6b92ffaSHans Petter Selasky 
695*d6b92ffaSHans Petter Selasky 			}
696*d6b92ffaSHans Petter Selasky 			/*  Post the MAD */
697*d6b92ffaSHans Petter Selasky 			Status =
698*d6b92ffaSHans Petter Selasky 			    p_umadt_obj->uMadtInterface.
699*d6b92ffaSHans Petter Selasky 			    uMadtPostSend(p_mad_bind_info->umadt_handle,
700*d6b92ffaSHans Petter Selasky 					  p_madt_struct, &destAddr);
701*d6b92ffaSHans Petter Selasky 			if (Status != FSUCCESS) {
702*d6b92ffaSHans Petter Selasky 				printf("uMadtPostSendMad: Status  = <%d>\n",
703*d6b92ffaSHans Petter Selasky 				       Status);
704*d6b92ffaSHans Petter Selasky 				return IB_ERROR;
705*d6b92ffaSHans Petter Selasky 			}
706*d6b92ffaSHans Petter Selasky 
707*d6b92ffaSHans Petter Selasky 			/*  Release send MAD */
708*d6b92ffaSHans Petter Selasky 			Status =
709*d6b92ffaSHans Petter Selasky 			    p_umadt_obj->uMadtInterface.
710*d6b92ffaSHans Petter Selasky 			    uMadtReleaseSendMad(p_mad_bind_info->umadt_handle,
711*d6b92ffaSHans Petter Selasky 						p_madt_struct);
712*d6b92ffaSHans Petter Selasky 			if (Status != FSUCCESS) {
713*d6b92ffaSHans Petter Selasky 				printf("uMadtReleaseSendMad: Status  = <%d>\n",
714*d6b92ffaSHans Petter Selasky 				       Status);
715*d6b92ffaSHans Petter Selasky 				return IB_ERROR;
716*d6b92ffaSHans Petter Selasky 			}
717*d6b92ffaSHans Petter Selasky 		}
718*d6b92ffaSHans Petter Selasky 	}
719*d6b92ffaSHans Petter Selasky 	return (IB_SUCCESS);
720*d6b92ffaSHans Petter Selasky }
721*d6b92ffaSHans Petter Selasky 
722*d6b92ffaSHans Petter Selasky /* //////////////////////////////////////////////////////////////////////// */
723*d6b92ffaSHans Petter Selasky /*  See VendorAbstractMadIntf.h for info */
724*d6b92ffaSHans Petter Selasky /* //////////////////////////////////////////////////////////////////////// */
725*d6b92ffaSHans Petter Selasky 
726*d6b92ffaSHans Petter Selasky osm_bind_handle_t
osm_vendor_bind(IN osm_vendor_t * const p_vend,IN osm_bind_info_t * const p_osm_bind_info,IN osm_mad_pool_t * const p_mad_pool,IN osm_vend_mad_recv_callback_t mad_recv_callback,IN void * context)727*d6b92ffaSHans Petter Selasky osm_vendor_bind(IN osm_vendor_t * const p_vend,
728*d6b92ffaSHans Petter Selasky 		IN osm_bind_info_t * const p_osm_bind_info,
729*d6b92ffaSHans Petter Selasky 		IN osm_mad_pool_t * const p_mad_pool,
730*d6b92ffaSHans Petter Selasky 		IN osm_vend_mad_recv_callback_t mad_recv_callback,
731*d6b92ffaSHans Petter Selasky 		IN void *context)
732*d6b92ffaSHans Petter Selasky {
733*d6b92ffaSHans Petter Selasky 	cl_status_t cl_status;
734*d6b92ffaSHans Petter Selasky 	FSTATUS Status;		/*  GEN1 Status for Umadt */
735*d6b92ffaSHans Petter Selasky 
736*d6b92ffaSHans Petter Selasky 	mad_bind_info_t *p_mad_bind_info;
737*d6b92ffaSHans Petter Selasky 	RegisterClassStruct *p_umadt_reg_class;
738*d6b92ffaSHans Petter Selasky 
739*d6b92ffaSHans Petter Selasky 	umadt_obj_t *p_umadt_obj;
740*d6b92ffaSHans Petter Selasky 	OSM_LOG_ENTER(((umadt_obj_t *) p_vend)->p_log);
741*d6b92ffaSHans Petter Selasky 
742*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_vend);
743*d6b92ffaSHans Petter Selasky 
744*d6b92ffaSHans Petter Selasky 	p_umadt_obj = (umadt_obj_t *) p_vend;
745*d6b92ffaSHans Petter Selasky 
746*d6b92ffaSHans Petter Selasky 	/*  Sanity check */
747*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_umadt_obj->init_done);
748*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_osm_bind_info);
749*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_mad_pool);
750*d6b92ffaSHans Petter Selasky 	CL_ASSERT(mad_recv_callback);
751*d6b92ffaSHans Petter Selasky 
752*d6b92ffaSHans Petter Selasky 	/*  Allocate memory for registering the handle. */
753*d6b92ffaSHans Petter Selasky 	p_mad_bind_info = (mad_bind_info_t *) malloc(sizeof(*p_mad_bind_info));
754*d6b92ffaSHans Petter Selasky 	if (p_mad_bind_info) {
755*d6b92ffaSHans Petter Selasky 		memset(p_mad_bind_info, 0, sizeof(*p_mad_bind_info));
756*d6b92ffaSHans Petter Selasky 		p_umadt_reg_class = &p_mad_bind_info->umadt_reg_class;
757*d6b92ffaSHans Petter Selasky 	}
758*d6b92ffaSHans Petter Selasky 	p_umadt_reg_class->PortGuid = cl_ntoh64(p_osm_bind_info->port_guid);
759*d6b92ffaSHans Petter Selasky 	p_umadt_reg_class->ClassId = p_osm_bind_info->mad_class;
760*d6b92ffaSHans Petter Selasky 	p_umadt_reg_class->ClassVersion = p_osm_bind_info->class_version;
761*d6b92ffaSHans Petter Selasky 	p_umadt_reg_class->isResponder = p_osm_bind_info->is_responder;
762*d6b92ffaSHans Petter Selasky 	p_umadt_reg_class->isTrapProcessor = p_osm_bind_info->is_trap_processor;
763*d6b92ffaSHans Petter Selasky 	p_umadt_reg_class->isReportProcessor =
764*d6b92ffaSHans Petter Selasky 	    p_osm_bind_info->is_report_processor;
765*d6b92ffaSHans Petter Selasky 	p_umadt_reg_class->SendQueueSize = p_osm_bind_info->send_q_size;
766*d6b92ffaSHans Petter Selasky 	p_umadt_reg_class->RecvQueueSize = p_osm_bind_info->recv_q_size;
767*d6b92ffaSHans Petter Selasky 	p_umadt_reg_class->NotifySendCompletion = TRUE;
768*d6b92ffaSHans Petter Selasky 
769*d6b92ffaSHans Petter Selasky 	p_mad_bind_info->p_umadt_obj = p_umadt_obj;
770*d6b92ffaSHans Petter Selasky 	p_mad_bind_info->p_mad_pool = p_mad_pool;
771*d6b92ffaSHans Petter Selasky 	p_mad_bind_info->mad_recv_callback = mad_recv_callback;
772*d6b92ffaSHans Petter Selasky 	p_mad_bind_info->client_context = context;
773*d6b92ffaSHans Petter Selasky 
774*d6b92ffaSHans Petter Selasky 	/*  register with Umadt for MAD interface */
775*d6b92ffaSHans Petter Selasky 	Status = p_umadt_obj->uMadtInterface.uMadtRegister(p_umadt_reg_class,
776*d6b92ffaSHans Petter Selasky 							   &p_mad_bind_info->
777*d6b92ffaSHans Petter Selasky 							   umadt_handle);
778*d6b92ffaSHans Petter Selasky 	if (Status != FSUCCESS) {
779*d6b92ffaSHans Petter Selasky 		free(p_mad_bind_info);
780*d6b92ffaSHans Petter Selasky 		OSM_LOG_EXIT(p_umadt_obj->p_log);
781*d6b92ffaSHans Petter Selasky 		return (OSM_BIND_INVALID_HANDLE);
782*d6b92ffaSHans Petter Selasky 	}
783*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_mad_bind_info->umadt_handle);
784*d6b92ffaSHans Petter Selasky 	/*  */
785*d6b92ffaSHans Petter Selasky 	/*  Start a worker thread to process receives. */
786*d6b92ffaSHans Petter Selasky 	/*  */
787*d6b92ffaSHans Petter Selasky 	cl_thread_construct(&p_mad_bind_info->recv_processor_thread);
788*d6b92ffaSHans Petter Selasky 	cl_status = cl_thread_init(&p_mad_bind_info->recv_processor_thread,
789*d6b92ffaSHans Petter Selasky 				   __mad_recv_processor,
790*d6b92ffaSHans Petter Selasky 				   (void *)p_mad_bind_info, "mad_recv_worker");
791*d6b92ffaSHans Petter Selasky 	CL_ASSERT(cl_status == CL_SUCCESS);
792*d6b92ffaSHans Petter Selasky 
793*d6b92ffaSHans Petter Selasky 	cl_qlist_init(&p_mad_bind_info->trans_ctxt_list);
794*d6b92ffaSHans Petter Selasky 	cl_spinlock_construct(&p_mad_bind_info->trans_ctxt_lock);
795*d6b92ffaSHans Petter Selasky 	cl_spinlock_init(&p_mad_bind_info->trans_ctxt_lock);
796*d6b92ffaSHans Petter Selasky 	cl_spinlock_construct(&p_mad_bind_info->timeout_list_lock);
797*d6b92ffaSHans Petter Selasky 	cl_spinlock_init(&p_mad_bind_info->timeout_list_lock);
798*d6b92ffaSHans Petter Selasky 
799*d6b92ffaSHans Petter Selasky 	cl_status = cl_timer_init(&p_mad_bind_info->timeout_timer,
800*d6b92ffaSHans Petter Selasky 				  __osm_vendor_timer_callback,
801*d6b92ffaSHans Petter Selasky 				  (void *)p_mad_bind_info);
802*d6b92ffaSHans Petter Selasky 	CL_ASSERT(cl_status == CL_SUCCESS);
803*d6b92ffaSHans Petter Selasky 	cl_qlist_init(&p_mad_bind_info->timeout_list);
804*d6b92ffaSHans Petter Selasky 	/*  */
805*d6b92ffaSHans Petter Selasky 	/*  Insert the mad_reg_struct in list and return pointer to it as the handle */
806*d6b92ffaSHans Petter Selasky 	/*  */
807*d6b92ffaSHans Petter Selasky 	cl_spinlock_acquire(&p_umadt_obj->register_lock);
808*d6b92ffaSHans Petter Selasky 
809*d6b92ffaSHans Petter Selasky 	cl_qlist_insert_head(&p_umadt_obj->register_list,
810*d6b92ffaSHans Petter Selasky 			     &p_mad_bind_info->list_item);
811*d6b92ffaSHans Petter Selasky 
812*d6b92ffaSHans Petter Selasky 	cl_spinlock_release(&p_umadt_obj->register_lock);
813*d6b92ffaSHans Petter Selasky 
814*d6b92ffaSHans Petter Selasky 	/*
815*d6b92ffaSHans Petter Selasky 	   A timeout value of 0 means disable timeouts.
816*d6b92ffaSHans Petter Selasky 	 */
817*d6b92ffaSHans Petter Selasky 	if (p_umadt_obj->timeout) {
818*d6b92ffaSHans Petter Selasky 		cl_timer_start(&p_mad_bind_info->timeout_timer,
819*d6b92ffaSHans Petter Selasky 			       DEFAULT_TIMER_INTERVAL_MSEC);
820*d6b92ffaSHans Petter Selasky 	}
821*d6b92ffaSHans Petter Selasky 
822*d6b92ffaSHans Petter Selasky 	OSM_LOG_EXIT(p_umadt_obj->p_log);
823*d6b92ffaSHans Petter Selasky 	return ((osm_bind_handle_t) p_mad_bind_info);
824*d6b92ffaSHans Petter Selasky }
825*d6b92ffaSHans Petter Selasky 
osm_vendor_unbind(IN osm_bind_handle_t h_bind)826*d6b92ffaSHans Petter Selasky void osm_vendor_unbind(IN osm_bind_handle_t h_bind)
827*d6b92ffaSHans Petter Selasky {
828*d6b92ffaSHans Petter Selasky 	mad_bind_info_t *p_mad_bind_info;
829*d6b92ffaSHans Petter Selasky 	umadt_obj_t *p_umadt_obj;
830*d6b92ffaSHans Petter Selasky 	cl_list_item_t *p_list_item, *p_next_list_item;
831*d6b92ffaSHans Petter Selasky 
832*d6b92ffaSHans Petter Selasky 	CL_ASSERT(h_bind);
833*d6b92ffaSHans Petter Selasky 	p_mad_bind_info = (mad_bind_info_t *) h_bind;
834*d6b92ffaSHans Petter Selasky 	p_umadt_obj = p_mad_bind_info->p_umadt_obj;
835*d6b92ffaSHans Petter Selasky 
836*d6b92ffaSHans Petter Selasky 	/*  sanity check */
837*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_umadt_obj);
838*d6b92ffaSHans Petter Selasky 	CL_ASSERT(p_umadt_obj->init_done);
839*d6b92ffaSHans Petter Selasky 	CL_ASSERT(__valid_mad_handle(p_mad_bind_info));
840*d6b92ffaSHans Petter Selasky 
841*d6b92ffaSHans Petter Selasky 	p_umadt_obj->uMadtInterface.uMadtDestroy(&p_mad_bind_info->
842*d6b92ffaSHans Petter Selasky 						 umadt_handle);
843*d6b92ffaSHans Petter Selasky 	cl_timer_destroy(&p_mad_bind_info->timeout_timer);
844*d6b92ffaSHans Petter Selasky 	cl_thread_destroy(&p_mad_bind_info->recv_processor_thread);
845*d6b92ffaSHans Petter Selasky 
846*d6b92ffaSHans Petter Selasky 	cl_spinlock_acquire(&p_mad_bind_info->trans_ctxt_lock);
847*d6b92ffaSHans Petter Selasky 	p_list_item = cl_qlist_head(&p_mad_bind_info->trans_ctxt_list);
848*d6b92ffaSHans Petter Selasky 	while (p_list_item != cl_qlist_end(&p_mad_bind_info->trans_ctxt_list)) {
849*d6b92ffaSHans Petter Selasky 		p_next_list_item = cl_qlist_next(p_list_item);
850*d6b92ffaSHans Petter Selasky 		cl_qlist_remove_item(&p_mad_bind_info->trans_ctxt_list,
851*d6b92ffaSHans Petter Selasky 				     p_list_item);
852*d6b92ffaSHans Petter Selasky 		free(p_list_item);
853*d6b92ffaSHans Petter Selasky 		p_list_item = p_next_list_item;
854*d6b92ffaSHans Petter Selasky 	}
855*d6b92ffaSHans Petter Selasky 	cl_spinlock_release(&p_mad_bind_info->trans_ctxt_lock);
856*d6b92ffaSHans Petter Selasky 
857*d6b92ffaSHans Petter Selasky 	cl_spinlock_acquire(&p_mad_bind_info->timeout_list_lock);
858*d6b92ffaSHans Petter Selasky 	p_list_item = cl_qlist_head(&p_mad_bind_info->timeout_list);
859*d6b92ffaSHans Petter Selasky 	while (p_list_item != cl_qlist_end(&p_mad_bind_info->timeout_list)) {
860*d6b92ffaSHans Petter Selasky 		p_next_list_item = cl_qlist_next(p_list_item);
861*d6b92ffaSHans Petter Selasky 		cl_qlist_remove_item(&p_mad_bind_info->timeout_list,
862*d6b92ffaSHans Petter Selasky 				     p_list_item);
863*d6b92ffaSHans Petter Selasky 		free(p_list_item);
864*d6b92ffaSHans Petter Selasky 		p_list_item = p_next_list_item;
865*d6b92ffaSHans Petter Selasky 	}
866*d6b92ffaSHans Petter Selasky 	cl_spinlock_release(&p_mad_bind_info->timeout_list_lock);
867*d6b92ffaSHans Petter Selasky 
868*d6b92ffaSHans Petter Selasky 	free(p_mad_bind_info);
869*d6b92ffaSHans Petter Selasky }
870*d6b92ffaSHans Petter Selasky 
__mad_recv_processor(IN void * context)871*d6b92ffaSHans Petter Selasky void __mad_recv_processor(IN void *context)
872*d6b92ffaSHans Petter Selasky {
873*d6b92ffaSHans Petter Selasky 	mad_bind_info_t *p_mad_bind_info = (mad_bind_info_t *) context;
874*d6b92ffaSHans Petter Selasky 	umadt_obj_t *p_umadt_obj;
875*d6b92ffaSHans Petter Selasky 	osm_madw_t *p_osm_madw = NULL;
876*d6b92ffaSHans Petter Selasky 	osm_vend_wrap_t *p_vend_wrap = NULL;
877*d6b92ffaSHans Petter Selasky 	osm_mad_addr_t osm_mad_addr = { 0 };
878*d6b92ffaSHans Petter Selasky 	cl_list_item_t *p_list_item;
879*d6b92ffaSHans Petter Selasky 	void *transaction_context;
880*d6b92ffaSHans Petter Selasky 
881*d6b92ffaSHans Petter Selasky 	FSTATUS Status;
882*d6b92ffaSHans Petter Selasky 	MadtStruct *pRecvMad = NULL;
883*d6b92ffaSHans Petter Selasky 	MadWorkCompletion *pRecvCmp = NULL;
884*d6b92ffaSHans Petter Selasky 
885*d6b92ffaSHans Petter Selasky 	CL_ASSERT(context);
886*d6b92ffaSHans Petter Selasky 
887*d6b92ffaSHans Petter Selasky 	p_mad_bind_info = (mad_bind_info_t *) context;
888*d6b92ffaSHans Petter Selasky 	p_umadt_obj = p_mad_bind_info->p_umadt_obj;
889*d6b92ffaSHans Petter Selasky 	/*  PollFor a completion */
890*d6b92ffaSHans Petter Selasky 	/*  if FNOTFOND, then wait for a completion then again poll and return the MAD */
891*d6b92ffaSHans Petter Selasky 	while (1) {
892*d6b92ffaSHans Petter Selasky 		Status =
893*d6b92ffaSHans Petter Selasky 		    p_umadt_obj->uMadtInterface.
894*d6b92ffaSHans Petter Selasky 		    uMadtPollForRecvCompletion(p_mad_bind_info->umadt_handle,
895*d6b92ffaSHans Petter Selasky 					       &pRecvMad, &pRecvCmp);
896*d6b92ffaSHans Petter Selasky 		if (Status != FSUCCESS) {
897*d6b92ffaSHans Petter Selasky 			if (Status == FNOT_FOUND) {
898*d6b92ffaSHans Petter Selasky 				/* Wait for a completion */
899*d6b92ffaSHans Petter Selasky 				Status = p_umadt_obj->uMadtInterface.uMadtWaitForAnyCompletion(p_mad_bind_info->umadt_handle, RECV_COMPLETION, 0x5000);	/* 5 sec timeout */
900*d6b92ffaSHans Petter Selasky 
901*d6b92ffaSHans Petter Selasky 				if (Status == FTIMEOUT) {
902*d6b92ffaSHans Petter Selasky 					continue;
903*d6b92ffaSHans Petter Selasky 				}
904*d6b92ffaSHans Petter Selasky 				CL_ASSERT(Status == FSUCCESS);
905*d6b92ffaSHans Petter Selasky 
906*d6b92ffaSHans Petter Selasky 				Status =
907*d6b92ffaSHans Petter Selasky 				    p_umadt_obj->uMadtInterface.
908*d6b92ffaSHans Petter Selasky 				    uMadtPollForRecvCompletion(p_mad_bind_info->
909*d6b92ffaSHans Petter Selasky 							       umadt_handle,
910*d6b92ffaSHans Petter Selasky 							       &pRecvMad,
911*d6b92ffaSHans Petter Selasky 							       &pRecvCmp);
912*d6b92ffaSHans Petter Selasky 				if (Status != FSUCCESS) {
913*d6b92ffaSHans Petter Selasky 					printf
914*d6b92ffaSHans Petter Selasky 					    (" mad_recv_worker: Error in PollForRecv returning <%x>\n",
915*d6b92ffaSHans Petter Selasky 					     Status);
916*d6b92ffaSHans Petter Selasky 					CL_ASSERT(0);
917*d6b92ffaSHans Petter Selasky 				}
918*d6b92ffaSHans Petter Selasky 			} else {
919*d6b92ffaSHans Petter Selasky 				printf
920*d6b92ffaSHans Petter Selasky 				    ("uMadtPollForRecvCompletion Status=<%x>\n",
921*d6b92ffaSHans Petter Selasky 				     Status);
922*d6b92ffaSHans Petter Selasky 				CL_ASSERT(0);
923*d6b92ffaSHans Petter Selasky 			}
924*d6b92ffaSHans Petter Selasky 		}
925*d6b92ffaSHans Petter Selasky 		CL_ASSERT(pRecvMad);
926*d6b92ffaSHans Petter Selasky 		CL_ASSERT(pRecvCmp);
927*d6b92ffaSHans Petter Selasky 
928*d6b92ffaSHans Petter Selasky 		if (((ib_sa_mad_t_vM3 *) (&pRecvMad->IBMad))->frag_flag & 0x20) {
929*d6b92ffaSHans Petter Selasky 			/*  Ignore the ACK packet */
930*d6b92ffaSHans Petter Selasky 			Status =
931*d6b92ffaSHans Petter Selasky 			    p_umadt_obj->uMadtInterface.
932*d6b92ffaSHans Petter Selasky 			    uMadtReleaseRecvMad(p_mad_bind_info->umadt_handle,
933*d6b92ffaSHans Petter Selasky 						pRecvMad);
934*d6b92ffaSHans Petter Selasky 			continue;
935*d6b92ffaSHans Petter Selasky 		}
936*d6b92ffaSHans Petter Selasky 		/*  */
937*d6b92ffaSHans Petter Selasky 		/*  Extract the return address to pass it on to the client */
938*d6b92ffaSHans Petter Selasky 		/*  */
939*d6b92ffaSHans Petter Selasky 		osm_mad_addr.dest_lid = pRecvCmp->AddressInfo.DestLid;
940*d6b92ffaSHans Petter Selasky 		osm_mad_addr.path_bits = pRecvCmp->AddressInfo.PathBits;
941*d6b92ffaSHans Petter Selasky 		osm_mad_addr.static_rate = pRecvCmp->AddressInfo.StaticRate;
942*d6b92ffaSHans Petter Selasky 
943*d6b92ffaSHans Petter Selasky 		if (p_mad_bind_info->umadt_reg_class.ClassId ==
944*d6b92ffaSHans Petter Selasky 		    IB_MCLASS_SUBN_LID
945*d6b92ffaSHans Petter Selasky 		    || p_mad_bind_info->umadt_reg_class.ClassId ==
946*d6b92ffaSHans Petter Selasky 		    IB_MCLASS_SUBN_DIR) {
947*d6b92ffaSHans Petter Selasky 			osm_mad_addr.addr_type.smi.source_lid =
948*d6b92ffaSHans Petter Selasky 			    pRecvCmp->AddressInfo.AddrType.Smi.SourceLid;
949*d6b92ffaSHans Petter Selasky 			/* osm_mad_addr.addr_type.smi.port_num = pRecvCmp->AddressInfo.AddrType.Smi.PortNumber; */
950*d6b92ffaSHans Petter Selasky 		} else {
951*d6b92ffaSHans Petter Selasky 			osm_mad_addr.addr_type.gsi.remote_qp =
952*d6b92ffaSHans Petter Selasky 			    pRecvCmp->AddressInfo.AddrType.Gsi.RemoteQpNumber;
953*d6b92ffaSHans Petter Selasky 			osm_mad_addr.addr_type.gsi.remote_qkey =
954*d6b92ffaSHans Petter Selasky 			    pRecvCmp->AddressInfo.AddrType.Gsi.RemoteQkey;
955*d6b92ffaSHans Petter Selasky 			osm_mad_addr.addr_type.gsi.pkey_ix = 0;
956*d6b92ffaSHans Petter Selasky 			osm_mad_addr.addr_type.gsi.service_level =
957*d6b92ffaSHans Petter Selasky 			    pRecvCmp->AddressInfo.AddrType.Gsi.ServiceLevel;
958*d6b92ffaSHans Petter Selasky 			osm_mad_addr.addr_type.gsi.global_route =
959*d6b92ffaSHans Petter Selasky 			    pRecvCmp->AddressInfo.AddrType.Gsi.GlobalRoute;
960*d6b92ffaSHans Petter Selasky 			/* osm_mad_addr.addr_type.gsi.grh_info = pRecvCmp->AddressInfo.AddrType.Gsi.GRHInfo; */
961*d6b92ffaSHans Petter Selasky 		}
962*d6b92ffaSHans Petter Selasky 		p_osm_madw =
963*d6b92ffaSHans Petter Selasky 		    osm_mad_pool_get_wrapper(p_mad_bind_info->p_mad_pool,
964*d6b92ffaSHans Petter Selasky 					     p_mad_bind_info, MAD_BLOCK_SIZE,
965*d6b92ffaSHans Petter Selasky 					     (ib_mad_t *) & pRecvMad->IBMad,
966*d6b92ffaSHans Petter Selasky 					     &osm_mad_addr);
967*d6b92ffaSHans Petter Selasky 		CL_ASSERT(p_osm_madw);
968*d6b92ffaSHans Petter Selasky 		p_vend_wrap = osm_madw_get_vend_ptr(p_osm_madw);
969*d6b92ffaSHans Petter Selasky 		CL_ASSERT(p_vend_wrap);
970*d6b92ffaSHans Petter Selasky 		p_vend_wrap->p_madt_struct = pRecvMad;
971*d6b92ffaSHans Petter Selasky 		p_vend_wrap->direction = RECEIVE;
972*d6b92ffaSHans Petter Selasky 
973*d6b92ffaSHans Petter Selasky 		osm_log(p_mad_bind_info->p_umadt_obj->p_log, OSM_LOG_DEBUG,
974*d6b92ffaSHans Petter Selasky 			"__mad_recv_processor: "
975*d6b92ffaSHans Petter Selasky 			"Received data p_osm_madw[0x%p].\n", p_osm_madw);
976*d6b92ffaSHans Petter Selasky 
977*d6b92ffaSHans Petter Selasky 		/*  */
978*d6b92ffaSHans Petter Selasky 		/*  Do TID Processing. */
979*d6b92ffaSHans Petter Selasky 		/*  */
980*d6b92ffaSHans Petter Selasky 		/*  If R bit is set swap the TID */
981*d6b92ffaSHans Petter Selasky 
982*d6b92ffaSHans Petter Selasky 		cl_spinlock_acquire(&p_mad_bind_info->trans_ctxt_lock);
983*d6b92ffaSHans Petter Selasky 		p_list_item =
984*d6b92ffaSHans Petter Selasky 		    cl_qlist_find_from_head(&p_mad_bind_info->trans_ctxt_list,
985*d6b92ffaSHans Petter Selasky 					    __match_tid_context,
986*d6b92ffaSHans Petter Selasky 					    &p_osm_madw->p_mad->trans_id);
987*d6b92ffaSHans Petter Selasky 
988*d6b92ffaSHans Petter Selasky 		if (p_list_item ==
989*d6b92ffaSHans Petter Selasky 		    cl_qlist_end(&p_mad_bind_info->trans_ctxt_list)) {
990*d6b92ffaSHans Petter Selasky 			transaction_context = NULL;
991*d6b92ffaSHans Petter Selasky 		} else {
992*d6b92ffaSHans Petter Selasky 			transaction_context =
993*d6b92ffaSHans Petter Selasky 			    ((trans_context_t *) p_list_item)->context;
994*d6b92ffaSHans Petter Selasky 			cl_qlist_remove_item(&p_mad_bind_info->trans_ctxt_list,
995*d6b92ffaSHans Petter Selasky 					     p_list_item);
996*d6b92ffaSHans Petter Selasky 			free(p_list_item);
997*d6b92ffaSHans Petter Selasky 		}
998*d6b92ffaSHans Petter Selasky 		cl_spinlock_release(&p_mad_bind_info->trans_ctxt_lock);
999*d6b92ffaSHans Petter Selasky 		((ib_mad_t *) p_osm_madw->p_mad)->trans_id =
1000*d6b92ffaSHans Petter Selasky 		    cl_ntoh64(p_osm_madw->p_mad->trans_id >> 24);
1001*d6b92ffaSHans Petter Selasky 		osm_log(p_mad_bind_info->p_umadt_obj->p_log, OSM_LOG_DEBUG,
1002*d6b92ffaSHans Petter Selasky 			"__mad_recv_processor: "
1003*d6b92ffaSHans Petter Selasky 			"Received data p_osm_madw [0x%p]" "\n\t\t\t\tTID[0x%"
1004*d6b92ffaSHans Petter Selasky 			PRIx64 ", context[%p]. \n", p_osm_madw,
1005*d6b92ffaSHans Petter Selasky 			((ib_mad_t *) p_osm_madw->p_mad)->trans_id,
1006*d6b92ffaSHans Petter Selasky 			transaction_context);
1007*d6b92ffaSHans Petter Selasky 
1008*d6b92ffaSHans Petter Selasky 		(*(p_mad_bind_info->mad_recv_callback)) (p_osm_madw,
1009*d6b92ffaSHans Petter Selasky 							 p_mad_bind_info->
1010*d6b92ffaSHans Petter Selasky 							 client_context,
1011*d6b92ffaSHans Petter Selasky 							 transaction_context);
1012*d6b92ffaSHans Petter Selasky 
1013*d6b92ffaSHans Petter Selasky 	}
1014*d6b92ffaSHans Petter Selasky }
1015*d6b92ffaSHans Petter Selasky 
1016*d6b92ffaSHans Petter Selasky cl_status_t
__match_tid_context(const cl_list_item_t * const p_list_item,void * context)1017*d6b92ffaSHans Petter Selasky __match_tid_context(const cl_list_item_t * const p_list_item, void *context)
1018*d6b92ffaSHans Petter Selasky {
1019*d6b92ffaSHans Petter Selasky 	if (((trans_context_t *) p_list_item)->trans_id ==
1020*d6b92ffaSHans Petter Selasky 	    *((uint64_t *) context))
1021*d6b92ffaSHans Petter Selasky 		return CL_SUCCESS;
1022*d6b92ffaSHans Petter Selasky 	return CL_NOT_FOUND;
1023*d6b92ffaSHans Petter Selasky }
1024*d6b92ffaSHans Petter Selasky 
__valid_mad_handle(IN mad_bind_info_t * p_mad_bind_info)1025*d6b92ffaSHans Petter Selasky boolean_t __valid_mad_handle(IN mad_bind_info_t * p_mad_bind_info)
1026*d6b92ffaSHans Petter Selasky {
1027*d6b92ffaSHans Petter Selasky 
1028*d6b92ffaSHans Petter Selasky 	umadt_obj_t *p_umadt_obj;
1029*d6b92ffaSHans Petter Selasky 
1030*d6b92ffaSHans Petter Selasky 	p_umadt_obj = p_mad_bind_info->p_umadt_obj;
1031*d6b92ffaSHans Petter Selasky 
1032*d6b92ffaSHans Petter Selasky 	cl_spinlock_acquire(&p_umadt_obj->register_lock);
1033*d6b92ffaSHans Petter Selasky 	if (!cl_is_item_in_qlist(&p_umadt_obj->register_list,
1034*d6b92ffaSHans Petter Selasky 				 &p_mad_bind_info->list_item)) {
1035*d6b92ffaSHans Petter Selasky 		cl_spinlock_release(&p_umadt_obj->register_lock);
1036*d6b92ffaSHans Petter Selasky 		return FALSE;
1037*d6b92ffaSHans Petter Selasky 	}
1038*d6b92ffaSHans Petter Selasky 	cl_spinlock_release(&p_umadt_obj->register_lock);
1039*d6b92ffaSHans Petter Selasky 	return TRUE;
1040*d6b92ffaSHans Petter Selasky }
1041*d6b92ffaSHans Petter Selasky 
__osm_vendor_timer_callback(IN void * context)1042*d6b92ffaSHans Petter Selasky void __osm_vendor_timer_callback(IN void *context)
1043*d6b92ffaSHans Petter Selasky {
1044*d6b92ffaSHans Petter Selasky 	uint64_t current_time;
1045*d6b92ffaSHans Petter Selasky 	mad_bind_info_t *p_mad_bind_info;
1046*d6b92ffaSHans Petter Selasky 	umadt_obj_t *p_umadt_obj;
1047*d6b92ffaSHans Petter Selasky 	uint32_t timeout;
1048*d6b92ffaSHans Petter Selasky 
1049*d6b92ffaSHans Petter Selasky 	cl_list_item_t *p_list_item, *p_next_list_item;
1050*d6b92ffaSHans Petter Selasky 
1051*d6b92ffaSHans Petter Selasky 	CL_ASSERT(context);
1052*d6b92ffaSHans Petter Selasky 
1053*d6b92ffaSHans Petter Selasky 	p_mad_bind_info = (mad_bind_info_t *) context;
1054*d6b92ffaSHans Petter Selasky 	p_umadt_obj = p_mad_bind_info->p_umadt_obj;
1055*d6b92ffaSHans Petter Selasky 	timeout = p_umadt_obj->timeout * 1000;
1056*d6b92ffaSHans Petter Selasky 
1057*d6b92ffaSHans Petter Selasky 	current_time = cl_get_time_stamp();
1058*d6b92ffaSHans Petter Selasky 
1059*d6b92ffaSHans Petter Selasky 	cl_spinlock_acquire(&p_mad_bind_info->trans_ctxt_lock);
1060*d6b92ffaSHans Petter Selasky 
1061*d6b92ffaSHans Petter Selasky 	p_list_item = cl_qlist_head(&p_mad_bind_info->trans_ctxt_list);
1062*d6b92ffaSHans Petter Selasky 	while (p_list_item != cl_qlist_end(&p_mad_bind_info->trans_ctxt_list)) {
1063*d6b92ffaSHans Petter Selasky 
1064*d6b92ffaSHans Petter Selasky 		p_next_list_item = cl_qlist_next(p_list_item);
1065*d6b92ffaSHans Petter Selasky 
1066*d6b92ffaSHans Petter Selasky 		/*  DEFAULT_PKT_TIMEOUT is in milli seconds */
1067*d6b92ffaSHans Petter Selasky 		if (current_time - ((trans_context_t *) p_list_item)->sent_time
1068*d6b92ffaSHans Petter Selasky 		    > timeout) {
1069*d6b92ffaSHans Petter Selasky 			/*  Add this transaction to the timeout_list */
1070*d6b92ffaSHans Petter Selasky 			cl_qlist_remove_item(&p_mad_bind_info->trans_ctxt_list,
1071*d6b92ffaSHans Petter Selasky 					     p_list_item);
1072*d6b92ffaSHans Petter Selasky 			cl_qlist_insert_tail(&p_mad_bind_info->timeout_list,
1073*d6b92ffaSHans Petter Selasky 					     p_list_item);
1074*d6b92ffaSHans Petter Selasky 		}
1075*d6b92ffaSHans Petter Selasky 
1076*d6b92ffaSHans Petter Selasky 		p_list_item = p_next_list_item;
1077*d6b92ffaSHans Petter Selasky 	}
1078*d6b92ffaSHans Petter Selasky 
1079*d6b92ffaSHans Petter Selasky 	cl_spinlock_release(&p_mad_bind_info->trans_ctxt_lock);
1080*d6b92ffaSHans Petter Selasky 
1081*d6b92ffaSHans Petter Selasky 	p_list_item = cl_qlist_head(&p_mad_bind_info->timeout_list);
1082*d6b92ffaSHans Petter Selasky 	while (p_list_item != cl_qlist_end(&p_mad_bind_info->timeout_list)) {
1083*d6b92ffaSHans Petter Selasky 		osm_log(p_mad_bind_info->p_umadt_obj->p_log, OSM_LOG_DEBUG,
1084*d6b92ffaSHans Petter Selasky 			"__osm_vendor_timer_callback: "
1085*d6b92ffaSHans Petter Selasky 			"Timing out transaction context [0x%p].\n",
1086*d6b92ffaSHans Petter Selasky 			((trans_context_t *) p_list_item)->context);
1087*d6b92ffaSHans Petter Selasky 
1088*d6b92ffaSHans Petter Selasky 		(*(p_mad_bind_info->mad_recv_callback)) (NULL,
1089*d6b92ffaSHans Petter Selasky 							 p_mad_bind_info->
1090*d6b92ffaSHans Petter Selasky 							 client_context,
1091*d6b92ffaSHans Petter Selasky 							 ((trans_context_t *)
1092*d6b92ffaSHans Petter Selasky 							  p_list_item)->
1093*d6b92ffaSHans Petter Selasky 							 context);
1094*d6b92ffaSHans Petter Selasky 
1095*d6b92ffaSHans Petter Selasky 		p_next_list_item = cl_qlist_next(p_list_item);
1096*d6b92ffaSHans Petter Selasky 		cl_qlist_remove_item(&p_mad_bind_info->timeout_list,
1097*d6b92ffaSHans Petter Selasky 				     p_list_item);
1098*d6b92ffaSHans Petter Selasky 		free(p_list_item);
1099*d6b92ffaSHans Petter Selasky 		p_list_item = p_next_list_item;
1100*d6b92ffaSHans Petter Selasky 	}
1101*d6b92ffaSHans Petter Selasky 
1102*d6b92ffaSHans Petter Selasky 	cl_timer_start(&p_mad_bind_info->timeout_timer,
1103*d6b92ffaSHans Petter Selasky 		       DEFAULT_TIMER_INTERVAL_MSEC);
1104*d6b92ffaSHans Petter Selasky 
1105*d6b92ffaSHans Petter Selasky }
1106*d6b92ffaSHans Petter Selasky 
1107*d6b92ffaSHans Petter Selasky #endif				/* OSM_VENDOR_INTF_UMADT */
1108