return rc;
 }
 
+int cudbg_collect_fw_devlog(struct cudbg_init *pdbg_init,
+                           struct cudbg_buffer *dbg_buff,
+                           struct cudbg_error *cudbg_err)
+{
+       struct adapter *padap = pdbg_init->adap;
+       struct cudbg_buffer temp_buff = { 0 };
+       struct devlog_params *dparams;
+       int rc = 0;
+
+       rc = t4_init_devlog_params(padap);
+       if (rc < 0) {
+               cudbg_err->sys_err = rc;
+               return rc;
+       }
+
+       dparams = &padap->params.devlog;
+       rc = cudbg_get_buff(dbg_buff, dparams->size, &temp_buff);
+       if (rc)
+               return rc;
+
+       /* Collect FW devlog */
+       if (dparams->start != 0) {
+               spin_lock(&padap->win0_lock);
+               rc = t4_memory_rw(padap, padap->params.drv_memwin,
+                                 dparams->memtype, dparams->start,
+                                 dparams->size,
+                                 (__be32 *)(char *)temp_buff.data,
+                                 1);
+               spin_unlock(&padap->win0_lock);
+               if (rc) {
+                       cudbg_err->sys_err = rc;
+                       cudbg_put_buff(&temp_buff, dbg_buff);
+                       return rc;
+               }
+       }
+       cudbg_write_and_release_buff(&temp_buff, dbg_buff);
+       return rc;
+}
+
 static int cudbg_read_fw_mem(struct cudbg_init *pdbg_init,
                             struct cudbg_buffer *dbg_buff, u8 mem_type,
                             unsigned long tot_len,
        return cudbg_collect_mem_region(pdbg_init, dbg_buff, cudbg_err,
                                        MEM_EDC1);
 }
+
+int cudbg_collect_mbox_log(struct cudbg_init *pdbg_init,
+                          struct cudbg_buffer *dbg_buff,
+                          struct cudbg_error *cudbg_err)
+{
+       struct adapter *padap = pdbg_init->adap;
+       struct cudbg_mbox_log *mboxlog = NULL;
+       struct cudbg_buffer temp_buff = { 0 };
+       struct mbox_cmd_log *log = NULL;
+       struct mbox_cmd *entry;
+       unsigned int entry_idx;
+       u16 mbox_cmds;
+       int i, k, rc;
+       u64 flit;
+       u32 size;
+
+       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);
+       if (rc)
+               return rc;
+
+       mboxlog = (struct cudbg_mbox_log *)temp_buff.data;
+       for (k = 0; k < mbox_cmds; k++) {
+               entry_idx = log->cursor + k;
+               if (entry_idx >= log->size)
+                       entry_idx -= log->size;
+
+               entry = mbox_cmd_log_entry(log, entry_idx);
+               /* skip over unused entries */
+               if (entry->timestamp == 0)
+                       continue;
+
+               memcpy(&mboxlog->entry, entry, sizeof(struct mbox_cmd));
+               for (i = 0; i < MBOX_LEN / 8; i++) {
+                       flit = entry->cmd[i];
+                       mboxlog->hi[i] = (u32)(flit >> 32);
+                       mboxlog->lo[i] = (u32)flit;
+               }
+               mboxlog++;
+       }
+       cudbg_write_and_release_buff(&temp_buff, dbg_buff);
+       return rc;
+}
 
 int cudbg_collect_reg_dump(struct cudbg_init *pdbg_init,
                           struct cudbg_buffer *dbg_buff,
                           struct cudbg_error *cudbg_err);
+int cudbg_collect_fw_devlog(struct cudbg_init *pdbg_init,
+                           struct cudbg_buffer *dbg_buff,
+                           struct cudbg_error *cudbg_err);
 int cudbg_collect_edc0_meminfo(struct cudbg_init *pdbg_init,
                               struct cudbg_buffer *dbg_buff,
                               struct cudbg_error *cudbg_err);
 int cudbg_collect_edc1_meminfo(struct cudbg_init *pdbg_init,
                               struct cudbg_buffer *dbg_buff,
                               struct cudbg_error *cudbg_err);
+int cudbg_collect_mbox_log(struct cudbg_init *pdbg_init,
+                          struct cudbg_buffer *dbg_buff,
+                          struct cudbg_error *cudbg_err);
 
 struct cudbg_entity_hdr *cudbg_get_entity_hdr(void *outbuf, int i);
 void cudbg_align_debug_buffer(struct cudbg_buffer *dbg_buff,
 
 #include "t4_regs.h"
 #include "cxgb4.h"
 #include "cxgb4_cudbg.h"
+#include "cudbg_entity.h"
 
 static const struct cxgb4_collect_entity cxgb4_collect_mem_dump[] = {
        { CUDBG_EDC0, cudbg_collect_edc0_meminfo },
 };
 
 static const struct cxgb4_collect_entity cxgb4_collect_hw_dump[] = {
+       { CUDBG_MBOX_LOG, cudbg_collect_mbox_log },
+       { CUDBG_DEV_LOG, cudbg_collect_fw_devlog },
        { CUDBG_REG_DUMP, cudbg_collect_reg_dump },
 };
 
                        break;
                }
                break;
+       case CUDBG_DEV_LOG:
+               len = adap->params.devlog.size;
+               break;
        case CUDBG_EDC0:
                value = t4_read_reg(adap, MA_TARGET_MEM_ENABLE_A);
                if (value & EDRAM0_ENABLE_F) {
                }
                len = cudbg_mbytes_to_bytes(len);
                break;
+       case CUDBG_MBOX_LOG:
+               len = sizeof(struct cudbg_mbox_log) * adap->mbox_log->size;
+               break;
        default:
                break;
        }