struct cm_av {
        struct cm_port *port;
        struct rdma_ah_attr ah_attr;
+       u16 dlid_datapath;
        u16 pkey_index;
        u8 timeout;
 };
        struct sa_path_rec *pri_path = param->primary_path;
        struct sa_path_rec *alt_path = param->alternate_path;
        bool pri_ext = false;
+       __be16 lid;
 
        if (pri_path->rec_type == SA_PATH_REC_TYPE_OPA)
                pri_ext = opa_is_extended_lid(pri_path->opa.dlid,
                                              htons(ntohl(sa_path_get_dlid(
                                                      pri_path)))));
        } else {
+
+               if (param->primary_path_inbound) {
+                       lid = param->primary_path_inbound->ib.dlid;
+                       IBA_SET(CM_REQ_PRIMARY_LOCAL_PORT_LID, req_msg,
+                               be16_to_cpu(lid));
+               } else
+                       IBA_SET(CM_REQ_PRIMARY_LOCAL_PORT_LID, req_msg,
+                               be16_to_cpu(IB_LID_PERMISSIVE));
+
                /* Work-around until there's a way to obtain remote LID info */
-               IBA_SET(CM_REQ_PRIMARY_LOCAL_PORT_LID, req_msg,
-                       be16_to_cpu(IB_LID_PERMISSIVE));
                IBA_SET(CM_REQ_PRIMARY_REMOTE_PORT_LID, req_msg,
                        be16_to_cpu(IB_LID_PERMISSIVE));
        }
        spin_lock_irqsave(&cm_id_priv->lock, flags);
 
        cm_move_av_from_path(&cm_id_priv->av, &av);
+       if (param->primary_path_outbound)
+               cm_id_priv->av.dlid_datapath =
+                       be16_to_cpu(param->primary_path_outbound->ib.dlid);
+
        if (param->alternate_path)
                cm_move_av_from_path(&cm_id_priv->alt_av, &alt_av);
 
                                       NULL, 0);
                goto rejected;
        }
+       if (cm_id_priv->av.ah_attr.type == RDMA_AH_ATTR_TYPE_IB)
+               cm_id_priv->av.dlid_datapath =
+                       IBA_GET(CM_REQ_PRIMARY_LOCAL_PORT_LID, req_msg);
+
        if (cm_req_has_alt_path(req_msg)) {
                ret = cm_init_av_by_path(&work->path[1], NULL,
                                         &cm_id_priv->alt_av);
                *qp_attr_mask = IB_QP_STATE | IB_QP_AV | IB_QP_PATH_MTU |
                                IB_QP_DEST_QPN | IB_QP_RQ_PSN;
                qp_attr->ah_attr = cm_id_priv->av.ah_attr;
+               if ((qp_attr->ah_attr.type == RDMA_AH_ATTR_TYPE_IB) &&
+                   cm_id_priv->av.dlid_datapath &&
+                   (cm_id_priv->av.dlid_datapath != 0xffff))
+                       qp_attr->ah_attr.ib.dlid = cm_id_priv->av.dlid_datapath;
                qp_attr->path_mtu = cm_id_priv->path_mtu;
                qp_attr->dest_qp_num = be32_to_cpu(cm_id_priv->remote_qpn);
                qp_attr->rq_psn = be32_to_cpu(cm_id_priv->rq_psn);