mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-26 23:45:19 +07:00
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>
This commit is contained in:
parent
944e64093a
commit
8320deb88c
@ -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);
|
||||||
|
|
||||||
|
@ -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 {
|
||||||
|
@ -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,
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user