1 /* Broadcom NetXtreme-C/E network driver.
3 * Copyright (c) 2021 Broadcom Limited
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation.
10 #include <linux/types.h>
11 #include <linux/errno.h>
12 #include <linux/pci.h>
15 #include "bnxt_hwrm.h"
16 #include "bnxt_coredump.h"
18 static const u16 bnxt_bstore_to_seg_id
[] = {
19 [BNXT_CTX_QP
] = BNXT_CTX_MEM_SEG_QP
,
20 [BNXT_CTX_SRQ
] = BNXT_CTX_MEM_SEG_SRQ
,
21 [BNXT_CTX_CQ
] = BNXT_CTX_MEM_SEG_CQ
,
22 [BNXT_CTX_VNIC
] = BNXT_CTX_MEM_SEG_VNIC
,
23 [BNXT_CTX_STAT
] = BNXT_CTX_MEM_SEG_STAT
,
24 [BNXT_CTX_STQM
] = BNXT_CTX_MEM_SEG_STQM
,
25 [BNXT_CTX_FTQM
] = BNXT_CTX_MEM_SEG_FTQM
,
26 [BNXT_CTX_MRAV
] = BNXT_CTX_MEM_SEG_MRAV
,
27 [BNXT_CTX_TIM
] = BNXT_CTX_MEM_SEG_TIM
,
28 [BNXT_CTX_SRT
] = BNXT_CTX_MEM_SEG_SRT
,
29 [BNXT_CTX_SRT2
] = BNXT_CTX_MEM_SEG_SRT2
,
30 [BNXT_CTX_CRT
] = BNXT_CTX_MEM_SEG_CRT
,
31 [BNXT_CTX_CRT2
] = BNXT_CTX_MEM_SEG_CRT2
,
32 [BNXT_CTX_RIGP0
] = BNXT_CTX_MEM_SEG_RIGP0
,
33 [BNXT_CTX_L2HWRM
] = BNXT_CTX_MEM_SEG_L2HWRM
,
34 [BNXT_CTX_REHWRM
] = BNXT_CTX_MEM_SEG_REHWRM
,
35 [BNXT_CTX_CA0
] = BNXT_CTX_MEM_SEG_CA0
,
36 [BNXT_CTX_CA1
] = BNXT_CTX_MEM_SEG_CA1
,
37 [BNXT_CTX_CA2
] = BNXT_CTX_MEM_SEG_CA2
,
38 [BNXT_CTX_RIGP1
] = BNXT_CTX_MEM_SEG_RIGP1
,
41 static int bnxt_dbg_hwrm_log_buffer_flush(struct bnxt
*bp
, u16 type
, u32 flags
,
44 struct hwrm_dbg_log_buffer_flush_output
*resp
;
45 struct hwrm_dbg_log_buffer_flush_input
*req
;
48 rc
= hwrm_req_init(bp
, req
, HWRM_DBG_LOG_BUFFER_FLUSH
);
52 req
->flags
= cpu_to_le32(flags
);
53 req
->type
= cpu_to_le16(type
);
54 resp
= hwrm_req_hold(bp
, req
);
55 rc
= hwrm_req_send(bp
, req
);
57 *offset
= le32_to_cpu(resp
->current_buffer_offset
);
58 hwrm_req_drop(bp
, req
);
62 static int bnxt_hwrm_dbg_dma_data(struct bnxt
*bp
, void *msg
,
63 struct bnxt_hwrm_dbg_dma_info
*info
)
65 struct hwrm_dbg_cmn_input
*cmn_req
= msg
;
66 __le16
*seq_ptr
= msg
+ info
->seq_off
;
67 struct hwrm_dbg_cmn_output
*cmn_resp
;
68 u16 seq
= 0, len
, segs_off
;
69 dma_addr_t dma_handle
;
73 dma_buf
= hwrm_req_dma_slice(bp
, msg
, info
->dma_len
, &dma_handle
);
75 hwrm_req_drop(bp
, msg
);
79 hwrm_req_timeout(bp
, msg
, bp
->hwrm_cmd_max_timeout
);
80 cmn_resp
= hwrm_req_hold(bp
, msg
);
83 segs_off
= offsetof(struct hwrm_dbg_coredump_list_output
,
85 cmn_req
->host_dest_addr
= cpu_to_le64(dma_handle
);
86 cmn_req
->host_buf_len
= cpu_to_le32(info
->dma_len
);
88 *seq_ptr
= cpu_to_le16(seq
);
89 rc
= hwrm_req_send(bp
, msg
);
93 len
= le16_to_cpu(*((__le16
*)(resp
+ info
->data_len_off
)));
95 cmn_req
->req_type
== cpu_to_le16(HWRM_DBG_COREDUMP_LIST
)) {
96 info
->segs
= le16_to_cpu(*((__le16
*)(resp
+
103 info
->dest_buf_size
= info
->segs
*
104 sizeof(struct coredump_segment_record
);
105 info
->dest_buf
= kmalloc(info
->dest_buf_size
,
107 if (!info
->dest_buf
) {
113 if (info
->dest_buf
) {
114 if ((info
->seg_start
+ off
+ len
) <=
115 BNXT_COREDUMP_BUF_LEN(info
->buf_len
)) {
116 memcpy(info
->dest_buf
+ off
, dma_buf
, len
);
123 if (cmn_req
->req_type
==
124 cpu_to_le16(HWRM_DBG_COREDUMP_RETRIEVE
))
125 info
->dest_buf_size
+= len
;
127 if (!(cmn_resp
->flags
& HWRM_DBG_CMN_FLAGS_MORE
))
133 hwrm_req_drop(bp
, msg
);
137 static int bnxt_hwrm_dbg_coredump_list(struct bnxt
*bp
,
138 struct bnxt_coredump
*coredump
)
140 struct bnxt_hwrm_dbg_dma_info info
= {NULL
};
141 struct hwrm_dbg_coredump_list_input
*req
;
144 rc
= hwrm_req_init(bp
, req
, HWRM_DBG_COREDUMP_LIST
);
148 info
.dma_len
= COREDUMP_LIST_BUF_LEN
;
149 info
.seq_off
= offsetof(struct hwrm_dbg_coredump_list_input
, seq_no
);
150 info
.data_len_off
= offsetof(struct hwrm_dbg_coredump_list_output
,
153 rc
= bnxt_hwrm_dbg_dma_data(bp
, req
, &info
);
155 coredump
->data
= info
.dest_buf
;
156 coredump
->data_size
= info
.dest_buf_size
;
157 coredump
->total_segs
= info
.segs
;
162 static int bnxt_hwrm_dbg_coredump_initiate(struct bnxt
*bp
, u16 component_id
,
165 struct hwrm_dbg_coredump_initiate_input
*req
;
168 rc
= hwrm_req_init(bp
, req
, HWRM_DBG_COREDUMP_INITIATE
);
172 hwrm_req_timeout(bp
, req
, bp
->hwrm_cmd_max_timeout
);
173 req
->component_id
= cpu_to_le16(component_id
);
174 req
->segment_id
= cpu_to_le16(segment_id
);
176 return hwrm_req_send(bp
, req
);
179 static int bnxt_hwrm_dbg_coredump_retrieve(struct bnxt
*bp
, u16 component_id
,
180 u16 segment_id
, u32
*seg_len
,
181 void *buf
, u32 buf_len
, u32 offset
)
183 struct hwrm_dbg_coredump_retrieve_input
*req
;
184 struct bnxt_hwrm_dbg_dma_info info
= {NULL
};
187 rc
= hwrm_req_init(bp
, req
, HWRM_DBG_COREDUMP_RETRIEVE
);
191 req
->component_id
= cpu_to_le16(component_id
);
192 req
->segment_id
= cpu_to_le16(segment_id
);
194 info
.dma_len
= COREDUMP_RETRIEVE_BUF_LEN
;
195 info
.seq_off
= offsetof(struct hwrm_dbg_coredump_retrieve_input
,
197 info
.data_len_off
= offsetof(struct hwrm_dbg_coredump_retrieve_output
,
200 info
.dest_buf
= buf
+ offset
;
201 info
.buf_len
= buf_len
;
202 info
.seg_start
= offset
;
205 rc
= bnxt_hwrm_dbg_dma_data(bp
, req
, &info
);
207 *seg_len
= info
.dest_buf_size
;
213 bnxt_fill_coredump_seg_hdr(struct bnxt
*bp
,
214 struct bnxt_coredump_segment_hdr
*seg_hdr
,
215 struct coredump_segment_record
*seg_rec
, u32 seg_len
,
216 int status
, u32 duration
, u32 instance
, u32 comp_id
,
219 memset(seg_hdr
, 0, sizeof(*seg_hdr
));
220 memcpy(seg_hdr
->signature
, "sEgM", 4);
222 seg_hdr
->component_id
= (__force __le32
)seg_rec
->component_id
;
223 seg_hdr
->segment_id
= (__force __le32
)seg_rec
->segment_id
;
224 seg_hdr
->low_version
= seg_rec
->version_low
;
225 seg_hdr
->high_version
= seg_rec
->version_hi
;
226 seg_hdr
->flags
= cpu_to_le32(seg_rec
->compress_flags
);
228 seg_hdr
->component_id
= cpu_to_le32(comp_id
);
229 seg_hdr
->segment_id
= cpu_to_le32(seg_id
);
231 seg_hdr
->function_id
= cpu_to_le16(bp
->pdev
->devfn
);
232 seg_hdr
->length
= cpu_to_le32(seg_len
);
233 seg_hdr
->status
= cpu_to_le32(status
);
234 seg_hdr
->duration
= cpu_to_le32(duration
);
235 seg_hdr
->data_offset
= cpu_to_le32(sizeof(*seg_hdr
));
236 seg_hdr
->instance
= cpu_to_le32(instance
);
239 static void bnxt_fill_cmdline(struct bnxt_coredump_record
*record
)
241 struct mm_struct
*mm
= current
->mm
;
242 int i
, len
, last
= 0;
245 len
= min_t(int, mm
->arg_end
- mm
->arg_start
,
246 sizeof(record
->commandline
) - 1);
247 if (len
&& !copy_from_user(record
->commandline
,
248 (char __user
*)mm
->arg_start
, len
)) {
249 for (i
= 0; i
< len
; i
++) {
250 if (record
->commandline
[i
])
253 record
->commandline
[i
] = ' ';
255 record
->commandline
[last
+ 1] = 0;
260 strscpy(record
->commandline
, current
->comm
, TASK_COMM_LEN
);
264 bnxt_fill_coredump_record(struct bnxt
*bp
, struct bnxt_coredump_record
*record
,
265 time64_t start
, s16 start_utc
, u16 total_segs
,
268 time64_t end
= ktime_get_real_seconds();
269 u32 os_ver_major
= 0, os_ver_minor
= 0;
272 time64_to_tm(start
, 0, &tm
);
273 memset(record
, 0, sizeof(*record
));
274 memcpy(record
->signature
, "cOrE", 4);
276 record
->low_version
= 0;
277 record
->high_version
= 1;
278 record
->asic_state
= 0;
279 strscpy(record
->system_name
, utsname()->nodename
,
280 sizeof(record
->system_name
));
281 record
->year
= cpu_to_le16(tm
.tm_year
+ 1900);
282 record
->month
= cpu_to_le16(tm
.tm_mon
+ 1);
283 record
->day
= cpu_to_le16(tm
.tm_mday
);
284 record
->hour
= cpu_to_le16(tm
.tm_hour
);
285 record
->minute
= cpu_to_le16(tm
.tm_min
);
286 record
->second
= cpu_to_le16(tm
.tm_sec
);
287 record
->utc_bias
= cpu_to_le16(start_utc
);
288 bnxt_fill_cmdline(record
);
289 record
->total_segments
= cpu_to_le32(total_segs
);
291 if (sscanf(utsname()->release
, "%u.%u", &os_ver_major
, &os_ver_minor
) != 2)
292 netdev_warn(bp
->dev
, "Unknown OS release in coredump\n");
293 record
->os_ver_major
= cpu_to_le32(os_ver_major
);
294 record
->os_ver_minor
= cpu_to_le32(os_ver_minor
);
296 strscpy(record
->os_name
, utsname()->sysname
, sizeof(record
->os_name
));
297 time64_to_tm(end
, 0, &tm
);
298 record
->end_year
= cpu_to_le16(tm
.tm_year
+ 1900);
299 record
->end_month
= cpu_to_le16(tm
.tm_mon
+ 1);
300 record
->end_day
= cpu_to_le16(tm
.tm_mday
);
301 record
->end_hour
= cpu_to_le16(tm
.tm_hour
);
302 record
->end_minute
= cpu_to_le16(tm
.tm_min
);
303 record
->end_second
= cpu_to_le16(tm
.tm_sec
);
304 record
->end_utc_bias
= cpu_to_le16(sys_tz
.tz_minuteswest
* 60);
305 record
->asic_id1
= cpu_to_le32(bp
->chip_num
<< 16 |
306 bp
->ver_resp
.chip_rev
<< 8 |
307 bp
->ver_resp
.chip_metal
);
308 record
->asic_id2
= 0;
309 record
->coredump_status
= cpu_to_le32(status
);
310 record
->ioctl_low_version
= 0;
311 record
->ioctl_high_version
= 0;
314 static void bnxt_fill_drv_seg_record(struct bnxt
*bp
,
315 struct bnxt_driver_segment_record
*record
,
316 struct bnxt_ctx_mem_type
*ctxm
, u16 type
)
318 struct bnxt_bs_trace_info
*bs_trace
= &bp
->bs_trace
[type
];
322 rc
= bnxt_dbg_hwrm_log_buffer_flush(bp
, type
, 0, &offset
);
326 bnxt_bs_trace_check_wrap(bs_trace
, offset
);
327 record
->max_entries
= cpu_to_le32(ctxm
->max_entries
);
328 record
->entry_size
= cpu_to_le32(ctxm
->entry_size
);
329 record
->offset
= cpu_to_le32(bs_trace
->last_offset
);
330 record
->wrapped
= bs_trace
->wrapped
;
333 static u32
bnxt_get_ctx_coredump(struct bnxt
*bp
, void *buf
, u32 offset
,
336 struct bnxt_driver_segment_record record
= {};
337 struct bnxt_coredump_segment_hdr seg_hdr
;
338 struct bnxt_ctx_mem_info
*ctx
= bp
->ctx
;
339 u32 comp_id
= BNXT_DRV_COMP_ID
;
350 for (type
= 0 ; type
<= BNXT_CTX_RIGP1
; type
++) {
351 struct bnxt_ctx_mem_type
*ctxm
= &ctx
->ctx_arr
[type
];
352 bool trace
= bnxt_bs_trace_avail(bp
, type
);
353 u32 seg_id
= bnxt_bstore_to_seg_id
[type
];
354 size_t seg_len
, extra_hlen
= 0;
356 if (!ctxm
->mem_valid
|| !seg_id
)
360 extra_hlen
= BNXT_SEG_RCD_LEN
;
362 data
= buf
+ BNXT_SEG_HDR_LEN
+ extra_hlen
;
363 seg_len
= bnxt_copy_ctx_mem(bp
, ctxm
, data
, 0) + extra_hlen
;
365 bnxt_fill_coredump_seg_hdr(bp
, &seg_hdr
, NULL
, seg_len
,
366 0, 0, 0, comp_id
, seg_id
);
367 memcpy(buf
, &seg_hdr
, BNXT_SEG_HDR_LEN
);
368 buf
+= BNXT_SEG_HDR_LEN
;
370 u16 trace_type
= bnxt_bstore_to_trace
[type
];
372 bnxt_fill_drv_seg_record(bp
, &record
, ctxm
,
374 memcpy(buf
, &record
, BNXT_SEG_RCD_LEN
);
378 len
+= BNXT_SEG_HDR_LEN
+ seg_len
;
384 static int __bnxt_get_coredump(struct bnxt
*bp
, u16 dump_type
, void *buf
,
387 u32 ver_get_resp_len
= sizeof(struct hwrm_ver_get_output
);
388 u32 offset
= 0, seg_hdr_len
, seg_record_len
, buf_len
= 0;
389 struct coredump_segment_record
*seg_record
= NULL
;
390 struct bnxt_coredump_segment_hdr seg_hdr
;
391 struct bnxt_coredump coredump
= {NULL
};
399 start_time
= ktime_get_real_seconds();
400 start_utc
= sys_tz
.tz_minuteswest
* 60;
401 seg_hdr_len
= sizeof(seg_hdr
);
403 /* First segment should be hwrm_ver_get response.
404 * For hwrm_ver_get response Component id = 2 and Segment id = 0.
406 *dump_len
= seg_hdr_len
+ ver_get_resp_len
;
408 bnxt_fill_coredump_seg_hdr(bp
, &seg_hdr
, NULL
, ver_get_resp_len
,
409 0, 0, 0, BNXT_VER_GET_COMP_ID
, 0);
410 memcpy(buf
+ offset
, &seg_hdr
, seg_hdr_len
);
411 offset
+= seg_hdr_len
;
412 memcpy(buf
+ offset
, &bp
->ver_resp
, ver_get_resp_len
);
413 offset
+= ver_get_resp_len
;
416 if (dump_type
== BNXT_DUMP_DRIVER
) {
417 u32 drv_len
, segs
= 0;
419 drv_len
= bnxt_get_ctx_coredump(bp
, buf
, offset
, &segs
);
420 *dump_len
+= drv_len
;
423 coredump
.total_segs
+= segs
;
427 seg_record_len
= sizeof(*seg_record
);
428 rc
= bnxt_hwrm_dbg_coredump_list(bp
, &coredump
);
430 netdev_err(bp
->dev
, "Failed to get coredump segment list\n");
434 *dump_len
+= seg_hdr_len
* coredump
.total_segs
;
436 seg_record
= (struct coredump_segment_record
*)coredump
.data
;
437 seg_record_len
= sizeof(*seg_record
);
439 for (i
= 0; i
< coredump
.total_segs
; i
++) {
440 u16 comp_id
= le16_to_cpu(seg_record
->component_id
);
441 u16 seg_id
= le16_to_cpu(seg_record
->segment_id
);
442 u32 duration
= 0, seg_len
= 0;
443 unsigned long start
, end
;
445 if (buf
&& ((offset
+ seg_hdr_len
) >
446 BNXT_COREDUMP_BUF_LEN(buf_len
))) {
453 rc
= bnxt_hwrm_dbg_coredump_initiate(bp
, comp_id
, seg_id
);
456 "Failed to initiate coredump for seg = %d\n",
457 seg_record
->segment_id
);
461 /* Write segment data into the buffer */
462 rc
= bnxt_hwrm_dbg_coredump_retrieve(bp
, comp_id
, seg_id
,
463 &seg_len
, buf
, buf_len
,
464 offset
+ seg_hdr_len
);
465 if (rc
&& rc
== -ENOBUFS
)
469 "Failed to retrieve coredump for seg = %d\n",
470 seg_record
->segment_id
);
474 duration
= jiffies_to_msecs(end
- start
);
475 bnxt_fill_coredump_seg_hdr(bp
, &seg_hdr
, seg_record
, seg_len
,
476 rc
, duration
, 0, 0, 0);
479 /* Write segment header into the buffer */
480 memcpy(buf
+ offset
, &seg_hdr
, seg_hdr_len
);
481 offset
+= seg_hdr_len
+ seg_len
;
484 *dump_len
+= seg_len
;
486 (struct coredump_segment_record
*)((u8
*)seg_record
+
492 bnxt_fill_coredump_record(bp
, buf
+ offset
, start_time
,
493 start_utc
, coredump
.total_segs
+ 1,
495 kfree(coredump
.data
);
496 *dump_len
+= sizeof(struct bnxt_coredump_record
);
498 netdev_err(bp
->dev
, "Firmware returned large coredump buffer\n");
502 static u32
bnxt_copy_crash_data(struct bnxt_ring_mem_info
*rmem
, void *buf
,
509 for (i
= 0; i
< rmem
->nr_pages
; i
++) {
510 data_len
= rmem
->page_size
;
511 if (data_copied
+ data_len
> dump_len
)
512 data_len
= dump_len
- data_copied
;
513 memcpy(buf
+ data_copied
, rmem
->pg_arr
[i
], data_len
);
514 data_copied
+= data_len
;
515 if (data_copied
>= dump_len
)
521 static int bnxt_copy_crash_dump(struct bnxt
*bp
, void *buf
, u32 dump_len
)
523 struct bnxt_ring_mem_info
*rmem
;
526 if (!bp
->fw_crash_mem
)
529 rmem
= &bp
->fw_crash_mem
->ring_mem
;
531 if (rmem
->depth
> 1) {
534 for (i
= 0; i
< rmem
->nr_pages
; i
++) {
535 struct bnxt_ctx_pg_info
*pg_tbl
;
537 pg_tbl
= bp
->fw_crash_mem
->ctx_pg_tbl
[i
];
538 offset
+= bnxt_copy_crash_data(&pg_tbl
->ring_mem
,
541 if (offset
>= dump_len
)
545 bnxt_copy_crash_data(rmem
, buf
, dump_len
);
551 static bool bnxt_crash_dump_avail(struct bnxt
*bp
)
555 /* First 4 bytes(signature) of crash dump is always non-zero */
556 bnxt_copy_crash_dump(bp
, &sig
, sizeof(sig
));
560 int bnxt_get_coredump(struct bnxt
*bp
, u16 dump_type
, void *buf
, u32
*dump_len
)
562 if (dump_type
== BNXT_DUMP_CRASH
) {
563 if (bp
->fw_dbg_cap
& DBG_QCAPS_RESP_FLAGS_CRASHDUMP_HOST_DDR
)
564 return bnxt_copy_crash_dump(bp
, buf
, *dump_len
);
565 #ifdef CONFIG_TEE_BNXT_FW
566 else if (bp
->fw_dbg_cap
& DBG_QCAPS_RESP_FLAGS_CRASHDUMP_SOC_DDR
)
567 return tee_bnxt_copy_coredump(buf
, 0, *dump_len
);
572 return __bnxt_get_coredump(bp
, dump_type
, buf
, dump_len
);
576 int bnxt_hwrm_get_dump_len(struct bnxt
*bp
, u16 dump_type
, u32
*dump_len
)
578 struct hwrm_dbg_qcfg_output
*resp
;
579 struct hwrm_dbg_qcfg_input
*req
;
582 if (!(bp
->fw_cap
& BNXT_FW_CAP_DBG_QCAPS
))
585 if (dump_type
== BNXT_DUMP_CRASH
&&
586 !(bp
->fw_dbg_cap
& DBG_QCAPS_RESP_FLAGS_CRASHDUMP_SOC_DDR
||
587 (bp
->fw_dbg_cap
& DBG_QCAPS_RESP_FLAGS_CRASHDUMP_HOST_DDR
)))
590 rc
= hwrm_req_init(bp
, req
, HWRM_DBG_QCFG
);
594 req
->fid
= cpu_to_le16(0xffff);
595 if (dump_type
== BNXT_DUMP_CRASH
) {
596 if (bp
->fw_dbg_cap
& DBG_QCAPS_RESP_FLAGS_CRASHDUMP_SOC_DDR
)
597 req
->flags
= cpu_to_le16(BNXT_DBG_FL_CR_DUMP_SIZE_SOC
);
599 req
->flags
= cpu_to_le16(BNXT_DBG_FL_CR_DUMP_SIZE_HOST
);
602 resp
= hwrm_req_hold(bp
, req
);
603 rc
= hwrm_req_send(bp
, req
);
605 goto get_dump_len_exit
;
607 if (dump_type
== BNXT_DUMP_CRASH
) {
608 if (bp
->fw_dbg_cap
& DBG_QCAPS_RESP_FLAGS_CRASHDUMP_SOC_DDR
)
609 *dump_len
= BNXT_CRASH_DUMP_LEN
;
611 *dump_len
= le32_to_cpu(resp
->crashdump_size
);
613 /* Driver adds coredump header and "HWRM_VER_GET response"
614 * segment additionally to coredump.
616 hdr_len
= sizeof(struct bnxt_coredump_segment_hdr
) +
617 sizeof(struct hwrm_ver_get_output
) +
618 sizeof(struct bnxt_coredump_record
);
619 *dump_len
= le32_to_cpu(resp
->coredump_size
) + hdr_len
;
621 if (*dump_len
<= hdr_len
)
625 hwrm_req_drop(bp
, req
);
629 u32
bnxt_get_coredump_length(struct bnxt
*bp
, u16 dump_type
)
633 if (dump_type
== BNXT_DUMP_CRASH
&&
634 bp
->fw_dbg_cap
& DBG_QCAPS_RESP_FLAGS_CRASHDUMP_HOST_DDR
&&
636 if (!bnxt_crash_dump_avail(bp
))
639 return bp
->fw_crash_len
;
642 if (dump_type
!= BNXT_DUMP_DRIVER
) {
643 if (!bnxt_hwrm_get_dump_len(bp
, dump_type
, &len
))
646 if (dump_type
!= BNXT_DUMP_CRASH
)
647 __bnxt_get_coredump(bp
, dump_type
, NULL
, &len
);