1219820Sjeff/*
2219820Sjeff * Copyright (c) 2004, 2005 Voltaire, Inc. All rights reserved.
3219820Sjeff * Copyright (c) 2002-2005 Mellanox Technologies LTD. All rights reserved.
4219820Sjeff * Copyright (c) 1996-2003 Intel Corporation. All rights reserved.
5219820Sjeff *
6219820Sjeff * This software is available to you under a choice of one of two
7219820Sjeff * licenses.  You may choose to be licensed under the terms of the GNU
8219820Sjeff * General Public License (GPL) Version 2, available from the file
9219820Sjeff * COPYING in the main directory of this source tree, or the
10219820Sjeff * OpenIB.org BSD license below:
11219820Sjeff *
12219820Sjeff *     Redistribution and use in source and binary forms, with or
13219820Sjeff *     without modification, are permitted provided that the following
14219820Sjeff *     conditions are met:
15219820Sjeff *
16219820Sjeff *      - Redistributions of source code must retain the above
17219820Sjeff *        copyright notice, this list of conditions and the following
18219820Sjeff *        disclaimer.
19219820Sjeff *
20219820Sjeff *      - Redistributions in binary form must reproduce the above
21219820Sjeff *        copyright notice, this list of conditions and the following
22219820Sjeff *        disclaimer in the documentation and/or other materials
23219820Sjeff *        provided with the distribution.
24219820Sjeff *
25219820Sjeff * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
26219820Sjeff * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
27219820Sjeff * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
28219820Sjeff * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
29219820Sjeff * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
30219820Sjeff * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
31219820Sjeff * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
32219820Sjeff * SOFTWARE.
33219820Sjeff *
34219820Sjeff */
35219820Sjeff
36219820Sjeff#ifndef _OSMV_TXN_H_
37219820Sjeff#define _OSMV_TXN_H_
38219820Sjeff
39219820Sjeff#include <sys/types.h>
40219820Sjeff#include <unistd.h>
41219820Sjeff
42219820Sjeff#include <complib/cl_qmap.h>
43219820Sjeff#include <opensm/osm_madw.h>
44219820Sjeff#include <complib/cl_event_wheel.h>
45219820Sjeff
46219820Sjeff#include <vendor/osm_vendor_mlx_rmpp_ctx.h>
47219820Sjeff
48219820Sjeff#ifdef __cplusplus
49219820Sjeff#  define BEGIN_C_DECLS extern "C" {
50219820Sjeff#  define END_C_DECLS   }
51219820Sjeff#else				/* !__cplusplus */
52219820Sjeff#  define BEGIN_C_DECLS
53219820Sjeff#  define END_C_DECLS
54219820Sjeff#endif				/* __cplusplus */
55219820Sjeff
56219820SjeffBEGIN_C_DECLS
57219820Sjeff
58219820Sjefftypedef enum _osmv_txn_rmpp_state {
59219820Sjeff
60219820Sjeff	OSMV_TXN_RMPP_NONE = 0,	/* Not part of RMPP transaction */
61219820Sjeff
62219820Sjeff	OSMV_TXN_RMPP_SENDER,
63219820Sjeff	OSMV_TXN_RMPP_RECEIVER
64219820Sjeff} osmv_txn_rmpp_state_t;
65219820Sjeff
66219820Sjefftypedef struct _osmv_rmpp_txfr {
67219820Sjeff
68219820Sjeff	osmv_txn_rmpp_state_t rmpp_state;
69219820Sjeff	boolean_t is_rmpp_init_by_peer;
70219820Sjeff	osmv_rmpp_send_ctx_t *p_rmpp_send_ctx;
71219820Sjeff	osmv_rmpp_recv_ctx_t *p_rmpp_recv_ctx;
72219820Sjeff
73219820Sjeff} osmv_rmpp_txfr_t;
74219820Sjeff
75219820Sjefftypedef struct _osmv_txn_ctx {
76219820Sjeff
77219820Sjeff	/* The original Transaction ID */
78219820Sjeff	uint64_t tid;
79219820Sjeff	/* The key by which the Transaction is stored */
80219820Sjeff	uint64_t key;
81219820Sjeff
82219820Sjeff	/* RMPP Send/Receive contexts, if applicable */
83219820Sjeff	osmv_rmpp_txfr_t rmpp_txfr;
84219820Sjeff
85219820Sjeff	/* A MAD that was sent during the transaction (request or response) */
86219820Sjeff	osm_madw_t *p_madw;
87219820Sjeff
88219820Sjeff	/* Reference to a log to enable tracing */
89219820Sjeff	osm_log_t *p_log;
90219820Sjeff
91219820Sjeff} osmv_txn_ctx_t;
92219820Sjeff
93219820Sjefftypedef struct _osmv_txn_mgr {
94219820Sjeff
95219820Sjeff	/* Container of all the transactions */
96219820Sjeff	cl_qmap_t *p_txn_map;
97219820Sjeff
98219820Sjeff	/* The timeouts DB */
99219820Sjeff	cl_event_wheel_t *p_event_wheel;
100219820Sjeff
101219820Sjeff	/* Reference to a log to enable tracing */
102219820Sjeff	osm_log_t *p_log;
103219820Sjeff
104219820Sjeff} osmv_txn_mgr_t;
105219820Sjeff
106219820Sjeff/* *    *   *   *   *   *   osmv_txn_ctx_t functions  *    *   *   *   *   *   *   *   */
107219820Sjeff
108219820Sjeff/*
109219820Sjeff * NAME
110219820Sjeff *   osmv_txn_init
111219820Sjeff *
112219820Sjeff * DESCRIPTION
113219820Sjeff *   allocs & inits the osmv_txn_ctx obj and insert it into the db
114219820Sjeff * SEE ALSO
115219820Sjeff *
116219820Sjeff */
117219820Sjeffib_api_status_t
118219820Sjeffosmv_txn_init(IN osm_bind_handle_t h_bind,
119219820Sjeff	      IN uint64_t tid, IN uint64_t key, OUT osmv_txn_ctx_t ** pp_txn);
120219820Sjeff
121219820Sjeff/*
122219820Sjeff * NAME
123219820Sjeff *   osmv_rmpp_txfr_init_sender
124219820Sjeff *
125219820Sjeff * DESCRIPTION
126219820Sjeff *   init the rmpp send ctx in the transaction
127219820Sjeff *
128219820Sjeff * SEE ALSO
129219820Sjeff *
130219820Sjeff */
131219820Sjeffib_api_status_t
132219820Sjeffosmv_txn_init_rmpp_sender(IN osm_bind_handle_t h_bind,
133219820Sjeff			  IN osmv_txn_ctx_t * p_txn, IN osm_madw_t * p_madw);
134219820Sjeff
135219820Sjeff/*
136219820Sjeff * NAME
137219820Sjeff *   osmv_rmpp_txfr_init_receiver
138219820Sjeff *
139219820Sjeff * DESCRIPTION
140219820Sjeff *   init the rmpp recv ctx in the transaction
141219820Sjeff *
142219820Sjeff * SEE ALSO
143219820Sjeff *
144219820Sjeff */
145219820Sjeffib_api_status_t
146219820Sjeffosmv_txn_init_rmpp_receiver(IN osm_bind_handle_t h_bind,
147219820Sjeff			    IN osmv_txn_ctx_t * p_txn,
148219820Sjeff			    IN boolean_t is_init_by_peer);
149219820Sjeff
150219820Sjeff/*
151219820Sjeff * NAME
152219820Sjeff *   osmv_txn_done
153219820Sjeff *
154219820Sjeff * DESCRIPTION
155219820Sjeff *   destroys txn object and removes it from the db
156219820Sjeff *
157219820Sjeff * SEE ALSO
158219820Sjeff *
159219820Sjeff */
160219820Sjeffvoid
161219820Sjeffosmv_txn_done(IN osm_bind_handle_t h_bind,
162219820Sjeff	      IN uint64_t key, IN boolean_t is_in_cb);
163219820Sjeff/*
164219820Sjeff * NAME
165219820Sjeff *   osmv_txn_get_tid
166219820Sjeff *
167219820Sjeff * DESCRIPTION
168219820Sjeff *   returns tid of the transaction
169219820Sjeff * SEE ALSO
170219820Sjeff *
171219820Sjeff */
172219820Sjeffstatic inline uint64_t osmv_txn_get_tid(IN osmv_txn_ctx_t * p_txn)
173219820Sjeff{
174219820Sjeff	CL_ASSERT(NULL != p_txn);
175219820Sjeff	return p_txn->tid;
176219820Sjeff}
177219820Sjeff
178219820Sjeff/*
179219820Sjeff * NAME
180219820Sjeff *   osmv_txn_get_key
181219820Sjeff *
182219820Sjeff * DESCRIPTION
183219820Sjeff *   returns key of the transaction
184219820Sjeff * SEE ALSO
185219820Sjeff *
186219820Sjeff */
187219820Sjeff
188219820Sjeffstatic inline uint64_t osmv_txn_get_key(IN osmv_txn_ctx_t * p_txn)
189219820Sjeff{
190219820Sjeff	CL_ASSERT(NULL != p_txn);
191219820Sjeff	return p_txn->key;
192219820Sjeff}
193219820Sjeff
194219820Sjeff/*
195219820Sjeff * NAME
196219820Sjeff *   osmv_txn_is_rmpp_init_by_peer
197219820Sjeff *
198219820Sjeff * DESCRIPTION
199219820Sjeff *   returns whether the rmpp txfr was init by the peer
200219820Sjeff *
201219820Sjeff * SEE ALSO
202219820Sjeff *
203219820Sjeff */
204219820Sjeffstatic inline boolean_t osmv_txn_is_rmpp_init_by_peer(IN osmv_txn_ctx_t * p_txn)
205219820Sjeff{
206219820Sjeff	CL_ASSERT(NULL != p_txn);
207219820Sjeff	return p_txn->rmpp_txfr.is_rmpp_init_by_peer;
208219820Sjeff}
209219820Sjeff
210219820Sjeff/*
211219820Sjeff * NAME
212219820Sjeff *   osmv_txn_get_rmpp_send_ctx
213219820Sjeff *
214219820Sjeff * DESCRIPTION
215219820Sjeff *   returns osmv_rmpp_send_ctx obj
216219820Sjeff * SEE ALSO
217219820Sjeff *
218219820Sjeff */
219219820Sjeffstatic inline osmv_rmpp_send_ctx_t *osmv_txn_get_rmpp_send_ctx(IN osmv_txn_ctx_t
220219820Sjeff							       * p_txn)
221219820Sjeff{
222219820Sjeff	CL_ASSERT(NULL != p_txn);
223219820Sjeff	return p_txn->rmpp_txfr.p_rmpp_send_ctx;
224219820Sjeff}
225219820Sjeff
226219820Sjeff/*
227219820Sjeff * NAME
228219820Sjeff *   osmv_txn_get_rmpp_recv_ctx
229219820Sjeff *
230219820Sjeff * DESCRIPTION
231219820Sjeff *   returns osmv_rmpp_recv_ctx obj
232219820Sjeff * SEE ALSO
233219820Sjeff *
234219820Sjeff */
235219820Sjeffstatic inline osmv_rmpp_recv_ctx_t *osmv_txn_get_rmpp_recv_ctx(IN osmv_txn_ctx_t
236219820Sjeff							       * p_txn)
237219820Sjeff{
238219820Sjeff	CL_ASSERT(NULL != p_txn);
239219820Sjeff	return p_txn->rmpp_txfr.p_rmpp_recv_ctx;
240219820Sjeff}
241219820Sjeff
242219820Sjeff/*
243219820Sjeff * NAME
244219820Sjeff *   osmv_txn_get_rmpp_state
245219820Sjeff *
246219820Sjeff * DESCRIPTION
247219820Sjeff *   returns the rmpp role of the transactino ( send/ recv)
248219820Sjeff * SEE ALSO
249219820Sjeff *
250219820Sjeff */
251219820Sjeffstatic inline osmv_txn_rmpp_state_t
252219820Sjeffosmv_txn_get_rmpp_state(IN osmv_txn_ctx_t * p_txn)
253219820Sjeff{
254219820Sjeff	CL_ASSERT(NULL != p_txn);
255219820Sjeff	return p_txn->rmpp_txfr.rmpp_state;
256219820Sjeff}
257219820Sjeff
258219820Sjeff/*
259219820Sjeff * NAME
260219820Sjeff *   osmv_txn_set_rmpp_state
261219820Sjeff *
262219820Sjeff * DESCRIPTION
263219820Sjeff *   sets the rmpp role of the transaction (send/ recv)
264219820Sjeff * SEE ALSO
265219820Sjeff *
266219820Sjeff */
267219820Sjeffstatic inline void
268219820Sjeffosmv_txn_set_rmpp_state(IN osmv_txn_ctx_t * p_txn,
269219820Sjeff			IN osmv_txn_rmpp_state_t state)
270219820Sjeff{
271219820Sjeff	CL_ASSERT(NULL != p_txn);
272219820Sjeff	p_txn->rmpp_txfr.rmpp_state = state;
273219820Sjeff}
274219820Sjeff
275219820Sjeff/*
276219820Sjeff * NAME
277219820Sjeff *   osmv_txn_get_madw
278219820Sjeff *
279219820Sjeff * DESCRIPTION
280219820Sjeff *   returns the requester madw
281219820Sjeff * SEE ALSO
282219820Sjeff *
283219820Sjeff */
284219820Sjeffstatic inline osm_madw_t *osmv_txn_get_madw(IN osmv_txn_ctx_t * p_txn)
285219820Sjeff{
286219820Sjeff	CL_ASSERT(NULL != p_txn);
287219820Sjeff	return p_txn->p_madw;
288219820Sjeff}
289219820Sjeff
290219820Sjeff/*
291219820Sjeff * NAME
292219820Sjeff *   osmv_txn_set_madw
293219820Sjeff *
294219820Sjeff * DESCRIPTION
295219820Sjeff *   sets the requester madw
296219820Sjeff * SEE ALSO
297219820Sjeff *
298219820Sjeff */
299219820Sjeffstatic inline void
300219820Sjeffosmv_txn_set_madw(IN osmv_txn_ctx_t * p_txn, IN osm_madw_t * p_madw)
301219820Sjeff{
302219820Sjeff	CL_ASSERT(NULL != p_txn);
303219820Sjeff	p_txn->p_madw = p_madw;
304219820Sjeff}
305219820Sjeff
306219820Sjeff/*
307219820Sjeff * NAME
308219820Sjeff *  osmv_txn_set_timeout_ev
309219820Sjeff *
310219820Sjeff * DESCRIPTION
311219820Sjeff *
312219820Sjeff * SEE ALSO
313219820Sjeff *
314219820Sjeff */
315219820Sjeffib_api_status_t
316219820Sjeffosmv_txn_set_timeout_ev(IN osm_bind_handle_t h_bind,
317219820Sjeff			IN uint64_t key, IN uint64_t msec);
318219820Sjeff/*
319219820Sjeff * NAME
320219820Sjeff *  osmv_txn_remove_timeout_ev
321219820Sjeff *
322219820Sjeff * DESCRIPTION
323219820Sjeff
324219820Sjeff * SEE ALSO
325219820Sjeff *
326219820Sjeff */
327219820Sjeffvoid osmv_txn_remove_timeout_ev(IN osm_bind_handle_t h_bind, IN uint64_t key);
328219820Sjeff/*
329219820Sjeff * NAME
330219820Sjeff *  osmv_txn_lookup
331219820Sjeff *
332219820Sjeff * DESCRIPTION
333219820Sjeff *   get a transaction by its key
334219820Sjeff *
335219820Sjeff * SEE ALSO
336219820Sjeff *
337219820Sjeff */
338219820Sjeffib_api_status_t
339219820Sjeffosmv_txn_lookup(IN osm_bind_handle_t h_bind,
340219820Sjeff		IN uint64_t key, OUT osmv_txn_ctx_t ** pp_txn);
341219820Sjeff
342219820Sjeffvoid osmv_txn_abort_rmpp_txns(IN osm_bind_handle_t h_bind);
343219820Sjeff
344219820Sjeff/*      *       *       *       *       *       *       *       *       *       *       *       */
345219820Sjeff/*
346219820Sjeff * NAME
347219820Sjeff *  osmv_txnmgr_init
348219820Sjeff *
349219820Sjeff * DESCRIPTION
350219820Sjeff *  c'tor for txn mgr obj
351219820Sjeff * SEE ALSO
352219820Sjeff *
353219820Sjeff */
354219820Sjeffib_api_status_t
355219820Sjeffosmv_txnmgr_init(IN osmv_txn_mgr_t * p_tx_mgr,
356219820Sjeff		 IN osm_log_t * p_log, IN cl_spinlock_t * p_lock);
357219820Sjeff
358219820Sjeff/*
359219820Sjeff * NAME
360219820Sjeff *  osmv_txnmgr_done
361219820Sjeff *
362219820Sjeff * DESCRIPTION
363219820Sjeff *  c'tor for txn mgr obj
364219820Sjeff * SEE ALSO
365219820Sjeff *
366219820Sjeff */
367219820Sjeffvoid osmv_txnmgr_done(IN osm_bind_handle_t h_bind);
368219820Sjeff
369219820Sjeffvoid osmv_txn_lock(IN osm_bind_handle_t h_bind);
370219820Sjeffvoid osmv_txn_unlock(IN osm_bind_handle_t h_bind);
371219820Sjeff
372219820Sjeffinline static uint64_t osmv_txn_uniq_key(IN uint64_t tid)
373219820Sjeff{
374219820Sjeff	uint64_t pid = getpid();
375219820Sjeff
376219820Sjeff	return ((pid << 32) | (tid & 0xFFFFFFFF));
377219820Sjeff}
378219820Sjeff
379219820SjeffEND_C_DECLS
380219820Sjeff#endif				/* _OSMV_TXN_H_ */
381