Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[infiniband] Add the concept of a management interface
A management interface is the component through which both local and remote management agents are accessed. This new implementation of a management interface allows for the user to react to timed-out transactions, and also allows for cancellation of in-progress transactions.
- Loading branch information
Michael Brown
committed
Aug 8, 2009
1 parent
18bcdfb
commit 0e07516
Showing
4 changed files
with
549 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,135 @@ | ||
#ifndef _GPXE_IB_MI_H | ||
#define _GPXE_IB_MI_H | ||
|
||
/** @file | ||
* | ||
* Infiniband management interfaces | ||
* | ||
*/ | ||
|
||
FILE_LICENCE ( GPL2_OR_LATER ); | ||
|
||
#include <gpxe/list.h> | ||
#include <gpxe/retry.h> | ||
#include <gpxe/tables.h> | ||
#include <gpxe/infiniband.h> | ||
|
||
struct ib_mad_interface; | ||
struct ib_mad_transaction; | ||
|
||
/** An Infiniband management agent */ | ||
struct ib_mad_agent { | ||
/** Management class */ | ||
uint8_t mgmt_class; | ||
/** Class version */ | ||
uint8_t class_version; | ||
/** Attribute (in network byte order) */ | ||
uint16_t attr_id; | ||
/** Handle MAD | ||
* | ||
* @v ibdev Infiniband device | ||
* @v mi Management interface | ||
* @v mad Received MAD | ||
* @v av Source address vector | ||
* @ret rc Return status code | ||
*/ | ||
void ( * handle ) ( struct ib_device *ibdev, | ||
struct ib_mad_interface *mi, | ||
union ib_mad *mad, | ||
struct ib_address_vector *av ); | ||
}; | ||
|
||
/** Infiniband management agents */ | ||
#define IB_MAD_AGENTS __table ( struct ib_mad_agent, "ib_mad_agents" ) | ||
|
||
/** Declare an Infiniband management agent */ | ||
#define __ib_mad_agent __table_entry ( IB_MAD_AGENTS, 01 ) | ||
|
||
/** Infiniband management transaction operations */ | ||
struct ib_mad_transaction_operations { | ||
/** Handle transaction completion | ||
* | ||
* @v ibdev Infiniband device | ||
* @v mi Management interface | ||
* @v madx Management transaction | ||
* @v rc Status code | ||
* @v mad Received MAD (or NULL on error) | ||
* @v av Source address vector (or NULL on error) | ||
* | ||
* The completion handler should in most cases call | ||
* ib_destroy_madx() to free up the completed transaction. | ||
*/ | ||
void ( * complete ) ( struct ib_device *ibdev, | ||
struct ib_mad_interface *mi, | ||
struct ib_mad_transaction *madx, | ||
int rc, union ib_mad *mad, | ||
struct ib_address_vector *av ); | ||
}; | ||
|
||
/** An Infiniband management transaction */ | ||
struct ib_mad_transaction { | ||
/** Associated management interface */ | ||
struct ib_mad_interface *mi; | ||
/** List of transactions */ | ||
struct list_head list; | ||
/** Retry timer */ | ||
struct retry_timer timer; | ||
/** Destination address vector */ | ||
struct ib_address_vector av; | ||
/** MAD being sent */ | ||
union ib_mad mad; | ||
/** Transaction operations */ | ||
struct ib_mad_transaction_operations *op; | ||
/** Owner private data */ | ||
void *owner_priv; | ||
}; | ||
|
||
/** An Infiniband management interface */ | ||
struct ib_mad_interface { | ||
/** Infiniband device */ | ||
struct ib_device *ibdev; | ||
/** Completion queue */ | ||
struct ib_completion_queue *cq; | ||
/** Queue pair */ | ||
struct ib_queue_pair *qp; | ||
/** List of management transactions */ | ||
struct list_head madx; | ||
}; | ||
|
||
/** | ||
* Set Infiniband management transaction owner-private data | ||
* | ||
* @v madx Management transaction | ||
* @v priv Private data | ||
*/ | ||
static inline __always_inline void | ||
ib_madx_set_ownerdata ( struct ib_mad_transaction *madx, void *priv ) { | ||
madx->owner_priv = priv; | ||
} | ||
|
||
/** | ||
* Get Infiniband management transaction owner-private data | ||
* | ||
* @v madx Management transaction | ||
* @ret priv Private data | ||
*/ | ||
static inline __always_inline void * | ||
ib_madx_get_ownerdata ( struct ib_mad_transaction *madx ) { | ||
return madx->owner_priv; | ||
} | ||
|
||
extern int ib_mi_send ( struct ib_device *ibdev, struct ib_mad_interface *mi, | ||
union ib_mad *mad, struct ib_address_vector *av ); | ||
extern struct ib_mad_transaction * | ||
ib_create_madx ( struct ib_device *ibdev, struct ib_mad_interface *mi, | ||
union ib_mad *mad, struct ib_address_vector *av, | ||
struct ib_mad_transaction_operations *op ); | ||
extern void ib_destroy_madx ( struct ib_device *ibdev, | ||
struct ib_mad_interface *mi, | ||
struct ib_mad_transaction *madx ); | ||
extern struct ib_mad_interface * ib_create_mi ( struct ib_device *ibdev, | ||
enum ib_queue_pair_type type ); | ||
extern void ib_destroy_mi ( struct ib_device *ibdev, | ||
struct ib_mad_interface *mi ); | ||
|
||
#endif /* _GPXE_IB_MI_H */ |
Oops, something went wrong.