1/*
2 * Copyright (c) 2004, 2005 Voltaire, Inc. All rights reserved.
3 * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved.
4 * Copyright (c) 1996-2003 Intel Corporation. All rights reserved.
5 *
6 * This software is available to you under a choice of one of two
7 * licenses.  You may choose to be licensed under the terms of the GNU
8 * General Public License (GPL) Version 2, available from the file
9 * COPYING in the main directory of this source tree, or the
10 * OpenIB.org BSD license below:
11 *
12 *     Redistribution and use in source and binary forms, with or
13 *     without modification, are permitted provided that the following
14 *     conditions are met:
15 *
16 *      - Redistributions of source code must retain the above
17 *        copyright notice, this list of conditions and the following
18 *        disclaimer.
19 *
20 *      - Redistributions in binary form must reproduce the above
21 *        copyright notice, this list of conditions and the following
22 *        disclaimer in the documentation and/or other materials
23 *        provided with the distribution.
24 *
25 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
26 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
27 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
28 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
29 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
30 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
31 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
32 * SOFTWARE.
33 *
34 */
35
36/*
37 * Abstract:
38 * 	Definition of interface for the MTL Vendor
39 *	   This object is part of the OpenSM family of objects.
40 */
41
42#ifndef _OSM_VENDOR_MTL_H_
43#define _OSM_VENDOR_MTL_H_
44
45#undef IN
46#undef OUT
47#include <vapi_types.h>
48#include <evapi.h>
49#include <ib_mgt.h>
50#define IN
51#define OUT
52#include "iba/ib_types.h"
53#include "iba/ib_al.h"
54#include <complib/cl_thread.h>
55#include <complib/cl_types_osd.h>
56#include <opensm/osm_base.h>
57
58#ifdef __cplusplus
59#  define BEGIN_C_DECLS extern "C" {
60#  define END_C_DECLS   }
61#else				/* !__cplusplus */
62#  define BEGIN_C_DECLS
63#  define END_C_DECLS
64#endif				/* __cplusplus */
65
66BEGIN_C_DECLS
67/****h* OpenSM/Vendor MTL
68* NAME
69*	Vendor MTL
70*
71* DESCRIPTION
72*
73*	The Vendor MTL object is thread safe.
74*
75*	This object should be treated as opaque and should be
76*	manipulated only through the provided functions.
77*
78*
79* AUTHOR
80*
81*
82*********/
83/****s* OpenSM: Vendor MTL/osm_ca_info_t
84* NAME
85*   osm_ca_info_t
86*
87* DESCRIPTION
88* 	Structure containing information about local Channle Adapters.
89*
90* SYNOPSIS
91*/
92typedef struct _osm_ca_info {
93	ib_net64_t guid;
94	size_t attr_size;
95	ib_ca_attr_t *p_attr;
96
97} osm_ca_info_t;
98
99/*
100* FIELDS
101*	guid
102*		Node GUID of the local CA.
103*
104*	attr_size
105*		Size of the CA attributes for this CA.
106*
107*	p_attr
108*		Pointer to dynamicly allocated CA Attribute structure.
109*
110* SEE ALSO
111*********/
112
113#define OSM_DEFAULT_RETRY_COUNT 3
114
115/***** OpenSM: Vendor MTL/osm_vendor_t
116* NAME
117*  osm_vendor_t
118*
119* DESCRIPTION
120* 	The structure defining a vendor
121*
122* SYNOPSIS
123*/
124typedef struct _osm_vendor {
125	ib_al_handle_t h_al;
126	osm_log_t *p_log;
127	uint32_t ca_count;
128	osm_ca_info_t *p_ca_info;
129	uint32_t timeout;
130	struct osm_transaction_mgr_t *p_transaction_mgr;
131} osm_vendor_t;
132
133/*
134* FIELDS
135*	h_al
136*		Handle returned by MTL open call (ib_open_al).
137*
138*	p_log
139*		Pointer to the log object.
140*
141*	ca_count
142*		Number of CA's in the array pointed to by p_ca_info.
143*
144*	p_ca_info
145*		Pointer to dynamically allocated array of CA info objects.
146*
147*	timeout
148*		Transaction timeout time in milliseconds.
149*
150*  p_transaction_mgr
151*     Pointer to Transaction Manager.
152*
153* SEE ALSO
154*********/
155
156/****f* OpenSM: Vendor MTL/CA Info/osm_ca_info_get_port_guid
157* NAME
158*	osm_ca_info_get_port_guid
159*
160* DESCRIPTION
161*	Returns the port GUID of the specified port owned by this CA.
162*
163* SYNOPSIS
164*/
165static inline ib_net64_t
166osm_ca_info_get_port_guid(IN const osm_ca_info_t * const p_ca_info,
167			  IN const uint8_t index)
168{
169	return (p_ca_info->p_attr->p_port_attr[index].port_guid);
170}
171
172/*
173* PARAMETERS
174*	p_ca_info
175*		[in] Pointer to a CA Info object.
176*
177*	index
178*		[in] Port "index" for which to retrieve the port GUID.
179*		The index is the offset into the ca's internal array
180*		of port attributes.
181*
182* RETURN VALUE
183*	Returns the port GUID of the specified port owned by this CA.
184*
185* NOTES
186*
187* SEE ALSO
188*********/
189
190/****f* OpenSM: Vendor MTL/CA Info/osm_ca_info_get_num_ports
191* NAME
192*	osm_ca_info_get_num_ports
193*
194* DESCRIPTION
195*	Returns the number of ports of the given ca_info
196*
197* SYNOPSIS
198*/
199static inline uint8_t
200osm_ca_info_get_num_ports(IN const osm_ca_info_t * const p_ca_info)
201{
202	return (p_ca_info->p_attr->num_ports);
203}
204
205/*
206* PARAMETERS
207*	p_ca_info
208*		[in] Pointer to a CA Info object.
209*
210* RETURN VALUE
211*	Returns the number of CA ports
212*
213* NOTES
214*
215* SEE ALSO
216*********/
217
218/****f* OpenSM: SM Vendor/osm_vendor_get_guid_ca_and_port
219 * NAME
220 *	osm_vendor_get_guid_ca_and_port
221 *
222 * DESCRIPTION
223 * Given the vendor obj and a guid
224 * return the ca id and port number that have that guid
225 *
226 * SYNOPSIS
227 */
228ib_api_status_t
229osm_vendor_get_guid_ca_and_port(IN osm_vendor_t * const p_vend,
230				IN ib_net64_t const guid,
231				OUT VAPI_hca_hndl_t * p_hca_hndl,
232				OUT VAPI_hca_id_t * p_hca_id,
233				OUT uint32_t * p_port_num);
234
235/*
236* PARAMETERS
237*	p_vend
238*		[in] Pointer to an osm_vendor_t object.
239*
240*	guid
241*		[in] The guid to search for.
242*
243*	p_hca_id
244*		[out] The HCA Id (VAPI_hca_id_t *) that the port is found on.
245*
246*	p_port_num
247*		[out] Pointer to a port number arg to be filled with the port number with the given guid.
248*
249* RETURN VALUES
250*	IB_SUCCESS on SUCCESS
251*  IB_INVALID_GUID if the guid is notfound on any Local HCA Port
252*
253* NOTES
254*
255* SEE ALSO
256*********/
257
258/****f* OpenSM: Vendor MTL/osm_vendor_get_all_port_attr
259 * NAME
260 *	osm_vendor_get_all_port_attr
261 *
262 * DESCRIPTION
263 * Fill in the array of port_attr with all available ports on ALL the
264 * avilable CAs on this machine.
265 * ALSO -
266 * UPDATE THE VENDOR OBJECT LIST OF CA_INFO STRUCTS
267 *
268 * SYNOPSIS
269 */
270ib_api_status_t osm_vendor_get_all_port_attr(IN osm_vendor_t * const p_vend,
271					     IN ib_port_attr_t *
272					     const p_attr_array,
273					     IN uint32_t * const p_num_ports);
274
275/*
276* PARAMETERS
277*	p_vend
278*		[in] Pointer to an osm_vendor_t object.
279*
280*	p_attr_array
281*		[out] Pre-allocated array of port attributes to be filled in
282*
283*	p_num_ports
284*		[out] The size of the given array. Filled in by the actual numberof ports found.
285*
286* RETURN VALUES
287*	IB_SUCCESS if OK
288*  IB_INSUFFICIENT_MEMORY if not enough place for all ports was provided.
289*
290* NOTES
291*
292* SEE ALSO
293*********/
294
295#define OSM_BIND_INVALID_HANDLE 0
296
297/****s* OpenSM: Vendor MTL/osm_bind_handle_t
298* NAME
299*   osm_bind_handle_t
300*
301* DESCRIPTION
302* 	handle returned by the vendor transport bind call.
303*
304* SYNOPSIS
305*/
306typedef void *osm_bind_handle_t;
307
308/***********/
309
310/****s* OpenSM: Vendor MTL/osm_vend_wrap_t
311* NAME
312*   MTL Vendor MAD Wrapper
313*
314* DESCRIPTION
315*	MTL specific MAD wrapper. MTL transport layer uses this for
316*	housekeeping.
317*
318* SYNOPSIS
319*********/
320typedef struct _osm_vend_wrap_t {
321	uint32_t size;
322	osm_bind_handle_t h_bind;
323	// ib_av_handle_t         h_av;
324	ib_mad_t *mad_buf_p;
325	void *p_resp_madw;
326} osm_vend_wrap_t;
327
328/*
329* FIELDS
330*	size
331*		Size of the allocated MAD
332*
333*	h_bind
334*		Bind handle used on this transaction
335*
336*	h_av
337*		Address vector handle used for this transaction.
338*
339*	p_resp_madw
340*		Pointer to the mad wrapper structure used to hold the pending
341*		reponse to the mad, if any.  If a response is expected, the
342*		wrapper for the reponse is allocated during the send call.
343*
344* SEE ALSO
345*********/
346
347END_C_DECLS
348#endif				/* _OSM_VENDOR_MTL_H_ */
349