Thomas Bogendoerfer 7dd844
From: Selvin Xavier <selvin.xavier@broadcom.com>
Thomas Bogendoerfer 7dd844
Date: Wed, 15 Sep 2021 05:32:42 -0700
Thomas Bogendoerfer 7dd844
Subject: RDMA/bnxt_re: Check if the vlan is valid before reporting
Thomas Bogendoerfer 7dd844
Patch-mainline: v5.16-rc1
Thomas Bogendoerfer 7dd844
Git-commit: 6bda39149d4b8920fdb8744090653aca3daa792d
Thomas Bogendoerfer 7dd844
References: jsc#SLE-18977
Thomas Bogendoerfer 7dd844
Thomas Bogendoerfer 7dd844
When VF is configured with default vlan, HW strips the vlan from the
Thomas Bogendoerfer 7dd844
packet and driver receives it in Rx completion. VLAN needs to be reported
Thomas Bogendoerfer 7dd844
for UD work completion only if the vlan is configured on the host. Add a
Thomas Bogendoerfer 7dd844
check for valid vlan in the UD receive path.
Thomas Bogendoerfer 7dd844
Thomas Bogendoerfer 7dd844
Link: https://lore.kernel.org/r/1631709163-2287-12-git-send-email-selvin.xavier@broadcom.com
Thomas Bogendoerfer 7dd844
Signed-off-by: Selvin Xavier <selvin.xavier@broadcom.com>
Thomas Bogendoerfer 7dd844
Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
Thomas Bogendoerfer 7dd844
Acked-by: Thomas Bogendoerfer <tbogendoerfer@suse.de>
Thomas Bogendoerfer 7dd844
---
Thomas Bogendoerfer 7dd844
 drivers/infiniband/hw/bnxt_re/ib_verbs.c |   12 +++++++++---
Thomas Bogendoerfer 7dd844
 1 file changed, 9 insertions(+), 3 deletions(-)
Thomas Bogendoerfer 7dd844
Thomas Bogendoerfer 7dd844
--- a/drivers/infiniband/hw/bnxt_re/ib_verbs.c
Thomas Bogendoerfer 7dd844
+++ b/drivers/infiniband/hw/bnxt_re/ib_verbs.c
Thomas Bogendoerfer 7dd844
@@ -3365,8 +3365,11 @@ static void bnxt_re_process_res_ud_wc(st
Thomas Bogendoerfer 7dd844
 				      struct ib_wc *wc,
Thomas Bogendoerfer 7dd844
 				      struct bnxt_qplib_cqe *cqe)
Thomas Bogendoerfer 7dd844
 {
Thomas Bogendoerfer 7dd844
+	struct bnxt_re_dev *rdev;
Thomas Bogendoerfer 7dd844
+	u16 vlan_id = 0;
Thomas Bogendoerfer 7dd844
 	u8 nw_type;
Thomas Bogendoerfer 7dd844
 
Thomas Bogendoerfer 7dd844
+	rdev = qp->rdev;
Thomas Bogendoerfer 7dd844
 	wc->opcode = IB_WC_RECV;
Thomas Bogendoerfer 7dd844
 	wc->status = __rc_to_ib_wc_status(cqe->status);
Thomas Bogendoerfer 7dd844
 
Thomas Bogendoerfer 7dd844
@@ -3378,9 +3381,12 @@ static void bnxt_re_process_res_ud_wc(st
Thomas Bogendoerfer 7dd844
 		memcpy(wc->smac, cqe->smac, ETH_ALEN);
Thomas Bogendoerfer 7dd844
 		wc->wc_flags |= IB_WC_WITH_SMAC;
Thomas Bogendoerfer 7dd844
 		if (cqe->flags & CQ_RES_UD_FLAGS_META_FORMAT_VLAN) {
Thomas Bogendoerfer 7dd844
-			wc->vlan_id = (cqe->cfa_meta & 0xFFF);
Thomas Bogendoerfer 7dd844
-			if (wc->vlan_id < 0x1000)
Thomas Bogendoerfer 7dd844
-				wc->wc_flags |= IB_WC_WITH_VLAN;
Thomas Bogendoerfer 7dd844
+			vlan_id = (cqe->cfa_meta & 0xFFF);
Thomas Bogendoerfer 7dd844
+		}
Thomas Bogendoerfer 7dd844
+		/* Mark only if vlan_id is non zero */
Thomas Bogendoerfer 7dd844
+		if (vlan_id && bnxt_re_check_if_vlan_valid(rdev, vlan_id)) {
Thomas Bogendoerfer 7dd844
+			wc->vlan_id = vlan_id;
Thomas Bogendoerfer 7dd844
+			wc->wc_flags |= IB_WC_WITH_VLAN;
Thomas Bogendoerfer 7dd844
 		}
Thomas Bogendoerfer 7dd844
 		nw_type = (cqe->flags & CQ_RES_UD_FLAGS_ROCE_IP_VER_MASK) >>
Thomas Bogendoerfer 7dd844
 			   CQ_RES_UD_FLAGS_ROCE_IP_VER_SFT;