在 2018/9/18 16:54, Leon Romanovsky 写道: > On Mon, Sep 17, 2018 at 09:55:15PM +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> >> --- >> V1->V2: >> - Assign the vlan_en for true when the device is vlan device >> --- >> 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..9990dc9 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; >> >> 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); >> + vlan_en = true; >> + } >> >> 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, > > According to hns code, all those "bool vlan_en" can be replaced to something like this: > roce_set_bit(ud_sq_wqe->byte_40, V2_UD_SEND_WQE_BYTE_40_UD_VLAN_EN_S, (ah->av.vlan_tag != cpu_to_le16(0xFFFF))) > Hi, Leon Firstly, thank your advice. At the begining, I also consider your suggestion because the 0xffff is out of the range of vlan. because the hardware will distinguish the device whether the vlan tag is 0xffff. if the vlan tag is 0xffff, the hardware will distinguish as non-vlan device. Therefore, the old hardware does have this patch. But the new design have changed. In order to extend the range of vlan and make it more flexible, the hardware have modified the judgement. The hardware distinguish whether it is vlan device according to the vlan_en field. In the future, the range of vlan include 0xffff, the new desgin may be more suitable Currently, your advice may be the same with this patch and your advice is more concise. is it ok? thanks Lijun Ou >> + 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 >>