qla_dbg.c 47 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524
  1. /*
  2. * QLogic Fibre Channel HBA Driver
  3. * Copyright (c) 2003-2005 QLogic Corporation
  4. *
  5. * See LICENSE.qla2xxx for copyright and licensing details.
  6. */
  7. #include "qla_def.h"
  8. #include <linux/delay.h>
  9. static inline void
  10. qla2xxx_prep_dump(scsi_qla_host_t *ha, struct qla2xxx_fw_dump *fw_dump)
  11. {
  12. fw_dump->fw_major_version = htonl(ha->fw_major_version);
  13. fw_dump->fw_minor_version = htonl(ha->fw_minor_version);
  14. fw_dump->fw_subminor_version = htonl(ha->fw_subminor_version);
  15. fw_dump->fw_attributes = htonl(ha->fw_attributes);
  16. fw_dump->vendor = htonl(ha->pdev->vendor);
  17. fw_dump->device = htonl(ha->pdev->device);
  18. fw_dump->subsystem_vendor = htonl(ha->pdev->subsystem_vendor);
  19. fw_dump->subsystem_device = htonl(ha->pdev->subsystem_device);
  20. }
  21. static inline void *
  22. qla2xxx_copy_queues(scsi_qla_host_t *ha, void *ptr)
  23. {
  24. /* Request queue. */
  25. memcpy(ptr, ha->request_ring, ha->request_q_length *
  26. sizeof(request_t));
  27. /* Response queue. */
  28. ptr += ha->request_q_length * sizeof(request_t);
  29. memcpy(ptr, ha->response_ring, ha->response_q_length *
  30. sizeof(response_t));
  31. return ptr + (ha->response_q_length * sizeof(response_t));
  32. }
  33. /**
  34. * qla2300_fw_dump() - Dumps binary data from the 2300 firmware.
  35. * @ha: HA context
  36. * @hardware_locked: Called with the hardware_lock
  37. */
  38. void
  39. qla2300_fw_dump(scsi_qla_host_t *ha, int hardware_locked)
  40. {
  41. int rval;
  42. uint32_t cnt, timer;
  43. uint32_t risc_address;
  44. uint16_t mb0, mb2;
  45. uint32_t stat;
  46. struct device_reg_2xxx __iomem *reg = &ha->iobase->isp;
  47. uint16_t __iomem *dmp_reg;
  48. unsigned long flags;
  49. struct qla2300_fw_dump *fw;
  50. uint32_t data_ram_cnt;
  51. risc_address = data_ram_cnt = 0;
  52. mb0 = mb2 = 0;
  53. flags = 0;
  54. if (!hardware_locked)
  55. spin_lock_irqsave(&ha->hardware_lock, flags);
  56. if (!ha->fw_dump) {
  57. qla_printk(KERN_WARNING, ha,
  58. "No buffer available for dump!!!\n");
  59. goto qla2300_fw_dump_failed;
  60. }
  61. if (ha->fw_dumped) {
  62. qla_printk(KERN_WARNING, ha,
  63. "Firmware has been previously dumped (%p) -- ignoring "
  64. "request...\n", ha->fw_dump);
  65. goto qla2300_fw_dump_failed;
  66. }
  67. fw = &ha->fw_dump->isp.isp23;
  68. qla2xxx_prep_dump(ha, ha->fw_dump);
  69. rval = QLA_SUCCESS;
  70. fw->hccr = htons(RD_REG_WORD(&reg->hccr));
  71. /* Pause RISC. */
  72. WRT_REG_WORD(&reg->hccr, HCCR_PAUSE_RISC);
  73. if (IS_QLA2300(ha)) {
  74. for (cnt = 30000;
  75. (RD_REG_WORD(&reg->hccr) & HCCR_RISC_PAUSE) == 0 &&
  76. rval == QLA_SUCCESS; cnt--) {
  77. if (cnt)
  78. udelay(100);
  79. else
  80. rval = QLA_FUNCTION_TIMEOUT;
  81. }
  82. } else {
  83. RD_REG_WORD(&reg->hccr); /* PCI Posting. */
  84. udelay(10);
  85. }
  86. if (rval == QLA_SUCCESS) {
  87. dmp_reg = (uint16_t __iomem *)(reg + 0);
  88. for (cnt = 0; cnt < sizeof(fw->pbiu_reg) / 2; cnt++)
  89. fw->pbiu_reg[cnt] = htons(RD_REG_WORD(dmp_reg++));
  90. dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x10);
  91. for (cnt = 0; cnt < sizeof(fw->risc_host_reg) / 2; cnt++)
  92. fw->risc_host_reg[cnt] = htons(RD_REG_WORD(dmp_reg++));
  93. dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x40);
  94. for (cnt = 0; cnt < sizeof(fw->mailbox_reg) / 2; cnt++)
  95. fw->mailbox_reg[cnt] = htons(RD_REG_WORD(dmp_reg++));
  96. WRT_REG_WORD(&reg->ctrl_status, 0x40);
  97. dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80);
  98. for (cnt = 0; cnt < sizeof(fw->resp_dma_reg) / 2; cnt++)
  99. fw->resp_dma_reg[cnt] = htons(RD_REG_WORD(dmp_reg++));
  100. WRT_REG_WORD(&reg->ctrl_status, 0x50);
  101. dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80);
  102. for (cnt = 0; cnt < sizeof(fw->dma_reg) / 2; cnt++)
  103. fw->dma_reg[cnt] = htons(RD_REG_WORD(dmp_reg++));
  104. WRT_REG_WORD(&reg->ctrl_status, 0x00);
  105. dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0xA0);
  106. for (cnt = 0; cnt < sizeof(fw->risc_hdw_reg) / 2; cnt++)
  107. fw->risc_hdw_reg[cnt] = htons(RD_REG_WORD(dmp_reg++));
  108. WRT_REG_WORD(&reg->pcr, 0x2000);
  109. dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80);
  110. for (cnt = 0; cnt < sizeof(fw->risc_gp0_reg) / 2; cnt++)
  111. fw->risc_gp0_reg[cnt] = htons(RD_REG_WORD(dmp_reg++));
  112. WRT_REG_WORD(&reg->pcr, 0x2200);
  113. dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80);
  114. for (cnt = 0; cnt < sizeof(fw->risc_gp1_reg) / 2; cnt++)
  115. fw->risc_gp1_reg[cnt] = htons(RD_REG_WORD(dmp_reg++));
  116. WRT_REG_WORD(&reg->pcr, 0x2400);
  117. dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80);
  118. for (cnt = 0; cnt < sizeof(fw->risc_gp2_reg) / 2; cnt++)
  119. fw->risc_gp2_reg[cnt] = htons(RD_REG_WORD(dmp_reg++));
  120. WRT_REG_WORD(&reg->pcr, 0x2600);
  121. dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80);
  122. for (cnt = 0; cnt < sizeof(fw->risc_gp3_reg) / 2; cnt++)
  123. fw->risc_gp3_reg[cnt] = htons(RD_REG_WORD(dmp_reg++));
  124. WRT_REG_WORD(&reg->pcr, 0x2800);
  125. dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80);
  126. for (cnt = 0; cnt < sizeof(fw->risc_gp4_reg) / 2; cnt++)
  127. fw->risc_gp4_reg[cnt] = htons(RD_REG_WORD(dmp_reg++));
  128. WRT_REG_WORD(&reg->pcr, 0x2A00);
  129. dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80);
  130. for (cnt = 0; cnt < sizeof(fw->risc_gp5_reg) / 2; cnt++)
  131. fw->risc_gp5_reg[cnt] = htons(RD_REG_WORD(dmp_reg++));
  132. WRT_REG_WORD(&reg->pcr, 0x2C00);
  133. dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80);
  134. for (cnt = 0; cnt < sizeof(fw->risc_gp6_reg) / 2; cnt++)
  135. fw->risc_gp6_reg[cnt] = htons(RD_REG_WORD(dmp_reg++));
  136. WRT_REG_WORD(&reg->pcr, 0x2E00);
  137. dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80);
  138. for (cnt = 0; cnt < sizeof(fw->risc_gp7_reg) / 2; cnt++)
  139. fw->risc_gp7_reg[cnt] = htons(RD_REG_WORD(dmp_reg++));
  140. WRT_REG_WORD(&reg->ctrl_status, 0x10);
  141. dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80);
  142. for (cnt = 0; cnt < sizeof(fw->frame_buf_hdw_reg) / 2; cnt++)
  143. fw->frame_buf_hdw_reg[cnt] =
  144. htons(RD_REG_WORD(dmp_reg++));
  145. WRT_REG_WORD(&reg->ctrl_status, 0x20);
  146. dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80);
  147. for (cnt = 0; cnt < sizeof(fw->fpm_b0_reg) / 2; cnt++)
  148. fw->fpm_b0_reg[cnt] = htons(RD_REG_WORD(dmp_reg++));
  149. WRT_REG_WORD(&reg->ctrl_status, 0x30);
  150. dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80);
  151. for (cnt = 0; cnt < sizeof(fw->fpm_b1_reg) / 2; cnt++)
  152. fw->fpm_b1_reg[cnt] = htons(RD_REG_WORD(dmp_reg++));
  153. /* Reset RISC. */
  154. WRT_REG_WORD(&reg->ctrl_status, CSR_ISP_SOFT_RESET);
  155. for (cnt = 0; cnt < 30000; cnt++) {
  156. if ((RD_REG_WORD(&reg->ctrl_status) &
  157. CSR_ISP_SOFT_RESET) == 0)
  158. break;
  159. udelay(10);
  160. }
  161. }
  162. if (!IS_QLA2300(ha)) {
  163. for (cnt = 30000; RD_MAILBOX_REG(ha, reg, 0) != 0 &&
  164. rval == QLA_SUCCESS; cnt--) {
  165. if (cnt)
  166. udelay(100);
  167. else
  168. rval = QLA_FUNCTION_TIMEOUT;
  169. }
  170. }
  171. if (rval == QLA_SUCCESS) {
  172. /* Get RISC SRAM. */
  173. risc_address = 0x800;
  174. WRT_MAILBOX_REG(ha, reg, 0, MBC_READ_RAM_WORD);
  175. clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);
  176. }
  177. for (cnt = 0; cnt < sizeof(fw->risc_ram) / 2 && rval == QLA_SUCCESS;
  178. cnt++, risc_address++) {
  179. WRT_MAILBOX_REG(ha, reg, 1, (uint16_t)risc_address);
  180. WRT_REG_WORD(&reg->hccr, HCCR_SET_HOST_INT);
  181. for (timer = 6000000; timer; timer--) {
  182. /* Check for pending interrupts. */
  183. stat = RD_REG_DWORD(&reg->u.isp2300.host_status);
  184. if (stat & HSR_RISC_INT) {
  185. stat &= 0xff;
  186. if (stat == 0x1 || stat == 0x2) {
  187. set_bit(MBX_INTERRUPT,
  188. &ha->mbx_cmd_flags);
  189. mb0 = RD_MAILBOX_REG(ha, reg, 0);
  190. mb2 = RD_MAILBOX_REG(ha, reg, 2);
  191. /* Release mailbox registers. */
  192. WRT_REG_WORD(&reg->semaphore, 0);
  193. WRT_REG_WORD(&reg->hccr,
  194. HCCR_CLR_RISC_INT);
  195. RD_REG_WORD(&reg->hccr);
  196. break;
  197. } else if (stat == 0x10 || stat == 0x11) {
  198. set_bit(MBX_INTERRUPT,
  199. &ha->mbx_cmd_flags);
  200. mb0 = RD_MAILBOX_REG(ha, reg, 0);
  201. mb2 = RD_MAILBOX_REG(ha, reg, 2);
  202. WRT_REG_WORD(&reg->hccr,
  203. HCCR_CLR_RISC_INT);
  204. RD_REG_WORD(&reg->hccr);
  205. break;
  206. }
  207. /* clear this intr; it wasn't a mailbox intr */
  208. WRT_REG_WORD(&reg->hccr, HCCR_CLR_RISC_INT);
  209. RD_REG_WORD(&reg->hccr);
  210. }
  211. udelay(5);
  212. }
  213. if (test_and_clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags)) {
  214. rval = mb0 & MBS_MASK;
  215. fw->risc_ram[cnt] = htons(mb2);
  216. } else {
  217. rval = QLA_FUNCTION_FAILED;
  218. }
  219. }
  220. if (rval == QLA_SUCCESS) {
  221. /* Get stack SRAM. */
  222. risc_address = 0x10000;
  223. WRT_MAILBOX_REG(ha, reg, 0, MBC_READ_RAM_EXTENDED);
  224. clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);
  225. }
  226. for (cnt = 0; cnt < sizeof(fw->stack_ram) / 2 && rval == QLA_SUCCESS;
  227. cnt++, risc_address++) {
  228. WRT_MAILBOX_REG(ha, reg, 1, LSW(risc_address));
  229. WRT_MAILBOX_REG(ha, reg, 8, MSW(risc_address));
  230. WRT_REG_WORD(&reg->hccr, HCCR_SET_HOST_INT);
  231. for (timer = 6000000; timer; timer--) {
  232. /* Check for pending interrupts. */
  233. stat = RD_REG_DWORD(&reg->u.isp2300.host_status);
  234. if (stat & HSR_RISC_INT) {
  235. stat &= 0xff;
  236. if (stat == 0x1 || stat == 0x2) {
  237. set_bit(MBX_INTERRUPT,
  238. &ha->mbx_cmd_flags);
  239. mb0 = RD_MAILBOX_REG(ha, reg, 0);
  240. mb2 = RD_MAILBOX_REG(ha, reg, 2);
  241. /* Release mailbox registers. */
  242. WRT_REG_WORD(&reg->semaphore, 0);
  243. WRT_REG_WORD(&reg->hccr,
  244. HCCR_CLR_RISC_INT);
  245. RD_REG_WORD(&reg->hccr);
  246. break;
  247. } else if (stat == 0x10 || stat == 0x11) {
  248. set_bit(MBX_INTERRUPT,
  249. &ha->mbx_cmd_flags);
  250. mb0 = RD_MAILBOX_REG(ha, reg, 0);
  251. mb2 = RD_MAILBOX_REG(ha, reg, 2);
  252. WRT_REG_WORD(&reg->hccr,
  253. HCCR_CLR_RISC_INT);
  254. RD_REG_WORD(&reg->hccr);
  255. break;
  256. }
  257. /* clear this intr; it wasn't a mailbox intr */
  258. WRT_REG_WORD(&reg->hccr, HCCR_CLR_RISC_INT);
  259. RD_REG_WORD(&reg->hccr);
  260. }
  261. udelay(5);
  262. }
  263. if (test_and_clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags)) {
  264. rval = mb0 & MBS_MASK;
  265. fw->stack_ram[cnt] = htons(mb2);
  266. } else {
  267. rval = QLA_FUNCTION_FAILED;
  268. }
  269. }
  270. if (rval == QLA_SUCCESS) {
  271. /* Get data SRAM. */
  272. risc_address = 0x11000;
  273. data_ram_cnt = ha->fw_memory_size - risc_address + 1;
  274. WRT_MAILBOX_REG(ha, reg, 0, MBC_READ_RAM_EXTENDED);
  275. clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);
  276. }
  277. for (cnt = 0; cnt < data_ram_cnt && rval == QLA_SUCCESS;
  278. cnt++, risc_address++) {
  279. WRT_MAILBOX_REG(ha, reg, 1, LSW(risc_address));
  280. WRT_MAILBOX_REG(ha, reg, 8, MSW(risc_address));
  281. WRT_REG_WORD(&reg->hccr, HCCR_SET_HOST_INT);
  282. for (timer = 6000000; timer; timer--) {
  283. /* Check for pending interrupts. */
  284. stat = RD_REG_DWORD(&reg->u.isp2300.host_status);
  285. if (stat & HSR_RISC_INT) {
  286. stat &= 0xff;
  287. if (stat == 0x1 || stat == 0x2) {
  288. set_bit(MBX_INTERRUPT,
  289. &ha->mbx_cmd_flags);
  290. mb0 = RD_MAILBOX_REG(ha, reg, 0);
  291. mb2 = RD_MAILBOX_REG(ha, reg, 2);
  292. /* Release mailbox registers. */
  293. WRT_REG_WORD(&reg->semaphore, 0);
  294. WRT_REG_WORD(&reg->hccr,
  295. HCCR_CLR_RISC_INT);
  296. RD_REG_WORD(&reg->hccr);
  297. break;
  298. } else if (stat == 0x10 || stat == 0x11) {
  299. set_bit(MBX_INTERRUPT,
  300. &ha->mbx_cmd_flags);
  301. mb0 = RD_MAILBOX_REG(ha, reg, 0);
  302. mb2 = RD_MAILBOX_REG(ha, reg, 2);
  303. WRT_REG_WORD(&reg->hccr,
  304. HCCR_CLR_RISC_INT);
  305. RD_REG_WORD(&reg->hccr);
  306. break;
  307. }
  308. /* clear this intr; it wasn't a mailbox intr */
  309. WRT_REG_WORD(&reg->hccr, HCCR_CLR_RISC_INT);
  310. RD_REG_WORD(&reg->hccr);
  311. }
  312. udelay(5);
  313. }
  314. if (test_and_clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags)) {
  315. rval = mb0 & MBS_MASK;
  316. fw->data_ram[cnt] = htons(mb2);
  317. } else {
  318. rval = QLA_FUNCTION_FAILED;
  319. }
  320. }
  321. if (rval == QLA_SUCCESS)
  322. qla2xxx_copy_queues(ha, &fw->data_ram[cnt]);
  323. if (rval != QLA_SUCCESS) {
  324. qla_printk(KERN_WARNING, ha,
  325. "Failed to dump firmware (%x)!!!\n", rval);
  326. ha->fw_dumped = 0;
  327. } else {
  328. qla_printk(KERN_INFO, ha,
  329. "Firmware dump saved to temp buffer (%ld/%p).\n",
  330. ha->host_no, ha->fw_dump);
  331. ha->fw_dumped = 1;
  332. }
  333. qla2300_fw_dump_failed:
  334. if (!hardware_locked)
  335. spin_unlock_irqrestore(&ha->hardware_lock, flags);
  336. }
  337. /**
  338. * qla2100_fw_dump() - Dumps binary data from the 2100/2200 firmware.
  339. * @ha: HA context
  340. * @hardware_locked: Called with the hardware_lock
  341. */
  342. void
  343. qla2100_fw_dump(scsi_qla_host_t *ha, int hardware_locked)
  344. {
  345. int rval;
  346. uint32_t cnt, timer;
  347. uint16_t risc_address;
  348. uint16_t mb0, mb2;
  349. struct device_reg_2xxx __iomem *reg = &ha->iobase->isp;
  350. uint16_t __iomem *dmp_reg;
  351. unsigned long flags;
  352. struct qla2100_fw_dump *fw;
  353. risc_address = 0;
  354. mb0 = mb2 = 0;
  355. flags = 0;
  356. if (!hardware_locked)
  357. spin_lock_irqsave(&ha->hardware_lock, flags);
  358. if (!ha->fw_dump) {
  359. qla_printk(KERN_WARNING, ha,
  360. "No buffer available for dump!!!\n");
  361. goto qla2100_fw_dump_failed;
  362. }
  363. if (ha->fw_dumped) {
  364. qla_printk(KERN_WARNING, ha,
  365. "Firmware has been previously dumped (%p) -- ignoring "
  366. "request...\n", ha->fw_dump);
  367. goto qla2100_fw_dump_failed;
  368. }
  369. fw = &ha->fw_dump->isp.isp21;
  370. qla2xxx_prep_dump(ha, ha->fw_dump);
  371. rval = QLA_SUCCESS;
  372. fw->hccr = htons(RD_REG_WORD(&reg->hccr));
  373. /* Pause RISC. */
  374. WRT_REG_WORD(&reg->hccr, HCCR_PAUSE_RISC);
  375. for (cnt = 30000; (RD_REG_WORD(&reg->hccr) & HCCR_RISC_PAUSE) == 0 &&
  376. rval == QLA_SUCCESS; cnt--) {
  377. if (cnt)
  378. udelay(100);
  379. else
  380. rval = QLA_FUNCTION_TIMEOUT;
  381. }
  382. if (rval == QLA_SUCCESS) {
  383. dmp_reg = (uint16_t __iomem *)(reg + 0);
  384. for (cnt = 0; cnt < sizeof(fw->pbiu_reg) / 2; cnt++)
  385. fw->pbiu_reg[cnt] = htons(RD_REG_WORD(dmp_reg++));
  386. dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x10);
  387. for (cnt = 0; cnt < ha->mbx_count; cnt++) {
  388. if (cnt == 8) {
  389. dmp_reg = (uint16_t __iomem *)
  390. ((uint8_t __iomem *)reg + 0xe0);
  391. }
  392. fw->mailbox_reg[cnt] = htons(RD_REG_WORD(dmp_reg++));
  393. }
  394. dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x20);
  395. for (cnt = 0; cnt < sizeof(fw->dma_reg) / 2; cnt++)
  396. fw->dma_reg[cnt] = htons(RD_REG_WORD(dmp_reg++));
  397. WRT_REG_WORD(&reg->ctrl_status, 0x00);
  398. dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0xA0);
  399. for (cnt = 0; cnt < sizeof(fw->risc_hdw_reg) / 2; cnt++)
  400. fw->risc_hdw_reg[cnt] = htons(RD_REG_WORD(dmp_reg++));
  401. WRT_REG_WORD(&reg->pcr, 0x2000);
  402. dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80);
  403. for (cnt = 0; cnt < sizeof(fw->risc_gp0_reg) / 2; cnt++)
  404. fw->risc_gp0_reg[cnt] = htons(RD_REG_WORD(dmp_reg++));
  405. WRT_REG_WORD(&reg->pcr, 0x2100);
  406. dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80);
  407. for (cnt = 0; cnt < sizeof(fw->risc_gp1_reg) / 2; cnt++)
  408. fw->risc_gp1_reg[cnt] = htons(RD_REG_WORD(dmp_reg++));
  409. WRT_REG_WORD(&reg->pcr, 0x2200);
  410. dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80);
  411. for (cnt = 0; cnt < sizeof(fw->risc_gp2_reg) / 2; cnt++)
  412. fw->risc_gp2_reg[cnt] = htons(RD_REG_WORD(dmp_reg++));
  413. WRT_REG_WORD(&reg->pcr, 0x2300);
  414. dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80);
  415. for (cnt = 0; cnt < sizeof(fw->risc_gp3_reg) / 2; cnt++)
  416. fw->risc_gp3_reg[cnt] = htons(RD_REG_WORD(dmp_reg++));
  417. WRT_REG_WORD(&reg->pcr, 0x2400);
  418. dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80);
  419. for (cnt = 0; cnt < sizeof(fw->risc_gp4_reg) / 2; cnt++)
  420. fw->risc_gp4_reg[cnt] = htons(RD_REG_WORD(dmp_reg++));
  421. WRT_REG_WORD(&reg->pcr, 0x2500);
  422. dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80);
  423. for (cnt = 0; cnt < sizeof(fw->risc_gp5_reg) / 2; cnt++)
  424. fw->risc_gp5_reg[cnt] = htons(RD_REG_WORD(dmp_reg++));
  425. WRT_REG_WORD(&reg->pcr, 0x2600);
  426. dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80);
  427. for (cnt = 0; cnt < sizeof(fw->risc_gp6_reg) / 2; cnt++)
  428. fw->risc_gp6_reg[cnt] = htons(RD_REG_WORD(dmp_reg++));
  429. WRT_REG_WORD(&reg->pcr, 0x2700);
  430. dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80);
  431. for (cnt = 0; cnt < sizeof(fw->risc_gp7_reg) / 2; cnt++)
  432. fw->risc_gp7_reg[cnt] = htons(RD_REG_WORD(dmp_reg++));
  433. WRT_REG_WORD(&reg->ctrl_status, 0x10);
  434. dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80);
  435. for (cnt = 0; cnt < sizeof(fw->frame_buf_hdw_reg) / 2; cnt++)
  436. fw->frame_buf_hdw_reg[cnt] =
  437. htons(RD_REG_WORD(dmp_reg++));
  438. WRT_REG_WORD(&reg->ctrl_status, 0x20);
  439. dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80);
  440. for (cnt = 0; cnt < sizeof(fw->fpm_b0_reg) / 2; cnt++)
  441. fw->fpm_b0_reg[cnt] = htons(RD_REG_WORD(dmp_reg++));
  442. WRT_REG_WORD(&reg->ctrl_status, 0x30);
  443. dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80);
  444. for (cnt = 0; cnt < sizeof(fw->fpm_b1_reg) / 2; cnt++)
  445. fw->fpm_b1_reg[cnt] = htons(RD_REG_WORD(dmp_reg++));
  446. /* Reset the ISP. */
  447. WRT_REG_WORD(&reg->ctrl_status, CSR_ISP_SOFT_RESET);
  448. }
  449. for (cnt = 30000; RD_MAILBOX_REG(ha, reg, 0) != 0 &&
  450. rval == QLA_SUCCESS; cnt--) {
  451. if (cnt)
  452. udelay(100);
  453. else
  454. rval = QLA_FUNCTION_TIMEOUT;
  455. }
  456. /* Pause RISC. */
  457. if (rval == QLA_SUCCESS && (IS_QLA2200(ha) || (IS_QLA2100(ha) &&
  458. (RD_REG_WORD(&reg->mctr) & (BIT_1 | BIT_0)) != 0))) {
  459. WRT_REG_WORD(&reg->hccr, HCCR_PAUSE_RISC);
  460. for (cnt = 30000;
  461. (RD_REG_WORD(&reg->hccr) & HCCR_RISC_PAUSE) == 0 &&
  462. rval == QLA_SUCCESS; cnt--) {
  463. if (cnt)
  464. udelay(100);
  465. else
  466. rval = QLA_FUNCTION_TIMEOUT;
  467. }
  468. if (rval == QLA_SUCCESS) {
  469. /* Set memory configuration and timing. */
  470. if (IS_QLA2100(ha))
  471. WRT_REG_WORD(&reg->mctr, 0xf1);
  472. else
  473. WRT_REG_WORD(&reg->mctr, 0xf2);
  474. RD_REG_WORD(&reg->mctr); /* PCI Posting. */
  475. /* Release RISC. */
  476. WRT_REG_WORD(&reg->hccr, HCCR_RELEASE_RISC);
  477. }
  478. }
  479. if (rval == QLA_SUCCESS) {
  480. /* Get RISC SRAM. */
  481. risc_address = 0x1000;
  482. WRT_MAILBOX_REG(ha, reg, 0, MBC_READ_RAM_WORD);
  483. clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);
  484. }
  485. for (cnt = 0; cnt < sizeof(fw->risc_ram) / 2 && rval == QLA_SUCCESS;
  486. cnt++, risc_address++) {
  487. WRT_MAILBOX_REG(ha, reg, 1, risc_address);
  488. WRT_REG_WORD(&reg->hccr, HCCR_SET_HOST_INT);
  489. for (timer = 6000000; timer != 0; timer--) {
  490. /* Check for pending interrupts. */
  491. if (RD_REG_WORD(&reg->istatus) & ISR_RISC_INT) {
  492. if (RD_REG_WORD(&reg->semaphore) & BIT_0) {
  493. set_bit(MBX_INTERRUPT,
  494. &ha->mbx_cmd_flags);
  495. mb0 = RD_MAILBOX_REG(ha, reg, 0);
  496. mb2 = RD_MAILBOX_REG(ha, reg, 2);
  497. WRT_REG_WORD(&reg->semaphore, 0);
  498. WRT_REG_WORD(&reg->hccr,
  499. HCCR_CLR_RISC_INT);
  500. RD_REG_WORD(&reg->hccr);
  501. break;
  502. }
  503. WRT_REG_WORD(&reg->hccr, HCCR_CLR_RISC_INT);
  504. RD_REG_WORD(&reg->hccr);
  505. }
  506. udelay(5);
  507. }
  508. if (test_and_clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags)) {
  509. rval = mb0 & MBS_MASK;
  510. fw->risc_ram[cnt] = htons(mb2);
  511. } else {
  512. rval = QLA_FUNCTION_FAILED;
  513. }
  514. }
  515. if (rval == QLA_SUCCESS)
  516. qla2xxx_copy_queues(ha, &fw->risc_ram[cnt]);
  517. if (rval != QLA_SUCCESS) {
  518. qla_printk(KERN_WARNING, ha,
  519. "Failed to dump firmware (%x)!!!\n", rval);
  520. ha->fw_dumped = 0;
  521. } else {
  522. qla_printk(KERN_INFO, ha,
  523. "Firmware dump saved to temp buffer (%ld/%p).\n",
  524. ha->host_no, ha->fw_dump);
  525. ha->fw_dumped = 1;
  526. }
  527. qla2100_fw_dump_failed:
  528. if (!hardware_locked)
  529. spin_unlock_irqrestore(&ha->hardware_lock, flags);
  530. }
  531. void
  532. qla24xx_fw_dump(scsi_qla_host_t *ha, int hardware_locked)
  533. {
  534. int rval;
  535. uint32_t cnt, timer;
  536. uint32_t risc_address;
  537. uint16_t mb[4], wd;
  538. uint32_t stat;
  539. struct device_reg_24xx __iomem *reg = &ha->iobase->isp24;
  540. uint32_t __iomem *dmp_reg;
  541. uint32_t *iter_reg;
  542. uint16_t __iomem *mbx_reg;
  543. unsigned long flags;
  544. struct qla24xx_fw_dump *fw;
  545. uint32_t ext_mem_cnt;
  546. void *eft;
  547. risc_address = ext_mem_cnt = 0;
  548. memset(mb, 0, sizeof(mb));
  549. flags = 0;
  550. if (!hardware_locked)
  551. spin_lock_irqsave(&ha->hardware_lock, flags);
  552. if (!ha->fw_dump) {
  553. qla_printk(KERN_WARNING, ha,
  554. "No buffer available for dump!!!\n");
  555. goto qla24xx_fw_dump_failed;
  556. }
  557. if (ha->fw_dumped) {
  558. qla_printk(KERN_WARNING, ha,
  559. "Firmware has been previously dumped (%p) -- ignoring "
  560. "request...\n", ha->fw_dump);
  561. goto qla24xx_fw_dump_failed;
  562. }
  563. fw = &ha->fw_dump->isp.isp24;
  564. qla2xxx_prep_dump(ha, ha->fw_dump);
  565. rval = QLA_SUCCESS;
  566. fw->host_status = htonl(RD_REG_DWORD(&reg->host_status));
  567. /* Pause RISC. */
  568. if ((RD_REG_DWORD(&reg->hccr) & HCCRX_RISC_PAUSE) == 0) {
  569. WRT_REG_DWORD(&reg->hccr, HCCRX_SET_RISC_RESET |
  570. HCCRX_CLR_HOST_INT);
  571. RD_REG_DWORD(&reg->hccr); /* PCI Posting. */
  572. WRT_REG_DWORD(&reg->hccr, HCCRX_SET_RISC_PAUSE);
  573. for (cnt = 30000;
  574. (RD_REG_DWORD(&reg->hccr) & HCCRX_RISC_PAUSE) == 0 &&
  575. rval == QLA_SUCCESS; cnt--) {
  576. if (cnt)
  577. udelay(100);
  578. else
  579. rval = QLA_FUNCTION_TIMEOUT;
  580. }
  581. }
  582. if (rval == QLA_SUCCESS) {
  583. /* Host interface registers. */
  584. dmp_reg = (uint32_t __iomem *)(reg + 0);
  585. for (cnt = 0; cnt < sizeof(fw->host_reg) / 4; cnt++)
  586. fw->host_reg[cnt] = htonl(RD_REG_DWORD(dmp_reg++));
  587. /* Disable interrupts. */
  588. WRT_REG_DWORD(&reg->ictrl, 0);
  589. RD_REG_DWORD(&reg->ictrl);
  590. /* Shadow registers. */
  591. WRT_REG_DWORD(&reg->iobase_addr, 0x0F70);
  592. RD_REG_DWORD(&reg->iobase_addr);
  593. dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xF0);
  594. WRT_REG_DWORD(dmp_reg, 0xB0000000);
  595. dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xFC);
  596. fw->shadow_reg[0] = htonl(RD_REG_DWORD(dmp_reg));
  597. dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xF0);
  598. WRT_REG_DWORD(dmp_reg, 0xB0100000);
  599. dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xFC);
  600. fw->shadow_reg[1] = htonl(RD_REG_DWORD(dmp_reg));
  601. dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xF0);
  602. WRT_REG_DWORD(dmp_reg, 0xB0200000);
  603. dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xFC);
  604. fw->shadow_reg[2] = htonl(RD_REG_DWORD(dmp_reg));
  605. dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xF0);
  606. WRT_REG_DWORD(dmp_reg, 0xB0300000);
  607. dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xFC);
  608. fw->shadow_reg[3] = htonl(RD_REG_DWORD(dmp_reg));
  609. dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xF0);
  610. WRT_REG_DWORD(dmp_reg, 0xB0400000);
  611. dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xFC);
  612. fw->shadow_reg[4] = htonl(RD_REG_DWORD(dmp_reg));
  613. dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xF0);
  614. WRT_REG_DWORD(dmp_reg, 0xB0500000);
  615. dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xFC);
  616. fw->shadow_reg[5] = htonl(RD_REG_DWORD(dmp_reg));
  617. dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xF0);
  618. WRT_REG_DWORD(dmp_reg, 0xB0600000);
  619. dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xFC);
  620. fw->shadow_reg[6] = htonl(RD_REG_DWORD(dmp_reg));
  621. /* Mailbox registers. */
  622. mbx_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80);
  623. for (cnt = 0; cnt < sizeof(fw->mailbox_reg) / 2; cnt++)
  624. fw->mailbox_reg[cnt] = htons(RD_REG_WORD(mbx_reg++));
  625. /* Transfer sequence registers. */
  626. iter_reg = fw->xseq_gp_reg;
  627. WRT_REG_DWORD(&reg->iobase_addr, 0xBF00);
  628. dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
  629. for (cnt = 0; cnt < 16; cnt++)
  630. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  631. WRT_REG_DWORD(&reg->iobase_addr, 0xBF10);
  632. dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
  633. for (cnt = 0; cnt < 16; cnt++)
  634. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  635. WRT_REG_DWORD(&reg->iobase_addr, 0xBF20);
  636. dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
  637. for (cnt = 0; cnt < 16; cnt++)
  638. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  639. WRT_REG_DWORD(&reg->iobase_addr, 0xBF30);
  640. dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
  641. for (cnt = 0; cnt < 16; cnt++)
  642. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  643. WRT_REG_DWORD(&reg->iobase_addr, 0xBF40);
  644. dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
  645. for (cnt = 0; cnt < 16; cnt++)
  646. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  647. WRT_REG_DWORD(&reg->iobase_addr, 0xBF50);
  648. dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
  649. for (cnt = 0; cnt < 16; cnt++)
  650. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  651. WRT_REG_DWORD(&reg->iobase_addr, 0xBF60);
  652. dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
  653. for (cnt = 0; cnt < 16; cnt++)
  654. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  655. WRT_REG_DWORD(&reg->iobase_addr, 0xBF70);
  656. dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
  657. for (cnt = 0; cnt < 16; cnt++)
  658. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  659. WRT_REG_DWORD(&reg->iobase_addr, 0xBFE0);
  660. dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
  661. for (cnt = 0; cnt < sizeof(fw->xseq_0_reg) / 4; cnt++)
  662. fw->xseq_0_reg[cnt] = htonl(RD_REG_DWORD(dmp_reg++));
  663. WRT_REG_DWORD(&reg->iobase_addr, 0xBFF0);
  664. dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
  665. for (cnt = 0; cnt < sizeof(fw->xseq_1_reg) / 4; cnt++)
  666. fw->xseq_1_reg[cnt] = htonl(RD_REG_DWORD(dmp_reg++));
  667. /* Receive sequence registers. */
  668. iter_reg = fw->rseq_gp_reg;
  669. WRT_REG_DWORD(&reg->iobase_addr, 0xFF00);
  670. dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
  671. for (cnt = 0; cnt < 16; cnt++)
  672. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  673. WRT_REG_DWORD(&reg->iobase_addr, 0xFF10);
  674. dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
  675. for (cnt = 0; cnt < 16; cnt++)
  676. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  677. WRT_REG_DWORD(&reg->iobase_addr, 0xFF20);
  678. dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
  679. for (cnt = 0; cnt < 16; cnt++)
  680. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  681. WRT_REG_DWORD(&reg->iobase_addr, 0xFF30);
  682. dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
  683. for (cnt = 0; cnt < 16; cnt++)
  684. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  685. WRT_REG_DWORD(&reg->iobase_addr, 0xFF40);
  686. dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
  687. for (cnt = 0; cnt < 16; cnt++)
  688. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  689. WRT_REG_DWORD(&reg->iobase_addr, 0xFF50);
  690. dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
  691. for (cnt = 0; cnt < 16; cnt++)
  692. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  693. WRT_REG_DWORD(&reg->iobase_addr, 0xFF60);
  694. dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
  695. for (cnt = 0; cnt < 16; cnt++)
  696. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  697. WRT_REG_DWORD(&reg->iobase_addr, 0xFF70);
  698. dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
  699. for (cnt = 0; cnt < 16; cnt++)
  700. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  701. WRT_REG_DWORD(&reg->iobase_addr, 0xFFD0);
  702. dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
  703. for (cnt = 0; cnt < sizeof(fw->rseq_0_reg) / 4; cnt++)
  704. fw->rseq_0_reg[cnt] = htonl(RD_REG_DWORD(dmp_reg++));
  705. WRT_REG_DWORD(&reg->iobase_addr, 0xFFE0);
  706. dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
  707. for (cnt = 0; cnt < sizeof(fw->rseq_1_reg) / 4; cnt++)
  708. fw->rseq_1_reg[cnt] = htonl(RD_REG_DWORD(dmp_reg++));
  709. WRT_REG_DWORD(&reg->iobase_addr, 0xFFF0);
  710. dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
  711. for (cnt = 0; cnt < sizeof(fw->rseq_2_reg) / 4; cnt++)
  712. fw->rseq_2_reg[cnt] = htonl(RD_REG_DWORD(dmp_reg++));
  713. /* Command DMA registers. */
  714. WRT_REG_DWORD(&reg->iobase_addr, 0x7100);
  715. dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
  716. for (cnt = 0; cnt < sizeof(fw->cmd_dma_reg) / 4; cnt++)
  717. fw->cmd_dma_reg[cnt] = htonl(RD_REG_DWORD(dmp_reg++));
  718. /* Queues. */
  719. iter_reg = fw->req0_dma_reg;
  720. WRT_REG_DWORD(&reg->iobase_addr, 0x7200);
  721. dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
  722. for (cnt = 0; cnt < 8; cnt++)
  723. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  724. dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xE4);
  725. for (cnt = 0; cnt < 7; cnt++)
  726. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  727. iter_reg = fw->resp0_dma_reg;
  728. WRT_REG_DWORD(&reg->iobase_addr, 0x7300);
  729. dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
  730. for (cnt = 0; cnt < 8; cnt++)
  731. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  732. dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xE4);
  733. for (cnt = 0; cnt < 7; cnt++)
  734. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  735. iter_reg = fw->req1_dma_reg;
  736. WRT_REG_DWORD(&reg->iobase_addr, 0x7400);
  737. dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
  738. for (cnt = 0; cnt < 8; cnt++)
  739. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  740. dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xE4);
  741. for (cnt = 0; cnt < 7; cnt++)
  742. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  743. /* Transmit DMA registers. */
  744. iter_reg = fw->xmt0_dma_reg;
  745. WRT_REG_DWORD(&reg->iobase_addr, 0x7600);
  746. dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
  747. for (cnt = 0; cnt < 16; cnt++)
  748. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  749. WRT_REG_DWORD(&reg->iobase_addr, 0x7610);
  750. dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
  751. for (cnt = 0; cnt < 16; cnt++)
  752. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  753. iter_reg = fw->xmt1_dma_reg;
  754. WRT_REG_DWORD(&reg->iobase_addr, 0x7620);
  755. dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
  756. for (cnt = 0; cnt < 16; cnt++)
  757. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  758. WRT_REG_DWORD(&reg->iobase_addr, 0x7630);
  759. dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
  760. for (cnt = 0; cnt < 16; cnt++)
  761. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  762. iter_reg = fw->xmt2_dma_reg;
  763. WRT_REG_DWORD(&reg->iobase_addr, 0x7640);
  764. dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
  765. for (cnt = 0; cnt < 16; cnt++)
  766. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  767. WRT_REG_DWORD(&reg->iobase_addr, 0x7650);
  768. dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
  769. for (cnt = 0; cnt < 16; cnt++)
  770. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  771. iter_reg = fw->xmt3_dma_reg;
  772. WRT_REG_DWORD(&reg->iobase_addr, 0x7660);
  773. dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
  774. for (cnt = 0; cnt < 16; cnt++)
  775. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  776. WRT_REG_DWORD(&reg->iobase_addr, 0x7670);
  777. dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
  778. for (cnt = 0; cnt < 16; cnt++)
  779. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  780. iter_reg = fw->xmt4_dma_reg;
  781. WRT_REG_DWORD(&reg->iobase_addr, 0x7680);
  782. dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
  783. for (cnt = 0; cnt < 16; cnt++)
  784. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  785. WRT_REG_DWORD(&reg->iobase_addr, 0x7690);
  786. dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
  787. for (cnt = 0; cnt < 16; cnt++)
  788. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  789. WRT_REG_DWORD(&reg->iobase_addr, 0x76A0);
  790. dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
  791. for (cnt = 0; cnt < sizeof(fw->xmt_data_dma_reg) / 4; cnt++)
  792. fw->xmt_data_dma_reg[cnt] =
  793. htonl(RD_REG_DWORD(dmp_reg++));
  794. /* Receive DMA registers. */
  795. iter_reg = fw->rcvt0_data_dma_reg;
  796. WRT_REG_DWORD(&reg->iobase_addr, 0x7700);
  797. dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
  798. for (cnt = 0; cnt < 16; cnt++)
  799. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  800. WRT_REG_DWORD(&reg->iobase_addr, 0x7710);
  801. dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
  802. for (cnt = 0; cnt < 16; cnt++)
  803. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  804. iter_reg = fw->rcvt1_data_dma_reg;
  805. WRT_REG_DWORD(&reg->iobase_addr, 0x7720);
  806. dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
  807. for (cnt = 0; cnt < 16; cnt++)
  808. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  809. WRT_REG_DWORD(&reg->iobase_addr, 0x7730);
  810. dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
  811. for (cnt = 0; cnt < 16; cnt++)
  812. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  813. /* RISC registers. */
  814. iter_reg = fw->risc_gp_reg;
  815. WRT_REG_DWORD(&reg->iobase_addr, 0x0F00);
  816. dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
  817. for (cnt = 0; cnt < 16; cnt++)
  818. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  819. WRT_REG_DWORD(&reg->iobase_addr, 0x0F10);
  820. dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
  821. for (cnt = 0; cnt < 16; cnt++)
  822. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  823. WRT_REG_DWORD(&reg->iobase_addr, 0x0F20);
  824. dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
  825. for (cnt = 0; cnt < 16; cnt++)
  826. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  827. WRT_REG_DWORD(&reg->iobase_addr, 0x0F30);
  828. dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
  829. for (cnt = 0; cnt < 16; cnt++)
  830. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  831. WRT_REG_DWORD(&reg->iobase_addr, 0x0F40);
  832. dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
  833. for (cnt = 0; cnt < 16; cnt++)
  834. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  835. WRT_REG_DWORD(&reg->iobase_addr, 0x0F50);
  836. dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
  837. for (cnt = 0; cnt < 16; cnt++)
  838. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  839. WRT_REG_DWORD(&reg->iobase_addr, 0x0F60);
  840. dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
  841. for (cnt = 0; cnt < 16; cnt++)
  842. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  843. WRT_REG_DWORD(&reg->iobase_addr, 0x0F70);
  844. dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
  845. for (cnt = 0; cnt < 16; cnt++)
  846. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  847. /* Local memory controller registers. */
  848. iter_reg = fw->lmc_reg;
  849. WRT_REG_DWORD(&reg->iobase_addr, 0x3000);
  850. dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
  851. for (cnt = 0; cnt < 16; cnt++)
  852. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  853. WRT_REG_DWORD(&reg->iobase_addr, 0x3010);
  854. dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
  855. for (cnt = 0; cnt < 16; cnt++)
  856. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  857. WRT_REG_DWORD(&reg->iobase_addr, 0x3020);
  858. dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
  859. for (cnt = 0; cnt < 16; cnt++)
  860. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  861. WRT_REG_DWORD(&reg->iobase_addr, 0x3030);
  862. dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
  863. for (cnt = 0; cnt < 16; cnt++)
  864. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  865. WRT_REG_DWORD(&reg->iobase_addr, 0x3040);
  866. dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
  867. for (cnt = 0; cnt < 16; cnt++)
  868. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  869. WRT_REG_DWORD(&reg->iobase_addr, 0x3050);
  870. dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
  871. for (cnt = 0; cnt < 16; cnt++)
  872. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  873. WRT_REG_DWORD(&reg->iobase_addr, 0x3060);
  874. dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
  875. for (cnt = 0; cnt < 16; cnt++)
  876. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  877. /* Fibre Protocol Module registers. */
  878. iter_reg = fw->fpm_hdw_reg;
  879. WRT_REG_DWORD(&reg->iobase_addr, 0x4000);
  880. dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
  881. for (cnt = 0; cnt < 16; cnt++)
  882. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  883. WRT_REG_DWORD(&reg->iobase_addr, 0x4010);
  884. dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
  885. for (cnt = 0; cnt < 16; cnt++)
  886. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  887. WRT_REG_DWORD(&reg->iobase_addr, 0x4020);
  888. dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
  889. for (cnt = 0; cnt < 16; cnt++)
  890. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  891. WRT_REG_DWORD(&reg->iobase_addr, 0x4030);
  892. dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
  893. for (cnt = 0; cnt < 16; cnt++)
  894. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  895. WRT_REG_DWORD(&reg->iobase_addr, 0x4040);
  896. dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
  897. for (cnt = 0; cnt < 16; cnt++)
  898. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  899. WRT_REG_DWORD(&reg->iobase_addr, 0x4050);
  900. dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
  901. for (cnt = 0; cnt < 16; cnt++)
  902. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  903. WRT_REG_DWORD(&reg->iobase_addr, 0x4060);
  904. dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
  905. for (cnt = 0; cnt < 16; cnt++)
  906. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  907. WRT_REG_DWORD(&reg->iobase_addr, 0x4070);
  908. dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
  909. for (cnt = 0; cnt < 16; cnt++)
  910. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  911. WRT_REG_DWORD(&reg->iobase_addr, 0x4080);
  912. dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
  913. for (cnt = 0; cnt < 16; cnt++)
  914. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  915. WRT_REG_DWORD(&reg->iobase_addr, 0x4090);
  916. dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
  917. for (cnt = 0; cnt < 16; cnt++)
  918. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  919. WRT_REG_DWORD(&reg->iobase_addr, 0x40A0);
  920. dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
  921. for (cnt = 0; cnt < 16; cnt++)
  922. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  923. WRT_REG_DWORD(&reg->iobase_addr, 0x40B0);
  924. dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
  925. for (cnt = 0; cnt < 16; cnt++)
  926. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  927. /* Frame Buffer registers. */
  928. iter_reg = fw->fb_hdw_reg;
  929. WRT_REG_DWORD(&reg->iobase_addr, 0x6000);
  930. dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
  931. for (cnt = 0; cnt < 16; cnt++)
  932. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  933. WRT_REG_DWORD(&reg->iobase_addr, 0x6010);
  934. dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
  935. for (cnt = 0; cnt < 16; cnt++)
  936. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  937. WRT_REG_DWORD(&reg->iobase_addr, 0x6020);
  938. dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
  939. for (cnt = 0; cnt < 16; cnt++)
  940. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  941. WRT_REG_DWORD(&reg->iobase_addr, 0x6030);
  942. dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
  943. for (cnt = 0; cnt < 16; cnt++)
  944. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  945. WRT_REG_DWORD(&reg->iobase_addr, 0x6040);
  946. dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
  947. for (cnt = 0; cnt < 16; cnt++)
  948. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  949. WRT_REG_DWORD(&reg->iobase_addr, 0x6100);
  950. dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
  951. for (cnt = 0; cnt < 16; cnt++)
  952. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  953. WRT_REG_DWORD(&reg->iobase_addr, 0x6130);
  954. dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
  955. for (cnt = 0; cnt < 16; cnt++)
  956. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  957. WRT_REG_DWORD(&reg->iobase_addr, 0x6150);
  958. dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
  959. for (cnt = 0; cnt < 16; cnt++)
  960. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  961. WRT_REG_DWORD(&reg->iobase_addr, 0x6170);
  962. dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
  963. for (cnt = 0; cnt < 16; cnt++)
  964. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  965. WRT_REG_DWORD(&reg->iobase_addr, 0x6190);
  966. dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
  967. for (cnt = 0; cnt < 16; cnt++)
  968. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  969. WRT_REG_DWORD(&reg->iobase_addr, 0x61B0);
  970. dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0);
  971. for (cnt = 0; cnt < 16; cnt++)
  972. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  973. /* Reset RISC. */
  974. WRT_REG_DWORD(&reg->ctrl_status,
  975. CSRX_DMA_SHUTDOWN|MWB_4096_BYTES);
  976. for (cnt = 0; cnt < 30000; cnt++) {
  977. if ((RD_REG_DWORD(&reg->ctrl_status) &
  978. CSRX_DMA_ACTIVE) == 0)
  979. break;
  980. udelay(10);
  981. }
  982. WRT_REG_DWORD(&reg->ctrl_status,
  983. CSRX_ISP_SOFT_RESET|CSRX_DMA_SHUTDOWN|MWB_4096_BYTES);
  984. pci_read_config_word(ha->pdev, PCI_COMMAND, &wd);
  985. udelay(100);
  986. /* Wait for firmware to complete NVRAM accesses. */
  987. mb[0] = (uint32_t) RD_REG_WORD(&reg->mailbox0);
  988. for (cnt = 10000 ; cnt && mb[0]; cnt--) {
  989. udelay(5);
  990. mb[0] = (uint32_t) RD_REG_WORD(&reg->mailbox0);
  991. barrier();
  992. }
  993. /* Wait for soft-reset to complete. */
  994. for (cnt = 0; cnt < 30000; cnt++) {
  995. if ((RD_REG_DWORD(&reg->ctrl_status) &
  996. CSRX_ISP_SOFT_RESET) == 0)
  997. break;
  998. udelay(10);
  999. }
  1000. WRT_REG_DWORD(&reg->hccr, HCCRX_CLR_RISC_RESET);
  1001. RD_REG_DWORD(&reg->hccr); /* PCI Posting. */
  1002. }
  1003. for (cnt = 30000; RD_REG_WORD(&reg->mailbox0) != 0 &&
  1004. rval == QLA_SUCCESS; cnt--) {
  1005. if (cnt)
  1006. udelay(100);
  1007. else
  1008. rval = QLA_FUNCTION_TIMEOUT;
  1009. }
  1010. /* Memory. */
  1011. if (rval == QLA_SUCCESS) {
  1012. /* Code RAM. */
  1013. risc_address = 0x20000;
  1014. WRT_REG_WORD(&reg->mailbox0, MBC_READ_RAM_EXTENDED);
  1015. clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);
  1016. }
  1017. for (cnt = 0; cnt < sizeof(fw->code_ram) / 4 && rval == QLA_SUCCESS;
  1018. cnt++, risc_address++) {
  1019. WRT_REG_WORD(&reg->mailbox1, LSW(risc_address));
  1020. WRT_REG_WORD(&reg->mailbox8, MSW(risc_address));
  1021. RD_REG_WORD(&reg->mailbox8);
  1022. WRT_REG_DWORD(&reg->hccr, HCCRX_SET_HOST_INT);
  1023. for (timer = 6000000; timer; timer--) {
  1024. /* Check for pending interrupts. */
  1025. stat = RD_REG_DWORD(&reg->host_status);
  1026. if (stat & HSRX_RISC_INT) {
  1027. stat &= 0xff;
  1028. if (stat == 0x1 || stat == 0x2 ||
  1029. stat == 0x10 || stat == 0x11) {
  1030. set_bit(MBX_INTERRUPT,
  1031. &ha->mbx_cmd_flags);
  1032. mb[0] = RD_REG_WORD(&reg->mailbox0);
  1033. mb[2] = RD_REG_WORD(&reg->mailbox2);
  1034. mb[3] = RD_REG_WORD(&reg->mailbox3);
  1035. WRT_REG_DWORD(&reg->hccr,
  1036. HCCRX_CLR_RISC_INT);
  1037. RD_REG_DWORD(&reg->hccr);
  1038. break;
  1039. }
  1040. /* Clear this intr; it wasn't a mailbox intr */
  1041. WRT_REG_DWORD(&reg->hccr, HCCRX_CLR_RISC_INT);
  1042. RD_REG_DWORD(&reg->hccr);
  1043. }
  1044. udelay(5);
  1045. }
  1046. if (test_and_clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags)) {
  1047. rval = mb[0] & MBS_MASK;
  1048. fw->code_ram[cnt] = htonl((mb[3] << 16) | mb[2]);
  1049. } else {
  1050. rval = QLA_FUNCTION_FAILED;
  1051. }
  1052. }
  1053. if (rval == QLA_SUCCESS) {
  1054. /* External Memory. */
  1055. risc_address = 0x100000;
  1056. ext_mem_cnt = ha->fw_memory_size - 0x100000 + 1;
  1057. WRT_REG_WORD(&reg->mailbox0, MBC_READ_RAM_EXTENDED);
  1058. clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);
  1059. }
  1060. for (cnt = 0; cnt < ext_mem_cnt && rval == QLA_SUCCESS;
  1061. cnt++, risc_address++) {
  1062. WRT_REG_WORD(&reg->mailbox1, LSW(risc_address));
  1063. WRT_REG_WORD(&reg->mailbox8, MSW(risc_address));
  1064. RD_REG_WORD(&reg->mailbox8);
  1065. WRT_REG_DWORD(&reg->hccr, HCCRX_SET_HOST_INT);
  1066. for (timer = 6000000; timer; timer--) {
  1067. /* Check for pending interrupts. */
  1068. stat = RD_REG_DWORD(&reg->host_status);
  1069. if (stat & HSRX_RISC_INT) {
  1070. stat &= 0xff;
  1071. if (stat == 0x1 || stat == 0x2 ||
  1072. stat == 0x10 || stat == 0x11) {
  1073. set_bit(MBX_INTERRUPT,
  1074. &ha->mbx_cmd_flags);
  1075. mb[0] = RD_REG_WORD(&reg->mailbox0);
  1076. mb[2] = RD_REG_WORD(&reg->mailbox2);
  1077. mb[3] = RD_REG_WORD(&reg->mailbox3);
  1078. WRT_REG_DWORD(&reg->hccr,
  1079. HCCRX_CLR_RISC_INT);
  1080. RD_REG_DWORD(&reg->hccr);
  1081. break;
  1082. }
  1083. /* Clear this intr; it wasn't a mailbox intr */
  1084. WRT_REG_DWORD(&reg->hccr, HCCRX_CLR_RISC_INT);
  1085. RD_REG_DWORD(&reg->hccr);
  1086. }
  1087. udelay(5);
  1088. }
  1089. if (test_and_clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags)) {
  1090. rval = mb[0] & MBS_MASK;
  1091. fw->ext_mem[cnt] = htonl((mb[3] << 16) | mb[2]);
  1092. } else {
  1093. rval = QLA_FUNCTION_FAILED;
  1094. }
  1095. }
  1096. if (rval == QLA_SUCCESS) {
  1097. eft = qla2xxx_copy_queues(ha, &fw->ext_mem[cnt]);
  1098. if (ha->eft)
  1099. memcpy(eft, ha->eft, ntohl(ha->fw_dump->eft_size));
  1100. }
  1101. if (rval != QLA_SUCCESS) {
  1102. qla_printk(KERN_WARNING, ha,
  1103. "Failed to dump firmware (%x)!!!\n", rval);
  1104. ha->fw_dumped = 0;
  1105. } else {
  1106. qla_printk(KERN_INFO, ha,
  1107. "Firmware dump saved to temp buffer (%ld/%p).\n",
  1108. ha->host_no, ha->fw_dump);
  1109. ha->fw_dumped = 1;
  1110. }
  1111. qla24xx_fw_dump_failed:
  1112. if (!hardware_locked)
  1113. spin_unlock_irqrestore(&ha->hardware_lock, flags);
  1114. }
  1115. /****************************************************************************/
  1116. /* Driver Debug Functions. */
  1117. /****************************************************************************/
  1118. void
  1119. qla2x00_dump_regs(scsi_qla_host_t *ha)
  1120. {
  1121. struct device_reg_2xxx __iomem *reg = &ha->iobase->isp;
  1122. printk("Mailbox registers:\n");
  1123. printk("scsi(%ld): mbox 0 0x%04x \n",
  1124. ha->host_no, RD_MAILBOX_REG(ha, reg, 0));
  1125. printk("scsi(%ld): mbox 1 0x%04x \n",
  1126. ha->host_no, RD_MAILBOX_REG(ha, reg, 1));
  1127. printk("scsi(%ld): mbox 2 0x%04x \n",
  1128. ha->host_no, RD_MAILBOX_REG(ha, reg, 2));
  1129. printk("scsi(%ld): mbox 3 0x%04x \n",
  1130. ha->host_no, RD_MAILBOX_REG(ha, reg, 3));
  1131. printk("scsi(%ld): mbox 4 0x%04x \n",
  1132. ha->host_no, RD_MAILBOX_REG(ha, reg, 4));
  1133. printk("scsi(%ld): mbox 5 0x%04x \n",
  1134. ha->host_no, RD_MAILBOX_REG(ha, reg, 5));
  1135. }
  1136. void
  1137. qla2x00_dump_buffer(uint8_t * b, uint32_t size)
  1138. {
  1139. uint32_t cnt;
  1140. uint8_t c;
  1141. printk(" 0 1 2 3 4 5 6 7 8 9 "
  1142. "Ah Bh Ch Dh Eh Fh\n");
  1143. printk("----------------------------------------"
  1144. "----------------------\n");
  1145. for (cnt = 0; cnt < size;) {
  1146. c = *b++;
  1147. printk("%02x",(uint32_t) c);
  1148. cnt++;
  1149. if (!(cnt % 16))
  1150. printk("\n");
  1151. else
  1152. printk(" ");
  1153. }
  1154. if (cnt % 16)
  1155. printk("\n");
  1156. }
  1157. /**************************************************************************
  1158. * qla2x00_print_scsi_cmd
  1159. * Dumps out info about the scsi cmd and srb.
  1160. * Input
  1161. * cmd : struct scsi_cmnd
  1162. **************************************************************************/
  1163. void
  1164. qla2x00_print_scsi_cmd(struct scsi_cmnd * cmd)
  1165. {
  1166. int i;
  1167. struct scsi_qla_host *ha;
  1168. srb_t *sp;
  1169. ha = (struct scsi_qla_host *)cmd->device->host->hostdata;
  1170. sp = (srb_t *) cmd->SCp.ptr;
  1171. printk("SCSI Command @=0x%p, Handle=0x%p\n", cmd, cmd->host_scribble);
  1172. printk(" chan=0x%02x, target=0x%02x, lun=0x%02x, cmd_len=0x%02x\n",
  1173. cmd->device->channel, cmd->device->id, cmd->device->lun,
  1174. cmd->cmd_len);
  1175. printk(" CDB: ");
  1176. for (i = 0; i < cmd->cmd_len; i++) {
  1177. printk("0x%02x ", cmd->cmnd[i]);
  1178. }
  1179. printk("\n seg_cnt=%d, allowed=%d, retries=%d\n",
  1180. cmd->use_sg, cmd->allowed, cmd->retries);
  1181. printk(" request buffer=0x%p, request buffer len=0x%x\n",
  1182. cmd->request_buffer, cmd->request_bufflen);
  1183. printk(" tag=%d, transfersize=0x%x\n",
  1184. cmd->tag, cmd->transfersize);
  1185. printk(" serial_number=%lx, SP=%p\n", cmd->serial_number, sp);
  1186. printk(" data direction=%d\n", cmd->sc_data_direction);
  1187. if (!sp)
  1188. return;
  1189. printk(" sp flags=0x%x\n", sp->flags);
  1190. }
  1191. void
  1192. qla2x00_dump_pkt(void *pkt)
  1193. {
  1194. uint32_t i;
  1195. uint8_t *data = (uint8_t *) pkt;
  1196. for (i = 0; i < 64; i++) {
  1197. if (!(i % 4))
  1198. printk("\n%02x: ", i);
  1199. printk("%02x ", data[i]);
  1200. }
  1201. printk("\n");
  1202. }
  1203. #if defined(QL_DEBUG_ROUTINES)
  1204. /*
  1205. * qla2x00_formatted_dump_buffer
  1206. * Prints string plus buffer.
  1207. *
  1208. * Input:
  1209. * string = Null terminated string (no newline at end).
  1210. * buffer = buffer address.
  1211. * wd_size = word size 8, 16, 32 or 64 bits
  1212. * count = number of words.
  1213. */
  1214. void
  1215. qla2x00_formatted_dump_buffer(char *string, uint8_t * buffer,
  1216. uint8_t wd_size, uint32_t count)
  1217. {
  1218. uint32_t cnt;
  1219. uint16_t *buf16;
  1220. uint32_t *buf32;
  1221. if (strcmp(string, "") != 0)
  1222. printk("%s\n",string);
  1223. switch (wd_size) {
  1224. case 8:
  1225. printk(" 0 1 2 3 4 5 6 7 "
  1226. "8 9 Ah Bh Ch Dh Eh Fh\n");
  1227. printk("-----------------------------------------"
  1228. "-------------------------------------\n");
  1229. for (cnt = 1; cnt <= count; cnt++, buffer++) {
  1230. printk("%02x",*buffer);
  1231. if (cnt % 16 == 0)
  1232. printk("\n");
  1233. else
  1234. printk(" ");
  1235. }
  1236. if (cnt % 16 != 0)
  1237. printk("\n");
  1238. break;
  1239. case 16:
  1240. printk(" 0 2 4 6 8 Ah "
  1241. " Ch Eh\n");
  1242. printk("-----------------------------------------"
  1243. "-------------\n");
  1244. buf16 = (uint16_t *) buffer;
  1245. for (cnt = 1; cnt <= count; cnt++, buf16++) {
  1246. printk("%4x",*buf16);
  1247. if (cnt % 8 == 0)
  1248. printk("\n");
  1249. else if (*buf16 < 10)
  1250. printk(" ");
  1251. else
  1252. printk(" ");
  1253. }
  1254. if (cnt % 8 != 0)
  1255. printk("\n");
  1256. break;
  1257. case 32:
  1258. printk(" 0 4 8 Ch\n");
  1259. printk("------------------------------------------\n");
  1260. buf32 = (uint32_t *) buffer;
  1261. for (cnt = 1; cnt <= count; cnt++, buf32++) {
  1262. printk("%8x", *buf32);
  1263. if (cnt % 4 == 0)
  1264. printk("\n");
  1265. else if (*buf32 < 10)
  1266. printk(" ");
  1267. else
  1268. printk(" ");
  1269. }
  1270. if (cnt % 4 != 0)
  1271. printk("\n");
  1272. break;
  1273. default:
  1274. break;
  1275. }
  1276. }
  1277. #endif