#define TX_VTAG1_LID_MASK              GENMASK_ULL(42, 40)
 #define TX_VTAG1_RELPTR_MASK           GENMASK_ULL(39, 32)
 
+/* NPC MCAM reserved entry index per nixlf */
+#define NIXLF_UCAST_ENTRY      0
+#define NIXLF_BCAST_ENTRY      1
+#define NIXLF_PROMISC_ENTRY    2
+
 struct npc_mcam_kex {
        /* MKEX Profle Header */
        u64 mkex_sign; /* "mcam-kex-profile" (8 bytes/ASCII characters) */
 
        return !(pcifunc & ~RVU_PFVF_FUNC_MASK);
 }
 
+/* check if PF_FUNC is AF */
+static inline bool is_pffunc_af(u16 pcifunc)
+{
+       return !pcifunc;
+}
+
 static inline bool is_rvu_fwdata_valid(struct rvu *rvu)
 {
        return (rvu->fwdata->header_magic == RVU_FWDATA_HEADER_MAGIC) &&
 int npc_mcam_verify_channel(struct rvu *rvu, u16 pcifunc, u8 intf, u16 channel);
 int npc_flow_steering_init(struct rvu *rvu, int blkaddr);
 const char *npc_get_field_name(u8 hdr);
-bool rvu_npc_write_default_rule(struct rvu *rvu, int blkaddr, int nixlf,
-                               u16 pcifunc, u8 intf, struct mcam_entry *entry,
-                               int *entry_index);
 int npc_get_bank(struct npc_mcam *mcam, int index);
 void npc_mcam_enable_flows(struct rvu *rvu, u16 target);
 void npc_mcam_disable_flows(struct rvu *rvu, u16 target);
 bool is_mac_feature_supported(struct rvu *rvu, int pf, int feature);
 u32  rvu_cgx_get_fifolen(struct rvu *rvu);
 
+int npc_get_nixlf_mcam_index(struct npc_mcam *mcam, u16 pcifunc, int nixlf,
+                            int type);
+bool is_mcam_entry_enabled(struct rvu *rvu, struct npc_mcam *mcam, int blkaddr,
+                          int index);
+
 /* CPT APIs */
 int rvu_cpt_lf_teardown(struct rvu *rvu, u16 pcifunc, int lf, int slot);
 
 
                seq_printf(s, "\tmcam entry: %d\n", iter->entry);
 
                rvu_dbg_npc_mcam_show_flows(s, iter);
-               if (iter->intf == NIX_INTF_RX) {
+               if (is_npc_intf_rx(iter->intf)) {
                        target = iter->rx_action.pf_func;
                        pf = (target >> RVU_PFVF_PF_SHIFT) & RVU_PFVF_PF_MASK;
                        seq_printf(s, "\tForward to: PF%d ", pf);
 
 #define RSVD_MCAM_ENTRIES_PER_PF       2 /* Bcast & Promisc */
 #define RSVD_MCAM_ENTRIES_PER_NIXLF    1 /* Ucast for LFs */
 
-#define NIXLF_UCAST_ENTRY      0
-#define NIXLF_BCAST_ENTRY      1
-#define NIXLF_PROMISC_ENTRY    2
-
 #define NPC_PARSE_RESULT_DMAC_OFFSET   8
 #define NPC_HW_TSTAMP_OFFSET           8
 #define NPC_KEX_CHAN_MASK              0xFFFULL
        if (is_npc_intf_tx(intf))
                return 0;
 
+       /* return in case of AF installed rules */
+       if (is_pffunc_af(pcifunc))
+               return 0;
+
        if (is_afvf(pcifunc)) {
                end = rvu_get_num_lbk_chans();
                if (end < 0)
        return mcam->nixlf_offset + (max + nixlf) * RSVD_MCAM_ENTRIES_PER_NIXLF;
 }
 
-static int npc_get_nixlf_mcam_index(struct npc_mcam *mcam,
-                                   u16 pcifunc, int nixlf, int type)
+int npc_get_nixlf_mcam_index(struct npc_mcam *mcam,
+                            u16 pcifunc, int nixlf, int type)
 {
        int pf = rvu_get_pf(pcifunc);
        int index;
        return bank;
 }
 
-static bool is_mcam_entry_enabled(struct rvu *rvu, struct npc_mcam *mcam,
-                                 int blkaddr, int index)
+bool is_mcam_entry_enabled(struct rvu *rvu, struct npc_mcam *mcam,
+                          int blkaddr, int index)
 {
        int bank = npc_get_bank(mcam, index);
        u64 cfg;
 static int npc_mcam_verify_entry(struct npc_mcam *mcam,
                                 u16 pcifunc, int entry)
 {
+       /* verify AF installed entries */
+       if (is_pffunc_af(pcifunc))
+               return 0;
        /* Verify if entry is valid and if it is indeed
         * allocated to the requesting PFFUNC.
         */
                goto exit;
        }
 
+       /* For AF installed rules, the nix_intf should be set to target NIX */
+       if (is_pffunc_af(req->hdr.pcifunc))
+               nix_intf = req->intf;
+
        npc_config_mcam_entry(rvu, mcam, blkaddr, req->entry, nix_intf,
                              &req->entry_data, req->enable_entry);
 
        return 0;
 }
 
-bool rvu_npc_write_default_rule(struct rvu *rvu, int blkaddr, int nixlf,
-                               u16 pcifunc, u8 intf, struct mcam_entry *entry,
-                               int *index)
-{
-       struct rvu_pfvf *pfvf = rvu_get_pfvf(rvu, pcifunc);
-       struct npc_mcam *mcam = &rvu->hw->mcam;
-       bool enable;
-       u8 nix_intf;
-
-       if (is_npc_intf_tx(intf))
-               nix_intf = pfvf->nix_tx_intf;
-       else
-               nix_intf = pfvf->nix_rx_intf;
-
-       *index = npc_get_nixlf_mcam_index(mcam, pcifunc,
-                                         nixlf, NIXLF_UCAST_ENTRY);
-       /* dont force enable unicast entry  */
-       enable = is_mcam_entry_enabled(rvu, mcam, blkaddr, *index);
-       npc_config_mcam_entry(rvu, mcam, blkaddr, *index, nix_intf,
-                             entry, enable);
-
-       return enable;
-}
-
 int rvu_mbox_handler_npc_read_base_steer_rule(struct rvu *rvu,
                                              struct msg_req *req,
                                              struct npc_mcam_read_base_rule_rsp *rsp)
 
        if (is_npc_intf_tx(req->intf))
                goto find_rule;
 
-       if (def_ucast_rule)
+       if (req->default_rule) {
+               entry_index = npc_get_nixlf_mcam_index(mcam, target, nixlf,
+                                                      NIXLF_UCAST_ENTRY);
+               enable = is_mcam_entry_enabled(rvu, mcam, blkaddr, entry_index);
+       }
+
+       /* update mcam entry with default unicast rule attributes */
+       if (def_ucast_rule && (msg_from_vf || (req->default_rule && req->append))) {
                missing_features = (def_ucast_rule->features ^ features) &
                                        def_ucast_rule->features;
-
-       if (req->default_rule && req->append) {
-               /* add to default rule */
                if (missing_features)
                        npc_update_flow(rvu, entry, missing_features,
                                        &def_ucast_rule->packet,
                                        &def_ucast_rule->mask,
                                        &dummy, req->intf);
-               enable = rvu_npc_write_default_rule(rvu, blkaddr,
-                                                   nixlf, target,
-                                                   pfvf->nix_rx_intf, entry,
-                                                   &entry_index);
-               installed_features = req->features | missing_features;
-       } else if (req->default_rule && !req->append) {
-               /* overwrite default rule */
-               enable = rvu_npc_write_default_rule(rvu, blkaddr,
-                                                   nixlf, target,
-                                                   pfvf->nix_rx_intf, entry,
-                                                   &entry_index);
-       } else if (msg_from_vf) {
-               /* normal rule - include default rule also to it for VF */
-               npc_update_flow(rvu, entry, missing_features,
-                               &def_ucast_rule->packet, &def_ucast_rule->mask,
-                               &dummy, req->intf);
                installed_features = req->features | missing_features;
        }
 
                        return -ENOMEM;
                new = true;
        }
-       /* no counter for default rule */
-       if (req->default_rule)
-               goto update_rule;
 
        /* allocate new counter if rule has no counter */
-       if (req->set_cntr && !rule->has_cntr)
+       if (!req->default_rule && req->set_cntr && !rule->has_cntr)
                rvu_mcam_add_counter_to_rule(rvu, owner, rule, rsp);
 
        /* if user wants to delete an existing counter for a rule then
                rvu_mcam_remove_counter_from_rule(rvu, owner, rule);
 
        write_req.hdr.pcifunc = owner;
-       write_req.entry = req->entry;
+
+       /* AF owns the default rules so change the owner just to relax
+        * the checks in rvu_mbox_handler_npc_mcam_write_entry
+        */
+       if (req->default_rule)
+               write_req.hdr.pcifunc = 0;
+
+       write_req.entry = entry_index;
        write_req.intf = req->intf;
        write_req.enable_entry = (u8)enable;
        /* if counter is available then clear and use it */
                        kfree(rule);
                return err;
        }
-update_rule:
+       /* update rule */
        memcpy(&rule->packet, &dummy.packet, sizeof(rule->packet));
        memcpy(&rule->mask, &dummy.mask, sizeof(rule->mask));
        rule->entry = entry_index;
 
        write_req.hdr.pcifunc = rule->owner;
        write_req.entry = rule->entry;
+       write_req.intf = pfvf->nix_rx_intf;
 
        mutex_unlock(&mcam->lock);
        err = rvu_mbox_handler_npc_mcam_write_entry(rvu, &write_req, &rsp);