#include "cudbg_lib_common.h"
 #include "cudbg_entity.h"
 #include "cudbg_lib.h"
+#include "cudbg_zlib.h"
 
-static void cudbg_write_and_release_buff(struct cudbg_buffer *pin_buff,
-                                        struct cudbg_buffer *dbg_buff)
+static int cudbg_do_compression(struct cudbg_init *pdbg_init,
+                               struct cudbg_buffer *pin_buff,
+                               struct cudbg_buffer *dbg_buff)
 {
-       cudbg_update_buff(pin_buff, dbg_buff);
-       cudbg_put_buff(pin_buff, dbg_buff);
+       struct cudbg_buffer temp_in_buff = { 0 };
+       int bytes_left, bytes_read, bytes;
+       u32 offset = dbg_buff->offset;
+       int rc;
+
+       temp_in_buff.offset = pin_buff->offset;
+       temp_in_buff.data = pin_buff->data;
+       temp_in_buff.size = pin_buff->size;
+
+       bytes_left = pin_buff->size;
+       bytes_read = 0;
+       while (bytes_left > 0) {
+               /* Do compression in smaller chunks */
+               bytes = min_t(unsigned long, bytes_left,
+                             (unsigned long)CUDBG_CHUNK_SIZE);
+               temp_in_buff.data = (char *)pin_buff->data + bytes_read;
+               temp_in_buff.size = bytes;
+               rc = cudbg_compress_buff(pdbg_init, &temp_in_buff, dbg_buff);
+               if (rc)
+                       return rc;
+               bytes_left -= bytes;
+               bytes_read += bytes;
+       }
+
+       pin_buff->size = dbg_buff->offset - offset;
+       return 0;
+}
+
+static int cudbg_write_and_release_buff(struct cudbg_init *pdbg_init,
+                                       struct cudbg_buffer *pin_buff,
+                                       struct cudbg_buffer *dbg_buff)
+{
+       int rc = 0;
+
+       if (pdbg_init->compress_type == CUDBG_COMPRESSION_NONE) {
+               cudbg_update_buff(pin_buff, dbg_buff);
+       } else {
+               rc = cudbg_do_compression(pdbg_init, pin_buff, dbg_buff);
+               if (rc)
+                       goto out;
+       }
+
+out:
+       cudbg_put_buff(pdbg_init, pin_buff);
+       return rc;
 }
 
 static int is_fw_attached(struct cudbg_init *pdbg_init)
        else if (is_t5(padap->params.chip) || is_t6(padap->params.chip))
                buf_size = T5_REGMAP_SIZE;
 
-       rc = cudbg_get_buff(dbg_buff, buf_size, &temp_buff);
+       rc = cudbg_get_buff(pdbg_init, dbg_buff, buf_size, &temp_buff);
        if (rc)
                return rc;
        t4_get_regs(padap, (void *)temp_buff.data, temp_buff.size);
-       cudbg_write_and_release_buff(&temp_buff, dbg_buff);
-       return rc;
+       return cudbg_write_and_release_buff(pdbg_init, &temp_buff, dbg_buff);
 }
 
 int cudbg_collect_fw_devlog(struct cudbg_init *pdbg_init,
        }
 
        dparams = &padap->params.devlog;
-       rc = cudbg_get_buff(dbg_buff, dparams->size, &temp_buff);
+       rc = cudbg_get_buff(pdbg_init, dbg_buff, dparams->size, &temp_buff);
        if (rc)
                return rc;
 
                spin_unlock(&padap->win0_lock);
                if (rc) {
                        cudbg_err->sys_err = rc;
-                       cudbg_put_buff(&temp_buff, dbg_buff);
+                       cudbg_put_buff(pdbg_init, &temp_buff);
                        return rc;
                }
        }
-       cudbg_write_and_release_buff(&temp_buff, dbg_buff);
-       return rc;
+       return cudbg_write_and_release_buff(pdbg_init, &temp_buff, dbg_buff);
 }
 
 int cudbg_collect_cim_la(struct cudbg_init *pdbg_init,
        }
 
        size += sizeof(cfg);
-       rc = cudbg_get_buff(dbg_buff, size, &temp_buff);
+       rc = cudbg_get_buff(pdbg_init, dbg_buff, size, &temp_buff);
        if (rc)
                return rc;
 
        rc = t4_cim_read(padap, UP_UP_DBG_LA_CFG_A, 1, &cfg);
        if (rc) {
                cudbg_err->sys_err = rc;
-               cudbg_put_buff(&temp_buff, dbg_buff);
+               cudbg_put_buff(pdbg_init, &temp_buff);
                return rc;
        }
 
                            NULL);
        if (rc < 0) {
                cudbg_err->sys_err = rc;
-               cudbg_put_buff(&temp_buff, dbg_buff);
+               cudbg_put_buff(pdbg_init, &temp_buff);
                return rc;
        }
-       cudbg_write_and_release_buff(&temp_buff, dbg_buff);
-       return rc;
+       return cudbg_write_and_release_buff(pdbg_init, &temp_buff, dbg_buff);
 }
 
 int cudbg_collect_cim_ma_la(struct cudbg_init *pdbg_init,
        int size, rc;
 
        size = 2 * CIM_MALA_SIZE * 5 * sizeof(u32);
-       rc = cudbg_get_buff(dbg_buff, size, &temp_buff);
+       rc = cudbg_get_buff(pdbg_init, dbg_buff, size, &temp_buff);
        if (rc)
                return rc;
 
                          (u32 *)temp_buff.data,
                          (u32 *)((char *)temp_buff.data +
                                  5 * CIM_MALA_SIZE));
-       cudbg_write_and_release_buff(&temp_buff, dbg_buff);
-       return rc;
+       return cudbg_write_and_release_buff(pdbg_init, &temp_buff, dbg_buff);
 }
 
 int cudbg_collect_cim_qcfg(struct cudbg_init *pdbg_init,
        struct cudbg_cim_qcfg *cim_qcfg_data;
        int rc;
 
-       rc = cudbg_get_buff(dbg_buff, sizeof(struct cudbg_cim_qcfg),
+       rc = cudbg_get_buff(pdbg_init, dbg_buff, sizeof(struct cudbg_cim_qcfg),
                            &temp_buff);
        if (rc)
                return rc;
                         ARRAY_SIZE(cim_qcfg_data->stat), cim_qcfg_data->stat);
        if (rc) {
                cudbg_err->sys_err = rc;
-               cudbg_put_buff(&temp_buff, dbg_buff);
+               cudbg_put_buff(pdbg_init, &temp_buff);
                return rc;
        }
 
                         cim_qcfg_data->obq_wr);
        if (rc) {
                cudbg_err->sys_err = rc;
-               cudbg_put_buff(&temp_buff, dbg_buff);
+               cudbg_put_buff(pdbg_init, &temp_buff);
                return rc;
        }
 
        t4_read_cimq_cfg(padap, cim_qcfg_data->base, cim_qcfg_data->size,
                         cim_qcfg_data->thres);
-       cudbg_write_and_release_buff(&temp_buff, dbg_buff);
-       return rc;
+       return cudbg_write_and_release_buff(pdbg_init, &temp_buff, dbg_buff);
 }
 
 static int cudbg_read_cim_ibq(struct cudbg_init *pdbg_init,
 
        /* collect CIM IBQ */
        qsize = CIM_IBQ_SIZE * 4 * sizeof(u32);
-       rc = cudbg_get_buff(dbg_buff, qsize, &temp_buff);
+       rc = cudbg_get_buff(pdbg_init, dbg_buff, qsize, &temp_buff);
        if (rc)
                return rc;
 
                else
                        rc = no_of_read_words;
                cudbg_err->sys_err = rc;
-               cudbg_put_buff(&temp_buff, dbg_buff);
+               cudbg_put_buff(pdbg_init, &temp_buff);
                return rc;
        }
-       cudbg_write_and_release_buff(&temp_buff, dbg_buff);
-       return rc;
+       return cudbg_write_and_release_buff(pdbg_init, &temp_buff, dbg_buff);
 }
 
 int cudbg_collect_cim_ibq_tp0(struct cudbg_init *pdbg_init,
 
        /* collect CIM OBQ */
        qsize =  cudbg_cim_obq_size(padap, qid);
-       rc = cudbg_get_buff(dbg_buff, qsize, &temp_buff);
+       rc = cudbg_get_buff(pdbg_init, dbg_buff, qsize, &temp_buff);
        if (rc)
                return rc;
 
                else
                        rc = no_of_read_words;
                cudbg_err->sys_err = rc;
-               cudbg_put_buff(&temp_buff, dbg_buff);
+               cudbg_put_buff(pdbg_init, &temp_buff);
                return rc;
        }
-       cudbg_write_and_release_buff(&temp_buff, dbg_buff);
-       return rc;
+       return cudbg_write_and_release_buff(pdbg_init, &temp_buff, dbg_buff);
 }
 
 int cudbg_collect_cim_obq_ulp0(struct cudbg_init *pdbg_init,
 
                bytes = min_t(unsigned long, bytes_left,
                              (unsigned long)CUDBG_CHUNK_SIZE);
-               rc = cudbg_get_buff(dbg_buff, bytes, &temp_buff);
+               rc = cudbg_get_buff(pdbg_init, dbg_buff, bytes, &temp_buff);
                if (rc)
                        return rc;
 
                spin_unlock(&padap->win0_lock);
                if (rc) {
                        cudbg_err->sys_err = rc;
-                       cudbg_put_buff(&temp_buff, dbg_buff);
+                       cudbg_put_buff(pdbg_init, &temp_buff);
                        return rc;
                }
 
 skip_read:
                bytes_left -= bytes;
                bytes_read += bytes;
-               cudbg_write_and_release_buff(&temp_buff, dbg_buff);
+               rc = cudbg_write_and_release_buff(pdbg_init, &temp_buff,
+                                                 dbg_buff);
+               if (rc) {
+                       cudbg_put_buff(pdbg_init, &temp_buff);
+                       return rc;
+               }
        }
        return rc;
 }
        int rc, nentries;
 
        nentries = t4_chip_rss_size(padap);
-       rc = cudbg_get_buff(dbg_buff, nentries * sizeof(u16), &temp_buff);
+       rc = cudbg_get_buff(pdbg_init, dbg_buff, nentries * sizeof(u16),
+                           &temp_buff);
        if (rc)
                return rc;
 
        rc = t4_read_rss(padap, (u16 *)temp_buff.data);
        if (rc) {
                cudbg_err->sys_err = rc;
-               cudbg_put_buff(&temp_buff, dbg_buff);
+               cudbg_put_buff(pdbg_init, &temp_buff);
                return rc;
        }
-       cudbg_write_and_release_buff(&temp_buff, dbg_buff);
-       return rc;
+       return cudbg_write_and_release_buff(pdbg_init, &temp_buff, dbg_buff);
 }
 
 int cudbg_collect_rss_vf_config(struct cudbg_init *pdbg_init,
        int vf, rc, vf_count;
 
        vf_count = padap->params.arch.vfcount;
-       rc = cudbg_get_buff(dbg_buff,
+       rc = cudbg_get_buff(pdbg_init, dbg_buff,
                            vf_count * sizeof(struct cudbg_rss_vf_conf),
                            &temp_buff);
        if (rc)
        for (vf = 0; vf < vf_count; vf++)
                t4_read_rss_vf_config(padap, vf, &vfconf[vf].rss_vf_vfl,
                                      &vfconf[vf].rss_vf_vfh, true);
-       cudbg_write_and_release_buff(&temp_buff, dbg_buff);
-       return rc;
+       return cudbg_write_and_release_buff(pdbg_init, &temp_buff, dbg_buff);
 }
 
 int cudbg_collect_path_mtu(struct cudbg_init *pdbg_init,
        struct cudbg_buffer temp_buff = { 0 };
        int rc;
 
-       rc = cudbg_get_buff(dbg_buff, NMTUS * sizeof(u16), &temp_buff);
+       rc = cudbg_get_buff(pdbg_init, dbg_buff, NMTUS * sizeof(u16),
+                           &temp_buff);
        if (rc)
                return rc;
 
        t4_read_mtu_tbl(padap, (u16 *)temp_buff.data, NULL);
-       cudbg_write_and_release_buff(&temp_buff, dbg_buff);
-       return rc;
+       return cudbg_write_and_release_buff(pdbg_init, &temp_buff, dbg_buff);
 }
 
 int cudbg_collect_pm_stats(struct cudbg_init *pdbg_init,
        struct cudbg_pm_stats *pm_stats_buff;
        int rc;
 
-       rc = cudbg_get_buff(dbg_buff, sizeof(struct cudbg_pm_stats),
+       rc = cudbg_get_buff(pdbg_init, dbg_buff, sizeof(struct cudbg_pm_stats),
                            &temp_buff);
        if (rc)
                return rc;
        pm_stats_buff = (struct cudbg_pm_stats *)temp_buff.data;
        t4_pmtx_get_stats(padap, pm_stats_buff->tx_cnt, pm_stats_buff->tx_cyc);
        t4_pmrx_get_stats(padap, pm_stats_buff->rx_cnt, pm_stats_buff->rx_cyc);
-       cudbg_write_and_release_buff(&temp_buff, dbg_buff);
-       return rc;
+       return cudbg_write_and_release_buff(pdbg_init, &temp_buff, dbg_buff);
 }
 
 int cudbg_collect_hw_sched(struct cudbg_init *pdbg_init,
        if (!padap->params.vpd.cclk)
                return CUDBG_STATUS_CCLK_NOT_DEFINED;
 
-       rc = cudbg_get_buff(dbg_buff, sizeof(struct cudbg_hw_sched),
+       rc = cudbg_get_buff(pdbg_init, dbg_buff, sizeof(struct cudbg_hw_sched),
                            &temp_buff);
        hw_sched_buff = (struct cudbg_hw_sched *)temp_buff.data;
        hw_sched_buff->map = t4_read_reg(padap, TP_TX_MOD_QUEUE_REQ_MAP_A);
        for (i = 0; i < NTX_SCHED; ++i)
                t4_get_tx_sched(padap, i, &hw_sched_buff->kbps[i],
                                &hw_sched_buff->ipg[i], true);
-       cudbg_write_and_release_buff(&temp_buff, dbg_buff);
-       return rc;
+       return cudbg_write_and_release_buff(pdbg_init, &temp_buff, dbg_buff);
 }
 
 int cudbg_collect_tp_indirect(struct cudbg_init *pdbg_init,
 
        n = n / (IREG_NUM_ELEM * sizeof(u32));
        size = sizeof(struct ireg_buf) * n;
-       rc = cudbg_get_buff(dbg_buff, size, &temp_buff);
+       rc = cudbg_get_buff(pdbg_init, dbg_buff, size, &temp_buff);
        if (rc)
                return rc;
 
                               tp_pio->ireg_local_offset, true);
                ch_tp_pio++;
        }
-       cudbg_write_and_release_buff(&temp_buff, dbg_buff);
-       return rc;
+       return cudbg_write_and_release_buff(pdbg_init, &temp_buff, dbg_buff);
 }
 
 int cudbg_collect_sge_indirect(struct cudbg_init *pdbg_init,
        struct ireg_buf *ch_sge_dbg;
        int i, rc;
 
-       rc = cudbg_get_buff(dbg_buff, sizeof(*ch_sge_dbg) * 2, &temp_buff);
+       rc = cudbg_get_buff(pdbg_init, dbg_buff, sizeof(*ch_sge_dbg) * 2,
+                           &temp_buff);
        if (rc)
                return rc;
 
                                 sge_pio->ireg_local_offset);
                ch_sge_dbg++;
        }
-       cudbg_write_and_release_buff(&temp_buff, dbg_buff);
-       return rc;
+       return cudbg_write_and_release_buff(pdbg_init, &temp_buff, dbg_buff);
 }
 
 int cudbg_collect_ulprx_la(struct cudbg_init *pdbg_init,
        struct cudbg_ulprx_la *ulprx_la_buff;
        int rc;
 
-       rc = cudbg_get_buff(dbg_buff, sizeof(struct cudbg_ulprx_la),
+       rc = cudbg_get_buff(pdbg_init, dbg_buff, sizeof(struct cudbg_ulprx_la),
                            &temp_buff);
        if (rc)
                return rc;
        ulprx_la_buff = (struct cudbg_ulprx_la *)temp_buff.data;
        t4_ulprx_read_la(padap, (u32 *)ulprx_la_buff->data);
        ulprx_la_buff->size = ULPRX_LA_SIZE;
-       cudbg_write_and_release_buff(&temp_buff, dbg_buff);
-       return rc;
+       return cudbg_write_and_release_buff(pdbg_init, &temp_buff, dbg_buff);
 }
 
 int cudbg_collect_tp_la(struct cudbg_init *pdbg_init,
        int size, rc;
 
        size = sizeof(struct cudbg_tp_la) + TPLA_SIZE *  sizeof(u64);
-       rc = cudbg_get_buff(dbg_buff, size, &temp_buff);
+       rc = cudbg_get_buff(pdbg_init, dbg_buff, size, &temp_buff);
        if (rc)
                return rc;
 
        tp_la_buff = (struct cudbg_tp_la *)temp_buff.data;
        tp_la_buff->mode = DBGLAMODE_G(t4_read_reg(padap, TP_DBG_LA_CONFIG_A));
        t4_tp_read_la(padap, (u64 *)tp_la_buff->data, NULL);
-       cudbg_write_and_release_buff(&temp_buff, dbg_buff);
-       return rc;
+       return cudbg_write_and_release_buff(pdbg_init, &temp_buff, dbg_buff);
 }
 
 int cudbg_collect_meminfo(struct cudbg_init *pdbg_init,
        struct cudbg_meminfo *meminfo_buff;
        int rc;
 
-       rc = cudbg_get_buff(dbg_buff, sizeof(struct cudbg_meminfo), &temp_buff);
+       rc = cudbg_get_buff(pdbg_init, dbg_buff, sizeof(struct cudbg_meminfo),
+                           &temp_buff);
        if (rc)
                return rc;
 
        rc = cudbg_fill_meminfo(padap, meminfo_buff);
        if (rc) {
                cudbg_err->sys_err = rc;
-               cudbg_put_buff(&temp_buff, dbg_buff);
+               cudbg_put_buff(pdbg_init, &temp_buff);
                return rc;
        }
 
-       cudbg_write_and_release_buff(&temp_buff, dbg_buff);
-       return rc;
+       return cudbg_write_and_release_buff(pdbg_init, &temp_buff, dbg_buff);
 }
 
 int cudbg_collect_cim_pif_la(struct cudbg_init *pdbg_init,
 
        size = sizeof(struct cudbg_cim_pif_la) +
               2 * CIM_PIFLA_SIZE * 6 * sizeof(u32);
-       rc = cudbg_get_buff(dbg_buff, size, &temp_buff);
+       rc = cudbg_get_buff(pdbg_init, dbg_buff, size, &temp_buff);
        if (rc)
                return rc;
 
        t4_cim_read_pif_la(padap, (u32 *)cim_pif_la_buff->data,
                           (u32 *)cim_pif_la_buff->data + 6 * CIM_PIFLA_SIZE,
                           NULL, NULL);
-       cudbg_write_and_release_buff(&temp_buff, dbg_buff);
-       return rc;
+       return cudbg_write_and_release_buff(pdbg_init, &temp_buff, dbg_buff);
 }
 
 int cudbg_collect_clk_info(struct cudbg_init *pdbg_init,
        if (!padap->params.vpd.cclk)
                return CUDBG_STATUS_CCLK_NOT_DEFINED;
 
-       rc = cudbg_get_buff(dbg_buff, sizeof(struct cudbg_clk_info),
+       rc = cudbg_get_buff(pdbg_init, dbg_buff, sizeof(struct cudbg_clk_info),
                            &temp_buff);
        if (rc)
                return rc;
        clk_info_buff->finwait2_timer =
                tp_tick_us * t4_read_reg(padap, TP_FINWAIT2_TIMER_A);
 
-       cudbg_write_and_release_buff(&temp_buff, dbg_buff);
-       return rc;
+       return cudbg_write_and_release_buff(pdbg_init, &temp_buff, dbg_buff);
 }
 
 int cudbg_collect_pcie_indirect(struct cudbg_init *pdbg_init,
 
        n = sizeof(t5_pcie_pdbg_array) / (IREG_NUM_ELEM * sizeof(u32));
        size = sizeof(struct ireg_buf) * n * 2;
-       rc = cudbg_get_buff(dbg_buff, size, &temp_buff);
+       rc = cudbg_get_buff(pdbg_init, dbg_buff, size, &temp_buff);
        if (rc)
                return rc;
 
                                 pcie_pio->ireg_local_offset);
                ch_pcie++;
        }
-       cudbg_write_and_release_buff(&temp_buff, dbg_buff);
-       return rc;
+       return cudbg_write_and_release_buff(pdbg_init, &temp_buff, dbg_buff);
 }
 
 int cudbg_collect_pm_indirect(struct cudbg_init *pdbg_init,
 
        n = sizeof(t5_pm_rx_array) / (IREG_NUM_ELEM * sizeof(u32));
        size = sizeof(struct ireg_buf) * n * 2;
-       rc = cudbg_get_buff(dbg_buff, size, &temp_buff);
+       rc = cudbg_get_buff(pdbg_init, dbg_buff, size, &temp_buff);
        if (rc)
                return rc;
 
                                 pm_pio->ireg_local_offset);
                ch_pm++;
        }
-       cudbg_write_and_release_buff(&temp_buff, dbg_buff);
-       return rc;
+       return cudbg_write_and_release_buff(pdbg_init, &temp_buff, dbg_buff);
 }
 
 int cudbg_collect_tid(struct cudbg_init *pdbg_init,
        u32 para[2], val[2];
        int rc;
 
-       rc = cudbg_get_buff(dbg_buff, sizeof(struct cudbg_tid_info_region_rev1),
+       rc = cudbg_get_buff(pdbg_init, dbg_buff,
+                           sizeof(struct cudbg_tid_info_region_rev1),
                            &temp_buff);
        if (rc)
                return rc;
        rc = t4_query_params(padap, padap->mbox, padap->pf, 0, 2, para, val);
        if (rc <  0) {
                cudbg_err->sys_err = rc;
-               cudbg_put_buff(&temp_buff, dbg_buff);
+               cudbg_put_buff(pdbg_init, &temp_buff);
                return rc;
        }
        tid->uotid_base = val[0];
                                     para, val);
                if (rc < 0) {
                        cudbg_err->sys_err = rc;
-                       cudbg_put_buff(&temp_buff, dbg_buff);
+                       cudbg_put_buff(pdbg_init, &temp_buff);
                        return rc;
                }
                tid->hpftid_base = val[0];
 
 #undef FW_PARAM_PFVF_A
 
-       cudbg_write_and_release_buff(&temp_buff, dbg_buff);
-       return rc;
+       return cudbg_write_and_release_buff(pdbg_init, &temp_buff, dbg_buff);
 }
 
 int cudbg_collect_pcie_config(struct cudbg_init *pdbg_init,
 
        size = sizeof(u32) * CUDBG_NUM_PCIE_CONFIG_REGS;
        n = sizeof(t5_pcie_config_array) / (2 * sizeof(u32));
-       rc = cudbg_get_buff(dbg_buff, size, &temp_buff);
+       rc = cudbg_get_buff(pdbg_init, dbg_buff, size, &temp_buff);
        if (rc)
                return rc;
 
                        value++;
                }
        }
-       cudbg_write_and_release_buff(&temp_buff, dbg_buff);
-       return rc;
+       return cudbg_write_and_release_buff(pdbg_init, &temp_buff, dbg_buff);
 }
 
 static int cudbg_sge_ctxt_check_valid(u32 *buf, int type)
                return CUDBG_STATUS_ENTITY_NOT_FOUND;
 
        size = rc;
-       rc = cudbg_get_buff(dbg_buff, size, &temp_buff);
+       rc = cudbg_get_buff(pdbg_init, dbg_buff, size, &temp_buff);
        if (rc)
                return rc;
 
 
        ctx_buf = kvzalloc(max_ctx_size, GFP_KERNEL);
        if (!ctx_buf) {
-               cudbg_put_buff(&temp_buff, dbg_buff);
+               cudbg_put_buff(pdbg_init, &temp_buff);
                return -ENOMEM;
        }
 
         */
        cudbg_get_sge_ctxt_fw(pdbg_init, max_ctx_qid, CTXT_FLM, &buff);
 
-       cudbg_write_and_release_buff(&temp_buff, dbg_buff);
-       return rc;
+       return cudbg_write_and_release_buff(pdbg_init, &temp_buff, dbg_buff);
 }
 
 static inline void cudbg_tcamxy2valmask(u64 x, u64 y, u8 *addr, u64 *mask)
 
        n = padap->params.arch.mps_tcam_size;
        size = sizeof(struct cudbg_mps_tcam) * n;
-       rc = cudbg_get_buff(dbg_buff, size, &temp_buff);
+       rc = cudbg_get_buff(pdbg_init, dbg_buff, size, &temp_buff);
        if (rc)
                return rc;
 
                rc = cudbg_collect_tcam_index(padap, tcam, i);
                if (rc) {
                        cudbg_err->sys_err = rc;
-                       cudbg_put_buff(&temp_buff, dbg_buff);
+                       cudbg_put_buff(pdbg_init, &temp_buff);
                        return rc;
                }
                total_size += sizeof(struct cudbg_mps_tcam);
        if (!total_size) {
                rc = CUDBG_SYSTEM_ERROR;
                cudbg_err->sys_err = rc;
-               cudbg_put_buff(&temp_buff, dbg_buff);
+               cudbg_put_buff(pdbg_init, &temp_buff);
                return rc;
        }
-       cudbg_write_and_release_buff(&temp_buff, dbg_buff);
-       return rc;
+       return cudbg_write_and_release_buff(pdbg_init, &temp_buff, dbg_buff);
 }
 
 int cudbg_collect_vpd_data(struct cudbg_init *pdbg_init,
        if (rc)
                return rc;
 
-       rc = cudbg_get_buff(dbg_buff, sizeof(struct cudbg_vpd_data),
+       rc = cudbg_get_buff(pdbg_init, dbg_buff, sizeof(struct cudbg_vpd_data),
                            &temp_buff);
        if (rc)
                return rc;
        vpd_data->fw_minor = FW_HDR_FW_VER_MINOR_G(fw_vers);
        vpd_data->fw_micro = FW_HDR_FW_VER_MICRO_G(fw_vers);
        vpd_data->fw_build = FW_HDR_FW_VER_BUILD_G(fw_vers);
-       cudbg_write_and_release_buff(&temp_buff, dbg_buff);
-       return rc;
+       return cudbg_write_and_release_buff(pdbg_init, &temp_buff, dbg_buff);
 }
 
 static int cudbg_read_tid(struct cudbg_init *pdbg_init, u32 tid,
 
        size = sizeof(struct cudbg_tid_data) * tcam_region.max_tid;
        size += sizeof(struct cudbg_tcam);
-       rc = cudbg_get_buff(dbg_buff, size, &temp_buff);
+       rc = cudbg_get_buff(pdbg_init, dbg_buff, size, &temp_buff);
        if (rc)
                return rc;
 
                rc = cudbg_read_tid(pdbg_init, i, tid_data);
                if (rc) {
                        cudbg_err->sys_err = rc;
-                       cudbg_put_buff(&temp_buff, dbg_buff);
+                       cudbg_put_buff(pdbg_init, &temp_buff);
                        return rc;
                }
 
                bytes += sizeof(struct cudbg_tid_data);
        }
 
-       cudbg_write_and_release_buff(&temp_buff, dbg_buff);
-       return rc;
+       return cudbg_write_and_release_buff(pdbg_init, &temp_buff, dbg_buff);
 }
 
 int cudbg_collect_cctrl(struct cudbg_init *pdbg_init,
        int rc;
 
        size = sizeof(u16) * NMTUS * NCCTRL_WIN;
-       rc = cudbg_get_buff(dbg_buff, size, &temp_buff);
+       rc = cudbg_get_buff(pdbg_init, dbg_buff, size, &temp_buff);
        if (rc)
                return rc;
 
        t4_read_cong_tbl(padap, (void *)temp_buff.data);
-       cudbg_write_and_release_buff(&temp_buff, dbg_buff);
-       return rc;
+       return cudbg_write_and_release_buff(pdbg_init, &temp_buff, dbg_buff);
 }
 
 int cudbg_collect_ma_indirect(struct cudbg_init *pdbg_init,
 
        n = sizeof(t6_ma_ireg_array) / (IREG_NUM_ELEM * sizeof(u32));
        size = sizeof(struct ireg_buf) * n * 2;
-       rc = cudbg_get_buff(dbg_buff, size, &temp_buff);
+       rc = cudbg_get_buff(pdbg_init, dbg_buff, size, &temp_buff);
        if (rc)
                return rc;
 
                }
                ma_indr++;
        }
-       cudbg_write_and_release_buff(&temp_buff, dbg_buff);
-       return rc;
+       return cudbg_write_and_release_buff(pdbg_init, &temp_buff, dbg_buff);
 }
 
 int cudbg_collect_ulptx_la(struct cudbg_init *pdbg_init,
        u32 i, j;
        int rc;
 
-       rc = cudbg_get_buff(dbg_buff, sizeof(struct cudbg_ulptx_la),
+       rc = cudbg_get_buff(pdbg_init, dbg_buff, sizeof(struct cudbg_ulptx_la),
                            &temp_buff);
        if (rc)
                return rc;
                                t4_read_reg(padap,
                                            ULP_TX_LA_RDDATA_0_A + 0x10 * i);
        }
-       cudbg_write_and_release_buff(&temp_buff, dbg_buff);
-       return rc;
+       return cudbg_write_and_release_buff(pdbg_init, &temp_buff, dbg_buff);
 }
 
 int cudbg_collect_up_cim_indirect(struct cudbg_init *pdbg_init,
                return CUDBG_STATUS_NOT_IMPLEMENTED;
 
        size = sizeof(struct ireg_buf) * n;
-       rc = cudbg_get_buff(dbg_buff, size, &temp_buff);
+       rc = cudbg_get_buff(pdbg_init, dbg_buff, size, &temp_buff);
        if (rc)
                return rc;
 
                                         up_cim_reg->ireg_local_offset +
                                         (j * local_offset), local_range, buff);
                        if (rc) {
-                               cudbg_put_buff(&temp_buff, dbg_buff);
+                               cudbg_put_buff(pdbg_init, &temp_buff);
                                return rc;
                        }
                }
                up_cim++;
        }
-       cudbg_write_and_release_buff(&temp_buff, dbg_buff);
-       return rc;
+       return cudbg_write_and_release_buff(pdbg_init, &temp_buff, dbg_buff);
 }
 
 int cudbg_collect_pbt_tables(struct cudbg_init *pdbg_init,
        int i, rc;
        u32 addr;
 
-       rc = cudbg_get_buff(dbg_buff, sizeof(struct cudbg_pbt_tables),
+       rc = cudbg_get_buff(pdbg_init, dbg_buff,
+                           sizeof(struct cudbg_pbt_tables),
                            &temp_buff);
        if (rc)
                return rc;
                                 &pbt->pbt_dynamic[i]);
                if (rc) {
                        cudbg_err->sys_err = rc;
-                       cudbg_put_buff(&temp_buff, dbg_buff);
+                       cudbg_put_buff(pdbg_init, &temp_buff);
                        return rc;
                }
        }
                                 &pbt->pbt_static[i]);
                if (rc) {
                        cudbg_err->sys_err = rc;
-                       cudbg_put_buff(&temp_buff, dbg_buff);
+                       cudbg_put_buff(pdbg_init, &temp_buff);
                        return rc;
                }
        }
                                 &pbt->lrf_table[i]);
                if (rc) {
                        cudbg_err->sys_err = rc;
-                       cudbg_put_buff(&temp_buff, dbg_buff);
+                       cudbg_put_buff(pdbg_init, &temp_buff);
                        return rc;
                }
        }
                                 &pbt->pbt_data[i]);
                if (rc) {
                        cudbg_err->sys_err = rc;
-                       cudbg_put_buff(&temp_buff, dbg_buff);
+                       cudbg_put_buff(pdbg_init, &temp_buff);
                        return rc;
                }
        }
-       cudbg_write_and_release_buff(&temp_buff, dbg_buff);
-       return rc;
+       return cudbg_write_and_release_buff(pdbg_init, &temp_buff, dbg_buff);
 }
 
 int cudbg_collect_mbox_log(struct cudbg_init *pdbg_init,
        log = padap->mbox_log;
        mbox_cmds = padap->mbox_log->size;
        size = sizeof(struct cudbg_mbox_log) * mbox_cmds;
-       rc = cudbg_get_buff(dbg_buff, size, &temp_buff);
+       rc = cudbg_get_buff(pdbg_init, dbg_buff, size, &temp_buff);
        if (rc)
                return rc;
 
                }
                mboxlog++;
        }
-       cudbg_write_and_release_buff(&temp_buff, dbg_buff);
-       return rc;
+       return cudbg_write_and_release_buff(pdbg_init, &temp_buff, dbg_buff);
 }
 
 int cudbg_collect_hma_indirect(struct cudbg_init *pdbg_init,
 
        n = sizeof(t6_hma_ireg_array) / (IREG_NUM_ELEM * sizeof(u32));
        size = sizeof(struct ireg_buf) * n;
-       rc = cudbg_get_buff(dbg_buff, size, &temp_buff);
+       rc = cudbg_get_buff(pdbg_init, dbg_buff, size, &temp_buff);
        if (rc)
                return rc;
 
                                 hma_fli->ireg_local_offset);
                hma_indr++;
        }
-       cudbg_write_and_release_buff(&temp_buff, dbg_buff);
-       return rc;
+       return cudbg_write_and_release_buff(pdbg_init, &temp_buff, dbg_buff);
 }