int rvu_get_nixlf_count(struct rvu *rvu);
 void rvu_nix_lf_teardown(struct rvu *rvu, u16 pcifunc, int blkaddr, int npalf);
 int nix_get_nixlf(struct rvu *rvu, u16 pcifunc, int *nixlf, int *nix_blkaddr);
+int nix_update_bcast_mce_list(struct rvu *rvu, u16 pcifunc, bool add);
 
 /* NPC APIs */
 int rvu_npc_init(struct rvu *rvu);
 void rvu_npc_enable_promisc_entry(struct rvu *rvu, u16 pcifunc, int nixlf);
 void rvu_npc_install_bcast_match_entry(struct rvu *rvu, u16 pcifunc,
                                       int nixlf, u64 chan);
-void rvu_npc_disable_bcast_entry(struct rvu *rvu, u16 pcifunc);
+void rvu_npc_enable_bcast_entry(struct rvu *rvu, u16 pcifunc, bool enable);
 int rvu_npc_update_rxvlan(struct rvu *rvu, u16 pcifunc, int nixlf);
 void rvu_npc_disable_mcam_entries(struct rvu *rvu, u16 pcifunc, int nixlf);
 void rvu_npc_disable_default_entries(struct rvu *rvu, u16 pcifunc, int nixlf);
 
 #include "npc.h"
 #include "cgx.h"
 
-static int nix_update_bcast_mce_list(struct rvu *rvu, u16 pcifunc, bool add);
 static int rvu_nix_get_bpid(struct rvu *rvu, struct nix_bp_cfg_req *req,
                            int type, int chan_id);
 
        return 0;
 }
 
-static int nix_update_bcast_mce_list(struct rvu *rvu, u16 pcifunc, bool add)
+int nix_update_bcast_mce_list(struct rvu *rvu, u16 pcifunc, bool add)
 {
        int err = 0, idx, next_idx, last_idx;
        struct nix_mce_list *mce_list;
 
        /* Disable MCAM entry in NPC */
        if (!mce_list->count) {
-               rvu_npc_disable_bcast_entry(rvu, pcifunc);
+               rvu_npc_enable_bcast_entry(rvu, pcifunc, false);
                goto end;
        }
 
 
                              NIX_INTF_RX, &entry, true);
 }
 
-void rvu_npc_disable_bcast_entry(struct rvu *rvu, u16 pcifunc)
+void rvu_npc_enable_bcast_entry(struct rvu *rvu, u16 pcifunc, bool enable)
 {
        struct npc_mcam *mcam = &rvu->hw->mcam;
        int blkaddr, index;
        pcifunc = pcifunc & ~RVU_PFVF_FUNC_MASK;
 
        index = npc_get_nixlf_mcam_index(mcam, pcifunc, 0, NIXLF_BCAST_ENTRY);
-       npc_enable_mcam_entry(rvu, mcam, blkaddr, index, false);
+       npc_enable_mcam_entry(rvu, mcam, blkaddr, index, enable);
 }
 
 void rvu_npc_update_flowkey_alg_idx(struct rvu *rvu, u16 pcifunc, int nixlf,
                                         nixlf, NIXLF_UCAST_ENTRY);
        npc_enable_mcam_entry(rvu, mcam, blkaddr, index, enable);
 
-       /* For PF, ena/dis promisc and bcast MCAM match entries */
-       if (pcifunc & RVU_PFVF_FUNC_MASK)
+       /* For PF, ena/dis promisc and bcast MCAM match entries.
+        * For VFs add/delete from bcast list when RX multicast
+        * feature is present.
+        */
+       if (pcifunc & RVU_PFVF_FUNC_MASK && !rvu->hw->cap.nix_rx_multicast)
                return;
 
        /* For bcast, enable/disable only if it's action is not
         * packet replication, incase if action is replication
-        * then this PF's nixlf is removed from bcast replication
+        * then this PF/VF's nixlf is removed from bcast replication
         * list.
         */
-       index = npc_get_nixlf_mcam_index(mcam, pcifunc,
+       index = npc_get_nixlf_mcam_index(mcam, pcifunc & ~RVU_PFVF_FUNC_MASK,
                                         nixlf, NIXLF_BCAST_ENTRY);
        bank = npc_get_bank(mcam, index);
        *(u64 *)&action = rvu_read64(rvu, blkaddr,
             NPC_AF_MCAMEX_BANKX_ACTION(index & (mcam->banksize - 1), bank));
-       if (action.op != NIX_RX_ACTIONOP_MCAST)
+
+       /* VFs will not have BCAST entry */
+       if (action.op != NIX_RX_ACTIONOP_MCAST &&
+           !(pcifunc & RVU_PFVF_FUNC_MASK)) {
                npc_enable_mcam_entry(rvu, mcam,
                                      blkaddr, index, enable);
+       } else {
+               nix_update_bcast_mce_list(rvu, pcifunc, enable);
+               /* Enable PF's BCAST entry for packet replication */
+               rvu_npc_enable_bcast_entry(rvu, pcifunc, enable);
+       }
+
        if (enable)
                rvu_npc_enable_promisc_entry(rvu, pcifunc, nixlf);
        else