|
@@ -1842,9 +1842,9 @@ static int build_mlx_header(struct mlx4_ib_sqp *sqp, struct ib_send_wr *wr,
|
|
|
{
|
|
|
struct ib_device *ib_dev = sqp->qp.ibqp.device;
|
|
|
struct mlx4_wqe_mlx_seg *mlx = wqe;
|
|
|
+ struct mlx4_wqe_ctrl_seg *ctrl = wqe;
|
|
|
struct mlx4_wqe_inline_seg *inl = wqe + sizeof *mlx;
|
|
|
struct mlx4_ib_ah *ah = to_mah(wr->wr.ud.ah);
|
|
|
- struct net_device *ndev;
|
|
|
union ib_gid sgid;
|
|
|
u16 pkey;
|
|
|
int send_size;
|
|
@@ -1868,12 +1868,11 @@ static int build_mlx_header(struct mlx4_ib_sqp *sqp, struct ib_send_wr *wr,
|
|
|
/* When multi-function is enabled, the ib_core gid
|
|
|
* indexes don't necessarily match the hw ones, so
|
|
|
* we must use our own cache */
|
|
|
- sgid.global.subnet_prefix =
|
|
|
- to_mdev(ib_dev)->sriov.demux[sqp->qp.port - 1].
|
|
|
- subnet_prefix;
|
|
|
- sgid.global.interface_id =
|
|
|
- to_mdev(ib_dev)->sriov.demux[sqp->qp.port - 1].
|
|
|
- guid_cache[ah->av.ib.gid_index];
|
|
|
+ err = mlx4_get_roce_gid_from_slave(to_mdev(ib_dev)->dev,
|
|
|
+ be32_to_cpu(ah->av.ib.port_pd) >> 24,
|
|
|
+ ah->av.ib.gid_index, &sgid.raw[0]);
|
|
|
+ if (err)
|
|
|
+ return err;
|
|
|
} else {
|
|
|
err = ib_get_cached_gid(ib_dev,
|
|
|
be32_to_cpu(ah->av.ib.port_pd) >> 24,
|
|
@@ -1902,6 +1901,9 @@ static int build_mlx_header(struct mlx4_ib_sqp *sqp, struct ib_send_wr *wr,
|
|
|
sqp->ud_header.grh.flow_label =
|
|
|
ah->av.ib.sl_tclass_flowlabel & cpu_to_be32(0xfffff);
|
|
|
sqp->ud_header.grh.hop_limit = ah->av.ib.hop_limit;
|
|
|
+ if (is_eth)
|
|
|
+ memcpy(sqp->ud_header.grh.source_gid.raw, sgid.raw, 16);
|
|
|
+ else {
|
|
|
if (mlx4_is_mfunc(to_mdev(ib_dev)->dev)) {
|
|
|
/* When multi-function is enabled, the ib_core gid
|
|
|
* indexes don't necessarily match the hw ones, so
|
|
@@ -1917,6 +1919,7 @@ static int build_mlx_header(struct mlx4_ib_sqp *sqp, struct ib_send_wr *wr,
|
|
|
be32_to_cpu(ah->av.ib.port_pd) >> 24,
|
|
|
ah->av.ib.gid_index,
|
|
|
&sqp->ud_header.grh.source_gid);
|
|
|
+ }
|
|
|
memcpy(sqp->ud_header.grh.destination_gid.raw,
|
|
|
ah->av.ib.dgid, 16);
|
|
|
}
|
|
@@ -1948,17 +1951,19 @@ static int build_mlx_header(struct mlx4_ib_sqp *sqp, struct ib_send_wr *wr,
|
|
|
}
|
|
|
|
|
|
if (is_eth) {
|
|
|
- u8 *smac;
|
|
|
+ u8 smac[6];
|
|
|
+ struct in6_addr in6;
|
|
|
+
|
|
|
u16 pcp = (be32_to_cpu(ah->av.ib.sl_tclass_flowlabel) >> 29) << 13;
|
|
|
|
|
|
mlx->sched_prio = cpu_to_be16(pcp);
|
|
|
|
|
|
memcpy(sqp->ud_header.eth.dmac_h, ah->av.eth.mac, 6);
|
|
|
/* FIXME: cache smac value? */
|
|
|
- ndev = to_mdev(sqp->qp.ibqp.device)->iboe.netdevs[sqp->qp.port - 1];
|
|
|
- if (!ndev)
|
|
|
- return -ENODEV;
|
|
|
- smac = ndev->dev_addr;
|
|
|
+ memcpy(&ctrl->srcrb_flags16[0], ah->av.eth.mac, 2);
|
|
|
+ memcpy(&ctrl->imm, ah->av.eth.mac + 2, 4);
|
|
|
+ memcpy(&in6, sgid.raw, sizeof(in6));
|
|
|
+ rdma_get_ll_mac(&in6, smac);
|
|
|
memcpy(sqp->ud_header.eth.smac_h, smac, 6);
|
|
|
if (!memcmp(sqp->ud_header.eth.smac_h, sqp->ud_header.eth.dmac_h, 6))
|
|
|
mlx->flags |= cpu_to_be32(MLX4_WQE_CTRL_FORCE_LOOPBACK);
|