qla_dbg.c 65 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227
  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. static int
  34. qla2xxx_dump_memory(scsi_qla_host_t *ha, uint32_t *code_ram,
  35. uint32_t cram_size, uint32_t *ext_mem, void **nxt)
  36. {
  37. int rval;
  38. uint32_t cnt, stat, timer, risc_address, ext_mem_cnt;
  39. uint16_t mb[4];
  40. struct device_reg_24xx __iomem *reg = &ha->iobase->isp24;
  41. rval = QLA_SUCCESS;
  42. risc_address = ext_mem_cnt = 0;
  43. memset(mb, 0, sizeof(mb));
  44. /* Code RAM. */
  45. risc_address = 0x20000;
  46. WRT_REG_WORD(&reg->mailbox0, MBC_READ_RAM_EXTENDED);
  47. clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);
  48. for (cnt = 0; cnt < cram_size / 4 && rval == QLA_SUCCESS;
  49. cnt++, risc_address++) {
  50. WRT_REG_WORD(&reg->mailbox1, LSW(risc_address));
  51. WRT_REG_WORD(&reg->mailbox8, MSW(risc_address));
  52. RD_REG_WORD(&reg->mailbox8);
  53. WRT_REG_DWORD(&reg->hccr, HCCRX_SET_HOST_INT);
  54. for (timer = 6000000; timer; timer--) {
  55. /* Check for pending interrupts. */
  56. stat = RD_REG_DWORD(&reg->host_status);
  57. if (stat & HSRX_RISC_INT) {
  58. stat &= 0xff;
  59. if (stat == 0x1 || stat == 0x2 ||
  60. stat == 0x10 || stat == 0x11) {
  61. set_bit(MBX_INTERRUPT,
  62. &ha->mbx_cmd_flags);
  63. mb[0] = RD_REG_WORD(&reg->mailbox0);
  64. mb[2] = RD_REG_WORD(&reg->mailbox2);
  65. mb[3] = RD_REG_WORD(&reg->mailbox3);
  66. WRT_REG_DWORD(&reg->hccr,
  67. HCCRX_CLR_RISC_INT);
  68. RD_REG_DWORD(&reg->hccr);
  69. break;
  70. }
  71. /* Clear this intr; it wasn't a mailbox intr */
  72. WRT_REG_DWORD(&reg->hccr, HCCRX_CLR_RISC_INT);
  73. RD_REG_DWORD(&reg->hccr);
  74. }
  75. udelay(5);
  76. }
  77. if (test_and_clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags)) {
  78. rval = mb[0] & MBS_MASK;
  79. code_ram[cnt] = htonl((mb[3] << 16) | mb[2]);
  80. } else {
  81. rval = QLA_FUNCTION_FAILED;
  82. }
  83. }
  84. if (rval == QLA_SUCCESS) {
  85. /* External Memory. */
  86. risc_address = 0x100000;
  87. ext_mem_cnt = ha->fw_memory_size - 0x100000 + 1;
  88. WRT_REG_WORD(&reg->mailbox0, MBC_READ_RAM_EXTENDED);
  89. clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);
  90. }
  91. for (cnt = 0; cnt < ext_mem_cnt && rval == QLA_SUCCESS;
  92. cnt++, risc_address++) {
  93. WRT_REG_WORD(&reg->mailbox1, LSW(risc_address));
  94. WRT_REG_WORD(&reg->mailbox8, MSW(risc_address));
  95. RD_REG_WORD(&reg->mailbox8);
  96. WRT_REG_DWORD(&reg->hccr, HCCRX_SET_HOST_INT);
  97. for (timer = 6000000; timer; timer--) {
  98. /* Check for pending interrupts. */
  99. stat = RD_REG_DWORD(&reg->host_status);
  100. if (stat & HSRX_RISC_INT) {
  101. stat &= 0xff;
  102. if (stat == 0x1 || stat == 0x2 ||
  103. stat == 0x10 || stat == 0x11) {
  104. set_bit(MBX_INTERRUPT,
  105. &ha->mbx_cmd_flags);
  106. mb[0] = RD_REG_WORD(&reg->mailbox0);
  107. mb[2] = RD_REG_WORD(&reg->mailbox2);
  108. mb[3] = RD_REG_WORD(&reg->mailbox3);
  109. WRT_REG_DWORD(&reg->hccr,
  110. HCCRX_CLR_RISC_INT);
  111. RD_REG_DWORD(&reg->hccr);
  112. break;
  113. }
  114. /* Clear this intr; it wasn't a mailbox intr */
  115. WRT_REG_DWORD(&reg->hccr, HCCRX_CLR_RISC_INT);
  116. RD_REG_DWORD(&reg->hccr);
  117. }
  118. udelay(5);
  119. }
  120. if (test_and_clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags)) {
  121. rval = mb[0] & MBS_MASK;
  122. ext_mem[cnt] = htonl((mb[3] << 16) | mb[2]);
  123. } else {
  124. rval = QLA_FUNCTION_FAILED;
  125. }
  126. }
  127. *nxt = rval == QLA_SUCCESS ? &ext_mem[cnt]: NULL;
  128. return rval;
  129. }
  130. /**
  131. * qla2300_fw_dump() - Dumps binary data from the 2300 firmware.
  132. * @ha: HA context
  133. * @hardware_locked: Called with the hardware_lock
  134. */
  135. void
  136. qla2300_fw_dump(scsi_qla_host_t *ha, int hardware_locked)
  137. {
  138. int rval;
  139. uint32_t cnt, timer;
  140. uint32_t risc_address;
  141. uint16_t mb0, mb2;
  142. uint32_t stat;
  143. struct device_reg_2xxx __iomem *reg = &ha->iobase->isp;
  144. uint16_t __iomem *dmp_reg;
  145. unsigned long flags;
  146. struct qla2300_fw_dump *fw;
  147. uint32_t data_ram_cnt;
  148. risc_address = data_ram_cnt = 0;
  149. mb0 = mb2 = 0;
  150. flags = 0;
  151. if (!hardware_locked)
  152. spin_lock_irqsave(&ha->hardware_lock, flags);
  153. if (!ha->fw_dump) {
  154. qla_printk(KERN_WARNING, ha,
  155. "No buffer available for dump!!!\n");
  156. goto qla2300_fw_dump_failed;
  157. }
  158. if (ha->fw_dumped) {
  159. qla_printk(KERN_WARNING, ha,
  160. "Firmware has been previously dumped (%p) -- ignoring "
  161. "request...\n", ha->fw_dump);
  162. goto qla2300_fw_dump_failed;
  163. }
  164. fw = &ha->fw_dump->isp.isp23;
  165. qla2xxx_prep_dump(ha, ha->fw_dump);
  166. rval = QLA_SUCCESS;
  167. fw->hccr = htons(RD_REG_WORD(&reg->hccr));
  168. /* Pause RISC. */
  169. WRT_REG_WORD(&reg->hccr, HCCR_PAUSE_RISC);
  170. if (IS_QLA2300(ha)) {
  171. for (cnt = 30000;
  172. (RD_REG_WORD(&reg->hccr) & HCCR_RISC_PAUSE) == 0 &&
  173. rval == QLA_SUCCESS; cnt--) {
  174. if (cnt)
  175. udelay(100);
  176. else
  177. rval = QLA_FUNCTION_TIMEOUT;
  178. }
  179. } else {
  180. RD_REG_WORD(&reg->hccr); /* PCI Posting. */
  181. udelay(10);
  182. }
  183. if (rval == QLA_SUCCESS) {
  184. dmp_reg = (uint16_t __iomem *)(reg + 0);
  185. for (cnt = 0; cnt < sizeof(fw->pbiu_reg) / 2; cnt++)
  186. fw->pbiu_reg[cnt] = htons(RD_REG_WORD(dmp_reg++));
  187. dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x10);
  188. for (cnt = 0; cnt < sizeof(fw->risc_host_reg) / 2; cnt++)
  189. fw->risc_host_reg[cnt] = htons(RD_REG_WORD(dmp_reg++));
  190. dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x40);
  191. for (cnt = 0; cnt < sizeof(fw->mailbox_reg) / 2; cnt++)
  192. fw->mailbox_reg[cnt] = htons(RD_REG_WORD(dmp_reg++));
  193. WRT_REG_WORD(&reg->ctrl_status, 0x40);
  194. dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80);
  195. for (cnt = 0; cnt < sizeof(fw->resp_dma_reg) / 2; cnt++)
  196. fw->resp_dma_reg[cnt] = htons(RD_REG_WORD(dmp_reg++));
  197. WRT_REG_WORD(&reg->ctrl_status, 0x50);
  198. dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80);
  199. for (cnt = 0; cnt < sizeof(fw->dma_reg) / 2; cnt++)
  200. fw->dma_reg[cnt] = htons(RD_REG_WORD(dmp_reg++));
  201. WRT_REG_WORD(&reg->ctrl_status, 0x00);
  202. dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0xA0);
  203. for (cnt = 0; cnt < sizeof(fw->risc_hdw_reg) / 2; cnt++)
  204. fw->risc_hdw_reg[cnt] = htons(RD_REG_WORD(dmp_reg++));
  205. WRT_REG_WORD(&reg->pcr, 0x2000);
  206. dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80);
  207. for (cnt = 0; cnt < sizeof(fw->risc_gp0_reg) / 2; cnt++)
  208. fw->risc_gp0_reg[cnt] = htons(RD_REG_WORD(dmp_reg++));
  209. WRT_REG_WORD(&reg->pcr, 0x2200);
  210. dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80);
  211. for (cnt = 0; cnt < sizeof(fw->risc_gp1_reg) / 2; cnt++)
  212. fw->risc_gp1_reg[cnt] = htons(RD_REG_WORD(dmp_reg++));
  213. WRT_REG_WORD(&reg->pcr, 0x2400);
  214. dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80);
  215. for (cnt = 0; cnt < sizeof(fw->risc_gp2_reg) / 2; cnt++)
  216. fw->risc_gp2_reg[cnt] = htons(RD_REG_WORD(dmp_reg++));
  217. WRT_REG_WORD(&reg->pcr, 0x2600);
  218. dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80);
  219. for (cnt = 0; cnt < sizeof(fw->risc_gp3_reg) / 2; cnt++)
  220. fw->risc_gp3_reg[cnt] = htons(RD_REG_WORD(dmp_reg++));
  221. WRT_REG_WORD(&reg->pcr, 0x2800);
  222. dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80);
  223. for (cnt = 0; cnt < sizeof(fw->risc_gp4_reg) / 2; cnt++)
  224. fw->risc_gp4_reg[cnt] = htons(RD_REG_WORD(dmp_reg++));
  225. WRT_REG_WORD(&reg->pcr, 0x2A00);
  226. dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80);
  227. for (cnt = 0; cnt < sizeof(fw->risc_gp5_reg) / 2; cnt++)
  228. fw->risc_gp5_reg[cnt] = htons(RD_REG_WORD(dmp_reg++));
  229. WRT_REG_WORD(&reg->pcr, 0x2C00);
  230. dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80);
  231. for (cnt = 0; cnt < sizeof(fw->risc_gp6_reg) / 2; cnt++)
  232. fw->risc_gp6_reg[cnt] = htons(RD_REG_WORD(dmp_reg++));
  233. WRT_REG_WORD(&reg->pcr, 0x2E00);
  234. dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80);
  235. for (cnt = 0; cnt < sizeof(fw->risc_gp7_reg) / 2; cnt++)
  236. fw->risc_gp7_reg[cnt] = htons(RD_REG_WORD(dmp_reg++));
  237. WRT_REG_WORD(&reg->ctrl_status, 0x10);
  238. dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80);
  239. for (cnt = 0; cnt < sizeof(fw->frame_buf_hdw_reg) / 2; cnt++)
  240. fw->frame_buf_hdw_reg[cnt] =
  241. htons(RD_REG_WORD(dmp_reg++));
  242. WRT_REG_WORD(&reg->ctrl_status, 0x20);
  243. dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80);
  244. for (cnt = 0; cnt < sizeof(fw->fpm_b0_reg) / 2; cnt++)
  245. fw->fpm_b0_reg[cnt] = htons(RD_REG_WORD(dmp_reg++));
  246. WRT_REG_WORD(&reg->ctrl_status, 0x30);
  247. dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80);
  248. for (cnt = 0; cnt < sizeof(fw->fpm_b1_reg) / 2; cnt++)
  249. fw->fpm_b1_reg[cnt] = htons(RD_REG_WORD(dmp_reg++));
  250. /* Reset RISC. */
  251. WRT_REG_WORD(&reg->ctrl_status, CSR_ISP_SOFT_RESET);
  252. for (cnt = 0; cnt < 30000; cnt++) {
  253. if ((RD_REG_WORD(&reg->ctrl_status) &
  254. CSR_ISP_SOFT_RESET) == 0)
  255. break;
  256. udelay(10);
  257. }
  258. }
  259. if (!IS_QLA2300(ha)) {
  260. for (cnt = 30000; RD_MAILBOX_REG(ha, reg, 0) != 0 &&
  261. rval == QLA_SUCCESS; cnt--) {
  262. if (cnt)
  263. udelay(100);
  264. else
  265. rval = QLA_FUNCTION_TIMEOUT;
  266. }
  267. }
  268. if (rval == QLA_SUCCESS) {
  269. /* Get RISC SRAM. */
  270. risc_address = 0x800;
  271. WRT_MAILBOX_REG(ha, reg, 0, MBC_READ_RAM_WORD);
  272. clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);
  273. }
  274. for (cnt = 0; cnt < sizeof(fw->risc_ram) / 2 && rval == QLA_SUCCESS;
  275. cnt++, risc_address++) {
  276. WRT_MAILBOX_REG(ha, reg, 1, (uint16_t)risc_address);
  277. WRT_REG_WORD(&reg->hccr, HCCR_SET_HOST_INT);
  278. for (timer = 6000000; timer; timer--) {
  279. /* Check for pending interrupts. */
  280. stat = RD_REG_DWORD(&reg->u.isp2300.host_status);
  281. if (stat & HSR_RISC_INT) {
  282. stat &= 0xff;
  283. if (stat == 0x1 || stat == 0x2) {
  284. set_bit(MBX_INTERRUPT,
  285. &ha->mbx_cmd_flags);
  286. mb0 = RD_MAILBOX_REG(ha, reg, 0);
  287. mb2 = RD_MAILBOX_REG(ha, reg, 2);
  288. /* Release mailbox registers. */
  289. WRT_REG_WORD(&reg->semaphore, 0);
  290. WRT_REG_WORD(&reg->hccr,
  291. HCCR_CLR_RISC_INT);
  292. RD_REG_WORD(&reg->hccr);
  293. break;
  294. } else if (stat == 0x10 || stat == 0x11) {
  295. set_bit(MBX_INTERRUPT,
  296. &ha->mbx_cmd_flags);
  297. mb0 = RD_MAILBOX_REG(ha, reg, 0);
  298. mb2 = RD_MAILBOX_REG(ha, reg, 2);
  299. WRT_REG_WORD(&reg->hccr,
  300. HCCR_CLR_RISC_INT);
  301. RD_REG_WORD(&reg->hccr);
  302. break;
  303. }
  304. /* clear this intr; it wasn't a mailbox intr */
  305. WRT_REG_WORD(&reg->hccr, HCCR_CLR_RISC_INT);
  306. RD_REG_WORD(&reg->hccr);
  307. }
  308. udelay(5);
  309. }
  310. if (test_and_clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags)) {
  311. rval = mb0 & MBS_MASK;
  312. fw->risc_ram[cnt] = htons(mb2);
  313. } else {
  314. rval = QLA_FUNCTION_FAILED;
  315. }
  316. }
  317. if (rval == QLA_SUCCESS) {
  318. /* Get stack SRAM. */
  319. risc_address = 0x10000;
  320. WRT_MAILBOX_REG(ha, reg, 0, MBC_READ_RAM_EXTENDED);
  321. clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);
  322. }
  323. for (cnt = 0; cnt < sizeof(fw->stack_ram) / 2 && rval == QLA_SUCCESS;
  324. cnt++, risc_address++) {
  325. WRT_MAILBOX_REG(ha, reg, 1, LSW(risc_address));
  326. WRT_MAILBOX_REG(ha, reg, 8, MSW(risc_address));
  327. WRT_REG_WORD(&reg->hccr, HCCR_SET_HOST_INT);
  328. for (timer = 6000000; timer; timer--) {
  329. /* Check for pending interrupts. */
  330. stat = RD_REG_DWORD(&reg->u.isp2300.host_status);
  331. if (stat & HSR_RISC_INT) {
  332. stat &= 0xff;
  333. if (stat == 0x1 || stat == 0x2) {
  334. set_bit(MBX_INTERRUPT,
  335. &ha->mbx_cmd_flags);
  336. mb0 = RD_MAILBOX_REG(ha, reg, 0);
  337. mb2 = RD_MAILBOX_REG(ha, reg, 2);
  338. /* Release mailbox registers. */
  339. WRT_REG_WORD(&reg->semaphore, 0);
  340. WRT_REG_WORD(&reg->hccr,
  341. HCCR_CLR_RISC_INT);
  342. RD_REG_WORD(&reg->hccr);
  343. break;
  344. } else if (stat == 0x10 || stat == 0x11) {
  345. set_bit(MBX_INTERRUPT,
  346. &ha->mbx_cmd_flags);
  347. mb0 = RD_MAILBOX_REG(ha, reg, 0);
  348. mb2 = RD_MAILBOX_REG(ha, reg, 2);
  349. WRT_REG_WORD(&reg->hccr,
  350. HCCR_CLR_RISC_INT);
  351. RD_REG_WORD(&reg->hccr);
  352. break;
  353. }
  354. /* clear this intr; it wasn't a mailbox intr */
  355. WRT_REG_WORD(&reg->hccr, HCCR_CLR_RISC_INT);
  356. RD_REG_WORD(&reg->hccr);
  357. }
  358. udelay(5);
  359. }
  360. if (test_and_clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags)) {
  361. rval = mb0 & MBS_MASK;
  362. fw->stack_ram[cnt] = htons(mb2);
  363. } else {
  364. rval = QLA_FUNCTION_FAILED;
  365. }
  366. }
  367. if (rval == QLA_SUCCESS) {
  368. /* Get data SRAM. */
  369. risc_address = 0x11000;
  370. data_ram_cnt = ha->fw_memory_size - risc_address + 1;
  371. WRT_MAILBOX_REG(ha, reg, 0, MBC_READ_RAM_EXTENDED);
  372. clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);
  373. }
  374. for (cnt = 0; cnt < data_ram_cnt && rval == QLA_SUCCESS;
  375. cnt++, risc_address++) {
  376. WRT_MAILBOX_REG(ha, reg, 1, LSW(risc_address));
  377. WRT_MAILBOX_REG(ha, reg, 8, MSW(risc_address));
  378. WRT_REG_WORD(&reg->hccr, HCCR_SET_HOST_INT);
  379. for (timer = 6000000; timer; timer--) {
  380. /* Check for pending interrupts. */
  381. stat = RD_REG_DWORD(&reg->u.isp2300.host_status);
  382. if (stat & HSR_RISC_INT) {
  383. stat &= 0xff;
  384. if (stat == 0x1 || stat == 0x2) {
  385. set_bit(MBX_INTERRUPT,
  386. &ha->mbx_cmd_flags);
  387. mb0 = RD_MAILBOX_REG(ha, reg, 0);
  388. mb2 = RD_MAILBOX_REG(ha, reg, 2);
  389. /* Release mailbox registers. */
  390. WRT_REG_WORD(&reg->semaphore, 0);
  391. WRT_REG_WORD(&reg->hccr,
  392. HCCR_CLR_RISC_INT);
  393. RD_REG_WORD(&reg->hccr);
  394. break;
  395. } else if (stat == 0x10 || stat == 0x11) {
  396. set_bit(MBX_INTERRUPT,
  397. &ha->mbx_cmd_flags);
  398. mb0 = RD_MAILBOX_REG(ha, reg, 0);
  399. mb2 = RD_MAILBOX_REG(ha, reg, 2);
  400. WRT_REG_WORD(&reg->hccr,
  401. HCCR_CLR_RISC_INT);
  402. RD_REG_WORD(&reg->hccr);
  403. break;
  404. }
  405. /* clear this intr; it wasn't a mailbox intr */
  406. WRT_REG_WORD(&reg->hccr, HCCR_CLR_RISC_INT);
  407. RD_REG_WORD(&reg->hccr);
  408. }
  409. udelay(5);
  410. }
  411. if (test_and_clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags)) {
  412. rval = mb0 & MBS_MASK;
  413. fw->data_ram[cnt] = htons(mb2);
  414. } else {
  415. rval = QLA_FUNCTION_FAILED;
  416. }
  417. }
  418. if (rval == QLA_SUCCESS)
  419. qla2xxx_copy_queues(ha, &fw->data_ram[cnt]);
  420. if (rval != QLA_SUCCESS) {
  421. qla_printk(KERN_WARNING, ha,
  422. "Failed to dump firmware (%x)!!!\n", rval);
  423. ha->fw_dumped = 0;
  424. } else {
  425. qla_printk(KERN_INFO, ha,
  426. "Firmware dump saved to temp buffer (%ld/%p).\n",
  427. ha->host_no, ha->fw_dump);
  428. ha->fw_dumped = 1;
  429. }
  430. qla2300_fw_dump_failed:
  431. if (!hardware_locked)
  432. spin_unlock_irqrestore(&ha->hardware_lock, flags);
  433. }
  434. /**
  435. * qla2100_fw_dump() - Dumps binary data from the 2100/2200 firmware.
  436. * @ha: HA context
  437. * @hardware_locked: Called with the hardware_lock
  438. */
  439. void
  440. qla2100_fw_dump(scsi_qla_host_t *ha, int hardware_locked)
  441. {
  442. int rval;
  443. uint32_t cnt, timer;
  444. uint16_t risc_address;
  445. uint16_t mb0, mb2;
  446. struct device_reg_2xxx __iomem *reg = &ha->iobase->isp;
  447. uint16_t __iomem *dmp_reg;
  448. unsigned long flags;
  449. struct qla2100_fw_dump *fw;
  450. risc_address = 0;
  451. mb0 = mb2 = 0;
  452. flags = 0;
  453. if (!hardware_locked)
  454. spin_lock_irqsave(&ha->hardware_lock, flags);
  455. if (!ha->fw_dump) {
  456. qla_printk(KERN_WARNING, ha,
  457. "No buffer available for dump!!!\n");
  458. goto qla2100_fw_dump_failed;
  459. }
  460. if (ha->fw_dumped) {
  461. qla_printk(KERN_WARNING, ha,
  462. "Firmware has been previously dumped (%p) -- ignoring "
  463. "request...\n", ha->fw_dump);
  464. goto qla2100_fw_dump_failed;
  465. }
  466. fw = &ha->fw_dump->isp.isp21;
  467. qla2xxx_prep_dump(ha, ha->fw_dump);
  468. rval = QLA_SUCCESS;
  469. fw->hccr = htons(RD_REG_WORD(&reg->hccr));
  470. /* Pause RISC. */
  471. WRT_REG_WORD(&reg->hccr, HCCR_PAUSE_RISC);
  472. for (cnt = 30000; (RD_REG_WORD(&reg->hccr) & HCCR_RISC_PAUSE) == 0 &&
  473. rval == QLA_SUCCESS; cnt--) {
  474. if (cnt)
  475. udelay(100);
  476. else
  477. rval = QLA_FUNCTION_TIMEOUT;
  478. }
  479. if (rval == QLA_SUCCESS) {
  480. dmp_reg = (uint16_t __iomem *)(reg + 0);
  481. for (cnt = 0; cnt < sizeof(fw->pbiu_reg) / 2; cnt++)
  482. fw->pbiu_reg[cnt] = htons(RD_REG_WORD(dmp_reg++));
  483. dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x10);
  484. for (cnt = 0; cnt < ha->mbx_count; cnt++) {
  485. if (cnt == 8) {
  486. dmp_reg = (uint16_t __iomem *)
  487. ((uint8_t __iomem *)reg + 0xe0);
  488. }
  489. fw->mailbox_reg[cnt] = htons(RD_REG_WORD(dmp_reg++));
  490. }
  491. dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x20);
  492. for (cnt = 0; cnt < sizeof(fw->dma_reg) / 2; cnt++)
  493. fw->dma_reg[cnt] = htons(RD_REG_WORD(dmp_reg++));
  494. WRT_REG_WORD(&reg->ctrl_status, 0x00);
  495. dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0xA0);
  496. for (cnt = 0; cnt < sizeof(fw->risc_hdw_reg) / 2; cnt++)
  497. fw->risc_hdw_reg[cnt] = htons(RD_REG_WORD(dmp_reg++));
  498. WRT_REG_WORD(&reg->pcr, 0x2000);
  499. dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80);
  500. for (cnt = 0; cnt < sizeof(fw->risc_gp0_reg) / 2; cnt++)
  501. fw->risc_gp0_reg[cnt] = htons(RD_REG_WORD(dmp_reg++));
  502. WRT_REG_WORD(&reg->pcr, 0x2100);
  503. dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80);
  504. for (cnt = 0; cnt < sizeof(fw->risc_gp1_reg) / 2; cnt++)
  505. fw->risc_gp1_reg[cnt] = htons(RD_REG_WORD(dmp_reg++));
  506. WRT_REG_WORD(&reg->pcr, 0x2200);
  507. dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80);
  508. for (cnt = 0; cnt < sizeof(fw->risc_gp2_reg) / 2; cnt++)
  509. fw->risc_gp2_reg[cnt] = htons(RD_REG_WORD(dmp_reg++));
  510. WRT_REG_WORD(&reg->pcr, 0x2300);
  511. dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80);
  512. for (cnt = 0; cnt < sizeof(fw->risc_gp3_reg) / 2; cnt++)
  513. fw->risc_gp3_reg[cnt] = htons(RD_REG_WORD(dmp_reg++));
  514. WRT_REG_WORD(&reg->pcr, 0x2400);
  515. dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80);
  516. for (cnt = 0; cnt < sizeof(fw->risc_gp4_reg) / 2; cnt++)
  517. fw->risc_gp4_reg[cnt] = htons(RD_REG_WORD(dmp_reg++));
  518. WRT_REG_WORD(&reg->pcr, 0x2500);
  519. dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80);
  520. for (cnt = 0; cnt < sizeof(fw->risc_gp5_reg) / 2; cnt++)
  521. fw->risc_gp5_reg[cnt] = htons(RD_REG_WORD(dmp_reg++));
  522. WRT_REG_WORD(&reg->pcr, 0x2600);
  523. dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80);
  524. for (cnt = 0; cnt < sizeof(fw->risc_gp6_reg) / 2; cnt++)
  525. fw->risc_gp6_reg[cnt] = htons(RD_REG_WORD(dmp_reg++));
  526. WRT_REG_WORD(&reg->pcr, 0x2700);
  527. dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80);
  528. for (cnt = 0; cnt < sizeof(fw->risc_gp7_reg) / 2; cnt++)
  529. fw->risc_gp7_reg[cnt] = htons(RD_REG_WORD(dmp_reg++));
  530. WRT_REG_WORD(&reg->ctrl_status, 0x10);
  531. dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80);
  532. for (cnt = 0; cnt < sizeof(fw->frame_buf_hdw_reg) / 2; cnt++)
  533. fw->frame_buf_hdw_reg[cnt] =
  534. htons(RD_REG_WORD(dmp_reg++));
  535. WRT_REG_WORD(&reg->ctrl_status, 0x20);
  536. dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80);
  537. for (cnt = 0; cnt < sizeof(fw->fpm_b0_reg) / 2; cnt++)
  538. fw->fpm_b0_reg[cnt] = htons(RD_REG_WORD(dmp_reg++));
  539. WRT_REG_WORD(&reg->ctrl_status, 0x30);
  540. dmp_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80);
  541. for (cnt = 0; cnt < sizeof(fw->fpm_b1_reg) / 2; cnt++)
  542. fw->fpm_b1_reg[cnt] = htons(RD_REG_WORD(dmp_reg++));
  543. /* Reset the ISP. */
  544. WRT_REG_WORD(&reg->ctrl_status, CSR_ISP_SOFT_RESET);
  545. }
  546. for (cnt = 30000; RD_MAILBOX_REG(ha, reg, 0) != 0 &&
  547. rval == QLA_SUCCESS; cnt--) {
  548. if (cnt)
  549. udelay(100);
  550. else
  551. rval = QLA_FUNCTION_TIMEOUT;
  552. }
  553. /* Pause RISC. */
  554. if (rval == QLA_SUCCESS && (IS_QLA2200(ha) || (IS_QLA2100(ha) &&
  555. (RD_REG_WORD(&reg->mctr) & (BIT_1 | BIT_0)) != 0))) {
  556. WRT_REG_WORD(&reg->hccr, HCCR_PAUSE_RISC);
  557. for (cnt = 30000;
  558. (RD_REG_WORD(&reg->hccr) & HCCR_RISC_PAUSE) == 0 &&
  559. rval == QLA_SUCCESS; cnt--) {
  560. if (cnt)
  561. udelay(100);
  562. else
  563. rval = QLA_FUNCTION_TIMEOUT;
  564. }
  565. if (rval == QLA_SUCCESS) {
  566. /* Set memory configuration and timing. */
  567. if (IS_QLA2100(ha))
  568. WRT_REG_WORD(&reg->mctr, 0xf1);
  569. else
  570. WRT_REG_WORD(&reg->mctr, 0xf2);
  571. RD_REG_WORD(&reg->mctr); /* PCI Posting. */
  572. /* Release RISC. */
  573. WRT_REG_WORD(&reg->hccr, HCCR_RELEASE_RISC);
  574. }
  575. }
  576. if (rval == QLA_SUCCESS) {
  577. /* Get RISC SRAM. */
  578. risc_address = 0x1000;
  579. WRT_MAILBOX_REG(ha, reg, 0, MBC_READ_RAM_WORD);
  580. clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);
  581. }
  582. for (cnt = 0; cnt < sizeof(fw->risc_ram) / 2 && rval == QLA_SUCCESS;
  583. cnt++, risc_address++) {
  584. WRT_MAILBOX_REG(ha, reg, 1, risc_address);
  585. WRT_REG_WORD(&reg->hccr, HCCR_SET_HOST_INT);
  586. for (timer = 6000000; timer != 0; timer--) {
  587. /* Check for pending interrupts. */
  588. if (RD_REG_WORD(&reg->istatus) & ISR_RISC_INT) {
  589. if (RD_REG_WORD(&reg->semaphore) & BIT_0) {
  590. set_bit(MBX_INTERRUPT,
  591. &ha->mbx_cmd_flags);
  592. mb0 = RD_MAILBOX_REG(ha, reg, 0);
  593. mb2 = RD_MAILBOX_REG(ha, reg, 2);
  594. WRT_REG_WORD(&reg->semaphore, 0);
  595. WRT_REG_WORD(&reg->hccr,
  596. HCCR_CLR_RISC_INT);
  597. RD_REG_WORD(&reg->hccr);
  598. break;
  599. }
  600. WRT_REG_WORD(&reg->hccr, HCCR_CLR_RISC_INT);
  601. RD_REG_WORD(&reg->hccr);
  602. }
  603. udelay(5);
  604. }
  605. if (test_and_clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags)) {
  606. rval = mb0 & MBS_MASK;
  607. fw->risc_ram[cnt] = htons(mb2);
  608. } else {
  609. rval = QLA_FUNCTION_FAILED;
  610. }
  611. }
  612. if (rval == QLA_SUCCESS)
  613. qla2xxx_copy_queues(ha, &fw->risc_ram[cnt]);
  614. if (rval != QLA_SUCCESS) {
  615. qla_printk(KERN_WARNING, ha,
  616. "Failed to dump firmware (%x)!!!\n", rval);
  617. ha->fw_dumped = 0;
  618. } else {
  619. qla_printk(KERN_INFO, ha,
  620. "Firmware dump saved to temp buffer (%ld/%p).\n",
  621. ha->host_no, ha->fw_dump);
  622. ha->fw_dumped = 1;
  623. }
  624. qla2100_fw_dump_failed:
  625. if (!hardware_locked)
  626. spin_unlock_irqrestore(&ha->hardware_lock, flags);
  627. }
  628. void
  629. qla24xx_fw_dump(scsi_qla_host_t *ha, int hardware_locked)
  630. {
  631. int rval;
  632. uint32_t cnt;
  633. uint32_t risc_address;
  634. uint16_t mb0, wd;
  635. struct device_reg_24xx __iomem *reg = &ha->iobase->isp24;
  636. uint32_t __iomem *dmp_reg;
  637. uint32_t *iter_reg;
  638. uint16_t __iomem *mbx_reg;
  639. unsigned long flags;
  640. struct qla24xx_fw_dump *fw;
  641. uint32_t ext_mem_cnt;
  642. void *nxt;
  643. risc_address = ext_mem_cnt = 0;
  644. flags = 0;
  645. if (!hardware_locked)
  646. spin_lock_irqsave(&ha->hardware_lock, flags);
  647. if (!ha->fw_dump) {
  648. qla_printk(KERN_WARNING, ha,
  649. "No buffer available for dump!!!\n");
  650. goto qla24xx_fw_dump_failed;
  651. }
  652. if (ha->fw_dumped) {
  653. qla_printk(KERN_WARNING, ha,
  654. "Firmware has been previously dumped (%p) -- ignoring "
  655. "request...\n", ha->fw_dump);
  656. goto qla24xx_fw_dump_failed;
  657. }
  658. fw = &ha->fw_dump->isp.isp24;
  659. qla2xxx_prep_dump(ha, ha->fw_dump);
  660. rval = QLA_SUCCESS;
  661. fw->host_status = htonl(RD_REG_DWORD(&reg->host_status));
  662. /* Pause RISC. */
  663. if ((RD_REG_DWORD(&reg->hccr) & HCCRX_RISC_PAUSE) == 0) {
  664. WRT_REG_DWORD(&reg->hccr, HCCRX_SET_RISC_RESET |
  665. HCCRX_CLR_HOST_INT);
  666. RD_REG_DWORD(&reg->hccr); /* PCI Posting. */
  667. WRT_REG_DWORD(&reg->hccr, HCCRX_SET_RISC_PAUSE);
  668. for (cnt = 30000;
  669. (RD_REG_DWORD(&reg->hccr) & HCCRX_RISC_PAUSE) == 0 &&
  670. rval == QLA_SUCCESS; cnt--) {
  671. if (cnt)
  672. udelay(100);
  673. else
  674. rval = QLA_FUNCTION_TIMEOUT;
  675. }
  676. }
  677. if (rval == QLA_SUCCESS) {
  678. /* Host interface registers. */
  679. dmp_reg = (uint32_t __iomem *)(reg + 0);
  680. for (cnt = 0; cnt < sizeof(fw->host_reg) / 4; cnt++)
  681. fw->host_reg[cnt] = htonl(RD_REG_DWORD(dmp_reg++));
  682. /* Disable interrupts. */
  683. WRT_REG_DWORD(&reg->ictrl, 0);
  684. RD_REG_DWORD(&reg->ictrl);
  685. /* Shadow registers. */
  686. WRT_REG_DWORD(&reg->iobase_addr, 0x0F70);
  687. RD_REG_DWORD(&reg->iobase_addr);
  688. WRT_REG_DWORD(&reg->iobase_select, 0xB0000000);
  689. fw->shadow_reg[0] = htonl(RD_REG_DWORD(&reg->iobase_sdata));
  690. WRT_REG_DWORD(&reg->iobase_select, 0xB0100000);
  691. fw->shadow_reg[1] = htonl(RD_REG_DWORD(&reg->iobase_sdata));
  692. WRT_REG_DWORD(&reg->iobase_select, 0xB0200000);
  693. fw->shadow_reg[2] = htonl(RD_REG_DWORD(&reg->iobase_sdata));
  694. WRT_REG_DWORD(&reg->iobase_select, 0xB0300000);
  695. fw->shadow_reg[3] = htonl(RD_REG_DWORD(&reg->iobase_sdata));
  696. WRT_REG_DWORD(&reg->iobase_select, 0xB0400000);
  697. fw->shadow_reg[4] = htonl(RD_REG_DWORD(&reg->iobase_sdata));
  698. WRT_REG_DWORD(&reg->iobase_select, 0xB0500000);
  699. fw->shadow_reg[5] = htonl(RD_REG_DWORD(&reg->iobase_sdata));
  700. WRT_REG_DWORD(&reg->iobase_select, 0xB0600000);
  701. fw->shadow_reg[6] = htonl(RD_REG_DWORD(&reg->iobase_sdata));
  702. /* Mailbox registers. */
  703. mbx_reg = &reg->mailbox0;
  704. for (cnt = 0; cnt < sizeof(fw->mailbox_reg) / 2; cnt++)
  705. fw->mailbox_reg[cnt] = htons(RD_REG_WORD(mbx_reg++));
  706. /* Transfer sequence registers. */
  707. iter_reg = fw->xseq_gp_reg;
  708. WRT_REG_DWORD(&reg->iobase_addr, 0xBF00);
  709. dmp_reg = &reg->iobase_window;
  710. for (cnt = 0; cnt < 16; cnt++)
  711. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  712. WRT_REG_DWORD(&reg->iobase_addr, 0xBF10);
  713. dmp_reg = &reg->iobase_window;
  714. for (cnt = 0; cnt < 16; cnt++)
  715. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  716. WRT_REG_DWORD(&reg->iobase_addr, 0xBF20);
  717. dmp_reg = &reg->iobase_window;
  718. for (cnt = 0; cnt < 16; cnt++)
  719. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  720. WRT_REG_DWORD(&reg->iobase_addr, 0xBF30);
  721. dmp_reg = &reg->iobase_window;
  722. for (cnt = 0; cnt < 16; cnt++)
  723. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  724. WRT_REG_DWORD(&reg->iobase_addr, 0xBF40);
  725. dmp_reg = &reg->iobase_window;
  726. for (cnt = 0; cnt < 16; cnt++)
  727. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  728. WRT_REG_DWORD(&reg->iobase_addr, 0xBF50);
  729. dmp_reg = &reg->iobase_window;
  730. for (cnt = 0; cnt < 16; cnt++)
  731. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  732. WRT_REG_DWORD(&reg->iobase_addr, 0xBF60);
  733. dmp_reg = &reg->iobase_window;
  734. for (cnt = 0; cnt < 16; cnt++)
  735. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  736. WRT_REG_DWORD(&reg->iobase_addr, 0xBF70);
  737. dmp_reg = &reg->iobase_window;
  738. for (cnt = 0; cnt < 16; cnt++)
  739. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  740. WRT_REG_DWORD(&reg->iobase_addr, 0xBFE0);
  741. dmp_reg = &reg->iobase_window;
  742. for (cnt = 0; cnt < sizeof(fw->xseq_0_reg) / 4; cnt++)
  743. fw->xseq_0_reg[cnt] = htonl(RD_REG_DWORD(dmp_reg++));
  744. WRT_REG_DWORD(&reg->iobase_addr, 0xBFF0);
  745. dmp_reg = &reg->iobase_window;
  746. for (cnt = 0; cnt < sizeof(fw->xseq_1_reg) / 4; cnt++)
  747. fw->xseq_1_reg[cnt] = htonl(RD_REG_DWORD(dmp_reg++));
  748. /* Receive sequence registers. */
  749. iter_reg = fw->rseq_gp_reg;
  750. WRT_REG_DWORD(&reg->iobase_addr, 0xFF00);
  751. dmp_reg = &reg->iobase_window;
  752. for (cnt = 0; cnt < 16; cnt++)
  753. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  754. WRT_REG_DWORD(&reg->iobase_addr, 0xFF10);
  755. dmp_reg = &reg->iobase_window;
  756. for (cnt = 0; cnt < 16; cnt++)
  757. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  758. WRT_REG_DWORD(&reg->iobase_addr, 0xFF20);
  759. dmp_reg = &reg->iobase_window;
  760. for (cnt = 0; cnt < 16; cnt++)
  761. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  762. WRT_REG_DWORD(&reg->iobase_addr, 0xFF30);
  763. dmp_reg = &reg->iobase_window;
  764. for (cnt = 0; cnt < 16; cnt++)
  765. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  766. WRT_REG_DWORD(&reg->iobase_addr, 0xFF40);
  767. dmp_reg = &reg->iobase_window;
  768. for (cnt = 0; cnt < 16; cnt++)
  769. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  770. WRT_REG_DWORD(&reg->iobase_addr, 0xFF50);
  771. dmp_reg = &reg->iobase_window;
  772. for (cnt = 0; cnt < 16; cnt++)
  773. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  774. WRT_REG_DWORD(&reg->iobase_addr, 0xFF60);
  775. dmp_reg = &reg->iobase_window;
  776. for (cnt = 0; cnt < 16; cnt++)
  777. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  778. WRT_REG_DWORD(&reg->iobase_addr, 0xFF70);
  779. dmp_reg = &reg->iobase_window;
  780. for (cnt = 0; cnt < 16; cnt++)
  781. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  782. WRT_REG_DWORD(&reg->iobase_addr, 0xFFD0);
  783. dmp_reg = &reg->iobase_window;
  784. for (cnt = 0; cnt < sizeof(fw->rseq_0_reg) / 4; cnt++)
  785. fw->rseq_0_reg[cnt] = htonl(RD_REG_DWORD(dmp_reg++));
  786. WRT_REG_DWORD(&reg->iobase_addr, 0xFFE0);
  787. dmp_reg = &reg->iobase_window;
  788. for (cnt = 0; cnt < sizeof(fw->rseq_1_reg) / 4; cnt++)
  789. fw->rseq_1_reg[cnt] = htonl(RD_REG_DWORD(dmp_reg++));
  790. WRT_REG_DWORD(&reg->iobase_addr, 0xFFF0);
  791. dmp_reg = &reg->iobase_window;
  792. for (cnt = 0; cnt < sizeof(fw->rseq_2_reg) / 4; cnt++)
  793. fw->rseq_2_reg[cnt] = htonl(RD_REG_DWORD(dmp_reg++));
  794. /* Command DMA registers. */
  795. WRT_REG_DWORD(&reg->iobase_addr, 0x7100);
  796. dmp_reg = &reg->iobase_window;
  797. for (cnt = 0; cnt < sizeof(fw->cmd_dma_reg) / 4; cnt++)
  798. fw->cmd_dma_reg[cnt] = htonl(RD_REG_DWORD(dmp_reg++));
  799. /* Queues. */
  800. iter_reg = fw->req0_dma_reg;
  801. WRT_REG_DWORD(&reg->iobase_addr, 0x7200);
  802. dmp_reg = &reg->iobase_window;
  803. for (cnt = 0; cnt < 8; cnt++)
  804. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  805. dmp_reg = &reg->iobase_q;
  806. for (cnt = 0; cnt < 7; cnt++)
  807. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  808. iter_reg = fw->resp0_dma_reg;
  809. WRT_REG_DWORD(&reg->iobase_addr, 0x7300);
  810. dmp_reg = &reg->iobase_window;
  811. for (cnt = 0; cnt < 8; cnt++)
  812. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  813. dmp_reg = &reg->iobase_q;
  814. for (cnt = 0; cnt < 7; cnt++)
  815. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  816. iter_reg = fw->req1_dma_reg;
  817. WRT_REG_DWORD(&reg->iobase_addr, 0x7400);
  818. dmp_reg = &reg->iobase_window;
  819. for (cnt = 0; cnt < 8; cnt++)
  820. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  821. dmp_reg = &reg->iobase_q;
  822. for (cnt = 0; cnt < 7; cnt++)
  823. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  824. /* Transmit DMA registers. */
  825. iter_reg = fw->xmt0_dma_reg;
  826. WRT_REG_DWORD(&reg->iobase_addr, 0x7600);
  827. dmp_reg = &reg->iobase_window;
  828. for (cnt = 0; cnt < 16; cnt++)
  829. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  830. WRT_REG_DWORD(&reg->iobase_addr, 0x7610);
  831. dmp_reg = &reg->iobase_window;
  832. for (cnt = 0; cnt < 16; cnt++)
  833. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  834. iter_reg = fw->xmt1_dma_reg;
  835. WRT_REG_DWORD(&reg->iobase_addr, 0x7620);
  836. dmp_reg = &reg->iobase_window;
  837. for (cnt = 0; cnt < 16; cnt++)
  838. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  839. WRT_REG_DWORD(&reg->iobase_addr, 0x7630);
  840. dmp_reg = &reg->iobase_window;
  841. for (cnt = 0; cnt < 16; cnt++)
  842. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  843. iter_reg = fw->xmt2_dma_reg;
  844. WRT_REG_DWORD(&reg->iobase_addr, 0x7640);
  845. dmp_reg = &reg->iobase_window;
  846. for (cnt = 0; cnt < 16; cnt++)
  847. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  848. WRT_REG_DWORD(&reg->iobase_addr, 0x7650);
  849. dmp_reg = &reg->iobase_window;
  850. for (cnt = 0; cnt < 16; cnt++)
  851. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  852. iter_reg = fw->xmt3_dma_reg;
  853. WRT_REG_DWORD(&reg->iobase_addr, 0x7660);
  854. dmp_reg = &reg->iobase_window;
  855. for (cnt = 0; cnt < 16; cnt++)
  856. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  857. WRT_REG_DWORD(&reg->iobase_addr, 0x7670);
  858. dmp_reg = &reg->iobase_window;
  859. for (cnt = 0; cnt < 16; cnt++)
  860. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  861. iter_reg = fw->xmt4_dma_reg;
  862. WRT_REG_DWORD(&reg->iobase_addr, 0x7680);
  863. dmp_reg = &reg->iobase_window;
  864. for (cnt = 0; cnt < 16; cnt++)
  865. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  866. WRT_REG_DWORD(&reg->iobase_addr, 0x7690);
  867. dmp_reg = &reg->iobase_window;
  868. for (cnt = 0; cnt < 16; cnt++)
  869. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  870. WRT_REG_DWORD(&reg->iobase_addr, 0x76A0);
  871. dmp_reg = &reg->iobase_window;
  872. for (cnt = 0; cnt < sizeof(fw->xmt_data_dma_reg) / 4; cnt++)
  873. fw->xmt_data_dma_reg[cnt] =
  874. htonl(RD_REG_DWORD(dmp_reg++));
  875. /* Receive DMA registers. */
  876. iter_reg = fw->rcvt0_data_dma_reg;
  877. WRT_REG_DWORD(&reg->iobase_addr, 0x7700);
  878. dmp_reg = &reg->iobase_window;
  879. for (cnt = 0; cnt < 16; cnt++)
  880. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  881. WRT_REG_DWORD(&reg->iobase_addr, 0x7710);
  882. dmp_reg = &reg->iobase_window;
  883. for (cnt = 0; cnt < 16; cnt++)
  884. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  885. iter_reg = fw->rcvt1_data_dma_reg;
  886. WRT_REG_DWORD(&reg->iobase_addr, 0x7720);
  887. dmp_reg = &reg->iobase_window;
  888. for (cnt = 0; cnt < 16; cnt++)
  889. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  890. WRT_REG_DWORD(&reg->iobase_addr, 0x7730);
  891. dmp_reg = &reg->iobase_window;
  892. for (cnt = 0; cnt < 16; cnt++)
  893. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  894. /* RISC registers. */
  895. iter_reg = fw->risc_gp_reg;
  896. WRT_REG_DWORD(&reg->iobase_addr, 0x0F00);
  897. dmp_reg = &reg->iobase_window;
  898. for (cnt = 0; cnt < 16; cnt++)
  899. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  900. WRT_REG_DWORD(&reg->iobase_addr, 0x0F10);
  901. dmp_reg = &reg->iobase_window;
  902. for (cnt = 0; cnt < 16; cnt++)
  903. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  904. WRT_REG_DWORD(&reg->iobase_addr, 0x0F20);
  905. dmp_reg = &reg->iobase_window;
  906. for (cnt = 0; cnt < 16; cnt++)
  907. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  908. WRT_REG_DWORD(&reg->iobase_addr, 0x0F30);
  909. dmp_reg = &reg->iobase_window;
  910. for (cnt = 0; cnt < 16; cnt++)
  911. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  912. WRT_REG_DWORD(&reg->iobase_addr, 0x0F40);
  913. dmp_reg = &reg->iobase_window;
  914. for (cnt = 0; cnt < 16; cnt++)
  915. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  916. WRT_REG_DWORD(&reg->iobase_addr, 0x0F50);
  917. dmp_reg = &reg->iobase_window;
  918. for (cnt = 0; cnt < 16; cnt++)
  919. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  920. WRT_REG_DWORD(&reg->iobase_addr, 0x0F60);
  921. dmp_reg = &reg->iobase_window;
  922. for (cnt = 0; cnt < 16; cnt++)
  923. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  924. WRT_REG_DWORD(&reg->iobase_addr, 0x0F70);
  925. dmp_reg = &reg->iobase_window;
  926. for (cnt = 0; cnt < 16; cnt++)
  927. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  928. /* Local memory controller registers. */
  929. iter_reg = fw->lmc_reg;
  930. WRT_REG_DWORD(&reg->iobase_addr, 0x3000);
  931. dmp_reg = &reg->iobase_window;
  932. for (cnt = 0; cnt < 16; cnt++)
  933. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  934. WRT_REG_DWORD(&reg->iobase_addr, 0x3010);
  935. dmp_reg = &reg->iobase_window;
  936. for (cnt = 0; cnt < 16; cnt++)
  937. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  938. WRT_REG_DWORD(&reg->iobase_addr, 0x3020);
  939. dmp_reg = &reg->iobase_window;
  940. for (cnt = 0; cnt < 16; cnt++)
  941. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  942. WRT_REG_DWORD(&reg->iobase_addr, 0x3030);
  943. dmp_reg = &reg->iobase_window;
  944. for (cnt = 0; cnt < 16; cnt++)
  945. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  946. WRT_REG_DWORD(&reg->iobase_addr, 0x3040);
  947. dmp_reg = &reg->iobase_window;
  948. for (cnt = 0; cnt < 16; cnt++)
  949. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  950. WRT_REG_DWORD(&reg->iobase_addr, 0x3050);
  951. dmp_reg = &reg->iobase_window;
  952. for (cnt = 0; cnt < 16; cnt++)
  953. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  954. WRT_REG_DWORD(&reg->iobase_addr, 0x3060);
  955. dmp_reg = &reg->iobase_window;
  956. for (cnt = 0; cnt < 16; cnt++)
  957. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  958. /* Fibre Protocol Module registers. */
  959. iter_reg = fw->fpm_hdw_reg;
  960. WRT_REG_DWORD(&reg->iobase_addr, 0x4000);
  961. dmp_reg = &reg->iobase_window;
  962. for (cnt = 0; cnt < 16; cnt++)
  963. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  964. WRT_REG_DWORD(&reg->iobase_addr, 0x4010);
  965. dmp_reg = &reg->iobase_window;
  966. for (cnt = 0; cnt < 16; cnt++)
  967. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  968. WRT_REG_DWORD(&reg->iobase_addr, 0x4020);
  969. dmp_reg = &reg->iobase_window;
  970. for (cnt = 0; cnt < 16; cnt++)
  971. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  972. WRT_REG_DWORD(&reg->iobase_addr, 0x4030);
  973. dmp_reg = &reg->iobase_window;
  974. for (cnt = 0; cnt < 16; cnt++)
  975. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  976. WRT_REG_DWORD(&reg->iobase_addr, 0x4040);
  977. dmp_reg = &reg->iobase_window;
  978. for (cnt = 0; cnt < 16; cnt++)
  979. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  980. WRT_REG_DWORD(&reg->iobase_addr, 0x4050);
  981. dmp_reg = &reg->iobase_window;
  982. for (cnt = 0; cnt < 16; cnt++)
  983. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  984. WRT_REG_DWORD(&reg->iobase_addr, 0x4060);
  985. dmp_reg = &reg->iobase_window;
  986. for (cnt = 0; cnt < 16; cnt++)
  987. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  988. WRT_REG_DWORD(&reg->iobase_addr, 0x4070);
  989. dmp_reg = &reg->iobase_window;
  990. for (cnt = 0; cnt < 16; cnt++)
  991. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  992. WRT_REG_DWORD(&reg->iobase_addr, 0x4080);
  993. dmp_reg = &reg->iobase_window;
  994. for (cnt = 0; cnt < 16; cnt++)
  995. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  996. WRT_REG_DWORD(&reg->iobase_addr, 0x4090);
  997. dmp_reg = &reg->iobase_window;
  998. for (cnt = 0; cnt < 16; cnt++)
  999. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  1000. WRT_REG_DWORD(&reg->iobase_addr, 0x40A0);
  1001. dmp_reg = &reg->iobase_window;
  1002. for (cnt = 0; cnt < 16; cnt++)
  1003. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  1004. WRT_REG_DWORD(&reg->iobase_addr, 0x40B0);
  1005. dmp_reg = &reg->iobase_window;
  1006. for (cnt = 0; cnt < 16; cnt++)
  1007. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  1008. /* Frame Buffer registers. */
  1009. iter_reg = fw->fb_hdw_reg;
  1010. WRT_REG_DWORD(&reg->iobase_addr, 0x6000);
  1011. dmp_reg = &reg->iobase_window;
  1012. for (cnt = 0; cnt < 16; cnt++)
  1013. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  1014. WRT_REG_DWORD(&reg->iobase_addr, 0x6010);
  1015. dmp_reg = &reg->iobase_window;
  1016. for (cnt = 0; cnt < 16; cnt++)
  1017. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  1018. WRT_REG_DWORD(&reg->iobase_addr, 0x6020);
  1019. dmp_reg = &reg->iobase_window;
  1020. for (cnt = 0; cnt < 16; cnt++)
  1021. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  1022. WRT_REG_DWORD(&reg->iobase_addr, 0x6030);
  1023. dmp_reg = &reg->iobase_window;
  1024. for (cnt = 0; cnt < 16; cnt++)
  1025. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  1026. WRT_REG_DWORD(&reg->iobase_addr, 0x6040);
  1027. dmp_reg = &reg->iobase_window;
  1028. for (cnt = 0; cnt < 16; cnt++)
  1029. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  1030. WRT_REG_DWORD(&reg->iobase_addr, 0x6100);
  1031. dmp_reg = &reg->iobase_window;
  1032. for (cnt = 0; cnt < 16; cnt++)
  1033. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  1034. WRT_REG_DWORD(&reg->iobase_addr, 0x6130);
  1035. dmp_reg = &reg->iobase_window;
  1036. for (cnt = 0; cnt < 16; cnt++)
  1037. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  1038. WRT_REG_DWORD(&reg->iobase_addr, 0x6150);
  1039. dmp_reg = &reg->iobase_window;
  1040. for (cnt = 0; cnt < 16; cnt++)
  1041. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  1042. WRT_REG_DWORD(&reg->iobase_addr, 0x6170);
  1043. dmp_reg = &reg->iobase_window;
  1044. for (cnt = 0; cnt < 16; cnt++)
  1045. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  1046. WRT_REG_DWORD(&reg->iobase_addr, 0x6190);
  1047. dmp_reg = &reg->iobase_window;
  1048. for (cnt = 0; cnt < 16; cnt++)
  1049. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  1050. WRT_REG_DWORD(&reg->iobase_addr, 0x61B0);
  1051. dmp_reg = &reg->iobase_window;
  1052. for (cnt = 0; cnt < 16; cnt++)
  1053. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  1054. /* Reset RISC. */
  1055. WRT_REG_DWORD(&reg->ctrl_status,
  1056. CSRX_DMA_SHUTDOWN|MWB_4096_BYTES);
  1057. for (cnt = 0; cnt < 30000; cnt++) {
  1058. if ((RD_REG_DWORD(&reg->ctrl_status) &
  1059. CSRX_DMA_ACTIVE) == 0)
  1060. break;
  1061. udelay(10);
  1062. }
  1063. WRT_REG_DWORD(&reg->ctrl_status,
  1064. CSRX_ISP_SOFT_RESET|CSRX_DMA_SHUTDOWN|MWB_4096_BYTES);
  1065. pci_read_config_word(ha->pdev, PCI_COMMAND, &wd);
  1066. udelay(100);
  1067. /* Wait for firmware to complete NVRAM accesses. */
  1068. mb0 = (uint32_t) RD_REG_WORD(&reg->mailbox0);
  1069. for (cnt = 10000 ; cnt && mb0; cnt--) {
  1070. udelay(5);
  1071. mb0 = (uint32_t) RD_REG_WORD(&reg->mailbox0);
  1072. barrier();
  1073. }
  1074. /* Wait for soft-reset to complete. */
  1075. for (cnt = 0; cnt < 30000; cnt++) {
  1076. if ((RD_REG_DWORD(&reg->ctrl_status) &
  1077. CSRX_ISP_SOFT_RESET) == 0)
  1078. break;
  1079. udelay(10);
  1080. }
  1081. WRT_REG_DWORD(&reg->hccr, HCCRX_CLR_RISC_RESET);
  1082. RD_REG_DWORD(&reg->hccr); /* PCI Posting. */
  1083. }
  1084. for (cnt = 30000; RD_REG_WORD(&reg->mailbox0) != 0 &&
  1085. rval == QLA_SUCCESS; cnt--) {
  1086. if (cnt)
  1087. udelay(100);
  1088. else
  1089. rval = QLA_FUNCTION_TIMEOUT;
  1090. }
  1091. if (rval == QLA_SUCCESS)
  1092. rval = qla2xxx_dump_memory(ha, fw->code_ram,
  1093. sizeof(fw->code_ram), fw->ext_mem, &nxt);
  1094. if (rval == QLA_SUCCESS) {
  1095. nxt = qla2xxx_copy_queues(ha, nxt);
  1096. if (ha->eft)
  1097. memcpy(nxt, ha->eft, ntohl(ha->fw_dump->eft_size));
  1098. }
  1099. if (rval != QLA_SUCCESS) {
  1100. qla_printk(KERN_WARNING, ha,
  1101. "Failed to dump firmware (%x)!!!\n", rval);
  1102. ha->fw_dumped = 0;
  1103. } else {
  1104. qla_printk(KERN_INFO, ha,
  1105. "Firmware dump saved to temp buffer (%ld/%p).\n",
  1106. ha->host_no, ha->fw_dump);
  1107. ha->fw_dumped = 1;
  1108. }
  1109. qla24xx_fw_dump_failed:
  1110. if (!hardware_locked)
  1111. spin_unlock_irqrestore(&ha->hardware_lock, flags);
  1112. }
  1113. void
  1114. qla25xx_fw_dump(scsi_qla_host_t *ha, int hardware_locked)
  1115. {
  1116. int rval;
  1117. uint32_t cnt;
  1118. uint32_t risc_address;
  1119. uint16_t mb0, wd;
  1120. struct device_reg_24xx __iomem *reg = &ha->iobase->isp24;
  1121. uint32_t __iomem *dmp_reg;
  1122. uint32_t *iter_reg;
  1123. uint16_t __iomem *mbx_reg;
  1124. unsigned long flags;
  1125. struct qla25xx_fw_dump *fw;
  1126. uint32_t ext_mem_cnt;
  1127. void *nxt;
  1128. risc_address = ext_mem_cnt = 0;
  1129. flags = 0;
  1130. if (!hardware_locked)
  1131. spin_lock_irqsave(&ha->hardware_lock, flags);
  1132. if (!ha->fw_dump) {
  1133. qla_printk(KERN_WARNING, ha,
  1134. "No buffer available for dump!!!\n");
  1135. goto qla25xx_fw_dump_failed;
  1136. }
  1137. if (ha->fw_dumped) {
  1138. qla_printk(KERN_WARNING, ha,
  1139. "Firmware has been previously dumped (%p) -- ignoring "
  1140. "request...\n", ha->fw_dump);
  1141. goto qla25xx_fw_dump_failed;
  1142. }
  1143. fw = &ha->fw_dump->isp.isp25;
  1144. qla2xxx_prep_dump(ha, ha->fw_dump);
  1145. rval = QLA_SUCCESS;
  1146. fw->host_status = htonl(RD_REG_DWORD(&reg->host_status));
  1147. /* Pause RISC. */
  1148. if ((RD_REG_DWORD(&reg->hccr) & HCCRX_RISC_PAUSE) == 0) {
  1149. WRT_REG_DWORD(&reg->hccr, HCCRX_SET_RISC_RESET |
  1150. HCCRX_CLR_HOST_INT);
  1151. RD_REG_DWORD(&reg->hccr); /* PCI Posting. */
  1152. WRT_REG_DWORD(&reg->hccr, HCCRX_SET_RISC_PAUSE);
  1153. for (cnt = 30000;
  1154. (RD_REG_DWORD(&reg->hccr) & HCCRX_RISC_PAUSE) == 0 &&
  1155. rval == QLA_SUCCESS; cnt--) {
  1156. if (cnt)
  1157. udelay(100);
  1158. else
  1159. rval = QLA_FUNCTION_TIMEOUT;
  1160. }
  1161. }
  1162. if (rval == QLA_SUCCESS) {
  1163. /* Host interface registers. */
  1164. dmp_reg = (uint32_t __iomem *)(reg + 0);
  1165. for (cnt = 0; cnt < sizeof(fw->host_reg) / 4; cnt++)
  1166. fw->host_reg[cnt] = htonl(RD_REG_DWORD(dmp_reg++));
  1167. /* Disable interrupts. */
  1168. WRT_REG_DWORD(&reg->ictrl, 0);
  1169. RD_REG_DWORD(&reg->ictrl);
  1170. /* Shadow registers. */
  1171. WRT_REG_DWORD(&reg->iobase_addr, 0x0F70);
  1172. RD_REG_DWORD(&reg->iobase_addr);
  1173. WRT_REG_DWORD(&reg->iobase_select, 0xB0000000);
  1174. fw->shadow_reg[0] = htonl(RD_REG_DWORD(&reg->iobase_sdata));
  1175. WRT_REG_DWORD(&reg->iobase_select, 0xB0100000);
  1176. fw->shadow_reg[1] = htonl(RD_REG_DWORD(&reg->iobase_sdata));
  1177. WRT_REG_DWORD(&reg->iobase_select, 0xB0200000);
  1178. fw->shadow_reg[2] = htonl(RD_REG_DWORD(&reg->iobase_sdata));
  1179. WRT_REG_DWORD(&reg->iobase_select, 0xB0300000);
  1180. fw->shadow_reg[3] = htonl(RD_REG_DWORD(&reg->iobase_sdata));
  1181. WRT_REG_DWORD(&reg->iobase_select, 0xB0400000);
  1182. fw->shadow_reg[4] = htonl(RD_REG_DWORD(&reg->iobase_sdata));
  1183. WRT_REG_DWORD(&reg->iobase_select, 0xB0500000);
  1184. fw->shadow_reg[5] = htonl(RD_REG_DWORD(&reg->iobase_sdata));
  1185. WRT_REG_DWORD(&reg->iobase_select, 0xB0600000);
  1186. fw->shadow_reg[6] = htonl(RD_REG_DWORD(&reg->iobase_sdata));
  1187. WRT_REG_DWORD(&reg->iobase_select, 0xB0700000);
  1188. fw->shadow_reg[7] = htonl(RD_REG_DWORD(&reg->iobase_sdata));
  1189. WRT_REG_DWORD(&reg->iobase_select, 0xB0800000);
  1190. fw->shadow_reg[8] = htonl(RD_REG_DWORD(&reg->iobase_sdata));
  1191. WRT_REG_DWORD(&reg->iobase_select, 0xB0900000);
  1192. fw->shadow_reg[9] = htonl(RD_REG_DWORD(&reg->iobase_sdata));
  1193. WRT_REG_DWORD(&reg->iobase_select, 0xB0A00000);
  1194. fw->shadow_reg[10] = htonl(RD_REG_DWORD(&reg->iobase_sdata));
  1195. /* RISC I/O register. */
  1196. WRT_REG_DWORD(&reg->iobase_addr, 0x0010);
  1197. RD_REG_DWORD(&reg->iobase_addr);
  1198. fw->risc_io_reg = htonl(RD_REG_DWORD(&reg->iobase_window));
  1199. /* Mailbox registers. */
  1200. mbx_reg = &reg->mailbox0;
  1201. for (cnt = 0; cnt < sizeof(fw->mailbox_reg) / 2; cnt++)
  1202. fw->mailbox_reg[cnt] = htons(RD_REG_WORD(mbx_reg++));
  1203. /* Transfer sequence registers. */
  1204. iter_reg = fw->xseq_gp_reg;
  1205. WRT_REG_DWORD(&reg->iobase_addr, 0xBF00);
  1206. dmp_reg = &reg->iobase_window;
  1207. for (cnt = 0; cnt < 16; cnt++)
  1208. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  1209. WRT_REG_DWORD(&reg->iobase_addr, 0xBF10);
  1210. dmp_reg = &reg->iobase_window;
  1211. for (cnt = 0; cnt < 16; cnt++)
  1212. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  1213. WRT_REG_DWORD(&reg->iobase_addr, 0xBF20);
  1214. dmp_reg = &reg->iobase_window;
  1215. for (cnt = 0; cnt < 16; cnt++)
  1216. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  1217. WRT_REG_DWORD(&reg->iobase_addr, 0xBF30);
  1218. dmp_reg = &reg->iobase_window;
  1219. for (cnt = 0; cnt < 16; cnt++)
  1220. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  1221. WRT_REG_DWORD(&reg->iobase_addr, 0xBF40);
  1222. dmp_reg = &reg->iobase_window;
  1223. for (cnt = 0; cnt < 16; cnt++)
  1224. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  1225. WRT_REG_DWORD(&reg->iobase_addr, 0xBF50);
  1226. dmp_reg = &reg->iobase_window;
  1227. for (cnt = 0; cnt < 16; cnt++)
  1228. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  1229. WRT_REG_DWORD(&reg->iobase_addr, 0xBF60);
  1230. dmp_reg = &reg->iobase_window;
  1231. for (cnt = 0; cnt < 16; cnt++)
  1232. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  1233. WRT_REG_DWORD(&reg->iobase_addr, 0xBF70);
  1234. dmp_reg = &reg->iobase_window;
  1235. for (cnt = 0; cnt < 16; cnt++)
  1236. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  1237. iter_reg = fw->xseq_0_reg;
  1238. WRT_REG_DWORD(&reg->iobase_addr, 0xBFC0);
  1239. dmp_reg = &reg->iobase_window;
  1240. for (cnt = 0; cnt < 16; cnt++)
  1241. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  1242. WRT_REG_DWORD(&reg->iobase_addr, 0xBFD0);
  1243. dmp_reg = &reg->iobase_window;
  1244. for (cnt = 0; cnt < 16; cnt++)
  1245. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  1246. WRT_REG_DWORD(&reg->iobase_addr, 0xBFE0);
  1247. dmp_reg = &reg->iobase_window;
  1248. for (cnt = 0; cnt < 16; cnt++)
  1249. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  1250. WRT_REG_DWORD(&reg->iobase_addr, 0xBFF0);
  1251. dmp_reg = &reg->iobase_window;
  1252. for (cnt = 0; cnt < sizeof(fw->xseq_1_reg) / 4; cnt++)
  1253. fw->xseq_1_reg[cnt] = htonl(RD_REG_DWORD(dmp_reg++));
  1254. /* Receive sequence registers. */
  1255. iter_reg = fw->rseq_gp_reg;
  1256. WRT_REG_DWORD(&reg->iobase_addr, 0xFF00);
  1257. dmp_reg = &reg->iobase_window;
  1258. for (cnt = 0; cnt < 16; cnt++)
  1259. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  1260. WRT_REG_DWORD(&reg->iobase_addr, 0xFF10);
  1261. dmp_reg = &reg->iobase_window;
  1262. for (cnt = 0; cnt < 16; cnt++)
  1263. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  1264. WRT_REG_DWORD(&reg->iobase_addr, 0xFF20);
  1265. dmp_reg = &reg->iobase_window;
  1266. for (cnt = 0; cnt < 16; cnt++)
  1267. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  1268. WRT_REG_DWORD(&reg->iobase_addr, 0xFF30);
  1269. dmp_reg = &reg->iobase_window;
  1270. for (cnt = 0; cnt < 16; cnt++)
  1271. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  1272. WRT_REG_DWORD(&reg->iobase_addr, 0xFF40);
  1273. dmp_reg = &reg->iobase_window;
  1274. for (cnt = 0; cnt < 16; cnt++)
  1275. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  1276. WRT_REG_DWORD(&reg->iobase_addr, 0xFF50);
  1277. dmp_reg = &reg->iobase_window;
  1278. for (cnt = 0; cnt < 16; cnt++)
  1279. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  1280. WRT_REG_DWORD(&reg->iobase_addr, 0xFF60);
  1281. dmp_reg = &reg->iobase_window;
  1282. for (cnt = 0; cnt < 16; cnt++)
  1283. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  1284. WRT_REG_DWORD(&reg->iobase_addr, 0xFF70);
  1285. dmp_reg = &reg->iobase_window;
  1286. for (cnt = 0; cnt < 16; cnt++)
  1287. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  1288. iter_reg = fw->rseq_0_reg;
  1289. WRT_REG_DWORD(&reg->iobase_addr, 0xFFC0);
  1290. dmp_reg = &reg->iobase_window;
  1291. for (cnt = 0; cnt < 16; cnt++)
  1292. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  1293. WRT_REG_DWORD(&reg->iobase_addr, 0xFFD0);
  1294. dmp_reg = &reg->iobase_window;
  1295. for (cnt = 0; cnt < 16; cnt++)
  1296. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  1297. WRT_REG_DWORD(&reg->iobase_addr, 0xFFE0);
  1298. dmp_reg = &reg->iobase_window;
  1299. for (cnt = 0; cnt < sizeof(fw->rseq_1_reg) / 4; cnt++)
  1300. fw->rseq_1_reg[cnt] = htonl(RD_REG_DWORD(dmp_reg++));
  1301. WRT_REG_DWORD(&reg->iobase_addr, 0xFFF0);
  1302. dmp_reg = &reg->iobase_window;
  1303. for (cnt = 0; cnt < sizeof(fw->rseq_2_reg) / 4; cnt++)
  1304. fw->rseq_2_reg[cnt] = htonl(RD_REG_DWORD(dmp_reg++));
  1305. /* Auxiliary sequence registers. */
  1306. iter_reg = fw->aseq_gp_reg;
  1307. WRT_REG_DWORD(&reg->iobase_addr, 0xB000);
  1308. dmp_reg = &reg->iobase_window;
  1309. for (cnt = 0; cnt < 16; cnt++)
  1310. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  1311. WRT_REG_DWORD(&reg->iobase_addr, 0xB010);
  1312. dmp_reg = &reg->iobase_window;
  1313. for (cnt = 0; cnt < 16; cnt++)
  1314. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  1315. WRT_REG_DWORD(&reg->iobase_addr, 0xB020);
  1316. dmp_reg = &reg->iobase_window;
  1317. for (cnt = 0; cnt < 16; cnt++)
  1318. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  1319. WRT_REG_DWORD(&reg->iobase_addr, 0xB030);
  1320. dmp_reg = &reg->iobase_window;
  1321. for (cnt = 0; cnt < 16; cnt++)
  1322. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  1323. WRT_REG_DWORD(&reg->iobase_addr, 0xB040);
  1324. dmp_reg = &reg->iobase_window;
  1325. for (cnt = 0; cnt < 16; cnt++)
  1326. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  1327. WRT_REG_DWORD(&reg->iobase_addr, 0xB050);
  1328. dmp_reg = &reg->iobase_window;
  1329. for (cnt = 0; cnt < 16; cnt++)
  1330. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  1331. WRT_REG_DWORD(&reg->iobase_addr, 0xB060);
  1332. dmp_reg = &reg->iobase_window;
  1333. for (cnt = 0; cnt < 16; cnt++)
  1334. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  1335. WRT_REG_DWORD(&reg->iobase_addr, 0xB070);
  1336. dmp_reg = &reg->iobase_window;
  1337. for (cnt = 0; cnt < 16; cnt++)
  1338. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  1339. iter_reg = fw->aseq_0_reg;
  1340. WRT_REG_DWORD(&reg->iobase_addr, 0xB0C0);
  1341. dmp_reg = &reg->iobase_window;
  1342. for (cnt = 0; cnt < 16; cnt++)
  1343. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  1344. WRT_REG_DWORD(&reg->iobase_addr, 0xB0D0);
  1345. dmp_reg = &reg->iobase_window;
  1346. for (cnt = 0; cnt < 16; cnt++)
  1347. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  1348. WRT_REG_DWORD(&reg->iobase_addr, 0xB0E0);
  1349. dmp_reg = &reg->iobase_window;
  1350. for (cnt = 0; cnt < sizeof(fw->aseq_1_reg) / 4; cnt++)
  1351. fw->aseq_1_reg[cnt] = htonl(RD_REG_DWORD(dmp_reg++));
  1352. WRT_REG_DWORD(&reg->iobase_addr, 0xB0F0);
  1353. dmp_reg = &reg->iobase_window;
  1354. for (cnt = 0; cnt < sizeof(fw->aseq_2_reg) / 4; cnt++)
  1355. fw->aseq_2_reg[cnt] = htonl(RD_REG_DWORD(dmp_reg++));
  1356. /* Command DMA registers. */
  1357. WRT_REG_DWORD(&reg->iobase_addr, 0x7100);
  1358. dmp_reg = &reg->iobase_window;
  1359. for (cnt = 0; cnt < sizeof(fw->cmd_dma_reg) / 4; cnt++)
  1360. fw->cmd_dma_reg[cnt] = htonl(RD_REG_DWORD(dmp_reg++));
  1361. /* Queues. */
  1362. iter_reg = fw->req0_dma_reg;
  1363. WRT_REG_DWORD(&reg->iobase_addr, 0x7200);
  1364. dmp_reg = &reg->iobase_window;
  1365. for (cnt = 0; cnt < 8; cnt++)
  1366. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  1367. dmp_reg = &reg->iobase_q;
  1368. for (cnt = 0; cnt < 7; cnt++)
  1369. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  1370. iter_reg = fw->resp0_dma_reg;
  1371. WRT_REG_DWORD(&reg->iobase_addr, 0x7300);
  1372. dmp_reg = &reg->iobase_window;
  1373. for (cnt = 0; cnt < 8; cnt++)
  1374. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  1375. dmp_reg = &reg->iobase_q;
  1376. for (cnt = 0; cnt < 7; cnt++)
  1377. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  1378. iter_reg = fw->req1_dma_reg;
  1379. WRT_REG_DWORD(&reg->iobase_addr, 0x7400);
  1380. dmp_reg = &reg->iobase_window;
  1381. for (cnt = 0; cnt < 8; cnt++)
  1382. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  1383. dmp_reg = &reg->iobase_q;
  1384. for (cnt = 0; cnt < 7; cnt++)
  1385. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  1386. /* Transmit DMA registers. */
  1387. iter_reg = fw->xmt0_dma_reg;
  1388. WRT_REG_DWORD(&reg->iobase_addr, 0x7600);
  1389. dmp_reg = &reg->iobase_window;
  1390. for (cnt = 0; cnt < 16; cnt++)
  1391. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  1392. WRT_REG_DWORD(&reg->iobase_addr, 0x7610);
  1393. dmp_reg = &reg->iobase_window;
  1394. for (cnt = 0; cnt < 16; cnt++)
  1395. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  1396. iter_reg = fw->xmt1_dma_reg;
  1397. WRT_REG_DWORD(&reg->iobase_addr, 0x7620);
  1398. dmp_reg = &reg->iobase_window;
  1399. for (cnt = 0; cnt < 16; cnt++)
  1400. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  1401. WRT_REG_DWORD(&reg->iobase_addr, 0x7630);
  1402. dmp_reg = &reg->iobase_window;
  1403. for (cnt = 0; cnt < 16; cnt++)
  1404. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  1405. iter_reg = fw->xmt2_dma_reg;
  1406. WRT_REG_DWORD(&reg->iobase_addr, 0x7640);
  1407. dmp_reg = &reg->iobase_window;
  1408. for (cnt = 0; cnt < 16; cnt++)
  1409. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  1410. WRT_REG_DWORD(&reg->iobase_addr, 0x7650);
  1411. dmp_reg = &reg->iobase_window;
  1412. for (cnt = 0; cnt < 16; cnt++)
  1413. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  1414. iter_reg = fw->xmt3_dma_reg;
  1415. WRT_REG_DWORD(&reg->iobase_addr, 0x7660);
  1416. dmp_reg = &reg->iobase_window;
  1417. for (cnt = 0; cnt < 16; cnt++)
  1418. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  1419. WRT_REG_DWORD(&reg->iobase_addr, 0x7670);
  1420. dmp_reg = &reg->iobase_window;
  1421. for (cnt = 0; cnt < 16; cnt++)
  1422. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  1423. iter_reg = fw->xmt4_dma_reg;
  1424. WRT_REG_DWORD(&reg->iobase_addr, 0x7680);
  1425. dmp_reg = &reg->iobase_window;
  1426. for (cnt = 0; cnt < 16; cnt++)
  1427. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  1428. WRT_REG_DWORD(&reg->iobase_addr, 0x7690);
  1429. dmp_reg = &reg->iobase_window;
  1430. for (cnt = 0; cnt < 16; cnt++)
  1431. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  1432. WRT_REG_DWORD(&reg->iobase_addr, 0x76A0);
  1433. dmp_reg = &reg->iobase_window;
  1434. for (cnt = 0; cnt < sizeof(fw->xmt_data_dma_reg) / 4; cnt++)
  1435. fw->xmt_data_dma_reg[cnt] =
  1436. htonl(RD_REG_DWORD(dmp_reg++));
  1437. /* Receive DMA registers. */
  1438. iter_reg = fw->rcvt0_data_dma_reg;
  1439. WRT_REG_DWORD(&reg->iobase_addr, 0x7700);
  1440. dmp_reg = &reg->iobase_window;
  1441. for (cnt = 0; cnt < 16; cnt++)
  1442. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  1443. WRT_REG_DWORD(&reg->iobase_addr, 0x7710);
  1444. dmp_reg = &reg->iobase_window;
  1445. for (cnt = 0; cnt < 16; cnt++)
  1446. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  1447. iter_reg = fw->rcvt1_data_dma_reg;
  1448. WRT_REG_DWORD(&reg->iobase_addr, 0x7720);
  1449. dmp_reg = &reg->iobase_window;
  1450. for (cnt = 0; cnt < 16; cnt++)
  1451. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  1452. WRT_REG_DWORD(&reg->iobase_addr, 0x7730);
  1453. dmp_reg = &reg->iobase_window;
  1454. for (cnt = 0; cnt < 16; cnt++)
  1455. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  1456. /* RISC registers. */
  1457. iter_reg = fw->risc_gp_reg;
  1458. WRT_REG_DWORD(&reg->iobase_addr, 0x0F00);
  1459. dmp_reg = &reg->iobase_window;
  1460. for (cnt = 0; cnt < 16; cnt++)
  1461. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  1462. WRT_REG_DWORD(&reg->iobase_addr, 0x0F10);
  1463. dmp_reg = &reg->iobase_window;
  1464. for (cnt = 0; cnt < 16; cnt++)
  1465. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  1466. WRT_REG_DWORD(&reg->iobase_addr, 0x0F20);
  1467. dmp_reg = &reg->iobase_window;
  1468. for (cnt = 0; cnt < 16; cnt++)
  1469. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  1470. WRT_REG_DWORD(&reg->iobase_addr, 0x0F30);
  1471. dmp_reg = &reg->iobase_window;
  1472. for (cnt = 0; cnt < 16; cnt++)
  1473. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  1474. WRT_REG_DWORD(&reg->iobase_addr, 0x0F40);
  1475. dmp_reg = &reg->iobase_window;
  1476. for (cnt = 0; cnt < 16; cnt++)
  1477. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  1478. WRT_REG_DWORD(&reg->iobase_addr, 0x0F50);
  1479. dmp_reg = &reg->iobase_window;
  1480. for (cnt = 0; cnt < 16; cnt++)
  1481. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  1482. WRT_REG_DWORD(&reg->iobase_addr, 0x0F60);
  1483. dmp_reg = &reg->iobase_window;
  1484. for (cnt = 0; cnt < 16; cnt++)
  1485. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  1486. WRT_REG_DWORD(&reg->iobase_addr, 0x0F70);
  1487. dmp_reg = &reg->iobase_window;
  1488. for (cnt = 0; cnt < 16; cnt++)
  1489. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  1490. /* Local memory controller registers. */
  1491. iter_reg = fw->lmc_reg;
  1492. WRT_REG_DWORD(&reg->iobase_addr, 0x3000);
  1493. dmp_reg = &reg->iobase_window;
  1494. for (cnt = 0; cnt < 16; cnt++)
  1495. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  1496. WRT_REG_DWORD(&reg->iobase_addr, 0x3010);
  1497. dmp_reg = &reg->iobase_window;
  1498. for (cnt = 0; cnt < 16; cnt++)
  1499. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  1500. WRT_REG_DWORD(&reg->iobase_addr, 0x3020);
  1501. dmp_reg = &reg->iobase_window;
  1502. for (cnt = 0; cnt < 16; cnt++)
  1503. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  1504. WRT_REG_DWORD(&reg->iobase_addr, 0x3030);
  1505. dmp_reg = &reg->iobase_window;
  1506. for (cnt = 0; cnt < 16; cnt++)
  1507. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  1508. WRT_REG_DWORD(&reg->iobase_addr, 0x3040);
  1509. dmp_reg = &reg->iobase_window;
  1510. for (cnt = 0; cnt < 16; cnt++)
  1511. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  1512. WRT_REG_DWORD(&reg->iobase_addr, 0x3050);
  1513. dmp_reg = &reg->iobase_window;
  1514. for (cnt = 0; cnt < 16; cnt++)
  1515. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  1516. WRT_REG_DWORD(&reg->iobase_addr, 0x3060);
  1517. dmp_reg = &reg->iobase_window;
  1518. for (cnt = 0; cnt < 16; cnt++)
  1519. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  1520. WRT_REG_DWORD(&reg->iobase_addr, 0x3070);
  1521. dmp_reg = &reg->iobase_window;
  1522. for (cnt = 0; cnt < 16; cnt++)
  1523. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  1524. /* Fibre Protocol Module registers. */
  1525. iter_reg = fw->fpm_hdw_reg;
  1526. WRT_REG_DWORD(&reg->iobase_addr, 0x4000);
  1527. dmp_reg = &reg->iobase_window;
  1528. for (cnt = 0; cnt < 16; cnt++)
  1529. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  1530. WRT_REG_DWORD(&reg->iobase_addr, 0x4010);
  1531. dmp_reg = &reg->iobase_window;
  1532. for (cnt = 0; cnt < 16; cnt++)
  1533. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  1534. WRT_REG_DWORD(&reg->iobase_addr, 0x4020);
  1535. dmp_reg = &reg->iobase_window;
  1536. for (cnt = 0; cnt < 16; cnt++)
  1537. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  1538. WRT_REG_DWORD(&reg->iobase_addr, 0x4030);
  1539. dmp_reg = &reg->iobase_window;
  1540. for (cnt = 0; cnt < 16; cnt++)
  1541. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  1542. WRT_REG_DWORD(&reg->iobase_addr, 0x4040);
  1543. dmp_reg = &reg->iobase_window;
  1544. for (cnt = 0; cnt < 16; cnt++)
  1545. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  1546. WRT_REG_DWORD(&reg->iobase_addr, 0x4050);
  1547. dmp_reg = &reg->iobase_window;
  1548. for (cnt = 0; cnt < 16; cnt++)
  1549. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  1550. WRT_REG_DWORD(&reg->iobase_addr, 0x4060);
  1551. dmp_reg = &reg->iobase_window;
  1552. for (cnt = 0; cnt < 16; cnt++)
  1553. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  1554. WRT_REG_DWORD(&reg->iobase_addr, 0x4070);
  1555. dmp_reg = &reg->iobase_window;
  1556. for (cnt = 0; cnt < 16; cnt++)
  1557. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  1558. WRT_REG_DWORD(&reg->iobase_addr, 0x4080);
  1559. dmp_reg = &reg->iobase_window;
  1560. for (cnt = 0; cnt < 16; cnt++)
  1561. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  1562. WRT_REG_DWORD(&reg->iobase_addr, 0x4090);
  1563. dmp_reg = &reg->iobase_window;
  1564. for (cnt = 0; cnt < 16; cnt++)
  1565. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  1566. WRT_REG_DWORD(&reg->iobase_addr, 0x40A0);
  1567. dmp_reg = &reg->iobase_window;
  1568. for (cnt = 0; cnt < 16; cnt++)
  1569. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  1570. WRT_REG_DWORD(&reg->iobase_addr, 0x40B0);
  1571. dmp_reg = &reg->iobase_window;
  1572. for (cnt = 0; cnt < 16; cnt++)
  1573. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  1574. /* Frame Buffer registers. */
  1575. iter_reg = fw->fb_hdw_reg;
  1576. WRT_REG_DWORD(&reg->iobase_addr, 0x6000);
  1577. dmp_reg = &reg->iobase_window;
  1578. for (cnt = 0; cnt < 16; cnt++)
  1579. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  1580. WRT_REG_DWORD(&reg->iobase_addr, 0x6010);
  1581. dmp_reg = &reg->iobase_window;
  1582. for (cnt = 0; cnt < 16; cnt++)
  1583. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  1584. WRT_REG_DWORD(&reg->iobase_addr, 0x6020);
  1585. dmp_reg = &reg->iobase_window;
  1586. for (cnt = 0; cnt < 16; cnt++)
  1587. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  1588. WRT_REG_DWORD(&reg->iobase_addr, 0x6030);
  1589. dmp_reg = &reg->iobase_window;
  1590. for (cnt = 0; cnt < 16; cnt++)
  1591. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  1592. WRT_REG_DWORD(&reg->iobase_addr, 0x6040);
  1593. dmp_reg = &reg->iobase_window;
  1594. for (cnt = 0; cnt < 16; cnt++)
  1595. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  1596. WRT_REG_DWORD(&reg->iobase_addr, 0x6100);
  1597. dmp_reg = &reg->iobase_window;
  1598. for (cnt = 0; cnt < 16; cnt++)
  1599. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  1600. WRT_REG_DWORD(&reg->iobase_addr, 0x6130);
  1601. dmp_reg = &reg->iobase_window;
  1602. for (cnt = 0; cnt < 16; cnt++)
  1603. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  1604. WRT_REG_DWORD(&reg->iobase_addr, 0x6150);
  1605. dmp_reg = &reg->iobase_window;
  1606. for (cnt = 0; cnt < 16; cnt++)
  1607. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  1608. WRT_REG_DWORD(&reg->iobase_addr, 0x6170);
  1609. dmp_reg = &reg->iobase_window;
  1610. for (cnt = 0; cnt < 16; cnt++)
  1611. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  1612. WRT_REG_DWORD(&reg->iobase_addr, 0x6190);
  1613. dmp_reg = &reg->iobase_window;
  1614. for (cnt = 0; cnt < 16; cnt++)
  1615. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  1616. WRT_REG_DWORD(&reg->iobase_addr, 0x61B0);
  1617. dmp_reg = &reg->iobase_window;
  1618. for (cnt = 0; cnt < 16; cnt++)
  1619. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  1620. WRT_REG_DWORD(&reg->iobase_addr, 0x6F00);
  1621. dmp_reg = &reg->iobase_window;
  1622. for (cnt = 0; cnt < 16; cnt++)
  1623. *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));
  1624. /* Reset RISC. */
  1625. WRT_REG_DWORD(&reg->ctrl_status,
  1626. CSRX_DMA_SHUTDOWN|MWB_4096_BYTES);
  1627. for (cnt = 0; cnt < 30000; cnt++) {
  1628. if ((RD_REG_DWORD(&reg->ctrl_status) &
  1629. CSRX_DMA_ACTIVE) == 0)
  1630. break;
  1631. udelay(10);
  1632. }
  1633. WRT_REG_DWORD(&reg->ctrl_status,
  1634. CSRX_ISP_SOFT_RESET|CSRX_DMA_SHUTDOWN|MWB_4096_BYTES);
  1635. pci_read_config_word(ha->pdev, PCI_COMMAND, &wd);
  1636. udelay(100);
  1637. /* Wait for firmware to complete NVRAM accesses. */
  1638. mb0 = (uint32_t) RD_REG_WORD(&reg->mailbox0);
  1639. for (cnt = 10000 ; cnt && mb0; cnt--) {
  1640. udelay(5);
  1641. mb0 = (uint32_t) RD_REG_WORD(&reg->mailbox0);
  1642. barrier();
  1643. }
  1644. /* Wait for soft-reset to complete. */
  1645. for (cnt = 0; cnt < 30000; cnt++) {
  1646. if ((RD_REG_DWORD(&reg->ctrl_status) &
  1647. CSRX_ISP_SOFT_RESET) == 0)
  1648. break;
  1649. udelay(10);
  1650. }
  1651. WRT_REG_DWORD(&reg->hccr, HCCRX_CLR_RISC_RESET);
  1652. RD_REG_DWORD(&reg->hccr); /* PCI Posting. */
  1653. }
  1654. for (cnt = 30000; RD_REG_WORD(&reg->mailbox0) != 0 &&
  1655. rval == QLA_SUCCESS; cnt--) {
  1656. if (cnt)
  1657. udelay(100);
  1658. else
  1659. rval = QLA_FUNCTION_TIMEOUT;
  1660. }
  1661. if (rval == QLA_SUCCESS)
  1662. rval = qla2xxx_dump_memory(ha, fw->code_ram,
  1663. sizeof(fw->code_ram), fw->ext_mem, &nxt);
  1664. if (rval == QLA_SUCCESS) {
  1665. nxt = qla2xxx_copy_queues(ha, nxt);
  1666. if (ha->eft)
  1667. memcpy(nxt, ha->eft, ntohl(ha->fw_dump->eft_size));
  1668. }
  1669. if (rval != QLA_SUCCESS) {
  1670. qla_printk(KERN_WARNING, ha,
  1671. "Failed to dump firmware (%x)!!!\n", rval);
  1672. ha->fw_dumped = 0;
  1673. } else {
  1674. qla_printk(KERN_INFO, ha,
  1675. "Firmware dump saved to temp buffer (%ld/%p).\n",
  1676. ha->host_no, ha->fw_dump);
  1677. ha->fw_dumped = 1;
  1678. }
  1679. qla25xx_fw_dump_failed:
  1680. if (!hardware_locked)
  1681. spin_unlock_irqrestore(&ha->hardware_lock, flags);
  1682. }
  1683. /****************************************************************************/
  1684. /* Driver Debug Functions. */
  1685. /****************************************************************************/
  1686. void
  1687. qla2x00_dump_regs(scsi_qla_host_t *ha)
  1688. {
  1689. int i;
  1690. struct device_reg_2xxx __iomem *reg = &ha->iobase->isp;
  1691. struct device_reg_24xx __iomem *reg24 = &ha->iobase->isp24;
  1692. uint16_t __iomem *mbx_reg;
  1693. mbx_reg = IS_FWI2_CAPABLE(ha) ? &reg24->mailbox0:
  1694. MAILBOX_REG(ha, reg, 0);
  1695. printk("Mailbox registers:\n");
  1696. for (i = 0; i < 6; i++)
  1697. printk("scsi(%ld): mbox %d 0x%04x \n", ha->host_no, i,
  1698. RD_REG_WORD(mbx_reg++));
  1699. }
  1700. void
  1701. qla2x00_dump_buffer(uint8_t * b, uint32_t size)
  1702. {
  1703. uint32_t cnt;
  1704. uint8_t c;
  1705. printk(" 0 1 2 3 4 5 6 7 8 9 "
  1706. "Ah Bh Ch Dh Eh Fh\n");
  1707. printk("----------------------------------------"
  1708. "----------------------\n");
  1709. for (cnt = 0; cnt < size;) {
  1710. c = *b++;
  1711. printk("%02x",(uint32_t) c);
  1712. cnt++;
  1713. if (!(cnt % 16))
  1714. printk("\n");
  1715. else
  1716. printk(" ");
  1717. }
  1718. if (cnt % 16)
  1719. printk("\n");
  1720. }
  1721. /**************************************************************************
  1722. * qla2x00_print_scsi_cmd
  1723. * Dumps out info about the scsi cmd and srb.
  1724. * Input
  1725. * cmd : struct scsi_cmnd
  1726. **************************************************************************/
  1727. void
  1728. qla2x00_print_scsi_cmd(struct scsi_cmnd * cmd)
  1729. {
  1730. int i;
  1731. struct scsi_qla_host *ha;
  1732. srb_t *sp;
  1733. ha = (struct scsi_qla_host *)cmd->device->host->hostdata;
  1734. sp = (srb_t *) cmd->SCp.ptr;
  1735. printk("SCSI Command @=0x%p, Handle=0x%p\n", cmd, cmd->host_scribble);
  1736. printk(" chan=0x%02x, target=0x%02x, lun=0x%02x, cmd_len=0x%02x\n",
  1737. cmd->device->channel, cmd->device->id, cmd->device->lun,
  1738. cmd->cmd_len);
  1739. printk(" CDB: ");
  1740. for (i = 0; i < cmd->cmd_len; i++) {
  1741. printk("0x%02x ", cmd->cmnd[i]);
  1742. }
  1743. printk("\n seg_cnt=%d, allowed=%d, retries=%d\n",
  1744. scsi_sg_count(cmd), cmd->allowed, cmd->retries);
  1745. printk(" request buffer=0x%p, request buffer len=0x%x\n",
  1746. scsi_sglist(cmd), scsi_bufflen(cmd));
  1747. printk(" tag=%d, transfersize=0x%x\n",
  1748. cmd->tag, cmd->transfersize);
  1749. printk(" serial_number=%lx, SP=%p\n", cmd->serial_number, sp);
  1750. printk(" data direction=%d\n", cmd->sc_data_direction);
  1751. if (!sp)
  1752. return;
  1753. printk(" sp flags=0x%x\n", sp->flags);
  1754. }
  1755. void
  1756. qla2x00_dump_pkt(void *pkt)
  1757. {
  1758. uint32_t i;
  1759. uint8_t *data = (uint8_t *) pkt;
  1760. for (i = 0; i < 64; i++) {
  1761. if (!(i % 4))
  1762. printk("\n%02x: ", i);
  1763. printk("%02x ", data[i]);
  1764. }
  1765. printk("\n");
  1766. }
  1767. #if defined(QL_DEBUG_ROUTINES)
  1768. /*
  1769. * qla2x00_formatted_dump_buffer
  1770. * Prints string plus buffer.
  1771. *
  1772. * Input:
  1773. * string = Null terminated string (no newline at end).
  1774. * buffer = buffer address.
  1775. * wd_size = word size 8, 16, 32 or 64 bits
  1776. * count = number of words.
  1777. */
  1778. void
  1779. qla2x00_formatted_dump_buffer(char *string, uint8_t * buffer,
  1780. uint8_t wd_size, uint32_t count)
  1781. {
  1782. uint32_t cnt;
  1783. uint16_t *buf16;
  1784. uint32_t *buf32;
  1785. if (strcmp(string, "") != 0)
  1786. printk("%s\n",string);
  1787. switch (wd_size) {
  1788. case 8:
  1789. printk(" 0 1 2 3 4 5 6 7 "
  1790. "8 9 Ah Bh Ch Dh Eh Fh\n");
  1791. printk("-----------------------------------------"
  1792. "-------------------------------------\n");
  1793. for (cnt = 1; cnt <= count; cnt++, buffer++) {
  1794. printk("%02x",*buffer);
  1795. if (cnt % 16 == 0)
  1796. printk("\n");
  1797. else
  1798. printk(" ");
  1799. }
  1800. if (cnt % 16 != 0)
  1801. printk("\n");
  1802. break;
  1803. case 16:
  1804. printk(" 0 2 4 6 8 Ah "
  1805. " Ch Eh\n");
  1806. printk("-----------------------------------------"
  1807. "-------------\n");
  1808. buf16 = (uint16_t *) buffer;
  1809. for (cnt = 1; cnt <= count; cnt++, buf16++) {
  1810. printk("%4x",*buf16);
  1811. if (cnt % 8 == 0)
  1812. printk("\n");
  1813. else if (*buf16 < 10)
  1814. printk(" ");
  1815. else
  1816. printk(" ");
  1817. }
  1818. if (cnt % 8 != 0)
  1819. printk("\n");
  1820. break;
  1821. case 32:
  1822. printk(" 0 4 8 Ch\n");
  1823. printk("------------------------------------------\n");
  1824. buf32 = (uint32_t *) buffer;
  1825. for (cnt = 1; cnt <= count; cnt++, buf32++) {
  1826. printk("%8x", *buf32);
  1827. if (cnt % 4 == 0)
  1828. printk("\n");
  1829. else if (*buf32 < 10)
  1830. printk(" ");
  1831. else
  1832. printk(" ");
  1833. }
  1834. if (cnt % 4 != 0)
  1835. printk("\n");
  1836. break;
  1837. default:
  1838. break;
  1839. }
  1840. }
  1841. #endif