qla_dbg.c 32 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150
  1. /*
  2. * QLOGIC LINUX SOFTWARE
  3. *
  4. * QLogic ISP2x00 device driver for Linux 2.6.x
  5. * Copyright (C) 2003-2004 QLogic Corporation
  6. * (www.qlogic.com)
  7. *
  8. * This program is free software; you can redistribute it and/or modify it
  9. * under the terms of the GNU General Public License as published by the
  10. * Free Software Foundation; either version 2, or (at your option) any
  11. * later version.
  12. *
  13. * This program is distributed in the hope that it will be useful, but
  14. * WITHOUT ANY WARRANTY; without even the implied warranty of
  15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  16. * General Public License for more details.
  17. *
  18. */
  19. #include "qla_def.h"
  20. #include <linux/delay.h>
  21. static int qla_uprintf(char **, char *, ...);
  22. /**
  23. * qla2300_fw_dump() - Dumps binary data from the 2300 firmware.
  24. * @ha: HA context
  25. * @hardware_locked: Called with the hardware_lock
  26. */
  27. void
  28. qla2300_fw_dump(scsi_qla_host_t *ha, int hardware_locked)
  29. {
  30. int rval;
  31. uint32_t cnt, timer;
  32. uint32_t risc_address;
  33. uint16_t mb0, mb2;
  34. uint32_t stat;
  35. device_reg_t __iomem *reg = ha->iobase;
  36. uint16_t __iomem *dmp_reg;
  37. unsigned long flags;
  38. struct qla2300_fw_dump *fw;
  39. uint32_t dump_size, data_ram_cnt;
  40. risc_address = data_ram_cnt = 0;
  41. mb0 = mb2 = 0;
  42. flags = 0;
  43. if (!hardware_locked)
  44. spin_lock_irqsave(&ha->hardware_lock, flags);
  45. if (ha->fw_dump != NULL) {
  46. qla_printk(KERN_WARNING, ha,
  47. "Firmware has been previously dumped (%p) -- ignoring "
  48. "request...\n", ha->fw_dump);
  49. goto qla2300_fw_dump_failed;
  50. }
  51. /* Allocate (large) dump buffer. */
  52. dump_size = sizeof(struct qla2300_fw_dump);
  53. dump_size += (ha->fw_memory_size - 0x11000) * sizeof(uint16_t);
  54. ha->fw_dump_order = get_order(dump_size);
  55. ha->fw_dump = (struct qla2300_fw_dump *) __get_free_pages(GFP_ATOMIC,
  56. ha->fw_dump_order);
  57. if (ha->fw_dump == NULL) {
  58. qla_printk(KERN_WARNING, ha,
  59. "Unable to allocated memory for firmware dump (%d/%d).\n",
  60. ha->fw_dump_order, dump_size);
  61. goto qla2300_fw_dump_failed;
  62. }
  63. fw = ha->fw_dump;
  64. rval = QLA_SUCCESS;
  65. fw->hccr = RD_REG_WORD(&reg->hccr);
  66. /* Pause RISC. */
  67. WRT_REG_WORD(&reg->hccr, HCCR_PAUSE_RISC);
  68. if (IS_QLA2300(ha)) {
  69. for (cnt = 30000;
  70. (RD_REG_WORD(&reg->hccr) & HCCR_RISC_PAUSE) == 0 &&
  71. rval == QLA_SUCCESS; cnt--) {
  72. if (cnt)
  73. udelay(100);
  74. else
  75. rval = QLA_FUNCTION_TIMEOUT;
  76. }
  77. } else {
  78. RD_REG_WORD(&reg->hccr); /* PCI Posting. */
  79. udelay(10);
  80. }
  81. if (rval == QLA_SUCCESS) {
  82. dmp_reg = (uint16_t __iomem *)(reg + 0);
  83. for (cnt = 0; cnt < sizeof(fw->pbiu_reg) / 2; cnt++)
  84. fw->pbiu_reg[cnt] = RD_REG_WORD(dmp_reg++);
  85. dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x10);
  86. for (cnt = 0; cnt < sizeof(fw->risc_host_reg) / 2; cnt++)
  87. fw->risc_host_reg[cnt] = RD_REG_WORD(dmp_reg++);
  88. dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x40);
  89. for (cnt = 0; cnt < sizeof(fw->mailbox_reg) / 2; cnt++)
  90. fw->mailbox_reg[cnt] = RD_REG_WORD(dmp_reg++);
  91. WRT_REG_WORD(&reg->ctrl_status, 0x40);
  92. dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80);
  93. for (cnt = 0; cnt < sizeof(fw->resp_dma_reg) / 2; cnt++)
  94. fw->resp_dma_reg[cnt] = RD_REG_WORD(dmp_reg++);
  95. WRT_REG_WORD(&reg->ctrl_status, 0x50);
  96. dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80);
  97. for (cnt = 0; cnt < sizeof(fw->dma_reg) / 2; cnt++)
  98. fw->dma_reg[cnt] = RD_REG_WORD(dmp_reg++);
  99. WRT_REG_WORD(&reg->ctrl_status, 0x00);
  100. dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0xA0);
  101. for (cnt = 0; cnt < sizeof(fw->risc_hdw_reg) / 2; cnt++)
  102. fw->risc_hdw_reg[cnt] = RD_REG_WORD(dmp_reg++);
  103. WRT_REG_WORD(&reg->pcr, 0x2000);
  104. dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80);
  105. for (cnt = 0; cnt < sizeof(fw->risc_gp0_reg) / 2; cnt++)
  106. fw->risc_gp0_reg[cnt] = RD_REG_WORD(dmp_reg++);
  107. WRT_REG_WORD(&reg->pcr, 0x2200);
  108. dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80);
  109. for (cnt = 0; cnt < sizeof(fw->risc_gp1_reg) / 2; cnt++)
  110. fw->risc_gp1_reg[cnt] = RD_REG_WORD(dmp_reg++);
  111. WRT_REG_WORD(&reg->pcr, 0x2400);
  112. dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80);
  113. for (cnt = 0; cnt < sizeof(fw->risc_gp2_reg) / 2; cnt++)
  114. fw->risc_gp2_reg[cnt] = RD_REG_WORD(dmp_reg++);
  115. WRT_REG_WORD(&reg->pcr, 0x2600);
  116. dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80);
  117. for (cnt = 0; cnt < sizeof(fw->risc_gp3_reg) / 2; cnt++)
  118. fw->risc_gp3_reg[cnt] = RD_REG_WORD(dmp_reg++);
  119. WRT_REG_WORD(&reg->pcr, 0x2800);
  120. dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80);
  121. for (cnt = 0; cnt < sizeof(fw->risc_gp4_reg) / 2; cnt++)
  122. fw->risc_gp4_reg[cnt] = RD_REG_WORD(dmp_reg++);
  123. WRT_REG_WORD(&reg->pcr, 0x2A00);
  124. dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80);
  125. for (cnt = 0; cnt < sizeof(fw->risc_gp5_reg) / 2; cnt++)
  126. fw->risc_gp5_reg[cnt] = RD_REG_WORD(dmp_reg++);
  127. WRT_REG_WORD(&reg->pcr, 0x2C00);
  128. dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80);
  129. for (cnt = 0; cnt < sizeof(fw->risc_gp6_reg) / 2; cnt++)
  130. fw->risc_gp6_reg[cnt] = RD_REG_WORD(dmp_reg++);
  131. WRT_REG_WORD(&reg->pcr, 0x2E00);
  132. dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80);
  133. for (cnt = 0; cnt < sizeof(fw->risc_gp7_reg) / 2; cnt++)
  134. fw->risc_gp7_reg[cnt] = RD_REG_WORD(dmp_reg++);
  135. WRT_REG_WORD(&reg->ctrl_status, 0x10);
  136. dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80);
  137. for (cnt = 0; cnt < sizeof(fw->frame_buf_hdw_reg) / 2; cnt++)
  138. fw->frame_buf_hdw_reg[cnt] = RD_REG_WORD(dmp_reg++);
  139. WRT_REG_WORD(&reg->ctrl_status, 0x20);
  140. dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80);
  141. for (cnt = 0; cnt < sizeof(fw->fpm_b0_reg) / 2; cnt++)
  142. fw->fpm_b0_reg[cnt] = RD_REG_WORD(dmp_reg++);
  143. WRT_REG_WORD(&reg->ctrl_status, 0x30);
  144. dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80);
  145. for (cnt = 0; cnt < sizeof(fw->fpm_b1_reg) / 2; cnt++)
  146. fw->fpm_b1_reg[cnt] = RD_REG_WORD(dmp_reg++);
  147. /* Reset RISC. */
  148. WRT_REG_WORD(&reg->ctrl_status, CSR_ISP_SOFT_RESET);
  149. for (cnt = 0; cnt < 30000; cnt++) {
  150. if ((RD_REG_WORD(&reg->ctrl_status) &
  151. CSR_ISP_SOFT_RESET) == 0)
  152. break;
  153. udelay(10);
  154. }
  155. }
  156. if (!IS_QLA2300(ha)) {
  157. for (cnt = 30000; RD_MAILBOX_REG(ha, reg, 0) != 0 &&
  158. rval == QLA_SUCCESS; cnt--) {
  159. if (cnt)
  160. udelay(100);
  161. else
  162. rval = QLA_FUNCTION_TIMEOUT;
  163. }
  164. }
  165. if (rval == QLA_SUCCESS) {
  166. /* Get RISC SRAM. */
  167. risc_address = 0x800;
  168. WRT_MAILBOX_REG(ha, reg, 0, MBC_READ_RAM_WORD);
  169. clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);
  170. }
  171. for (cnt = 0; cnt < sizeof(fw->risc_ram) / 2 && rval == QLA_SUCCESS;
  172. cnt++, risc_address++) {
  173. WRT_MAILBOX_REG(ha, reg, 1, (uint16_t)risc_address);
  174. WRT_REG_WORD(&reg->hccr, HCCR_SET_HOST_INT);
  175. for (timer = 6000000; timer; timer--) {
  176. /* Check for pending interrupts. */
  177. stat = RD_REG_DWORD(&reg->u.isp2300.host_status);
  178. if (stat & HSR_RISC_INT) {
  179. stat &= 0xff;
  180. if (stat == 0x1 || stat == 0x2) {
  181. set_bit(MBX_INTERRUPT,
  182. &ha->mbx_cmd_flags);
  183. mb0 = RD_MAILBOX_REG(ha, reg, 0);
  184. mb2 = RD_MAILBOX_REG(ha, reg, 2);
  185. /* Release mailbox registers. */
  186. WRT_REG_WORD(&reg->semaphore, 0);
  187. WRT_REG_WORD(&reg->hccr,
  188. HCCR_CLR_RISC_INT);
  189. RD_REG_WORD(&reg->hccr);
  190. break;
  191. } else if (stat == 0x10 || stat == 0x11) {
  192. set_bit(MBX_INTERRUPT,
  193. &ha->mbx_cmd_flags);
  194. mb0 = RD_MAILBOX_REG(ha, reg, 0);
  195. mb2 = RD_MAILBOX_REG(ha, reg, 2);
  196. WRT_REG_WORD(&reg->hccr,
  197. HCCR_CLR_RISC_INT);
  198. RD_REG_WORD(&reg->hccr);
  199. break;
  200. }
  201. /* clear this intr; it wasn't a mailbox intr */
  202. WRT_REG_WORD(&reg->hccr, HCCR_CLR_RISC_INT);
  203. RD_REG_WORD(&reg->hccr);
  204. }
  205. udelay(5);
  206. }
  207. if (test_and_clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags)) {
  208. rval = mb0 & MBS_MASK;
  209. fw->risc_ram[cnt] = mb2;
  210. } else {
  211. rval = QLA_FUNCTION_FAILED;
  212. }
  213. }
  214. if (rval == QLA_SUCCESS) {
  215. /* Get stack SRAM. */
  216. risc_address = 0x10000;
  217. WRT_MAILBOX_REG(ha, reg, 0, MBC_READ_RAM_EXTENDED);
  218. clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);
  219. }
  220. for (cnt = 0; cnt < sizeof(fw->stack_ram) / 2 && rval == QLA_SUCCESS;
  221. cnt++, risc_address++) {
  222. WRT_MAILBOX_REG(ha, reg, 1, LSW(risc_address));
  223. WRT_MAILBOX_REG(ha, reg, 8, MSW(risc_address));
  224. WRT_REG_WORD(&reg->hccr, HCCR_SET_HOST_INT);
  225. for (timer = 6000000; timer; timer--) {
  226. /* Check for pending interrupts. */
  227. stat = RD_REG_DWORD(&reg->u.isp2300.host_status);
  228. if (stat & HSR_RISC_INT) {
  229. stat &= 0xff;
  230. if (stat == 0x1 || stat == 0x2) {
  231. set_bit(MBX_INTERRUPT,
  232. &ha->mbx_cmd_flags);
  233. mb0 = RD_MAILBOX_REG(ha, reg, 0);
  234. mb2 = RD_MAILBOX_REG(ha, reg, 2);
  235. /* Release mailbox registers. */
  236. WRT_REG_WORD(&reg->semaphore, 0);
  237. WRT_REG_WORD(&reg->hccr,
  238. HCCR_CLR_RISC_INT);
  239. RD_REG_WORD(&reg->hccr);
  240. break;
  241. } else if (stat == 0x10 || stat == 0x11) {
  242. set_bit(MBX_INTERRUPT,
  243. &ha->mbx_cmd_flags);
  244. mb0 = RD_MAILBOX_REG(ha, reg, 0);
  245. mb2 = RD_MAILBOX_REG(ha, reg, 2);
  246. WRT_REG_WORD(&reg->hccr,
  247. HCCR_CLR_RISC_INT);
  248. RD_REG_WORD(&reg->hccr);
  249. break;
  250. }
  251. /* clear this intr; it wasn't a mailbox intr */
  252. WRT_REG_WORD(&reg->hccr, HCCR_CLR_RISC_INT);
  253. RD_REG_WORD(&reg->hccr);
  254. }
  255. udelay(5);
  256. }
  257. if (test_and_clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags)) {
  258. rval = mb0 & MBS_MASK;
  259. fw->stack_ram[cnt] = mb2;
  260. } else {
  261. rval = QLA_FUNCTION_FAILED;
  262. }
  263. }
  264. if (rval == QLA_SUCCESS) {
  265. /* Get data SRAM. */
  266. risc_address = 0x11000;
  267. data_ram_cnt = ha->fw_memory_size - risc_address + 1;
  268. WRT_MAILBOX_REG(ha, reg, 0, MBC_READ_RAM_EXTENDED);
  269. clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);
  270. }
  271. for (cnt = 0; cnt < data_ram_cnt && rval == QLA_SUCCESS;
  272. cnt++, risc_address++) {
  273. WRT_MAILBOX_REG(ha, reg, 1, LSW(risc_address));
  274. WRT_MAILBOX_REG(ha, reg, 8, MSW(risc_address));
  275. WRT_REG_WORD(&reg->hccr, HCCR_SET_HOST_INT);
  276. for (timer = 6000000; timer; timer--) {
  277. /* Check for pending interrupts. */
  278. stat = RD_REG_DWORD(&reg->u.isp2300.host_status);
  279. if (stat & HSR_RISC_INT) {
  280. stat &= 0xff;
  281. if (stat == 0x1 || stat == 0x2) {
  282. set_bit(MBX_INTERRUPT,
  283. &ha->mbx_cmd_flags);
  284. mb0 = RD_MAILBOX_REG(ha, reg, 0);
  285. mb2 = RD_MAILBOX_REG(ha, reg, 2);
  286. /* Release mailbox registers. */
  287. WRT_REG_WORD(&reg->semaphore, 0);
  288. WRT_REG_WORD(&reg->hccr,
  289. HCCR_CLR_RISC_INT);
  290. RD_REG_WORD(&reg->hccr);
  291. break;
  292. } else if (stat == 0x10 || stat == 0x11) {
  293. set_bit(MBX_INTERRUPT,
  294. &ha->mbx_cmd_flags);
  295. mb0 = RD_MAILBOX_REG(ha, reg, 0);
  296. mb2 = RD_MAILBOX_REG(ha, reg, 2);
  297. WRT_REG_WORD(&reg->hccr,
  298. HCCR_CLR_RISC_INT);
  299. RD_REG_WORD(&reg->hccr);
  300. break;
  301. }
  302. /* clear this intr; it wasn't a mailbox intr */
  303. WRT_REG_WORD(&reg->hccr, HCCR_CLR_RISC_INT);
  304. RD_REG_WORD(&reg->hccr);
  305. }
  306. udelay(5);
  307. }
  308. if (test_and_clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags)) {
  309. rval = mb0 & MBS_MASK;
  310. fw->data_ram[cnt] = mb2;
  311. } else {
  312. rval = QLA_FUNCTION_FAILED;
  313. }
  314. }
  315. if (rval != QLA_SUCCESS) {
  316. qla_printk(KERN_WARNING, ha,
  317. "Failed to dump firmware (%x)!!!\n", rval);
  318. free_pages((unsigned long)ha->fw_dump, ha->fw_dump_order);
  319. ha->fw_dump = NULL;
  320. } else {
  321. qla_printk(KERN_INFO, ha,
  322. "Firmware dump saved to temp buffer (%ld/%p).\n",
  323. ha->host_no, ha->fw_dump);
  324. }
  325. qla2300_fw_dump_failed:
  326. if (!hardware_locked)
  327. spin_unlock_irqrestore(&ha->hardware_lock, flags);
  328. }
  329. /**
  330. * qla2300_ascii_fw_dump() - Converts a binary firmware dump to ASCII.
  331. * @ha: HA context
  332. */
  333. void
  334. qla2300_ascii_fw_dump(scsi_qla_host_t *ha)
  335. {
  336. uint32_t cnt;
  337. char *uiter;
  338. char fw_info[30];
  339. struct qla2300_fw_dump *fw;
  340. uint32_t data_ram_cnt;
  341. uiter = ha->fw_dump_buffer;
  342. fw = ha->fw_dump;
  343. qla_uprintf(&uiter, "%s Firmware Version %s\n", ha->model_number,
  344. qla2x00_get_fw_version_str(ha, fw_info));
  345. qla_uprintf(&uiter, "\n[==>BEG]\n");
  346. qla_uprintf(&uiter, "HCCR Register:\n%04x\n\n", fw->hccr);
  347. qla_uprintf(&uiter, "PBIU Registers:");
  348. for (cnt = 0; cnt < sizeof (fw->pbiu_reg) / 2; cnt++) {
  349. if (cnt % 8 == 0) {
  350. qla_uprintf(&uiter, "\n");
  351. }
  352. qla_uprintf(&uiter, "%04x ", fw->pbiu_reg[cnt]);
  353. }
  354. qla_uprintf(&uiter, "\n\nReqQ-RspQ-Risc2Host Status registers:");
  355. for (cnt = 0; cnt < sizeof (fw->risc_host_reg) / 2; cnt++) {
  356. if (cnt % 8 == 0) {
  357. qla_uprintf(&uiter, "\n");
  358. }
  359. qla_uprintf(&uiter, "%04x ", fw->risc_host_reg[cnt]);
  360. }
  361. qla_uprintf(&uiter, "\n\nMailbox Registers:");
  362. for (cnt = 0; cnt < sizeof (fw->mailbox_reg) / 2; cnt++) {
  363. if (cnt % 8 == 0) {
  364. qla_uprintf(&uiter, "\n");
  365. }
  366. qla_uprintf(&uiter, "%04x ", fw->mailbox_reg[cnt]);
  367. }
  368. qla_uprintf(&uiter, "\n\nAuto Request Response DMA Registers:");
  369. for (cnt = 0; cnt < sizeof (fw->resp_dma_reg) / 2; cnt++) {
  370. if (cnt % 8 == 0) {
  371. qla_uprintf(&uiter, "\n");
  372. }
  373. qla_uprintf(&uiter, "%04x ", fw->resp_dma_reg[cnt]);
  374. }
  375. qla_uprintf(&uiter, "\n\nDMA Registers:");
  376. for (cnt = 0; cnt < sizeof (fw->dma_reg) / 2; cnt++) {
  377. if (cnt % 8 == 0) {
  378. qla_uprintf(&uiter, "\n");
  379. }
  380. qla_uprintf(&uiter, "%04x ", fw->dma_reg[cnt]);
  381. }
  382. qla_uprintf(&uiter, "\n\nRISC Hardware Registers:");
  383. for (cnt = 0; cnt < sizeof (fw->risc_hdw_reg) / 2; cnt++) {
  384. if (cnt % 8 == 0) {
  385. qla_uprintf(&uiter, "\n");
  386. }
  387. qla_uprintf(&uiter, "%04x ", fw->risc_hdw_reg[cnt]);
  388. }
  389. qla_uprintf(&uiter, "\n\nRISC GP0 Registers:");
  390. for (cnt = 0; cnt < sizeof (fw->risc_gp0_reg) / 2; cnt++) {
  391. if (cnt % 8 == 0) {
  392. qla_uprintf(&uiter, "\n");
  393. }
  394. qla_uprintf(&uiter, "%04x ", fw->risc_gp0_reg[cnt]);
  395. }
  396. qla_uprintf(&uiter, "\n\nRISC GP1 Registers:");
  397. for (cnt = 0; cnt < sizeof (fw->risc_gp1_reg) / 2; cnt++) {
  398. if (cnt % 8 == 0) {
  399. qla_uprintf(&uiter, "\n");
  400. }
  401. qla_uprintf(&uiter, "%04x ", fw->risc_gp1_reg[cnt]);
  402. }
  403. qla_uprintf(&uiter, "\n\nRISC GP2 Registers:");
  404. for (cnt = 0; cnt < sizeof (fw->risc_gp2_reg) / 2; cnt++) {
  405. if (cnt % 8 == 0) {
  406. qla_uprintf(&uiter, "\n");
  407. }
  408. qla_uprintf(&uiter, "%04x ", fw->risc_gp2_reg[cnt]);
  409. }
  410. qla_uprintf(&uiter, "\n\nRISC GP3 Registers:");
  411. for (cnt = 0; cnt < sizeof (fw->risc_gp3_reg) / 2; cnt++) {
  412. if (cnt % 8 == 0) {
  413. qla_uprintf(&uiter, "\n");
  414. }
  415. qla_uprintf(&uiter, "%04x ", fw->risc_gp3_reg[cnt]);
  416. }
  417. qla_uprintf(&uiter, "\n\nRISC GP4 Registers:");
  418. for (cnt = 0; cnt < sizeof (fw->risc_gp4_reg) / 2; cnt++) {
  419. if (cnt % 8 == 0) {
  420. qla_uprintf(&uiter, "\n");
  421. }
  422. qla_uprintf(&uiter, "%04x ", fw->risc_gp4_reg[cnt]);
  423. }
  424. qla_uprintf(&uiter, "\n\nRISC GP5 Registers:");
  425. for (cnt = 0; cnt < sizeof (fw->risc_gp5_reg) / 2; cnt++) {
  426. if (cnt % 8 == 0) {
  427. qla_uprintf(&uiter, "\n");
  428. }
  429. qla_uprintf(&uiter, "%04x ", fw->risc_gp5_reg[cnt]);
  430. }
  431. qla_uprintf(&uiter, "\n\nRISC GP6 Registers:");
  432. for (cnt = 0; cnt < sizeof (fw->risc_gp6_reg) / 2; cnt++) {
  433. if (cnt % 8 == 0) {
  434. qla_uprintf(&uiter, "\n");
  435. }
  436. qla_uprintf(&uiter, "%04x ", fw->risc_gp6_reg[cnt]);
  437. }
  438. qla_uprintf(&uiter, "\n\nRISC GP7 Registers:");
  439. for (cnt = 0; cnt < sizeof (fw->risc_gp7_reg) / 2; cnt++) {
  440. if (cnt % 8 == 0) {
  441. qla_uprintf(&uiter, "\n");
  442. }
  443. qla_uprintf(&uiter, "%04x ", fw->risc_gp7_reg[cnt]);
  444. }
  445. qla_uprintf(&uiter, "\n\nFrame Buffer Hardware Registers:");
  446. for (cnt = 0; cnt < sizeof (fw->frame_buf_hdw_reg) / 2; cnt++) {
  447. if (cnt % 8 == 0) {
  448. qla_uprintf(&uiter, "\n");
  449. }
  450. qla_uprintf(&uiter, "%04x ", fw->frame_buf_hdw_reg[cnt]);
  451. }
  452. qla_uprintf(&uiter, "\n\nFPM B0 Registers:");
  453. for (cnt = 0; cnt < sizeof (fw->fpm_b0_reg) / 2; cnt++) {
  454. if (cnt % 8 == 0) {
  455. qla_uprintf(&uiter, "\n");
  456. }
  457. qla_uprintf(&uiter, "%04x ", fw->fpm_b0_reg[cnt]);
  458. }
  459. qla_uprintf(&uiter, "\n\nFPM B1 Registers:");
  460. for (cnt = 0; cnt < sizeof (fw->fpm_b1_reg) / 2; cnt++) {
  461. if (cnt % 8 == 0) {
  462. qla_uprintf(&uiter, "\n");
  463. }
  464. qla_uprintf(&uiter, "%04x ", fw->fpm_b1_reg[cnt]);
  465. }
  466. qla_uprintf(&uiter, "\n\nCode RAM Dump:");
  467. for (cnt = 0; cnt < sizeof (fw->risc_ram) / 2; cnt++) {
  468. if (cnt % 8 == 0) {
  469. qla_uprintf(&uiter, "\n%04x: ", cnt + 0x0800);
  470. }
  471. qla_uprintf(&uiter, "%04x ", fw->risc_ram[cnt]);
  472. }
  473. qla_uprintf(&uiter, "\n\nStack RAM Dump:");
  474. for (cnt = 0; cnt < sizeof (fw->stack_ram) / 2; cnt++) {
  475. if (cnt % 8 == 0) {
  476. qla_uprintf(&uiter, "\n%05x: ", cnt + 0x10000);
  477. }
  478. qla_uprintf(&uiter, "%04x ", fw->stack_ram[cnt]);
  479. }
  480. qla_uprintf(&uiter, "\n\nData RAM Dump:");
  481. data_ram_cnt = ha->fw_memory_size - 0x11000 + 1;
  482. for (cnt = 0; cnt < data_ram_cnt; cnt++) {
  483. if (cnt % 8 == 0) {
  484. qla_uprintf(&uiter, "\n%05x: ", cnt + 0x11000);
  485. }
  486. qla_uprintf(&uiter, "%04x ", fw->data_ram[cnt]);
  487. }
  488. qla_uprintf(&uiter, "\n\n[<==END] ISP Debug Dump.");
  489. }
  490. /**
  491. * qla2100_fw_dump() - Dumps binary data from the 2100/2200 firmware.
  492. * @ha: HA context
  493. * @hardware_locked: Called with the hardware_lock
  494. */
  495. void
  496. qla2100_fw_dump(scsi_qla_host_t *ha, int hardware_locked)
  497. {
  498. int rval;
  499. uint32_t cnt, timer;
  500. uint16_t risc_address;
  501. uint16_t mb0, mb2;
  502. device_reg_t __iomem *reg = ha->iobase;
  503. uint16_t __iomem *dmp_reg;
  504. unsigned long flags;
  505. struct qla2100_fw_dump *fw;
  506. risc_address = 0;
  507. mb0 = mb2 = 0;
  508. flags = 0;
  509. if (!hardware_locked)
  510. spin_lock_irqsave(&ha->hardware_lock, flags);
  511. if (ha->fw_dump != NULL) {
  512. qla_printk(KERN_WARNING, ha,
  513. "Firmware has been previously dumped (%p) -- ignoring "
  514. "request...\n", ha->fw_dump);
  515. goto qla2100_fw_dump_failed;
  516. }
  517. /* Allocate (large) dump buffer. */
  518. ha->fw_dump_order = get_order(sizeof(struct qla2100_fw_dump));
  519. ha->fw_dump = (struct qla2100_fw_dump *) __get_free_pages(GFP_ATOMIC,
  520. ha->fw_dump_order);
  521. if (ha->fw_dump == NULL) {
  522. qla_printk(KERN_WARNING, ha,
  523. "Unable to allocated memory for firmware dump (%d/%Zd).\n",
  524. ha->fw_dump_order, sizeof(struct qla2100_fw_dump));
  525. goto qla2100_fw_dump_failed;
  526. }
  527. fw = ha->fw_dump;
  528. rval = QLA_SUCCESS;
  529. fw->hccr = RD_REG_WORD(&reg->hccr);
  530. /* Pause RISC. */
  531. WRT_REG_WORD(&reg->hccr, HCCR_PAUSE_RISC);
  532. for (cnt = 30000; (RD_REG_WORD(&reg->hccr) & HCCR_RISC_PAUSE) == 0 &&
  533. rval == QLA_SUCCESS; cnt--) {
  534. if (cnt)
  535. udelay(100);
  536. else
  537. rval = QLA_FUNCTION_TIMEOUT;
  538. }
  539. if (rval == QLA_SUCCESS) {
  540. dmp_reg = (uint16_t __iomem *)(reg + 0);
  541. for (cnt = 0; cnt < sizeof(fw->pbiu_reg) / 2; cnt++)
  542. fw->pbiu_reg[cnt] = RD_REG_WORD(dmp_reg++);
  543. dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x10);
  544. for (cnt = 0; cnt < ha->mbx_count; cnt++) {
  545. if (cnt == 8) {
  546. dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0xe0);
  547. }
  548. fw->mailbox_reg[cnt] = RD_REG_WORD(dmp_reg++);
  549. }
  550. dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x20);
  551. for (cnt = 0; cnt < sizeof(fw->dma_reg) / 2; cnt++)
  552. fw->dma_reg[cnt] = RD_REG_WORD(dmp_reg++);
  553. WRT_REG_WORD(&reg->ctrl_status, 0x00);
  554. dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0xA0);
  555. for (cnt = 0; cnt < sizeof(fw->risc_hdw_reg) / 2; cnt++)
  556. fw->risc_hdw_reg[cnt] = RD_REG_WORD(dmp_reg++);
  557. WRT_REG_WORD(&reg->pcr, 0x2000);
  558. dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80);
  559. for (cnt = 0; cnt < sizeof(fw->risc_gp0_reg) / 2; cnt++)
  560. fw->risc_gp0_reg[cnt] = RD_REG_WORD(dmp_reg++);
  561. WRT_REG_WORD(&reg->pcr, 0x2100);
  562. dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80);
  563. for (cnt = 0; cnt < sizeof(fw->risc_gp1_reg) / 2; cnt++)
  564. fw->risc_gp1_reg[cnt] = RD_REG_WORD(dmp_reg++);
  565. WRT_REG_WORD(&reg->pcr, 0x2200);
  566. dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80);
  567. for (cnt = 0; cnt < sizeof(fw->risc_gp2_reg) / 2; cnt++)
  568. fw->risc_gp2_reg[cnt] = RD_REG_WORD(dmp_reg++);
  569. WRT_REG_WORD(&reg->pcr, 0x2300);
  570. dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80);
  571. for (cnt = 0; cnt < sizeof(fw->risc_gp3_reg) / 2; cnt++)
  572. fw->risc_gp3_reg[cnt] = RD_REG_WORD(dmp_reg++);
  573. WRT_REG_WORD(&reg->pcr, 0x2400);
  574. dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80);
  575. for (cnt = 0; cnt < sizeof(fw->risc_gp4_reg) / 2; cnt++)
  576. fw->risc_gp4_reg[cnt] = RD_REG_WORD(dmp_reg++);
  577. WRT_REG_WORD(&reg->pcr, 0x2500);
  578. dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80);
  579. for (cnt = 0; cnt < sizeof(fw->risc_gp5_reg) / 2; cnt++)
  580. fw->risc_gp5_reg[cnt] = RD_REG_WORD(dmp_reg++);
  581. WRT_REG_WORD(&reg->pcr, 0x2600);
  582. dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80);
  583. for (cnt = 0; cnt < sizeof(fw->risc_gp6_reg) / 2; cnt++)
  584. fw->risc_gp6_reg[cnt] = RD_REG_WORD(dmp_reg++);
  585. WRT_REG_WORD(&reg->pcr, 0x2700);
  586. dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80);
  587. for (cnt = 0; cnt < sizeof(fw->risc_gp7_reg) / 2; cnt++)
  588. fw->risc_gp7_reg[cnt] = RD_REG_WORD(dmp_reg++);
  589. WRT_REG_WORD(&reg->ctrl_status, 0x10);
  590. dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80);
  591. for (cnt = 0; cnt < sizeof(fw->frame_buf_hdw_reg) / 2; cnt++)
  592. fw->frame_buf_hdw_reg[cnt] = RD_REG_WORD(dmp_reg++);
  593. WRT_REG_WORD(&reg->ctrl_status, 0x20);
  594. dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80);
  595. for (cnt = 0; cnt < sizeof(fw->fpm_b0_reg) / 2; cnt++)
  596. fw->fpm_b0_reg[cnt] = RD_REG_WORD(dmp_reg++);
  597. WRT_REG_WORD(&reg->ctrl_status, 0x30);
  598. dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80);
  599. for (cnt = 0; cnt < sizeof(fw->fpm_b1_reg) / 2; cnt++)
  600. fw->fpm_b1_reg[cnt] = RD_REG_WORD(dmp_reg++);
  601. /* Reset the ISP. */
  602. WRT_REG_WORD(&reg->ctrl_status, CSR_ISP_SOFT_RESET);
  603. }
  604. for (cnt = 30000; RD_MAILBOX_REG(ha, reg, 0) != 0 &&
  605. rval == QLA_SUCCESS; cnt--) {
  606. if (cnt)
  607. udelay(100);
  608. else
  609. rval = QLA_FUNCTION_TIMEOUT;
  610. }
  611. /* Pause RISC. */
  612. if (rval == QLA_SUCCESS && (IS_QLA2200(ha) || (IS_QLA2100(ha) &&
  613. (RD_REG_WORD(&reg->mctr) & (BIT_1 | BIT_0)) != 0))) {
  614. WRT_REG_WORD(&reg->hccr, HCCR_PAUSE_RISC);
  615. for (cnt = 30000;
  616. (RD_REG_WORD(&reg->hccr) & HCCR_RISC_PAUSE) == 0 &&
  617. rval == QLA_SUCCESS; cnt--) {
  618. if (cnt)
  619. udelay(100);
  620. else
  621. rval = QLA_FUNCTION_TIMEOUT;
  622. }
  623. if (rval == QLA_SUCCESS) {
  624. /* Set memory configuration and timing. */
  625. if (IS_QLA2100(ha))
  626. WRT_REG_WORD(&reg->mctr, 0xf1);
  627. else
  628. WRT_REG_WORD(&reg->mctr, 0xf2);
  629. RD_REG_WORD(&reg->mctr); /* PCI Posting. */
  630. /* Release RISC. */
  631. WRT_REG_WORD(&reg->hccr, HCCR_RELEASE_RISC);
  632. }
  633. }
  634. if (rval == QLA_SUCCESS) {
  635. /* Get RISC SRAM. */
  636. risc_address = 0x1000;
  637. WRT_MAILBOX_REG(ha, reg, 0, MBC_READ_RAM_WORD);
  638. clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);
  639. }
  640. for (cnt = 0; cnt < sizeof(fw->risc_ram) / 2 && rval == QLA_SUCCESS;
  641. cnt++, risc_address++) {
  642. WRT_MAILBOX_REG(ha, reg, 1, risc_address);
  643. WRT_REG_WORD(&reg->hccr, HCCR_SET_HOST_INT);
  644. for (timer = 6000000; timer != 0; timer--) {
  645. /* Check for pending interrupts. */
  646. if (RD_REG_WORD(&reg->istatus) & ISR_RISC_INT) {
  647. if (RD_REG_WORD(&reg->semaphore) & BIT_0) {
  648. set_bit(MBX_INTERRUPT,
  649. &ha->mbx_cmd_flags);
  650. mb0 = RD_MAILBOX_REG(ha, reg, 0);
  651. mb2 = RD_MAILBOX_REG(ha, reg, 2);
  652. WRT_REG_WORD(&reg->semaphore, 0);
  653. WRT_REG_WORD(&reg->hccr,
  654. HCCR_CLR_RISC_INT);
  655. RD_REG_WORD(&reg->hccr);
  656. break;
  657. }
  658. WRT_REG_WORD(&reg->hccr, HCCR_CLR_RISC_INT);
  659. RD_REG_WORD(&reg->hccr);
  660. }
  661. udelay(5);
  662. }
  663. if (test_and_clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags)) {
  664. rval = mb0 & MBS_MASK;
  665. fw->risc_ram[cnt] = mb2;
  666. } else {
  667. rval = QLA_FUNCTION_FAILED;
  668. }
  669. }
  670. if (rval != QLA_SUCCESS) {
  671. qla_printk(KERN_WARNING, ha,
  672. "Failed to dump firmware (%x)!!!\n", rval);
  673. free_pages((unsigned long)ha->fw_dump, ha->fw_dump_order);
  674. ha->fw_dump = NULL;
  675. } else {
  676. qla_printk(KERN_INFO, ha,
  677. "Firmware dump saved to temp buffer (%ld/%p).\n",
  678. ha->host_no, ha->fw_dump);
  679. }
  680. qla2100_fw_dump_failed:
  681. if (!hardware_locked)
  682. spin_unlock_irqrestore(&ha->hardware_lock, flags);
  683. }
  684. /**
  685. * qla2100_ascii_fw_dump() - Converts a binary firmware dump to ASCII.
  686. * @ha: HA context
  687. */
  688. void
  689. qla2100_ascii_fw_dump(scsi_qla_host_t *ha)
  690. {
  691. uint32_t cnt;
  692. char *uiter;
  693. char fw_info[30];
  694. struct qla2100_fw_dump *fw;
  695. uiter = ha->fw_dump_buffer;
  696. fw = ha->fw_dump;
  697. qla_uprintf(&uiter, "%s Firmware Version %s\n", ha->model_number,
  698. qla2x00_get_fw_version_str(ha, fw_info));
  699. qla_uprintf(&uiter, "\n[==>BEG]\n");
  700. qla_uprintf(&uiter, "HCCR Register:\n%04x\n\n", fw->hccr);
  701. qla_uprintf(&uiter, "PBIU Registers:");
  702. for (cnt = 0; cnt < sizeof (fw->pbiu_reg) / 2; cnt++) {
  703. if (cnt % 8 == 0) {
  704. qla_uprintf(&uiter, "\n");
  705. }
  706. qla_uprintf(&uiter, "%04x ", fw->pbiu_reg[cnt]);
  707. }
  708. qla_uprintf(&uiter, "\n\nMailbox Registers:");
  709. for (cnt = 0; cnt < sizeof (fw->mailbox_reg) / 2; cnt++) {
  710. if (cnt % 8 == 0) {
  711. qla_uprintf(&uiter, "\n");
  712. }
  713. qla_uprintf(&uiter, "%04x ", fw->mailbox_reg[cnt]);
  714. }
  715. qla_uprintf(&uiter, "\n\nDMA Registers:");
  716. for (cnt = 0; cnt < sizeof (fw->dma_reg) / 2; cnt++) {
  717. if (cnt % 8 == 0) {
  718. qla_uprintf(&uiter, "\n");
  719. }
  720. qla_uprintf(&uiter, "%04x ", fw->dma_reg[cnt]);
  721. }
  722. qla_uprintf(&uiter, "\n\nRISC Hardware Registers:");
  723. for (cnt = 0; cnt < sizeof (fw->risc_hdw_reg) / 2; cnt++) {
  724. if (cnt % 8 == 0) {
  725. qla_uprintf(&uiter, "\n");
  726. }
  727. qla_uprintf(&uiter, "%04x ", fw->risc_hdw_reg[cnt]);
  728. }
  729. qla_uprintf(&uiter, "\n\nRISC GP0 Registers:");
  730. for (cnt = 0; cnt < sizeof (fw->risc_gp0_reg) / 2; cnt++) {
  731. if (cnt % 8 == 0) {
  732. qla_uprintf(&uiter, "\n");
  733. }
  734. qla_uprintf(&uiter, "%04x ", fw->risc_gp0_reg[cnt]);
  735. }
  736. qla_uprintf(&uiter, "\n\nRISC GP1 Registers:");
  737. for (cnt = 0; cnt < sizeof (fw->risc_gp1_reg) / 2; cnt++) {
  738. if (cnt % 8 == 0) {
  739. qla_uprintf(&uiter, "\n");
  740. }
  741. qla_uprintf(&uiter, "%04x ", fw->risc_gp1_reg[cnt]);
  742. }
  743. qla_uprintf(&uiter, "\n\nRISC GP2 Registers:");
  744. for (cnt = 0; cnt < sizeof (fw->risc_gp2_reg) / 2; cnt++) {
  745. if (cnt % 8 == 0) {
  746. qla_uprintf(&uiter, "\n");
  747. }
  748. qla_uprintf(&uiter, "%04x ", fw->risc_gp2_reg[cnt]);
  749. }
  750. qla_uprintf(&uiter, "\n\nRISC GP3 Registers:");
  751. for (cnt = 0; cnt < sizeof (fw->risc_gp3_reg) / 2; cnt++) {
  752. if (cnt % 8 == 0) {
  753. qla_uprintf(&uiter, "\n");
  754. }
  755. qla_uprintf(&uiter, "%04x ", fw->risc_gp3_reg[cnt]);
  756. }
  757. qla_uprintf(&uiter, "\n\nRISC GP4 Registers:");
  758. for (cnt = 0; cnt < sizeof (fw->risc_gp4_reg) / 2; cnt++) {
  759. if (cnt % 8 == 0) {
  760. qla_uprintf(&uiter, "\n");
  761. }
  762. qla_uprintf(&uiter, "%04x ", fw->risc_gp4_reg[cnt]);
  763. }
  764. qla_uprintf(&uiter, "\n\nRISC GP5 Registers:");
  765. for (cnt = 0; cnt < sizeof (fw->risc_gp5_reg) / 2; cnt++) {
  766. if (cnt % 8 == 0) {
  767. qla_uprintf(&uiter, "\n");
  768. }
  769. qla_uprintf(&uiter, "%04x ", fw->risc_gp5_reg[cnt]);
  770. }
  771. qla_uprintf(&uiter, "\n\nRISC GP6 Registers:");
  772. for (cnt = 0; cnt < sizeof (fw->risc_gp6_reg) / 2; cnt++) {
  773. if (cnt % 8 == 0) {
  774. qla_uprintf(&uiter, "\n");
  775. }
  776. qla_uprintf(&uiter, "%04x ", fw->risc_gp6_reg[cnt]);
  777. }
  778. qla_uprintf(&uiter, "\n\nRISC GP7 Registers:");
  779. for (cnt = 0; cnt < sizeof (fw->risc_gp7_reg) / 2; cnt++) {
  780. if (cnt % 8 == 0) {
  781. qla_uprintf(&uiter, "\n");
  782. }
  783. qla_uprintf(&uiter, "%04x ", fw->risc_gp7_reg[cnt]);
  784. }
  785. qla_uprintf(&uiter, "\n\nFrame Buffer Hardware Registers:");
  786. for (cnt = 0; cnt < sizeof (fw->frame_buf_hdw_reg) / 2; cnt++) {
  787. if (cnt % 8 == 0) {
  788. qla_uprintf(&uiter, "\n");
  789. }
  790. qla_uprintf(&uiter, "%04x ", fw->frame_buf_hdw_reg[cnt]);
  791. }
  792. qla_uprintf(&uiter, "\n\nFPM B0 Registers:");
  793. for (cnt = 0; cnt < sizeof (fw->fpm_b0_reg) / 2; cnt++) {
  794. if (cnt % 8 == 0) {
  795. qla_uprintf(&uiter, "\n");
  796. }
  797. qla_uprintf(&uiter, "%04x ", fw->fpm_b0_reg[cnt]);
  798. }
  799. qla_uprintf(&uiter, "\n\nFPM B1 Registers:");
  800. for (cnt = 0; cnt < sizeof (fw->fpm_b1_reg) / 2; cnt++) {
  801. if (cnt % 8 == 0) {
  802. qla_uprintf(&uiter, "\n");
  803. }
  804. qla_uprintf(&uiter, "%04x ", fw->fpm_b1_reg[cnt]);
  805. }
  806. qla_uprintf(&uiter, "\n\nRISC SRAM:");
  807. for (cnt = 0; cnt < sizeof (fw->risc_ram) / 2; cnt++) {
  808. if (cnt % 8 == 0) {
  809. qla_uprintf(&uiter, "\n%04x: ", cnt + 0x1000);
  810. }
  811. qla_uprintf(&uiter, "%04x ", fw->risc_ram[cnt]);
  812. }
  813. qla_uprintf(&uiter, "\n\n[<==END] ISP Debug Dump.");
  814. return;
  815. }
  816. static int
  817. qla_uprintf(char **uiter, char *fmt, ...)
  818. {
  819. int iter, len;
  820. char buf[128];
  821. va_list args;
  822. va_start(args, fmt);
  823. len = vsprintf(buf, fmt, args);
  824. va_end(args);
  825. for (iter = 0; iter < len; iter++, *uiter += 1)
  826. *uiter[0] = buf[iter];
  827. return (len);
  828. }
  829. //FIXME
  830. /****************************************************************************/
  831. /* Driver Debug Functions. */
  832. /****************************************************************************/
  833. void
  834. qla2x00_dump_regs(scsi_qla_host_t *ha)
  835. {
  836. device_reg_t __iomem *reg = ha->iobase;
  837. printk("Mailbox registers:\n");
  838. printk("scsi(%ld): mbox 0 0x%04x \n",
  839. ha->host_no, RD_MAILBOX_REG(ha, reg, 0));
  840. printk("scsi(%ld): mbox 1 0x%04x \n",
  841. ha->host_no, RD_MAILBOX_REG(ha, reg, 1));
  842. printk("scsi(%ld): mbox 2 0x%04x \n",
  843. ha->host_no, RD_MAILBOX_REG(ha, reg, 2));
  844. printk("scsi(%ld): mbox 3 0x%04x \n",
  845. ha->host_no, RD_MAILBOX_REG(ha, reg, 3));
  846. printk("scsi(%ld): mbox 4 0x%04x \n",
  847. ha->host_no, RD_MAILBOX_REG(ha, reg, 4));
  848. printk("scsi(%ld): mbox 5 0x%04x \n",
  849. ha->host_no, RD_MAILBOX_REG(ha, reg, 5));
  850. }
  851. void
  852. qla2x00_dump_buffer(uint8_t * b, uint32_t size)
  853. {
  854. uint32_t cnt;
  855. uint8_t c;
  856. printk(" 0 1 2 3 4 5 6 7 8 9 "
  857. "Ah Bh Ch Dh Eh Fh\n");
  858. printk("----------------------------------------"
  859. "----------------------\n");
  860. for (cnt = 0; cnt < size;) {
  861. c = *b++;
  862. printk("%02x",(uint32_t) c);
  863. cnt++;
  864. if (!(cnt % 16))
  865. printk("\n");
  866. else
  867. printk(" ");
  868. }
  869. if (cnt % 16)
  870. printk("\n");
  871. }
  872. /**************************************************************************
  873. * qla2x00_print_scsi_cmd
  874. * Dumps out info about the scsi cmd and srb.
  875. * Input
  876. * cmd : struct scsi_cmnd
  877. **************************************************************************/
  878. void
  879. qla2x00_print_scsi_cmd(struct scsi_cmnd * cmd)
  880. {
  881. int i;
  882. struct scsi_qla_host *ha;
  883. srb_t *sp;
  884. ha = (struct scsi_qla_host *)cmd->device->host->hostdata;
  885. sp = (srb_t *) cmd->SCp.ptr;
  886. printk("SCSI Command @=0x%p, Handle=0x%p\n", cmd, cmd->host_scribble);
  887. printk(" chan=0x%02x, target=0x%02x, lun=0x%02x, cmd_len=0x%02x\n",
  888. cmd->device->channel, cmd->device->id, cmd->device->lun,
  889. cmd->cmd_len);
  890. printk(" CDB: ");
  891. for (i = 0; i < cmd->cmd_len; i++) {
  892. printk("0x%02x ", cmd->cmnd[i]);
  893. }
  894. printk("\n seg_cnt=%d, allowed=%d, retries=%d\n",
  895. cmd->use_sg, cmd->allowed, cmd->retries);
  896. printk(" request buffer=0x%p, request buffer len=0x%x\n",
  897. cmd->request_buffer, cmd->request_bufflen);
  898. printk(" tag=%d, transfersize=0x%x\n",
  899. cmd->tag, cmd->transfersize);
  900. printk(" serial_number=%lx, SP=%p\n", cmd->serial_number, sp);
  901. printk(" data direction=%d\n", cmd->sc_data_direction);
  902. if (!sp)
  903. return;
  904. printk(" sp flags=0x%x\n", sp->flags);
  905. printk(" state=%d\n", sp->state);
  906. }
  907. #if defined(QL_DEBUG_ROUTINES)
  908. /*
  909. * qla2x00_formatted_dump_buffer
  910. * Prints string plus buffer.
  911. *
  912. * Input:
  913. * string = Null terminated string (no newline at end).
  914. * buffer = buffer address.
  915. * wd_size = word size 8, 16, 32 or 64 bits
  916. * count = number of words.
  917. */
  918. void
  919. qla2x00_formatted_dump_buffer(char *string, uint8_t * buffer,
  920. uint8_t wd_size, uint32_t count)
  921. {
  922. uint32_t cnt;
  923. uint16_t *buf16;
  924. uint32_t *buf32;
  925. if (strcmp(string, "") != 0)
  926. printk("%s\n",string);
  927. switch (wd_size) {
  928. case 8:
  929. printk(" 0 1 2 3 4 5 6 7 "
  930. "8 9 Ah Bh Ch Dh Eh Fh\n");
  931. printk("-----------------------------------------"
  932. "-------------------------------------\n");
  933. for (cnt = 1; cnt <= count; cnt++, buffer++) {
  934. printk("%02x",*buffer);
  935. if (cnt % 16 == 0)
  936. printk("\n");
  937. else
  938. printk(" ");
  939. }
  940. if (cnt % 16 != 0)
  941. printk("\n");
  942. break;
  943. case 16:
  944. printk(" 0 2 4 6 8 Ah "
  945. " Ch Eh\n");
  946. printk("-----------------------------------------"
  947. "-------------\n");
  948. buf16 = (uint16_t *) buffer;
  949. for (cnt = 1; cnt <= count; cnt++, buf16++) {
  950. printk("%4x",*buf16);
  951. if (cnt % 8 == 0)
  952. printk("\n");
  953. else if (*buf16 < 10)
  954. printk(" ");
  955. else
  956. printk(" ");
  957. }
  958. if (cnt % 8 != 0)
  959. printk("\n");
  960. break;
  961. case 32:
  962. printk(" 0 4 8 Ch\n");
  963. printk("------------------------------------------\n");
  964. buf32 = (uint32_t *) buffer;
  965. for (cnt = 1; cnt <= count; cnt++, buf32++) {
  966. printk("%8x", *buf32);
  967. if (cnt % 4 == 0)
  968. printk("\n");
  969. else if (*buf32 < 10)
  970. printk(" ");
  971. else
  972. printk(" ");
  973. }
  974. if (cnt % 4 != 0)
  975. printk("\n");
  976. break;
  977. default:
  978. break;
  979. }
  980. }
  981. #endif