On Sat, Sep 15, 2018 at 06:08:57PM +0800, Lijun Ou wrote: > According to the hardware modification, the vlan of the UD > packet is based on the ud_vlan_en field of ud wqe to > determine whether to add a vlan header to the ud > packet. The ud_vlan_en field is filled by the driver > according to judge the net device. > > Signed-off-by: Lijun Ou <oulijun@xxxxxxxxxx> > --- > drivers/infiniband/hw/hns/hns_roce_ah.c | 6 +++++- > drivers/infiniband/hw/hns/hns_roce_device.h | 1 + > drivers/infiniband/hw/hns/hns_roce_hw_v2.c | 3 +++ > drivers/infiniband/hw/hns/hns_roce_hw_v2.h | 2 ++ > 4 files changed, 11 insertions(+), 1 deletion(-) > > diff --git a/drivers/infiniband/hw/hns/hns_roce_ah.c b/drivers/infiniband/hw/hns/hns_roce_ah.c > index 0d96c5b..004b315 100644 > --- a/drivers/infiniband/hw/hns/hns_roce_ah.c > +++ b/drivers/infiniband/hw/hns/hns_roce_ah.c > @@ -49,6 +49,7 @@ struct ib_ah *hns_roce_create_ah(struct ib_pd *ibpd, > struct hns_roce_ah *ah; > u16 vlan_tag = 0xffff; > const struct ib_global_route *grh = rdma_ah_read_grh(ah_attr); > + bool vlan_en = false; > You are not changing this variable and not using it in any decision making. This patch most probably doesn't do what you expected from it. > ah = kzalloc(sizeof(*ah), GFP_ATOMIC); > if (!ah) > @@ -58,8 +59,10 @@ struct ib_ah *hns_roce_create_ah(struct ib_pd *ibpd, > memcpy(ah->av.mac, ah_attr->roce.dmac, ETH_ALEN); > > gid_attr = ah_attr->grh.sgid_attr; > - if (is_vlan_dev(gid_attr->ndev)) > + if (is_vlan_dev(gid_attr->ndev)) { > vlan_tag = vlan_dev_vlan_id(gid_attr->ndev); > + ah->av.vlan_en = vlan_en; > + } > > if (vlan_tag < 0x1000) > vlan_tag |= (rdma_ah_get_sl(ah_attr) & > @@ -71,6 +74,7 @@ struct ib_ah *hns_roce_create_ah(struct ib_pd *ibpd, > HNS_ROCE_PORT_NUM_SHIFT)); > ah->av.gid_index = grh->sgid_index; > ah->av.vlan = cpu_to_le16(vlan_tag); > + ah->av.vlan_en = vlan_en; > dev_dbg(dev, "gid_index = 0x%x,vlan = 0x%x\n", ah->av.gid_index, > ah->av.vlan); > > diff --git a/drivers/infiniband/hw/hns/hns_roce_device.h b/drivers/infiniband/hw/hns/hns_roce_device.h > index 6dadb12..2461804 100644 > --- a/drivers/infiniband/hw/hns/hns_roce_device.h > +++ b/drivers/infiniband/hw/hns/hns_roce_device.h > @@ -458,6 +458,7 @@ struct hns_roce_av { > u8 dgid[HNS_ROCE_GID_SIZE]; > u8 mac[6]; > __le16 vlan; > + bool vlan_en; > }; > > struct hns_roce_ah { > diff --git a/drivers/infiniband/hw/hns/hns_roce_hw_v2.c b/drivers/infiniband/hw/hns/hns_roce_hw_v2.c > index 4020584..86f793b 100644 > --- a/drivers/infiniband/hw/hns/hns_roce_hw_v2.c > +++ b/drivers/infiniband/hw/hns/hns_roce_hw_v2.c > @@ -370,6 +370,9 @@ static int hns_roce_v2_post_send(struct ib_qp *ibqp, > V2_UD_SEND_WQE_BYTE_40_PORTN_S, > qp->port); > > + roce_set_bit(ud_sq_wqe->byte_40, > + V2_UD_SEND_WQE_BYTE_40_UD_VLAN_EN_S, > + ah->av.vlan_en ? 1 : 0); > roce_set_field(ud_sq_wqe->byte_48, > V2_UD_SEND_WQE_BYTE_48_SGID_INDX_M, > V2_UD_SEND_WQE_BYTE_48_SGID_INDX_S, > diff --git a/drivers/infiniband/hw/hns/hns_roce_hw_v2.h b/drivers/infiniband/hw/hns/hns_roce_hw_v2.h > index d04be1c..7ee6ed2 100644 > --- a/drivers/infiniband/hw/hns/hns_roce_hw_v2.h > +++ b/drivers/infiniband/hw/hns/hns_roce_hw_v2.h > @@ -993,6 +993,8 @@ struct hns_roce_v2_ud_send_wqe { > #define V2_UD_SEND_WQE_BYTE_40_PORTN_S 24 > #define V2_UD_SEND_WQE_BYTE_40_PORTN_M GENMASK(26, 24) > > +#define V2_UD_SEND_WQE_BYTE_40_UD_VLAN_EN_S 30 > + > #define V2_UD_SEND_WQE_BYTE_40_LBI_S 31 > > #define V2_UD_SEND_WQE_DMAC_0_S 0 > -- > 1.9.1 >
Attachment:
signature.asc
Description: PGP signature