Now handling TX completions in our poll loop.
[people/pcmattman/gpxe.git] / src / include / gpxe / infiniband.h
1 #ifndef _GPXE_INFINIBAND_H
2 #define _GPXE_INFINIBAND_H
3
4 /** @file
5  *
6  * Infiniband protocol
7  *
8  */
9
10 #include <stdint.h>
11 #include <gpxe/netdevice.h>
12
13 /** An Infiniband Global Identifier */
14 struct ib_gid {
15         uint8_t bytes[16];
16 };
17
18 /** An Infiniband Global Route Header */
19 struct ib_global_route_header {
20         /** IP version, traffic class, and flow label
21          *
22          *  4 bits : Version of the GRH
23          *  8 bits : Traffic class
24          * 20 bits : Flow label
25          */
26         uint32_t ipver_tclass_flowlabel;
27         /** Payload length */
28         uint16_t paylen;
29         /** Next header */
30         uint8_t nxthdr;
31         /** Hop limit */
32         uint8_t hoplmt;
33         /** Source GID */
34         struct ib_gid sgid;
35         /** Destiniation GID */
36         struct ib_gid dgid;
37 } __attribute__ (( packed ));
38
39 /** Infiniband MAC address length */
40 #define IB_ALEN 20
41
42 /** An Infiniband MAC address */
43 struct ib_mac {
44         /** Queue pair number
45          *
46          * MSB must be zero; QPNs are only 24-bit.
47          */
48         uint32_t qpn;
49         /** Port GID */
50         struct ib_gid gid;
51 } __attribute__ (( packed ));
52
53 /** Infiniband link-layer header length */
54 #define IB_HLEN 4
55
56 /** An Infiniband link-layer header */
57 struct ibhdr {
58         /** Network-layer protocol */
59         uint16_t proto;
60         /** Reserved, must be zero */
61         uint16_t reserved;
62 } __attribute__ (( packed ));
63
64 extern struct ll_protocol infiniband_protocol;
65
66 extern const char * ib_ntoa ( const void *ll_addr );
67
68 /**
69  * Allocate Infiniband device
70  *
71  * @v priv_size         Size of driver private data
72  * @ret netdev          Network device, or NULL
73  */
74 static inline struct net_device * alloc_ibdev ( size_t priv_size ) {
75         struct net_device *netdev;
76
77         netdev = alloc_netdev ( priv_size );
78         if ( netdev ) {
79                 netdev->ll_protocol = &infiniband_protocol;
80         }
81         return netdev;
82 }
83
84 #endif /* _GPXE_INFINIBAND_H */