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