From: Kalesh A P <kalesh-anakkur.purayil@broadcom.com>
To: stable@dpdk.org
Cc: christian.ehrhardt@canonical.com, ajit.khaparde@broadcom.com
Subject: [PATCH 19.11 3/8] net/bnxt: fix multicast address set
Date: Mon, 7 Mar 2022 20:40:31 +0530 [thread overview]
Message-ID: <20220307151036.7116-4-kalesh-anakkur.purayil@broadcom.com> (raw)
In-Reply-To: <20220307151036.7116-1-kalesh-anakkur.purayil@broadcom.com>
From: Kalesh AP <kalesh-anakkur.purayil@broadcom.com>
[ 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@broadcom.com>
Reviewed-by: Ajit Khaparde <ajit.khaparde@broadcom.com>
Reviewed-by: Somnath Kotur <somnath.kotur@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 73001b1..31cc60a 100644
--- a/drivers/net/bnxt/bnxt.h
+++ b/drivers/net/bnxt/bnxt.h
@@ -710,6 +710,11 @@ struct bnxt {
struct bnxt_error_recovery_info *recovery_info;
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 4a1c1d7..6bd072e 100644
--- a/drivers/net/bnxt/bnxt_ethdev.c
+++ b/drivers/net/bnxt/bnxt_ethdev.c
@@ -2281,9 +2281,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);
@@ -2292,6 +2291,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;
@@ -2299,14 +2300,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;
@@ -4962,6 +4959,23 @@ static int bnxt_setup_mac_addr(struct rte_eth_dev *eth_dev)
/* Copy the permanent MAC from the FUNC_QCAPS response */
memcpy(ð_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;
}
@@ -5249,6 +5263,8 @@ bnxt_uninit_resources(struct bnxt *bp, bool reconfig_dev)
rte_free(bp->recovery_info);
bp->recovery_info = NULL;
}
+ rte_free(bp->mcast_addr_list);
+ bp->mcast_addr_list = NULL;
}
bnxt_uninit_locks(bp);
diff --git a/drivers/net/bnxt/bnxt_hwrm.c b/drivers/net/bnxt/bnxt_hwrm.c
index 6ab8ca7..472bb7c 100644
--- a/drivers/net/bnxt/bnxt_hwrm.c
+++ b/drivers/net/bnxt/bnxt_hwrm.c
@@ -308,8 +308,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 19a4372..8a35f7f 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 f447710..80df2c5 100644
--- a/drivers/net/bnxt/bnxt_vnic.h
+++ b/drivers/net/bnxt/bnxt_vnic.h
@@ -29,10 +29,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.10.1
next prev parent reply other threads:[~2022-03-07 15:10 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-03-07 15:10 [PATCH 19.11 0/8] bnxt fixes backport to 19.11 Kalesh A P
2022-03-07 15:10 ` [PATCH 19.11 1/8] net/bnxt: fix queue stop operation Kalesh A P
2022-03-07 15:10 ` [PATCH 19.11 2/8] net/bnxt: cap maximum number of unicast MAC addresses Kalesh A P
2022-03-07 15:10 ` Kalesh A P [this message]
2022-03-07 15:10 ` [PATCH 19.11 4/8] net/bnxt: restore RSS configuration after reset recovery Kalesh A P
2022-03-07 15:10 ` [PATCH 19.11 5/8] net/bnxt: fix memzone allocation per VNIC Kalesh A P
2022-03-07 15:10 ` [PATCH 19.11 6/8] net/bnxt: fix handling of VF configuration change Kalesh A P
2022-03-07 15:10 ` [PATCH 19.11 7/8] net/bnxt: get maximum supported multicast filters count Kalesh A P
2022-03-07 15:10 ` [PATCH 19.11 8/8] net/bnxt: fix xstats names query overrun Kalesh A P
2022-03-09 8:02 ` [PATCH 19.11 0/8] bnxt fixes backport to 19.11 Christian Ehrhardt
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20220307151036.7116-4-kalesh-anakkur.purayil@broadcom.com \
--to=kalesh-anakkur.purayil@broadcom.com \
--cc=ajit.khaparde@broadcom.com \
--cc=christian.ehrhardt@canonical.com \
--cc=stable@dpdk.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).