#define RXC_ZOMBIE_COUNT  GENMASK_ULL(60, 48)
 
 static void cpt_rxc_time_cfg(struct rvu *rvu, struct cpt_rxc_time_cfg_req *req,
-                            int blkaddr)
+                            int blkaddr, struct cpt_rxc_time_cfg_req *save)
 {
        u64 dfrg_reg;
 
+       if (save) {
+               /* Save older config */
+               dfrg_reg = rvu_read64(rvu, blkaddr, CPT_AF_RXC_DFRG);
+               save->zombie_thres = FIELD_GET(RXC_ZOMBIE_THRES, dfrg_reg);
+               save->zombie_limit = FIELD_GET(RXC_ZOMBIE_LIMIT, dfrg_reg);
+               save->active_thres = FIELD_GET(RXC_ACTIVE_THRES, dfrg_reg);
+               save->active_limit = FIELD_GET(RXC_ACTIVE_LIMIT, dfrg_reg);
+
+               save->step = rvu_read64(rvu, blkaddr, CPT_AF_RXC_TIME_CFG);
+       }
+
        dfrg_reg = FIELD_PREP(RXC_ZOMBIE_THRES, req->zombie_thres);
        dfrg_reg |= FIELD_PREP(RXC_ZOMBIE_LIMIT, req->zombie_limit);
        dfrg_reg |= FIELD_PREP(RXC_ACTIVE_THRES, req->active_thres);
            !is_cpt_vf(rvu, req->hdr.pcifunc))
                return CPT_AF_ERR_ACCESS_DENIED;
 
-       cpt_rxc_time_cfg(rvu, req, blkaddr);
+       cpt_rxc_time_cfg(rvu, req, blkaddr, NULL);
 
        return 0;
 }
 
 static void cpt_rxc_teardown(struct rvu *rvu, int blkaddr)
 {
-       struct cpt_rxc_time_cfg_req req;
+       struct cpt_rxc_time_cfg_req req, prev;
        int timeout = 2000;
        u64 reg;
 
        req.active_thres = 1;
        req.active_limit = 1;
 
-       cpt_rxc_time_cfg(rvu, &req, blkaddr);
+       cpt_rxc_time_cfg(rvu, &req, blkaddr, &prev);
 
        do {
                reg = rvu_read64(rvu, blkaddr, CPT_AF_RXC_ACTIVE_STS);
 
        if (timeout == 0)
                dev_warn(rvu->dev, "Poll for RXC zombie count hits hard loop counter\n");
+
+       /* Restore config */
+       cpt_rxc_time_cfg(rvu, &prev, blkaddr, NULL);
 }
 
 #define INFLIGHT   GENMASK_ULL(8, 0)