IB/mthca: Implement query_ah method
Implement query_ah (except for AVs which are in HCA memory). This is needed to implement RMPP duplicate session detection on sending side (extraction of DGID/DLID and GRH flag from address handle). Signed-off-by: Jack Morgenstein <jackm@mellanox.co.il> Signed-off-by: Roland Dreier <rolandd@cisco.com>
This commit is contained in:
Родитель
14abdffcc0
Коммит
1d89b1ae6c
|
@ -193,6 +193,37 @@ int mthca_read_ah(struct mthca_dev *dev, struct mthca_ah *ah,
|
|||
return 0;
|
||||
}
|
||||
|
||||
int mthca_ah_query(struct ib_ah *ibah, struct ib_ah_attr *attr)
|
||||
{
|
||||
struct mthca_ah *ah = to_mah(ibah);
|
||||
struct mthca_dev *dev = to_mdev(ibah->device);
|
||||
|
||||
/* Only implement for MAD and memfree ah for now. */
|
||||
if (ah->type == MTHCA_AH_ON_HCA)
|
||||
return -ENOSYS;
|
||||
|
||||
memset(attr, 0, sizeof *attr);
|
||||
attr->dlid = be16_to_cpu(ah->av->dlid);
|
||||
attr->sl = be32_to_cpu(ah->av->sl_tclass_flowlabel) >> 28;
|
||||
attr->static_rate = ah->av->msg_sr & 0x7;
|
||||
attr->src_path_bits = ah->av->g_slid & 0x7F;
|
||||
attr->port_num = be32_to_cpu(ah->av->port_pd) >> 24;
|
||||
attr->ah_flags = mthca_ah_grh_present(ah) ? IB_AH_GRH : 0;
|
||||
|
||||
if (attr->ah_flags) {
|
||||
attr->grh.traffic_class =
|
||||
be32_to_cpu(ah->av->sl_tclass_flowlabel) >> 20;
|
||||
attr->grh.flow_label =
|
||||
be32_to_cpu(ah->av->sl_tclass_flowlabel) & 0xfffff;
|
||||
attr->grh.hop_limit = ah->av->hop_limit;
|
||||
attr->grh.sgid_index = ah->av->gid_index &
|
||||
(dev->limits.gid_table_len - 1);
|
||||
memcpy(attr->grh.dgid.raw, ah->av->dgid, 16);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int __devinit mthca_init_av_table(struct mthca_dev *dev)
|
||||
{
|
||||
int err;
|
||||
|
|
|
@ -539,6 +539,7 @@ int mthca_create_ah(struct mthca_dev *dev,
|
|||
int mthca_destroy_ah(struct mthca_dev *dev, struct mthca_ah *ah);
|
||||
int mthca_read_ah(struct mthca_dev *dev, struct mthca_ah *ah,
|
||||
struct ib_ud_header *header);
|
||||
int mthca_ah_query(struct ib_ah *ibah, struct ib_ah_attr *attr);
|
||||
int mthca_ah_grh_present(struct mthca_ah *ah);
|
||||
|
||||
int mthca_multicast_attach(struct ib_qp *ibqp, union ib_gid *gid, u16 lid);
|
||||
|
|
|
@ -1289,6 +1289,7 @@ int mthca_register_device(struct mthca_dev *dev)
|
|||
dev->ib_dev.alloc_pd = mthca_alloc_pd;
|
||||
dev->ib_dev.dealloc_pd = mthca_dealloc_pd;
|
||||
dev->ib_dev.create_ah = mthca_ah_create;
|
||||
dev->ib_dev.query_ah = mthca_ah_query;
|
||||
dev->ib_dev.destroy_ah = mthca_ah_destroy;
|
||||
|
||||
if (dev->mthca_flags & MTHCA_FLAG_SRQ) {
|
||||
|
|
Загрузка…
Ссылка в новой задаче