177adf3f0SThomas Gleixner // SPDX-License-Identifier: GPL-2.0-only
21da177e4SLinus Torvalds /*
3fa90c54fSAndrew Vasquez * QLogic Fibre Channel HBA Driver
4bd21eaf9SArmen Baloyan * Copyright (c) 2003-2014 QLogic Corporation
51da177e4SLinus Torvalds */
63ce8866cSSaurav Kashyap
73ce8866cSSaurav Kashyap /*
83ce8866cSSaurav Kashyap * Table for showing the current message id in use for particular level
93ce8866cSSaurav Kashyap * Change this table for addition of log/debug messages.
10e02587d7SArun Easi * ----------------------------------------------------------------------
11e02587d7SArun Easi * | Level | Last Value Used | Holes |
12e02587d7SArun Easi * ----------------------------------------------------------------------
139f2475feSShyam Sundar * | Module Init and Probe | 0x0199 | |
149f2475feSShyam Sundar * | Mailbox commands | 0x1206 | 0x11a5-0x11ff |
15875386b9SManish Rangankar * | Device Discovery | 0x2134 | 0x2112-0x2115 |
16875386b9SManish Rangankar * | | | 0x2127-0x2128 |
176eb54715SHimanshu Madhani * | Queue Command and IO tracing | 0x3074 | 0x300b |
189e522cd8SArun Easi * | | | 0x3027-0x3028 |
198ae6d9c7SGiridhar Malavali * | | | 0x303d-0x3041 |
20e9105c4bSManish Rangankar * | | | 0x302e,0x3033 |
218ae6d9c7SGiridhar Malavali * | | | 0x3036,0x3038 |
228ae6d9c7SGiridhar Malavali * | | | 0x303a |
23e8f5e95dSArmen Baloyan * | DPC Thread | 0x4023 | 0x4002,0x4013 |
249f2475feSShyam Sundar * | Async Events | 0x509c | |
2571e56003SArmen Baloyan * | Timer Routines | 0x6012 | |
26243de676SHarish Zunjarrao * | User Space Interactions | 0x70e3 | 0x7018,0x702e |
27f73cb695SChad Dupuis * | | | 0x7020,0x7024 |
28f73cb695SChad Dupuis * | | | 0x7039,0x7045 |
29f73cb695SChad Dupuis * | | | 0x7073-0x7075 |
30f73cb695SChad Dupuis * | | | 0x70a5-0x70a6 |
31f73cb695SChad Dupuis * | | | 0x70a8,0x70ab |
32f73cb695SChad Dupuis * | | | 0x70ad-0x70ae |
33f1d7ce65SJoe Carnuccio * | | | 0x70d0-0x70d6 |
34f73cb695SChad Dupuis * | | | 0x70d7-0x70db |
351608cc4aSQuinn Tran * | Task Management | 0x8042 | 0x8000 |
3663ee7072SChad Dupuis * | | | 0x8019 |
377108b76eSChad Dupuis * | | | 0x8025,0x8026 |
387108b76eSChad Dupuis * | | | 0x8031,0x8032 |
397108b76eSChad Dupuis * | | | 0x8039,0x803c |
405f28d2d7SSaurav Kashyap * | AER/EEH | 0x9011 | |
41e02587d7SArun Easi * | Virtual Port | 0xa007 | |
4227f4b72fSAtul Deshmukh * | ISP82XX Specific | 0xb157 | 0xb002,0xb024 |
437ec0effdSAtul Deshmukh * | | | 0xb09e,0xb0ae |
44a018d8ffSHiral Patel * | | | 0xb0c3,0xb0c6 |
457ec0effdSAtul Deshmukh * | | | 0xb0e0-0xb0ef |
467ec0effdSAtul Deshmukh * | | | 0xb085,0xb0dc |
477ec0effdSAtul Deshmukh * | | | 0xb107,0xb108 |
487ec0effdSAtul Deshmukh * | | | 0xb111,0xb11e |
497ec0effdSAtul Deshmukh * | | | 0xb12c,0xb12d |
507ec0effdSAtul Deshmukh * | | | 0xb13a,0xb142 |
517ec0effdSAtul Deshmukh * | | | 0xb13c-0xb140 |
526ddcfef7SSaurav Kashyap * | | | 0xb149 |
53d7459527SMichael Hernandez * | MultiQ | 0xc010 | |
541cbc0efcSDarren Trapp * | Misc | 0xd303 | 0xd031-0xd0ff |
55f73cb695SChad Dupuis * | | | 0xd101-0xd1fe |
562ac224bcSJoe Carnuccio * | | | 0xd214-0xd2fe |
5783548fe2SQuinn Tran * | Target Mode | 0xe081 | |
58b7bd104eSAlexei Potashnik * | Target Mode Management | 0xf09b | 0xf002 |
596ddcfef7SSaurav Kashyap * | | | 0xf046-0xf049 |
60a6ca8878SAlexei Potashnik * | Target Mode Task Management | 0x1000d | |
61e02587d7SArun Easi * ----------------------------------------------------------------------
623ce8866cSSaurav Kashyap */
633ce8866cSSaurav Kashyap
641da177e4SLinus Torvalds #include "qla_def.h"
651da177e4SLinus Torvalds
661da177e4SLinus Torvalds #include <linux/delay.h>
67598a90f2SRajan Shanmugavelu #define CREATE_TRACE_POINTS
68598a90f2SRajan Shanmugavelu #include <trace/events/qla.h>
691da177e4SLinus Torvalds
703ce8866cSSaurav Kashyap static uint32_t ql_dbg_offset = 0x800;
713ce8866cSSaurav Kashyap
72a7a167bfSAndrew Vasquez static inline void
qla2xxx_prep_dump(struct qla_hw_data * ha,struct qla2xxx_fw_dump * fw_dump)737b867cf7SAnirban Chakraborty qla2xxx_prep_dump(struct qla_hw_data *ha, struct qla2xxx_fw_dump *fw_dump)
74a7a167bfSAndrew Vasquez {
75a7a167bfSAndrew Vasquez fw_dump->fw_major_version = htonl(ha->fw_major_version);
76a7a167bfSAndrew Vasquez fw_dump->fw_minor_version = htonl(ha->fw_minor_version);
77a7a167bfSAndrew Vasquez fw_dump->fw_subminor_version = htonl(ha->fw_subminor_version);
78a7a167bfSAndrew Vasquez fw_dump->fw_attributes = htonl(ha->fw_attributes);
79a7a167bfSAndrew Vasquez
80a7a167bfSAndrew Vasquez fw_dump->vendor = htonl(ha->pdev->vendor);
81a7a167bfSAndrew Vasquez fw_dump->device = htonl(ha->pdev->device);
82a7a167bfSAndrew Vasquez fw_dump->subsystem_vendor = htonl(ha->pdev->subsystem_vendor);
83a7a167bfSAndrew Vasquez fw_dump->subsystem_device = htonl(ha->pdev->subsystem_device);
84a7a167bfSAndrew Vasquez }
85a7a167bfSAndrew Vasquez
86a7a167bfSAndrew Vasquez static inline void *
qla2xxx_copy_queues(struct qla_hw_data * ha,void * ptr)8773208dfdSAnirban Chakraborty qla2xxx_copy_queues(struct qla_hw_data *ha, void *ptr)
88a7a167bfSAndrew Vasquez {
8973208dfdSAnirban Chakraborty struct req_que *req = ha->req_q_map[0];
9073208dfdSAnirban Chakraborty struct rsp_que *rsp = ha->rsp_q_map[0];
91a7a167bfSAndrew Vasquez /* Request queue. */
927b867cf7SAnirban Chakraborty memcpy(ptr, req->ring, req->length *
93a7a167bfSAndrew Vasquez sizeof(request_t));
94a7a167bfSAndrew Vasquez
95a7a167bfSAndrew Vasquez /* Response queue. */
967b867cf7SAnirban Chakraborty ptr += req->length * sizeof(request_t);
977b867cf7SAnirban Chakraborty memcpy(ptr, rsp->ring, rsp->length *
98a7a167bfSAndrew Vasquez sizeof(response_t));
99a7a167bfSAndrew Vasquez
1007b867cf7SAnirban Chakraborty return ptr + (rsp->length * sizeof(response_t));
101a7a167bfSAndrew Vasquez }
1021da177e4SLinus Torvalds
103f73cb695SChad Dupuis int
qla27xx_dump_mpi_ram(struct qla_hw_data * ha,uint32_t addr,uint32_t * ram,uint32_t ram_dwords,void ** nxt)104f73cb695SChad Dupuis qla27xx_dump_mpi_ram(struct qla_hw_data *ha, uint32_t addr, uint32_t *ram,
105f73cb695SChad Dupuis uint32_t ram_dwords, void **nxt)
106f73cb695SChad Dupuis {
107f73cb695SChad Dupuis struct device_reg_24xx __iomem *reg = &ha->iobase->isp24;
108f73cb695SChad Dupuis dma_addr_t dump_dma = ha->gid_list_dma;
109ab053c09SBart Van Assche uint32_t *chunk = (uint32_t *)ha->gid_list;
11024ef8f7eSJoe Carnuccio uint32_t dwords = qla2x00_gid_list_size(ha) / 4;
11124ef8f7eSJoe Carnuccio uint32_t stat;
11224ef8f7eSJoe Carnuccio ulong i, j, timer = 6000000;
11324ef8f7eSJoe Carnuccio int rval = QLA_FUNCTION_FAILED;
114f7a0ed47SQuinn Tran scsi_qla_host_t *vha = pci_get_drvdata(ha->pdev);
115f73cb695SChad Dupuis
11624ef8f7eSJoe Carnuccio clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);
117f7a0ed47SQuinn Tran
118f7a0ed47SQuinn Tran if (qla_pci_disconnected(vha, reg))
119f7a0ed47SQuinn Tran return rval;
120f7a0ed47SQuinn Tran
12124ef8f7eSJoe Carnuccio for (i = 0; i < ram_dwords; i += dwords, addr += dwords) {
12224ef8f7eSJoe Carnuccio if (i + dwords > ram_dwords)
12324ef8f7eSJoe Carnuccio dwords = ram_dwords - i;
124f73cb695SChad Dupuis
12504474d3aSBart Van Assche wrt_reg_word(®->mailbox0, MBC_LOAD_DUMP_MPI_RAM);
12604474d3aSBart Van Assche wrt_reg_word(®->mailbox1, LSW(addr));
12704474d3aSBart Van Assche wrt_reg_word(®->mailbox8, MSW(addr));
128f73cb695SChad Dupuis
12904474d3aSBart Van Assche wrt_reg_word(®->mailbox2, MSW(LSD(dump_dma)));
13004474d3aSBart Van Assche wrt_reg_word(®->mailbox3, LSW(LSD(dump_dma)));
13104474d3aSBart Van Assche wrt_reg_word(®->mailbox6, MSW(MSD(dump_dma)));
13204474d3aSBart Van Assche wrt_reg_word(®->mailbox7, LSW(MSD(dump_dma)));
133f73cb695SChad Dupuis
13404474d3aSBart Van Assche wrt_reg_word(®->mailbox4, MSW(dwords));
13504474d3aSBart Van Assche wrt_reg_word(®->mailbox5, LSW(dwords));
136f73cb695SChad Dupuis
13704474d3aSBart Van Assche wrt_reg_word(®->mailbox9, 0);
13804474d3aSBart Van Assche wrt_reg_dword(®->hccr, HCCRX_SET_HOST_INT);
139f73cb695SChad Dupuis
140f73cb695SChad Dupuis ha->flags.mbox_int = 0;
14124ef8f7eSJoe Carnuccio while (timer--) {
14224ef8f7eSJoe Carnuccio udelay(5);
14324ef8f7eSJoe Carnuccio
144f7a0ed47SQuinn Tran if (qla_pci_disconnected(vha, reg))
145f7a0ed47SQuinn Tran return rval;
146f7a0ed47SQuinn Tran
14704474d3aSBart Van Assche stat = rd_reg_dword(®->host_status);
14824ef8f7eSJoe Carnuccio /* Check for pending interrupts. */
14924ef8f7eSJoe Carnuccio if (!(stat & HSRX_RISC_INT))
15024ef8f7eSJoe Carnuccio continue;
15124ef8f7eSJoe Carnuccio
152f73cb695SChad Dupuis stat &= 0xff;
15324ef8f7eSJoe Carnuccio if (stat != 0x1 && stat != 0x2 &&
15424ef8f7eSJoe Carnuccio stat != 0x10 && stat != 0x11) {
155f73cb695SChad Dupuis
156f73cb695SChad Dupuis /* Clear this intr; it wasn't a mailbox intr */
15704474d3aSBart Van Assche wrt_reg_dword(®->hccr, HCCRX_CLR_RISC_INT);
15804474d3aSBart Van Assche rd_reg_dword(®->hccr);
15924ef8f7eSJoe Carnuccio continue;
160f73cb695SChad Dupuis }
16124ef8f7eSJoe Carnuccio
16224ef8f7eSJoe Carnuccio set_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);
16304474d3aSBart Van Assche rval = rd_reg_word(®->mailbox0) & MBS_MASK;
16404474d3aSBart Van Assche wrt_reg_dword(®->hccr, HCCRX_CLR_RISC_INT);
16504474d3aSBart Van Assche rd_reg_dword(®->hccr);
16624ef8f7eSJoe Carnuccio break;
167f73cb695SChad Dupuis }
168f73cb695SChad Dupuis ha->flags.mbox_int = 1;
16924ef8f7eSJoe Carnuccio *nxt = ram + i;
170f73cb695SChad Dupuis
17124ef8f7eSJoe Carnuccio if (!test_and_clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags)) {
17224ef8f7eSJoe Carnuccio /* no interrupt, timed out*/
173f73cb695SChad Dupuis return rval;
174f73cb695SChad Dupuis }
17524ef8f7eSJoe Carnuccio if (rval) {
17624ef8f7eSJoe Carnuccio /* error completion status */
17724ef8f7eSJoe Carnuccio return rval;
17824ef8f7eSJoe Carnuccio }
17924ef8f7eSJoe Carnuccio for (j = 0; j < dwords; j++) {
180ecc89f25SJoe Carnuccio ram[i + j] =
181ecc89f25SJoe Carnuccio (IS_QLA27XX(ha) || IS_QLA28XX(ha)) ?
18224ef8f7eSJoe Carnuccio chunk[j] : swab32(chunk[j]);
18324ef8f7eSJoe Carnuccio }
18424ef8f7eSJoe Carnuccio }
18524ef8f7eSJoe Carnuccio
18624ef8f7eSJoe Carnuccio *nxt = ram + i;
18724ef8f7eSJoe Carnuccio return QLA_SUCCESS;
18824ef8f7eSJoe Carnuccio }
189f73cb695SChad Dupuis
190f73cb695SChad Dupuis int
qla24xx_dump_ram(struct qla_hw_data * ha,uint32_t addr,__be32 * ram,uint32_t ram_dwords,void ** nxt)1917ffa5b93SBart Van Assche qla24xx_dump_ram(struct qla_hw_data *ha, uint32_t addr, __be32 *ram,
192c5722708SAndrew Vasquez uint32_t ram_dwords, void **nxt)
193c3a2f0dfSAndrew Vasquez {
19424ef8f7eSJoe Carnuccio int rval = QLA_FUNCTION_FAILED;
195c3a2f0dfSAndrew Vasquez struct device_reg_24xx __iomem *reg = &ha->iobase->isp24;
196c5722708SAndrew Vasquez dma_addr_t dump_dma = ha->gid_list_dma;
197ab053c09SBart Van Assche uint32_t *chunk = (uint32_t *)ha->gid_list;
19824ef8f7eSJoe Carnuccio uint32_t dwords = qla2x00_gid_list_size(ha) / 4;
19924ef8f7eSJoe Carnuccio uint32_t stat;
20024ef8f7eSJoe Carnuccio ulong i, j, timer = 6000000;
201f7a0ed47SQuinn Tran scsi_qla_host_t *vha = pci_get_drvdata(ha->pdev);
202c3a2f0dfSAndrew Vasquez
203c5722708SAndrew Vasquez clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);
204c5722708SAndrew Vasquez
205f7a0ed47SQuinn Tran if (qla_pci_disconnected(vha, reg))
206f7a0ed47SQuinn Tran return rval;
207f7a0ed47SQuinn Tran
20824ef8f7eSJoe Carnuccio for (i = 0; i < ram_dwords; i += dwords, addr += dwords) {
20924ef8f7eSJoe Carnuccio if (i + dwords > ram_dwords)
21024ef8f7eSJoe Carnuccio dwords = ram_dwords - i;
211c5722708SAndrew Vasquez
21204474d3aSBart Van Assche wrt_reg_word(®->mailbox0, MBC_DUMP_RISC_RAM_EXTENDED);
21304474d3aSBart Van Assche wrt_reg_word(®->mailbox1, LSW(addr));
21404474d3aSBart Van Assche wrt_reg_word(®->mailbox8, MSW(addr));
215044c218bSQuinn Tran wrt_reg_word(®->mailbox10, 0);
216c5722708SAndrew Vasquez
21704474d3aSBart Van Assche wrt_reg_word(®->mailbox2, MSW(LSD(dump_dma)));
21804474d3aSBart Van Assche wrt_reg_word(®->mailbox3, LSW(LSD(dump_dma)));
21904474d3aSBart Van Assche wrt_reg_word(®->mailbox6, MSW(MSD(dump_dma)));
22004474d3aSBart Van Assche wrt_reg_word(®->mailbox7, LSW(MSD(dump_dma)));
221c5722708SAndrew Vasquez
22204474d3aSBart Van Assche wrt_reg_word(®->mailbox4, MSW(dwords));
22304474d3aSBart Van Assche wrt_reg_word(®->mailbox5, LSW(dwords));
22404474d3aSBart Van Assche wrt_reg_dword(®->hccr, HCCRX_SET_HOST_INT);
225c5722708SAndrew Vasquez
226f73cb695SChad Dupuis ha->flags.mbox_int = 0;
22724ef8f7eSJoe Carnuccio while (timer--) {
22824ef8f7eSJoe Carnuccio udelay(5);
229f7a0ed47SQuinn Tran if (qla_pci_disconnected(vha, reg))
230f7a0ed47SQuinn Tran return rval;
23124ef8f7eSJoe Carnuccio
232f7a0ed47SQuinn Tran stat = rd_reg_dword(®->host_status);
23324ef8f7eSJoe Carnuccio /* Check for pending interrupts. */
23424ef8f7eSJoe Carnuccio if (!(stat & HSRX_RISC_INT))
23524ef8f7eSJoe Carnuccio continue;
23624ef8f7eSJoe Carnuccio
237c5722708SAndrew Vasquez stat &= 0xff;
23824ef8f7eSJoe Carnuccio if (stat != 0x1 && stat != 0x2 &&
23924ef8f7eSJoe Carnuccio stat != 0x10 && stat != 0x11) {
24004474d3aSBart Van Assche wrt_reg_dword(®->hccr, HCCRX_CLR_RISC_INT);
24104474d3aSBart Van Assche rd_reg_dword(®->hccr);
24224ef8f7eSJoe Carnuccio continue;
24324ef8f7eSJoe Carnuccio }
244c5722708SAndrew Vasquez
24524ef8f7eSJoe Carnuccio set_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);
24604474d3aSBart Van Assche rval = rd_reg_word(®->mailbox0) & MBS_MASK;
24704474d3aSBart Van Assche wrt_reg_dword(®->hccr, HCCRX_CLR_RISC_INT);
24804474d3aSBart Van Assche rd_reg_dword(®->hccr);
249c5722708SAndrew Vasquez break;
250c5722708SAndrew Vasquez }
251f73cb695SChad Dupuis ha->flags.mbox_int = 1;
25224ef8f7eSJoe Carnuccio *nxt = ram + i;
253c5722708SAndrew Vasquez
25424ef8f7eSJoe Carnuccio if (!test_and_clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags)) {
25524ef8f7eSJoe Carnuccio /* no interrupt, timed out*/
256c5722708SAndrew Vasquez return rval;
257c5722708SAndrew Vasquez }
25824ef8f7eSJoe Carnuccio if (rval) {
25924ef8f7eSJoe Carnuccio /* error completion status */
26024ef8f7eSJoe Carnuccio return rval;
26124ef8f7eSJoe Carnuccio }
26224ef8f7eSJoe Carnuccio for (j = 0; j < dwords; j++) {
2637ffa5b93SBart Van Assche ram[i + j] = (__force __be32)
2647ffa5b93SBart Van Assche ((IS_QLA27XX(ha) || IS_QLA28XX(ha)) ?
2657ffa5b93SBart Van Assche chunk[j] : swab32(chunk[j]));
26624ef8f7eSJoe Carnuccio }
26724ef8f7eSJoe Carnuccio }
26824ef8f7eSJoe Carnuccio
26924ef8f7eSJoe Carnuccio *nxt = ram + i;
27024ef8f7eSJoe Carnuccio return QLA_SUCCESS;
27124ef8f7eSJoe Carnuccio }
272c5722708SAndrew Vasquez
273c5722708SAndrew Vasquez static int
qla24xx_dump_memory(struct qla_hw_data * ha,__be32 * code_ram,uint32_t cram_size,void ** nxt)2747ffa5b93SBart Van Assche qla24xx_dump_memory(struct qla_hw_data *ha, __be32 *code_ram,
275c5722708SAndrew Vasquez uint32_t cram_size, void **nxt)
276c5722708SAndrew Vasquez {
277c5722708SAndrew Vasquez int rval;
278c3a2f0dfSAndrew Vasquez
279c3a2f0dfSAndrew Vasquez /* Code RAM. */
280c5722708SAndrew Vasquez rval = qla24xx_dump_ram(ha, 0x20000, code_ram, cram_size / 4, nxt);
281c5722708SAndrew Vasquez if (rval != QLA_SUCCESS)
282c3a2f0dfSAndrew Vasquez return rval;
283c5722708SAndrew Vasquez
28461f098ddSHiral Patel set_bit(RISC_SRAM_DUMP_CMPL, &ha->fw_dump_cap_flags);
28561f098ddSHiral Patel
286c5722708SAndrew Vasquez /* External Memory. */
28761f098ddSHiral Patel rval = qla24xx_dump_ram(ha, 0x100000, *nxt,
288c5722708SAndrew Vasquez ha->fw_memory_size - 0x100000 + 1, nxt);
28961f098ddSHiral Patel if (rval == QLA_SUCCESS)
29061f098ddSHiral Patel set_bit(RISC_EXT_MEM_DUMP_CMPL, &ha->fw_dump_cap_flags);
29161f098ddSHiral Patel
29261f098ddSHiral Patel return rval;
293c3a2f0dfSAndrew Vasquez }
294c3a2f0dfSAndrew Vasquez
2957ffa5b93SBart Van Assche static __be32 *
qla24xx_read_window(struct device_reg_24xx __iomem * reg,uint32_t iobase,uint32_t count,__be32 * buf)296c81d04c9SAndrew Vasquez qla24xx_read_window(struct device_reg_24xx __iomem *reg, uint32_t iobase,
2977ffa5b93SBart Van Assche uint32_t count, __be32 *buf)
298c81d04c9SAndrew Vasquez {
2997ffa5b93SBart Van Assche __le32 __iomem *dmp_reg;
300c81d04c9SAndrew Vasquez
30104474d3aSBart Van Assche wrt_reg_dword(®->iobase_addr, iobase);
302c81d04c9SAndrew Vasquez dmp_reg = ®->iobase_window;
303da08ef5cSJoe Carnuccio for ( ; count--; dmp_reg++)
30404474d3aSBart Van Assche *buf++ = htonl(rd_reg_dword(dmp_reg));
305c81d04c9SAndrew Vasquez
306c81d04c9SAndrew Vasquez return buf;
307c81d04c9SAndrew Vasquez }
308c81d04c9SAndrew Vasquez
3092f389fc4SHiral Patel void
qla24xx_pause_risc(struct device_reg_24xx __iomem * reg,struct qla_hw_data * ha)31061f098ddSHiral Patel qla24xx_pause_risc(struct device_reg_24xx __iomem *reg, struct qla_hw_data *ha)
311c81d04c9SAndrew Vasquez {
31204474d3aSBart Van Assche wrt_reg_dword(®->hccr, HCCRX_SET_RISC_PAUSE);
313c81d04c9SAndrew Vasquez
3142f389fc4SHiral Patel /* 100 usec delay is sufficient enough for hardware to pause RISC */
3152f389fc4SHiral Patel udelay(100);
31604474d3aSBart Van Assche if (rd_reg_dword(®->host_status) & HSRX_RISC_PAUSED)
31761f098ddSHiral Patel set_bit(RISC_PAUSE_CMPL, &ha->fw_dump_cap_flags);
318c81d04c9SAndrew Vasquez }
319c81d04c9SAndrew Vasquez
320f73cb695SChad Dupuis int
qla24xx_soft_reset(struct qla_hw_data * ha)3217b867cf7SAnirban Chakraborty qla24xx_soft_reset(struct qla_hw_data *ha)
322c81d04c9SAndrew Vasquez {
323c81d04c9SAndrew Vasquez int rval = QLA_SUCCESS;
324c81d04c9SAndrew Vasquez uint32_t cnt;
3252f389fc4SHiral Patel uint16_t wd;
326c81d04c9SAndrew Vasquez struct device_reg_24xx __iomem *reg = &ha->iobase->isp24;
327c81d04c9SAndrew Vasquez
3282f389fc4SHiral Patel /*
3292f389fc4SHiral Patel * Reset RISC. The delay is dependent on system architecture.
3302f389fc4SHiral Patel * Driver can proceed with the reset sequence after waiting
3312f389fc4SHiral Patel * for a timeout period.
3322f389fc4SHiral Patel */
33304474d3aSBart Van Assche wrt_reg_dword(®->ctrl_status, CSRX_DMA_SHUTDOWN|MWB_4096_BYTES);
334c81d04c9SAndrew Vasquez for (cnt = 0; cnt < 30000; cnt++) {
33504474d3aSBart Van Assche if ((rd_reg_dword(®->ctrl_status) & CSRX_DMA_ACTIVE) == 0)
336c81d04c9SAndrew Vasquez break;
337c81d04c9SAndrew Vasquez
338c81d04c9SAndrew Vasquez udelay(10);
339c81d04c9SAndrew Vasquez }
34004474d3aSBart Van Assche if (!(rd_reg_dword(®->ctrl_status) & CSRX_DMA_ACTIVE))
34161f098ddSHiral Patel set_bit(DMA_SHUTDOWN_CMPL, &ha->fw_dump_cap_flags);
342c81d04c9SAndrew Vasquez
34304474d3aSBart Van Assche wrt_reg_dword(®->ctrl_status,
344c81d04c9SAndrew Vasquez CSRX_ISP_SOFT_RESET|CSRX_DMA_SHUTDOWN|MWB_4096_BYTES);
345c81d04c9SAndrew Vasquez pci_read_config_word(ha->pdev, PCI_COMMAND, &wd);
346c81d04c9SAndrew Vasquez
347c81d04c9SAndrew Vasquez udelay(100);
348c81d04c9SAndrew Vasquez
349c81d04c9SAndrew Vasquez /* Wait for soft-reset to complete. */
350c81d04c9SAndrew Vasquez for (cnt = 0; cnt < 30000; cnt++) {
35104474d3aSBart Van Assche if ((rd_reg_dword(®->ctrl_status) &
352c81d04c9SAndrew Vasquez CSRX_ISP_SOFT_RESET) == 0)
353c81d04c9SAndrew Vasquez break;
354c81d04c9SAndrew Vasquez
355c81d04c9SAndrew Vasquez udelay(10);
356c81d04c9SAndrew Vasquez }
35704474d3aSBart Van Assche if (!(rd_reg_dword(®->ctrl_status) & CSRX_ISP_SOFT_RESET))
35861f098ddSHiral Patel set_bit(ISP_RESET_CMPL, &ha->fw_dump_cap_flags);
35961f098ddSHiral Patel
36004474d3aSBart Van Assche wrt_reg_dword(®->hccr, HCCRX_CLR_RISC_RESET);
36104474d3aSBart Van Assche rd_reg_dword(®->hccr); /* PCI Posting. */
362c81d04c9SAndrew Vasquez
36304474d3aSBart Van Assche for (cnt = 10000; rd_reg_word(®->mailbox0) != 0 &&
364c81d04c9SAndrew Vasquez rval == QLA_SUCCESS; cnt--) {
365c81d04c9SAndrew Vasquez if (cnt)
3662f389fc4SHiral Patel udelay(10);
367c81d04c9SAndrew Vasquez else
368c81d04c9SAndrew Vasquez rval = QLA_FUNCTION_TIMEOUT;
369c81d04c9SAndrew Vasquez }
37061f098ddSHiral Patel if (rval == QLA_SUCCESS)
37161f098ddSHiral Patel set_bit(RISC_RDY_AFT_RESET, &ha->fw_dump_cap_flags);
372c81d04c9SAndrew Vasquez
373c81d04c9SAndrew Vasquez return rval;
374c81d04c9SAndrew Vasquez }
375c81d04c9SAndrew Vasquez
376c5722708SAndrew Vasquez static int
qla2xxx_dump_ram(struct qla_hw_data * ha,uint32_t addr,__be16 * ram,uint32_t ram_words,void ** nxt)3777ffa5b93SBart Van Assche qla2xxx_dump_ram(struct qla_hw_data *ha, uint32_t addr, __be16 *ram,
378e18e963bSAndrew Vasquez uint32_t ram_words, void **nxt)
379c5722708SAndrew Vasquez {
380c5722708SAndrew Vasquez int rval;
381c5722708SAndrew Vasquez uint32_t cnt, stat, timer, words, idx;
382c5722708SAndrew Vasquez uint16_t mb0;
383c5722708SAndrew Vasquez struct device_reg_2xxx __iomem *reg = &ha->iobase->isp;
384c5722708SAndrew Vasquez dma_addr_t dump_dma = ha->gid_list_dma;
3857ffa5b93SBart Van Assche __le16 *dump = (__force __le16 *)ha->gid_list;
386c5722708SAndrew Vasquez
387c5722708SAndrew Vasquez rval = QLA_SUCCESS;
388c5722708SAndrew Vasquez mb0 = 0;
389c5722708SAndrew Vasquez
390c5722708SAndrew Vasquez WRT_MAILBOX_REG(ha, reg, 0, MBC_DUMP_RISC_RAM_EXTENDED);
391c5722708SAndrew Vasquez clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);
392c5722708SAndrew Vasquez
393642ef983SChad Dupuis words = qla2x00_gid_list_size(ha) / 2;
394c5722708SAndrew Vasquez for (cnt = 0; cnt < ram_words && rval == QLA_SUCCESS;
395c5722708SAndrew Vasquez cnt += words, addr += words) {
396c5722708SAndrew Vasquez if (cnt + words > ram_words)
397c5722708SAndrew Vasquez words = ram_words - cnt;
398c5722708SAndrew Vasquez
399c5722708SAndrew Vasquez WRT_MAILBOX_REG(ha, reg, 1, LSW(addr));
400c5722708SAndrew Vasquez WRT_MAILBOX_REG(ha, reg, 8, MSW(addr));
401c5722708SAndrew Vasquez
402c5722708SAndrew Vasquez WRT_MAILBOX_REG(ha, reg, 2, MSW(dump_dma));
403c5722708SAndrew Vasquez WRT_MAILBOX_REG(ha, reg, 3, LSW(dump_dma));
404c5722708SAndrew Vasquez WRT_MAILBOX_REG(ha, reg, 6, MSW(MSD(dump_dma)));
405c5722708SAndrew Vasquez WRT_MAILBOX_REG(ha, reg, 7, LSW(MSD(dump_dma)));
406c5722708SAndrew Vasquez
407c5722708SAndrew Vasquez WRT_MAILBOX_REG(ha, reg, 4, words);
40804474d3aSBart Van Assche wrt_reg_word(®->hccr, HCCR_SET_HOST_INT);
409c5722708SAndrew Vasquez
410c5722708SAndrew Vasquez for (timer = 6000000; timer; timer--) {
411c5722708SAndrew Vasquez /* Check for pending interrupts. */
41204474d3aSBart Van Assche stat = rd_reg_dword(®->u.isp2300.host_status);
413c5722708SAndrew Vasquez if (stat & HSR_RISC_INT) {
414c5722708SAndrew Vasquez stat &= 0xff;
415c5722708SAndrew Vasquez
416c5722708SAndrew Vasquez if (stat == 0x1 || stat == 0x2) {
417c5722708SAndrew Vasquez set_bit(MBX_INTERRUPT,
418c5722708SAndrew Vasquez &ha->mbx_cmd_flags);
419c5722708SAndrew Vasquez
420c5722708SAndrew Vasquez mb0 = RD_MAILBOX_REG(ha, reg, 0);
421c5722708SAndrew Vasquez
422c5722708SAndrew Vasquez /* Release mailbox registers. */
42304474d3aSBart Van Assche wrt_reg_word(®->semaphore, 0);
42404474d3aSBart Van Assche wrt_reg_word(®->hccr,
425c5722708SAndrew Vasquez HCCR_CLR_RISC_INT);
42604474d3aSBart Van Assche rd_reg_word(®->hccr);
427c5722708SAndrew Vasquez break;
428c5722708SAndrew Vasquez } else if (stat == 0x10 || stat == 0x11) {
429c5722708SAndrew Vasquez set_bit(MBX_INTERRUPT,
430c5722708SAndrew Vasquez &ha->mbx_cmd_flags);
431c5722708SAndrew Vasquez
432c5722708SAndrew Vasquez mb0 = RD_MAILBOX_REG(ha, reg, 0);
433c5722708SAndrew Vasquez
43404474d3aSBart Van Assche wrt_reg_word(®->hccr,
435c5722708SAndrew Vasquez HCCR_CLR_RISC_INT);
43604474d3aSBart Van Assche rd_reg_word(®->hccr);
437c5722708SAndrew Vasquez break;
438c5722708SAndrew Vasquez }
439c5722708SAndrew Vasquez
440c5722708SAndrew Vasquez /* clear this intr; it wasn't a mailbox intr */
44104474d3aSBart Van Assche wrt_reg_word(®->hccr, HCCR_CLR_RISC_INT);
44204474d3aSBart Van Assche rd_reg_word(®->hccr);
443c5722708SAndrew Vasquez }
444c5722708SAndrew Vasquez udelay(5);
445c5722708SAndrew Vasquez }
446c5722708SAndrew Vasquez
447c5722708SAndrew Vasquez if (test_and_clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags)) {
448c5722708SAndrew Vasquez rval = mb0 & MBS_MASK;
449c5722708SAndrew Vasquez for (idx = 0; idx < words; idx++)
4507ffa5b93SBart Van Assche ram[cnt + idx] =
4517ffa5b93SBart Van Assche cpu_to_be16(le16_to_cpu(dump[idx]));
452c5722708SAndrew Vasquez } else {
453c5722708SAndrew Vasquez rval = QLA_FUNCTION_FAILED;
454c5722708SAndrew Vasquez }
455c5722708SAndrew Vasquez }
456c5722708SAndrew Vasquez
457c5722708SAndrew Vasquez *nxt = rval == QLA_SUCCESS ? &ram[cnt] : NULL;
458c5722708SAndrew Vasquez return rval;
459c5722708SAndrew Vasquez }
460c5722708SAndrew Vasquez
461c81d04c9SAndrew Vasquez static inline void
qla2xxx_read_window(struct device_reg_2xxx __iomem * reg,uint32_t count,__be16 * buf)462c81d04c9SAndrew Vasquez qla2xxx_read_window(struct device_reg_2xxx __iomem *reg, uint32_t count,
4637ffa5b93SBart Van Assche __be16 *buf)
464c81d04c9SAndrew Vasquez {
4657ffa5b93SBart Van Assche __le16 __iomem *dmp_reg = ®->u.isp2300.fb_cmd;
466c81d04c9SAndrew Vasquez
467da08ef5cSJoe Carnuccio for ( ; count--; dmp_reg++)
46804474d3aSBart Van Assche *buf++ = htons(rd_reg_word(dmp_reg));
469c81d04c9SAndrew Vasquez }
470c81d04c9SAndrew Vasquez
471bb99de67SAndrew Vasquez static inline void *
qla24xx_copy_eft(struct qla_hw_data * ha,void * ptr)472bb99de67SAndrew Vasquez qla24xx_copy_eft(struct qla_hw_data *ha, void *ptr)
473bb99de67SAndrew Vasquez {
474bb99de67SAndrew Vasquez if (!ha->eft)
475bb99de67SAndrew Vasquez return ptr;
476bb99de67SAndrew Vasquez
477bb99de67SAndrew Vasquez memcpy(ptr, ha->eft, ntohl(ha->fw_dump->eft_size));
478bb99de67SAndrew Vasquez return ptr + ntohl(ha->fw_dump->eft_size);
479bb99de67SAndrew Vasquez }
480bb99de67SAndrew Vasquez
481bb99de67SAndrew Vasquez static inline void *
qla25xx_copy_fce(struct qla_hw_data * ha,void * ptr,__be32 ** last_chain)4827ffa5b93SBart Van Assche qla25xx_copy_fce(struct qla_hw_data *ha, void *ptr, __be32 **last_chain)
483bb99de67SAndrew Vasquez {
484bb99de67SAndrew Vasquez uint32_t cnt;
4857ffa5b93SBart Van Assche __be32 *iter_reg;
486bb99de67SAndrew Vasquez struct qla2xxx_fce_chain *fcec = ptr;
487bb99de67SAndrew Vasquez
488bb99de67SAndrew Vasquez if (!ha->fce)
489bb99de67SAndrew Vasquez return ptr;
490bb99de67SAndrew Vasquez
491bb99de67SAndrew Vasquez *last_chain = &fcec->type;
492ad950360SBart Van Assche fcec->type = htonl(DUMP_CHAIN_FCE);
493bb99de67SAndrew Vasquez fcec->chain_size = htonl(sizeof(struct qla2xxx_fce_chain) +
494bb99de67SAndrew Vasquez fce_calc_size(ha->fce_bufs));
495bb99de67SAndrew Vasquez fcec->size = htonl(fce_calc_size(ha->fce_bufs));
496bb99de67SAndrew Vasquez fcec->addr_l = htonl(LSD(ha->fce_dma));
497bb99de67SAndrew Vasquez fcec->addr_h = htonl(MSD(ha->fce_dma));
498bb99de67SAndrew Vasquez
499bb99de67SAndrew Vasquez iter_reg = fcec->eregs;
500bb99de67SAndrew Vasquez for (cnt = 0; cnt < 8; cnt++)
501bb99de67SAndrew Vasquez *iter_reg++ = htonl(ha->fce_mb[cnt]);
502bb99de67SAndrew Vasquez
503bb99de67SAndrew Vasquez memcpy(iter_reg, ha->fce, ntohl(fcec->size));
504bb99de67SAndrew Vasquez
5053cb0a67dSGiridhar Malavali return (char *)iter_reg + ntohl(fcec->size);
506bb99de67SAndrew Vasquez }
507bb99de67SAndrew Vasquez
508d63ab533SAndrew Vasquez static inline void *
qla25xx_copy_exlogin(struct qla_hw_data * ha,void * ptr,__be32 ** last_chain)5097ffa5b93SBart Van Assche qla25xx_copy_exlogin(struct qla_hw_data *ha, void *ptr, __be32 **last_chain)
510b945e777SQuinn Tran {
511b945e777SQuinn Tran struct qla2xxx_offld_chain *c = ptr;
512b945e777SQuinn Tran
513b945e777SQuinn Tran if (!ha->exlogin_buf)
514b945e777SQuinn Tran return ptr;
515b945e777SQuinn Tran
516b945e777SQuinn Tran *last_chain = &c->type;
517b945e777SQuinn Tran
518b945e777SQuinn Tran c->type = cpu_to_be32(DUMP_CHAIN_EXLOGIN);
519b945e777SQuinn Tran c->chain_size = cpu_to_be32(sizeof(struct qla2xxx_offld_chain) +
520b945e777SQuinn Tran ha->exlogin_size);
521b945e777SQuinn Tran c->size = cpu_to_be32(ha->exlogin_size);
522b945e777SQuinn Tran c->addr = cpu_to_be64(ha->exlogin_buf_dma);
523b945e777SQuinn Tran
524b945e777SQuinn Tran ptr += sizeof(struct qla2xxx_offld_chain);
525b945e777SQuinn Tran memcpy(ptr, ha->exlogin_buf, ha->exlogin_size);
526b945e777SQuinn Tran
5277ffa5b93SBart Van Assche return (char *)ptr + be32_to_cpu(c->size);
528b945e777SQuinn Tran }
529b945e777SQuinn Tran
530b945e777SQuinn Tran static inline void *
qla81xx_copy_exchoffld(struct qla_hw_data * ha,void * ptr,__be32 ** last_chain)5317ffa5b93SBart Van Assche qla81xx_copy_exchoffld(struct qla_hw_data *ha, void *ptr, __be32 **last_chain)
532b945e777SQuinn Tran {
533b945e777SQuinn Tran struct qla2xxx_offld_chain *c = ptr;
534b945e777SQuinn Tran
535b945e777SQuinn Tran if (!ha->exchoffld_buf)
536b945e777SQuinn Tran return ptr;
537b945e777SQuinn Tran
538b945e777SQuinn Tran *last_chain = &c->type;
539b945e777SQuinn Tran
540b945e777SQuinn Tran c->type = cpu_to_be32(DUMP_CHAIN_EXCHG);
541b945e777SQuinn Tran c->chain_size = cpu_to_be32(sizeof(struct qla2xxx_offld_chain) +
542b945e777SQuinn Tran ha->exchoffld_size);
543b945e777SQuinn Tran c->size = cpu_to_be32(ha->exchoffld_size);
544b945e777SQuinn Tran c->addr = cpu_to_be64(ha->exchoffld_buf_dma);
545b945e777SQuinn Tran
546b945e777SQuinn Tran ptr += sizeof(struct qla2xxx_offld_chain);
547b945e777SQuinn Tran memcpy(ptr, ha->exchoffld_buf, ha->exchoffld_size);
548b945e777SQuinn Tran
5497ffa5b93SBart Van Assche return (char *)ptr + be32_to_cpu(c->size);
550b945e777SQuinn Tran }
551b945e777SQuinn Tran
552b945e777SQuinn Tran static inline void *
qla2xxx_copy_atioqueues(struct qla_hw_data * ha,void * ptr,__be32 ** last_chain)5532d70c103SNicholas Bellinger qla2xxx_copy_atioqueues(struct qla_hw_data *ha, void *ptr,
5547ffa5b93SBart Van Assche __be32 **last_chain)
5552d70c103SNicholas Bellinger {
5562d70c103SNicholas Bellinger struct qla2xxx_mqueue_chain *q;
5572d70c103SNicholas Bellinger struct qla2xxx_mqueue_header *qh;
5582d70c103SNicholas Bellinger uint32_t num_queues;
5592d70c103SNicholas Bellinger int que;
5602d70c103SNicholas Bellinger struct {
5612d70c103SNicholas Bellinger int length;
5622d70c103SNicholas Bellinger void *ring;
5632d70c103SNicholas Bellinger } aq, *aqp;
5642d70c103SNicholas Bellinger
56500876ae8SArun Easi if (!ha->tgt.atio_ring)
5662d70c103SNicholas Bellinger return ptr;
5672d70c103SNicholas Bellinger
5682d70c103SNicholas Bellinger num_queues = 1;
5692d70c103SNicholas Bellinger aqp = &aq;
5702d70c103SNicholas Bellinger aqp->length = ha->tgt.atio_q_length;
5712d70c103SNicholas Bellinger aqp->ring = ha->tgt.atio_ring;
5722d70c103SNicholas Bellinger
5732d70c103SNicholas Bellinger for (que = 0; que < num_queues; que++) {
5742d70c103SNicholas Bellinger /* aqp = ha->atio_q_map[que]; */
5752d70c103SNicholas Bellinger q = ptr;
5762d70c103SNicholas Bellinger *last_chain = &q->type;
577ad950360SBart Van Assche q->type = htonl(DUMP_CHAIN_QUEUE);
5782d70c103SNicholas Bellinger q->chain_size = htonl(
5792d70c103SNicholas Bellinger sizeof(struct qla2xxx_mqueue_chain) +
5802d70c103SNicholas Bellinger sizeof(struct qla2xxx_mqueue_header) +
5812d70c103SNicholas Bellinger (aqp->length * sizeof(request_t)));
5822d70c103SNicholas Bellinger ptr += sizeof(struct qla2xxx_mqueue_chain);
5832d70c103SNicholas Bellinger
5842d70c103SNicholas Bellinger /* Add header. */
5852d70c103SNicholas Bellinger qh = ptr;
586ad950360SBart Van Assche qh->queue = htonl(TYPE_ATIO_QUEUE);
5872d70c103SNicholas Bellinger qh->number = htonl(que);
5882d70c103SNicholas Bellinger qh->size = htonl(aqp->length * sizeof(request_t));
5892d70c103SNicholas Bellinger ptr += sizeof(struct qla2xxx_mqueue_header);
5902d70c103SNicholas Bellinger
5912d70c103SNicholas Bellinger /* Add data. */
5922d70c103SNicholas Bellinger memcpy(ptr, aqp->ring, aqp->length * sizeof(request_t));
5932d70c103SNicholas Bellinger
5942d70c103SNicholas Bellinger ptr += aqp->length * sizeof(request_t);
5952d70c103SNicholas Bellinger }
5962d70c103SNicholas Bellinger
5972d70c103SNicholas Bellinger return ptr;
5982d70c103SNicholas Bellinger }
5992d70c103SNicholas Bellinger
6002d70c103SNicholas Bellinger static inline void *
qla25xx_copy_mqueues(struct qla_hw_data * ha,void * ptr,__be32 ** last_chain)6017ffa5b93SBart Van Assche qla25xx_copy_mqueues(struct qla_hw_data *ha, void *ptr, __be32 **last_chain)
602050c9bb1SGiridhar Malavali {
603050c9bb1SGiridhar Malavali struct qla2xxx_mqueue_chain *q;
604050c9bb1SGiridhar Malavali struct qla2xxx_mqueue_header *qh;
605050c9bb1SGiridhar Malavali struct req_que *req;
606050c9bb1SGiridhar Malavali struct rsp_que *rsp;
607050c9bb1SGiridhar Malavali int que;
608050c9bb1SGiridhar Malavali
609050c9bb1SGiridhar Malavali if (!ha->mqenable)
610050c9bb1SGiridhar Malavali return ptr;
611050c9bb1SGiridhar Malavali
612050c9bb1SGiridhar Malavali /* Request queues */
613050c9bb1SGiridhar Malavali for (que = 1; que < ha->max_req_queues; que++) {
614050c9bb1SGiridhar Malavali req = ha->req_q_map[que];
615050c9bb1SGiridhar Malavali if (!req)
616050c9bb1SGiridhar Malavali break;
617050c9bb1SGiridhar Malavali
618050c9bb1SGiridhar Malavali /* Add chain. */
619050c9bb1SGiridhar Malavali q = ptr;
620050c9bb1SGiridhar Malavali *last_chain = &q->type;
621ad950360SBart Van Assche q->type = htonl(DUMP_CHAIN_QUEUE);
622050c9bb1SGiridhar Malavali q->chain_size = htonl(
623050c9bb1SGiridhar Malavali sizeof(struct qla2xxx_mqueue_chain) +
624050c9bb1SGiridhar Malavali sizeof(struct qla2xxx_mqueue_header) +
625050c9bb1SGiridhar Malavali (req->length * sizeof(request_t)));
626050c9bb1SGiridhar Malavali ptr += sizeof(struct qla2xxx_mqueue_chain);
627050c9bb1SGiridhar Malavali
628050c9bb1SGiridhar Malavali /* Add header. */
629050c9bb1SGiridhar Malavali qh = ptr;
630ad950360SBart Van Assche qh->queue = htonl(TYPE_REQUEST_QUEUE);
631050c9bb1SGiridhar Malavali qh->number = htonl(que);
632050c9bb1SGiridhar Malavali qh->size = htonl(req->length * sizeof(request_t));
633050c9bb1SGiridhar Malavali ptr += sizeof(struct qla2xxx_mqueue_header);
634050c9bb1SGiridhar Malavali
635050c9bb1SGiridhar Malavali /* Add data. */
636050c9bb1SGiridhar Malavali memcpy(ptr, req->ring, req->length * sizeof(request_t));
637050c9bb1SGiridhar Malavali ptr += req->length * sizeof(request_t);
638050c9bb1SGiridhar Malavali }
639050c9bb1SGiridhar Malavali
640050c9bb1SGiridhar Malavali /* Response queues */
641050c9bb1SGiridhar Malavali for (que = 1; que < ha->max_rsp_queues; que++) {
642050c9bb1SGiridhar Malavali rsp = ha->rsp_q_map[que];
643050c9bb1SGiridhar Malavali if (!rsp)
644050c9bb1SGiridhar Malavali break;
645050c9bb1SGiridhar Malavali
646050c9bb1SGiridhar Malavali /* Add chain. */
647050c9bb1SGiridhar Malavali q = ptr;
648050c9bb1SGiridhar Malavali *last_chain = &q->type;
649ad950360SBart Van Assche q->type = htonl(DUMP_CHAIN_QUEUE);
650050c9bb1SGiridhar Malavali q->chain_size = htonl(
651050c9bb1SGiridhar Malavali sizeof(struct qla2xxx_mqueue_chain) +
652050c9bb1SGiridhar Malavali sizeof(struct qla2xxx_mqueue_header) +
653050c9bb1SGiridhar Malavali (rsp->length * sizeof(response_t)));
654050c9bb1SGiridhar Malavali ptr += sizeof(struct qla2xxx_mqueue_chain);
655050c9bb1SGiridhar Malavali
656050c9bb1SGiridhar Malavali /* Add header. */
657050c9bb1SGiridhar Malavali qh = ptr;
658ad950360SBart Van Assche qh->queue = htonl(TYPE_RESPONSE_QUEUE);
659050c9bb1SGiridhar Malavali qh->number = htonl(que);
660050c9bb1SGiridhar Malavali qh->size = htonl(rsp->length * sizeof(response_t));
661050c9bb1SGiridhar Malavali ptr += sizeof(struct qla2xxx_mqueue_header);
662050c9bb1SGiridhar Malavali
663050c9bb1SGiridhar Malavali /* Add data. */
664050c9bb1SGiridhar Malavali memcpy(ptr, rsp->ring, rsp->length * sizeof(response_t));
665050c9bb1SGiridhar Malavali ptr += rsp->length * sizeof(response_t);
666050c9bb1SGiridhar Malavali }
667050c9bb1SGiridhar Malavali
668050c9bb1SGiridhar Malavali return ptr;
669050c9bb1SGiridhar Malavali }
670050c9bb1SGiridhar Malavali
671050c9bb1SGiridhar Malavali static inline void *
qla25xx_copy_mq(struct qla_hw_data * ha,void * ptr,__be32 ** last_chain)6727ffa5b93SBart Van Assche qla25xx_copy_mq(struct qla_hw_data *ha, void *ptr, __be32 **last_chain)
673d63ab533SAndrew Vasquez {
674d63ab533SAndrew Vasquez uint32_t cnt, que_idx;
6752afa19a9SAnirban Chakraborty uint8_t que_cnt;
676d63ab533SAndrew Vasquez struct qla2xxx_mq_chain *mq = ptr;
677118e2ef9SBart Van Assche device_reg_t *reg;
678d63ab533SAndrew Vasquez
679ecc89f25SJoe Carnuccio if (!ha->mqenable || IS_QLA83XX(ha) || IS_QLA27XX(ha) ||
680ecc89f25SJoe Carnuccio IS_QLA28XX(ha))
681d63ab533SAndrew Vasquez return ptr;
682d63ab533SAndrew Vasquez
683d63ab533SAndrew Vasquez mq = ptr;
684d63ab533SAndrew Vasquez *last_chain = &mq->type;
685ad950360SBart Van Assche mq->type = htonl(DUMP_CHAIN_MQ);
686ad950360SBart Van Assche mq->chain_size = htonl(sizeof(struct qla2xxx_mq_chain));
687d63ab533SAndrew Vasquez
6882afa19a9SAnirban Chakraborty que_cnt = ha->max_req_queues > ha->max_rsp_queues ?
6892afa19a9SAnirban Chakraborty ha->max_req_queues : ha->max_rsp_queues;
690d63ab533SAndrew Vasquez mq->count = htonl(que_cnt);
691d63ab533SAndrew Vasquez for (cnt = 0; cnt < que_cnt; cnt++) {
692da9b1d5cSAndrew Vasquez reg = ISP_QUE_REG(ha, cnt);
693d63ab533SAndrew Vasquez que_idx = cnt * 4;
694da9b1d5cSAndrew Vasquez mq->qregs[que_idx] =
69504474d3aSBart Van Assche htonl(rd_reg_dword(®->isp25mq.req_q_in));
696da9b1d5cSAndrew Vasquez mq->qregs[que_idx+1] =
69704474d3aSBart Van Assche htonl(rd_reg_dword(®->isp25mq.req_q_out));
698da9b1d5cSAndrew Vasquez mq->qregs[que_idx+2] =
69904474d3aSBart Van Assche htonl(rd_reg_dword(®->isp25mq.rsp_q_in));
700da9b1d5cSAndrew Vasquez mq->qregs[que_idx+3] =
70104474d3aSBart Van Assche htonl(rd_reg_dword(®->isp25mq.rsp_q_out));
702d63ab533SAndrew Vasquez }
703d63ab533SAndrew Vasquez
704d63ab533SAndrew Vasquez return ptr + sizeof(struct qla2xxx_mq_chain);
705d63ab533SAndrew Vasquez }
706d63ab533SAndrew Vasquez
70708de2844SGiridhar Malavali void
qla2xxx_dump_post_process(scsi_qla_host_t * vha,int rval)7083420d36cSAndrew Vasquez qla2xxx_dump_post_process(scsi_qla_host_t *vha, int rval)
7093420d36cSAndrew Vasquez {
7103420d36cSAndrew Vasquez struct qla_hw_data *ha = vha->hw;
7113420d36cSAndrew Vasquez
7123420d36cSAndrew Vasquez if (rval != QLA_SUCCESS) {
7137c3df132SSaurav Kashyap ql_log(ql_log_warn, vha, 0xd000,
71461f098ddSHiral Patel "Failed to dump firmware (%x), dump status flags (0x%lx).\n",
71561f098ddSHiral Patel rval, ha->fw_dump_cap_flags);
716dbe6f492SJason Yan ha->fw_dumped = false;
7173420d36cSAndrew Vasquez } else {
7187c3df132SSaurav Kashyap ql_log(ql_log_info, vha, 0xd001,
71961f098ddSHiral Patel "Firmware dump saved to temp buffer (%ld/%p), dump status flags (0x%lx).\n",
72061f098ddSHiral Patel vha->host_no, ha->fw_dump, ha->fw_dump_cap_flags);
721dbe6f492SJason Yan ha->fw_dumped = true;
7223420d36cSAndrew Vasquez qla2x00_post_uevent_work(vha, QLA_UEVENT_CODE_FW_DUMP);
7233420d36cSAndrew Vasquez }
7243420d36cSAndrew Vasquez }
7253420d36cSAndrew Vasquez
qla2xxx_dump_fw(scsi_qla_host_t * vha)7268ae17876SBart Van Assche void qla2xxx_dump_fw(scsi_qla_host_t *vha)
7278ae17876SBart Van Assche {
7288ae17876SBart Van Assche unsigned long flags;
7298ae17876SBart Van Assche
7308ae17876SBart Van Assche spin_lock_irqsave(&vha->hw->hardware_lock, flags);
7318ae17876SBart Van Assche vha->hw->isp_ops->fw_dump(vha);
7328ae17876SBart Van Assche spin_unlock_irqrestore(&vha->hw->hardware_lock, flags);
7338ae17876SBart Van Assche }
7348ae17876SBart Van Assche
7351da177e4SLinus Torvalds /**
7361da177e4SLinus Torvalds * qla2300_fw_dump() - Dumps binary data from the 2300 firmware.
7372db6228dSBart Van Assche * @vha: HA context
7381da177e4SLinus Torvalds */
7391da177e4SLinus Torvalds void
qla2300_fw_dump(scsi_qla_host_t * vha)7408ae17876SBart Van Assche qla2300_fw_dump(scsi_qla_host_t *vha)
7411da177e4SLinus Torvalds {
7421da177e4SLinus Torvalds int rval;
743c5722708SAndrew Vasquez uint32_t cnt;
7447b867cf7SAnirban Chakraborty struct qla_hw_data *ha = vha->hw;
7453d71644cSAndrew Vasquez struct device_reg_2xxx __iomem *reg = &ha->iobase->isp;
7467ffa5b93SBart Van Assche __le16 __iomem *dmp_reg;
7471da177e4SLinus Torvalds struct qla2300_fw_dump *fw;
748c5722708SAndrew Vasquez void *nxt;
74973208dfdSAnirban Chakraborty struct scsi_qla_host *base_vha = pci_get_drvdata(ha->pdev);
7501da177e4SLinus Torvalds
7518ae17876SBart Van Assche lockdep_assert_held(&ha->hardware_lock);
7521da177e4SLinus Torvalds
753d4e3e04dSAndrew Vasquez if (!ha->fw_dump) {
7547c3df132SSaurav Kashyap ql_log(ql_log_warn, vha, 0xd002,
7557c3df132SSaurav Kashyap "No buffer available for dump.\n");
7568ae17876SBart Van Assche return;
7571da177e4SLinus Torvalds }
7581da177e4SLinus Torvalds
759d4e3e04dSAndrew Vasquez if (ha->fw_dumped) {
7607c3df132SSaurav Kashyap ql_log(ql_log_warn, vha, 0xd003,
7617c3df132SSaurav Kashyap "Firmware has been previously dumped (%p) "
7627c3df132SSaurav Kashyap "-- ignoring request.\n",
7637c3df132SSaurav Kashyap ha->fw_dump);
7648ae17876SBart Van Assche return;
7651da177e4SLinus Torvalds }
766a7a167bfSAndrew Vasquez fw = &ha->fw_dump->isp.isp23;
767a7a167bfSAndrew Vasquez qla2xxx_prep_dump(ha, ha->fw_dump);
7681da177e4SLinus Torvalds
7691da177e4SLinus Torvalds rval = QLA_SUCCESS;
77004474d3aSBart Van Assche fw->hccr = htons(rd_reg_word(®->hccr));
7711da177e4SLinus Torvalds
7721da177e4SLinus Torvalds /* Pause RISC. */
77304474d3aSBart Van Assche wrt_reg_word(®->hccr, HCCR_PAUSE_RISC);
7741da177e4SLinus Torvalds if (IS_QLA2300(ha)) {
7751da177e4SLinus Torvalds for (cnt = 30000;
77604474d3aSBart Van Assche (rd_reg_word(®->hccr) & HCCR_RISC_PAUSE) == 0 &&
7771da177e4SLinus Torvalds rval == QLA_SUCCESS; cnt--) {
7781da177e4SLinus Torvalds if (cnt)
7791da177e4SLinus Torvalds udelay(100);
7801da177e4SLinus Torvalds else
7811da177e4SLinus Torvalds rval = QLA_FUNCTION_TIMEOUT;
7821da177e4SLinus Torvalds }
7831da177e4SLinus Torvalds } else {
78404474d3aSBart Van Assche rd_reg_word(®->hccr); /* PCI Posting. */
7851da177e4SLinus Torvalds udelay(10);
7861da177e4SLinus Torvalds }
7871da177e4SLinus Torvalds
7881da177e4SLinus Torvalds if (rval == QLA_SUCCESS) {
789c81d04c9SAndrew Vasquez dmp_reg = ®->flash_address;
790d221aed1SBart Van Assche for (cnt = 0; cnt < ARRAY_SIZE(fw->pbiu_reg); cnt++, dmp_reg++)
79104474d3aSBart Van Assche fw->pbiu_reg[cnt] = htons(rd_reg_word(dmp_reg));
7921da177e4SLinus Torvalds
793c81d04c9SAndrew Vasquez dmp_reg = ®->u.isp2300.req_q_in;
794d221aed1SBart Van Assche for (cnt = 0; cnt < ARRAY_SIZE(fw->risc_host_reg);
795da08ef5cSJoe Carnuccio cnt++, dmp_reg++)
79604474d3aSBart Van Assche fw->risc_host_reg[cnt] = htons(rd_reg_word(dmp_reg));
7971da177e4SLinus Torvalds
798c81d04c9SAndrew Vasquez dmp_reg = ®->u.isp2300.mailbox0;
799d221aed1SBart Van Assche for (cnt = 0; cnt < ARRAY_SIZE(fw->mailbox_reg);
800da08ef5cSJoe Carnuccio cnt++, dmp_reg++)
80104474d3aSBart Van Assche fw->mailbox_reg[cnt] = htons(rd_reg_word(dmp_reg));
8021da177e4SLinus Torvalds
80304474d3aSBart Van Assche wrt_reg_word(®->ctrl_status, 0x40);
804c81d04c9SAndrew Vasquez qla2xxx_read_window(reg, 32, fw->resp_dma_reg);
8051da177e4SLinus Torvalds
80604474d3aSBart Van Assche wrt_reg_word(®->ctrl_status, 0x50);
807c81d04c9SAndrew Vasquez qla2xxx_read_window(reg, 48, fw->dma_reg);
8081da177e4SLinus Torvalds
80904474d3aSBart Van Assche wrt_reg_word(®->ctrl_status, 0x00);
810c81d04c9SAndrew Vasquez dmp_reg = ®->risc_hw;
811d221aed1SBart Van Assche for (cnt = 0; cnt < ARRAY_SIZE(fw->risc_hdw_reg);
812da08ef5cSJoe Carnuccio cnt++, dmp_reg++)
81304474d3aSBart Van Assche fw->risc_hdw_reg[cnt] = htons(rd_reg_word(dmp_reg));
8141da177e4SLinus Torvalds
81504474d3aSBart Van Assche wrt_reg_word(®->pcr, 0x2000);
816c81d04c9SAndrew Vasquez qla2xxx_read_window(reg, 16, fw->risc_gp0_reg);
8171da177e4SLinus Torvalds
81804474d3aSBart Van Assche wrt_reg_word(®->pcr, 0x2200);
819c81d04c9SAndrew Vasquez qla2xxx_read_window(reg, 16, fw->risc_gp1_reg);
8201da177e4SLinus Torvalds
82104474d3aSBart Van Assche wrt_reg_word(®->pcr, 0x2400);
822c81d04c9SAndrew Vasquez qla2xxx_read_window(reg, 16, fw->risc_gp2_reg);
8231da177e4SLinus Torvalds
82404474d3aSBart Van Assche wrt_reg_word(®->pcr, 0x2600);
825c81d04c9SAndrew Vasquez qla2xxx_read_window(reg, 16, fw->risc_gp3_reg);
8261da177e4SLinus Torvalds
82704474d3aSBart Van Assche wrt_reg_word(®->pcr, 0x2800);
828c81d04c9SAndrew Vasquez qla2xxx_read_window(reg, 16, fw->risc_gp4_reg);
8291da177e4SLinus Torvalds
83004474d3aSBart Van Assche wrt_reg_word(®->pcr, 0x2A00);
831c81d04c9SAndrew Vasquez qla2xxx_read_window(reg, 16, fw->risc_gp5_reg);
8321da177e4SLinus Torvalds
83304474d3aSBart Van Assche wrt_reg_word(®->pcr, 0x2C00);
834c81d04c9SAndrew Vasquez qla2xxx_read_window(reg, 16, fw->risc_gp6_reg);
8351da177e4SLinus Torvalds
83604474d3aSBart Van Assche wrt_reg_word(®->pcr, 0x2E00);
837c81d04c9SAndrew Vasquez qla2xxx_read_window(reg, 16, fw->risc_gp7_reg);
8381da177e4SLinus Torvalds
83904474d3aSBart Van Assche wrt_reg_word(®->ctrl_status, 0x10);
840c81d04c9SAndrew Vasquez qla2xxx_read_window(reg, 64, fw->frame_buf_hdw_reg);
8411da177e4SLinus Torvalds
84204474d3aSBart Van Assche wrt_reg_word(®->ctrl_status, 0x20);
843c81d04c9SAndrew Vasquez qla2xxx_read_window(reg, 64, fw->fpm_b0_reg);
8441da177e4SLinus Torvalds
84504474d3aSBart Van Assche wrt_reg_word(®->ctrl_status, 0x30);
846c81d04c9SAndrew Vasquez qla2xxx_read_window(reg, 64, fw->fpm_b1_reg);
8471da177e4SLinus Torvalds
8481da177e4SLinus Torvalds /* Reset RISC. */
84904474d3aSBart Van Assche wrt_reg_word(®->ctrl_status, CSR_ISP_SOFT_RESET);
8501da177e4SLinus Torvalds for (cnt = 0; cnt < 30000; cnt++) {
85104474d3aSBart Van Assche if ((rd_reg_word(®->ctrl_status) &
8521da177e4SLinus Torvalds CSR_ISP_SOFT_RESET) == 0)
8531da177e4SLinus Torvalds break;
8541da177e4SLinus Torvalds
8551da177e4SLinus Torvalds udelay(10);
8561da177e4SLinus Torvalds }
8571da177e4SLinus Torvalds }
8581da177e4SLinus Torvalds
8591da177e4SLinus Torvalds if (!IS_QLA2300(ha)) {
8601da177e4SLinus Torvalds for (cnt = 30000; RD_MAILBOX_REG(ha, reg, 0) != 0 &&
8611da177e4SLinus Torvalds rval == QLA_SUCCESS; cnt--) {
8621da177e4SLinus Torvalds if (cnt)
8631da177e4SLinus Torvalds udelay(100);
8641da177e4SLinus Torvalds else
8651da177e4SLinus Torvalds rval = QLA_FUNCTION_TIMEOUT;
8661da177e4SLinus Torvalds }
8671da177e4SLinus Torvalds }
8681da177e4SLinus Torvalds
8691da177e4SLinus Torvalds /* Get RISC SRAM. */
870c5722708SAndrew Vasquez if (rval == QLA_SUCCESS)
871c5722708SAndrew Vasquez rval = qla2xxx_dump_ram(ha, 0x800, fw->risc_ram,
872d221aed1SBart Van Assche ARRAY_SIZE(fw->risc_ram), &nxt);
8731da177e4SLinus Torvalds
8741da177e4SLinus Torvalds /* Get stack SRAM. */
875c5722708SAndrew Vasquez if (rval == QLA_SUCCESS)
876c5722708SAndrew Vasquez rval = qla2xxx_dump_ram(ha, 0x10000, fw->stack_ram,
877d221aed1SBart Van Assche ARRAY_SIZE(fw->stack_ram), &nxt);
8781da177e4SLinus Torvalds
8791da177e4SLinus Torvalds /* Get data SRAM. */
880c5722708SAndrew Vasquez if (rval == QLA_SUCCESS)
881c5722708SAndrew Vasquez rval = qla2xxx_dump_ram(ha, 0x11000, fw->data_ram,
882c5722708SAndrew Vasquez ha->fw_memory_size - 0x11000 + 1, &nxt);
8831da177e4SLinus Torvalds
884a7a167bfSAndrew Vasquez if (rval == QLA_SUCCESS)
88573208dfdSAnirban Chakraborty qla2xxx_copy_queues(ha, nxt);
886a7a167bfSAndrew Vasquez
8873420d36cSAndrew Vasquez qla2xxx_dump_post_process(base_vha, rval);
8881da177e4SLinus Torvalds }
8891da177e4SLinus Torvalds
8901da177e4SLinus Torvalds /**
8911da177e4SLinus Torvalds * qla2100_fw_dump() - Dumps binary data from the 2100/2200 firmware.
8922db6228dSBart Van Assche * @vha: HA context
8931da177e4SLinus Torvalds */
8941da177e4SLinus Torvalds void
qla2100_fw_dump(scsi_qla_host_t * vha)8958ae17876SBart Van Assche qla2100_fw_dump(scsi_qla_host_t *vha)
8961da177e4SLinus Torvalds {
8971da177e4SLinus Torvalds int rval;
8981da177e4SLinus Torvalds uint32_t cnt, timer;
8998ae17876SBart Van Assche uint16_t risc_address = 0;
9008ae17876SBart Van Assche uint16_t mb0 = 0, mb2 = 0;
9017b867cf7SAnirban Chakraborty struct qla_hw_data *ha = vha->hw;
9023d71644cSAndrew Vasquez struct device_reg_2xxx __iomem *reg = &ha->iobase->isp;
9037ffa5b93SBart Van Assche __le16 __iomem *dmp_reg;
9041da177e4SLinus Torvalds struct qla2100_fw_dump *fw;
90573208dfdSAnirban Chakraborty struct scsi_qla_host *base_vha = pci_get_drvdata(ha->pdev);
9061da177e4SLinus Torvalds
9078ae17876SBart Van Assche lockdep_assert_held(&ha->hardware_lock);
9081da177e4SLinus Torvalds
909d4e3e04dSAndrew Vasquez if (!ha->fw_dump) {
9107c3df132SSaurav Kashyap ql_log(ql_log_warn, vha, 0xd004,
9117c3df132SSaurav Kashyap "No buffer available for dump.\n");
9128ae17876SBart Van Assche return;
9131da177e4SLinus Torvalds }
9141da177e4SLinus Torvalds
915d4e3e04dSAndrew Vasquez if (ha->fw_dumped) {
9167c3df132SSaurav Kashyap ql_log(ql_log_warn, vha, 0xd005,
9177c3df132SSaurav Kashyap "Firmware has been previously dumped (%p) "
9187c3df132SSaurav Kashyap "-- ignoring request.\n",
9197c3df132SSaurav Kashyap ha->fw_dump);
9208ae17876SBart Van Assche return;
9211da177e4SLinus Torvalds }
922a7a167bfSAndrew Vasquez fw = &ha->fw_dump->isp.isp21;
923a7a167bfSAndrew Vasquez qla2xxx_prep_dump(ha, ha->fw_dump);
9241da177e4SLinus Torvalds
9251da177e4SLinus Torvalds rval = QLA_SUCCESS;
92604474d3aSBart Van Assche fw->hccr = htons(rd_reg_word(®->hccr));
9271da177e4SLinus Torvalds
9281da177e4SLinus Torvalds /* Pause RISC. */
92904474d3aSBart Van Assche wrt_reg_word(®->hccr, HCCR_PAUSE_RISC);
93004474d3aSBart Van Assche for (cnt = 30000; (rd_reg_word(®->hccr) & HCCR_RISC_PAUSE) == 0 &&
9311da177e4SLinus Torvalds rval == QLA_SUCCESS; cnt--) {
9321da177e4SLinus Torvalds if (cnt)
9331da177e4SLinus Torvalds udelay(100);
9341da177e4SLinus Torvalds else
9351da177e4SLinus Torvalds rval = QLA_FUNCTION_TIMEOUT;
9361da177e4SLinus Torvalds }
9371da177e4SLinus Torvalds if (rval == QLA_SUCCESS) {
938c81d04c9SAndrew Vasquez dmp_reg = ®->flash_address;
939d221aed1SBart Van Assche for (cnt = 0; cnt < ARRAY_SIZE(fw->pbiu_reg); cnt++, dmp_reg++)
94004474d3aSBart Van Assche fw->pbiu_reg[cnt] = htons(rd_reg_word(dmp_reg));
9411da177e4SLinus Torvalds
942c81d04c9SAndrew Vasquez dmp_reg = ®->u.isp2100.mailbox0;
943da08ef5cSJoe Carnuccio for (cnt = 0; cnt < ha->mbx_count; cnt++, dmp_reg++) {
944c81d04c9SAndrew Vasquez if (cnt == 8)
945c81d04c9SAndrew Vasquez dmp_reg = ®->u_end.isp2200.mailbox8;
946c81d04c9SAndrew Vasquez
94704474d3aSBart Van Assche fw->mailbox_reg[cnt] = htons(rd_reg_word(dmp_reg));
9481da177e4SLinus Torvalds }
9491da177e4SLinus Torvalds
950c81d04c9SAndrew Vasquez dmp_reg = ®->u.isp2100.unused_2[0];
951d221aed1SBart Van Assche for (cnt = 0; cnt < ARRAY_SIZE(fw->dma_reg); cnt++, dmp_reg++)
95204474d3aSBart Van Assche fw->dma_reg[cnt] = htons(rd_reg_word(dmp_reg));
9531da177e4SLinus Torvalds
95404474d3aSBart Van Assche wrt_reg_word(®->ctrl_status, 0x00);
955c81d04c9SAndrew Vasquez dmp_reg = ®->risc_hw;
956d221aed1SBart Van Assche for (cnt = 0; cnt < ARRAY_SIZE(fw->risc_hdw_reg); cnt++, dmp_reg++)
95704474d3aSBart Van Assche fw->risc_hdw_reg[cnt] = htons(rd_reg_word(dmp_reg));
9581da177e4SLinus Torvalds
95904474d3aSBart Van Assche wrt_reg_word(®->pcr, 0x2000);
960c81d04c9SAndrew Vasquez qla2xxx_read_window(reg, 16, fw->risc_gp0_reg);
9611da177e4SLinus Torvalds
96204474d3aSBart Van Assche wrt_reg_word(®->pcr, 0x2100);
963c81d04c9SAndrew Vasquez qla2xxx_read_window(reg, 16, fw->risc_gp1_reg);
9641da177e4SLinus Torvalds
96504474d3aSBart Van Assche wrt_reg_word(®->pcr, 0x2200);
966c81d04c9SAndrew Vasquez qla2xxx_read_window(reg, 16, fw->risc_gp2_reg);
9671da177e4SLinus Torvalds
96804474d3aSBart Van Assche wrt_reg_word(®->pcr, 0x2300);
969c81d04c9SAndrew Vasquez qla2xxx_read_window(reg, 16, fw->risc_gp3_reg);
9701da177e4SLinus Torvalds
97104474d3aSBart Van Assche wrt_reg_word(®->pcr, 0x2400);
972c81d04c9SAndrew Vasquez qla2xxx_read_window(reg, 16, fw->risc_gp4_reg);
9731da177e4SLinus Torvalds
97404474d3aSBart Van Assche wrt_reg_word(®->pcr, 0x2500);
975c81d04c9SAndrew Vasquez qla2xxx_read_window(reg, 16, fw->risc_gp5_reg);
9761da177e4SLinus Torvalds
97704474d3aSBart Van Assche wrt_reg_word(®->pcr, 0x2600);
978c81d04c9SAndrew Vasquez qla2xxx_read_window(reg, 16, fw->risc_gp6_reg);
9791da177e4SLinus Torvalds
98004474d3aSBart Van Assche wrt_reg_word(®->pcr, 0x2700);
981c81d04c9SAndrew Vasquez qla2xxx_read_window(reg, 16, fw->risc_gp7_reg);
9821da177e4SLinus Torvalds
98304474d3aSBart Van Assche wrt_reg_word(®->ctrl_status, 0x10);
984c81d04c9SAndrew Vasquez qla2xxx_read_window(reg, 16, fw->frame_buf_hdw_reg);
9851da177e4SLinus Torvalds
98604474d3aSBart Van Assche wrt_reg_word(®->ctrl_status, 0x20);
987c81d04c9SAndrew Vasquez qla2xxx_read_window(reg, 64, fw->fpm_b0_reg);
9881da177e4SLinus Torvalds
98904474d3aSBart Van Assche wrt_reg_word(®->ctrl_status, 0x30);
990c81d04c9SAndrew Vasquez qla2xxx_read_window(reg, 64, fw->fpm_b1_reg);
9911da177e4SLinus Torvalds
9921da177e4SLinus Torvalds /* Reset the ISP. */
99304474d3aSBart Van Assche wrt_reg_word(®->ctrl_status, CSR_ISP_SOFT_RESET);
9941da177e4SLinus Torvalds }
9951da177e4SLinus Torvalds
9961da177e4SLinus Torvalds for (cnt = 30000; RD_MAILBOX_REG(ha, reg, 0) != 0 &&
9971da177e4SLinus Torvalds rval == QLA_SUCCESS; cnt--) {
9981da177e4SLinus Torvalds if (cnt)
9991da177e4SLinus Torvalds udelay(100);
10001da177e4SLinus Torvalds else
10011da177e4SLinus Torvalds rval = QLA_FUNCTION_TIMEOUT;
10021da177e4SLinus Torvalds }
10031da177e4SLinus Torvalds
10041da177e4SLinus Torvalds /* Pause RISC. */
10051da177e4SLinus Torvalds if (rval == QLA_SUCCESS && (IS_QLA2200(ha) || (IS_QLA2100(ha) &&
100604474d3aSBart Van Assche (rd_reg_word(®->mctr) & (BIT_1 | BIT_0)) != 0))) {
10071da177e4SLinus Torvalds
100804474d3aSBart Van Assche wrt_reg_word(®->hccr, HCCR_PAUSE_RISC);
10091da177e4SLinus Torvalds for (cnt = 30000;
101004474d3aSBart Van Assche (rd_reg_word(®->hccr) & HCCR_RISC_PAUSE) == 0 &&
10111da177e4SLinus Torvalds rval == QLA_SUCCESS; cnt--) {
10121da177e4SLinus Torvalds if (cnt)
10131da177e4SLinus Torvalds udelay(100);
10141da177e4SLinus Torvalds else
10151da177e4SLinus Torvalds rval = QLA_FUNCTION_TIMEOUT;
10161da177e4SLinus Torvalds }
10171da177e4SLinus Torvalds if (rval == QLA_SUCCESS) {
10181da177e4SLinus Torvalds /* Set memory configuration and timing. */
10191da177e4SLinus Torvalds if (IS_QLA2100(ha))
102004474d3aSBart Van Assche wrt_reg_word(®->mctr, 0xf1);
10211da177e4SLinus Torvalds else
102204474d3aSBart Van Assche wrt_reg_word(®->mctr, 0xf2);
102304474d3aSBart Van Assche rd_reg_word(®->mctr); /* PCI Posting. */
10241da177e4SLinus Torvalds
10251da177e4SLinus Torvalds /* Release RISC. */
102604474d3aSBart Van Assche wrt_reg_word(®->hccr, HCCR_RELEASE_RISC);
10271da177e4SLinus Torvalds }
10281da177e4SLinus Torvalds }
10291da177e4SLinus Torvalds
10301da177e4SLinus Torvalds if (rval == QLA_SUCCESS) {
10311da177e4SLinus Torvalds /* Get RISC SRAM. */
10321da177e4SLinus Torvalds risc_address = 0x1000;
10331da177e4SLinus Torvalds WRT_MAILBOX_REG(ha, reg, 0, MBC_READ_RAM_WORD);
10341da177e4SLinus Torvalds clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);
10351da177e4SLinus Torvalds }
1036d221aed1SBart Van Assche for (cnt = 0; cnt < ARRAY_SIZE(fw->risc_ram) && rval == QLA_SUCCESS;
10371da177e4SLinus Torvalds cnt++, risc_address++) {
10381da177e4SLinus Torvalds WRT_MAILBOX_REG(ha, reg, 1, risc_address);
103904474d3aSBart Van Assche wrt_reg_word(®->hccr, HCCR_SET_HOST_INT);
10401da177e4SLinus Torvalds
10411da177e4SLinus Torvalds for (timer = 6000000; timer != 0; timer--) {
10421da177e4SLinus Torvalds /* Check for pending interrupts. */
104304474d3aSBart Van Assche if (rd_reg_word(®->istatus) & ISR_RISC_INT) {
104404474d3aSBart Van Assche if (rd_reg_word(®->semaphore) & BIT_0) {
10451da177e4SLinus Torvalds set_bit(MBX_INTERRUPT,
10461da177e4SLinus Torvalds &ha->mbx_cmd_flags);
10471da177e4SLinus Torvalds
10481da177e4SLinus Torvalds mb0 = RD_MAILBOX_REG(ha, reg, 0);
10491da177e4SLinus Torvalds mb2 = RD_MAILBOX_REG(ha, reg, 2);
10501da177e4SLinus Torvalds
105104474d3aSBart Van Assche wrt_reg_word(®->semaphore, 0);
105204474d3aSBart Van Assche wrt_reg_word(®->hccr,
10531da177e4SLinus Torvalds HCCR_CLR_RISC_INT);
105404474d3aSBart Van Assche rd_reg_word(®->hccr);
10551da177e4SLinus Torvalds break;
10561da177e4SLinus Torvalds }
105704474d3aSBart Van Assche wrt_reg_word(®->hccr, HCCR_CLR_RISC_INT);
105804474d3aSBart Van Assche rd_reg_word(®->hccr);
10591da177e4SLinus Torvalds }
10601da177e4SLinus Torvalds udelay(5);
10611da177e4SLinus Torvalds }
10621da177e4SLinus Torvalds
10631da177e4SLinus Torvalds if (test_and_clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags)) {
10641da177e4SLinus Torvalds rval = mb0 & MBS_MASK;
1065a7a167bfSAndrew Vasquez fw->risc_ram[cnt] = htons(mb2);
10661da177e4SLinus Torvalds } else {
10671da177e4SLinus Torvalds rval = QLA_FUNCTION_FAILED;
10681da177e4SLinus Torvalds }
10691da177e4SLinus Torvalds }
10701da177e4SLinus Torvalds
1071a7a167bfSAndrew Vasquez if (rval == QLA_SUCCESS)
107257fec9f2SBart Van Assche qla2xxx_copy_queues(ha, &fw->queue_dump[0]);
1073a7a167bfSAndrew Vasquez
10743420d36cSAndrew Vasquez qla2xxx_dump_post_process(base_vha, rval);
10751da177e4SLinus Torvalds }
10761da177e4SLinus Torvalds
10776d9b61edSAndrew Vasquez void
qla24xx_fw_dump(scsi_qla_host_t * vha)10788ae17876SBart Van Assche qla24xx_fw_dump(scsi_qla_host_t *vha)
10796d9b61edSAndrew Vasquez {
10806d9b61edSAndrew Vasquez int rval;
1081c3a2f0dfSAndrew Vasquez uint32_t cnt;
10827b867cf7SAnirban Chakraborty struct qla_hw_data *ha = vha->hw;
10836d9b61edSAndrew Vasquez struct device_reg_24xx __iomem *reg = &ha->iobase->isp24;
10847ffa5b93SBart Van Assche __le32 __iomem *dmp_reg;
10857ffa5b93SBart Van Assche __be32 *iter_reg;
10867ffa5b93SBart Van Assche __le16 __iomem *mbx_reg;
10876d9b61edSAndrew Vasquez struct qla24xx_fw_dump *fw;
1088c3a2f0dfSAndrew Vasquez void *nxt;
10892d70c103SNicholas Bellinger void *nxt_chain;
10907ffa5b93SBart Van Assche __be32 *last_chain = NULL;
109173208dfdSAnirban Chakraborty struct scsi_qla_host *base_vha = pci_get_drvdata(ha->pdev);
10926d9b61edSAndrew Vasquez
10938ae17876SBart Van Assche lockdep_assert_held(&ha->hardware_lock);
10948ae17876SBart Van Assche
10957ec0effdSAtul Deshmukh if (IS_P3P_TYPE(ha))
1096a9083016SGiridhar Malavali return;
1097a9083016SGiridhar Malavali
109861f098ddSHiral Patel ha->fw_dump_cap_flags = 0;
10996d9b61edSAndrew Vasquez
1100d4e3e04dSAndrew Vasquez if (!ha->fw_dump) {
11017c3df132SSaurav Kashyap ql_log(ql_log_warn, vha, 0xd006,
11027c3df132SSaurav Kashyap "No buffer available for dump.\n");
11038ae17876SBart Van Assche return;
11046d9b61edSAndrew Vasquez }
11056d9b61edSAndrew Vasquez
11066d9b61edSAndrew Vasquez if (ha->fw_dumped) {
11077c3df132SSaurav Kashyap ql_log(ql_log_warn, vha, 0xd007,
11087c3df132SSaurav Kashyap "Firmware has been previously dumped (%p) "
11097c3df132SSaurav Kashyap "-- ignoring request.\n",
11107c3df132SSaurav Kashyap ha->fw_dump);
11118ae17876SBart Van Assche return;
11126d9b61edSAndrew Vasquez }
11137e84766cSQuinn Tran QLA_FW_STOPPED(ha);
1114a7a167bfSAndrew Vasquez fw = &ha->fw_dump->isp.isp24;
1115a7a167bfSAndrew Vasquez qla2xxx_prep_dump(ha, ha->fw_dump);
11166d9b61edSAndrew Vasquez
111704474d3aSBart Van Assche fw->host_status = htonl(rd_reg_dword(®->host_status));
11186d9b61edSAndrew Vasquez
11192f389fc4SHiral Patel /*
11202f389fc4SHiral Patel * Pause RISC. No need to track timeout, as resetting the chip
11212f389fc4SHiral Patel * is the right approach incase of pause timeout
11222f389fc4SHiral Patel */
112361f098ddSHiral Patel qla24xx_pause_risc(reg, ha);
11246d9b61edSAndrew Vasquez
11256d9b61edSAndrew Vasquez /* Host interface registers. */
1126c81d04c9SAndrew Vasquez dmp_reg = ®->flash_addr;
1127d221aed1SBart Van Assche for (cnt = 0; cnt < ARRAY_SIZE(fw->host_reg); cnt++, dmp_reg++)
112804474d3aSBart Van Assche fw->host_reg[cnt] = htonl(rd_reg_dword(dmp_reg));
11296d9b61edSAndrew Vasquez
1130210d5350Sandrew.vasquez@qlogic.com /* Disable interrupts. */
113104474d3aSBart Van Assche wrt_reg_dword(®->ictrl, 0);
113204474d3aSBart Van Assche rd_reg_dword(®->ictrl);
1133210d5350Sandrew.vasquez@qlogic.com
1134210d5350Sandrew.vasquez@qlogic.com /* Shadow registers. */
113504474d3aSBart Van Assche wrt_reg_dword(®->iobase_addr, 0x0F70);
113604474d3aSBart Van Assche rd_reg_dword(®->iobase_addr);
113704474d3aSBart Van Assche wrt_reg_dword(®->iobase_select, 0xB0000000);
113804474d3aSBart Van Assche fw->shadow_reg[0] = htonl(rd_reg_dword(®->iobase_sdata));
1139210d5350Sandrew.vasquez@qlogic.com
114004474d3aSBart Van Assche wrt_reg_dword(®->iobase_select, 0xB0100000);
114104474d3aSBart Van Assche fw->shadow_reg[1] = htonl(rd_reg_dword(®->iobase_sdata));
1142210d5350Sandrew.vasquez@qlogic.com
114304474d3aSBart Van Assche wrt_reg_dword(®->iobase_select, 0xB0200000);
114404474d3aSBart Van Assche fw->shadow_reg[2] = htonl(rd_reg_dword(®->iobase_sdata));
1145210d5350Sandrew.vasquez@qlogic.com
114604474d3aSBart Van Assche wrt_reg_dword(®->iobase_select, 0xB0300000);
114704474d3aSBart Van Assche fw->shadow_reg[3] = htonl(rd_reg_dword(®->iobase_sdata));
1148210d5350Sandrew.vasquez@qlogic.com
114904474d3aSBart Van Assche wrt_reg_dword(®->iobase_select, 0xB0400000);
115004474d3aSBart Van Assche fw->shadow_reg[4] = htonl(rd_reg_dword(®->iobase_sdata));
1151210d5350Sandrew.vasquez@qlogic.com
115204474d3aSBart Van Assche wrt_reg_dword(®->iobase_select, 0xB0500000);
115304474d3aSBart Van Assche fw->shadow_reg[5] = htonl(rd_reg_dword(®->iobase_sdata));
1154210d5350Sandrew.vasquez@qlogic.com
115504474d3aSBart Van Assche wrt_reg_dword(®->iobase_select, 0xB0600000);
115604474d3aSBart Van Assche fw->shadow_reg[6] = htonl(rd_reg_dword(®->iobase_sdata));
1157210d5350Sandrew.vasquez@qlogic.com
11586d9b61edSAndrew Vasquez /* Mailbox registers. */
1159c3a2f0dfSAndrew Vasquez mbx_reg = ®->mailbox0;
1160d221aed1SBart Van Assche for (cnt = 0; cnt < ARRAY_SIZE(fw->mailbox_reg); cnt++, mbx_reg++)
116104474d3aSBart Van Assche fw->mailbox_reg[cnt] = htons(rd_reg_word(mbx_reg));
11626d9b61edSAndrew Vasquez
11636d9b61edSAndrew Vasquez /* Transfer sequence registers. */
11646d9b61edSAndrew Vasquez iter_reg = fw->xseq_gp_reg;
1165c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0xBF00, 16, iter_reg);
1166c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0xBF10, 16, iter_reg);
1167c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0xBF20, 16, iter_reg);
1168c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0xBF30, 16, iter_reg);
1169c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0xBF40, 16, iter_reg);
1170c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0xBF50, 16, iter_reg);
1171c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0xBF60, 16, iter_reg);
1172c81d04c9SAndrew Vasquez qla24xx_read_window(reg, 0xBF70, 16, iter_reg);
11736d9b61edSAndrew Vasquez
1174c81d04c9SAndrew Vasquez qla24xx_read_window(reg, 0xBFE0, 16, fw->xseq_0_reg);
1175c81d04c9SAndrew Vasquez qla24xx_read_window(reg, 0xBFF0, 16, fw->xseq_1_reg);
11766d9b61edSAndrew Vasquez
11776d9b61edSAndrew Vasquez /* Receive sequence registers. */
11786d9b61edSAndrew Vasquez iter_reg = fw->rseq_gp_reg;
1179c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0xFF00, 16, iter_reg);
1180c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0xFF10, 16, iter_reg);
1181c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0xFF20, 16, iter_reg);
1182c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0xFF30, 16, iter_reg);
1183c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0xFF40, 16, iter_reg);
1184c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0xFF50, 16, iter_reg);
1185c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0xFF60, 16, iter_reg);
1186c81d04c9SAndrew Vasquez qla24xx_read_window(reg, 0xFF70, 16, iter_reg);
11876d9b61edSAndrew Vasquez
1188c81d04c9SAndrew Vasquez qla24xx_read_window(reg, 0xFFD0, 16, fw->rseq_0_reg);
1189c81d04c9SAndrew Vasquez qla24xx_read_window(reg, 0xFFE0, 16, fw->rseq_1_reg);
1190c81d04c9SAndrew Vasquez qla24xx_read_window(reg, 0xFFF0, 16, fw->rseq_2_reg);
11916d9b61edSAndrew Vasquez
11926d9b61edSAndrew Vasquez /* Command DMA registers. */
1193c81d04c9SAndrew Vasquez qla24xx_read_window(reg, 0x7100, 16, fw->cmd_dma_reg);
11946d9b61edSAndrew Vasquez
11956d9b61edSAndrew Vasquez /* Queues. */
11966d9b61edSAndrew Vasquez iter_reg = fw->req0_dma_reg;
1197c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x7200, 8, iter_reg);
1198c3a2f0dfSAndrew Vasquez dmp_reg = ®->iobase_q;
1199da08ef5cSJoe Carnuccio for (cnt = 0; cnt < 7; cnt++, dmp_reg++)
120004474d3aSBart Van Assche *iter_reg++ = htonl(rd_reg_dword(dmp_reg));
12016d9b61edSAndrew Vasquez
12026d9b61edSAndrew Vasquez iter_reg = fw->resp0_dma_reg;
1203c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x7300, 8, iter_reg);
1204c3a2f0dfSAndrew Vasquez dmp_reg = ®->iobase_q;
1205da08ef5cSJoe Carnuccio for (cnt = 0; cnt < 7; cnt++, dmp_reg++)
120604474d3aSBart Van Assche *iter_reg++ = htonl(rd_reg_dword(dmp_reg));
12076d9b61edSAndrew Vasquez
12086d9b61edSAndrew Vasquez iter_reg = fw->req1_dma_reg;
1209c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x7400, 8, iter_reg);
1210c3a2f0dfSAndrew Vasquez dmp_reg = ®->iobase_q;
1211da08ef5cSJoe Carnuccio for (cnt = 0; cnt < 7; cnt++, dmp_reg++)
121204474d3aSBart Van Assche *iter_reg++ = htonl(rd_reg_dword(dmp_reg));
12136d9b61edSAndrew Vasquez
12146d9b61edSAndrew Vasquez /* Transmit DMA registers. */
12156d9b61edSAndrew Vasquez iter_reg = fw->xmt0_dma_reg;
1216c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x7600, 16, iter_reg);
1217c81d04c9SAndrew Vasquez qla24xx_read_window(reg, 0x7610, 16, iter_reg);
12186d9b61edSAndrew Vasquez
12196d9b61edSAndrew Vasquez iter_reg = fw->xmt1_dma_reg;
1220c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x7620, 16, iter_reg);
1221c81d04c9SAndrew Vasquez qla24xx_read_window(reg, 0x7630, 16, iter_reg);
12226d9b61edSAndrew Vasquez
12236d9b61edSAndrew Vasquez iter_reg = fw->xmt2_dma_reg;
1224c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x7640, 16, iter_reg);
1225c81d04c9SAndrew Vasquez qla24xx_read_window(reg, 0x7650, 16, iter_reg);
12266d9b61edSAndrew Vasquez
12276d9b61edSAndrew Vasquez iter_reg = fw->xmt3_dma_reg;
1228c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x7660, 16, iter_reg);
1229c81d04c9SAndrew Vasquez qla24xx_read_window(reg, 0x7670, 16, iter_reg);
12306d9b61edSAndrew Vasquez
12316d9b61edSAndrew Vasquez iter_reg = fw->xmt4_dma_reg;
1232c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x7680, 16, iter_reg);
1233c81d04c9SAndrew Vasquez qla24xx_read_window(reg, 0x7690, 16, iter_reg);
12346d9b61edSAndrew Vasquez
1235c81d04c9SAndrew Vasquez qla24xx_read_window(reg, 0x76A0, 16, fw->xmt_data_dma_reg);
12366d9b61edSAndrew Vasquez
12376d9b61edSAndrew Vasquez /* Receive DMA registers. */
12386d9b61edSAndrew Vasquez iter_reg = fw->rcvt0_data_dma_reg;
1239c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x7700, 16, iter_reg);
1240c81d04c9SAndrew Vasquez qla24xx_read_window(reg, 0x7710, 16, iter_reg);
12416d9b61edSAndrew Vasquez
12426d9b61edSAndrew Vasquez iter_reg = fw->rcvt1_data_dma_reg;
1243c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x7720, 16, iter_reg);
1244c81d04c9SAndrew Vasquez qla24xx_read_window(reg, 0x7730, 16, iter_reg);
12456d9b61edSAndrew Vasquez
12466d9b61edSAndrew Vasquez /* RISC registers. */
12476d9b61edSAndrew Vasquez iter_reg = fw->risc_gp_reg;
1248c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x0F00, 16, iter_reg);
1249c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x0F10, 16, iter_reg);
1250c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x0F20, 16, iter_reg);
1251c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x0F30, 16, iter_reg);
1252c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x0F40, 16, iter_reg);
1253c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x0F50, 16, iter_reg);
1254c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x0F60, 16, iter_reg);
1255c81d04c9SAndrew Vasquez qla24xx_read_window(reg, 0x0F70, 16, iter_reg);
12566d9b61edSAndrew Vasquez
12576d9b61edSAndrew Vasquez /* Local memory controller registers. */
12586d9b61edSAndrew Vasquez iter_reg = fw->lmc_reg;
1259c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x3000, 16, iter_reg);
1260c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x3010, 16, iter_reg);
1261c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x3020, 16, iter_reg);
1262c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x3030, 16, iter_reg);
1263c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x3040, 16, iter_reg);
1264c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x3050, 16, iter_reg);
1265c81d04c9SAndrew Vasquez qla24xx_read_window(reg, 0x3060, 16, iter_reg);
12666d9b61edSAndrew Vasquez
12676d9b61edSAndrew Vasquez /* Fibre Protocol Module registers. */
12686d9b61edSAndrew Vasquez iter_reg = fw->fpm_hdw_reg;
1269c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x4000, 16, iter_reg);
1270c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x4010, 16, iter_reg);
1271c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x4020, 16, iter_reg);
1272c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x4030, 16, iter_reg);
1273c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x4040, 16, iter_reg);
1274c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x4050, 16, iter_reg);
1275c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x4060, 16, iter_reg);
1276c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x4070, 16, iter_reg);
1277c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x4080, 16, iter_reg);
1278c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x4090, 16, iter_reg);
1279c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x40A0, 16, iter_reg);
1280c81d04c9SAndrew Vasquez qla24xx_read_window(reg, 0x40B0, 16, iter_reg);
12816d9b61edSAndrew Vasquez
12826d9b61edSAndrew Vasquez /* Frame Buffer registers. */
12836d9b61edSAndrew Vasquez iter_reg = fw->fb_hdw_reg;
1284c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x6000, 16, iter_reg);
1285c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x6010, 16, iter_reg);
1286c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x6020, 16, iter_reg);
1287c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x6030, 16, iter_reg);
1288c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x6040, 16, iter_reg);
1289c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x6100, 16, iter_reg);
1290c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x6130, 16, iter_reg);
1291c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x6150, 16, iter_reg);
1292c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x6170, 16, iter_reg);
1293c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x6190, 16, iter_reg);
1294c81d04c9SAndrew Vasquez qla24xx_read_window(reg, 0x61B0, 16, iter_reg);
12956d9b61edSAndrew Vasquez
1296c81d04c9SAndrew Vasquez rval = qla24xx_soft_reset(ha);
1297c81d04c9SAndrew Vasquez if (rval != QLA_SUCCESS)
1298c81d04c9SAndrew Vasquez goto qla24xx_fw_dump_failed_0;
12996d9b61edSAndrew Vasquez
1300c81d04c9SAndrew Vasquez rval = qla24xx_dump_memory(ha, fw->code_ram, sizeof(fw->code_ram),
1301c5722708SAndrew Vasquez &nxt);
1302c81d04c9SAndrew Vasquez if (rval != QLA_SUCCESS)
1303c81d04c9SAndrew Vasquez goto qla24xx_fw_dump_failed_0;
13046d9b61edSAndrew Vasquez
130573208dfdSAnirban Chakraborty nxt = qla2xxx_copy_queues(ha, nxt);
1306bb99de67SAndrew Vasquez
1307bb99de67SAndrew Vasquez qla24xx_copy_eft(ha, nxt);
1308a7a167bfSAndrew Vasquez
13092d70c103SNicholas Bellinger nxt_chain = (void *)ha->fw_dump + ha->chain_offset;
13102d70c103SNicholas Bellinger nxt_chain = qla2xxx_copy_atioqueues(ha, nxt_chain, &last_chain);
13112d70c103SNicholas Bellinger if (last_chain) {
1312ad950360SBart Van Assche ha->fw_dump->version |= htonl(DUMP_CHAIN_VARIANT);
1313ad950360SBart Van Assche *last_chain |= htonl(DUMP_CHAIN_LAST);
13142d70c103SNicholas Bellinger }
13152d70c103SNicholas Bellinger
13162d70c103SNicholas Bellinger /* Adjust valid length. */
13172d70c103SNicholas Bellinger ha->fw_dump_len = (nxt_chain - (void *)ha->fw_dump);
13182d70c103SNicholas Bellinger
1319c81d04c9SAndrew Vasquez qla24xx_fw_dump_failed_0:
13203420d36cSAndrew Vasquez qla2xxx_dump_post_process(base_vha, rval);
13216d9b61edSAndrew Vasquez }
13226d9b61edSAndrew Vasquez
1323c3a2f0dfSAndrew Vasquez void
qla25xx_fw_dump(scsi_qla_host_t * vha)13248ae17876SBart Van Assche qla25xx_fw_dump(scsi_qla_host_t *vha)
1325c3a2f0dfSAndrew Vasquez {
1326c3a2f0dfSAndrew Vasquez int rval;
1327c3a2f0dfSAndrew Vasquez uint32_t cnt;
13287b867cf7SAnirban Chakraborty struct qla_hw_data *ha = vha->hw;
1329c3a2f0dfSAndrew Vasquez struct device_reg_24xx __iomem *reg = &ha->iobase->isp24;
13307ffa5b93SBart Van Assche __le32 __iomem *dmp_reg;
13317ffa5b93SBart Van Assche __be32 *iter_reg;
13327ffa5b93SBart Van Assche __le16 __iomem *mbx_reg;
1333c3a2f0dfSAndrew Vasquez struct qla25xx_fw_dump *fw;
1334d63ab533SAndrew Vasquez void *nxt, *nxt_chain;
13357ffa5b93SBart Van Assche __be32 *last_chain = NULL;
133673208dfdSAnirban Chakraborty struct scsi_qla_host *base_vha = pci_get_drvdata(ha->pdev);
1337c3a2f0dfSAndrew Vasquez
13388ae17876SBart Van Assche lockdep_assert_held(&ha->hardware_lock);
1339c3a2f0dfSAndrew Vasquez
13408ae17876SBart Van Assche ha->fw_dump_cap_flags = 0;
1341c3a2f0dfSAndrew Vasquez
1342c3a2f0dfSAndrew Vasquez if (!ha->fw_dump) {
13437c3df132SSaurav Kashyap ql_log(ql_log_warn, vha, 0xd008,
13447c3df132SSaurav Kashyap "No buffer available for dump.\n");
13458ae17876SBart Van Assche return;
1346c3a2f0dfSAndrew Vasquez }
1347c3a2f0dfSAndrew Vasquez
1348c3a2f0dfSAndrew Vasquez if (ha->fw_dumped) {
13497c3df132SSaurav Kashyap ql_log(ql_log_warn, vha, 0xd009,
13507c3df132SSaurav Kashyap "Firmware has been previously dumped (%p) "
13517c3df132SSaurav Kashyap "-- ignoring request.\n",
13527c3df132SSaurav Kashyap ha->fw_dump);
13538ae17876SBart Van Assche return;
1354c3a2f0dfSAndrew Vasquez }
13557e84766cSQuinn Tran QLA_FW_STOPPED(ha);
1356c3a2f0dfSAndrew Vasquez fw = &ha->fw_dump->isp.isp25;
1357c3a2f0dfSAndrew Vasquez qla2xxx_prep_dump(ha, ha->fw_dump);
1358ad950360SBart Van Assche ha->fw_dump->version = htonl(2);
1359c3a2f0dfSAndrew Vasquez
136004474d3aSBart Van Assche fw->host_status = htonl(rd_reg_dword(®->host_status));
1361c3a2f0dfSAndrew Vasquez
13622f389fc4SHiral Patel /*
13632f389fc4SHiral Patel * Pause RISC. No need to track timeout, as resetting the chip
13642f389fc4SHiral Patel * is the right approach incase of pause timeout
13652f389fc4SHiral Patel */
136661f098ddSHiral Patel qla24xx_pause_risc(reg, ha);
1367c3a2f0dfSAndrew Vasquez
1368b5836927SAndrew Vasquez /* Host/Risc registers. */
1369b5836927SAndrew Vasquez iter_reg = fw->host_risc_reg;
1370b5836927SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x7000, 16, iter_reg);
1371b5836927SAndrew Vasquez qla24xx_read_window(reg, 0x7010, 16, iter_reg);
1372b5836927SAndrew Vasquez
1373b5836927SAndrew Vasquez /* PCIe registers. */
137404474d3aSBart Van Assche wrt_reg_dword(®->iobase_addr, 0x7C00);
137504474d3aSBart Van Assche rd_reg_dword(®->iobase_addr);
137604474d3aSBart Van Assche wrt_reg_dword(®->iobase_window, 0x01);
1377b5836927SAndrew Vasquez dmp_reg = ®->iobase_c4;
137804474d3aSBart Van Assche fw->pcie_regs[0] = htonl(rd_reg_dword(dmp_reg));
1379da08ef5cSJoe Carnuccio dmp_reg++;
138004474d3aSBart Van Assche fw->pcie_regs[1] = htonl(rd_reg_dword(dmp_reg));
1381da08ef5cSJoe Carnuccio dmp_reg++;
138204474d3aSBart Van Assche fw->pcie_regs[2] = htonl(rd_reg_dword(dmp_reg));
138304474d3aSBart Van Assche fw->pcie_regs[3] = htonl(rd_reg_dword(®->iobase_window));
138473208dfdSAnirban Chakraborty
138504474d3aSBart Van Assche wrt_reg_dword(®->iobase_window, 0x00);
138604474d3aSBart Van Assche rd_reg_dword(®->iobase_window);
1387b5836927SAndrew Vasquez
1388c3a2f0dfSAndrew Vasquez /* Host interface registers. */
1389c81d04c9SAndrew Vasquez dmp_reg = ®->flash_addr;
1390d221aed1SBart Van Assche for (cnt = 0; cnt < ARRAY_SIZE(fw->host_reg); cnt++, dmp_reg++)
139104474d3aSBart Van Assche fw->host_reg[cnt] = htonl(rd_reg_dword(dmp_reg));
1392c3a2f0dfSAndrew Vasquez
1393c3a2f0dfSAndrew Vasquez /* Disable interrupts. */
139404474d3aSBart Van Assche wrt_reg_dword(®->ictrl, 0);
139504474d3aSBart Van Assche rd_reg_dword(®->ictrl);
1396c3a2f0dfSAndrew Vasquez
1397c3a2f0dfSAndrew Vasquez /* Shadow registers. */
139804474d3aSBart Van Assche wrt_reg_dword(®->iobase_addr, 0x0F70);
139904474d3aSBart Van Assche rd_reg_dword(®->iobase_addr);
140004474d3aSBart Van Assche wrt_reg_dword(®->iobase_select, 0xB0000000);
140104474d3aSBart Van Assche fw->shadow_reg[0] = htonl(rd_reg_dword(®->iobase_sdata));
1402c3a2f0dfSAndrew Vasquez
140304474d3aSBart Van Assche wrt_reg_dword(®->iobase_select, 0xB0100000);
140404474d3aSBart Van Assche fw->shadow_reg[1] = htonl(rd_reg_dword(®->iobase_sdata));
1405c3a2f0dfSAndrew Vasquez
140604474d3aSBart Van Assche wrt_reg_dword(®->iobase_select, 0xB0200000);
140704474d3aSBart Van Assche fw->shadow_reg[2] = htonl(rd_reg_dword(®->iobase_sdata));
1408c3a2f0dfSAndrew Vasquez
140904474d3aSBart Van Assche wrt_reg_dword(®->iobase_select, 0xB0300000);
141004474d3aSBart Van Assche fw->shadow_reg[3] = htonl(rd_reg_dword(®->iobase_sdata));
1411c3a2f0dfSAndrew Vasquez
141204474d3aSBart Van Assche wrt_reg_dword(®->iobase_select, 0xB0400000);
141304474d3aSBart Van Assche fw->shadow_reg[4] = htonl(rd_reg_dword(®->iobase_sdata));
1414c3a2f0dfSAndrew Vasquez
141504474d3aSBart Van Assche wrt_reg_dword(®->iobase_select, 0xB0500000);
141604474d3aSBart Van Assche fw->shadow_reg[5] = htonl(rd_reg_dword(®->iobase_sdata));
1417c3a2f0dfSAndrew Vasquez
141804474d3aSBart Van Assche wrt_reg_dword(®->iobase_select, 0xB0600000);
141904474d3aSBart Van Assche fw->shadow_reg[6] = htonl(rd_reg_dword(®->iobase_sdata));
1420c3a2f0dfSAndrew Vasquez
142104474d3aSBart Van Assche wrt_reg_dword(®->iobase_select, 0xB0700000);
142204474d3aSBart Van Assche fw->shadow_reg[7] = htonl(rd_reg_dword(®->iobase_sdata));
1423c3a2f0dfSAndrew Vasquez
142404474d3aSBart Van Assche wrt_reg_dword(®->iobase_select, 0xB0800000);
142504474d3aSBart Van Assche fw->shadow_reg[8] = htonl(rd_reg_dword(®->iobase_sdata));
1426c3a2f0dfSAndrew Vasquez
142704474d3aSBart Van Assche wrt_reg_dword(®->iobase_select, 0xB0900000);
142804474d3aSBart Van Assche fw->shadow_reg[9] = htonl(rd_reg_dword(®->iobase_sdata));
1429c3a2f0dfSAndrew Vasquez
143004474d3aSBart Van Assche wrt_reg_dword(®->iobase_select, 0xB0A00000);
143104474d3aSBart Van Assche fw->shadow_reg[10] = htonl(rd_reg_dword(®->iobase_sdata));
1432c3a2f0dfSAndrew Vasquez
1433c3a2f0dfSAndrew Vasquez /* RISC I/O register. */
143404474d3aSBart Van Assche wrt_reg_dword(®->iobase_addr, 0x0010);
143504474d3aSBart Van Assche fw->risc_io_reg = htonl(rd_reg_dword(®->iobase_window));
1436c3a2f0dfSAndrew Vasquez
1437c3a2f0dfSAndrew Vasquez /* Mailbox registers. */
1438c3a2f0dfSAndrew Vasquez mbx_reg = ®->mailbox0;
1439d221aed1SBart Van Assche for (cnt = 0; cnt < ARRAY_SIZE(fw->mailbox_reg); cnt++, mbx_reg++)
144004474d3aSBart Van Assche fw->mailbox_reg[cnt] = htons(rd_reg_word(mbx_reg));
1441c3a2f0dfSAndrew Vasquez
1442c3a2f0dfSAndrew Vasquez /* Transfer sequence registers. */
1443c3a2f0dfSAndrew Vasquez iter_reg = fw->xseq_gp_reg;
1444c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0xBF00, 16, iter_reg);
1445c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0xBF10, 16, iter_reg);
1446c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0xBF20, 16, iter_reg);
1447c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0xBF30, 16, iter_reg);
1448c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0xBF40, 16, iter_reg);
1449c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0xBF50, 16, iter_reg);
1450c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0xBF60, 16, iter_reg);
1451c81d04c9SAndrew Vasquez qla24xx_read_window(reg, 0xBF70, 16, iter_reg);
1452c3a2f0dfSAndrew Vasquez
1453c3a2f0dfSAndrew Vasquez iter_reg = fw->xseq_0_reg;
1454c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0xBFC0, 16, iter_reg);
1455c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0xBFD0, 16, iter_reg);
1456c81d04c9SAndrew Vasquez qla24xx_read_window(reg, 0xBFE0, 16, iter_reg);
1457c3a2f0dfSAndrew Vasquez
1458c81d04c9SAndrew Vasquez qla24xx_read_window(reg, 0xBFF0, 16, fw->xseq_1_reg);
1459c3a2f0dfSAndrew Vasquez
1460c3a2f0dfSAndrew Vasquez /* Receive sequence registers. */
1461c3a2f0dfSAndrew Vasquez iter_reg = fw->rseq_gp_reg;
1462c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0xFF00, 16, iter_reg);
1463c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0xFF10, 16, iter_reg);
1464c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0xFF20, 16, iter_reg);
1465c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0xFF30, 16, iter_reg);
1466c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0xFF40, 16, iter_reg);
1467c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0xFF50, 16, iter_reg);
1468c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0xFF60, 16, iter_reg);
1469c81d04c9SAndrew Vasquez qla24xx_read_window(reg, 0xFF70, 16, iter_reg);
1470c3a2f0dfSAndrew Vasquez
1471c3a2f0dfSAndrew Vasquez iter_reg = fw->rseq_0_reg;
1472c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0xFFC0, 16, iter_reg);
1473c81d04c9SAndrew Vasquez qla24xx_read_window(reg, 0xFFD0, 16, iter_reg);
1474c3a2f0dfSAndrew Vasquez
1475c81d04c9SAndrew Vasquez qla24xx_read_window(reg, 0xFFE0, 16, fw->rseq_1_reg);
1476c81d04c9SAndrew Vasquez qla24xx_read_window(reg, 0xFFF0, 16, fw->rseq_2_reg);
1477c3a2f0dfSAndrew Vasquez
1478c3a2f0dfSAndrew Vasquez /* Auxiliary sequence registers. */
1479c3a2f0dfSAndrew Vasquez iter_reg = fw->aseq_gp_reg;
1480c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0xB000, 16, iter_reg);
1481c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0xB010, 16, iter_reg);
1482c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0xB020, 16, iter_reg);
1483c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0xB030, 16, iter_reg);
1484c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0xB040, 16, iter_reg);
1485c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0xB050, 16, iter_reg);
1486c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0xB060, 16, iter_reg);
1487c81d04c9SAndrew Vasquez qla24xx_read_window(reg, 0xB070, 16, iter_reg);
1488c3a2f0dfSAndrew Vasquez
1489c3a2f0dfSAndrew Vasquez iter_reg = fw->aseq_0_reg;
1490c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0xB0C0, 16, iter_reg);
1491c81d04c9SAndrew Vasquez qla24xx_read_window(reg, 0xB0D0, 16, iter_reg);
1492c3a2f0dfSAndrew Vasquez
1493c81d04c9SAndrew Vasquez qla24xx_read_window(reg, 0xB0E0, 16, fw->aseq_1_reg);
1494c81d04c9SAndrew Vasquez qla24xx_read_window(reg, 0xB0F0, 16, fw->aseq_2_reg);
1495c3a2f0dfSAndrew Vasquez
1496c3a2f0dfSAndrew Vasquez /* Command DMA registers. */
1497c81d04c9SAndrew Vasquez qla24xx_read_window(reg, 0x7100, 16, fw->cmd_dma_reg);
1498c3a2f0dfSAndrew Vasquez
1499c3a2f0dfSAndrew Vasquez /* Queues. */
1500c3a2f0dfSAndrew Vasquez iter_reg = fw->req0_dma_reg;
1501c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x7200, 8, iter_reg);
1502c3a2f0dfSAndrew Vasquez dmp_reg = ®->iobase_q;
1503da08ef5cSJoe Carnuccio for (cnt = 0; cnt < 7; cnt++, dmp_reg++)
150404474d3aSBart Van Assche *iter_reg++ = htonl(rd_reg_dword(dmp_reg));
1505c3a2f0dfSAndrew Vasquez
1506c3a2f0dfSAndrew Vasquez iter_reg = fw->resp0_dma_reg;
1507c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x7300, 8, iter_reg);
1508c3a2f0dfSAndrew Vasquez dmp_reg = ®->iobase_q;
1509da08ef5cSJoe Carnuccio for (cnt = 0; cnt < 7; cnt++, dmp_reg++)
151004474d3aSBart Van Assche *iter_reg++ = htonl(rd_reg_dword(dmp_reg));
1511c3a2f0dfSAndrew Vasquez
1512c3a2f0dfSAndrew Vasquez iter_reg = fw->req1_dma_reg;
1513c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x7400, 8, iter_reg);
1514c3a2f0dfSAndrew Vasquez dmp_reg = ®->iobase_q;
1515da08ef5cSJoe Carnuccio for (cnt = 0; cnt < 7; cnt++, dmp_reg++)
151604474d3aSBart Van Assche *iter_reg++ = htonl(rd_reg_dword(dmp_reg));
1517c3a2f0dfSAndrew Vasquez
1518c3a2f0dfSAndrew Vasquez /* Transmit DMA registers. */
1519c3a2f0dfSAndrew Vasquez iter_reg = fw->xmt0_dma_reg;
1520c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x7600, 16, iter_reg);
1521c81d04c9SAndrew Vasquez qla24xx_read_window(reg, 0x7610, 16, iter_reg);
1522c3a2f0dfSAndrew Vasquez
1523c3a2f0dfSAndrew Vasquez iter_reg = fw->xmt1_dma_reg;
1524c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x7620, 16, iter_reg);
1525c81d04c9SAndrew Vasquez qla24xx_read_window(reg, 0x7630, 16, iter_reg);
1526c3a2f0dfSAndrew Vasquez
1527c3a2f0dfSAndrew Vasquez iter_reg = fw->xmt2_dma_reg;
1528c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x7640, 16, iter_reg);
1529c81d04c9SAndrew Vasquez qla24xx_read_window(reg, 0x7650, 16, iter_reg);
1530c3a2f0dfSAndrew Vasquez
1531c3a2f0dfSAndrew Vasquez iter_reg = fw->xmt3_dma_reg;
1532c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x7660, 16, iter_reg);
1533c81d04c9SAndrew Vasquez qla24xx_read_window(reg, 0x7670, 16, iter_reg);
1534c3a2f0dfSAndrew Vasquez
1535c3a2f0dfSAndrew Vasquez iter_reg = fw->xmt4_dma_reg;
1536c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x7680, 16, iter_reg);
1537c81d04c9SAndrew Vasquez qla24xx_read_window(reg, 0x7690, 16, iter_reg);
1538c3a2f0dfSAndrew Vasquez
1539c81d04c9SAndrew Vasquez qla24xx_read_window(reg, 0x76A0, 16, fw->xmt_data_dma_reg);
1540c3a2f0dfSAndrew Vasquez
1541c3a2f0dfSAndrew Vasquez /* Receive DMA registers. */
1542c3a2f0dfSAndrew Vasquez iter_reg = fw->rcvt0_data_dma_reg;
1543c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x7700, 16, iter_reg);
1544c81d04c9SAndrew Vasquez qla24xx_read_window(reg, 0x7710, 16, iter_reg);
1545c3a2f0dfSAndrew Vasquez
1546c3a2f0dfSAndrew Vasquez iter_reg = fw->rcvt1_data_dma_reg;
1547c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x7720, 16, iter_reg);
1548c81d04c9SAndrew Vasquez qla24xx_read_window(reg, 0x7730, 16, iter_reg);
1549c3a2f0dfSAndrew Vasquez
1550c3a2f0dfSAndrew Vasquez /* RISC registers. */
1551c3a2f0dfSAndrew Vasquez iter_reg = fw->risc_gp_reg;
1552c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x0F00, 16, iter_reg);
1553c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x0F10, 16, iter_reg);
1554c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x0F20, 16, iter_reg);
1555c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x0F30, 16, iter_reg);
1556c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x0F40, 16, iter_reg);
1557c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x0F50, 16, iter_reg);
1558c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x0F60, 16, iter_reg);
1559c81d04c9SAndrew Vasquez qla24xx_read_window(reg, 0x0F70, 16, iter_reg);
1560c3a2f0dfSAndrew Vasquez
1561c3a2f0dfSAndrew Vasquez /* Local memory controller registers. */
1562c3a2f0dfSAndrew Vasquez iter_reg = fw->lmc_reg;
1563c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x3000, 16, iter_reg);
1564c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x3010, 16, iter_reg);
1565c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x3020, 16, iter_reg);
1566c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x3030, 16, iter_reg);
1567c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x3040, 16, iter_reg);
1568c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x3050, 16, iter_reg);
1569c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x3060, 16, iter_reg);
1570c81d04c9SAndrew Vasquez qla24xx_read_window(reg, 0x3070, 16, iter_reg);
1571c3a2f0dfSAndrew Vasquez
1572c3a2f0dfSAndrew Vasquez /* Fibre Protocol Module registers. */
1573c3a2f0dfSAndrew Vasquez iter_reg = fw->fpm_hdw_reg;
1574c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x4000, 16, iter_reg);
1575c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x4010, 16, iter_reg);
1576c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x4020, 16, iter_reg);
1577c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x4030, 16, iter_reg);
1578c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x4040, 16, iter_reg);
1579c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x4050, 16, iter_reg);
1580c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x4060, 16, iter_reg);
1581c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x4070, 16, iter_reg);
1582c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x4080, 16, iter_reg);
1583c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x4090, 16, iter_reg);
1584c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x40A0, 16, iter_reg);
1585c81d04c9SAndrew Vasquez qla24xx_read_window(reg, 0x40B0, 16, iter_reg);
1586c3a2f0dfSAndrew Vasquez
1587c3a2f0dfSAndrew Vasquez /* Frame Buffer registers. */
1588c3a2f0dfSAndrew Vasquez iter_reg = fw->fb_hdw_reg;
1589c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x6000, 16, iter_reg);
1590c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x6010, 16, iter_reg);
1591c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x6020, 16, iter_reg);
1592c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x6030, 16, iter_reg);
1593c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x6040, 16, iter_reg);
1594c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x6100, 16, iter_reg);
1595c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x6130, 16, iter_reg);
1596c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x6150, 16, iter_reg);
1597c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x6170, 16, iter_reg);
1598c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x6190, 16, iter_reg);
1599c81d04c9SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x61B0, 16, iter_reg);
1600c81d04c9SAndrew Vasquez qla24xx_read_window(reg, 0x6F00, 16, iter_reg);
1601c3a2f0dfSAndrew Vasquez
1602d63ab533SAndrew Vasquez /* Multi queue registers */
1603d63ab533SAndrew Vasquez nxt_chain = qla25xx_copy_mq(ha, (void *)ha->fw_dump + ha->chain_offset,
1604d63ab533SAndrew Vasquez &last_chain);
1605d63ab533SAndrew Vasquez
1606c81d04c9SAndrew Vasquez rval = qla24xx_soft_reset(ha);
1607c81d04c9SAndrew Vasquez if (rval != QLA_SUCCESS)
1608c81d04c9SAndrew Vasquez goto qla25xx_fw_dump_failed_0;
1609c3a2f0dfSAndrew Vasquez
1610c81d04c9SAndrew Vasquez rval = qla24xx_dump_memory(ha, fw->code_ram, sizeof(fw->code_ram),
1611c5722708SAndrew Vasquez &nxt);
1612c81d04c9SAndrew Vasquez if (rval != QLA_SUCCESS)
1613c81d04c9SAndrew Vasquez goto qla25xx_fw_dump_failed_0;
1614c3a2f0dfSAndrew Vasquez
161573208dfdSAnirban Chakraborty nxt = qla2xxx_copy_queues(ha, nxt);
1616c3a2f0dfSAndrew Vasquez
16177f544d00SBart Van Assche qla24xx_copy_eft(ha, nxt);
1618df613b96SAndrew Vasquez
1619d63ab533SAndrew Vasquez /* Chain entries -- started with MQ. */
1620050c9bb1SGiridhar Malavali nxt_chain = qla25xx_copy_fce(ha, nxt_chain, &last_chain);
1621050c9bb1SGiridhar Malavali nxt_chain = qla25xx_copy_mqueues(ha, nxt_chain, &last_chain);
16222d70c103SNicholas Bellinger nxt_chain = qla2xxx_copy_atioqueues(ha, nxt_chain, &last_chain);
1623b945e777SQuinn Tran nxt_chain = qla25xx_copy_exlogin(ha, nxt_chain, &last_chain);
1624bb99de67SAndrew Vasquez if (last_chain) {
1625ad950360SBart Van Assche ha->fw_dump->version |= htonl(DUMP_CHAIN_VARIANT);
1626ad950360SBart Van Assche *last_chain |= htonl(DUMP_CHAIN_LAST);
1627bb99de67SAndrew Vasquez }
1628df613b96SAndrew Vasquez
1629050c9bb1SGiridhar Malavali /* Adjust valid length. */
1630050c9bb1SGiridhar Malavali ha->fw_dump_len = (nxt_chain - (void *)ha->fw_dump);
1631050c9bb1SGiridhar Malavali
1632c81d04c9SAndrew Vasquez qla25xx_fw_dump_failed_0:
16333420d36cSAndrew Vasquez qla2xxx_dump_post_process(base_vha, rval);
1634c3a2f0dfSAndrew Vasquez }
16353a03eb79SAndrew Vasquez
16363a03eb79SAndrew Vasquez void
qla81xx_fw_dump(scsi_qla_host_t * vha)16378ae17876SBart Van Assche qla81xx_fw_dump(scsi_qla_host_t *vha)
16383a03eb79SAndrew Vasquez {
16393a03eb79SAndrew Vasquez int rval;
16403a03eb79SAndrew Vasquez uint32_t cnt;
16413a03eb79SAndrew Vasquez struct qla_hw_data *ha = vha->hw;
16423a03eb79SAndrew Vasquez struct device_reg_24xx __iomem *reg = &ha->iobase->isp24;
16437ffa5b93SBart Van Assche __le32 __iomem *dmp_reg;
16447ffa5b93SBart Van Assche __be32 *iter_reg;
16457ffa5b93SBart Van Assche __le16 __iomem *mbx_reg;
16463a03eb79SAndrew Vasquez struct qla81xx_fw_dump *fw;
16473a03eb79SAndrew Vasquez void *nxt, *nxt_chain;
16487ffa5b93SBart Van Assche __be32 *last_chain = NULL;
16493a03eb79SAndrew Vasquez struct scsi_qla_host *base_vha = pci_get_drvdata(ha->pdev);
16503a03eb79SAndrew Vasquez
16518ae17876SBart Van Assche lockdep_assert_held(&ha->hardware_lock);
16523a03eb79SAndrew Vasquez
16538ae17876SBart Van Assche ha->fw_dump_cap_flags = 0;
16543a03eb79SAndrew Vasquez
16553a03eb79SAndrew Vasquez if (!ha->fw_dump) {
16567c3df132SSaurav Kashyap ql_log(ql_log_warn, vha, 0xd00a,
16577c3df132SSaurav Kashyap "No buffer available for dump.\n");
16588ae17876SBart Van Assche return;
16593a03eb79SAndrew Vasquez }
16603a03eb79SAndrew Vasquez
16613a03eb79SAndrew Vasquez if (ha->fw_dumped) {
16627c3df132SSaurav Kashyap ql_log(ql_log_warn, vha, 0xd00b,
16637c3df132SSaurav Kashyap "Firmware has been previously dumped (%p) "
16647c3df132SSaurav Kashyap "-- ignoring request.\n",
16657c3df132SSaurav Kashyap ha->fw_dump);
16668ae17876SBart Van Assche return;
16673a03eb79SAndrew Vasquez }
16683a03eb79SAndrew Vasquez fw = &ha->fw_dump->isp.isp81;
16693a03eb79SAndrew Vasquez qla2xxx_prep_dump(ha, ha->fw_dump);
16703a03eb79SAndrew Vasquez
167104474d3aSBart Van Assche fw->host_status = htonl(rd_reg_dword(®->host_status));
16723a03eb79SAndrew Vasquez
16732f389fc4SHiral Patel /*
16742f389fc4SHiral Patel * Pause RISC. No need to track timeout, as resetting the chip
16752f389fc4SHiral Patel * is the right approach incase of pause timeout
16762f389fc4SHiral Patel */
167761f098ddSHiral Patel qla24xx_pause_risc(reg, ha);
16783a03eb79SAndrew Vasquez
16793a03eb79SAndrew Vasquez /* Host/Risc registers. */
16803a03eb79SAndrew Vasquez iter_reg = fw->host_risc_reg;
16813a03eb79SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x7000, 16, iter_reg);
16823a03eb79SAndrew Vasquez qla24xx_read_window(reg, 0x7010, 16, iter_reg);
16833a03eb79SAndrew Vasquez
16843a03eb79SAndrew Vasquez /* PCIe registers. */
168504474d3aSBart Van Assche wrt_reg_dword(®->iobase_addr, 0x7C00);
168604474d3aSBart Van Assche rd_reg_dword(®->iobase_addr);
168704474d3aSBart Van Assche wrt_reg_dword(®->iobase_window, 0x01);
16883a03eb79SAndrew Vasquez dmp_reg = ®->iobase_c4;
168904474d3aSBart Van Assche fw->pcie_regs[0] = htonl(rd_reg_dword(dmp_reg));
1690da08ef5cSJoe Carnuccio dmp_reg++;
169104474d3aSBart Van Assche fw->pcie_regs[1] = htonl(rd_reg_dword(dmp_reg));
1692da08ef5cSJoe Carnuccio dmp_reg++;
169304474d3aSBart Van Assche fw->pcie_regs[2] = htonl(rd_reg_dword(dmp_reg));
169404474d3aSBart Van Assche fw->pcie_regs[3] = htonl(rd_reg_dword(®->iobase_window));
16953a03eb79SAndrew Vasquez
169604474d3aSBart Van Assche wrt_reg_dword(®->iobase_window, 0x00);
169704474d3aSBart Van Assche rd_reg_dword(®->iobase_window);
16983a03eb79SAndrew Vasquez
16993a03eb79SAndrew Vasquez /* Host interface registers. */
17003a03eb79SAndrew Vasquez dmp_reg = ®->flash_addr;
1701d221aed1SBart Van Assche for (cnt = 0; cnt < ARRAY_SIZE(fw->host_reg); cnt++, dmp_reg++)
170204474d3aSBart Van Assche fw->host_reg[cnt] = htonl(rd_reg_dword(dmp_reg));
17033a03eb79SAndrew Vasquez
17043a03eb79SAndrew Vasquez /* Disable interrupts. */
170504474d3aSBart Van Assche wrt_reg_dword(®->ictrl, 0);
170604474d3aSBart Van Assche rd_reg_dword(®->ictrl);
17073a03eb79SAndrew Vasquez
17083a03eb79SAndrew Vasquez /* Shadow registers. */
170904474d3aSBart Van Assche wrt_reg_dword(®->iobase_addr, 0x0F70);
171004474d3aSBart Van Assche rd_reg_dword(®->iobase_addr);
171104474d3aSBart Van Assche wrt_reg_dword(®->iobase_select, 0xB0000000);
171204474d3aSBart Van Assche fw->shadow_reg[0] = htonl(rd_reg_dword(®->iobase_sdata));
17133a03eb79SAndrew Vasquez
171404474d3aSBart Van Assche wrt_reg_dword(®->iobase_select, 0xB0100000);
171504474d3aSBart Van Assche fw->shadow_reg[1] = htonl(rd_reg_dword(®->iobase_sdata));
17163a03eb79SAndrew Vasquez
171704474d3aSBart Van Assche wrt_reg_dword(®->iobase_select, 0xB0200000);
171804474d3aSBart Van Assche fw->shadow_reg[2] = htonl(rd_reg_dword(®->iobase_sdata));
17193a03eb79SAndrew Vasquez
172004474d3aSBart Van Assche wrt_reg_dword(®->iobase_select, 0xB0300000);
172104474d3aSBart Van Assche fw->shadow_reg[3] = htonl(rd_reg_dword(®->iobase_sdata));
17223a03eb79SAndrew Vasquez
172304474d3aSBart Van Assche wrt_reg_dword(®->iobase_select, 0xB0400000);
172404474d3aSBart Van Assche fw->shadow_reg[4] = htonl(rd_reg_dword(®->iobase_sdata));
17253a03eb79SAndrew Vasquez
172604474d3aSBart Van Assche wrt_reg_dword(®->iobase_select, 0xB0500000);
172704474d3aSBart Van Assche fw->shadow_reg[5] = htonl(rd_reg_dword(®->iobase_sdata));
17283a03eb79SAndrew Vasquez
172904474d3aSBart Van Assche wrt_reg_dword(®->iobase_select, 0xB0600000);
173004474d3aSBart Van Assche fw->shadow_reg[6] = htonl(rd_reg_dword(®->iobase_sdata));
17313a03eb79SAndrew Vasquez
173204474d3aSBart Van Assche wrt_reg_dword(®->iobase_select, 0xB0700000);
173304474d3aSBart Van Assche fw->shadow_reg[7] = htonl(rd_reg_dword(®->iobase_sdata));
17343a03eb79SAndrew Vasquez
173504474d3aSBart Van Assche wrt_reg_dword(®->iobase_select, 0xB0800000);
173604474d3aSBart Van Assche fw->shadow_reg[8] = htonl(rd_reg_dword(®->iobase_sdata));
17373a03eb79SAndrew Vasquez
173804474d3aSBart Van Assche wrt_reg_dword(®->iobase_select, 0xB0900000);
173904474d3aSBart Van Assche fw->shadow_reg[9] = htonl(rd_reg_dword(®->iobase_sdata));
17403a03eb79SAndrew Vasquez
174104474d3aSBart Van Assche wrt_reg_dword(®->iobase_select, 0xB0A00000);
174204474d3aSBart Van Assche fw->shadow_reg[10] = htonl(rd_reg_dword(®->iobase_sdata));
17433a03eb79SAndrew Vasquez
17443a03eb79SAndrew Vasquez /* RISC I/O register. */
174504474d3aSBart Van Assche wrt_reg_dword(®->iobase_addr, 0x0010);
174604474d3aSBart Van Assche fw->risc_io_reg = htonl(rd_reg_dword(®->iobase_window));
17473a03eb79SAndrew Vasquez
17483a03eb79SAndrew Vasquez /* Mailbox registers. */
17493a03eb79SAndrew Vasquez mbx_reg = ®->mailbox0;
1750d221aed1SBart Van Assche for (cnt = 0; cnt < ARRAY_SIZE(fw->mailbox_reg); cnt++, mbx_reg++)
175104474d3aSBart Van Assche fw->mailbox_reg[cnt] = htons(rd_reg_word(mbx_reg));
17523a03eb79SAndrew Vasquez
17533a03eb79SAndrew Vasquez /* Transfer sequence registers. */
17543a03eb79SAndrew Vasquez iter_reg = fw->xseq_gp_reg;
17553a03eb79SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0xBF00, 16, iter_reg);
17563a03eb79SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0xBF10, 16, iter_reg);
17573a03eb79SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0xBF20, 16, iter_reg);
17583a03eb79SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0xBF30, 16, iter_reg);
17593a03eb79SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0xBF40, 16, iter_reg);
17603a03eb79SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0xBF50, 16, iter_reg);
17613a03eb79SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0xBF60, 16, iter_reg);
17623a03eb79SAndrew Vasquez qla24xx_read_window(reg, 0xBF70, 16, iter_reg);
17633a03eb79SAndrew Vasquez
17643a03eb79SAndrew Vasquez iter_reg = fw->xseq_0_reg;
17653a03eb79SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0xBFC0, 16, iter_reg);
17663a03eb79SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0xBFD0, 16, iter_reg);
17673a03eb79SAndrew Vasquez qla24xx_read_window(reg, 0xBFE0, 16, iter_reg);
17683a03eb79SAndrew Vasquez
17693a03eb79SAndrew Vasquez qla24xx_read_window(reg, 0xBFF0, 16, fw->xseq_1_reg);
17703a03eb79SAndrew Vasquez
17713a03eb79SAndrew Vasquez /* Receive sequence registers. */
17723a03eb79SAndrew Vasquez iter_reg = fw->rseq_gp_reg;
17733a03eb79SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0xFF00, 16, iter_reg);
17743a03eb79SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0xFF10, 16, iter_reg);
17753a03eb79SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0xFF20, 16, iter_reg);
17763a03eb79SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0xFF30, 16, iter_reg);
17773a03eb79SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0xFF40, 16, iter_reg);
17783a03eb79SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0xFF50, 16, iter_reg);
17793a03eb79SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0xFF60, 16, iter_reg);
17803a03eb79SAndrew Vasquez qla24xx_read_window(reg, 0xFF70, 16, iter_reg);
17813a03eb79SAndrew Vasquez
17823a03eb79SAndrew Vasquez iter_reg = fw->rseq_0_reg;
17833a03eb79SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0xFFC0, 16, iter_reg);
17843a03eb79SAndrew Vasquez qla24xx_read_window(reg, 0xFFD0, 16, iter_reg);
17853a03eb79SAndrew Vasquez
17863a03eb79SAndrew Vasquez qla24xx_read_window(reg, 0xFFE0, 16, fw->rseq_1_reg);
17873a03eb79SAndrew Vasquez qla24xx_read_window(reg, 0xFFF0, 16, fw->rseq_2_reg);
17883a03eb79SAndrew Vasquez
17893a03eb79SAndrew Vasquez /* Auxiliary sequence registers. */
17903a03eb79SAndrew Vasquez iter_reg = fw->aseq_gp_reg;
17913a03eb79SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0xB000, 16, iter_reg);
17923a03eb79SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0xB010, 16, iter_reg);
17933a03eb79SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0xB020, 16, iter_reg);
17943a03eb79SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0xB030, 16, iter_reg);
17953a03eb79SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0xB040, 16, iter_reg);
17963a03eb79SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0xB050, 16, iter_reg);
17973a03eb79SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0xB060, 16, iter_reg);
17983a03eb79SAndrew Vasquez qla24xx_read_window(reg, 0xB070, 16, iter_reg);
17993a03eb79SAndrew Vasquez
18003a03eb79SAndrew Vasquez iter_reg = fw->aseq_0_reg;
18013a03eb79SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0xB0C0, 16, iter_reg);
18023a03eb79SAndrew Vasquez qla24xx_read_window(reg, 0xB0D0, 16, iter_reg);
18033a03eb79SAndrew Vasquez
18043a03eb79SAndrew Vasquez qla24xx_read_window(reg, 0xB0E0, 16, fw->aseq_1_reg);
18053a03eb79SAndrew Vasquez qla24xx_read_window(reg, 0xB0F0, 16, fw->aseq_2_reg);
18063a03eb79SAndrew Vasquez
18073a03eb79SAndrew Vasquez /* Command DMA registers. */
18083a03eb79SAndrew Vasquez qla24xx_read_window(reg, 0x7100, 16, fw->cmd_dma_reg);
18093a03eb79SAndrew Vasquez
18103a03eb79SAndrew Vasquez /* Queues. */
18113a03eb79SAndrew Vasquez iter_reg = fw->req0_dma_reg;
18123a03eb79SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x7200, 8, iter_reg);
18133a03eb79SAndrew Vasquez dmp_reg = ®->iobase_q;
1814da08ef5cSJoe Carnuccio for (cnt = 0; cnt < 7; cnt++, dmp_reg++)
181504474d3aSBart Van Assche *iter_reg++ = htonl(rd_reg_dword(dmp_reg));
18163a03eb79SAndrew Vasquez
18173a03eb79SAndrew Vasquez iter_reg = fw->resp0_dma_reg;
18183a03eb79SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x7300, 8, iter_reg);
18193a03eb79SAndrew Vasquez dmp_reg = ®->iobase_q;
1820da08ef5cSJoe Carnuccio for (cnt = 0; cnt < 7; cnt++, dmp_reg++)
182104474d3aSBart Van Assche *iter_reg++ = htonl(rd_reg_dword(dmp_reg));
18223a03eb79SAndrew Vasquez
18233a03eb79SAndrew Vasquez iter_reg = fw->req1_dma_reg;
18243a03eb79SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x7400, 8, iter_reg);
18253a03eb79SAndrew Vasquez dmp_reg = ®->iobase_q;
1826da08ef5cSJoe Carnuccio for (cnt = 0; cnt < 7; cnt++, dmp_reg++)
182704474d3aSBart Van Assche *iter_reg++ = htonl(rd_reg_dword(dmp_reg));
18283a03eb79SAndrew Vasquez
18293a03eb79SAndrew Vasquez /* Transmit DMA registers. */
18303a03eb79SAndrew Vasquez iter_reg = fw->xmt0_dma_reg;
18313a03eb79SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x7600, 16, iter_reg);
18323a03eb79SAndrew Vasquez qla24xx_read_window(reg, 0x7610, 16, iter_reg);
18333a03eb79SAndrew Vasquez
18343a03eb79SAndrew Vasquez iter_reg = fw->xmt1_dma_reg;
18353a03eb79SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x7620, 16, iter_reg);
18363a03eb79SAndrew Vasquez qla24xx_read_window(reg, 0x7630, 16, iter_reg);
18373a03eb79SAndrew Vasquez
18383a03eb79SAndrew Vasquez iter_reg = fw->xmt2_dma_reg;
18393a03eb79SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x7640, 16, iter_reg);
18403a03eb79SAndrew Vasquez qla24xx_read_window(reg, 0x7650, 16, iter_reg);
18413a03eb79SAndrew Vasquez
18423a03eb79SAndrew Vasquez iter_reg = fw->xmt3_dma_reg;
18433a03eb79SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x7660, 16, iter_reg);
18443a03eb79SAndrew Vasquez qla24xx_read_window(reg, 0x7670, 16, iter_reg);
18453a03eb79SAndrew Vasquez
18463a03eb79SAndrew Vasquez iter_reg = fw->xmt4_dma_reg;
18473a03eb79SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x7680, 16, iter_reg);
18483a03eb79SAndrew Vasquez qla24xx_read_window(reg, 0x7690, 16, iter_reg);
18493a03eb79SAndrew Vasquez
18503a03eb79SAndrew Vasquez qla24xx_read_window(reg, 0x76A0, 16, fw->xmt_data_dma_reg);
18513a03eb79SAndrew Vasquez
18523a03eb79SAndrew Vasquez /* Receive DMA registers. */
18533a03eb79SAndrew Vasquez iter_reg = fw->rcvt0_data_dma_reg;
18543a03eb79SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x7700, 16, iter_reg);
18553a03eb79SAndrew Vasquez qla24xx_read_window(reg, 0x7710, 16, iter_reg);
18563a03eb79SAndrew Vasquez
18573a03eb79SAndrew Vasquez iter_reg = fw->rcvt1_data_dma_reg;
18583a03eb79SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x7720, 16, iter_reg);
18593a03eb79SAndrew Vasquez qla24xx_read_window(reg, 0x7730, 16, iter_reg);
18603a03eb79SAndrew Vasquez
18613a03eb79SAndrew Vasquez /* RISC registers. */
18623a03eb79SAndrew Vasquez iter_reg = fw->risc_gp_reg;
18633a03eb79SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x0F00, 16, iter_reg);
18643a03eb79SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x0F10, 16, iter_reg);
18653a03eb79SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x0F20, 16, iter_reg);
18663a03eb79SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x0F30, 16, iter_reg);
18673a03eb79SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x0F40, 16, iter_reg);
18683a03eb79SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x0F50, 16, iter_reg);
18693a03eb79SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x0F60, 16, iter_reg);
18703a03eb79SAndrew Vasquez qla24xx_read_window(reg, 0x0F70, 16, iter_reg);
18713a03eb79SAndrew Vasquez
18723a03eb79SAndrew Vasquez /* Local memory controller registers. */
18733a03eb79SAndrew Vasquez iter_reg = fw->lmc_reg;
18743a03eb79SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x3000, 16, iter_reg);
18753a03eb79SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x3010, 16, iter_reg);
18763a03eb79SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x3020, 16, iter_reg);
18773a03eb79SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x3030, 16, iter_reg);
18783a03eb79SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x3040, 16, iter_reg);
18793a03eb79SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x3050, 16, iter_reg);
18803a03eb79SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x3060, 16, iter_reg);
18813a03eb79SAndrew Vasquez qla24xx_read_window(reg, 0x3070, 16, iter_reg);
18823a03eb79SAndrew Vasquez
18833a03eb79SAndrew Vasquez /* Fibre Protocol Module registers. */
18843a03eb79SAndrew Vasquez iter_reg = fw->fpm_hdw_reg;
18853a03eb79SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x4000, 16, iter_reg);
18863a03eb79SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x4010, 16, iter_reg);
18873a03eb79SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x4020, 16, iter_reg);
18883a03eb79SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x4030, 16, iter_reg);
18893a03eb79SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x4040, 16, iter_reg);
18903a03eb79SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x4050, 16, iter_reg);
18913a03eb79SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x4060, 16, iter_reg);
18923a03eb79SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x4070, 16, iter_reg);
18933a03eb79SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x4080, 16, iter_reg);
18943a03eb79SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x4090, 16, iter_reg);
18953a03eb79SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x40A0, 16, iter_reg);
18963a03eb79SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x40B0, 16, iter_reg);
18973a03eb79SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x40C0, 16, iter_reg);
18983a03eb79SAndrew Vasquez qla24xx_read_window(reg, 0x40D0, 16, iter_reg);
18993a03eb79SAndrew Vasquez
19003a03eb79SAndrew Vasquez /* Frame Buffer registers. */
19013a03eb79SAndrew Vasquez iter_reg = fw->fb_hdw_reg;
19023a03eb79SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x6000, 16, iter_reg);
19033a03eb79SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x6010, 16, iter_reg);
19043a03eb79SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x6020, 16, iter_reg);
19053a03eb79SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x6030, 16, iter_reg);
19063a03eb79SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x6040, 16, iter_reg);
19073a03eb79SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x6100, 16, iter_reg);
19083a03eb79SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x6130, 16, iter_reg);
19093a03eb79SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x6150, 16, iter_reg);
19103a03eb79SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x6170, 16, iter_reg);
19113a03eb79SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x6190, 16, iter_reg);
19123a03eb79SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x61B0, 16, iter_reg);
19133a03eb79SAndrew Vasquez iter_reg = qla24xx_read_window(reg, 0x61C0, 16, iter_reg);
19143a03eb79SAndrew Vasquez qla24xx_read_window(reg, 0x6F00, 16, iter_reg);
19153a03eb79SAndrew Vasquez
19163a03eb79SAndrew Vasquez /* Multi queue registers */
19173a03eb79SAndrew Vasquez nxt_chain = qla25xx_copy_mq(ha, (void *)ha->fw_dump + ha->chain_offset,
19183a03eb79SAndrew Vasquez &last_chain);
19193a03eb79SAndrew Vasquez
19203a03eb79SAndrew Vasquez rval = qla24xx_soft_reset(ha);
19213a03eb79SAndrew Vasquez if (rval != QLA_SUCCESS)
19223a03eb79SAndrew Vasquez goto qla81xx_fw_dump_failed_0;
19233a03eb79SAndrew Vasquez
19243a03eb79SAndrew Vasquez rval = qla24xx_dump_memory(ha, fw->code_ram, sizeof(fw->code_ram),
19253a03eb79SAndrew Vasquez &nxt);
19263a03eb79SAndrew Vasquez if (rval != QLA_SUCCESS)
19273a03eb79SAndrew Vasquez goto qla81xx_fw_dump_failed_0;
19283a03eb79SAndrew Vasquez
19293a03eb79SAndrew Vasquez nxt = qla2xxx_copy_queues(ha, nxt);
19303a03eb79SAndrew Vasquez
19317f544d00SBart Van Assche qla24xx_copy_eft(ha, nxt);
19323a03eb79SAndrew Vasquez
19333a03eb79SAndrew Vasquez /* Chain entries -- started with MQ. */
1934050c9bb1SGiridhar Malavali nxt_chain = qla25xx_copy_fce(ha, nxt_chain, &last_chain);
1935050c9bb1SGiridhar Malavali nxt_chain = qla25xx_copy_mqueues(ha, nxt_chain, &last_chain);
19362d70c103SNicholas Bellinger nxt_chain = qla2xxx_copy_atioqueues(ha, nxt_chain, &last_chain);
1937b945e777SQuinn Tran nxt_chain = qla25xx_copy_exlogin(ha, nxt_chain, &last_chain);
1938b945e777SQuinn Tran nxt_chain = qla81xx_copy_exchoffld(ha, nxt_chain, &last_chain);
19393a03eb79SAndrew Vasquez if (last_chain) {
1940ad950360SBart Van Assche ha->fw_dump->version |= htonl(DUMP_CHAIN_VARIANT);
1941ad950360SBart Van Assche *last_chain |= htonl(DUMP_CHAIN_LAST);
19423a03eb79SAndrew Vasquez }
19433a03eb79SAndrew Vasquez
1944050c9bb1SGiridhar Malavali /* Adjust valid length. */
1945050c9bb1SGiridhar Malavali ha->fw_dump_len = (nxt_chain - (void *)ha->fw_dump);
1946050c9bb1SGiridhar Malavali
19473a03eb79SAndrew Vasquez qla81xx_fw_dump_failed_0:
19483420d36cSAndrew Vasquez qla2xxx_dump_post_process(base_vha, rval);
19493a03eb79SAndrew Vasquez }
19503a03eb79SAndrew Vasquez
19516246b8a1SGiridhar Malavali void
qla83xx_fw_dump(scsi_qla_host_t * vha)19528ae17876SBart Van Assche qla83xx_fw_dump(scsi_qla_host_t *vha)
19536246b8a1SGiridhar Malavali {
19546246b8a1SGiridhar Malavali int rval;
195552c82823SBart Van Assche uint32_t cnt;
19566246b8a1SGiridhar Malavali struct qla_hw_data *ha = vha->hw;
19576246b8a1SGiridhar Malavali struct device_reg_24xx __iomem *reg = &ha->iobase->isp24;
19587ffa5b93SBart Van Assche __le32 __iomem *dmp_reg;
19597ffa5b93SBart Van Assche __be32 *iter_reg;
19607ffa5b93SBart Van Assche __le16 __iomem *mbx_reg;
19616246b8a1SGiridhar Malavali struct qla83xx_fw_dump *fw;
19626246b8a1SGiridhar Malavali void *nxt, *nxt_chain;
19637ffa5b93SBart Van Assche __be32 *last_chain = NULL;
19646246b8a1SGiridhar Malavali struct scsi_qla_host *base_vha = pci_get_drvdata(ha->pdev);
19656246b8a1SGiridhar Malavali
19668ae17876SBart Van Assche lockdep_assert_held(&ha->hardware_lock);
19676246b8a1SGiridhar Malavali
19688ae17876SBart Van Assche ha->fw_dump_cap_flags = 0;
19696246b8a1SGiridhar Malavali
19706246b8a1SGiridhar Malavali if (!ha->fw_dump) {
19716246b8a1SGiridhar Malavali ql_log(ql_log_warn, vha, 0xd00c,
19726246b8a1SGiridhar Malavali "No buffer available for dump!!!\n");
19738ae17876SBart Van Assche return;
19746246b8a1SGiridhar Malavali }
19756246b8a1SGiridhar Malavali
19766246b8a1SGiridhar Malavali if (ha->fw_dumped) {
19776246b8a1SGiridhar Malavali ql_log(ql_log_warn, vha, 0xd00d,
19786246b8a1SGiridhar Malavali "Firmware has been previously dumped (%p) -- ignoring "
19796246b8a1SGiridhar Malavali "request...\n", ha->fw_dump);
19808ae17876SBart Van Assche return;
19816246b8a1SGiridhar Malavali }
19827e84766cSQuinn Tran QLA_FW_STOPPED(ha);
19836246b8a1SGiridhar Malavali fw = &ha->fw_dump->isp.isp83;
19846246b8a1SGiridhar Malavali qla2xxx_prep_dump(ha, ha->fw_dump);
19856246b8a1SGiridhar Malavali
198604474d3aSBart Van Assche fw->host_status = htonl(rd_reg_dword(®->host_status));
19876246b8a1SGiridhar Malavali
19882f389fc4SHiral Patel /*
19892f389fc4SHiral Patel * Pause RISC. No need to track timeout, as resetting the chip
19902f389fc4SHiral Patel * is the right approach incase of pause timeout
19912f389fc4SHiral Patel */
199261f098ddSHiral Patel qla24xx_pause_risc(reg, ha);
19936246b8a1SGiridhar Malavali
199404474d3aSBart Van Assche wrt_reg_dword(®->iobase_addr, 0x6000);
19956246b8a1SGiridhar Malavali dmp_reg = ®->iobase_window;
199604474d3aSBart Van Assche rd_reg_dword(dmp_reg);
199704474d3aSBart Van Assche wrt_reg_dword(dmp_reg, 0);
19986246b8a1SGiridhar Malavali
19996246b8a1SGiridhar Malavali dmp_reg = ®->unused_4_1[0];
200004474d3aSBart Van Assche rd_reg_dword(dmp_reg);
200104474d3aSBart Van Assche wrt_reg_dword(dmp_reg, 0);
20026246b8a1SGiridhar Malavali
200304474d3aSBart Van Assche wrt_reg_dword(®->iobase_addr, 0x6010);
20046246b8a1SGiridhar Malavali dmp_reg = ®->unused_4_1[2];
200504474d3aSBart Van Assche rd_reg_dword(dmp_reg);
200604474d3aSBart Van Assche wrt_reg_dword(dmp_reg, 0);
20076246b8a1SGiridhar Malavali
20086246b8a1SGiridhar Malavali /* select PCR and disable ecc checking and correction */
200904474d3aSBart Van Assche wrt_reg_dword(®->iobase_addr, 0x0F70);
201004474d3aSBart Van Assche rd_reg_dword(®->iobase_addr);
201104474d3aSBart Van Assche wrt_reg_dword(®->iobase_select, 0x60000000); /* write to F0h = PCR */
20126246b8a1SGiridhar Malavali
20136246b8a1SGiridhar Malavali /* Host/Risc registers. */
20146246b8a1SGiridhar Malavali iter_reg = fw->host_risc_reg;
20156246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x7000, 16, iter_reg);
20166246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x7010, 16, iter_reg);
20176246b8a1SGiridhar Malavali qla24xx_read_window(reg, 0x7040, 16, iter_reg);
20186246b8a1SGiridhar Malavali
20196246b8a1SGiridhar Malavali /* PCIe registers. */
202004474d3aSBart Van Assche wrt_reg_dword(®->iobase_addr, 0x7C00);
202104474d3aSBart Van Assche rd_reg_dword(®->iobase_addr);
202204474d3aSBart Van Assche wrt_reg_dword(®->iobase_window, 0x01);
20236246b8a1SGiridhar Malavali dmp_reg = ®->iobase_c4;
202404474d3aSBart Van Assche fw->pcie_regs[0] = htonl(rd_reg_dword(dmp_reg));
2025da08ef5cSJoe Carnuccio dmp_reg++;
202604474d3aSBart Van Assche fw->pcie_regs[1] = htonl(rd_reg_dword(dmp_reg));
2027da08ef5cSJoe Carnuccio dmp_reg++;
202804474d3aSBart Van Assche fw->pcie_regs[2] = htonl(rd_reg_dword(dmp_reg));
202904474d3aSBart Van Assche fw->pcie_regs[3] = htonl(rd_reg_dword(®->iobase_window));
20306246b8a1SGiridhar Malavali
203104474d3aSBart Van Assche wrt_reg_dword(®->iobase_window, 0x00);
203204474d3aSBart Van Assche rd_reg_dword(®->iobase_window);
20336246b8a1SGiridhar Malavali
20346246b8a1SGiridhar Malavali /* Host interface registers. */
20356246b8a1SGiridhar Malavali dmp_reg = ®->flash_addr;
2036d221aed1SBart Van Assche for (cnt = 0; cnt < ARRAY_SIZE(fw->host_reg); cnt++, dmp_reg++)
203704474d3aSBart Van Assche fw->host_reg[cnt] = htonl(rd_reg_dword(dmp_reg));
20386246b8a1SGiridhar Malavali
20396246b8a1SGiridhar Malavali /* Disable interrupts. */
204004474d3aSBart Van Assche wrt_reg_dword(®->ictrl, 0);
204104474d3aSBart Van Assche rd_reg_dword(®->ictrl);
20426246b8a1SGiridhar Malavali
20436246b8a1SGiridhar Malavali /* Shadow registers. */
204404474d3aSBart Van Assche wrt_reg_dword(®->iobase_addr, 0x0F70);
204504474d3aSBart Van Assche rd_reg_dword(®->iobase_addr);
204604474d3aSBart Van Assche wrt_reg_dword(®->iobase_select, 0xB0000000);
204704474d3aSBart Van Assche fw->shadow_reg[0] = htonl(rd_reg_dword(®->iobase_sdata));
20486246b8a1SGiridhar Malavali
204904474d3aSBart Van Assche wrt_reg_dword(®->iobase_select, 0xB0100000);
205004474d3aSBart Van Assche fw->shadow_reg[1] = htonl(rd_reg_dword(®->iobase_sdata));
20516246b8a1SGiridhar Malavali
205204474d3aSBart Van Assche wrt_reg_dword(®->iobase_select, 0xB0200000);
205304474d3aSBart Van Assche fw->shadow_reg[2] = htonl(rd_reg_dword(®->iobase_sdata));
20546246b8a1SGiridhar Malavali
205504474d3aSBart Van Assche wrt_reg_dword(®->iobase_select, 0xB0300000);
205604474d3aSBart Van Assche fw->shadow_reg[3] = htonl(rd_reg_dword(®->iobase_sdata));
20576246b8a1SGiridhar Malavali
205804474d3aSBart Van Assche wrt_reg_dword(®->iobase_select, 0xB0400000);
205904474d3aSBart Van Assche fw->shadow_reg[4] = htonl(rd_reg_dword(®->iobase_sdata));
20606246b8a1SGiridhar Malavali
206104474d3aSBart Van Assche wrt_reg_dword(®->iobase_select, 0xB0500000);
206204474d3aSBart Van Assche fw->shadow_reg[5] = htonl(rd_reg_dword(®->iobase_sdata));
20636246b8a1SGiridhar Malavali
206404474d3aSBart Van Assche wrt_reg_dword(®->iobase_select, 0xB0600000);
206504474d3aSBart Van Assche fw->shadow_reg[6] = htonl(rd_reg_dword(®->iobase_sdata));
20666246b8a1SGiridhar Malavali
206704474d3aSBart Van Assche wrt_reg_dword(®->iobase_select, 0xB0700000);
206804474d3aSBart Van Assche fw->shadow_reg[7] = htonl(rd_reg_dword(®->iobase_sdata));
20696246b8a1SGiridhar Malavali
207004474d3aSBart Van Assche wrt_reg_dword(®->iobase_select, 0xB0800000);
207104474d3aSBart Van Assche fw->shadow_reg[8] = htonl(rd_reg_dword(®->iobase_sdata));
20726246b8a1SGiridhar Malavali
207304474d3aSBart Van Assche wrt_reg_dword(®->iobase_select, 0xB0900000);
207404474d3aSBart Van Assche fw->shadow_reg[9] = htonl(rd_reg_dword(®->iobase_sdata));
20756246b8a1SGiridhar Malavali
207604474d3aSBart Van Assche wrt_reg_dword(®->iobase_select, 0xB0A00000);
207704474d3aSBart Van Assche fw->shadow_reg[10] = htonl(rd_reg_dword(®->iobase_sdata));
20786246b8a1SGiridhar Malavali
20796246b8a1SGiridhar Malavali /* RISC I/O register. */
208004474d3aSBart Van Assche wrt_reg_dword(®->iobase_addr, 0x0010);
208104474d3aSBart Van Assche fw->risc_io_reg = htonl(rd_reg_dword(®->iobase_window));
20826246b8a1SGiridhar Malavali
20836246b8a1SGiridhar Malavali /* Mailbox registers. */
20846246b8a1SGiridhar Malavali mbx_reg = ®->mailbox0;
2085d221aed1SBart Van Assche for (cnt = 0; cnt < ARRAY_SIZE(fw->mailbox_reg); cnt++, mbx_reg++)
208604474d3aSBart Van Assche fw->mailbox_reg[cnt] = htons(rd_reg_word(mbx_reg));
20876246b8a1SGiridhar Malavali
20886246b8a1SGiridhar Malavali /* Transfer sequence registers. */
20896246b8a1SGiridhar Malavali iter_reg = fw->xseq_gp_reg;
20906246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0xBE00, 16, iter_reg);
20916246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0xBE10, 16, iter_reg);
20926246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0xBE20, 16, iter_reg);
20936246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0xBE30, 16, iter_reg);
20946246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0xBE40, 16, iter_reg);
20956246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0xBE50, 16, iter_reg);
20966246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0xBE60, 16, iter_reg);
20976246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0xBE70, 16, iter_reg);
20986246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0xBF00, 16, iter_reg);
20996246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0xBF10, 16, iter_reg);
21006246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0xBF20, 16, iter_reg);
21016246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0xBF30, 16, iter_reg);
21026246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0xBF40, 16, iter_reg);
21036246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0xBF50, 16, iter_reg);
21046246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0xBF60, 16, iter_reg);
21056246b8a1SGiridhar Malavali qla24xx_read_window(reg, 0xBF70, 16, iter_reg);
21066246b8a1SGiridhar Malavali
21076246b8a1SGiridhar Malavali iter_reg = fw->xseq_0_reg;
21086246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0xBFC0, 16, iter_reg);
21096246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0xBFD0, 16, iter_reg);
21106246b8a1SGiridhar Malavali qla24xx_read_window(reg, 0xBFE0, 16, iter_reg);
21116246b8a1SGiridhar Malavali
21126246b8a1SGiridhar Malavali qla24xx_read_window(reg, 0xBFF0, 16, fw->xseq_1_reg);
21136246b8a1SGiridhar Malavali
21146246b8a1SGiridhar Malavali qla24xx_read_window(reg, 0xBEF0, 16, fw->xseq_2_reg);
21156246b8a1SGiridhar Malavali
21166246b8a1SGiridhar Malavali /* Receive sequence registers. */
21176246b8a1SGiridhar Malavali iter_reg = fw->rseq_gp_reg;
21186246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0xFE00, 16, iter_reg);
21196246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0xFE10, 16, iter_reg);
21206246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0xFE20, 16, iter_reg);
21216246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0xFE30, 16, iter_reg);
21226246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0xFE40, 16, iter_reg);
21236246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0xFE50, 16, iter_reg);
21246246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0xFE60, 16, iter_reg);
21256246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0xFE70, 16, iter_reg);
21266246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0xFF00, 16, iter_reg);
21276246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0xFF10, 16, iter_reg);
21286246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0xFF20, 16, iter_reg);
21296246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0xFF30, 16, iter_reg);
21306246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0xFF40, 16, iter_reg);
21316246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0xFF50, 16, iter_reg);
21326246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0xFF60, 16, iter_reg);
21336246b8a1SGiridhar Malavali qla24xx_read_window(reg, 0xFF70, 16, iter_reg);
21346246b8a1SGiridhar Malavali
21356246b8a1SGiridhar Malavali iter_reg = fw->rseq_0_reg;
21366246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0xFFC0, 16, iter_reg);
21376246b8a1SGiridhar Malavali qla24xx_read_window(reg, 0xFFD0, 16, iter_reg);
21386246b8a1SGiridhar Malavali
21396246b8a1SGiridhar Malavali qla24xx_read_window(reg, 0xFFE0, 16, fw->rseq_1_reg);
21406246b8a1SGiridhar Malavali qla24xx_read_window(reg, 0xFFF0, 16, fw->rseq_2_reg);
21416246b8a1SGiridhar Malavali qla24xx_read_window(reg, 0xFEF0, 16, fw->rseq_3_reg);
21426246b8a1SGiridhar Malavali
21436246b8a1SGiridhar Malavali /* Auxiliary sequence registers. */
21446246b8a1SGiridhar Malavali iter_reg = fw->aseq_gp_reg;
21456246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0xB000, 16, iter_reg);
21466246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0xB010, 16, iter_reg);
21476246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0xB020, 16, iter_reg);
21486246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0xB030, 16, iter_reg);
21496246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0xB040, 16, iter_reg);
21506246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0xB050, 16, iter_reg);
21516246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0xB060, 16, iter_reg);
21526246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0xB070, 16, iter_reg);
21536246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0xB100, 16, iter_reg);
21546246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0xB110, 16, iter_reg);
21556246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0xB120, 16, iter_reg);
21566246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0xB130, 16, iter_reg);
21576246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0xB140, 16, iter_reg);
21586246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0xB150, 16, iter_reg);
21596246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0xB160, 16, iter_reg);
21606246b8a1SGiridhar Malavali qla24xx_read_window(reg, 0xB170, 16, iter_reg);
21616246b8a1SGiridhar Malavali
21626246b8a1SGiridhar Malavali iter_reg = fw->aseq_0_reg;
21636246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0xB0C0, 16, iter_reg);
21646246b8a1SGiridhar Malavali qla24xx_read_window(reg, 0xB0D0, 16, iter_reg);
21656246b8a1SGiridhar Malavali
21666246b8a1SGiridhar Malavali qla24xx_read_window(reg, 0xB0E0, 16, fw->aseq_1_reg);
21676246b8a1SGiridhar Malavali qla24xx_read_window(reg, 0xB0F0, 16, fw->aseq_2_reg);
21686246b8a1SGiridhar Malavali qla24xx_read_window(reg, 0xB1F0, 16, fw->aseq_3_reg);
21696246b8a1SGiridhar Malavali
21706246b8a1SGiridhar Malavali /* Command DMA registers. */
21716246b8a1SGiridhar Malavali iter_reg = fw->cmd_dma_reg;
21726246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x7100, 16, iter_reg);
21736246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x7120, 16, iter_reg);
21746246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x7130, 16, iter_reg);
21756246b8a1SGiridhar Malavali qla24xx_read_window(reg, 0x71F0, 16, iter_reg);
21766246b8a1SGiridhar Malavali
21776246b8a1SGiridhar Malavali /* Queues. */
21786246b8a1SGiridhar Malavali iter_reg = fw->req0_dma_reg;
21796246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x7200, 8, iter_reg);
21806246b8a1SGiridhar Malavali dmp_reg = ®->iobase_q;
2181da08ef5cSJoe Carnuccio for (cnt = 0; cnt < 7; cnt++, dmp_reg++)
218204474d3aSBart Van Assche *iter_reg++ = htonl(rd_reg_dword(dmp_reg));
21836246b8a1SGiridhar Malavali
21846246b8a1SGiridhar Malavali iter_reg = fw->resp0_dma_reg;
21856246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x7300, 8, iter_reg);
21866246b8a1SGiridhar Malavali dmp_reg = ®->iobase_q;
2187da08ef5cSJoe Carnuccio for (cnt = 0; cnt < 7; cnt++, dmp_reg++)
218804474d3aSBart Van Assche *iter_reg++ = htonl(rd_reg_dword(dmp_reg));
21896246b8a1SGiridhar Malavali
21906246b8a1SGiridhar Malavali iter_reg = fw->req1_dma_reg;
21916246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x7400, 8, iter_reg);
21926246b8a1SGiridhar Malavali dmp_reg = ®->iobase_q;
2193da08ef5cSJoe Carnuccio for (cnt = 0; cnt < 7; cnt++, dmp_reg++)
219404474d3aSBart Van Assche *iter_reg++ = htonl(rd_reg_dword(dmp_reg));
21956246b8a1SGiridhar Malavali
21966246b8a1SGiridhar Malavali /* Transmit DMA registers. */
21976246b8a1SGiridhar Malavali iter_reg = fw->xmt0_dma_reg;
21986246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x7600, 16, iter_reg);
21996246b8a1SGiridhar Malavali qla24xx_read_window(reg, 0x7610, 16, iter_reg);
22006246b8a1SGiridhar Malavali
22016246b8a1SGiridhar Malavali iter_reg = fw->xmt1_dma_reg;
22026246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x7620, 16, iter_reg);
22036246b8a1SGiridhar Malavali qla24xx_read_window(reg, 0x7630, 16, iter_reg);
22046246b8a1SGiridhar Malavali
22056246b8a1SGiridhar Malavali iter_reg = fw->xmt2_dma_reg;
22066246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x7640, 16, iter_reg);
22076246b8a1SGiridhar Malavali qla24xx_read_window(reg, 0x7650, 16, iter_reg);
22086246b8a1SGiridhar Malavali
22096246b8a1SGiridhar Malavali iter_reg = fw->xmt3_dma_reg;
22106246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x7660, 16, iter_reg);
22116246b8a1SGiridhar Malavali qla24xx_read_window(reg, 0x7670, 16, iter_reg);
22126246b8a1SGiridhar Malavali
22136246b8a1SGiridhar Malavali iter_reg = fw->xmt4_dma_reg;
22146246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x7680, 16, iter_reg);
22156246b8a1SGiridhar Malavali qla24xx_read_window(reg, 0x7690, 16, iter_reg);
22166246b8a1SGiridhar Malavali
22176246b8a1SGiridhar Malavali qla24xx_read_window(reg, 0x76A0, 16, fw->xmt_data_dma_reg);
22186246b8a1SGiridhar Malavali
22196246b8a1SGiridhar Malavali /* Receive DMA registers. */
22206246b8a1SGiridhar Malavali iter_reg = fw->rcvt0_data_dma_reg;
22216246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x7700, 16, iter_reg);
22226246b8a1SGiridhar Malavali qla24xx_read_window(reg, 0x7710, 16, iter_reg);
22236246b8a1SGiridhar Malavali
22246246b8a1SGiridhar Malavali iter_reg = fw->rcvt1_data_dma_reg;
22256246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x7720, 16, iter_reg);
22266246b8a1SGiridhar Malavali qla24xx_read_window(reg, 0x7730, 16, iter_reg);
22276246b8a1SGiridhar Malavali
22286246b8a1SGiridhar Malavali /* RISC registers. */
22296246b8a1SGiridhar Malavali iter_reg = fw->risc_gp_reg;
22306246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x0F00, 16, iter_reg);
22316246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x0F10, 16, iter_reg);
22326246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x0F20, 16, iter_reg);
22336246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x0F30, 16, iter_reg);
22346246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x0F40, 16, iter_reg);
22356246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x0F50, 16, iter_reg);
22366246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x0F60, 16, iter_reg);
22376246b8a1SGiridhar Malavali qla24xx_read_window(reg, 0x0F70, 16, iter_reg);
22386246b8a1SGiridhar Malavali
22396246b8a1SGiridhar Malavali /* Local memory controller registers. */
22406246b8a1SGiridhar Malavali iter_reg = fw->lmc_reg;
22416246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x3000, 16, iter_reg);
22426246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x3010, 16, iter_reg);
22436246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x3020, 16, iter_reg);
22446246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x3030, 16, iter_reg);
22456246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x3040, 16, iter_reg);
22466246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x3050, 16, iter_reg);
22476246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x3060, 16, iter_reg);
22486246b8a1SGiridhar Malavali qla24xx_read_window(reg, 0x3070, 16, iter_reg);
22496246b8a1SGiridhar Malavali
22506246b8a1SGiridhar Malavali /* Fibre Protocol Module registers. */
22516246b8a1SGiridhar Malavali iter_reg = fw->fpm_hdw_reg;
22526246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x4000, 16, iter_reg);
22536246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x4010, 16, iter_reg);
22546246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x4020, 16, iter_reg);
22556246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x4030, 16, iter_reg);
22566246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x4040, 16, iter_reg);
22576246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x4050, 16, iter_reg);
22586246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x4060, 16, iter_reg);
22596246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x4070, 16, iter_reg);
22606246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x4080, 16, iter_reg);
22616246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x4090, 16, iter_reg);
22626246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x40A0, 16, iter_reg);
22636246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x40B0, 16, iter_reg);
22646246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x40C0, 16, iter_reg);
22656246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x40D0, 16, iter_reg);
22666246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x40E0, 16, iter_reg);
22676246b8a1SGiridhar Malavali qla24xx_read_window(reg, 0x40F0, 16, iter_reg);
22686246b8a1SGiridhar Malavali
22696246b8a1SGiridhar Malavali /* RQ0 Array registers. */
22706246b8a1SGiridhar Malavali iter_reg = fw->rq0_array_reg;
22716246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x5C00, 16, iter_reg);
22726246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x5C10, 16, iter_reg);
22736246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x5C20, 16, iter_reg);
22746246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x5C30, 16, iter_reg);
22756246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x5C40, 16, iter_reg);
22766246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x5C50, 16, iter_reg);
22776246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x5C60, 16, iter_reg);
22786246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x5C70, 16, iter_reg);
22796246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x5C80, 16, iter_reg);
22806246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x5C90, 16, iter_reg);
22816246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x5CA0, 16, iter_reg);
22826246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x5CB0, 16, iter_reg);
22836246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x5CC0, 16, iter_reg);
22846246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x5CD0, 16, iter_reg);
22856246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x5CE0, 16, iter_reg);
22866246b8a1SGiridhar Malavali qla24xx_read_window(reg, 0x5CF0, 16, iter_reg);
22876246b8a1SGiridhar Malavali
22886246b8a1SGiridhar Malavali /* RQ1 Array registers. */
22896246b8a1SGiridhar Malavali iter_reg = fw->rq1_array_reg;
22906246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x5D00, 16, iter_reg);
22916246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x5D10, 16, iter_reg);
22926246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x5D20, 16, iter_reg);
22936246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x5D30, 16, iter_reg);
22946246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x5D40, 16, iter_reg);
22956246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x5D50, 16, iter_reg);
22966246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x5D60, 16, iter_reg);
22976246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x5D70, 16, iter_reg);
22986246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x5D80, 16, iter_reg);
22996246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x5D90, 16, iter_reg);
23006246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x5DA0, 16, iter_reg);
23016246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x5DB0, 16, iter_reg);
23026246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x5DC0, 16, iter_reg);
23036246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x5DD0, 16, iter_reg);
23046246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x5DE0, 16, iter_reg);
23056246b8a1SGiridhar Malavali qla24xx_read_window(reg, 0x5DF0, 16, iter_reg);
23066246b8a1SGiridhar Malavali
23076246b8a1SGiridhar Malavali /* RP0 Array registers. */
23086246b8a1SGiridhar Malavali iter_reg = fw->rp0_array_reg;
23096246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x5E00, 16, iter_reg);
23106246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x5E10, 16, iter_reg);
23116246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x5E20, 16, iter_reg);
23126246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x5E30, 16, iter_reg);
23136246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x5E40, 16, iter_reg);
23146246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x5E50, 16, iter_reg);
23156246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x5E60, 16, iter_reg);
23166246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x5E70, 16, iter_reg);
23176246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x5E80, 16, iter_reg);
23186246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x5E90, 16, iter_reg);
23196246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x5EA0, 16, iter_reg);
23206246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x5EB0, 16, iter_reg);
23216246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x5EC0, 16, iter_reg);
23226246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x5ED0, 16, iter_reg);
23236246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x5EE0, 16, iter_reg);
23246246b8a1SGiridhar Malavali qla24xx_read_window(reg, 0x5EF0, 16, iter_reg);
23256246b8a1SGiridhar Malavali
23266246b8a1SGiridhar Malavali /* RP1 Array registers. */
23276246b8a1SGiridhar Malavali iter_reg = fw->rp1_array_reg;
23286246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x5F00, 16, iter_reg);
23296246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x5F10, 16, iter_reg);
23306246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x5F20, 16, iter_reg);
23316246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x5F30, 16, iter_reg);
23326246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x5F40, 16, iter_reg);
23336246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x5F50, 16, iter_reg);
23346246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x5F60, 16, iter_reg);
23356246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x5F70, 16, iter_reg);
23366246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x5F80, 16, iter_reg);
23376246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x5F90, 16, iter_reg);
23386246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x5FA0, 16, iter_reg);
23396246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x5FB0, 16, iter_reg);
23406246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x5FC0, 16, iter_reg);
23416246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x5FD0, 16, iter_reg);
23426246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x5FE0, 16, iter_reg);
23436246b8a1SGiridhar Malavali qla24xx_read_window(reg, 0x5FF0, 16, iter_reg);
23446246b8a1SGiridhar Malavali
23456246b8a1SGiridhar Malavali iter_reg = fw->at0_array_reg;
23466246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x7080, 16, iter_reg);
23476246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x7090, 16, iter_reg);
23486246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x70A0, 16, iter_reg);
23496246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x70B0, 16, iter_reg);
23506246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x70C0, 16, iter_reg);
23516246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x70D0, 16, iter_reg);
23526246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x70E0, 16, iter_reg);
23536246b8a1SGiridhar Malavali qla24xx_read_window(reg, 0x70F0, 16, iter_reg);
23546246b8a1SGiridhar Malavali
23556246b8a1SGiridhar Malavali /* I/O Queue Control registers. */
23566246b8a1SGiridhar Malavali qla24xx_read_window(reg, 0x7800, 16, fw->queue_control_reg);
23576246b8a1SGiridhar Malavali
23586246b8a1SGiridhar Malavali /* Frame Buffer registers. */
23596246b8a1SGiridhar Malavali iter_reg = fw->fb_hdw_reg;
23606246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x6000, 16, iter_reg);
23616246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x6010, 16, iter_reg);
23626246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x6020, 16, iter_reg);
23636246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x6030, 16, iter_reg);
23646246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x6040, 16, iter_reg);
23656246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x6060, 16, iter_reg);
23666246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x6070, 16, iter_reg);
23676246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x6100, 16, iter_reg);
23686246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x6130, 16, iter_reg);
23696246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x6150, 16, iter_reg);
23706246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x6170, 16, iter_reg);
23716246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x6190, 16, iter_reg);
23726246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x61B0, 16, iter_reg);
23736246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x61C0, 16, iter_reg);
23746246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x6530, 16, iter_reg);
23756246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x6540, 16, iter_reg);
23766246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x6550, 16, iter_reg);
23776246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x6560, 16, iter_reg);
23786246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x6570, 16, iter_reg);
23796246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x6580, 16, iter_reg);
23806246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x6590, 16, iter_reg);
23816246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x65A0, 16, iter_reg);
23826246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x65B0, 16, iter_reg);
23836246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x65C0, 16, iter_reg);
23846246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x65D0, 16, iter_reg);
23856246b8a1SGiridhar Malavali iter_reg = qla24xx_read_window(reg, 0x65E0, 16, iter_reg);
23866246b8a1SGiridhar Malavali qla24xx_read_window(reg, 0x6F00, 16, iter_reg);
23876246b8a1SGiridhar Malavali
23886246b8a1SGiridhar Malavali /* Multi queue registers */
23896246b8a1SGiridhar Malavali nxt_chain = qla25xx_copy_mq(ha, (void *)ha->fw_dump + ha->chain_offset,
23906246b8a1SGiridhar Malavali &last_chain);
23916246b8a1SGiridhar Malavali
23926246b8a1SGiridhar Malavali rval = qla24xx_soft_reset(ha);
23936246b8a1SGiridhar Malavali if (rval != QLA_SUCCESS) {
23946246b8a1SGiridhar Malavali ql_log(ql_log_warn, vha, 0xd00e,
23956246b8a1SGiridhar Malavali "SOFT RESET FAILED, forcing continuation of dump!!!\n");
23966246b8a1SGiridhar Malavali rval = QLA_SUCCESS;
23976246b8a1SGiridhar Malavali
23986246b8a1SGiridhar Malavali ql_log(ql_log_warn, vha, 0xd00f, "try a bigger hammer!!!\n");
23996246b8a1SGiridhar Malavali
240004474d3aSBart Van Assche wrt_reg_dword(®->hccr, HCCRX_SET_RISC_RESET);
240104474d3aSBart Van Assche rd_reg_dword(®->hccr);
24026246b8a1SGiridhar Malavali
240304474d3aSBart Van Assche wrt_reg_dword(®->hccr, HCCRX_REL_RISC_PAUSE);
240404474d3aSBart Van Assche rd_reg_dword(®->hccr);
24056246b8a1SGiridhar Malavali
240604474d3aSBart Van Assche wrt_reg_dword(®->hccr, HCCRX_CLR_RISC_RESET);
240704474d3aSBart Van Assche rd_reg_dword(®->hccr);
24086246b8a1SGiridhar Malavali
240904474d3aSBart Van Assche for (cnt = 30000; cnt && (rd_reg_word(®->mailbox0)); cnt--)
24106246b8a1SGiridhar Malavali udelay(5);
24116246b8a1SGiridhar Malavali
24126246b8a1SGiridhar Malavali if (!cnt) {
24136246b8a1SGiridhar Malavali nxt = fw->code_ram;
24148c0bc701SSaurav Kashyap nxt += sizeof(fw->code_ram);
24156246b8a1SGiridhar Malavali nxt += (ha->fw_memory_size - 0x100000 + 1);
24166246b8a1SGiridhar Malavali goto copy_queue;
241761f098ddSHiral Patel } else {
241861f098ddSHiral Patel set_bit(RISC_RDY_AFT_RESET, &ha->fw_dump_cap_flags);
24196246b8a1SGiridhar Malavali ql_log(ql_log_warn, vha, 0xd010,
24206246b8a1SGiridhar Malavali "bigger hammer success?\n");
24216246b8a1SGiridhar Malavali }
242261f098ddSHiral Patel }
24236246b8a1SGiridhar Malavali
24246246b8a1SGiridhar Malavali rval = qla24xx_dump_memory(ha, fw->code_ram, sizeof(fw->code_ram),
24256246b8a1SGiridhar Malavali &nxt);
24266246b8a1SGiridhar Malavali if (rval != QLA_SUCCESS)
24276246b8a1SGiridhar Malavali goto qla83xx_fw_dump_failed_0;
24286246b8a1SGiridhar Malavali
24296246b8a1SGiridhar Malavali copy_queue:
24306246b8a1SGiridhar Malavali nxt = qla2xxx_copy_queues(ha, nxt);
24316246b8a1SGiridhar Malavali
24327f544d00SBart Van Assche qla24xx_copy_eft(ha, nxt);
24336246b8a1SGiridhar Malavali
24346246b8a1SGiridhar Malavali /* Chain entries -- started with MQ. */
24356246b8a1SGiridhar Malavali nxt_chain = qla25xx_copy_fce(ha, nxt_chain, &last_chain);
24366246b8a1SGiridhar Malavali nxt_chain = qla25xx_copy_mqueues(ha, nxt_chain, &last_chain);
24372d70c103SNicholas Bellinger nxt_chain = qla2xxx_copy_atioqueues(ha, nxt_chain, &last_chain);
2438b945e777SQuinn Tran nxt_chain = qla25xx_copy_exlogin(ha, nxt_chain, &last_chain);
2439b945e777SQuinn Tran nxt_chain = qla81xx_copy_exchoffld(ha, nxt_chain, &last_chain);
24406246b8a1SGiridhar Malavali if (last_chain) {
2441ad950360SBart Van Assche ha->fw_dump->version |= htonl(DUMP_CHAIN_VARIANT);
2442ad950360SBart Van Assche *last_chain |= htonl(DUMP_CHAIN_LAST);
24436246b8a1SGiridhar Malavali }
24446246b8a1SGiridhar Malavali
24456246b8a1SGiridhar Malavali /* Adjust valid length. */
24466246b8a1SGiridhar Malavali ha->fw_dump_len = (nxt_chain - (void *)ha->fw_dump);
24476246b8a1SGiridhar Malavali
24486246b8a1SGiridhar Malavali qla83xx_fw_dump_failed_0:
24496246b8a1SGiridhar Malavali qla2xxx_dump_post_process(base_vha, rval);
24506246b8a1SGiridhar Malavali }
24516246b8a1SGiridhar Malavali
24521da177e4SLinus Torvalds /****************************************************************************/
24531da177e4SLinus Torvalds /* Driver Debug Functions. */
24541da177e4SLinus Torvalds /****************************************************************************/
2455cfb0919cSChad Dupuis
2456e7019c95SBart Van Assche /* Write the debug message prefix into @pbuf. */
ql_dbg_prefix(char * pbuf,int pbuf_size,struct pci_dev * pdev,const scsi_qla_host_t * vha,uint msg_id)24578bfc149bSArun Easi static void ql_dbg_prefix(char *pbuf, int pbuf_size, struct pci_dev *pdev,
2458e7019c95SBart Van Assche const scsi_qla_host_t *vha, uint msg_id)
2459e7019c95SBart Van Assche {
2460e7019c95SBart Van Assche if (vha) {
2461e7019c95SBart Van Assche const struct pci_dev *pdev = vha->hw->pdev;
2462e7019c95SBart Van Assche
2463e7019c95SBart Van Assche /* <module-name> [<dev-name>]-<msg-id>:<host>: */
246472e813d9SYe Bin snprintf(pbuf, pbuf_size, "%s [%s]-%04x:%lu: ", QL_MSGHDR,
2465e7019c95SBart Van Assche dev_name(&(pdev->dev)), msg_id, vha->host_no);
24668bfc149bSArun Easi } else if (pdev) {
24678bfc149bSArun Easi snprintf(pbuf, pbuf_size, "%s [%s]-%04x: : ", QL_MSGHDR,
24688bfc149bSArun Easi dev_name(&pdev->dev), msg_id);
2469e7019c95SBart Van Assche } else {
2470e7019c95SBart Van Assche /* <module-name> [<dev-name>]-<msg-id>: : */
2471e7019c95SBart Van Assche snprintf(pbuf, pbuf_size, "%s [%s]-%04x: : ", QL_MSGHDR,
2472e7019c95SBart Van Assche "0000:00:00.0", msg_id);
2473e7019c95SBart Van Assche }
2474e7019c95SBart Van Assche }
2475e7019c95SBart Van Assche
24763ce8866cSSaurav Kashyap /*
24773ce8866cSSaurav Kashyap * This function is for formatting and logging debug information.
24783ce8866cSSaurav Kashyap * It is to be used when vha is available. It formats the message
24793ce8866cSSaurav Kashyap * and logs it to the messages file.
24803ce8866cSSaurav Kashyap * parameters:
24813ce8866cSSaurav Kashyap * level: The level of the debug messages to be printed.
24823ce8866cSSaurav Kashyap * If ql2xextended_error_logging value is correctly set,
24833ce8866cSSaurav Kashyap * this message will appear in the messages file.
24843ce8866cSSaurav Kashyap * vha: Pointer to the scsi_qla_host_t.
24853ce8866cSSaurav Kashyap * id: This is a unique identifier for the level. It identifies the
24863ce8866cSSaurav Kashyap * part of the code from where the message originated.
24873ce8866cSSaurav Kashyap * msg: The message to be displayed.
24883ce8866cSSaurav Kashyap */
24893ce8866cSSaurav Kashyap void
ql_dbg(uint level,scsi_qla_host_t * vha,uint id,const char * fmt,...)2490f8f97b0cSJoe Carnuccio ql_dbg(uint level, scsi_qla_host_t *vha, uint id, const char *fmt, ...)
2491086b3e8aSJoe Perches {
2492086b3e8aSJoe Perches va_list va;
2493086b3e8aSJoe Perches struct va_format vaf;
2494e7019c95SBart Van Assche char pbuf[64];
24953ce8866cSSaurav Kashyap
24968bfc149bSArun Easi ql_ktrace(1, level, pbuf, NULL, vha, id, fmt);
24978bfc149bSArun Easi
24988bfc149bSArun Easi if (!ql_mask_match(level))
249969002c8cSRoman Bolshakov return;
250069002c8cSRoman Bolshakov
25018bfc149bSArun Easi if (!pbuf[0]) /* set by ql_ktrace */
25028bfc149bSArun Easi ql_dbg_prefix(pbuf, ARRAY_SIZE(pbuf), NULL, vha, id);
25038bfc149bSArun Easi
2504086b3e8aSJoe Perches va_start(va, fmt);
25053ce8866cSSaurav Kashyap
2506086b3e8aSJoe Perches vaf.fmt = fmt;
2507086b3e8aSJoe Perches vaf.va = &va;
25083ce8866cSSaurav Kashyap
2509e7019c95SBart Van Assche pr_warn("%s%pV", pbuf, &vaf);
25103ce8866cSSaurav Kashyap
2511086b3e8aSJoe Perches va_end(va);
25123ce8866cSSaurav Kashyap
25133ce8866cSSaurav Kashyap }
25143ce8866cSSaurav Kashyap
25153ce8866cSSaurav Kashyap /*
25163ce8866cSSaurav Kashyap * This function is for formatting and logging debug information.
2517d6a03581SMasanari Iida * It is to be used when vha is not available and pci is available,
25183ce8866cSSaurav Kashyap * i.e., before host allocation. It formats the message and logs it
25193ce8866cSSaurav Kashyap * to the messages file.
25203ce8866cSSaurav Kashyap * parameters:
25213ce8866cSSaurav Kashyap * level: The level of the debug messages to be printed.
25223ce8866cSSaurav Kashyap * If ql2xextended_error_logging value is correctly set,
25233ce8866cSSaurav Kashyap * this message will appear in the messages file.
25243ce8866cSSaurav Kashyap * pdev: Pointer to the struct pci_dev.
25253ce8866cSSaurav Kashyap * id: This is a unique id for the level. It identifies the part
25263ce8866cSSaurav Kashyap * of the code from where the message originated.
25273ce8866cSSaurav Kashyap * msg: The message to be displayed.
25283ce8866cSSaurav Kashyap */
25293ce8866cSSaurav Kashyap void
ql_dbg_pci(uint level,struct pci_dev * pdev,uint id,const char * fmt,...)2530f8f97b0cSJoe Carnuccio ql_dbg_pci(uint level, struct pci_dev *pdev, uint id, const char *fmt, ...)
2531086b3e8aSJoe Perches {
2532086b3e8aSJoe Perches va_list va;
2533086b3e8aSJoe Perches struct va_format vaf;
2534e7019c95SBart Van Assche char pbuf[128];
25353ce8866cSSaurav Kashyap
25363ce8866cSSaurav Kashyap if (pdev == NULL)
25373ce8866cSSaurav Kashyap return;
25388bfc149bSArun Easi
25398bfc149bSArun Easi ql_ktrace(1, level, pbuf, pdev, NULL, id, fmt);
25408bfc149bSArun Easi
2541cfb0919cSChad Dupuis if (!ql_mask_match(level))
2542086b3e8aSJoe Perches return;
25433ce8866cSSaurav Kashyap
2544086b3e8aSJoe Perches va_start(va, fmt);
25453ce8866cSSaurav Kashyap
2546086b3e8aSJoe Perches vaf.fmt = fmt;
2547086b3e8aSJoe Perches vaf.va = &va;
25483ce8866cSSaurav Kashyap
25498bfc149bSArun Easi if (!pbuf[0]) /* set by ql_ktrace */
25508bfc149bSArun Easi ql_dbg_prefix(pbuf, ARRAY_SIZE(pbuf), pdev, NULL,
25518bfc149bSArun Easi id + ql_dbg_offset);
2552e7019c95SBart Van Assche pr_warn("%s%pV", pbuf, &vaf);
25533ce8866cSSaurav Kashyap
2554086b3e8aSJoe Perches va_end(va);
25553ce8866cSSaurav Kashyap }
25563ce8866cSSaurav Kashyap
25573ce8866cSSaurav Kashyap /*
25583ce8866cSSaurav Kashyap * This function is for formatting and logging log messages.
25593ce8866cSSaurav Kashyap * It is to be used when vha is available. It formats the message
25603ce8866cSSaurav Kashyap * and logs it to the messages file. All the messages will be logged
25613ce8866cSSaurav Kashyap * irrespective of value of ql2xextended_error_logging.
25623ce8866cSSaurav Kashyap * parameters:
25633ce8866cSSaurav Kashyap * level: The level of the log messages to be printed in the
25643ce8866cSSaurav Kashyap * messages file.
25653ce8866cSSaurav Kashyap * vha: Pointer to the scsi_qla_host_t
25663ce8866cSSaurav Kashyap * id: This is a unique id for the level. It identifies the
25673ce8866cSSaurav Kashyap * part of the code from where the message originated.
25683ce8866cSSaurav Kashyap * msg: The message to be displayed.
25693ce8866cSSaurav Kashyap */
25703ce8866cSSaurav Kashyap void
ql_log(uint level,scsi_qla_host_t * vha,uint id,const char * fmt,...)2571f8f97b0cSJoe Carnuccio ql_log(uint level, scsi_qla_host_t *vha, uint id, const char *fmt, ...)
2572086b3e8aSJoe Perches {
2573086b3e8aSJoe Perches va_list va;
2574086b3e8aSJoe Perches struct va_format vaf;
2575086b3e8aSJoe Perches char pbuf[128];
25763ce8866cSSaurav Kashyap
2577086b3e8aSJoe Perches if (level > ql_errlev)
2578086b3e8aSJoe Perches return;
25793ce8866cSSaurav Kashyap
25808bfc149bSArun Easi ql_ktrace(0, level, pbuf, NULL, vha, id, fmt);
25818bfc149bSArun Easi
25828bfc149bSArun Easi if (!pbuf[0]) /* set by ql_ktrace */
25838bfc149bSArun Easi ql_dbg_prefix(pbuf, ARRAY_SIZE(pbuf), NULL, vha, id);
25843ce8866cSSaurav Kashyap
2585086b3e8aSJoe Perches va_start(va, fmt);
2586086b3e8aSJoe Perches
2587086b3e8aSJoe Perches vaf.fmt = fmt;
2588086b3e8aSJoe Perches vaf.va = &va;
25893ce8866cSSaurav Kashyap
25903ce8866cSSaurav Kashyap switch (level) {
259170a3fc76SChad Dupuis case ql_log_fatal: /* FATAL LOG */
2592086b3e8aSJoe Perches pr_crit("%s%pV", pbuf, &vaf);
25933ce8866cSSaurav Kashyap break;
259470a3fc76SChad Dupuis case ql_log_warn:
2595086b3e8aSJoe Perches pr_err("%s%pV", pbuf, &vaf);
25963ce8866cSSaurav Kashyap break;
259770a3fc76SChad Dupuis case ql_log_info:
2598086b3e8aSJoe Perches pr_warn("%s%pV", pbuf, &vaf);
25993ce8866cSSaurav Kashyap break;
26003ce8866cSSaurav Kashyap default:
2601086b3e8aSJoe Perches pr_info("%s%pV", pbuf, &vaf);
26023ce8866cSSaurav Kashyap break;
26033ce8866cSSaurav Kashyap }
26043ce8866cSSaurav Kashyap
2605086b3e8aSJoe Perches va_end(va);
26063ce8866cSSaurav Kashyap }
26073ce8866cSSaurav Kashyap
26083ce8866cSSaurav Kashyap /*
26093ce8866cSSaurav Kashyap * This function is for formatting and logging log messages.
2610d6a03581SMasanari Iida * It is to be used when vha is not available and pci is available,
26113ce8866cSSaurav Kashyap * i.e., before host allocation. It formats the message and logs
26123ce8866cSSaurav Kashyap * it to the messages file. All the messages are logged irrespective
26133ce8866cSSaurav Kashyap * of the value of ql2xextended_error_logging.
26143ce8866cSSaurav Kashyap * parameters:
26153ce8866cSSaurav Kashyap * level: The level of the log messages to be printed in the
26163ce8866cSSaurav Kashyap * messages file.
26173ce8866cSSaurav Kashyap * pdev: Pointer to the struct pci_dev.
26183ce8866cSSaurav Kashyap * id: This is a unique id for the level. It identifies the
26193ce8866cSSaurav Kashyap * part of the code from where the message originated.
26203ce8866cSSaurav Kashyap * msg: The message to be displayed.
26213ce8866cSSaurav Kashyap */
26223ce8866cSSaurav Kashyap void
ql_log_pci(uint level,struct pci_dev * pdev,uint id,const char * fmt,...)2623f8f97b0cSJoe Carnuccio ql_log_pci(uint level, struct pci_dev *pdev, uint id, const char *fmt, ...)
2624086b3e8aSJoe Perches {
2625086b3e8aSJoe Perches va_list va;
2626086b3e8aSJoe Perches struct va_format vaf;
2627086b3e8aSJoe Perches char pbuf[128];
26283ce8866cSSaurav Kashyap
26293ce8866cSSaurav Kashyap if (pdev == NULL)
26303ce8866cSSaurav Kashyap return;
2631086b3e8aSJoe Perches if (level > ql_errlev)
2632086b3e8aSJoe Perches return;
26333ce8866cSSaurav Kashyap
26348bfc149bSArun Easi ql_ktrace(0, level, pbuf, pdev, NULL, id, fmt);
26358bfc149bSArun Easi
26368bfc149bSArun Easi if (!pbuf[0]) /* set by ql_ktrace */
26378bfc149bSArun Easi ql_dbg_prefix(pbuf, ARRAY_SIZE(pbuf), pdev, NULL, id);
26383ce8866cSSaurav Kashyap
2639086b3e8aSJoe Perches va_start(va, fmt);
2640086b3e8aSJoe Perches
2641086b3e8aSJoe Perches vaf.fmt = fmt;
2642086b3e8aSJoe Perches vaf.va = &va;
2643086b3e8aSJoe Perches
26443ce8866cSSaurav Kashyap switch (level) {
264570a3fc76SChad Dupuis case ql_log_fatal: /* FATAL LOG */
2646086b3e8aSJoe Perches pr_crit("%s%pV", pbuf, &vaf);
26473ce8866cSSaurav Kashyap break;
264870a3fc76SChad Dupuis case ql_log_warn:
2649086b3e8aSJoe Perches pr_err("%s%pV", pbuf, &vaf);
26503ce8866cSSaurav Kashyap break;
265170a3fc76SChad Dupuis case ql_log_info:
2652086b3e8aSJoe Perches pr_warn("%s%pV", pbuf, &vaf);
26533ce8866cSSaurav Kashyap break;
26543ce8866cSSaurav Kashyap default:
2655086b3e8aSJoe Perches pr_info("%s%pV", pbuf, &vaf);
26563ce8866cSSaurav Kashyap break;
26573ce8866cSSaurav Kashyap }
26583ce8866cSSaurav Kashyap
2659086b3e8aSJoe Perches va_end(va);
26603ce8866cSSaurav Kashyap }
26613ce8866cSSaurav Kashyap
26623ce8866cSSaurav Kashyap void
ql_dump_regs(uint level,scsi_qla_host_t * vha,uint id)2663f8f97b0cSJoe Carnuccio ql_dump_regs(uint level, scsi_qla_host_t *vha, uint id)
26643ce8866cSSaurav Kashyap {
26653ce8866cSSaurav Kashyap int i;
26663ce8866cSSaurav Kashyap struct qla_hw_data *ha = vha->hw;
26673ce8866cSSaurav Kashyap struct device_reg_2xxx __iomem *reg = &ha->iobase->isp;
26683ce8866cSSaurav Kashyap struct device_reg_24xx __iomem *reg24 = &ha->iobase->isp24;
26693ce8866cSSaurav Kashyap struct device_reg_82xx __iomem *reg82 = &ha->iobase->isp82;
26707ffa5b93SBart Van Assche __le16 __iomem *mbx_reg;
26713ce8866cSSaurav Kashyap
2672cfb0919cSChad Dupuis if (!ql_mask_match(level))
2673cfb0919cSChad Dupuis return;
26743ce8866cSSaurav Kashyap
26757ec0effdSAtul Deshmukh if (IS_P3P_TYPE(ha))
26763ce8866cSSaurav Kashyap mbx_reg = ®82->mailbox_in[0];
26773ce8866cSSaurav Kashyap else if (IS_FWI2_CAPABLE(ha))
26783ce8866cSSaurav Kashyap mbx_reg = ®24->mailbox0;
26793ce8866cSSaurav Kashyap else
26803ce8866cSSaurav Kashyap mbx_reg = MAILBOX_REG(ha, reg, 0);
26813ce8866cSSaurav Kashyap
26823ce8866cSSaurav Kashyap ql_dbg(level, vha, id, "Mailbox registers:\n");
2683343f7defSJoe Carnuccio for (i = 0; i < 6; i++, mbx_reg++)
26843ce8866cSSaurav Kashyap ql_dbg(level, vha, id,
268504474d3aSBart Van Assche "mbox[%d] %#04x\n", i, rd_reg_word(mbx_reg));
26863ce8866cSSaurav Kashyap }
26873ce8866cSSaurav Kashyap
26883ce8866cSSaurav Kashyap void
ql_dump_buffer(uint level,scsi_qla_host_t * vha,uint id,const void * buf,uint size)2689c254b52bSBart Van Assche ql_dump_buffer(uint level, scsi_qla_host_t *vha, uint id, const void *buf,
2690c254b52bSBart Van Assche uint size)
26913ce8866cSSaurav Kashyap {
2692a7ddd02bSJoe Carnuccio uint cnt;
2693cfb0919cSChad Dupuis
2694cfb0919cSChad Dupuis if (!ql_mask_match(level))
2695cfb0919cSChad Dupuis return;
26963ce8866cSSaurav Kashyap
2697a7ddd02bSJoe Carnuccio ql_dbg(level, vha, id,
2698a7ddd02bSJoe Carnuccio "%-+5d 0 1 2 3 4 5 6 7 8 9 A B C D E F\n", size);
2699a7ddd02bSJoe Carnuccio ql_dbg(level, vha, id,
2700a7ddd02bSJoe Carnuccio "----- -----------------------------------------------\n");
270123456565SJoe Perches for (cnt = 0; cnt < size; cnt += 16) {
270223456565SJoe Perches ql_dbg(level, vha, id, "%04x: ", cnt);
270323456565SJoe Perches print_hex_dump(KERN_CONT, "", DUMP_PREFIX_NONE, 16, 1,
270423456565SJoe Perches buf + cnt, min(16U, size - cnt), false);
27053ce8866cSSaurav Kashyap }
27063ce8866cSSaurav Kashyap }
270722d84726SQuinn Tran
270822d84726SQuinn Tran /*
270922d84726SQuinn Tran * This function is for formatting and logging debug information.
271022d84726SQuinn Tran * It is to be used when vha is available. It formats the message
271122d84726SQuinn Tran * and logs it to the messages file.
271222d84726SQuinn Tran * parameters:
271322d84726SQuinn Tran * level: The level of the debug messages to be printed.
271422d84726SQuinn Tran * If ql2xextended_error_logging value is correctly set,
271522d84726SQuinn Tran * this message will appear in the messages file.
271622d84726SQuinn Tran * vha: Pointer to the scsi_qla_host_t.
271722d84726SQuinn Tran * id: This is a unique identifier for the level. It identifies the
271822d84726SQuinn Tran * part of the code from where the message originated.
271922d84726SQuinn Tran * msg: The message to be displayed.
272022d84726SQuinn Tran */
272122d84726SQuinn Tran void
ql_dbg_qp(uint32_t level,struct qla_qpair * qpair,int32_t id,const char * fmt,...)272222d84726SQuinn Tran ql_dbg_qp(uint32_t level, struct qla_qpair *qpair, int32_t id,
272322d84726SQuinn Tran const char *fmt, ...)
272422d84726SQuinn Tran {
272522d84726SQuinn Tran va_list va;
272622d84726SQuinn Tran struct va_format vaf;
2727e7019c95SBart Van Assche char pbuf[128];
272822d84726SQuinn Tran
27298bfc149bSArun Easi ql_ktrace(1, level, pbuf, NULL, qpair ? qpair->vha : NULL, id, fmt);
27308bfc149bSArun Easi
273122d84726SQuinn Tran if (!ql_mask_match(level))
273222d84726SQuinn Tran return;
273322d84726SQuinn Tran
273422d84726SQuinn Tran va_start(va, fmt);
273522d84726SQuinn Tran
273622d84726SQuinn Tran vaf.fmt = fmt;
273722d84726SQuinn Tran vaf.va = &va;
273822d84726SQuinn Tran
27398bfc149bSArun Easi if (!pbuf[0]) /* set by ql_ktrace */
27408bfc149bSArun Easi ql_dbg_prefix(pbuf, ARRAY_SIZE(pbuf), NULL,
27418bfc149bSArun Easi qpair ? qpair->vha : NULL, id + ql_dbg_offset);
27428bfc149bSArun Easi
2743e7019c95SBart Van Assche pr_warn("%s%pV", pbuf, &vaf);
274422d84726SQuinn Tran
274522d84726SQuinn Tran va_end(va);
274622d84726SQuinn Tran
274722d84726SQuinn Tran }
2748