lpfc_debugfs.h 19 KB

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