mirror of
https://github.com/xcat2/xNBA.git
synced 2025-02-11 16:23:47 +00:00
[arbel] Reorder code in preparation for quiescing patch
Signed-off-by: Michael Brown <mcb30@ipxe.org>
This commit is contained in:
parent
6dd4ac77e5
commit
6c73a8b51d
@ -1892,195 +1892,6 @@ static void arbel_poll_eq ( struct ib_device *ibdev ) {
|
||||
}
|
||||
}
|
||||
|
||||
/***************************************************************************
|
||||
*
|
||||
* Infiniband link-layer operations
|
||||
*
|
||||
***************************************************************************
|
||||
*/
|
||||
|
||||
/**
|
||||
* Initialise Infiniband link
|
||||
*
|
||||
* @v ibdev Infiniband device
|
||||
* @ret rc Return status code
|
||||
*/
|
||||
static int arbel_open ( struct ib_device *ibdev ) {
|
||||
struct arbel *arbel = ib_get_drvdata ( ibdev );
|
||||
struct arbelprm_init_ib init_ib;
|
||||
int rc;
|
||||
|
||||
memset ( &init_ib, 0, sizeof ( init_ib ) );
|
||||
MLX_FILL_3 ( &init_ib, 0,
|
||||
mtu_cap, ARBEL_MTU_2048,
|
||||
port_width_cap, 3,
|
||||
vl_cap, 1 );
|
||||
MLX_FILL_1 ( &init_ib, 1, max_gid, 1 );
|
||||
MLX_FILL_1 ( &init_ib, 2, max_pkey, 64 );
|
||||
if ( ( rc = arbel_cmd_init_ib ( arbel, ibdev->port,
|
||||
&init_ib ) ) != 0 ) {
|
||||
DBGC ( arbel, "Arbel %p port %d could not intialise IB: %s\n",
|
||||
arbel, ibdev->port, strerror ( rc ) );
|
||||
return rc;
|
||||
}
|
||||
|
||||
/* Update MAD parameters */
|
||||
ib_smc_update ( ibdev, arbel_mad );
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Close Infiniband link
|
||||
*
|
||||
* @v ibdev Infiniband device
|
||||
*/
|
||||
static void arbel_close ( struct ib_device *ibdev ) {
|
||||
struct arbel *arbel = ib_get_drvdata ( ibdev );
|
||||
int rc;
|
||||
|
||||
if ( ( rc = arbel_cmd_close_ib ( arbel, ibdev->port ) ) != 0 ) {
|
||||
DBGC ( arbel, "Arbel %p port %d could not close IB: %s\n",
|
||||
arbel, ibdev->port, strerror ( rc ) );
|
||||
/* Nothing we can do about this */
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Inform embedded subnet management agent of a received MAD
|
||||
*
|
||||
* @v ibdev Infiniband device
|
||||
* @v mad MAD
|
||||
* @ret rc Return status code
|
||||
*/
|
||||
static int arbel_inform_sma ( struct ib_device *ibdev, union ib_mad *mad ) {
|
||||
int rc;
|
||||
|
||||
/* Send the MAD to the embedded SMA */
|
||||
if ( ( rc = arbel_mad ( ibdev, mad ) ) != 0 )
|
||||
return rc;
|
||||
|
||||
/* Update parameters held in software */
|
||||
ib_smc_update ( ibdev, arbel_mad );
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/***************************************************************************
|
||||
*
|
||||
* Multicast group operations
|
||||
*
|
||||
***************************************************************************
|
||||
*/
|
||||
|
||||
/**
|
||||
* Attach to multicast group
|
||||
*
|
||||
* @v ibdev Infiniband device
|
||||
* @v qp Queue pair
|
||||
* @v gid Multicast GID
|
||||
* @ret rc Return status code
|
||||
*/
|
||||
static int arbel_mcast_attach ( struct ib_device *ibdev,
|
||||
struct ib_queue_pair *qp,
|
||||
union ib_gid *gid ) {
|
||||
struct arbel *arbel = ib_get_drvdata ( ibdev );
|
||||
struct arbelprm_mgm_hash hash;
|
||||
struct arbelprm_mgm_entry mgm;
|
||||
unsigned int index;
|
||||
int rc;
|
||||
|
||||
/* Generate hash table index */
|
||||
if ( ( rc = arbel_cmd_mgid_hash ( arbel, gid, &hash ) ) != 0 ) {
|
||||
DBGC ( arbel, "Arbel %p could not hash GID: %s\n",
|
||||
arbel, strerror ( rc ) );
|
||||
return rc;
|
||||
}
|
||||
index = MLX_GET ( &hash, hash );
|
||||
|
||||
/* Check for existing hash table entry */
|
||||
if ( ( rc = arbel_cmd_read_mgm ( arbel, index, &mgm ) ) != 0 ) {
|
||||
DBGC ( arbel, "Arbel %p could not read MGM %#x: %s\n",
|
||||
arbel, index, strerror ( rc ) );
|
||||
return rc;
|
||||
}
|
||||
if ( MLX_GET ( &mgm, mgmqp_0.qi ) != 0 ) {
|
||||
/* FIXME: this implementation allows only a single QP
|
||||
* per multicast group, and doesn't handle hash
|
||||
* collisions. Sufficient for IPoIB but may need to
|
||||
* be extended in future.
|
||||
*/
|
||||
DBGC ( arbel, "Arbel %p MGID index %#x already in use\n",
|
||||
arbel, index );
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
/* Update hash table entry */
|
||||
MLX_FILL_2 ( &mgm, 8,
|
||||
mgmqp_0.qpn_i, qp->qpn,
|
||||
mgmqp_0.qi, 1 );
|
||||
memcpy ( &mgm.u.dwords[4], gid, sizeof ( *gid ) );
|
||||
if ( ( rc = arbel_cmd_write_mgm ( arbel, index, &mgm ) ) != 0 ) {
|
||||
DBGC ( arbel, "Arbel %p could not write MGM %#x: %s\n",
|
||||
arbel, index, strerror ( rc ) );
|
||||
return rc;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Detach from multicast group
|
||||
*
|
||||
* @v ibdev Infiniband device
|
||||
* @v qp Queue pair
|
||||
* @v gid Multicast GID
|
||||
*/
|
||||
static void arbel_mcast_detach ( struct ib_device *ibdev,
|
||||
struct ib_queue_pair *qp __unused,
|
||||
union ib_gid *gid ) {
|
||||
struct arbel *arbel = ib_get_drvdata ( ibdev );
|
||||
struct arbelprm_mgm_hash hash;
|
||||
struct arbelprm_mgm_entry mgm;
|
||||
unsigned int index;
|
||||
int rc;
|
||||
|
||||
/* Generate hash table index */
|
||||
if ( ( rc = arbel_cmd_mgid_hash ( arbel, gid, &hash ) ) != 0 ) {
|
||||
DBGC ( arbel, "Arbel %p could not hash GID: %s\n",
|
||||
arbel, strerror ( rc ) );
|
||||
return;
|
||||
}
|
||||
index = MLX_GET ( &hash, hash );
|
||||
|
||||
/* Clear hash table entry */
|
||||
memset ( &mgm, 0, sizeof ( mgm ) );
|
||||
if ( ( rc = arbel_cmd_write_mgm ( arbel, index, &mgm ) ) != 0 ) {
|
||||
DBGC ( arbel, "Arbel %p could not write MGM %#x: %s\n",
|
||||
arbel, index, strerror ( rc ) );
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
/** Arbel Infiniband operations */
|
||||
static struct ib_device_operations arbel_ib_operations = {
|
||||
.create_cq = arbel_create_cq,
|
||||
.destroy_cq = arbel_destroy_cq,
|
||||
.create_qp = arbel_create_qp,
|
||||
.modify_qp = arbel_modify_qp,
|
||||
.destroy_qp = arbel_destroy_qp,
|
||||
.post_send = arbel_post_send,
|
||||
.post_recv = arbel_post_recv,
|
||||
.poll_cq = arbel_poll_cq,
|
||||
.poll_eq = arbel_poll_eq,
|
||||
.open = arbel_open,
|
||||
.close = arbel_close,
|
||||
.mcast_attach = arbel_mcast_attach,
|
||||
.mcast_detach = arbel_mcast_detach,
|
||||
.set_port_info = arbel_inform_sma,
|
||||
.set_pkey_table = arbel_inform_sma,
|
||||
};
|
||||
|
||||
/***************************************************************************
|
||||
*
|
||||
* Firmware control
|
||||
@ -2678,7 +2489,7 @@ static void arbel_free_icm ( struct arbel *arbel ) {
|
||||
|
||||
/***************************************************************************
|
||||
*
|
||||
* PCI interface
|
||||
* Initialisation
|
||||
*
|
||||
***************************************************************************
|
||||
*/
|
||||
@ -2761,6 +2572,202 @@ static int arbel_configure_special_qps ( struct arbel *arbel ) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
/***************************************************************************
|
||||
*
|
||||
* Infiniband link-layer operations
|
||||
*
|
||||
***************************************************************************
|
||||
*/
|
||||
|
||||
/**
|
||||
* Initialise Infiniband link
|
||||
*
|
||||
* @v ibdev Infiniband device
|
||||
* @ret rc Return status code
|
||||
*/
|
||||
static int arbel_open ( struct ib_device *ibdev ) {
|
||||
struct arbel *arbel = ib_get_drvdata ( ibdev );
|
||||
struct arbelprm_init_ib init_ib;
|
||||
int rc;
|
||||
|
||||
memset ( &init_ib, 0, sizeof ( init_ib ) );
|
||||
MLX_FILL_3 ( &init_ib, 0,
|
||||
mtu_cap, ARBEL_MTU_2048,
|
||||
port_width_cap, 3,
|
||||
vl_cap, 1 );
|
||||
MLX_FILL_1 ( &init_ib, 1, max_gid, 1 );
|
||||
MLX_FILL_1 ( &init_ib, 2, max_pkey, 64 );
|
||||
if ( ( rc = arbel_cmd_init_ib ( arbel, ibdev->port,
|
||||
&init_ib ) ) != 0 ) {
|
||||
DBGC ( arbel, "Arbel %p port %d could not intialise IB: %s\n",
|
||||
arbel, ibdev->port, strerror ( rc ) );
|
||||
return rc;
|
||||
}
|
||||
|
||||
/* Update MAD parameters */
|
||||
ib_smc_update ( ibdev, arbel_mad );
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Close Infiniband link
|
||||
*
|
||||
* @v ibdev Infiniband device
|
||||
*/
|
||||
static void arbel_close ( struct ib_device *ibdev ) {
|
||||
struct arbel *arbel = ib_get_drvdata ( ibdev );
|
||||
int rc;
|
||||
|
||||
if ( ( rc = arbel_cmd_close_ib ( arbel, ibdev->port ) ) != 0 ) {
|
||||
DBGC ( arbel, "Arbel %p port %d could not close IB: %s\n",
|
||||
arbel, ibdev->port, strerror ( rc ) );
|
||||
/* Nothing we can do about this */
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Inform embedded subnet management agent of a received MAD
|
||||
*
|
||||
* @v ibdev Infiniband device
|
||||
* @v mad MAD
|
||||
* @ret rc Return status code
|
||||
*/
|
||||
static int arbel_inform_sma ( struct ib_device *ibdev, union ib_mad *mad ) {
|
||||
int rc;
|
||||
|
||||
/* Send the MAD to the embedded SMA */
|
||||
if ( ( rc = arbel_mad ( ibdev, mad ) ) != 0 )
|
||||
return rc;
|
||||
|
||||
/* Update parameters held in software */
|
||||
ib_smc_update ( ibdev, arbel_mad );
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/***************************************************************************
|
||||
*
|
||||
* Multicast group operations
|
||||
*
|
||||
***************************************************************************
|
||||
*/
|
||||
|
||||
/**
|
||||
* Attach to multicast group
|
||||
*
|
||||
* @v ibdev Infiniband device
|
||||
* @v qp Queue pair
|
||||
* @v gid Multicast GID
|
||||
* @ret rc Return status code
|
||||
*/
|
||||
static int arbel_mcast_attach ( struct ib_device *ibdev,
|
||||
struct ib_queue_pair *qp,
|
||||
union ib_gid *gid ) {
|
||||
struct arbel *arbel = ib_get_drvdata ( ibdev );
|
||||
struct arbelprm_mgm_hash hash;
|
||||
struct arbelprm_mgm_entry mgm;
|
||||
unsigned int index;
|
||||
int rc;
|
||||
|
||||
/* Generate hash table index */
|
||||
if ( ( rc = arbel_cmd_mgid_hash ( arbel, gid, &hash ) ) != 0 ) {
|
||||
DBGC ( arbel, "Arbel %p could not hash GID: %s\n",
|
||||
arbel, strerror ( rc ) );
|
||||
return rc;
|
||||
}
|
||||
index = MLX_GET ( &hash, hash );
|
||||
|
||||
/* Check for existing hash table entry */
|
||||
if ( ( rc = arbel_cmd_read_mgm ( arbel, index, &mgm ) ) != 0 ) {
|
||||
DBGC ( arbel, "Arbel %p could not read MGM %#x: %s\n",
|
||||
arbel, index, strerror ( rc ) );
|
||||
return rc;
|
||||
}
|
||||
if ( MLX_GET ( &mgm, mgmqp_0.qi ) != 0 ) {
|
||||
/* FIXME: this implementation allows only a single QP
|
||||
* per multicast group, and doesn't handle hash
|
||||
* collisions. Sufficient for IPoIB but may need to
|
||||
* be extended in future.
|
||||
*/
|
||||
DBGC ( arbel, "Arbel %p MGID index %#x already in use\n",
|
||||
arbel, index );
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
/* Update hash table entry */
|
||||
MLX_FILL_2 ( &mgm, 8,
|
||||
mgmqp_0.qpn_i, qp->qpn,
|
||||
mgmqp_0.qi, 1 );
|
||||
memcpy ( &mgm.u.dwords[4], gid, sizeof ( *gid ) );
|
||||
if ( ( rc = arbel_cmd_write_mgm ( arbel, index, &mgm ) ) != 0 ) {
|
||||
DBGC ( arbel, "Arbel %p could not write MGM %#x: %s\n",
|
||||
arbel, index, strerror ( rc ) );
|
||||
return rc;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Detach from multicast group
|
||||
*
|
||||
* @v ibdev Infiniband device
|
||||
* @v qp Queue pair
|
||||
* @v gid Multicast GID
|
||||
*/
|
||||
static void arbel_mcast_detach ( struct ib_device *ibdev,
|
||||
struct ib_queue_pair *qp __unused,
|
||||
union ib_gid *gid ) {
|
||||
struct arbel *arbel = ib_get_drvdata ( ibdev );
|
||||
struct arbelprm_mgm_hash hash;
|
||||
struct arbelprm_mgm_entry mgm;
|
||||
unsigned int index;
|
||||
int rc;
|
||||
|
||||
/* Generate hash table index */
|
||||
if ( ( rc = arbel_cmd_mgid_hash ( arbel, gid, &hash ) ) != 0 ) {
|
||||
DBGC ( arbel, "Arbel %p could not hash GID: %s\n",
|
||||
arbel, strerror ( rc ) );
|
||||
return;
|
||||
}
|
||||
index = MLX_GET ( &hash, hash );
|
||||
|
||||
/* Clear hash table entry */
|
||||
memset ( &mgm, 0, sizeof ( mgm ) );
|
||||
if ( ( rc = arbel_cmd_write_mgm ( arbel, index, &mgm ) ) != 0 ) {
|
||||
DBGC ( arbel, "Arbel %p could not write MGM %#x: %s\n",
|
||||
arbel, index, strerror ( rc ) );
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
/** Arbel Infiniband operations */
|
||||
static struct ib_device_operations arbel_ib_operations = {
|
||||
.create_cq = arbel_create_cq,
|
||||
.destroy_cq = arbel_destroy_cq,
|
||||
.create_qp = arbel_create_qp,
|
||||
.modify_qp = arbel_modify_qp,
|
||||
.destroy_qp = arbel_destroy_qp,
|
||||
.post_send = arbel_post_send,
|
||||
.post_recv = arbel_post_recv,
|
||||
.poll_cq = arbel_poll_cq,
|
||||
.poll_eq = arbel_poll_eq,
|
||||
.open = arbel_open,
|
||||
.close = arbel_close,
|
||||
.mcast_attach = arbel_mcast_attach,
|
||||
.mcast_detach = arbel_mcast_detach,
|
||||
.set_port_info = arbel_inform_sma,
|
||||
.set_pkey_table = arbel_inform_sma,
|
||||
};
|
||||
|
||||
/***************************************************************************
|
||||
*
|
||||
* PCI interface
|
||||
*
|
||||
***************************************************************************
|
||||
*/
|
||||
|
||||
/**
|
||||
* Probe PCI device
|
||||
*
|
||||
|
Loading…
x
Reference in New Issue
Block a user