IB/core: Define 'ib' and 'roce' rdma_ah_attr types
rdma_ah_attr can now be either ib or roce allowing core components to use one type or the other and also to define attributes unique to a specific type. struct ib_ah is also initialized with the type when its first created. This ensures that calls such as modify_ah dont modify the type of the address handle attribute. Reviewed-by: Ira Weiny <ira.weiny@intel.com> Reviewed-by: Don Hiatt <don.hiatt@intel.com> Reviewed-by: Sean Hefty <sean.hefty@intel.com> Reviewed-by: Niranjana Vishwanathapura <niranjana.vishwanathapura@intel.com> Signed-off-by: Dasaratharaman Chandramouli <dasaratharaman.chandramouli@intel.com> Signed-off-by: Doug Ledford <dledford@redhat.com>
This commit is contained in:

committed by
Doug Ledford

parent
d8966fcd4c
commit
44c58487d5
@@ -597,7 +597,7 @@ struct ib_ah *bnxt_re_create_ah(struct ib_pd *ib_pd,
|
||||
break;
|
||||
}
|
||||
rc = rdma_addr_find_l2_eth_by_grh(&sgid, &grh->dgid,
|
||||
ah_attr->dmac, &vlan_tag,
|
||||
ah_attr->roce.dmac, &vlan_tag,
|
||||
&sgid_attr.ndev->ifindex,
|
||||
NULL);
|
||||
if (rc) {
|
||||
@@ -606,7 +606,7 @@ struct ib_ah *bnxt_re_create_ah(struct ib_pd *ib_pd,
|
||||
}
|
||||
}
|
||||
|
||||
memcpy(ah->qplib_ah.dmac, ah_attr->dmac, ETH_ALEN);
|
||||
memcpy(ah->qplib_ah.dmac, ah_attr->roce.dmac, ETH_ALEN);
|
||||
rc = bnxt_qplib_create_ah(&rdev->qplib_res, &ah->qplib_ah);
|
||||
if (rc) {
|
||||
dev_err(rdev_to_dev(rdev), "Failed to allocate HW AH");
|
||||
@@ -644,8 +644,9 @@ int bnxt_re_query_ah(struct ib_ah *ib_ah, struct rdma_ah_attr *ah_attr)
|
||||
{
|
||||
struct bnxt_re_ah *ah = container_of(ib_ah, struct bnxt_re_ah, ib_ah);
|
||||
|
||||
ah_attr->type = ib_ah->type;
|
||||
rdma_ah_set_sl(ah_attr, ah->qplib_ah.sl);
|
||||
memcpy(ah_attr->dmac, ah->qplib_ah.dmac, ETH_ALEN);
|
||||
memcpy(ah_attr->roce.dmac, ah->qplib_ah.dmac, ETH_ALEN);
|
||||
rdma_ah_set_grh(ah_attr, NULL, 0,
|
||||
ah->qplib_ah.host_sgid_index,
|
||||
0, ah->qplib_ah.traffic_class);
|
||||
@@ -1280,7 +1281,8 @@ int bnxt_re_modify_qp(struct ib_qp *ib_qp, struct ib_qp_attr *qp_attr,
|
||||
qp->qplib_qp.ah.hop_limit = grh->hop_limit;
|
||||
qp->qplib_qp.ah.traffic_class = grh->traffic_class;
|
||||
qp->qplib_qp.ah.sl = rdma_ah_get_sl(&qp_attr->ah_attr);
|
||||
ether_addr_copy(qp->qplib_qp.ah.dmac, qp_attr->ah_attr.dmac);
|
||||
ether_addr_copy(qp->qplib_qp.ah.dmac,
|
||||
qp_attr->ah_attr.roce.dmac);
|
||||
|
||||
status = ib_get_cached_gid(&rdev->ibdev, 1,
|
||||
grh->sgid_index,
|
||||
@@ -1423,13 +1425,14 @@ int bnxt_re_query_qp(struct ib_qp *ib_qp, struct ib_qp_attr *qp_attr,
|
||||
qp_attr->qp_access_flags = __to_ib_access_flags(qplib_qp.access);
|
||||
qp_attr->pkey_index = qplib_qp.pkey_index;
|
||||
qp_attr->qkey = qplib_qp.qkey;
|
||||
qp_attr->ah_attr.type = RDMA_AH_ATTR_TYPE_ROCE;
|
||||
rdma_ah_set_grh(&qp_attr->ah_attr, NULL, qplib_qp.ah.flow_label,
|
||||
qplib_qp.ah.host_sgid_index,
|
||||
qplib_qp.ah.hop_limit,
|
||||
qplib_qp.ah.traffic_class);
|
||||
rdma_ah_set_dgid_raw(&qp_attr->ah_attr, qplib_qp.ah.dgid.data);
|
||||
rdma_ah_set_sl(&qp_attr->ah_attr, qplib_qp.ah.sl);
|
||||
ether_addr_copy(qp_attr->ah_attr.dmac, qplib_qp.ah.dmac);
|
||||
ether_addr_copy(qp_attr->ah_attr.roce.dmac, qplib_qp.ah.dmac);
|
||||
qp_attr->path_mtu = __to_ib_mtu(qplib_qp.path_mtu);
|
||||
qp_attr->timeout = qplib_qp.timeout;
|
||||
qp_attr->retry_cnt = qplib_qp.retry_cnt;
|
||||
|
@@ -1511,8 +1511,12 @@ struct ib_ah *hfi1_create_qp0_ah(struct hfi1_ibport *ibp, u16 dlid)
|
||||
struct rdma_ah_attr attr;
|
||||
struct ib_ah *ah = ERR_PTR(-EINVAL);
|
||||
struct rvt_qp *qp0;
|
||||
struct hfi1_pportdata *ppd = ppd_from_ibp(ibp);
|
||||
struct hfi1_devdata *dd = dd_from_ppd(ppd);
|
||||
u8 port_num = ppd->port;
|
||||
|
||||
memset(&attr, 0, sizeof(attr));
|
||||
attr.type = rdma_ah_find_type(&dd->verbs_dev.rdi.ibdev, port_num);
|
||||
rdma_ah_set_dlid(&attr, dlid);
|
||||
rdma_ah_set_port_num(&attr, ppd_from_ibp(ibp)->port);
|
||||
rcu_read_lock();
|
||||
|
@@ -2738,7 +2738,7 @@ static int hns_roce_v1_m_qp(struct ib_qp *ibqp, const struct ib_qp_attr *attr,
|
||||
goto out;
|
||||
}
|
||||
|
||||
dmac = (u8 *)attr->ah_attr.dmac;
|
||||
dmac = (u8 *)attr->ah_attr.roce.dmac;
|
||||
|
||||
context->sq_rq_bt_l = (u32)(dma_handle);
|
||||
roce_set_field(context->qpc_bytes_24,
|
||||
|
@@ -96,7 +96,7 @@ static struct ib_ah *create_iboe_ah(struct ib_pd *pd,
|
||||
is_mcast = 1;
|
||||
rdma_get_mcast_mac(&in6, ah->av.eth.mac);
|
||||
} else {
|
||||
memcpy(ah->av.eth.mac, ah_attr->dmac, ETH_ALEN);
|
||||
memcpy(ah->av.eth.mac, ah_attr->roce.dmac, ETH_ALEN);
|
||||
}
|
||||
ret = ib_get_cached_gid(pd->device, rdma_ah_get_port_num(ah_attr),
|
||||
grh->sgid_index, &sgid, &gid_attr);
|
||||
@@ -154,9 +154,7 @@ struct ib_ah *mlx4_ib_create_ah(struct ib_pd *pd, struct rdma_ah_attr *ah_attr,
|
||||
if (!ah)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
if (rdma_port_get_link_layer(pd->device,
|
||||
rdma_ah_get_port_num(ah_attr)) ==
|
||||
IB_LINK_LAYER_ETHERNET) {
|
||||
if (ah_attr->type == RDMA_AH_ATTR_TYPE_ROCE) {
|
||||
if (!(rdma_ah_get_ah_flags(ah_attr) & IB_AH_GRH)) {
|
||||
ret = ERR_PTR(-EINVAL);
|
||||
} else {
|
||||
@@ -182,30 +180,29 @@ struct ib_ah *mlx4_ib_create_ah(struct ib_pd *pd, struct rdma_ah_attr *ah_attr,
|
||||
int mlx4_ib_query_ah(struct ib_ah *ibah, struct rdma_ah_attr *ah_attr)
|
||||
{
|
||||
struct mlx4_ib_ah *ah = to_mah(ibah);
|
||||
enum rdma_link_layer ll;
|
||||
int port_num = be32_to_cpu(ah->av.ib.port_pd) >> 24;
|
||||
|
||||
memset(ah_attr, 0, sizeof *ah_attr);
|
||||
rdma_ah_set_port_num(ah_attr,
|
||||
be32_to_cpu(ah->av.ib.port_pd) >> 24);
|
||||
ll = rdma_port_get_link_layer(ibah->device,
|
||||
rdma_ah_get_port_num(ah_attr));
|
||||
if (ll == IB_LINK_LAYER_ETHERNET)
|
||||
ah_attr->type = ibah->type;
|
||||
|
||||
if (ah_attr->type == RDMA_AH_ATTR_TYPE_ROCE) {
|
||||
rdma_ah_set_dlid(ah_attr, 0);
|
||||
rdma_ah_set_sl(ah_attr,
|
||||
be32_to_cpu(ah->av.eth.sl_tclass_flowlabel)
|
||||
>> 29);
|
||||
else
|
||||
} else {
|
||||
rdma_ah_set_dlid(ah_attr, be16_to_cpu(ah->av.ib.dlid));
|
||||
rdma_ah_set_sl(ah_attr,
|
||||
be32_to_cpu(ah->av.ib.sl_tclass_flowlabel)
|
||||
>> 28);
|
||||
}
|
||||
|
||||
rdma_ah_set_dlid(ah_attr, (ll == IB_LINK_LAYER_INFINIBAND) ?
|
||||
be16_to_cpu(ah->av.ib.dlid) : 0);
|
||||
rdma_ah_set_port_num(ah_attr, port_num);
|
||||
if (ah->av.ib.stat_rate)
|
||||
rdma_ah_set_static_rate(ah_attr,
|
||||
ah->av.ib.stat_rate -
|
||||
MLX4_STAT_RATE_OFFSET);
|
||||
rdma_ah_set_path_bits(ah_attr, ah->av.ib.g_slid & 0x7F);
|
||||
|
||||
if (mlx4_ib_ah_grh_present(ah)) {
|
||||
u32 tc_fl = be32_to_cpu(ah->av.ib.sl_tclass_flowlabel);
|
||||
|
||||
|
@@ -196,6 +196,7 @@ static void update_sm_ah(struct mlx4_ib_dev *dev, u8 port_num, u16 lid, u8 sl)
|
||||
return;
|
||||
|
||||
memset(&ah_attr, 0, sizeof ah_attr);
|
||||
ah_attr.type = rdma_ah_find_type(&dev->ib_dev, port_num);
|
||||
rdma_ah_set_dlid(&ah_attr, lid);
|
||||
rdma_ah_set_sl(&ah_attr, sl);
|
||||
rdma_ah_set_port_num(&ah_attr, port_num);
|
||||
@@ -555,6 +556,7 @@ int mlx4_ib_send_to_slave(struct mlx4_ib_dev *dev, int slave, u8 port,
|
||||
/* create ah. Just need an empty one with the port num for the post send.
|
||||
* The driver will set the force loopback bit in post_send */
|
||||
memset(&attr, 0, sizeof attr);
|
||||
attr.type = rdma_ah_find_type(&dev->ib_dev, port);
|
||||
|
||||
rdma_ah_set_port_num(&attr, port);
|
||||
if (is_eth) {
|
||||
|
@@ -1388,8 +1388,6 @@ static int _mlx4_set_path(struct mlx4_ib_dev *dev,
|
||||
u64 smac, u16 vlan_tag, struct mlx4_qp_path *path,
|
||||
struct mlx4_roce_smac_vlan_info *smac_info, u8 port)
|
||||
{
|
||||
int is_eth = rdma_port_get_link_layer(&dev->ib_dev, port) ==
|
||||
IB_LINK_LAYER_ETHERNET;
|
||||
int vidx;
|
||||
int smac_index;
|
||||
int err;
|
||||
@@ -1426,7 +1424,7 @@ static int _mlx4_set_path(struct mlx4_ib_dev *dev,
|
||||
memcpy(path->rgid, grh->dgid.raw, 16);
|
||||
}
|
||||
|
||||
if (is_eth) {
|
||||
if (ah->type == RDMA_AH_ATTR_TYPE_ROCE) {
|
||||
if (!(rdma_ah_get_ah_flags(ah) & IB_AH_GRH))
|
||||
return -1;
|
||||
|
||||
@@ -1490,7 +1488,7 @@ static int _mlx4_set_path(struct mlx4_ib_dev *dev,
|
||||
} else {
|
||||
smac_index = smac_info->smac_index;
|
||||
}
|
||||
memcpy(path->dmac, ah->dmac, 6);
|
||||
memcpy(path->dmac, ah->roce.dmac, 6);
|
||||
path->ackto = MLX4_IB_LINK_TYPE_ETH;
|
||||
/* put MAC table smac index for IBoE */
|
||||
path->grh_mylmc = (u8) (smac_index) | 0x80;
|
||||
@@ -3402,23 +3400,19 @@ static void to_rdma_ah_attr(struct mlx4_ib_dev *ibdev,
|
||||
struct mlx4_qp_path *path)
|
||||
{
|
||||
struct mlx4_dev *dev = ibdev->dev;
|
||||
int is_eth;
|
||||
u8 port_num = path->sched_queue & 0x40 ? 2 : 1;
|
||||
|
||||
memset(ah_attr, 0, sizeof(*ah_attr));
|
||||
rdma_ah_set_port_num(ah_attr, port_num);
|
||||
|
||||
ah_attr->type = rdma_ah_find_type(&ibdev->ib_dev, port_num);
|
||||
if (port_num == 0 || port_num > dev->caps.num_ports)
|
||||
return;
|
||||
|
||||
is_eth = rdma_port_get_link_layer(&ibdev->ib_dev,
|
||||
rdma_ah_get_port_num(ah_attr)) ==
|
||||
IB_LINK_LAYER_ETHERNET;
|
||||
if (is_eth)
|
||||
if (ah_attr->type == RDMA_AH_ATTR_TYPE_ROCE)
|
||||
rdma_ah_set_sl(ah_attr, ((path->sched_queue >> 3) & 0x7) |
|
||||
((path->sched_queue & 4) << 1));
|
||||
else
|
||||
rdma_ah_set_sl(ah_attr, (path->sched_queue >> 2) & 0xf);
|
||||
rdma_ah_set_port_num(ah_attr, port_num);
|
||||
|
||||
rdma_ah_set_dlid(ah_attr, be16_to_cpu(path->rlid));
|
||||
rdma_ah_set_path_bits(ah_attr, path->grh_mylmc & 0x7f);
|
||||
|
@@ -34,8 +34,7 @@
|
||||
|
||||
static struct ib_ah *create_ib_ah(struct mlx5_ib_dev *dev,
|
||||
struct mlx5_ib_ah *ah,
|
||||
struct rdma_ah_attr *ah_attr,
|
||||
enum rdma_link_layer ll)
|
||||
struct rdma_ah_attr *ah_attr)
|
||||
{
|
||||
if (rdma_ah_get_ah_flags(ah_attr) & IB_AH_GRH) {
|
||||
const struct ib_global_route *grh = rdma_ah_read_grh(ah_attr);
|
||||
@@ -50,8 +49,9 @@ static struct ib_ah *create_ib_ah(struct mlx5_ib_dev *dev,
|
||||
|
||||
ah->av.stat_rate_sl = (rdma_ah_get_static_rate(ah_attr) << 4);
|
||||
|
||||
if (ll == IB_LINK_LAYER_ETHERNET) {
|
||||
memcpy(ah->av.rmac, ah_attr->dmac, sizeof(ah_attr->dmac));
|
||||
if (ah_attr->type == RDMA_AH_ATTR_TYPE_ROCE) {
|
||||
memcpy(ah->av.rmac, ah_attr->roce.dmac,
|
||||
sizeof(ah_attr->roce.dmac));
|
||||
ah->av.udp_sport =
|
||||
mlx5_get_roce_udp_sport(dev,
|
||||
rdma_ah_get_port_num(ah_attr),
|
||||
@@ -72,16 +72,13 @@ struct ib_ah *mlx5_ib_create_ah(struct ib_pd *pd, struct rdma_ah_attr *ah_attr,
|
||||
{
|
||||
struct mlx5_ib_ah *ah;
|
||||
struct mlx5_ib_dev *dev = to_mdev(pd->device);
|
||||
enum rdma_link_layer ll;
|
||||
enum rdma_ah_attr_type ah_type = ah_attr->type;
|
||||
|
||||
ll = pd->device->get_link_layer(pd->device,
|
||||
rdma_ah_get_port_num(ah_attr));
|
||||
|
||||
if (ll == IB_LINK_LAYER_ETHERNET &&
|
||||
if ((ah_type == RDMA_AH_ATTR_TYPE_ROCE) &&
|
||||
!(rdma_ah_get_ah_flags(ah_attr) & IB_AH_GRH))
|
||||
return ERR_PTR(-EINVAL);
|
||||
|
||||
if (ll == IB_LINK_LAYER_ETHERNET && udata) {
|
||||
if (ah_type == RDMA_AH_ATTR_TYPE_ROCE && udata) {
|
||||
int err;
|
||||
struct mlx5_ib_create_ah_resp resp = {};
|
||||
u32 min_resp_len = offsetof(typeof(resp), dmac) +
|
||||
@@ -96,7 +93,7 @@ struct ib_ah *mlx5_ib_create_ah(struct ib_pd *pd, struct rdma_ah_attr *ah_attr,
|
||||
if (err)
|
||||
return ERR_PTR(err);
|
||||
|
||||
memcpy(resp.dmac, ah_attr->dmac, ETH_ALEN);
|
||||
memcpy(resp.dmac, ah_attr->roce.dmac, ETH_ALEN);
|
||||
err = ib_copy_to_udata(udata, &resp, resp.response_length);
|
||||
if (err)
|
||||
return ERR_PTR(err);
|
||||
@@ -106,7 +103,7 @@ struct ib_ah *mlx5_ib_create_ah(struct ib_pd *pd, struct rdma_ah_attr *ah_attr,
|
||||
if (!ah)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
return create_ib_ah(dev, ah, ah_attr, ll); /* never fails */
|
||||
return create_ib_ah(dev, ah, ah_attr); /* never fails */
|
||||
}
|
||||
|
||||
int mlx5_ib_query_ah(struct ib_ah *ibah, struct rdma_ah_attr *ah_attr)
|
||||
@@ -115,6 +112,7 @@ int mlx5_ib_query_ah(struct ib_ah *ibah, struct rdma_ah_attr *ah_attr)
|
||||
u32 tmp;
|
||||
|
||||
memset(ah_attr, 0, sizeof(*ah_attr));
|
||||
ah_attr->type = ibah->type;
|
||||
|
||||
tmp = be32_to_cpu(ah->av.grh_gid_fl);
|
||||
if (tmp & (1 << 30)) {
|
||||
|
@@ -2212,7 +2212,6 @@ static int mlx5_set_path(struct mlx5_ib_dev *dev, struct mlx5_ib_qp *qp,
|
||||
bool alt)
|
||||
{
|
||||
const struct ib_global_route *grh = rdma_ah_read_grh(ah);
|
||||
enum rdma_link_layer ll = rdma_port_get_link_layer(&dev->ib_dev, port);
|
||||
int err;
|
||||
enum ib_gid_type gid_type;
|
||||
u8 ah_flags = rdma_ah_get_ah_flags(ah);
|
||||
@@ -2231,14 +2230,15 @@ static int mlx5_set_path(struct mlx5_ib_dev *dev, struct mlx5_ib_qp *qp,
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
if (ll == IB_LINK_LAYER_ETHERNET) {
|
||||
|
||||
if (ah->type == RDMA_AH_ATTR_TYPE_ROCE) {
|
||||
if (!(ah_flags & IB_AH_GRH))
|
||||
return -EINVAL;
|
||||
err = mlx5_get_roce_gid_type(dev, port, grh->sgid_index,
|
||||
&gid_type);
|
||||
if (err)
|
||||
return err;
|
||||
memcpy(path->rmac, ah->dmac, sizeof(ah->dmac));
|
||||
memcpy(path->rmac, ah->roce.dmac, sizeof(ah->roce.dmac));
|
||||
path->udp_sport = mlx5_get_roce_udp_sport(dev, port,
|
||||
grh->sgid_index);
|
||||
path->dci_cfi_prio_sl = (sl & 0x7) << 4;
|
||||
@@ -4259,6 +4259,7 @@ static void to_rdma_ah_attr(struct mlx5_ib_dev *ibdev,
|
||||
|
||||
memset(ah_attr, 0, sizeof(*ah_attr));
|
||||
|
||||
ah_attr->type = rdma_ah_find_type(&ibdev->ib_dev, path->port);
|
||||
rdma_ah_set_port_num(ah_attr, path->port);
|
||||
if (rdma_ah_get_port_num(ah_attr) == 0 ||
|
||||
rdma_ah_get_port_num(ah_attr) > MLX5_CAP_GEN(dev, num_ports))
|
||||
|
@@ -303,6 +303,7 @@ int mthca_ah_query(struct ib_ah *ibah, struct rdma_ah_attr *attr)
|
||||
return -ENOSYS;
|
||||
|
||||
memset(attr, 0, sizeof *attr);
|
||||
attr->type = ibah->type;
|
||||
rdma_ah_set_dlid(attr, be16_to_cpu(ah->av->dlid));
|
||||
rdma_ah_set_sl(attr, be32_to_cpu(ah->av->sl_tclass_flowlabel) >> 28);
|
||||
rdma_ah_set_port_num(attr, port_num);
|
||||
|
@@ -82,6 +82,7 @@ static void update_sm_ah(struct mthca_dev *dev,
|
||||
return;
|
||||
|
||||
memset(&ah_attr, 0, sizeof ah_attr);
|
||||
ah_attr.type = rdma_ah_find_type(&dev->ib_dev, port_num);
|
||||
rdma_ah_set_dlid(&ah_attr, lid);
|
||||
rdma_ah_set_sl(&ah_attr, sl);
|
||||
rdma_ah_set_port_num(&ah_attr, port_num);
|
||||
|
@@ -403,6 +403,7 @@ static void to_rdma_ah_attr(struct mthca_dev *dev,
|
||||
|
||||
if (port_num == 0 || port_num > dev->limits.num_ports)
|
||||
return;
|
||||
ah_attr->type = rdma_ah_find_type(&dev->ib_dev, port_num);
|
||||
rdma_ah_set_port_num(ah_attr, port_num);
|
||||
|
||||
rdma_ah_set_dlid(ah_attr, be16_to_cpu(path->rlid));
|
||||
|
@@ -537,7 +537,7 @@ static inline int ocrdma_resolve_dmac(struct ocrdma_dev *dev,
|
||||
else if (rdma_link_local_addr(&in6))
|
||||
rdma_get_ll_mac(&in6, mac_addr);
|
||||
else
|
||||
memcpy(mac_addr, ah_attr->dmac, ETH_ALEN);
|
||||
memcpy(mac_addr, ah_attr->roce.dmac, ETH_ALEN);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@@ -170,7 +170,8 @@ struct ib_ah *ocrdma_create_ah(struct ib_pd *ibpd, struct rdma_ah_attr *attr,
|
||||
const struct ib_global_route *grh;
|
||||
union ib_gid sgid;
|
||||
|
||||
if (!(rdma_ah_get_ah_flags(attr) & IB_AH_GRH))
|
||||
if ((attr->type != RDMA_AH_ATTR_TYPE_ROCE) ||
|
||||
!(rdma_ah_get_ah_flags(attr) & IB_AH_GRH))
|
||||
return ERR_PTR(-EINVAL);
|
||||
|
||||
grh = rdma_ah_read_grh(attr);
|
||||
@@ -204,7 +205,7 @@ struct ib_ah *ocrdma_create_ah(struct ib_pd *ibpd, struct rdma_ah_attr *attr,
|
||||
(!rdma_is_multicast_addr((struct in6_addr *)grh->dgid.raw)) &&
|
||||
(!rdma_link_local_addr((struct in6_addr *)grh->dgid.raw))) {
|
||||
status = rdma_addr_find_l2_eth_by_grh(&sgid, &grh->dgid,
|
||||
attr->dmac,
|
||||
attr->roce.dmac,
|
||||
&vlan_tag,
|
||||
&sgid_attr.ndev->ifindex,
|
||||
NULL);
|
||||
@@ -259,6 +260,7 @@ int ocrdma_query_ah(struct ib_ah *ibah, struct rdma_ah_attr *attr)
|
||||
struct ocrdma_av *av = ah->av;
|
||||
struct ocrdma_grh *grh;
|
||||
|
||||
attr->type = ibah->type;
|
||||
if (ah->av->valid & OCRDMA_AV_VALID) {
|
||||
grh = (struct ocrdma_grh *)((u8 *)ah->av +
|
||||
sizeof(struct ocrdma_eth_vlan));
|
||||
|
@@ -1598,6 +1598,7 @@ int ocrdma_query_qp(struct ib_qp *ibqp,
|
||||
qp_attr->cap.max_recv_sge = qp->rq.max_sges;
|
||||
qp_attr->cap.max_inline_data = qp->max_inline_data;
|
||||
qp_init_attr->cap = qp_attr->cap;
|
||||
qp_attr->ah_attr.type = RDMA_AH_ATTR_TYPE_ROCE;
|
||||
|
||||
rdma_ah_set_grh(&qp_attr->ah_attr, NULL,
|
||||
params.rnt_rc_sl_fl &
|
||||
|
@@ -308,7 +308,7 @@ static inline int qedr_gsi_build_header(struct qedr_dev *dev,
|
||||
}
|
||||
|
||||
/* ENET + VLAN headers */
|
||||
ether_addr_copy(udh->eth.dmac_h, ah_attr->dmac);
|
||||
ether_addr_copy(udh->eth.dmac_h, ah_attr->roce.dmac);
|
||||
ether_addr_copy(udh->eth.smac_h, dev->ndev->dev_addr);
|
||||
if (has_vlan) {
|
||||
udh->eth.type = htons(ETH_P_8021Q);
|
||||
|
@@ -2029,6 +2029,7 @@ int qedr_query_qp(struct ib_qp *ibqp,
|
||||
qp_attr->cap.max_inline_data = ROCE_REQ_MAX_INLINE_DATA_SIZE;
|
||||
qp_init_attr->cap = qp_attr->cap;
|
||||
|
||||
qp_attr->ah_attr.type = RDMA_AH_ATTR_TYPE_ROCE;
|
||||
rdma_ah_set_grh(&qp_attr->ah_attr, NULL,
|
||||
params.flow_label, qp->sgid_idx,
|
||||
params.hop_limit_ttl, params.traffic_class_tos);
|
||||
|
@@ -1368,9 +1368,11 @@ struct ib_ah *qib_create_qp0_ah(struct qib_ibport *ibp, u16 dlid)
|
||||
struct ib_ah *ah = ERR_PTR(-EINVAL);
|
||||
struct rvt_qp *qp0;
|
||||
struct qib_pportdata *ppd = ppd_from_ibp(ibp);
|
||||
struct qib_devdata *dd = dd_from_ppd(ppd);
|
||||
u8 port_num = ppd->port;
|
||||
|
||||
memset(&attr, 0, sizeof(attr));
|
||||
attr.type = rdma_ah_find_type(&dd->verbs_dev.rdi.ibdev, port_num);
|
||||
rdma_ah_set_dlid(&attr, dlid);
|
||||
rdma_ah_set_port_num(&attr, port_num);
|
||||
rcu_read_lock();
|
||||
|
@@ -280,6 +280,7 @@ void ib_global_route_to_pvrdma(struct pvrdma_global_route *dst,
|
||||
void pvrdma_ah_attr_to_rdma(struct rdma_ah_attr *dst,
|
||||
const struct pvrdma_ah_attr *src)
|
||||
{
|
||||
dst->type = RDMA_AH_ATTR_TYPE_ROCE;
|
||||
pvrdma_global_route_to_ib(rdma_ah_retrieve_grh(dst), &src->grh);
|
||||
rdma_ah_set_dlid(dst, src->dlid);
|
||||
rdma_ah_set_sl(dst, src->sl);
|
||||
@@ -287,7 +288,7 @@ void pvrdma_ah_attr_to_rdma(struct rdma_ah_attr *dst,
|
||||
rdma_ah_set_static_rate(dst, src->static_rate);
|
||||
rdma_ah_set_ah_flags(dst, src->ah_flags);
|
||||
rdma_ah_set_port_num(dst, src->port_num);
|
||||
memcpy(dst->dmac, &src->dmac, ETH_ALEN);
|
||||
memcpy(dst->roce.dmac, &src->dmac, ETH_ALEN);
|
||||
}
|
||||
|
||||
void rdma_ah_attr_to_pvrdma(struct pvrdma_ah_attr *dst,
|
||||
@@ -300,5 +301,5 @@ void rdma_ah_attr_to_pvrdma(struct pvrdma_ah_attr *dst,
|
||||
dst->static_rate = rdma_ah_get_static_rate(src);
|
||||
dst->ah_flags = rdma_ah_get_ah_flags(src);
|
||||
dst->port_num = rdma_ah_get_port_num(src);
|
||||
memcpy(&dst->dmac, src->dmac, sizeof(dst->dmac));
|
||||
memcpy(&dst->dmac, src->roce.dmac, sizeof(dst->dmac));
|
||||
}
|
||||
|
@@ -525,17 +525,14 @@ struct ib_ah *pvrdma_create_ah(struct ib_pd *pd, struct rdma_ah_attr *ah_attr,
|
||||
{
|
||||
struct pvrdma_dev *dev = to_vdev(pd->device);
|
||||
struct pvrdma_ah *ah;
|
||||
enum rdma_link_layer ll;
|
||||
const struct ib_global_route *grh;
|
||||
u8 port_num = rdma_ah_get_port_num(ah_attr);
|
||||
|
||||
if (!(rdma_ah_get_ah_flags(ah_attr) & IB_AH_GRH))
|
||||
return ERR_PTR(-EINVAL);
|
||||
ll = rdma_port_get_link_layer(pd->device,
|
||||
rdma_ah_get_port_num(ah_attr));
|
||||
grh = rdma_ah_read_grh(ah_attr);
|
||||
|
||||
if (ll != IB_LINK_LAYER_ETHERNET ||
|
||||
grh = rdma_ah_read_grh(ah_attr);
|
||||
if ((ah_attr->type != RDMA_AH_ATTR_TYPE_ROCE) ||
|
||||
rdma_is_multicast_addr((struct in6_addr *)grh->dgid.raw))
|
||||
return ERR_PTR(-EINVAL);
|
||||
|
||||
@@ -556,7 +553,7 @@ struct ib_ah *pvrdma_create_ah(struct ib_pd *pd, struct rdma_ah_attr *ah_attr,
|
||||
ah->av.sl_tclass_flowlabel = (grh->traffic_class << 20) |
|
||||
grh->flow_label;
|
||||
memcpy(ah->av.dgid, grh->dgid.raw, 16);
|
||||
memcpy(ah->av.dmac, ah_attr->dmac, ETH_ALEN);
|
||||
memcpy(ah->av.dmac, ah_attr->roce.dmac, ETH_ALEN);
|
||||
|
||||
ah->ibah.device = pd->device;
|
||||
ah->ibah.pd = pd;
|
||||
|
Reference in New Issue
Block a user