u64 *mac;
 
        for (pf = 0; pf < hw->total_pfs; pf++) {
+               /* For PF0(AF), Assign MAC address to only VFs (LBKVFs) */
+               if (!pf)
+                       goto lbkvf;
+
                if (!is_pf_cgxmapped(rvu, pf))
                        continue;
                /* Assign MAC address to PF */
                } else {
                        eth_random_addr(pfvf->mac_addr);
                }
+               ether_addr_copy(pfvf->default_mac, pfvf->mac_addr);
 
-               /* Assign MAC address to VFs */
+lbkvf:
+               /* Assign MAC address to VFs*/
                rvu_get_pf_numvfs(rvu, pf, &numvfs, &hwvf);
                for (vf = 0; vf < numvfs; vf++, hwvf++) {
                        pfvf = &rvu->hwvf[hwvf];
                        } else {
                                eth_random_addr(pfvf->mac_addr);
                        }
+                       ether_addr_copy(pfvf->default_mac, pfvf->mac_addr);
                }
        }
 }
        if (blkaddr < 0)
                return;
 
+       if (blktype == BLKTYPE_NIX)
+               rvu_nix_reset_mac(pfvf, pcifunc);
+
        block = &hw->block[blkaddr];
 
        num_lfs = rvu_get_rsrc_mapcount(pfvf, block->addr);
 
 
        u8              pf_set_vf_cfg;
        u8              mac_addr[ETH_ALEN]; /* MAC address of this PF/VF */
+       u8              default_mac[ETH_ALEN]; /* MAC address from FWdata */
 
        /* Broadcast pkt replication info */
        u16                     bcast_mce_idx;
 int nix_update_bcast_mce_list(struct rvu *rvu, u16 pcifunc, bool add);
 struct nix_hw *get_nix_hw(struct rvu_hwinfo *hw, int blkaddr);
 int rvu_get_next_nix_blkaddr(struct rvu *rvu, int blkaddr);
+void rvu_nix_reset_mac(struct rvu_pfvf *pfvf, int pcifunc);
 
 /* NPC APIs */
 int rvu_npc_init(struct rvu *rvu);
 
 static int npc_install_flow(struct rvu *rvu, int blkaddr, u16 target,
                            int nixlf, struct rvu_pfvf *pfvf,
                            struct npc_install_flow_req *req,
-                           struct npc_install_flow_rsp *rsp, bool enable)
+                           struct npc_install_flow_rsp *rsp, bool enable,
+                           bool pf_set_vfs_mac)
 {
        struct rvu_npc_mcam_rule *def_ucast_rule = pfvf->def_ucast_rule;
        u64 features, installed_features, missing_features = 0;
        if (req->default_rule)
                pfvf->def_ucast_rule = rule;
 
+       /* VF's MAC address is being changed via PF  */
+       if (pf_set_vfs_mac) {
+               ether_addr_copy(pfvf->default_mac, req->packet.dmac);
+               ether_addr_copy(pfvf->mac_addr, req->packet.dmac);
+       }
+
        if (pfvf->pf_set_vf_cfg && req->vtag0_type == NIX_AF_LFX_RX_VTAG_TYPE7)
                rule->vfvlan_cfg = true;
 
        bool from_vf = !!(req->hdr.pcifunc & RVU_PFVF_FUNC_MASK);
        int blkaddr, nixlf, err;
        struct rvu_pfvf *pfvf;
+       bool pf_set_vfs_mac = false;
        bool enable = true;
        u16 target;
 
        if (!req->hdr.pcifunc)
                target = req->vf;
        /* PF installing for its VF */
-       else if (!from_vf && req->vf)
+       else if (!from_vf && req->vf) {
                target = (req->hdr.pcifunc & ~RVU_PFVF_FUNC_MASK) | req->vf;
+               pf_set_vfs_mac = req->default_rule &&
+                               (req->features & BIT_ULL(NPC_DMAC));
+       }
        /* msg received from PF/VF */
        else
                target = req->hdr.pcifunc;
                return -EINVAL;
 
        return npc_install_flow(rvu, blkaddr, target, nixlf, pfvf, req, rsp,
-                               enable);
+                               enable, pf_set_vfs_mac);
 }
 
 static int npc_delete_flow(struct rvu *rvu, struct rvu_npc_mcam_rule *rule,