xref: /OK3568_Linux_fs/kernel/drivers/scsi/lpfc/lpfc_debugfs.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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