Commit c90ea9d8 authored by Moni Shoua's avatar Moni Shoua Committed by Doug Ledford

IB/core: Change ib_resolve_eth_dmac to use it in create AH

The function ib_resolve_eth_dmac() requires struct qp_attr * and
qp_attr_mask as parameters while the function might be useful to resolve
dmac for address handles. This patch changes the signature of the
function so it can be used in the flow of creating an address handle.
Signed-off-by: default avatarMoni Shoua <monis@mellanox.com>
Reviewed-by: default avatarYishai Hadas <yishaih@mellanox.com>
Signed-off-by: default avatarLeon Romanovsky <leon@kernel.org>
Signed-off-by: default avatarDoug Ledford <dledford@redhat.com>
parent 2d1e697e
...@@ -72,9 +72,6 @@ void ib_device_unregister_sysfs(struct ib_device *device); ...@@ -72,9 +72,6 @@ void ib_device_unregister_sysfs(struct ib_device *device);
void ib_cache_setup(void); void ib_cache_setup(void);
void ib_cache_cleanup(void); void ib_cache_cleanup(void);
int ib_resolve_eth_dmac(struct ib_qp *qp,
struct ib_qp_attr *qp_attr, int *qp_attr_mask);
typedef void (*roce_netdev_callback)(struct ib_device *device, u8 port, typedef void (*roce_netdev_callback)(struct ib_device *device, u8 port,
struct net_device *idev, void *cookie); struct net_device *idev, void *cookie);
......
...@@ -2402,9 +2402,11 @@ ssize_t ib_uverbs_modify_qp(struct ib_uverbs_file *file, ...@@ -2402,9 +2402,11 @@ ssize_t ib_uverbs_modify_qp(struct ib_uverbs_file *file,
attr->alt_ah_attr.port_num = cmd.alt_dest.port_num; attr->alt_ah_attr.port_num = cmd.alt_dest.port_num;
if (qp->real_qp == qp) { if (qp->real_qp == qp) {
ret = ib_resolve_eth_dmac(qp, attr, &cmd.attr_mask); if (cmd.attr_mask & IB_QP_AV) {
if (ret) ret = ib_resolve_eth_dmac(qp->device, &attr->ah_attr);
goto release_qp; if (ret)
goto release_qp;
}
ret = qp->device->modify_qp(qp, attr, ret = qp->device->modify_qp(qp, attr,
modify_qp_mask(qp->qp_type, cmd.attr_mask), &udata); modify_qp_mask(qp->qp_type, cmd.attr_mask), &udata);
} else { } else {
......
...@@ -1198,66 +1198,66 @@ int ib_modify_qp_is_ok(enum ib_qp_state cur_state, enum ib_qp_state next_state, ...@@ -1198,66 +1198,66 @@ int ib_modify_qp_is_ok(enum ib_qp_state cur_state, enum ib_qp_state next_state,
} }
EXPORT_SYMBOL(ib_modify_qp_is_ok); EXPORT_SYMBOL(ib_modify_qp_is_ok);
int ib_resolve_eth_dmac(struct ib_qp *qp, int ib_resolve_eth_dmac(struct ib_device *device,
struct ib_qp_attr *qp_attr, int *qp_attr_mask) struct ib_ah_attr *ah_attr)
{ {
int ret = 0; int ret = 0;
if (*qp_attr_mask & IB_QP_AV) { if (ah_attr->port_num < rdma_start_port(device) ||
if (qp_attr->ah_attr.port_num < rdma_start_port(qp->device) || ah_attr->port_num > rdma_end_port(device))
qp_attr->ah_attr.port_num > rdma_end_port(qp->device)) return -EINVAL;
return -EINVAL;
if (!rdma_cap_eth_ah(qp->device, qp_attr->ah_attr.port_num))
return 0;
if (rdma_link_local_addr((struct in6_addr *)qp_attr->ah_attr.grh.dgid.raw)) {
rdma_get_ll_mac((struct in6_addr *)qp_attr->ah_attr.grh.dgid.raw,
qp_attr->ah_attr.dmac);
} else {
union ib_gid sgid;
struct ib_gid_attr sgid_attr;
int ifindex;
int hop_limit;
ret = ib_query_gid(qp->device,
qp_attr->ah_attr.port_num,
qp_attr->ah_attr.grh.sgid_index,
&sgid, &sgid_attr);
if (ret || !sgid_attr.ndev) {
if (!ret)
ret = -ENXIO;
goto out;
}
ifindex = sgid_attr.ndev->ifindex; if (!rdma_cap_eth_ah(device, ah_attr->port_num))
return 0;
ret = rdma_addr_find_l2_eth_by_grh(&sgid, if (rdma_link_local_addr((struct in6_addr *)ah_attr->grh.dgid.raw)) {
&qp_attr->ah_attr.grh.dgid, rdma_get_ll_mac((struct in6_addr *)ah_attr->grh.dgid.raw,
qp_attr->ah_attr.dmac, ah_attr->dmac);
NULL, &ifindex, &hop_limit); } else {
union ib_gid sgid;
struct ib_gid_attr sgid_attr;
int ifindex;
int hop_limit;
ret = ib_query_gid(device,
ah_attr->port_num,
ah_attr->grh.sgid_index,
&sgid, &sgid_attr);
if (ret || !sgid_attr.ndev) {
if (!ret)
ret = -ENXIO;
goto out;
}
dev_put(sgid_attr.ndev); ifindex = sgid_attr.ndev->ifindex;
qp_attr->ah_attr.grh.hop_limit = hop_limit; ret = rdma_addr_find_l2_eth_by_grh(&sgid,
} &ah_attr->grh.dgid,
ah_attr->dmac,
NULL, &ifindex, &hop_limit);
dev_put(sgid_attr.ndev);
ah_attr->grh.hop_limit = hop_limit;
} }
out: out:
return ret; return ret;
} }
EXPORT_SYMBOL(ib_resolve_eth_dmac); EXPORT_SYMBOL(ib_resolve_eth_dmac);
int ib_modify_qp(struct ib_qp *qp, int ib_modify_qp(struct ib_qp *qp,
struct ib_qp_attr *qp_attr, struct ib_qp_attr *qp_attr,
int qp_attr_mask) int qp_attr_mask)
{ {
int ret;
ret = ib_resolve_eth_dmac(qp, qp_attr, &qp_attr_mask); if (qp_attr_mask & IB_QP_AV) {
if (ret) int ret;
return ret;
ret = ib_resolve_eth_dmac(qp->device, &qp_attr->ah_attr);
if (ret)
return ret;
}
return qp->device->modify_qp(qp->real_qp, qp_attr, qp_attr_mask, NULL); return qp->device->modify_qp(qp->real_qp, qp_attr, qp_attr_mask, NULL);
} }
......
...@@ -3394,4 +3394,6 @@ void ib_drain_rq(struct ib_qp *qp); ...@@ -3394,4 +3394,6 @@ void ib_drain_rq(struct ib_qp *qp);
void ib_drain_sq(struct ib_qp *qp); void ib_drain_sq(struct ib_qp *qp);
void ib_drain_qp(struct ib_qp *qp); void ib_drain_qp(struct ib_qp *qp);
int ib_resolve_eth_dmac(struct ib_device *device,
struct ib_ah_attr *ah_attr);
#endif /* IB_VERBS_H */ #endif /* IB_VERBS_H */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment