6
* Infiniband management interfaces
10
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
12
#include <ipxe/list.h>
13
#include <ipxe/retry.h>
14
#include <ipxe/tables.h>
15
#include <ipxe/infiniband.h>
17
struct ib_mad_interface;
18
struct ib_mad_transaction;
20
/** An Infiniband management agent */
22
/** Management class */
25
uint8_t class_version;
26
/** Attribute (in network byte order) */
30
* @v ibdev Infiniband device
31
* @v mi Management interface
33
* @v av Source address vector
34
* @ret rc Return status code
36
void ( * handle ) ( struct ib_device *ibdev,
37
struct ib_mad_interface *mi,
39
struct ib_address_vector *av );
42
/** Infiniband management agents */
43
#define IB_MAD_AGENTS __table ( struct ib_mad_agent, "ib_mad_agents" )
45
/** Declare an Infiniband management agent */
46
#define __ib_mad_agent __table_entry ( IB_MAD_AGENTS, 01 )
48
/** Infiniband management transaction operations */
49
struct ib_mad_transaction_operations {
50
/** Handle transaction completion
52
* @v ibdev Infiniband device
53
* @v mi Management interface
54
* @v madx Management transaction
56
* @v mad Received MAD (or NULL on error)
57
* @v av Source address vector (or NULL on error)
59
* The completion handler should in most cases call
60
* ib_destroy_madx() to free up the completed transaction.
62
void ( * complete ) ( struct ib_device *ibdev,
63
struct ib_mad_interface *mi,
64
struct ib_mad_transaction *madx,
65
int rc, union ib_mad *mad,
66
struct ib_address_vector *av );
69
/** An Infiniband management transaction */
70
struct ib_mad_transaction {
71
/** Associated management interface */
72
struct ib_mad_interface *mi;
73
/** List of transactions */
74
struct list_head list;
76
struct retry_timer timer;
77
/** Destination address vector */
78
struct ib_address_vector av;
81
/** Transaction operations */
82
struct ib_mad_transaction_operations *op;
83
/** Owner private data */
87
/** An Infiniband management interface */
88
struct ib_mad_interface {
89
/** Infiniband device */
90
struct ib_device *ibdev;
91
/** Completion queue */
92
struct ib_completion_queue *cq;
94
struct ib_queue_pair *qp;
95
/** List of management transactions */
96
struct list_head madx;
100
* Set Infiniband management transaction owner-private data
102
* @v madx Management transaction
103
* @v priv Private data
105
static inline __always_inline void
106
ib_madx_set_ownerdata ( struct ib_mad_transaction *madx, void *priv ) {
107
madx->owner_priv = priv;
111
* Get Infiniband management transaction owner-private data
113
* @v madx Management transaction
114
* @ret priv Private data
116
static inline __always_inline void *
117
ib_madx_get_ownerdata ( struct ib_mad_transaction *madx ) {
118
return madx->owner_priv;
121
extern int ib_mi_send ( struct ib_device *ibdev, struct ib_mad_interface *mi,
122
union ib_mad *mad, struct ib_address_vector *av );
123
extern struct ib_mad_transaction *
124
ib_create_madx ( struct ib_device *ibdev, struct ib_mad_interface *mi,
125
union ib_mad *mad, struct ib_address_vector *av,
126
struct ib_mad_transaction_operations *op );
127
extern void ib_destroy_madx ( struct ib_device *ibdev,
128
struct ib_mad_interface *mi,
129
struct ib_mad_transaction *madx );
130
extern struct ib_mad_interface * ib_create_mi ( struct ib_device *ibdev,
131
enum ib_queue_pair_type type );
132
extern void ib_destroy_mi ( struct ib_device *ibdev,
133
struct ib_mad_interface *mi );
135
#endif /* _IPXE_IB_MI_H */