Эх сурвалжийг харах

RDMA/hns: Add enable judgement for UD vlan

According to the hardware modification, the vlan of the UD packet is based
on the ud_vlan_en field of the 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 the net device.

Signed-off-by: Lijun Ou <oulijun@huawei.com>
Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
Lijun Ou 6 жил өмнө
parent
commit
8320deb88c

+ 5 - 1
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;
 	struct hns_roce_ah *ah;
 	u16 vlan_tag = 0xffff;
 	u16 vlan_tag = 0xffff;
 	const struct ib_global_route *grh = rdma_ah_read_grh(ah_attr);
 	const struct ib_global_route *grh = rdma_ah_read_grh(ah_attr);
+	bool vlan_en = false;
 
 
 	ah = kzalloc(sizeof(*ah), GFP_ATOMIC);
 	ah = kzalloc(sizeof(*ah), GFP_ATOMIC);
 	if (!ah)
 	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);
 	memcpy(ah->av.mac, ah_attr->roce.dmac, ETH_ALEN);
 
 
 	gid_attr = ah_attr->grh.sgid_attr;
 	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_tag = vlan_dev_vlan_id(gid_attr->ndev);
+		vlan_en = true;
+	}
 
 
 	if (vlan_tag < 0x1000)
 	if (vlan_tag < 0x1000)
 		vlan_tag |= (rdma_ah_get_sl(ah_attr) &
 		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));
 				     HNS_ROCE_PORT_NUM_SHIFT));
 	ah->av.gid_index = grh->sgid_index;
 	ah->av.gid_index = grh->sgid_index;
 	ah->av.vlan = cpu_to_le16(vlan_tag);
 	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,
 	dev_dbg(dev, "gid_index = 0x%x,vlan = 0x%x\n", ah->av.gid_index,
 		ah->av.vlan);
 		ah->av.vlan);
 
 

+ 1 - 0
drivers/infiniband/hw/hns/hns_roce_device.h

@@ -450,6 +450,7 @@ struct hns_roce_av {
 	u8          dgid[HNS_ROCE_GID_SIZE];
 	u8          dgid[HNS_ROCE_GID_SIZE];
 	u8          mac[6];
 	u8          mac[6];
 	__le16      vlan;
 	__le16      vlan;
+	bool	    vlan_en;
 };
 };
 
 
 struct hns_roce_ah {
 struct hns_roce_ah {

+ 3 - 0
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,
 				       V2_UD_SEND_WQE_BYTE_40_PORTN_S,
 				       qp->port);
 				       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,
 			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_M,
 				       V2_UD_SEND_WQE_BYTE_48_SGID_INDX_S,
 				       V2_UD_SEND_WQE_BYTE_48_SGID_INDX_S,

+ 2 - 0
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_S 24
 #define V2_UD_SEND_WQE_BYTE_40_PORTN_M GENMASK(26, 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_BYTE_40_LBI_S 31
 
 
 #define	V2_UD_SEND_WQE_DMAC_0_S 0
 #define	V2_UD_SEND_WQE_DMAC_0_S 0