|
@@ -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;
|