bnxt_en: Flush FW trace before copying to the coredump
authorShruti Parab <shruti.parab@broadcom.com>
Thu, 10 Jul 2025 21:39:37 +0000 (14:39 -0700)
committerJakub Kicinski <kuba@kernel.org>
Fri, 11 Jul 2025 14:28:34 +0000 (07:28 -0700)
bnxt_fill_drv_seg_record() calls bnxt_dbg_hwrm_log_buffer_flush()
to flush the FW trace buffer.  This needs to be done before we
call bnxt_copy_ctx_mem() to copy the trace data.

Without this fix, the coredump may not contain all the FW
traces.

Fixes: 3c2179e66355 ("bnxt_en: Add FW trace coredump segments to the coredump")
Reviewed-by: Kalesh AP <kalesh-anakkur.purayil@broadcom.com>
Signed-off-by: Shruti Parab <shruti.parab@broadcom.com>
Signed-off-by: Michael Chan <michael.chan@broadcom.com>
Link: https://patch.msgid.link/20250710213938.1959625-3-michael.chan@broadcom.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/broadcom/bnxt/bnxt_coredump.c

index ce97befd3cb3e07f2e269865ad2d58c1ebdfbbc9..67e70d3d098091e7adee28654c67b51234a59633 100644 (file)
@@ -368,23 +368,27 @@ static u32 bnxt_get_ctx_coredump(struct bnxt *bp, void *buf, u32 offset,
                if (!ctxm->mem_valid || !seg_id)
                        continue;
 
-               if (trace)
+               if (trace) {
                        extra_hlen = BNXT_SEG_RCD_LEN;
+                       if (buf) {
+                               u16 trace_type = bnxt_bstore_to_trace[type];
+
+                               bnxt_fill_drv_seg_record(bp, &record, ctxm,
+                                                        trace_type);
+                       }
+               }
+
                if (buf)
                        data = buf + BNXT_SEG_HDR_LEN + extra_hlen;
+
                seg_len = bnxt_copy_ctx_mem(bp, ctxm, data, 0) + extra_hlen;
                if (buf) {
                        bnxt_fill_coredump_seg_hdr(bp, &seg_hdr, NULL, seg_len,
                                                   0, 0, 0, comp_id, seg_id);
                        memcpy(buf, &seg_hdr, BNXT_SEG_HDR_LEN);
                        buf += BNXT_SEG_HDR_LEN;
-                       if (trace) {
-                               u16 trace_type = bnxt_bstore_to_trace[type];
-
-                               bnxt_fill_drv_seg_record(bp, &record, ctxm,
-                                                        trace_type);
+                       if (trace)
                                memcpy(buf, &record, BNXT_SEG_RCD_LEN);
-                       }
                        buf += seg_len;
                }
                len += BNXT_SEG_HDR_LEN + seg_len;