6 * Infiniband management interfaces
10 FILE_LICENCE ( GPL2_OR_LATER );
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 */