1 | /******************************************************************* |
2 | * This file is part of the Emulex Linux Device Driver for * |
3 | * Fibre Channel Host Bus Adapters. * |
4 | * Copyright (C) 2017-2022 Broadcom. All Rights Reserved. The term * |
5 | * “Broadcom” refers to Broadcom Inc. and/or its subsidiaries. * |
6 | * Copyright (C) 2007-2011 Emulex. All rights reserved. * |
7 | * EMULEX and SLI are trademarks of Emulex. * |
8 | * www.broadcom.com * |
9 | * * |
10 | * This program is free software; you can redistribute it and/or * |
11 | * modify it under the terms of version 2 of the GNU General * |
12 | * Public License as published by the Free Software Foundation. * |
13 | * This program is distributed in the hope that it will be useful. * |
14 | * ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND * |
15 | * WARRANTIES, INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, * |
16 | * FITNESS FOR A PARTICULAR PURPOSE, OR NON-INFRINGEMENT, ARE * |
17 | * DISCLAIMED, EXCEPT TO THE EXTENT THAT SUCH DISCLAIMERS ARE HELD * |
18 | * TO BE LEGALLY INVALID. See the GNU General Public License for * |
19 | * more details, a copy of which can be found in the file COPYING * |
20 | * included with this package. * |
21 | *******************************************************************/ |
22 | |
23 | #ifndef _H_LPFC_DEBUG_FS |
24 | #define _H_LPFC_DEBUG_FS |
25 | |
26 | #ifdef CONFIG_SCSI_LPFC_DEBUG_FS |
27 | |
28 | /* size of output line, for discovery_trace and slow_ring_trace */ |
29 | #define LPFC_DEBUG_TRC_ENTRY_SIZE 100 |
30 | |
31 | /* nodelist output buffer size */ |
32 | #define LPFC_NODELIST_SIZE 8192 |
33 | #define LPFC_NODELIST_ENTRY_SIZE 120 |
34 | |
35 | /* dumpHBASlim output buffer size */ |
36 | #define LPFC_DUMPHBASLIM_SIZE 4096 |
37 | |
38 | /* dumpHostSlim output buffer size */ |
39 | #define LPFC_DUMPHOSTSLIM_SIZE 4096 |
40 | |
41 | /* dumpSLIqinfo output buffer size */ |
42 | #define LPFC_DUMPSLIQINFO_SIZE 4096 |
43 | |
44 | /* hbqinfo output buffer size */ |
45 | #define LPFC_HBQINFO_SIZE 8192 |
46 | |
47 | /* nvmestat output buffer size */ |
48 | #define LPFC_NVMESTAT_SIZE 8192 |
49 | #define LPFC_IOKTIME_SIZE 8192 |
50 | #define LPFC_NVMEIO_TRC_SIZE 8192 |
51 | |
52 | /* scsistat output buffer size */ |
53 | #define LPFC_SCSISTAT_SIZE 8192 |
54 | |
55 | /* Congestion Info Buffer size */ |
56 | #define LPFC_CGN_BUF_SIZE 8192 |
57 | |
58 | #define LPFC_DEBUG_OUT_LINE_SZ 80 |
59 | |
60 | /* |
61 | * For SLI4 iDiag debugfs diagnostics tool |
62 | */ |
63 | |
64 | /* pciConf */ |
65 | #define LPFC_PCI_CFG_BROWSE 0xffff |
66 | #define LPFC_PCI_CFG_RD_CMD_ARG 2 |
67 | #define LPFC_PCI_CFG_WR_CMD_ARG 3 |
68 | #define LPFC_PCI_CFG_SIZE 4096 |
69 | #define LPFC_PCI_CFG_RD_SIZE (LPFC_PCI_CFG_SIZE/4) |
70 | |
71 | #define IDIAG_PCICFG_WHERE_INDX 0 |
72 | #define IDIAG_PCICFG_COUNT_INDX 1 |
73 | #define IDIAG_PCICFG_VALUE_INDX 2 |
74 | |
75 | /* barAcc */ |
76 | #define LPFC_PCI_BAR_BROWSE 0xffff |
77 | #define LPFC_PCI_BAR_RD_CMD_ARG 3 |
78 | #define LPFC_PCI_BAR_WR_CMD_ARG 3 |
79 | |
80 | #define LPFC_PCI_IF0_BAR0_SIZE (1024 * 16) |
81 | #define LPFC_PCI_IF0_BAR1_SIZE (1024 * 128) |
82 | #define LPFC_PCI_IF0_BAR2_SIZE (1024 * 128) |
83 | #define LPFC_PCI_IF2_BAR0_SIZE (1024 * 32) |
84 | |
85 | #define LPFC_PCI_BAR_RD_BUF_SIZE 4096 |
86 | #define LPFC_PCI_BAR_RD_SIZE (LPFC_PCI_BAR_RD_BUF_SIZE/4) |
87 | |
88 | #define LPFC_PCI_IF0_BAR0_RD_SIZE (LPFC_PCI_IF0_BAR0_SIZE/4) |
89 | #define LPFC_PCI_IF0_BAR1_RD_SIZE (LPFC_PCI_IF0_BAR1_SIZE/4) |
90 | #define LPFC_PCI_IF0_BAR2_RD_SIZE (LPFC_PCI_IF0_BAR2_SIZE/4) |
91 | #define LPFC_PCI_IF2_BAR0_RD_SIZE (LPFC_PCI_IF2_BAR0_SIZE/4) |
92 | |
93 | #define IDIAG_BARACC_BAR_NUM_INDX 0 |
94 | #define IDIAG_BARACC_OFF_SET_INDX 1 |
95 | #define IDIAG_BARACC_ACC_MOD_INDX 2 |
96 | #define IDIAG_BARACC_REG_VAL_INDX 2 |
97 | #define IDIAG_BARACC_BAR_SZE_INDX 3 |
98 | |
99 | #define IDIAG_BARACC_BAR_0 0 |
100 | #define IDIAG_BARACC_BAR_1 1 |
101 | #define IDIAG_BARACC_BAR_2 2 |
102 | |
103 | #define SINGLE_WORD 1 |
104 | |
105 | /* queue info */ |
106 | #define LPFC_QUE_INFO_GET_BUF_SIZE 4096 |
107 | |
108 | /* queue acc */ |
109 | #define LPFC_QUE_ACC_BROWSE 0xffff |
110 | #define LPFC_QUE_ACC_RD_CMD_ARG 4 |
111 | #define LPFC_QUE_ACC_WR_CMD_ARG 6 |
112 | #define LPFC_QUE_ACC_BUF_SIZE 4096 |
113 | #define LPFC_QUE_ACC_SIZE (LPFC_QUE_ACC_BUF_SIZE/2) |
114 | |
115 | #define LPFC_IDIAG_EQ 1 |
116 | #define LPFC_IDIAG_CQ 2 |
117 | #define LPFC_IDIAG_MQ 3 |
118 | #define LPFC_IDIAG_WQ 4 |
119 | #define LPFC_IDIAG_RQ 5 |
120 | |
121 | #define IDIAG_QUEACC_QUETP_INDX 0 |
122 | #define IDIAG_QUEACC_QUEID_INDX 1 |
123 | #define IDIAG_QUEACC_INDEX_INDX 2 |
124 | #define IDIAG_QUEACC_COUNT_INDX 3 |
125 | #define IDIAG_QUEACC_OFFST_INDX 4 |
126 | #define IDIAG_QUEACC_VALUE_INDX 5 |
127 | |
128 | /* doorbell register acc */ |
129 | #define LPFC_DRB_ACC_ALL 0xffff |
130 | #define LPFC_DRB_ACC_RD_CMD_ARG 1 |
131 | #define LPFC_DRB_ACC_WR_CMD_ARG 2 |
132 | #define LPFC_DRB_ACC_BUF_SIZE 256 |
133 | |
134 | #define LPFC_DRB_EQ 1 |
135 | #define LPFC_DRB_CQ 2 |
136 | #define LPFC_DRB_MQ 3 |
137 | #define LPFC_DRB_WQ 4 |
138 | #define LPFC_DRB_RQ 5 |
139 | |
140 | #define LPFC_DRB_MAX 5 |
141 | |
142 | #define IDIAG_DRBACC_REGID_INDX 0 |
143 | #define IDIAG_DRBACC_VALUE_INDX 1 |
144 | |
145 | /* control register acc */ |
146 | #define LPFC_CTL_ACC_ALL 0xffff |
147 | #define LPFC_CTL_ACC_RD_CMD_ARG 1 |
148 | #define LPFC_CTL_ACC_WR_CMD_ARG 2 |
149 | #define LPFC_CTL_ACC_BUF_SIZE 256 |
150 | |
151 | #define LPFC_CTL_PORT_SEM 1 |
152 | #define LPFC_CTL_PORT_STA 2 |
153 | #define LPFC_CTL_PORT_CTL 3 |
154 | #define LPFC_CTL_PORT_ER1 4 |
155 | #define LPFC_CTL_PORT_ER2 5 |
156 | #define LPFC_CTL_PDEV_CTL 6 |
157 | |
158 | #define LPFC_CTL_MAX 6 |
159 | |
160 | #define IDIAG_CTLACC_REGID_INDX 0 |
161 | #define IDIAG_CTLACC_VALUE_INDX 1 |
162 | |
163 | /* mailbox access */ |
164 | #define LPFC_MBX_DMP_ARG 4 |
165 | |
166 | #define LPFC_MBX_ACC_BUF_SIZE 512 |
167 | #define LPFC_MBX_ACC_LBUF_SZ 128 |
168 | |
169 | #define LPFC_MBX_DMP_MBX_WORD 0x00000001 |
170 | #define LPFC_MBX_DMP_MBX_BYTE 0x00000002 |
171 | #define LPFC_MBX_DMP_MBX_ALL (LPFC_MBX_DMP_MBX_WORD | LPFC_MBX_DMP_MBX_BYTE) |
172 | |
173 | #define LPFC_BSG_DMP_MBX_RD_MBX 0x00000001 |
174 | #define LPFC_BSG_DMP_MBX_RD_BUF 0x00000002 |
175 | #define LPFC_BSG_DMP_MBX_WR_MBX 0x00000004 |
176 | #define LPFC_BSG_DMP_MBX_WR_BUF 0x00000008 |
177 | #define LPFC_BSG_DMP_MBX_ALL (LPFC_BSG_DMP_MBX_RD_MBX | \ |
178 | LPFC_BSG_DMP_MBX_RD_BUF | \ |
179 | LPFC_BSG_DMP_MBX_WR_MBX | \ |
180 | LPFC_BSG_DMP_MBX_WR_BUF) |
181 | |
182 | #define LPFC_MBX_DMP_ALL 0xffff |
183 | #define LPFC_MBX_ALL_CMD 0xff |
184 | |
185 | #define IDIAG_MBXACC_MBCMD_INDX 0 |
186 | #define IDIAG_MBXACC_DPMAP_INDX 1 |
187 | #define IDIAG_MBXACC_DPCNT_INDX 2 |
188 | #define IDIAG_MBXACC_WDCNT_INDX 3 |
189 | |
190 | /* extents access */ |
191 | #define LPFC_EXT_ACC_CMD_ARG 1 |
192 | #define LPFC_EXT_ACC_BUF_SIZE 4096 |
193 | |
194 | #define LPFC_EXT_ACC_AVAIL 0x1 |
195 | #define LPFC_EXT_ACC_ALLOC 0x2 |
196 | #define LPFC_EXT_ACC_DRIVR 0x4 |
197 | #define LPFC_EXT_ACC_ALL (LPFC_EXT_ACC_DRIVR | \ |
198 | LPFC_EXT_ACC_AVAIL | \ |
199 | LPFC_EXT_ACC_ALLOC) |
200 | |
201 | #define IDIAG_EXTACC_EXMAP_INDX 0 |
202 | |
203 | #define SIZE_U8 sizeof(uint8_t) |
204 | #define SIZE_U16 sizeof(uint16_t) |
205 | #define SIZE_U32 sizeof(uint32_t) |
206 | |
207 | #define lpfc_nvmeio_data(phba, fmt, arg...) \ |
208 | { \ |
209 | if (phba->nvmeio_trc_on) \ |
210 | lpfc_debugfs_nvme_trc(phba, fmt, ##arg); \ |
211 | } |
212 | |
213 | struct lpfc_debug { |
214 | char *i_private; |
215 | char op; |
216 | #define LPFC_IDIAG_OP_RD 1 |
217 | #define LPFC_IDIAG_OP_WR 2 |
218 | char *buffer; |
219 | int len; |
220 | }; |
221 | |
222 | struct lpfc_debugfs_trc { |
223 | char *fmt; |
224 | uint32_t data1; |
225 | uint32_t data2; |
226 | uint32_t data3; |
227 | uint32_t seq_cnt; |
228 | unsigned long jif; |
229 | }; |
230 | |
231 | struct lpfc_debugfs_nvmeio_trc { |
232 | char *fmt; |
233 | uint16_t data1; |
234 | uint16_t data2; |
235 | uint32_t data3; |
236 | }; |
237 | |
238 | struct lpfc_idiag_offset { |
239 | uint32_t last_rd; |
240 | }; |
241 | |
242 | #define LPFC_IDIAG_CMD_DATA_SIZE 8 |
243 | struct lpfc_idiag_cmd { |
244 | uint32_t opcode; |
245 | #define LPFC_IDIAG_CMD_PCICFG_RD 0x00000001 |
246 | #define LPFC_IDIAG_CMD_PCICFG_WR 0x00000002 |
247 | #define LPFC_IDIAG_CMD_PCICFG_ST 0x00000003 |
248 | #define LPFC_IDIAG_CMD_PCICFG_CL 0x00000004 |
249 | |
250 | #define LPFC_IDIAG_CMD_BARACC_RD 0x00000008 |
251 | #define LPFC_IDIAG_CMD_BARACC_WR 0x00000009 |
252 | #define LPFC_IDIAG_CMD_BARACC_ST 0x0000000a |
253 | #define LPFC_IDIAG_CMD_BARACC_CL 0x0000000b |
254 | |
255 | #define LPFC_IDIAG_CMD_QUEACC_RD 0x00000011 |
256 | #define LPFC_IDIAG_CMD_QUEACC_WR 0x00000012 |
257 | #define LPFC_IDIAG_CMD_QUEACC_ST 0x00000013 |
258 | #define LPFC_IDIAG_CMD_QUEACC_CL 0x00000014 |
259 | |
260 | #define LPFC_IDIAG_CMD_DRBACC_RD 0x00000021 |
261 | #define LPFC_IDIAG_CMD_DRBACC_WR 0x00000022 |
262 | #define LPFC_IDIAG_CMD_DRBACC_ST 0x00000023 |
263 | #define LPFC_IDIAG_CMD_DRBACC_CL 0x00000024 |
264 | |
265 | #define LPFC_IDIAG_CMD_CTLACC_RD 0x00000031 |
266 | #define LPFC_IDIAG_CMD_CTLACC_WR 0x00000032 |
267 | #define LPFC_IDIAG_CMD_CTLACC_ST 0x00000033 |
268 | #define LPFC_IDIAG_CMD_CTLACC_CL 0x00000034 |
269 | |
270 | #define LPFC_IDIAG_CMD_MBXACC_DP 0x00000041 |
271 | #define LPFC_IDIAG_BSG_MBXACC_DP 0x00000042 |
272 | |
273 | #define LPFC_IDIAG_CMD_EXTACC_RD 0x00000051 |
274 | |
275 | uint32_t data[LPFC_IDIAG_CMD_DATA_SIZE]; |
276 | }; |
277 | |
278 | struct lpfc_idiag { |
279 | uint32_t active; |
280 | struct lpfc_idiag_cmd cmd; |
281 | struct lpfc_idiag_offset offset; |
282 | void *ptr_private; |
283 | }; |
284 | |
285 | #define MAX_DEBUGFS_RX_INFO_SIZE (128 * LPFC_MAX_RXMONITOR_ENTRY) |
286 | struct lpfc_rx_monitor_debug { |
287 | char *i_private; |
288 | char *buffer; |
289 | }; |
290 | |
291 | #else |
292 | |
293 | #define lpfc_nvmeio_data(phba, fmt, arg...) \ |
294 | no_printk(fmt, ##arg) |
295 | |
296 | #endif |
297 | |
298 | /* multixripool output buffer size */ |
299 | #define LPFC_DUMP_MULTIXRIPOOL_SIZE 8192 |
300 | |
301 | enum { |
302 | DUMP_IO, |
303 | DUMP_MBX, |
304 | DUMP_ELS, |
305 | DUMP_NVMELS, |
306 | }; |
307 | |
308 | /* Mask for discovery_trace */ |
309 | #define LPFC_DISC_TRC_ELS_CMD 0x1 /* Trace ELS commands */ |
310 | #define LPFC_DISC_TRC_ELS_RSP 0x2 /* Trace ELS response */ |
311 | #define LPFC_DISC_TRC_ELS_UNSOL 0x4 /* Trace ELS rcv'ed */ |
312 | #define LPFC_DISC_TRC_ELS_ALL 0x7 /* Trace ELS */ |
313 | #define LPFC_DISC_TRC_MBOX_VPORT 0x8 /* Trace vport MBOXs */ |
314 | #define LPFC_DISC_TRC_MBOX 0x10 /* Trace other MBOXs */ |
315 | #define LPFC_DISC_TRC_MBOX_ALL 0x18 /* Trace all MBOXs */ |
316 | #define LPFC_DISC_TRC_CT 0x20 /* Trace disc CT requests */ |
317 | #define LPFC_DISC_TRC_DSM 0x40 /* Trace DSM events */ |
318 | #define LPFC_DISC_TRC_RPORT 0x80 /* Trace rport events */ |
319 | #define LPFC_DISC_TRC_NODE 0x100 /* Trace ndlp state changes */ |
320 | |
321 | #define LPFC_DISC_TRC_DISCOVERY 0xef /* common mask for general |
322 | * discovery */ |
323 | #endif /* H_LPFC_DEBUG_FS */ |
324 | |
325 | |
326 | /* |
327 | * Driver debug utility routines outside of debugfs. The debug utility |
328 | * routines implemented here is intended to be used in the instrumented |
329 | * debug driver for debugging host or port issues. |
330 | */ |
331 | |
332 | /** |
333 | * lpfc_debug_dump_qe - dump an specific entry from a queue |
334 | * @q: Pointer to the queue descriptor. |
335 | * @idx: Index to the entry on the queue. |
336 | * |
337 | * This function dumps an entry indexed by @idx from a queue specified by the |
338 | * queue descriptor @q. |
339 | **/ |
340 | static void |
341 | lpfc_debug_dump_qe(struct lpfc_queue *q, uint32_t idx) |
342 | { |
343 | char line_buf[LPFC_LBUF_SZ]; |
344 | int i, esize, qe_word_cnt, len; |
345 | uint32_t *pword; |
346 | |
347 | /* sanity checks */ |
348 | if (!q) |
349 | return; |
350 | if (idx >= q->entry_count) |
351 | return; |
352 | |
353 | esize = q->entry_size; |
354 | qe_word_cnt = esize / sizeof(uint32_t); |
355 | pword = lpfc_sli4_qe(q, idx); |
356 | |
357 | len = 0; |
358 | len += scnprintf(buf: line_buf+len, LPFC_LBUF_SZ-len, fmt: "QE[%04d]: " , idx); |
359 | if (qe_word_cnt > 8) |
360 | printk(KERN_ERR "%s\n" , line_buf); |
361 | |
362 | for (i = 0; i < qe_word_cnt; i++) { |
363 | if (!(i % 8)) { |
364 | if (i != 0) |
365 | printk(KERN_ERR "%s\n" , line_buf); |
366 | if (qe_word_cnt > 8) { |
367 | len = 0; |
368 | memset(line_buf, 0, LPFC_LBUF_SZ); |
369 | len += scnprintf(buf: line_buf+len, LPFC_LBUF_SZ-len, |
370 | fmt: "%03d: " , i); |
371 | } |
372 | } |
373 | len += scnprintf(buf: line_buf+len, LPFC_LBUF_SZ-len, fmt: "%08x " , |
374 | ((uint32_t)*pword) & 0xffffffff); |
375 | pword++; |
376 | } |
377 | if (qe_word_cnt <= 8 || (i - 1) % 8) |
378 | printk(KERN_ERR "%s\n" , line_buf); |
379 | } |
380 | |
381 | /** |
382 | * lpfc_debug_dump_q - dump all entries from an specific queue |
383 | * @q: Pointer to the queue descriptor. |
384 | * |
385 | * This function dumps all entries from a queue specified by the queue |
386 | * descriptor @q. |
387 | **/ |
388 | static inline void |
389 | lpfc_debug_dump_q(struct lpfc_queue *q) |
390 | { |
391 | int idx, entry_count; |
392 | |
393 | /* sanity check */ |
394 | if (!q) |
395 | return; |
396 | |
397 | dev_printk(KERN_ERR, &(((q->phba))->pcidev)->dev, |
398 | "%d: [qid:%d, type:%d, subtype:%d, " |
399 | "qe_size:%d, qe_count:%d, " |
400 | "host_index:%d, port_index:%d]\n" , |
401 | (q->phba)->brd_no, |
402 | q->queue_id, q->type, q->subtype, |
403 | q->entry_size, q->entry_count, |
404 | q->host_index, q->hba_index); |
405 | entry_count = q->entry_count; |
406 | for (idx = 0; idx < entry_count; idx++) |
407 | lpfc_debug_dump_qe(q, idx); |
408 | printk(KERN_ERR "\n" ); |
409 | } |
410 | |
411 | /** |
412 | * lpfc_debug_dump_wq - dump all entries from the fcp or nvme work queue |
413 | * @phba: Pointer to HBA context object. |
414 | * @wqidx: Index to a FCP or NVME work queue. |
415 | * |
416 | * This function dumps all entries from a FCP or NVME work queue specified |
417 | * by the wqidx. |
418 | **/ |
419 | static inline void |
420 | lpfc_debug_dump_wq(struct lpfc_hba *phba, int qtype, int wqidx) |
421 | { |
422 | struct lpfc_queue *wq; |
423 | char *qtypestr; |
424 | |
425 | if (qtype == DUMP_IO) { |
426 | wq = phba->sli4_hba.hdwq[wqidx].io_wq; |
427 | qtypestr = "IO" ; |
428 | } else if (qtype == DUMP_MBX) { |
429 | wq = phba->sli4_hba.mbx_wq; |
430 | qtypestr = "MBX" ; |
431 | } else if (qtype == DUMP_ELS) { |
432 | wq = phba->sli4_hba.els_wq; |
433 | qtypestr = "ELS" ; |
434 | } else if (qtype == DUMP_NVMELS) { |
435 | wq = phba->sli4_hba.nvmels_wq; |
436 | qtypestr = "NVMELS" ; |
437 | } else |
438 | return; |
439 | |
440 | if (qtype == DUMP_IO) |
441 | pr_err("%s WQ: WQ[Idx:%d|Qid:%d]\n" , |
442 | qtypestr, wqidx, wq->queue_id); |
443 | else |
444 | pr_err("%s WQ: WQ[Qid:%d]\n" , |
445 | qtypestr, wq->queue_id); |
446 | |
447 | lpfc_debug_dump_q(q: wq); |
448 | } |
449 | |
450 | /** |
451 | * lpfc_debug_dump_cq - dump all entries from a fcp or nvme work queue's |
452 | * cmpl queue |
453 | * @phba: Pointer to HBA context object. |
454 | * @wqidx: Index to a FCP work queue. |
455 | * |
456 | * This function dumps all entries from a FCP or NVME completion queue |
457 | * which is associated to the work queue specified by the @wqidx. |
458 | **/ |
459 | static inline void |
460 | lpfc_debug_dump_cq(struct lpfc_hba *phba, int qtype, int wqidx) |
461 | { |
462 | struct lpfc_queue *wq, *cq, *eq; |
463 | char *qtypestr; |
464 | int eqidx; |
465 | |
466 | /* io wq and cq are 1:1, thus same indexes */ |
467 | eq = NULL; |
468 | |
469 | if (qtype == DUMP_IO) { |
470 | wq = phba->sli4_hba.hdwq[wqidx].io_wq; |
471 | cq = phba->sli4_hba.hdwq[wqidx].io_cq; |
472 | qtypestr = "IO" ; |
473 | } else if (qtype == DUMP_MBX) { |
474 | wq = phba->sli4_hba.mbx_wq; |
475 | cq = phba->sli4_hba.mbx_cq; |
476 | qtypestr = "MBX" ; |
477 | } else if (qtype == DUMP_ELS) { |
478 | wq = phba->sli4_hba.els_wq; |
479 | cq = phba->sli4_hba.els_cq; |
480 | qtypestr = "ELS" ; |
481 | } else if (qtype == DUMP_NVMELS) { |
482 | wq = phba->sli4_hba.nvmels_wq; |
483 | cq = phba->sli4_hba.nvmels_cq; |
484 | qtypestr = "NVMELS" ; |
485 | } else |
486 | return; |
487 | |
488 | for (eqidx = 0; eqidx < phba->cfg_hdw_queue; eqidx++) { |
489 | eq = phba->sli4_hba.hdwq[eqidx].hba_eq; |
490 | if (cq->assoc_qid == eq->queue_id) |
491 | break; |
492 | } |
493 | if (eqidx == phba->cfg_hdw_queue) { |
494 | pr_err("Couldn't find EQ for CQ. Using EQ[0]\n" ); |
495 | eqidx = 0; |
496 | eq = phba->sli4_hba.hdwq[0].hba_eq; |
497 | } |
498 | |
499 | if (qtype == DUMP_IO) |
500 | pr_err("%s CQ: WQ[Idx:%d|Qid%d]->CQ[Idx%d|Qid%d]" |
501 | "->EQ[Idx:%d|Qid:%d]:\n" , |
502 | qtypestr, wqidx, wq->queue_id, wqidx, cq->queue_id, |
503 | eqidx, eq->queue_id); |
504 | else |
505 | pr_err("%s CQ: WQ[Qid:%d]->CQ[Qid:%d]" |
506 | "->EQ[Idx:%d|Qid:%d]:\n" , |
507 | qtypestr, wq->queue_id, cq->queue_id, |
508 | eqidx, eq->queue_id); |
509 | |
510 | lpfc_debug_dump_q(q: cq); |
511 | } |
512 | |
513 | /** |
514 | * lpfc_debug_dump_hba_eq - dump all entries from a fcp work queue's evt queue |
515 | * @phba: Pointer to HBA context object. |
516 | * @fcp_wqidx: Index to a FCP work queue. |
517 | * |
518 | * This function dumps all entries from a FCP event queue which is |
519 | * associated to the FCP work queue specified by the @fcp_wqidx. |
520 | **/ |
521 | static inline void |
522 | lpfc_debug_dump_hba_eq(struct lpfc_hba *phba, int qidx) |
523 | { |
524 | struct lpfc_queue *qp; |
525 | |
526 | qp = phba->sli4_hba.hdwq[qidx].hba_eq; |
527 | |
528 | pr_err("EQ[Idx:%d|Qid:%d]\n" , qidx, qp->queue_id); |
529 | |
530 | lpfc_debug_dump_q(q: qp); |
531 | } |
532 | |
533 | /** |
534 | * lpfc_debug_dump_dat_rq - dump all entries from the receive data queue |
535 | * @phba: Pointer to HBA context object. |
536 | * |
537 | * This function dumps all entries from the receive data queue. |
538 | **/ |
539 | static inline void |
540 | lpfc_debug_dump_dat_rq(struct lpfc_hba *phba) |
541 | { |
542 | printk(KERN_ERR "DAT RQ: RQ[Qid:%d]\n" , |
543 | phba->sli4_hba.dat_rq->queue_id); |
544 | lpfc_debug_dump_q(q: phba->sli4_hba.dat_rq); |
545 | } |
546 | |
547 | /** |
548 | * lpfc_debug_dump_hdr_rq - dump all entries from the receive header queue |
549 | * @phba: Pointer to HBA context object. |
550 | * |
551 | * This function dumps all entries from the receive header queue. |
552 | **/ |
553 | static inline void |
554 | lpfc_debug_dump_hdr_rq(struct lpfc_hba *phba) |
555 | { |
556 | printk(KERN_ERR "HDR RQ: RQ[Qid:%d]\n" , |
557 | phba->sli4_hba.hdr_rq->queue_id); |
558 | lpfc_debug_dump_q(q: phba->sli4_hba.hdr_rq); |
559 | } |
560 | |
561 | /** |
562 | * lpfc_debug_dump_wq_by_id - dump all entries from a work queue by queue id |
563 | * @phba: Pointer to HBA context object. |
564 | * @qid: Work queue identifier. |
565 | * |
566 | * This function dumps all entries from a work queue identified by the queue |
567 | * identifier. |
568 | **/ |
569 | static inline void |
570 | lpfc_debug_dump_wq_by_id(struct lpfc_hba *phba, int qid) |
571 | { |
572 | int wq_idx; |
573 | |
574 | for (wq_idx = 0; wq_idx < phba->cfg_hdw_queue; wq_idx++) |
575 | if (phba->sli4_hba.hdwq[wq_idx].io_wq->queue_id == qid) |
576 | break; |
577 | if (wq_idx < phba->cfg_hdw_queue) { |
578 | pr_err("IO WQ[Idx:%d|Qid:%d]\n" , wq_idx, qid); |
579 | lpfc_debug_dump_q(q: phba->sli4_hba.hdwq[wq_idx].io_wq); |
580 | return; |
581 | } |
582 | |
583 | if (phba->sli4_hba.els_wq->queue_id == qid) { |
584 | pr_err("ELS WQ[Qid:%d]\n" , qid); |
585 | lpfc_debug_dump_q(q: phba->sli4_hba.els_wq); |
586 | return; |
587 | } |
588 | |
589 | if (phba->sli4_hba.nvmels_wq->queue_id == qid) { |
590 | pr_err("NVME LS WQ[Qid:%d]\n" , qid); |
591 | lpfc_debug_dump_q(q: phba->sli4_hba.nvmels_wq); |
592 | } |
593 | } |
594 | |
595 | /** |
596 | * lpfc_debug_dump_mq_by_id - dump all entries from a mbox queue by queue id |
597 | * @phba: Pointer to HBA context object. |
598 | * @qid: Mbox work queue identifier. |
599 | * |
600 | * This function dumps all entries from a mbox work queue identified by the |
601 | * queue identifier. |
602 | **/ |
603 | static inline void |
604 | lpfc_debug_dump_mq_by_id(struct lpfc_hba *phba, int qid) |
605 | { |
606 | if (phba->sli4_hba.mbx_wq->queue_id == qid) { |
607 | printk(KERN_ERR "MBX WQ[Qid:%d]\n" , qid); |
608 | lpfc_debug_dump_q(q: phba->sli4_hba.mbx_wq); |
609 | } |
610 | } |
611 | |
612 | /** |
613 | * lpfc_debug_dump_rq_by_id - dump all entries from a receive queue by queue id |
614 | * @phba: Pointer to HBA context object. |
615 | * @qid: Receive queue identifier. |
616 | * |
617 | * This function dumps all entries from a receive queue identified by the |
618 | * queue identifier. |
619 | **/ |
620 | static inline void |
621 | lpfc_debug_dump_rq_by_id(struct lpfc_hba *phba, int qid) |
622 | { |
623 | if (phba->sli4_hba.hdr_rq->queue_id == qid) { |
624 | printk(KERN_ERR "HDR RQ[Qid:%d]\n" , qid); |
625 | lpfc_debug_dump_q(q: phba->sli4_hba.hdr_rq); |
626 | return; |
627 | } |
628 | if (phba->sli4_hba.dat_rq->queue_id == qid) { |
629 | printk(KERN_ERR "DAT RQ[Qid:%d]\n" , qid); |
630 | lpfc_debug_dump_q(q: phba->sli4_hba.dat_rq); |
631 | } |
632 | } |
633 | |
634 | /** |
635 | * lpfc_debug_dump_cq_by_id - dump all entries from a cmpl queue by queue id |
636 | * @phba: Pointer to HBA context object. |
637 | * @qid: Complete queue identifier. |
638 | * |
639 | * This function dumps all entries from a complete queue identified by the |
640 | * queue identifier. |
641 | **/ |
642 | static inline void |
643 | lpfc_debug_dump_cq_by_id(struct lpfc_hba *phba, int qid) |
644 | { |
645 | int cq_idx; |
646 | |
647 | for (cq_idx = 0; cq_idx < phba->cfg_hdw_queue; cq_idx++) |
648 | if (phba->sli4_hba.hdwq[cq_idx].io_cq->queue_id == qid) |
649 | break; |
650 | |
651 | if (cq_idx < phba->cfg_hdw_queue) { |
652 | pr_err("IO CQ[Idx:%d|Qid:%d]\n" , cq_idx, qid); |
653 | lpfc_debug_dump_q(q: phba->sli4_hba.hdwq[cq_idx].io_cq); |
654 | return; |
655 | } |
656 | |
657 | if (phba->sli4_hba.els_cq->queue_id == qid) { |
658 | pr_err("ELS CQ[Qid:%d]\n" , qid); |
659 | lpfc_debug_dump_q(q: phba->sli4_hba.els_cq); |
660 | return; |
661 | } |
662 | |
663 | if (phba->sli4_hba.nvmels_cq->queue_id == qid) { |
664 | pr_err("NVME LS CQ[Qid:%d]\n" , qid); |
665 | lpfc_debug_dump_q(q: phba->sli4_hba.nvmels_cq); |
666 | return; |
667 | } |
668 | |
669 | if (phba->sli4_hba.mbx_cq->queue_id == qid) { |
670 | pr_err("MBX CQ[Qid:%d]\n" , qid); |
671 | lpfc_debug_dump_q(q: phba->sli4_hba.mbx_cq); |
672 | } |
673 | } |
674 | |
675 | /** |
676 | * lpfc_debug_dump_eq_by_id - dump all entries from an event queue by queue id |
677 | * @phba: Pointer to HBA context object. |
678 | * @qid: Complete queue identifier. |
679 | * |
680 | * This function dumps all entries from an event queue identified by the |
681 | * queue identifier. |
682 | **/ |
683 | static inline void |
684 | lpfc_debug_dump_eq_by_id(struct lpfc_hba *phba, int qid) |
685 | { |
686 | int eq_idx; |
687 | |
688 | for (eq_idx = 0; eq_idx < phba->cfg_hdw_queue; eq_idx++) |
689 | if (phba->sli4_hba.hdwq[eq_idx].hba_eq->queue_id == qid) |
690 | break; |
691 | |
692 | if (eq_idx < phba->cfg_hdw_queue) { |
693 | printk(KERN_ERR "FCP EQ[Idx:%d|Qid:%d]\n" , eq_idx, qid); |
694 | lpfc_debug_dump_q(q: phba->sli4_hba.hdwq[eq_idx].hba_eq); |
695 | return; |
696 | } |
697 | } |
698 | |
699 | void lpfc_debug_dump_all_queues(struct lpfc_hba *); |
700 | |