#ifndef _GPXE_IB_CM_H #define _GPXE_IB_CM_H /** @file * * Infiniband communication management * */ FILE_LICENCE ( GPL2_OR_LATER ); #include #include struct ib_mad_transaction; struct ib_connection; /** Infiniband connection operations */ struct ib_connection_operations { /** Handle change of connection status * * @v ibdev Infiniband device * @v qp Queue pair * @v conn Connection * @v rc Connection status code * @v private_data Private data, if available * @v private_data_len Length of private data */ void ( * changed ) ( struct ib_device *ibdev, struct ib_queue_pair *qp, struct ib_connection *conn, int rc, void *private_data, size_t private_data_len ); }; /** An Infiniband connection */ struct ib_connection { /** Infiniband device */ struct ib_device *ibdev; /** Queue pair */ struct ib_queue_pair *qp; /** Local communication ID */ uint32_t local_id; /** Remote communication ID */ uint32_t remote_id; /** Target service ID */ struct ib_gid_half service_id; /** Connection operations */ struct ib_connection_operations *op; /** List of connections */ struct list_head list; /** Path to target */ struct ib_path *path; /** Connection request management transaction */ struct ib_mad_transaction *madx; /** Length of connection request private data */ size_t private_data_len; /** Connection request private data */ uint8_t private_data[0]; }; extern struct ib_connection * ib_create_conn ( struct ib_device *ibdev, struct ib_queue_pair *qp, struct ib_gid *dgid, struct ib_gid_half *service_id, void *req_private_data, size_t req_private_data_len, struct ib_connection_operations *op ); extern void ib_destroy_conn ( struct ib_device *ibdev, struct ib_queue_pair *qp, struct ib_connection *conn ); #endif /* _GPXE_IB_CM_H */