1#ifndef _GPXE_IB_PATHREC_H
2#define _GPXE_IB_PATHREC_H
3
4/** @file
5 *
6 * Infiniband path records
7 *
8 */
9
10FILE_LICENCE ( GPL2_OR_LATER );
11
12#include <gpxe/infiniband.h>
13
14struct ib_mad_transaction;
15struct ib_path;
16
17/** Infiniband path operations */
18struct ib_path_operations {
19	/** Handle path transaction completion
20	 *
21	 * @v ibdev		Infiniband device
22	 * @v path		Path
23	 * @v rc		Status code
24	 * @v av		Address vector, or NULL on error
25	 */
26	void ( * complete ) ( struct ib_device *ibdev,
27			      struct ib_path *path, int rc,
28			      struct ib_address_vector *av );
29};
30
31/** An Infiniband path */
32struct ib_path {
33	/** Infiniband device */
34	struct ib_device *ibdev;
35	/** Address vector */
36	struct ib_address_vector av;
37	/** Management transaction */
38	struct ib_mad_transaction *madx;
39	/** Path operations */
40	struct ib_path_operations *op;
41	/** Owner private data */
42	void *owner_priv;
43};
44
45/**
46 * Set Infiniband path owner-private data
47 *
48 * @v path		Path
49 * @v priv		Private data
50 */
51static inline __always_inline void
52ib_path_set_ownerdata ( struct ib_path *path, void *priv ) {
53	path->owner_priv = priv;
54}
55
56/**
57 * Get Infiniband path owner-private data
58 *
59 * @v path		Path
60 * @ret priv		Private data
61 */
62static inline __always_inline void *
63ib_path_get_ownerdata ( struct ib_path *path ) {
64	return path->owner_priv;
65}
66
67extern struct ib_path *
68ib_create_path ( struct ib_device *ibdev, struct ib_address_vector *av,
69		 struct ib_path_operations *op );
70extern void ib_destroy_path ( struct ib_device *ibdev,
71			      struct ib_path *path );
72
73extern int ib_resolve_path ( struct ib_device *ibdev,
74			     struct ib_address_vector *av );
75
76#endif /* _GPXE_IB_PATHREC_H */
77