[infiniband] Allow MAD handlers to indicate response via return value
[people/lynusvaz/gpxe.git] / src / include / gpxe / ib_gma.h
1 #ifndef _GPXE_IB_GMA_H
2 #define _GPXE_IB_GMA_H
3
4 /** @file
5  *
6  * Infiniband General Management Agent
7  *
8  */
9
10 FILE_LICENCE ( GPL2_OR_LATER );
11
12 #include <gpxe/list.h>
13 #include <gpxe/retry.h>
14 #include <gpxe/tables.h>
15 #include <gpxe/infiniband.h>
16
17 struct ib_gma;
18
19 /** A GMA attribute handler */
20 struct ib_gma_handler {
21         /** Management class */
22         uint8_t mgmt_class;
23         /** Management class don't-care bits */
24         uint8_t mgmt_class_ignore;
25         /** Class version */
26         uint8_t class_version;
27         /** Method */
28         uint8_t method;
29         /** Attribute (in network byte order) */
30         uint16_t attr_id;
31         /** Handle attribute
32          *
33          * @v gma               General management agent
34          * @v mad               MAD
35          * @ret response        MAD response, or NULL to send no response
36          */
37         union ib_mad * ( * handle ) ( struct ib_gma *gma, union ib_mad *mad );
38 };
39
40 /** GMA attribute handlers */
41 #define IB_GMA_HANDLERS __table ( struct ib_gma_handler, "ib_gma_handlers" )
42
43 /** Declare a GMA attribute handler */
44 #define __ib_gma_handler __table_entry ( IB_GMA_HANDLERS, 01 )
45
46 /** An Infiniband General Management Agent */
47 struct ib_gma {
48         /** Infiniband device */
49         struct ib_device *ibdev;
50         /** Completion queue */
51         struct ib_completion_queue *cq;
52         /** Queue pair */
53         struct ib_queue_pair *qp;
54
55         /** List of outstanding MAD requests */
56         struct list_head requests;
57 };
58
59 extern int ib_gma_request ( struct ib_gma *gma, union ib_mad *mad,
60                             struct ib_address_vector *av, int retry );
61 extern struct ib_gma * ib_create_gma ( struct ib_device *ibdev,
62                                        enum ib_queue_pair_type type );
63 extern void ib_destroy_gma ( struct ib_gma *gma );
64
65 #endif /* _GPXE_IB_GMA_H */