patch 'net/bnxt: fix multicast address set' has been queued to stable release 20.11.5

luca.boccassi at gmail.com luca.boccassi at gmail.com
Fri Feb 18 13:37:52 CET 2022


Hi,

FYI, your patch has been queued to stable release 20.11.5

Note it hasn't been pushed to http://dpdk.org/browse/dpdk-stable yet.
It will be pushed if I get no objections before 02/20/22. So please
shout if anyone has objections.

Also note that after the patch there's a diff of the upstream commit vs the
patch applied to the branch. This will indicate if there was any rebasing
needed to apply to the stable branch. If there were code changes for rebasing
(ie: not only metadata diffs), please double check that the rebase was
correctly done.

Queued patches are on a temporary branch at:
https://github.com/bluca/dpdk-stable

This queued commit can be viewed at:
https://github.com/bluca/dpdk-stable/commit/5ee96222abf74f19cd6f447ba1e844a9d069db05

Thanks.

Luca Boccassi

---
>From 5ee96222abf74f19cd6f447ba1e844a9d069db05 Mon Sep 17 00:00:00 2001
From: Kalesh AP <kalesh-anakkur.purayil at broadcom.com>
Date: Tue, 4 Jan 2022 14:08:07 +0530
Subject: [PATCH] net/bnxt: fix multicast address set

[ upstream commit 4dc9409e01b41a8cd8d53bcc38344666fd42a7c9 ]

Fix bnxt_dev_set_mc_addr_list_op.
Fix to cache the multicast mac addresses added to the port
to the driver private structure memory. Use this cached mc list
to program the FW.

This fixes an issue where multicast packets reception is
successful only if the multicast mac address of the packets
is the first one in the multicast address list of the port.

This is in preparation for another fix in the series.

Fixes: d69851df12b2 ("net/bnxt: support multicast filter and set MAC addr")

Signed-off-by: Kalesh AP <kalesh-anakkur.purayil at broadcom.com>
Reviewed-by: Ajit Khaparde <ajit.khaparde at broadcom.com>
Reviewed-by: Somnath Kotur <somnath.kotur at broadcom.com>
---
 drivers/net/bnxt/bnxt.h        |  5 +++++
 drivers/net/bnxt/bnxt_ethdev.c | 34 +++++++++++++++++++++++++---------
 drivers/net/bnxt/bnxt_hwrm.c   |  4 ++--
 drivers/net/bnxt/bnxt_vnic.c   |  7 +------
 drivers/net/bnxt/bnxt_vnic.h   |  4 ----
 5 files changed, 33 insertions(+), 21 deletions(-)

diff --git a/drivers/net/bnxt/bnxt.h b/drivers/net/bnxt/bnxt.h
index 9a54305dde..823a764191 100644
--- a/drivers/net/bnxt/bnxt.h
+++ b/drivers/net/bnxt/bnxt.h
@@ -854,6 +854,11 @@ struct bnxt {
 	uint16_t		tx_cfa_action;
 	struct bnxt_ring_stats	*prev_rx_ring_stats;
 	struct bnxt_ring_stats	*prev_tx_ring_stats;
+
+#define BNXT_MAX_MC_ADDRS	16
+	struct rte_ether_addr	*mcast_addr_list;
+	rte_iova_t		mc_list_dma_addr;
+	uint32_t		nb_mc_addr;
 };
 
 static
diff --git a/drivers/net/bnxt/bnxt_ethdev.c b/drivers/net/bnxt/bnxt_ethdev.c
index e67e83ea7a..f0b678fc97 100644
--- a/drivers/net/bnxt/bnxt_ethdev.c
+++ b/drivers/net/bnxt/bnxt_ethdev.c
@@ -2771,9 +2771,8 @@ bnxt_dev_set_mc_addr_list_op(struct rte_eth_dev *eth_dev,
 			  uint32_t nb_mc_addr)
 {
 	struct bnxt *bp = eth_dev->data->dev_private;
-	char *mc_addr_list = (char *)mc_addr_set;
 	struct bnxt_vnic_info *vnic;
-	uint32_t off = 0, i = 0;
+	uint32_t i = 0;
 	int rc;
 
 	rc = is_bnxt_in_error(bp);
@@ -2782,6 +2781,8 @@ bnxt_dev_set_mc_addr_list_op(struct rte_eth_dev *eth_dev,
 
 	vnic = BNXT_GET_DEFAULT_VNIC(bp);
 
+	bp->nb_mc_addr = nb_mc_addr;
+
 	if (nb_mc_addr > BNXT_MAX_MC_ADDRS) {
 		vnic->flags |= BNXT_VNIC_INFO_ALLMULTI;
 		goto allmulti;
@@ -2789,14 +2790,10 @@ bnxt_dev_set_mc_addr_list_op(struct rte_eth_dev *eth_dev,
 
 	/* TODO Check for Duplicate mcast addresses */
 	vnic->flags &= ~BNXT_VNIC_INFO_ALLMULTI;
-	for (i = 0; i < nb_mc_addr; i++) {
-		memcpy(vnic->mc_list + off, &mc_addr_list[i],
-			RTE_ETHER_ADDR_LEN);
-		off += RTE_ETHER_ADDR_LEN;
-	}
+	for (i = 0; i < nb_mc_addr; i++)
+		rte_ether_addr_copy(&mc_addr_set[i], &bp->mcast_addr_list[i]);
 
-	vnic->mc_addr_cnt = i;
-	if (vnic->mc_addr_cnt)
+	if (bp->nb_mc_addr)
 		vnic->flags |= BNXT_VNIC_INFO_MCAST;
 	else
 		vnic->flags &= ~BNXT_VNIC_INFO_MCAST;
@@ -4780,6 +4777,23 @@ static int bnxt_setup_mac_addr(struct rte_eth_dev *eth_dev)
 	/* Copy the permanent MAC from the FUNC_QCAPS response */
 	memcpy(&eth_dev->data->mac_addrs[0], bp->mac_addr, RTE_ETHER_ADDR_LEN);
 
+	/*
+	 *  Allocate memory to hold multicast mac addresses added.
+	 *  Used to restore them during reset recovery
+	 */
+	bp->mcast_addr_list = rte_zmalloc("bnxt_mcast_addr_tbl",
+					  sizeof(struct rte_ether_addr) *
+					  BNXT_MAX_MC_ADDRS, 0);
+	if (bp->mcast_addr_list == NULL) {
+		PMD_DRV_LOG(ERR, "Failed to allocate multicast addr table\n");
+		return -ENOMEM;
+	}
+	bp->mc_list_dma_addr = rte_malloc_virt2iova(bp->mcast_addr_list);
+	if (bp->mc_list_dma_addr == RTE_BAD_IOVA) {
+		PMD_DRV_LOG(ERR, "Fail to map mcast_addr_list to physical memory\n");
+		return -ENOMEM;
+	}
+
 	return rc;
 }
 
@@ -5818,6 +5832,8 @@ bnxt_uninit_resources(struct bnxt *bp, bool reconfig_dev)
 	if (!reconfig_dev) {
 		bnxt_free_hwrm_resources(bp);
 		bnxt_free_error_recovery_info(bp);
+		rte_free(bp->mcast_addr_list);
+		bp->mcast_addr_list = NULL;
 	}
 
 	bnxt_uninit_ctx_mem(bp);
diff --git a/drivers/net/bnxt/bnxt_hwrm.c b/drivers/net/bnxt/bnxt_hwrm.c
index 0248f7d34d..6a3f710d2e 100644
--- a/drivers/net/bnxt/bnxt_hwrm.c
+++ b/drivers/net/bnxt/bnxt_hwrm.c
@@ -391,8 +391,8 @@ int bnxt_hwrm_cfa_l2_set_rx_mask(struct bnxt *bp,
 		mask |= HWRM_CFA_L2_SET_RX_MASK_INPUT_MASK_ALL_MCAST;
 	} else if (vnic->flags & BNXT_VNIC_INFO_MCAST) {
 		mask |= HWRM_CFA_L2_SET_RX_MASK_INPUT_MASK_MCAST;
-		req.num_mc_entries = rte_cpu_to_le_32(vnic->mc_addr_cnt);
-		req.mc_tbl_addr = rte_cpu_to_le_64(vnic->mc_list_dma_addr);
+		req.num_mc_entries = rte_cpu_to_le_32(bp->nb_mc_addr);
+		req.mc_tbl_addr = rte_cpu_to_le_64(bp->mc_list_dma_addr);
 	}
 	if (vlan_table) {
 		if (!(mask & HWRM_CFA_L2_SET_RX_MASK_INPUT_MASK_VLAN_NONVLAN))
diff --git a/drivers/net/bnxt/bnxt_vnic.c b/drivers/net/bnxt/bnxt_vnic.c
index 40cad0fd67..53db277ead 100644
--- a/drivers/net/bnxt/bnxt_vnic.c
+++ b/drivers/net/bnxt/bnxt_vnic.c
@@ -126,8 +126,7 @@ int bnxt_alloc_vnic_attributes(struct bnxt *bp)
 	int i;
 	rte_iova_t mz_phys_addr;
 
-	entry_length = HW_HASH_KEY_SIZE +
-		       BNXT_MAX_MC_ADDRS * RTE_ETHER_ADDR_LEN;
+	entry_length = HW_HASH_KEY_SIZE;
 
 	if (BNXT_CHIP_THOR(bp))
 		rss_table_size = BNXT_RSS_TBL_SIZE_THOR *
@@ -169,10 +168,6 @@ int bnxt_alloc_vnic_attributes(struct bnxt *bp)
 
 		vnic->rss_hash_key_dma_addr = vnic->rss_table_dma_addr +
 					      rss_table_size;
-		vnic->mc_list = (void *)((char *)vnic->rss_hash_key +
-				HW_HASH_KEY_SIZE);
-		vnic->mc_list_dma_addr = vnic->rss_hash_key_dma_addr +
-				HW_HASH_KEY_SIZE;
 		bnxt_prandom_bytes(vnic->rss_hash_key, HW_HASH_KEY_SIZE);
 	}
 
diff --git a/drivers/net/bnxt/bnxt_vnic.h b/drivers/net/bnxt/bnxt_vnic.h
index 07c7aeac0d..b5bba81fcf 100644
--- a/drivers/net/bnxt/bnxt_vnic.h
+++ b/drivers/net/bnxt/bnxt_vnic.h
@@ -32,10 +32,6 @@ struct bnxt_vnic_info {
 	uint16_t	*rss_table;
 	rte_iova_t	rss_hash_key_dma_addr;
 	void		*rss_hash_key;
-	rte_iova_t	mc_list_dma_addr;
-	char		*mc_list;
-	uint32_t	mc_addr_cnt;
-#define BNXT_MAX_MC_ADDRS		16
 	uint32_t	flags;
 #define BNXT_VNIC_INFO_PROMISC			(1 << 0)
 #define BNXT_VNIC_INFO_ALLMULTI			(1 << 1)
-- 
2.30.2

---
  Diff of the applied patch vs upstream commit (please double-check if non-empty:
---
--- -	2022-02-18 12:37:39.039607870 +0000
+++ 0023-net-bnxt-fix-multicast-address-set.patch	2022-02-18 12:37:37.570789240 +0000
@@ -1 +1 @@
-From 4dc9409e01b41a8cd8d53bcc38344666fd42a7c9 Mon Sep 17 00:00:00 2001
+From 5ee96222abf74f19cd6f447ba1e844a9d069db05 Mon Sep 17 00:00:00 2001
@@ -5,0 +6,2 @@
+[ upstream commit 4dc9409e01b41a8cd8d53bcc38344666fd42a7c9 ]
+
@@ -18 +19,0 @@
-Cc: stable at dpdk.org
@@ -32 +33 @@
-index 234161053f..521fcb7af3 100644
+index 9a54305dde..823a764191 100644
@@ -35 +36 @@
-@@ -891,6 +891,11 @@ struct bnxt {
+@@ -854,6 +854,11 @@ struct bnxt {
@@ -48 +49 @@
-index f79f33ab4e..50ffa30577 100644
+index e67e83ea7a..f0b678fc97 100644
@@ -51 +52 @@
-@@ -2831,9 +2831,8 @@ bnxt_dev_set_mc_addr_list_op(struct rte_eth_dev *eth_dev,
+@@ -2771,9 +2771,8 @@ bnxt_dev_set_mc_addr_list_op(struct rte_eth_dev *eth_dev,
@@ -62 +63 @@
-@@ -2842,6 +2841,8 @@ bnxt_dev_set_mc_addr_list_op(struct rte_eth_dev *eth_dev,
+@@ -2782,6 +2781,8 @@ bnxt_dev_set_mc_addr_list_op(struct rte_eth_dev *eth_dev,
@@ -71 +72 @@
-@@ -2849,14 +2850,10 @@ bnxt_dev_set_mc_addr_list_op(struct rte_eth_dev *eth_dev,
+@@ -2789,14 +2790,10 @@ bnxt_dev_set_mc_addr_list_op(struct rte_eth_dev *eth_dev,
@@ -89 +90 @@
-@@ -5016,6 +5013,23 @@ static int bnxt_setup_mac_addr(struct rte_eth_dev *eth_dev)
+@@ -4780,6 +4777,23 @@ static int bnxt_setup_mac_addr(struct rte_eth_dev *eth_dev)
@@ -113 +114 @@
-@@ -5916,6 +5930,8 @@ bnxt_uninit_resources(struct bnxt *bp, bool reconfig_dev)
+@@ -5818,6 +5832,8 @@ bnxt_uninit_resources(struct bnxt *bp, bool reconfig_dev)
@@ -123 +124 @@
-index 7bcf36c9cb..568f77a87e 100644
+index 0248f7d34d..6a3f710d2e 100644
@@ -126 +127 @@
-@@ -506,8 +506,8 @@ int bnxt_hwrm_cfa_l2_set_rx_mask(struct bnxt *bp,
+@@ -391,8 +391,8 @@ int bnxt_hwrm_cfa_l2_set_rx_mask(struct bnxt *bp,
@@ -138 +139 @@
-index c63cf4b943..e05dc241dc 100644
+index 40cad0fd67..53db277ead 100644
@@ -149,2 +150,2 @@
- 	if (BNXT_CHIP_P5(bp))
- 		rss_table_size = BNXT_RSS_TBL_SIZE_P5 *
+ 	if (BNXT_CHIP_THOR(bp))
+ 		rss_table_size = BNXT_RSS_TBL_SIZE_THOR *
@@ -163 +164 @@
-index 37b452f281..af3a2dd779 100644
+index 07c7aeac0d..b5bba81fcf 100644


More information about the stable mailing list