Thomas Bogendoerfer 733f2b
From: Dasaratharaman Chandramouli <dasaratharaman.chandramouli@intel.com>
Thomas Bogendoerfer 733f2b
Date: Fri, 4 Aug 2017 13:54:35 -0700
Thomas Bogendoerfer 733f2b
Subject: IB/rdmavt, hfi1, qib: Enhance rdmavt and hfi1 to use 32 bit lids
Thomas Bogendoerfer 733f2b
Patch-mainline: v4.14-rc1
Thomas Bogendoerfer 733f2b
Git-commit: 51e658f5dd362cc8666f3f5ec1986660e3e51047
Thomas Bogendoerfer 733f2b
References: bsc#1060463 FATE#323043 bsc#1027067 FATE#322649 bsc#1058717 FATE#322789
Thomas Bogendoerfer 733f2b
Thomas Bogendoerfer 733f2b
Increase lid used in hfi1 driver to 32 bits. qib continues
Thomas Bogendoerfer 733f2b
to use 16 bit lids.
Thomas Bogendoerfer 733f2b
Thomas Bogendoerfer 733f2b
Reviewed-by: Dennis Dalessandro <dennis.dalessandro@intel.com>
Thomas Bogendoerfer 733f2b
Signed-off-by: Dasaratharaman Chandramouli <dasaratharaman.chandramouli@intel.com>
Thomas Bogendoerfer 733f2b
Signed-off-by: Don Hiatt <don.hiatt@intel.com>
Thomas Bogendoerfer 733f2b
Signed-off-by: Dennis Dalessandro <dennis.dalessandro@intel.com>
Thomas Bogendoerfer 733f2b
Signed-off-by: Doug Ledford <dledford@redhat.com>
Thomas Bogendoerfer 733f2b
Acked-by: Thomas Bogendoerfer <tbogendoerfer@suse.de>
Thomas Bogendoerfer 733f2b
---
Thomas Bogendoerfer 733f2b
 drivers/infiniband/hw/hfi1/chip.c   |   12 +++-
Thomas Bogendoerfer 733f2b
 drivers/infiniband/hw/hfi1/hfi.h    |    2 
Thomas Bogendoerfer 733f2b
 drivers/infiniband/hw/hfi1/mad.c    |   91 +++++++++++++++++++++++++++++++-----
Thomas Bogendoerfer 733f2b
 drivers/infiniband/hw/hfi1/verbs.c  |   23 ---------
Thomas Bogendoerfer 733f2b
 drivers/infiniband/hw/hfi1/verbs.h  |    2 
Thomas Bogendoerfer 733f2b
 drivers/infiniband/hw/qib/qib_mad.c |    4 -
Thomas Bogendoerfer 733f2b
 include/rdma/rdma_vt.h              |    2 
Thomas Bogendoerfer 733f2b
 7 files changed, 93 insertions(+), 43 deletions(-)
Thomas Bogendoerfer 733f2b
Thomas Bogendoerfer 733f2b
--- a/drivers/infiniband/hw/hfi1/chip.c
Thomas Bogendoerfer 733f2b
+++ b/drivers/infiniband/hw/hfi1/chip.c
Thomas Bogendoerfer 733f2b
@@ -10067,10 +10067,16 @@ static void set_lidlmc(struct hfi1_pport
Thomas Bogendoerfer 733f2b
 	struct hfi1_devdata *dd = ppd->dd;
Thomas Bogendoerfer 733f2b
 	u32 mask = ~((1U << ppd->lmc) - 1);
Thomas Bogendoerfer 733f2b
 	u64 c1 = read_csr(ppd->dd, DCC_CFG_PORT_CONFIG1);
Thomas Bogendoerfer 733f2b
+	u32 lid;
Thomas Bogendoerfer 733f2b
 
Thomas Bogendoerfer 733f2b
+	/*
Thomas Bogendoerfer 733f2b
+	 * Program 0 in CSR if port lid is extended. This prevents
Thomas Bogendoerfer 733f2b
+	 * 9B packets being sent out for large lids.
Thomas Bogendoerfer 733f2b
+	 */
Thomas Bogendoerfer 733f2b
+	lid = (ppd->lid >= be16_to_cpu(IB_MULTICAST_LID_BASE)) ? 0 : ppd->lid;
Thomas Bogendoerfer 733f2b
 	c1 &= ~(DCC_CFG_PORT_CONFIG1_TARGET_DLID_SMASK
Thomas Bogendoerfer 733f2b
 		| DCC_CFG_PORT_CONFIG1_DLID_MASK_SMASK);
Thomas Bogendoerfer 733f2b
-	c1 |= ((ppd->lid & DCC_CFG_PORT_CONFIG1_TARGET_DLID_MASK)
Thomas Bogendoerfer 733f2b
+	c1 |= ((lid & DCC_CFG_PORT_CONFIG1_TARGET_DLID_MASK)
Thomas Bogendoerfer 733f2b
 			<< DCC_CFG_PORT_CONFIG1_TARGET_DLID_SHIFT) |
Thomas Bogendoerfer 733f2b
 	      ((mask & DCC_CFG_PORT_CONFIG1_DLID_MASK_MASK)
Thomas Bogendoerfer 733f2b
 			<< DCC_CFG_PORT_CONFIG1_DLID_MASK_SHIFT);
Thomas Bogendoerfer 733f2b
@@ -10081,7 +10087,7 @@ static void set_lidlmc(struct hfi1_pport
Thomas Bogendoerfer 733f2b
 	 */
Thomas Bogendoerfer 733f2b
 	sreg = ((mask & SEND_CTXT_CHECK_SLID_MASK_MASK) <<
Thomas Bogendoerfer 733f2b
 			SEND_CTXT_CHECK_SLID_MASK_SHIFT) |
Thomas Bogendoerfer 733f2b
-	       (((ppd->lid & mask) & SEND_CTXT_CHECK_SLID_VALUE_MASK) <<
Thomas Bogendoerfer 733f2b
+	       (((lid & mask) & SEND_CTXT_CHECK_SLID_VALUE_MASK) <<
Thomas Bogendoerfer 733f2b
 			SEND_CTXT_CHECK_SLID_VALUE_SHIFT);
Thomas Bogendoerfer 733f2b
 
Thomas Bogendoerfer 733f2b
 	for (i = 0; i < dd->chip_send_contexts; i++) {
Thomas Bogendoerfer 733f2b
@@ -10091,7 +10097,7 @@ static void set_lidlmc(struct hfi1_pport
Thomas Bogendoerfer 733f2b
 	}
Thomas Bogendoerfer 733f2b
 
Thomas Bogendoerfer 733f2b
 	/* Now we have to do the same thing for the sdma engines */
Thomas Bogendoerfer 733f2b
-	sdma_update_lmc(dd, mask, ppd->lid);
Thomas Bogendoerfer 733f2b
+	sdma_update_lmc(dd, mask, lid);
Thomas Bogendoerfer 733f2b
 }
Thomas Bogendoerfer 733f2b
 
Thomas Bogendoerfer 733f2b
 static const char *state_completed_string(u32 completed)
Thomas Bogendoerfer 733f2b
--- a/drivers/infiniband/hw/hfi1/hfi.h
Thomas Bogendoerfer 733f2b
+++ b/drivers/infiniband/hw/hfi1/hfi.h
Thomas Bogendoerfer 733f2b
@@ -718,7 +718,7 @@ struct hfi1_pportdata {
Thomas Bogendoerfer 733f2b
 	u32 ibmaxlen;
Thomas Bogendoerfer 733f2b
 	u32 current_egress_rate; /* units [10^6 bits/sec] */
Thomas Bogendoerfer 733f2b
 	/* LID programmed for this instance */
Thomas Bogendoerfer 733f2b
-	u16 lid;
Thomas Bogendoerfer 733f2b
+	u32 lid;
Thomas Bogendoerfer 733f2b
 	/* list of pkeys programmed; 0 if not set */
Thomas Bogendoerfer 733f2b
 	u16 pkeys[MAX_PKEY_VALUES];
Thomas Bogendoerfer 733f2b
 	u16 link_width_supported;
Thomas Bogendoerfer 733f2b
--- a/drivers/infiniband/hw/hfi1/mad.c
Thomas Bogendoerfer 733f2b
+++ b/drivers/infiniband/hw/hfi1/mad.c
Thomas Bogendoerfer 733f2b
@@ -234,6 +234,61 @@ static void subn_handle_opa_trap_repress
Thomas Bogendoerfer 733f2b
 	spin_unlock_irqrestore(&ibp->rvp.lock, flags);
Thomas Bogendoerfer 733f2b
 }
Thomas Bogendoerfer 733f2b
 
Thomas Bogendoerfer 733f2b
+static void hfi1_update_sm_ah_attr(struct hfi1_ibport *ibp,
Thomas Bogendoerfer 733f2b
+				   struct rdma_ah_attr *attr, u32 dlid)
Thomas Bogendoerfer 733f2b
+{
Thomas Bogendoerfer 733f2b
+	rdma_ah_set_dlid(attr, dlid);
Thomas Bogendoerfer 733f2b
+	rdma_ah_set_port_num(attr, ppd_from_ibp(ibp)->port);
Thomas Bogendoerfer 733f2b
+	if (dlid >= be16_to_cpu(IB_MULTICAST_LID_BASE)) {
Thomas Bogendoerfer 733f2b
+		struct ib_global_route *grh = rdma_ah_retrieve_grh(attr);
Thomas Bogendoerfer 733f2b
+
Thomas Bogendoerfer 733f2b
+		rdma_ah_set_ah_flags(attr, IB_AH_GRH);
Thomas Bogendoerfer 733f2b
+		grh->sgid_index = 0;
Thomas Bogendoerfer 733f2b
+		grh->hop_limit = 1;
Thomas Bogendoerfer 733f2b
+		grh->dgid.global.subnet_prefix =
Thomas Bogendoerfer 733f2b
+			ibp->rvp.gid_prefix;
Thomas Bogendoerfer 733f2b
+		grh->dgid.global.interface_id = OPA_MAKE_ID(dlid);
Thomas Bogendoerfer 733f2b
+	}
Thomas Bogendoerfer 733f2b
+}
Thomas Bogendoerfer 733f2b
+
Thomas Bogendoerfer 733f2b
+static int hfi1_modify_qp0_ah(struct hfi1_ibport *ibp,
Thomas Bogendoerfer 733f2b
+			      struct rvt_ah *ah, u32 dlid)
Thomas Bogendoerfer 733f2b
+{
Thomas Bogendoerfer 733f2b
+	struct rdma_ah_attr attr;
Thomas Bogendoerfer 733f2b
+	struct rvt_qp *qp0;
Thomas Bogendoerfer 733f2b
+	int ret = -EINVAL;
Thomas Bogendoerfer 733f2b
+
Thomas Bogendoerfer 733f2b
+	memset(&attr, 0, sizeof(attr));
Thomas Bogendoerfer 733f2b
+	attr.type = ah->ibah.type;
Thomas Bogendoerfer 733f2b
+	hfi1_update_sm_ah_attr(ibp, &attr, dlid);
Thomas Bogendoerfer 733f2b
+	rcu_read_lock();
Thomas Bogendoerfer 733f2b
+	qp0 = rcu_dereference(ibp->rvp.qp[0]);
Thomas Bogendoerfer 733f2b
+	if (qp0)
Thomas Bogendoerfer 733f2b
+		ret = rdma_modify_ah(&ah->ibah, &attr);
Thomas Bogendoerfer 733f2b
+	rcu_read_unlock();
Thomas Bogendoerfer 733f2b
+	return ret;
Thomas Bogendoerfer 733f2b
+}
Thomas Bogendoerfer 733f2b
+
Thomas Bogendoerfer 733f2b
+static struct ib_ah *hfi1_create_qp0_ah(struct hfi1_ibport *ibp, u32 dlid)
Thomas Bogendoerfer 733f2b
+{
Thomas Bogendoerfer 733f2b
+	struct rdma_ah_attr attr;
Thomas Bogendoerfer 733f2b
+	struct ib_ah *ah = ERR_PTR(-EINVAL);
Thomas Bogendoerfer 733f2b
+	struct rvt_qp *qp0;
Thomas Bogendoerfer 733f2b
+	struct hfi1_pportdata *ppd = ppd_from_ibp(ibp);
Thomas Bogendoerfer 733f2b
+	struct hfi1_devdata *dd = dd_from_ppd(ppd);
Thomas Bogendoerfer 733f2b
+	u8 port_num = ppd->port;
Thomas Bogendoerfer 733f2b
+
Thomas Bogendoerfer 733f2b
+	memset(&attr, 0, sizeof(attr));
Thomas Bogendoerfer 733f2b
+	attr.type = rdma_ah_find_type(&dd->verbs_dev.rdi.ibdev, port_num);
Thomas Bogendoerfer 733f2b
+	hfi1_update_sm_ah_attr(ibp, &attr, dlid);
Thomas Bogendoerfer 733f2b
+	rcu_read_lock();
Thomas Bogendoerfer 733f2b
+	qp0 = rcu_dereference(ibp->rvp.qp[0]);
Thomas Bogendoerfer 733f2b
+	if (qp0)
Thomas Bogendoerfer 733f2b
+		ah = rdma_create_ah(qp0->ibqp.pd, &attr);
Thomas Bogendoerfer 733f2b
+	rcu_read_unlock();
Thomas Bogendoerfer 733f2b
+	return ah;
Thomas Bogendoerfer 733f2b
+}
Thomas Bogendoerfer 733f2b
+
Thomas Bogendoerfer 733f2b
 static void send_trap(struct hfi1_ibport *ibp, struct trap_node *trap)
Thomas Bogendoerfer 733f2b
 {
Thomas Bogendoerfer 733f2b
 	struct ib_mad_send_buf *send_buf;
Thomas Bogendoerfer 733f2b
@@ -1283,8 +1338,8 @@ static int __subn_set_opa_portinfo(struc
Thomas Bogendoerfer 733f2b
 	struct hfi1_ibport *ibp;
Thomas Bogendoerfer 733f2b
 	u8 clientrereg;
Thomas Bogendoerfer 733f2b
 	unsigned long flags;
Thomas Bogendoerfer 733f2b
-	u32 smlid, opa_lid; /* tmp vars to hold LID values */
Thomas Bogendoerfer 733f2b
-	u16 lid;
Thomas Bogendoerfer 733f2b
+	u32 smlid;
Thomas Bogendoerfer 733f2b
+	u32 lid;
Thomas Bogendoerfer 733f2b
 	u8 ls_old, ls_new, ps_new;
Thomas Bogendoerfer 733f2b
 	u8 vls;
Thomas Bogendoerfer 733f2b
 	u8 msl;
Thomas Bogendoerfer 733f2b
@@ -1301,22 +1356,20 @@ static int __subn_set_opa_portinfo(struc
Thomas Bogendoerfer 733f2b
 		return reply((struct ib_mad_hdr *)smp);
Thomas Bogendoerfer 733f2b
 	}
Thomas Bogendoerfer 733f2b
 
Thomas Bogendoerfer 733f2b
-	opa_lid = be32_to_cpu(pi->lid);
Thomas Bogendoerfer 733f2b
-	if (opa_lid & 0xFFFF0000) {
Thomas Bogendoerfer 733f2b
-		pr_warn("OPA_PortInfo lid out of range: %X\n", opa_lid);
Thomas Bogendoerfer 733f2b
+	lid = be32_to_cpu(pi->lid);
Thomas Bogendoerfer 733f2b
+	if (lid & 0xFF000000) {
Thomas Bogendoerfer 733f2b
+		pr_warn("OPA_PortInfo lid out of range: %X\n", lid);
Thomas Bogendoerfer 733f2b
 		smp->status |= IB_SMP_INVALID_FIELD;
Thomas Bogendoerfer 733f2b
 		goto get_only;
Thomas Bogendoerfer 733f2b
 	}
Thomas Bogendoerfer 733f2b
 
Thomas Bogendoerfer 733f2b
-	lid = (u16)(opa_lid & 0x0000FFFF);
Thomas Bogendoerfer 733f2b
 
Thomas Bogendoerfer 733f2b
 	smlid = be32_to_cpu(pi->sm_lid);
Thomas Bogendoerfer 733f2b
-	if (smlid & 0xFFFF0000) {
Thomas Bogendoerfer 733f2b
+	if (smlid & 0xFF000000) {
Thomas Bogendoerfer 733f2b
 		pr_warn("OPA_PortInfo SM lid out of range: %X\n", smlid);
Thomas Bogendoerfer 733f2b
 		smp->status |= IB_SMP_INVALID_FIELD;
Thomas Bogendoerfer 733f2b
 		goto get_only;
Thomas Bogendoerfer 733f2b
 	}
Thomas Bogendoerfer 733f2b
-	smlid &= 0x0000FFFF;
Thomas Bogendoerfer 733f2b
 
Thomas Bogendoerfer 733f2b
 	clientrereg = (pi->clientrereg_subnettimeout &
Thomas Bogendoerfer 733f2b
 			OPA_PI_MASK_CLIENT_REREGISTER);
Thomas Bogendoerfer 733f2b
@@ -1331,12 +1384,16 @@ static int __subn_set_opa_portinfo(struc
Thomas Bogendoerfer 733f2b
 	ls_old = driver_lstate(ppd);
Thomas Bogendoerfer 733f2b
 
Thomas Bogendoerfer 733f2b
 	ibp->rvp.mkey = pi->mkey;
Thomas Bogendoerfer 733f2b
-	ibp->rvp.gid_prefix = pi->subnet_prefix;
Thomas Bogendoerfer 733f2b
+	if (ibp->rvp.gid_prefix != pi->subnet_prefix) {
Thomas Bogendoerfer 733f2b
+		ibp->rvp.gid_prefix = pi->subnet_prefix;
Thomas Bogendoerfer 733f2b
+		event.event = IB_EVENT_GID_CHANGE;
Thomas Bogendoerfer 733f2b
+		ib_dispatch_event(&event);
Thomas Bogendoerfer 733f2b
+	}
Thomas Bogendoerfer 733f2b
 	ibp->rvp.mkey_lease_period = be16_to_cpu(pi->mkey_lease_period);
Thomas Bogendoerfer 733f2b
 
Thomas Bogendoerfer 733f2b
 	/* Must be a valid unicast LID address. */
Thomas Bogendoerfer 733f2b
 	if ((lid == 0 && ls_old > IB_PORT_INIT) ||
Thomas Bogendoerfer 733f2b
-	    lid >= be16_to_cpu(IB_MULTICAST_LID_BASE)) {
Thomas Bogendoerfer 733f2b
+	     (hfi1_is_16B_mcast(lid))) {
Thomas Bogendoerfer 733f2b
 		smp->status |= IB_SMP_INVALID_FIELD;
Thomas Bogendoerfer 733f2b
 		pr_warn("SubnSet(OPA_PortInfo) lid invalid 0x%x\n",
Thomas Bogendoerfer 733f2b
 			lid);
Thomas Bogendoerfer 733f2b
@@ -1349,6 +1406,16 @@ static int __subn_set_opa_portinfo(struc
Thomas Bogendoerfer 733f2b
 		hfi1_set_lid(ppd, lid, pi->mkeyprotect_lmc & OPA_PI_MASK_LMC);
Thomas Bogendoerfer 733f2b
 		event.event = IB_EVENT_LID_CHANGE;
Thomas Bogendoerfer 733f2b
 		ib_dispatch_event(&event);
Thomas Bogendoerfer 733f2b
+
Thomas Bogendoerfer 733f2b
+		if (HFI1_PORT_GUID_INDEX + 1 < HFI1_GUIDS_PER_PORT) {
Thomas Bogendoerfer 733f2b
+			/* Manufacture GID from LID to support extended
Thomas Bogendoerfer 733f2b
+			 * addresses
Thomas Bogendoerfer 733f2b
+			 */
Thomas Bogendoerfer 733f2b
+			ppd->guids[HFI1_PORT_GUID_INDEX + 1] =
Thomas Bogendoerfer 733f2b
+				be64_to_cpu(OPA_MAKE_ID(lid));
Thomas Bogendoerfer 733f2b
+			event.event = IB_EVENT_GID_CHANGE;
Thomas Bogendoerfer 733f2b
+			ib_dispatch_event(&event);
Thomas Bogendoerfer 733f2b
+		}
Thomas Bogendoerfer 733f2b
 	}
Thomas Bogendoerfer 733f2b
 
Thomas Bogendoerfer 733f2b
 	msl = pi->smsl & OPA_PI_MASK_SMSL;
Thomas Bogendoerfer 733f2b
@@ -1359,7 +1426,7 @@ static int __subn_set_opa_portinfo(struc
Thomas Bogendoerfer 733f2b
 
Thomas Bogendoerfer 733f2b
 	/* Must be a valid unicast LID address. */
Thomas Bogendoerfer 733f2b
 	if ((smlid == 0 && ls_old > IB_PORT_INIT) ||
Thomas Bogendoerfer 733f2b
-	    smlid >= be16_to_cpu(IB_MULTICAST_LID_BASE)) {
Thomas Bogendoerfer 733f2b
+	     (hfi1_is_16B_mcast(smlid))) {
Thomas Bogendoerfer 733f2b
 		smp->status |= IB_SMP_INVALID_FIELD;
Thomas Bogendoerfer 733f2b
 		pr_warn("SubnSet(OPA_PortInfo) smlid invalid 0x%x\n", smlid);
Thomas Bogendoerfer 733f2b
 	} else if (smlid != ibp->rvp.sm_lid || msl != ibp->rvp.sm_sl) {
Thomas Bogendoerfer 733f2b
@@ -1367,7 +1434,7 @@ static int __subn_set_opa_portinfo(struc
Thomas Bogendoerfer 733f2b
 		spin_lock_irqsave(&ibp->rvp.lock, flags);
Thomas Bogendoerfer 733f2b
 		if (ibp->rvp.sm_ah) {
Thomas Bogendoerfer 733f2b
 			if (smlid != ibp->rvp.sm_lid)
Thomas Bogendoerfer 733f2b
-				rdma_ah_set_dlid(&ibp->rvp.sm_ah->attr, smlid);
Thomas Bogendoerfer 733f2b
+				hfi1_modify_qp0_ah(ibp, ibp->rvp.sm_ah, smlid);
Thomas Bogendoerfer 733f2b
 			if (msl != ibp->rvp.sm_sl)
Thomas Bogendoerfer 733f2b
 				rdma_ah_set_sl(&ibp->rvp.sm_ah->attr, msl);
Thomas Bogendoerfer 733f2b
 		}
Thomas Bogendoerfer 733f2b
--- a/drivers/infiniband/hw/hfi1/verbs.c
Thomas Bogendoerfer 733f2b
+++ b/drivers/infiniband/hw/hfi1/verbs.c
Thomas Bogendoerfer 733f2b
@@ -1394,7 +1394,7 @@ static int query_port(struct rvt_dev_inf
Thomas Bogendoerfer 733f2b
 	struct hfi1_ibdev *verbs_dev = dev_from_rdi(rdi);
Thomas Bogendoerfer 733f2b
 	struct hfi1_devdata *dd = dd_from_dev(verbs_dev);
Thomas Bogendoerfer 733f2b
 	struct hfi1_pportdata *ppd = &dd->pport[port_num - 1];
Thomas Bogendoerfer 733f2b
-	u16 lid = ppd->lid;
Thomas Bogendoerfer 733f2b
+	u32 lid = ppd->lid;
Thomas Bogendoerfer 733f2b
 
Thomas Bogendoerfer 733f2b
 	/* props being zeroed by the caller, avoid zeroing it here */
Thomas Bogendoerfer 733f2b
 	props->lid = lid ? lid : 0;
Thomas Bogendoerfer 733f2b
@@ -1555,27 +1555,6 @@ static void hfi1_notify_new_ah(struct ib
Thomas Bogendoerfer 733f2b
 		ah->log_pmtu = ilog2(dd->vld[ah->vl].mtu);
Thomas Bogendoerfer 733f2b
 }
Thomas Bogendoerfer 733f2b
 
Thomas Bogendoerfer 733f2b
-struct ib_ah *hfi1_create_qp0_ah(struct hfi1_ibport *ibp, u16 dlid)
Thomas Bogendoerfer 733f2b
-{
Thomas Bogendoerfer 733f2b
-	struct rdma_ah_attr attr;
Thomas Bogendoerfer 733f2b
-	struct ib_ah *ah = ERR_PTR(-EINVAL);
Thomas Bogendoerfer 733f2b
-	struct rvt_qp *qp0;
Thomas Bogendoerfer 733f2b
-	struct hfi1_pportdata *ppd = ppd_from_ibp(ibp);
Thomas Bogendoerfer 733f2b
-	struct hfi1_devdata *dd = dd_from_ppd(ppd);
Thomas Bogendoerfer 733f2b
-	u8 port_num = ppd->port;
Thomas Bogendoerfer 733f2b
-
Thomas Bogendoerfer 733f2b
-	memset(&attr, 0, sizeof(attr));
Thomas Bogendoerfer 733f2b
-	attr.type = rdma_ah_find_type(&dd->verbs_dev.rdi.ibdev, port_num);
Thomas Bogendoerfer 733f2b
-	rdma_ah_set_dlid(&attr, dlid);
Thomas Bogendoerfer 733f2b
-	rdma_ah_set_port_num(&attr, ppd_from_ibp(ibp)->port);
Thomas Bogendoerfer 733f2b
-	rcu_read_lock();
Thomas Bogendoerfer 733f2b
-	qp0 = rcu_dereference(ibp->rvp.qp[0]);
Thomas Bogendoerfer 733f2b
-	if (qp0)
Thomas Bogendoerfer 733f2b
-		ah = rdma_create_ah(qp0->ibqp.pd, &attr);
Thomas Bogendoerfer 733f2b
-	rcu_read_unlock();
Thomas Bogendoerfer 733f2b
-	return ah;
Thomas Bogendoerfer 733f2b
-}
Thomas Bogendoerfer 733f2b
-
Thomas Bogendoerfer 733f2b
 /**
Thomas Bogendoerfer 733f2b
  * hfi1_get_npkeys - return the size of the PKEY table for context 0
Thomas Bogendoerfer 733f2b
  * @dd: the hfi1_ib device
Thomas Bogendoerfer 733f2b
--- a/drivers/infiniband/hw/hfi1/verbs.h
Thomas Bogendoerfer 733f2b
+++ b/drivers/infiniband/hw/hfi1/verbs.h
Thomas Bogendoerfer 733f2b
@@ -334,8 +334,6 @@ void hfi1_rc_hdrerr(
Thomas Bogendoerfer 733f2b
 
Thomas Bogendoerfer 733f2b
 u8 ah_to_sc(struct ib_device *ibdev, struct rdma_ah_attr *ah_attr);
Thomas Bogendoerfer 733f2b
 
Thomas Bogendoerfer 733f2b
-struct ib_ah *hfi1_create_qp0_ah(struct hfi1_ibport *ibp, u16 dlid);
Thomas Bogendoerfer 733f2b
-
Thomas Bogendoerfer 733f2b
 void hfi1_rc_send_complete(struct rvt_qp *qp, struct hfi1_opa_header *opah);
Thomas Bogendoerfer 733f2b
 
Thomas Bogendoerfer 733f2b
 void hfi1_ud_rcv(struct hfi1_packet *packet);
Thomas Bogendoerfer 733f2b
--- a/drivers/infiniband/hw/qib/qib_mad.c
Thomas Bogendoerfer 733f2b
+++ b/drivers/infiniband/hw/qib/qib_mad.c
Thomas Bogendoerfer 733f2b
@@ -105,7 +105,7 @@ static void qib_send_trap(struct qib_ibp
Thomas Bogendoerfer 733f2b
 		if (ibp->rvp.sm_lid != be16_to_cpu(IB_LID_PERMISSIVE)) {
Thomas Bogendoerfer 733f2b
 			struct ib_ah *ah;
Thomas Bogendoerfer 733f2b
 
Thomas Bogendoerfer 733f2b
-			ah = qib_create_qp0_ah(ibp, ibp->rvp.sm_lid);
Thomas Bogendoerfer 733f2b
+			ah = qib_create_qp0_ah(ibp, (u16)ibp->rvp.sm_lid);
Thomas Bogendoerfer 733f2b
 			if (IS_ERR(ah))
Thomas Bogendoerfer 733f2b
 				ret = PTR_ERR(ah);
Thomas Bogendoerfer 733f2b
 			else {
Thomas Bogendoerfer 733f2b
@@ -496,7 +496,7 @@ static int subn_get_portinfo(struct ib_s
Thomas Bogendoerfer 733f2b
 		pip->mkey = ibp->rvp.mkey;
Thomas Bogendoerfer 733f2b
 	pip->gid_prefix = ibp->rvp.gid_prefix;
Thomas Bogendoerfer 733f2b
 	pip->lid = cpu_to_be16(ppd->lid);
Thomas Bogendoerfer 733f2b
-	pip->sm_lid = cpu_to_be16(ibp->rvp.sm_lid);
Thomas Bogendoerfer 733f2b
+	pip->sm_lid = cpu_to_be16((u16)ibp->rvp.sm_lid);
Thomas Bogendoerfer 733f2b
 	pip->cap_mask = cpu_to_be32(ibp->rvp.port_cap_flags);
Thomas Bogendoerfer 733f2b
 	/* pip->diag_code; */
Thomas Bogendoerfer 733f2b
 	pip->mkey_lease_period = cpu_to_be16(ibp->rvp.mkey_lease_period);
Thomas Bogendoerfer 733f2b
--- a/include/rdma/rdma_vt.h
Thomas Bogendoerfer 733f2b
+++ b/include/rdma/rdma_vt.h
Thomas Bogendoerfer 733f2b
@@ -91,7 +91,7 @@ struct rvt_ibport {
Thomas Bogendoerfer 733f2b
 	__be16 pma_counter_select[5];
Thomas Bogendoerfer 733f2b
 	u16 pma_tag;
Thomas Bogendoerfer 733f2b
 	u16 mkey_lease_period;
Thomas Bogendoerfer 733f2b
-	u16 sm_lid;
Thomas Bogendoerfer 733f2b
+	u32 sm_lid;
Thomas Bogendoerfer 733f2b
 	u8 sm_sl;
Thomas Bogendoerfer 733f2b
 	u8 mkeyprot;
Thomas Bogendoerfer 733f2b
 	u8 subnet_timeout;