在 2018/9/15 18:27, Leon Romanovsky 写道: > 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. Hi, leon The goal that defines av.vlan_en is to configure the vlan_en filed of ud wqe. when judge the device is vlan device. Is ok? thanks Lijun Ou >> 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 >>