[dpdk-dev,27/28] bnxt: add support for set_mc_addr_list dev_op
Checks
Commit Message
This patch adds set_mc_addr_list dev_ops to support adding Multicast addr.
If the number of Multicast addresses is more than the maximum number of
Multicast addresses that the hardware supports, the PMD will enable
Multicast Promiscuous mode for the specified function.
Signed-off-by: Ajit Khaparde <ajit.khaparde@broadcom.com>
---
drivers/net/bnxt/bnxt_ethdev.c | 31 +++++++++++++++++++++++++++++++
drivers/net/bnxt/bnxt_hwrm.c | 13 +++++++++----
drivers/net/bnxt/bnxt_vnic.c | 7 ++++++-
drivers/net/bnxt/bnxt_vnic.h | 6 +++++-
4 files changed, 51 insertions(+), 6 deletions(-)
@@ -1373,6 +1373,36 @@ bnxt_set_default_mac_addr_op(struct rte_eth_dev *dev, struct ether_addr *addr)
}
}
+static int
+bnxt_dev_set_mc_addr_list_op(struct rte_eth_dev *eth_dev,
+ struct ether_addr *mc_addr_set,
+ uint32_t nb_mc_addr)
+{
+ struct bnxt *bp = (struct bnxt *)eth_dev->data->dev_private;
+ char *mc_addr_list = (char *)mc_addr_set;
+ struct bnxt_vnic_info *vnic;
+ uint32_t off = 0, i = 0;
+
+ vnic = &bp->vnic_info[0];
+
+ if (nb_mc_addr > BNXT_MAX_MC_ADDRS) {
+ vnic->flags |= BNXT_VNIC_INFO_ALLMULTI;
+ goto allmulti;
+ }
+
+ /* 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], ETHER_ADDR_LEN);
+ off += ETHER_ADDR_LEN;
+ }
+
+ vnic->mc_addr_cnt = i;
+
+allmulti:
+ return bnxt_hwrm_cfa_l2_set_rx_mask(bp, vnic);
+}
+
/*
* Initialization
*/
@@ -1413,6 +1443,7 @@ static const struct eth_dev_ops bnxt_dev_ops = {
.xstats_get = bnxt_dev_xstats_get_op,
.xstats_get_names = bnxt_dev_xstats_get_names_op,
.xstats_reset = bnxt_dev_xstats_reset_op,
+ .set_mc_addr_list = bnxt_dev_set_mc_addr_list_op,
};
static bool bnxt_vf_pciid(uint16_t id)
@@ -192,7 +192,7 @@ int bnxt_hwrm_cfa_l2_clear_rx_mask(struct bnxt *bp, struct bnxt_vnic_info *vnic)
struct hwrm_cfa_l2_set_rx_mask_output *resp = bp->hwrm_cmd_resp_addr;
HWRM_PREP(req, CFA_L2_SET_RX_MASK, -1, resp);
- req.vnic_id = rte_cpu_to_le_16(vnic->fw_vnic_id);
+ req.vnic_id = rte_cpu_to_le_32(vnic->fw_vnic_id);
req.mask = 0;
rc = bnxt_hwrm_send_message(bp, &req, sizeof(req));
@@ -226,6 +226,11 @@ int bnxt_hwrm_cfa_l2_set_rx_mask(struct bnxt *bp, struct bnxt_vnic_info *vnic)
mask |= HWRM_CFA_L2_SET_RX_MASK_INPUT_MASK_ALL_MCAST;
if (vnic->flags & BNXT_VNIC_INFO_MCAST)
mask |= HWRM_CFA_L2_SET_RX_MASK_INPUT_MASK_MCAST;
+ if (vnic->mc_addr_cnt) {
+ 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.mask = rte_cpu_to_le_32(mask);
@@ -886,7 +891,7 @@ int bnxt_hwrm_vnic_alloc(struct bnxt *bp, struct bnxt_vnic_info *vnic)
HWRM_CHECK_RESULT;
- vnic->fw_vnic_id = rte_le_to_cpu_16(resp->vnic_id);
+ vnic->fw_vnic_id = rte_le_to_cpu_32(resp->vnic_id);
return rc;
}
@@ -903,7 +908,7 @@ int bnxt_hwrm_vnic_cfg(struct bnxt *bp, struct bnxt_vnic_info *vnic)
rte_cpu_to_le_32(HWRM_VNIC_CFG_INPUT_ENABLES_DFLT_RING_GRP |
HWRM_VNIC_CFG_INPUT_ENABLES_RSS_RULE |
HWRM_VNIC_CFG_INPUT_ENABLES_MRU);
- req.vnic_id = rte_cpu_to_le_16(vnic->fw_vnic_id);
+ req.vnic_id = rte_cpu_to_le_32(vnic->fw_vnic_id);
req.dflt_ring_grp =
rte_cpu_to_le_16(bp->grp_info[vnic->start_grp_id].fw_grp_id);
req.rss_rule = rte_cpu_to_le_16(vnic->fw_rss_cos_lb_ctx);
@@ -1010,7 +1015,7 @@ int bnxt_hwrm_vnic_free(struct bnxt *bp, struct bnxt_vnic_info *vnic)
HWRM_PREP(req, VNIC_FREE, -1, resp);
- req.vnic_id = rte_cpu_to_le_16(vnic->fw_vnic_id);
+ req.vnic_id = rte_cpu_to_le_32(vnic->fw_vnic_id);
rc = bnxt_hwrm_send_message(bp, &req, sizeof(req));
@@ -169,7 +169,8 @@ int bnxt_alloc_vnic_attributes(struct bnxt *bp)
char mz_name[RTE_MEMZONE_NAMESIZE];
uint32_t entry_length = RTE_CACHE_LINE_ROUNDUP(
HW_HASH_INDEX_SIZE * sizeof(*vnic->rss_table) +
- HW_HASH_KEY_SIZE);
+ HW_HASH_KEY_SIZE +
+ BNXT_MAX_MC_ADDRS * ETHER_ADDR_LEN);
uint16_t max_vnics;
int i;
phys_addr_t mz_phys_addr;
@@ -217,6 +218,10 @@ int bnxt_alloc_vnic_attributes(struct bnxt *bp)
vnic->rss_hash_key_dma_addr = vnic->rss_table_dma_addr +
HW_HASH_INDEX_SIZE * sizeof(*vnic->rss_table);
+ 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;
}
return 0;
@@ -41,7 +41,7 @@ struct bnxt_vnic_info {
STAILQ_ENTRY(bnxt_vnic_info) next;
uint8_t ff_pool_idx;
- uint16_t fw_vnic_id; /* returned by Chimp during alloc */
+ uint32_t fw_vnic_id; /* returned by Chimp during alloc */
uint16_t fw_rss_cos_lb_ctx;
uint16_t ctx_is_rss_cos_lb;
#define MAX_NUM_TRAFFIC_CLASSES 8
@@ -58,6 +58,10 @@ struct bnxt_vnic_info {
uint16_t *rss_table;
phys_addr_t rss_hash_key_dma_addr;
void *rss_hash_key;
+ phys_addr_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)