cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

qla_dbg.c (91107B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/*
      3 * QLogic Fibre Channel HBA Driver
      4 * Copyright (c)  2003-2014 QLogic Corporation
      5 */
      6
      7/*
      8 * Table for showing the current message id in use for particular level
      9 * Change this table for addition of log/debug messages.
     10 * ----------------------------------------------------------------------
     11 * |             Level            |   Last Value Used  |     Holes	|
     12 * ----------------------------------------------------------------------
     13 * | Module Init and Probe        |       0x0199       |                |
     14 * | Mailbox commands             |       0x1206       | 0x11a5-0x11ff	|
     15 * | Device Discovery             |       0x2134       | 0x210e-0x2115  |
     16 * |                              |                    | 0x211c-0x2128  |
     17 * |                              |                    | 0x212c-0x2134  |
     18 * | Queue Command and IO tracing |       0x3074       | 0x300b         |
     19 * |                              |                    | 0x3027-0x3028  |
     20 * |                              |                    | 0x303d-0x3041  |
     21 * |                              |                    | 0x302d,0x3033  |
     22 * |                              |                    | 0x3036,0x3038  |
     23 * |                              |                    | 0x303a		|
     24 * | DPC Thread                   |       0x4023       | 0x4002,0x4013  |
     25 * | Async Events                 |       0x509c       |                |
     26 * | Timer Routines               |       0x6012       |                |
     27 * | User Space Interactions      |       0x70e3       | 0x7018,0x702e  |
     28 * |				  |		       | 0x7020,0x7024  |
     29 * |                              |                    | 0x7039,0x7045  |
     30 * |                              |                    | 0x7073-0x7075  |
     31 * |                              |                    | 0x70a5-0x70a6  |
     32 * |                              |                    | 0x70a8,0x70ab  |
     33 * |                              |                    | 0x70ad-0x70ae  |
     34 * |                              |                    | 0x70d0-0x70d6	|
     35 * |                              |                    | 0x70d7-0x70db  |
     36 * | Task Management              |       0x8042       | 0x8000         |
     37 * |                              |                    | 0x8019         |
     38 * |                              |                    | 0x8025,0x8026  |
     39 * |                              |                    | 0x8031,0x8032  |
     40 * |                              |                    | 0x8039,0x803c  |
     41 * | AER/EEH                      |       0x9011       |		|
     42 * | Virtual Port                 |       0xa007       |		|
     43 * | ISP82XX Specific             |       0xb157       | 0xb002,0xb024  |
     44 * |                              |                    | 0xb09e,0xb0ae  |
     45 * |				  |		       | 0xb0c3,0xb0c6  |
     46 * |                              |                    | 0xb0e0-0xb0ef  |
     47 * |                              |                    | 0xb085,0xb0dc  |
     48 * |                              |                    | 0xb107,0xb108  |
     49 * |                              |                    | 0xb111,0xb11e  |
     50 * |                              |                    | 0xb12c,0xb12d  |
     51 * |                              |                    | 0xb13a,0xb142  |
     52 * |                              |                    | 0xb13c-0xb140  |
     53 * |                              |                    | 0xb149		|
     54 * | MultiQ                       |       0xc010       |		|
     55 * | Misc                         |       0xd303       | 0xd031-0xd0ff	|
     56 * |                              |                    | 0xd101-0xd1fe	|
     57 * |                              |                    | 0xd214-0xd2fe	|
     58 * | Target Mode		  |	  0xe081       |		|
     59 * | Target Mode Management	  |	  0xf09b       | 0xf002		|
     60 * |                              |                    | 0xf046-0xf049  |
     61 * | Target Mode Task Management  |	  0x1000d      |		|
     62 * ----------------------------------------------------------------------
     63 */
     64
     65#include "qla_def.h"
     66
     67#include <linux/delay.h>
     68#define CREATE_TRACE_POINTS
     69#include <trace/events/qla.h>
     70
     71static uint32_t ql_dbg_offset = 0x800;
     72
     73static inline void
     74qla2xxx_prep_dump(struct qla_hw_data *ha, struct qla2xxx_fw_dump *fw_dump)
     75{
     76	fw_dump->fw_major_version = htonl(ha->fw_major_version);
     77	fw_dump->fw_minor_version = htonl(ha->fw_minor_version);
     78	fw_dump->fw_subminor_version = htonl(ha->fw_subminor_version);
     79	fw_dump->fw_attributes = htonl(ha->fw_attributes);
     80
     81	fw_dump->vendor = htonl(ha->pdev->vendor);
     82	fw_dump->device = htonl(ha->pdev->device);
     83	fw_dump->subsystem_vendor = htonl(ha->pdev->subsystem_vendor);
     84	fw_dump->subsystem_device = htonl(ha->pdev->subsystem_device);
     85}
     86
     87static inline void *
     88qla2xxx_copy_queues(struct qla_hw_data *ha, void *ptr)
     89{
     90	struct req_que *req = ha->req_q_map[0];
     91	struct rsp_que *rsp = ha->rsp_q_map[0];
     92	/* Request queue. */
     93	memcpy(ptr, req->ring, req->length *
     94	    sizeof(request_t));
     95
     96	/* Response queue. */
     97	ptr += req->length * sizeof(request_t);
     98	memcpy(ptr, rsp->ring, rsp->length  *
     99	    sizeof(response_t));
    100
    101	return ptr + (rsp->length * sizeof(response_t));
    102}
    103
    104int
    105qla27xx_dump_mpi_ram(struct qla_hw_data *ha, uint32_t addr, uint32_t *ram,
    106	uint32_t ram_dwords, void **nxt)
    107{
    108	struct device_reg_24xx __iomem *reg = &ha->iobase->isp24;
    109	dma_addr_t dump_dma = ha->gid_list_dma;
    110	uint32_t *chunk = (uint32_t *)ha->gid_list;
    111	uint32_t dwords = qla2x00_gid_list_size(ha) / 4;
    112	uint32_t stat;
    113	ulong i, j, timer = 6000000;
    114	int rval = QLA_FUNCTION_FAILED;
    115	scsi_qla_host_t *vha = pci_get_drvdata(ha->pdev);
    116
    117	clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);
    118
    119	if (qla_pci_disconnected(vha, reg))
    120		return rval;
    121
    122	for (i = 0; i < ram_dwords; i += dwords, addr += dwords) {
    123		if (i + dwords > ram_dwords)
    124			dwords = ram_dwords - i;
    125
    126		wrt_reg_word(&reg->mailbox0, MBC_LOAD_DUMP_MPI_RAM);
    127		wrt_reg_word(&reg->mailbox1, LSW(addr));
    128		wrt_reg_word(&reg->mailbox8, MSW(addr));
    129
    130		wrt_reg_word(&reg->mailbox2, MSW(LSD(dump_dma)));
    131		wrt_reg_word(&reg->mailbox3, LSW(LSD(dump_dma)));
    132		wrt_reg_word(&reg->mailbox6, MSW(MSD(dump_dma)));
    133		wrt_reg_word(&reg->mailbox7, LSW(MSD(dump_dma)));
    134
    135		wrt_reg_word(&reg->mailbox4, MSW(dwords));
    136		wrt_reg_word(&reg->mailbox5, LSW(dwords));
    137
    138		wrt_reg_word(&reg->mailbox9, 0);
    139		wrt_reg_dword(&reg->hccr, HCCRX_SET_HOST_INT);
    140
    141		ha->flags.mbox_int = 0;
    142		while (timer--) {
    143			udelay(5);
    144
    145			if (qla_pci_disconnected(vha, reg))
    146				return rval;
    147
    148			stat = rd_reg_dword(&reg->host_status);
    149			/* Check for pending interrupts. */
    150			if (!(stat & HSRX_RISC_INT))
    151				continue;
    152
    153			stat &= 0xff;
    154			if (stat != 0x1 && stat != 0x2 &&
    155			    stat != 0x10 && stat != 0x11) {
    156
    157				/* Clear this intr; it wasn't a mailbox intr */
    158				wrt_reg_dword(&reg->hccr, HCCRX_CLR_RISC_INT);
    159				rd_reg_dword(&reg->hccr);
    160				continue;
    161			}
    162
    163			set_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);
    164			rval = rd_reg_word(&reg->mailbox0) & MBS_MASK;
    165			wrt_reg_dword(&reg->hccr, HCCRX_CLR_RISC_INT);
    166			rd_reg_dword(&reg->hccr);
    167			break;
    168		}
    169		ha->flags.mbox_int = 1;
    170		*nxt = ram + i;
    171
    172		if (!test_and_clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags)) {
    173			/* no interrupt, timed out*/
    174			return rval;
    175		}
    176		if (rval) {
    177			/* error completion status */
    178			return rval;
    179		}
    180		for (j = 0; j < dwords; j++) {
    181			ram[i + j] =
    182			    (IS_QLA27XX(ha) || IS_QLA28XX(ha)) ?
    183			    chunk[j] : swab32(chunk[j]);
    184		}
    185	}
    186
    187	*nxt = ram + i;
    188	return QLA_SUCCESS;
    189}
    190
    191int
    192qla24xx_dump_ram(struct qla_hw_data *ha, uint32_t addr, __be32 *ram,
    193		 uint32_t ram_dwords, void **nxt)
    194{
    195	int rval = QLA_FUNCTION_FAILED;
    196	struct device_reg_24xx __iomem *reg = &ha->iobase->isp24;
    197	dma_addr_t dump_dma = ha->gid_list_dma;
    198	uint32_t *chunk = (uint32_t *)ha->gid_list;
    199	uint32_t dwords = qla2x00_gid_list_size(ha) / 4;
    200	uint32_t stat;
    201	ulong i, j, timer = 6000000;
    202	scsi_qla_host_t *vha = pci_get_drvdata(ha->pdev);
    203
    204	clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);
    205
    206	if (qla_pci_disconnected(vha, reg))
    207		return rval;
    208
    209	for (i = 0; i < ram_dwords; i += dwords, addr += dwords) {
    210		if (i + dwords > ram_dwords)
    211			dwords = ram_dwords - i;
    212
    213		wrt_reg_word(&reg->mailbox0, MBC_DUMP_RISC_RAM_EXTENDED);
    214		wrt_reg_word(&reg->mailbox1, LSW(addr));
    215		wrt_reg_word(&reg->mailbox8, MSW(addr));
    216		wrt_reg_word(&reg->mailbox10, 0);
    217
    218		wrt_reg_word(&reg->mailbox2, MSW(LSD(dump_dma)));
    219		wrt_reg_word(&reg->mailbox3, LSW(LSD(dump_dma)));
    220		wrt_reg_word(&reg->mailbox6, MSW(MSD(dump_dma)));
    221		wrt_reg_word(&reg->mailbox7, LSW(MSD(dump_dma)));
    222
    223		wrt_reg_word(&reg->mailbox4, MSW(dwords));
    224		wrt_reg_word(&reg->mailbox5, LSW(dwords));
    225		wrt_reg_dword(&reg->hccr, HCCRX_SET_HOST_INT);
    226
    227		ha->flags.mbox_int = 0;
    228		while (timer--) {
    229			udelay(5);
    230			if (qla_pci_disconnected(vha, reg))
    231				return rval;
    232
    233			stat = rd_reg_dword(&reg->host_status);
    234			/* Check for pending interrupts. */
    235			if (!(stat & HSRX_RISC_INT))
    236				continue;
    237
    238			stat &= 0xff;
    239			if (stat != 0x1 && stat != 0x2 &&
    240			    stat != 0x10 && stat != 0x11) {
    241				wrt_reg_dword(&reg->hccr, HCCRX_CLR_RISC_INT);
    242				rd_reg_dword(&reg->hccr);
    243				continue;
    244			}
    245
    246			set_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);
    247			rval = rd_reg_word(&reg->mailbox0) & MBS_MASK;
    248			wrt_reg_dword(&reg->hccr, HCCRX_CLR_RISC_INT);
    249			rd_reg_dword(&reg->hccr);
    250			break;
    251		}
    252		ha->flags.mbox_int = 1;
    253		*nxt = ram + i;
    254
    255		if (!test_and_clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags)) {
    256			/* no interrupt, timed out*/
    257			return rval;
    258		}
    259		if (rval) {
    260			/* error completion status */
    261			return rval;
    262		}
    263		for (j = 0; j < dwords; j++) {
    264			ram[i + j] = (__force __be32)
    265				((IS_QLA27XX(ha) || IS_QLA28XX(ha)) ?
    266				 chunk[j] : swab32(chunk[j]));
    267		}
    268	}
    269
    270	*nxt = ram + i;
    271	return QLA_SUCCESS;
    272}
    273
    274static int
    275qla24xx_dump_memory(struct qla_hw_data *ha, __be32 *code_ram,
    276		    uint32_t cram_size, void **nxt)
    277{
    278	int rval;
    279
    280	/* Code RAM. */
    281	rval = qla24xx_dump_ram(ha, 0x20000, code_ram, cram_size / 4, nxt);
    282	if (rval != QLA_SUCCESS)
    283		return rval;
    284
    285	set_bit(RISC_SRAM_DUMP_CMPL, &ha->fw_dump_cap_flags);
    286
    287	/* External Memory. */
    288	rval = qla24xx_dump_ram(ha, 0x100000, *nxt,
    289	    ha->fw_memory_size - 0x100000 + 1, nxt);
    290	if (rval == QLA_SUCCESS)
    291		set_bit(RISC_EXT_MEM_DUMP_CMPL, &ha->fw_dump_cap_flags);
    292
    293	return rval;
    294}
    295
    296static __be32 *
    297qla24xx_read_window(struct device_reg_24xx __iomem *reg, uint32_t iobase,
    298		    uint32_t count, __be32 *buf)
    299{
    300	__le32 __iomem *dmp_reg;
    301
    302	wrt_reg_dword(&reg->iobase_addr, iobase);
    303	dmp_reg = &reg->iobase_window;
    304	for ( ; count--; dmp_reg++)
    305		*buf++ = htonl(rd_reg_dword(dmp_reg));
    306
    307	return buf;
    308}
    309
    310void
    311qla24xx_pause_risc(struct device_reg_24xx __iomem *reg, struct qla_hw_data *ha)
    312{
    313	wrt_reg_dword(&reg->hccr, HCCRX_SET_RISC_PAUSE);
    314
    315	/* 100 usec delay is sufficient enough for hardware to pause RISC */
    316	udelay(100);
    317	if (rd_reg_dword(&reg->host_status) & HSRX_RISC_PAUSED)
    318		set_bit(RISC_PAUSE_CMPL, &ha->fw_dump_cap_flags);
    319}
    320
    321int
    322qla24xx_soft_reset(struct qla_hw_data *ha)
    323{
    324	int rval = QLA_SUCCESS;
    325	uint32_t cnt;
    326	uint16_t wd;
    327	struct device_reg_24xx __iomem *reg = &ha->iobase->isp24;
    328
    329	/*
    330	 * Reset RISC. The delay is dependent on system architecture.
    331	 * Driver can proceed with the reset sequence after waiting
    332	 * for a timeout period.
    333	 */
    334	wrt_reg_dword(&reg->ctrl_status, CSRX_DMA_SHUTDOWN|MWB_4096_BYTES);
    335	for (cnt = 0; cnt < 30000; cnt++) {
    336		if ((rd_reg_dword(&reg->ctrl_status) & CSRX_DMA_ACTIVE) == 0)
    337			break;
    338
    339		udelay(10);
    340	}
    341	if (!(rd_reg_dword(&reg->ctrl_status) & CSRX_DMA_ACTIVE))
    342		set_bit(DMA_SHUTDOWN_CMPL, &ha->fw_dump_cap_flags);
    343
    344	wrt_reg_dword(&reg->ctrl_status,
    345	    CSRX_ISP_SOFT_RESET|CSRX_DMA_SHUTDOWN|MWB_4096_BYTES);
    346	pci_read_config_word(ha->pdev, PCI_COMMAND, &wd);
    347
    348	udelay(100);
    349
    350	/* Wait for soft-reset to complete. */
    351	for (cnt = 0; cnt < 30000; cnt++) {
    352		if ((rd_reg_dword(&reg->ctrl_status) &
    353		    CSRX_ISP_SOFT_RESET) == 0)
    354			break;
    355
    356		udelay(10);
    357	}
    358	if (!(rd_reg_dword(&reg->ctrl_status) & CSRX_ISP_SOFT_RESET))
    359		set_bit(ISP_RESET_CMPL, &ha->fw_dump_cap_flags);
    360
    361	wrt_reg_dword(&reg->hccr, HCCRX_CLR_RISC_RESET);
    362	rd_reg_dword(&reg->hccr);             /* PCI Posting. */
    363
    364	for (cnt = 10000; rd_reg_word(&reg->mailbox0) != 0 &&
    365	    rval == QLA_SUCCESS; cnt--) {
    366		if (cnt)
    367			udelay(10);
    368		else
    369			rval = QLA_FUNCTION_TIMEOUT;
    370	}
    371	if (rval == QLA_SUCCESS)
    372		set_bit(RISC_RDY_AFT_RESET, &ha->fw_dump_cap_flags);
    373
    374	return rval;
    375}
    376
    377static int
    378qla2xxx_dump_ram(struct qla_hw_data *ha, uint32_t addr, __be16 *ram,
    379    uint32_t ram_words, void **nxt)
    380{
    381	int rval;
    382	uint32_t cnt, stat, timer, words, idx;
    383	uint16_t mb0;
    384	struct device_reg_2xxx __iomem *reg = &ha->iobase->isp;
    385	dma_addr_t dump_dma = ha->gid_list_dma;
    386	__le16 *dump = (__force __le16 *)ha->gid_list;
    387
    388	rval = QLA_SUCCESS;
    389	mb0 = 0;
    390
    391	WRT_MAILBOX_REG(ha, reg, 0, MBC_DUMP_RISC_RAM_EXTENDED);
    392	clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);
    393
    394	words = qla2x00_gid_list_size(ha) / 2;
    395	for (cnt = 0; cnt < ram_words && rval == QLA_SUCCESS;
    396	    cnt += words, addr += words) {
    397		if (cnt + words > ram_words)
    398			words = ram_words - cnt;
    399
    400		WRT_MAILBOX_REG(ha, reg, 1, LSW(addr));
    401		WRT_MAILBOX_REG(ha, reg, 8, MSW(addr));
    402
    403		WRT_MAILBOX_REG(ha, reg, 2, MSW(dump_dma));
    404		WRT_MAILBOX_REG(ha, reg, 3, LSW(dump_dma));
    405		WRT_MAILBOX_REG(ha, reg, 6, MSW(MSD(dump_dma)));
    406		WRT_MAILBOX_REG(ha, reg, 7, LSW(MSD(dump_dma)));
    407
    408		WRT_MAILBOX_REG(ha, reg, 4, words);
    409		wrt_reg_word(&reg->hccr, HCCR_SET_HOST_INT);
    410
    411		for (timer = 6000000; timer; timer--) {
    412			/* Check for pending interrupts. */
    413			stat = rd_reg_dword(&reg->u.isp2300.host_status);
    414			if (stat & HSR_RISC_INT) {
    415				stat &= 0xff;
    416
    417				if (stat == 0x1 || stat == 0x2) {
    418					set_bit(MBX_INTERRUPT,
    419					    &ha->mbx_cmd_flags);
    420
    421					mb0 = RD_MAILBOX_REG(ha, reg, 0);
    422
    423					/* Release mailbox registers. */
    424					wrt_reg_word(&reg->semaphore, 0);
    425					wrt_reg_word(&reg->hccr,
    426					    HCCR_CLR_RISC_INT);
    427					rd_reg_word(&reg->hccr);
    428					break;
    429				} else if (stat == 0x10 || stat == 0x11) {
    430					set_bit(MBX_INTERRUPT,
    431					    &ha->mbx_cmd_flags);
    432
    433					mb0 = RD_MAILBOX_REG(ha, reg, 0);
    434
    435					wrt_reg_word(&reg->hccr,
    436					    HCCR_CLR_RISC_INT);
    437					rd_reg_word(&reg->hccr);
    438					break;
    439				}
    440
    441				/* clear this intr; it wasn't a mailbox intr */
    442				wrt_reg_word(&reg->hccr, HCCR_CLR_RISC_INT);
    443				rd_reg_word(&reg->hccr);
    444			}
    445			udelay(5);
    446		}
    447
    448		if (test_and_clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags)) {
    449			rval = mb0 & MBS_MASK;
    450			for (idx = 0; idx < words; idx++)
    451				ram[cnt + idx] =
    452					cpu_to_be16(le16_to_cpu(dump[idx]));
    453		} else {
    454			rval = QLA_FUNCTION_FAILED;
    455		}
    456	}
    457
    458	*nxt = rval == QLA_SUCCESS ? &ram[cnt] : NULL;
    459	return rval;
    460}
    461
    462static inline void
    463qla2xxx_read_window(struct device_reg_2xxx __iomem *reg, uint32_t count,
    464		    __be16 *buf)
    465{
    466	__le16 __iomem *dmp_reg = &reg->u.isp2300.fb_cmd;
    467
    468	for ( ; count--; dmp_reg++)
    469		*buf++ = htons(rd_reg_word(dmp_reg));
    470}
    471
    472static inline void *
    473qla24xx_copy_eft(struct qla_hw_data *ha, void *ptr)
    474{
    475	if (!ha->eft)
    476		return ptr;
    477
    478	memcpy(ptr, ha->eft, ntohl(ha->fw_dump->eft_size));
    479	return ptr + ntohl(ha->fw_dump->eft_size);
    480}
    481
    482static inline void *
    483qla25xx_copy_fce(struct qla_hw_data *ha, void *ptr, __be32 **last_chain)
    484{
    485	uint32_t cnt;
    486	__be32 *iter_reg;
    487	struct qla2xxx_fce_chain *fcec = ptr;
    488
    489	if (!ha->fce)
    490		return ptr;
    491
    492	*last_chain = &fcec->type;
    493	fcec->type = htonl(DUMP_CHAIN_FCE);
    494	fcec->chain_size = htonl(sizeof(struct qla2xxx_fce_chain) +
    495	    fce_calc_size(ha->fce_bufs));
    496	fcec->size = htonl(fce_calc_size(ha->fce_bufs));
    497	fcec->addr_l = htonl(LSD(ha->fce_dma));
    498	fcec->addr_h = htonl(MSD(ha->fce_dma));
    499
    500	iter_reg = fcec->eregs;
    501	for (cnt = 0; cnt < 8; cnt++)
    502		*iter_reg++ = htonl(ha->fce_mb[cnt]);
    503
    504	memcpy(iter_reg, ha->fce, ntohl(fcec->size));
    505
    506	return (char *)iter_reg + ntohl(fcec->size);
    507}
    508
    509static inline void *
    510qla25xx_copy_exlogin(struct qla_hw_data *ha, void *ptr, __be32 **last_chain)
    511{
    512	struct qla2xxx_offld_chain *c = ptr;
    513
    514	if (!ha->exlogin_buf)
    515		return ptr;
    516
    517	*last_chain = &c->type;
    518
    519	c->type = cpu_to_be32(DUMP_CHAIN_EXLOGIN);
    520	c->chain_size = cpu_to_be32(sizeof(struct qla2xxx_offld_chain) +
    521	    ha->exlogin_size);
    522	c->size = cpu_to_be32(ha->exlogin_size);
    523	c->addr = cpu_to_be64(ha->exlogin_buf_dma);
    524
    525	ptr += sizeof(struct qla2xxx_offld_chain);
    526	memcpy(ptr, ha->exlogin_buf, ha->exlogin_size);
    527
    528	return (char *)ptr + be32_to_cpu(c->size);
    529}
    530
    531static inline void *
    532qla81xx_copy_exchoffld(struct qla_hw_data *ha, void *ptr, __be32 **last_chain)
    533{
    534	struct qla2xxx_offld_chain *c = ptr;
    535
    536	if (!ha->exchoffld_buf)
    537		return ptr;
    538
    539	*last_chain = &c->type;
    540
    541	c->type = cpu_to_be32(DUMP_CHAIN_EXCHG);
    542	c->chain_size = cpu_to_be32(sizeof(struct qla2xxx_offld_chain) +
    543	    ha->exchoffld_size);
    544	c->size = cpu_to_be32(ha->exchoffld_size);
    545	c->addr = cpu_to_be64(ha->exchoffld_buf_dma);
    546
    547	ptr += sizeof(struct qla2xxx_offld_chain);
    548	memcpy(ptr, ha->exchoffld_buf, ha->exchoffld_size);
    549
    550	return (char *)ptr + be32_to_cpu(c->size);
    551}
    552
    553static inline void *
    554qla2xxx_copy_atioqueues(struct qla_hw_data *ha, void *ptr,
    555			__be32 **last_chain)
    556{
    557	struct qla2xxx_mqueue_chain *q;
    558	struct qla2xxx_mqueue_header *qh;
    559	uint32_t num_queues;
    560	int que;
    561	struct {
    562		int length;
    563		void *ring;
    564	} aq, *aqp;
    565
    566	if (!ha->tgt.atio_ring)
    567		return ptr;
    568
    569	num_queues = 1;
    570	aqp = &aq;
    571	aqp->length = ha->tgt.atio_q_length;
    572	aqp->ring = ha->tgt.atio_ring;
    573
    574	for (que = 0; que < num_queues; que++) {
    575		/* aqp = ha->atio_q_map[que]; */
    576		q = ptr;
    577		*last_chain = &q->type;
    578		q->type = htonl(DUMP_CHAIN_QUEUE);
    579		q->chain_size = htonl(
    580		    sizeof(struct qla2xxx_mqueue_chain) +
    581		    sizeof(struct qla2xxx_mqueue_header) +
    582		    (aqp->length * sizeof(request_t)));
    583		ptr += sizeof(struct qla2xxx_mqueue_chain);
    584
    585		/* Add header. */
    586		qh = ptr;
    587		qh->queue = htonl(TYPE_ATIO_QUEUE);
    588		qh->number = htonl(que);
    589		qh->size = htonl(aqp->length * sizeof(request_t));
    590		ptr += sizeof(struct qla2xxx_mqueue_header);
    591
    592		/* Add data. */
    593		memcpy(ptr, aqp->ring, aqp->length * sizeof(request_t));
    594
    595		ptr += aqp->length * sizeof(request_t);
    596	}
    597
    598	return ptr;
    599}
    600
    601static inline void *
    602qla25xx_copy_mqueues(struct qla_hw_data *ha, void *ptr, __be32 **last_chain)
    603{
    604	struct qla2xxx_mqueue_chain *q;
    605	struct qla2xxx_mqueue_header *qh;
    606	struct req_que *req;
    607	struct rsp_que *rsp;
    608	int que;
    609
    610	if (!ha->mqenable)
    611		return ptr;
    612
    613	/* Request queues */
    614	for (que = 1; que < ha->max_req_queues; que++) {
    615		req = ha->req_q_map[que];
    616		if (!req)
    617			break;
    618
    619		/* Add chain. */
    620		q = ptr;
    621		*last_chain = &q->type;
    622		q->type = htonl(DUMP_CHAIN_QUEUE);
    623		q->chain_size = htonl(
    624		    sizeof(struct qla2xxx_mqueue_chain) +
    625		    sizeof(struct qla2xxx_mqueue_header) +
    626		    (req->length * sizeof(request_t)));
    627		ptr += sizeof(struct qla2xxx_mqueue_chain);
    628
    629		/* Add header. */
    630		qh = ptr;
    631		qh->queue = htonl(TYPE_REQUEST_QUEUE);
    632		qh->number = htonl(que);
    633		qh->size = htonl(req->length * sizeof(request_t));
    634		ptr += sizeof(struct qla2xxx_mqueue_header);
    635
    636		/* Add data. */
    637		memcpy(ptr, req->ring, req->length * sizeof(request_t));
    638		ptr += req->length * sizeof(request_t);
    639	}
    640
    641	/* Response queues */
    642	for (que = 1; que < ha->max_rsp_queues; que++) {
    643		rsp = ha->rsp_q_map[que];
    644		if (!rsp)
    645			break;
    646
    647		/* Add chain. */
    648		q = ptr;
    649		*last_chain = &q->type;
    650		q->type = htonl(DUMP_CHAIN_QUEUE);
    651		q->chain_size = htonl(
    652		    sizeof(struct qla2xxx_mqueue_chain) +
    653		    sizeof(struct qla2xxx_mqueue_header) +
    654		    (rsp->length * sizeof(response_t)));
    655		ptr += sizeof(struct qla2xxx_mqueue_chain);
    656
    657		/* Add header. */
    658		qh = ptr;
    659		qh->queue = htonl(TYPE_RESPONSE_QUEUE);
    660		qh->number = htonl(que);
    661		qh->size = htonl(rsp->length * sizeof(response_t));
    662		ptr += sizeof(struct qla2xxx_mqueue_header);
    663
    664		/* Add data. */
    665		memcpy(ptr, rsp->ring, rsp->length * sizeof(response_t));
    666		ptr += rsp->length * sizeof(response_t);
    667	}
    668
    669	return ptr;
    670}
    671
    672static inline void *
    673qla25xx_copy_mq(struct qla_hw_data *ha, void *ptr, __be32 **last_chain)
    674{
    675	uint32_t cnt, que_idx;
    676	uint8_t que_cnt;
    677	struct qla2xxx_mq_chain *mq = ptr;
    678	device_reg_t *reg;
    679
    680	if (!ha->mqenable || IS_QLA83XX(ha) || IS_QLA27XX(ha) ||
    681	    IS_QLA28XX(ha))
    682		return ptr;
    683
    684	mq = ptr;
    685	*last_chain = &mq->type;
    686	mq->type = htonl(DUMP_CHAIN_MQ);
    687	mq->chain_size = htonl(sizeof(struct qla2xxx_mq_chain));
    688
    689	que_cnt = ha->max_req_queues > ha->max_rsp_queues ?
    690		ha->max_req_queues : ha->max_rsp_queues;
    691	mq->count = htonl(que_cnt);
    692	for (cnt = 0; cnt < que_cnt; cnt++) {
    693		reg = ISP_QUE_REG(ha, cnt);
    694		que_idx = cnt * 4;
    695		mq->qregs[que_idx] =
    696		    htonl(rd_reg_dword(&reg->isp25mq.req_q_in));
    697		mq->qregs[que_idx+1] =
    698		    htonl(rd_reg_dword(&reg->isp25mq.req_q_out));
    699		mq->qregs[que_idx+2] =
    700		    htonl(rd_reg_dword(&reg->isp25mq.rsp_q_in));
    701		mq->qregs[que_idx+3] =
    702		    htonl(rd_reg_dword(&reg->isp25mq.rsp_q_out));
    703	}
    704
    705	return ptr + sizeof(struct qla2xxx_mq_chain);
    706}
    707
    708void
    709qla2xxx_dump_post_process(scsi_qla_host_t *vha, int rval)
    710{
    711	struct qla_hw_data *ha = vha->hw;
    712
    713	if (rval != QLA_SUCCESS) {
    714		ql_log(ql_log_warn, vha, 0xd000,
    715		    "Failed to dump firmware (%x), dump status flags (0x%lx).\n",
    716		    rval, ha->fw_dump_cap_flags);
    717		ha->fw_dumped = false;
    718	} else {
    719		ql_log(ql_log_info, vha, 0xd001,
    720		    "Firmware dump saved to temp buffer (%ld/%p), dump status flags (0x%lx).\n",
    721		    vha->host_no, ha->fw_dump, ha->fw_dump_cap_flags);
    722		ha->fw_dumped = true;
    723		qla2x00_post_uevent_work(vha, QLA_UEVENT_CODE_FW_DUMP);
    724	}
    725}
    726
    727void qla2xxx_dump_fw(scsi_qla_host_t *vha)
    728{
    729	unsigned long flags;
    730
    731	spin_lock_irqsave(&vha->hw->hardware_lock, flags);
    732	vha->hw->isp_ops->fw_dump(vha);
    733	spin_unlock_irqrestore(&vha->hw->hardware_lock, flags);
    734}
    735
    736/**
    737 * qla2300_fw_dump() - Dumps binary data from the 2300 firmware.
    738 * @vha: HA context
    739 */
    740void
    741qla2300_fw_dump(scsi_qla_host_t *vha)
    742{
    743	int		rval;
    744	uint32_t	cnt;
    745	struct qla_hw_data *ha = vha->hw;
    746	struct device_reg_2xxx __iomem *reg = &ha->iobase->isp;
    747	__le16 __iomem *dmp_reg;
    748	struct qla2300_fw_dump	*fw;
    749	void		*nxt;
    750	struct scsi_qla_host *base_vha = pci_get_drvdata(ha->pdev);
    751
    752	lockdep_assert_held(&ha->hardware_lock);
    753
    754	if (!ha->fw_dump) {
    755		ql_log(ql_log_warn, vha, 0xd002,
    756		    "No buffer available for dump.\n");
    757		return;
    758	}
    759
    760	if (ha->fw_dumped) {
    761		ql_log(ql_log_warn, vha, 0xd003,
    762		    "Firmware has been previously dumped (%p) "
    763		    "-- ignoring request.\n",
    764		    ha->fw_dump);
    765		return;
    766	}
    767	fw = &ha->fw_dump->isp.isp23;
    768	qla2xxx_prep_dump(ha, ha->fw_dump);
    769
    770	rval = QLA_SUCCESS;
    771	fw->hccr = htons(rd_reg_word(&reg->hccr));
    772
    773	/* Pause RISC. */
    774	wrt_reg_word(&reg->hccr, HCCR_PAUSE_RISC);
    775	if (IS_QLA2300(ha)) {
    776		for (cnt = 30000;
    777		    (rd_reg_word(&reg->hccr) & HCCR_RISC_PAUSE) == 0 &&
    778			rval == QLA_SUCCESS; cnt--) {
    779			if (cnt)
    780				udelay(100);
    781			else
    782				rval = QLA_FUNCTION_TIMEOUT;
    783		}
    784	} else {
    785		rd_reg_word(&reg->hccr);		/* PCI Posting. */
    786		udelay(10);
    787	}
    788
    789	if (rval == QLA_SUCCESS) {
    790		dmp_reg = &reg->flash_address;
    791		for (cnt = 0; cnt < ARRAY_SIZE(fw->pbiu_reg); cnt++, dmp_reg++)
    792			fw->pbiu_reg[cnt] = htons(rd_reg_word(dmp_reg));
    793
    794		dmp_reg = &reg->u.isp2300.req_q_in;
    795		for (cnt = 0; cnt < ARRAY_SIZE(fw->risc_host_reg);
    796		    cnt++, dmp_reg++)
    797			fw->risc_host_reg[cnt] = htons(rd_reg_word(dmp_reg));
    798
    799		dmp_reg = &reg->u.isp2300.mailbox0;
    800		for (cnt = 0; cnt < ARRAY_SIZE(fw->mailbox_reg);
    801		    cnt++, dmp_reg++)
    802			fw->mailbox_reg[cnt] = htons(rd_reg_word(dmp_reg));
    803
    804		wrt_reg_word(&reg->ctrl_status, 0x40);
    805		qla2xxx_read_window(reg, 32, fw->resp_dma_reg);
    806
    807		wrt_reg_word(&reg->ctrl_status, 0x50);
    808		qla2xxx_read_window(reg, 48, fw->dma_reg);
    809
    810		wrt_reg_word(&reg->ctrl_status, 0x00);
    811		dmp_reg = &reg->risc_hw;
    812		for (cnt = 0; cnt < ARRAY_SIZE(fw->risc_hdw_reg);
    813		    cnt++, dmp_reg++)
    814			fw->risc_hdw_reg[cnt] = htons(rd_reg_word(dmp_reg));
    815
    816		wrt_reg_word(&reg->pcr, 0x2000);
    817		qla2xxx_read_window(reg, 16, fw->risc_gp0_reg);
    818
    819		wrt_reg_word(&reg->pcr, 0x2200);
    820		qla2xxx_read_window(reg, 16, fw->risc_gp1_reg);
    821
    822		wrt_reg_word(&reg->pcr, 0x2400);
    823		qla2xxx_read_window(reg, 16, fw->risc_gp2_reg);
    824
    825		wrt_reg_word(&reg->pcr, 0x2600);
    826		qla2xxx_read_window(reg, 16, fw->risc_gp3_reg);
    827
    828		wrt_reg_word(&reg->pcr, 0x2800);
    829		qla2xxx_read_window(reg, 16, fw->risc_gp4_reg);
    830
    831		wrt_reg_word(&reg->pcr, 0x2A00);
    832		qla2xxx_read_window(reg, 16, fw->risc_gp5_reg);
    833
    834		wrt_reg_word(&reg->pcr, 0x2C00);
    835		qla2xxx_read_window(reg, 16, fw->risc_gp6_reg);
    836
    837		wrt_reg_word(&reg->pcr, 0x2E00);
    838		qla2xxx_read_window(reg, 16, fw->risc_gp7_reg);
    839
    840		wrt_reg_word(&reg->ctrl_status, 0x10);
    841		qla2xxx_read_window(reg, 64, fw->frame_buf_hdw_reg);
    842
    843		wrt_reg_word(&reg->ctrl_status, 0x20);
    844		qla2xxx_read_window(reg, 64, fw->fpm_b0_reg);
    845
    846		wrt_reg_word(&reg->ctrl_status, 0x30);
    847		qla2xxx_read_window(reg, 64, fw->fpm_b1_reg);
    848
    849		/* Reset RISC. */
    850		wrt_reg_word(&reg->ctrl_status, CSR_ISP_SOFT_RESET);
    851		for (cnt = 0; cnt < 30000; cnt++) {
    852			if ((rd_reg_word(&reg->ctrl_status) &
    853			    CSR_ISP_SOFT_RESET) == 0)
    854				break;
    855
    856			udelay(10);
    857		}
    858	}
    859
    860	if (!IS_QLA2300(ha)) {
    861		for (cnt = 30000; RD_MAILBOX_REG(ha, reg, 0) != 0 &&
    862		    rval == QLA_SUCCESS; cnt--) {
    863			if (cnt)
    864				udelay(100);
    865			else
    866				rval = QLA_FUNCTION_TIMEOUT;
    867		}
    868	}
    869
    870	/* Get RISC SRAM. */
    871	if (rval == QLA_SUCCESS)
    872		rval = qla2xxx_dump_ram(ha, 0x800, fw->risc_ram,
    873					ARRAY_SIZE(fw->risc_ram), &nxt);
    874
    875	/* Get stack SRAM. */
    876	if (rval == QLA_SUCCESS)
    877		rval = qla2xxx_dump_ram(ha, 0x10000, fw->stack_ram,
    878					ARRAY_SIZE(fw->stack_ram), &nxt);
    879
    880	/* Get data SRAM. */
    881	if (rval == QLA_SUCCESS)
    882		rval = qla2xxx_dump_ram(ha, 0x11000, fw->data_ram,
    883		    ha->fw_memory_size - 0x11000 + 1, &nxt);
    884
    885	if (rval == QLA_SUCCESS)
    886		qla2xxx_copy_queues(ha, nxt);
    887
    888	qla2xxx_dump_post_process(base_vha, rval);
    889}
    890
    891/**
    892 * qla2100_fw_dump() - Dumps binary data from the 2100/2200 firmware.
    893 * @vha: HA context
    894 */
    895void
    896qla2100_fw_dump(scsi_qla_host_t *vha)
    897{
    898	int		rval;
    899	uint32_t	cnt, timer;
    900	uint16_t	risc_address = 0;
    901	uint16_t	mb0 = 0, mb2 = 0;
    902	struct qla_hw_data *ha = vha->hw;
    903	struct device_reg_2xxx __iomem *reg = &ha->iobase->isp;
    904	__le16 __iomem *dmp_reg;
    905	struct qla2100_fw_dump	*fw;
    906	struct scsi_qla_host *base_vha = pci_get_drvdata(ha->pdev);
    907
    908	lockdep_assert_held(&ha->hardware_lock);
    909
    910	if (!ha->fw_dump) {
    911		ql_log(ql_log_warn, vha, 0xd004,
    912		    "No buffer available for dump.\n");
    913		return;
    914	}
    915
    916	if (ha->fw_dumped) {
    917		ql_log(ql_log_warn, vha, 0xd005,
    918		    "Firmware has been previously dumped (%p) "
    919		    "-- ignoring request.\n",
    920		    ha->fw_dump);
    921		return;
    922	}
    923	fw = &ha->fw_dump->isp.isp21;
    924	qla2xxx_prep_dump(ha, ha->fw_dump);
    925
    926	rval = QLA_SUCCESS;
    927	fw->hccr = htons(rd_reg_word(&reg->hccr));
    928
    929	/* Pause RISC. */
    930	wrt_reg_word(&reg->hccr, HCCR_PAUSE_RISC);
    931	for (cnt = 30000; (rd_reg_word(&reg->hccr) & HCCR_RISC_PAUSE) == 0 &&
    932	    rval == QLA_SUCCESS; cnt--) {
    933		if (cnt)
    934			udelay(100);
    935		else
    936			rval = QLA_FUNCTION_TIMEOUT;
    937	}
    938	if (rval == QLA_SUCCESS) {
    939		dmp_reg = &reg->flash_address;
    940		for (cnt = 0; cnt < ARRAY_SIZE(fw->pbiu_reg); cnt++, dmp_reg++)
    941			fw->pbiu_reg[cnt] = htons(rd_reg_word(dmp_reg));
    942
    943		dmp_reg = &reg->u.isp2100.mailbox0;
    944		for (cnt = 0; cnt < ha->mbx_count; cnt++, dmp_reg++) {
    945			if (cnt == 8)
    946				dmp_reg = &reg->u_end.isp2200.mailbox8;
    947
    948			fw->mailbox_reg[cnt] = htons(rd_reg_word(dmp_reg));
    949		}
    950
    951		dmp_reg = &reg->u.isp2100.unused_2[0];
    952		for (cnt = 0; cnt < ARRAY_SIZE(fw->dma_reg); cnt++, dmp_reg++)
    953			fw->dma_reg[cnt] = htons(rd_reg_word(dmp_reg));
    954
    955		wrt_reg_word(&reg->ctrl_status, 0x00);
    956		dmp_reg = &reg->risc_hw;
    957		for (cnt = 0; cnt < ARRAY_SIZE(fw->risc_hdw_reg); cnt++, dmp_reg++)
    958			fw->risc_hdw_reg[cnt] = htons(rd_reg_word(dmp_reg));
    959
    960		wrt_reg_word(&reg->pcr, 0x2000);
    961		qla2xxx_read_window(reg, 16, fw->risc_gp0_reg);
    962
    963		wrt_reg_word(&reg->pcr, 0x2100);
    964		qla2xxx_read_window(reg, 16, fw->risc_gp1_reg);
    965
    966		wrt_reg_word(&reg->pcr, 0x2200);
    967		qla2xxx_read_window(reg, 16, fw->risc_gp2_reg);
    968
    969		wrt_reg_word(&reg->pcr, 0x2300);
    970		qla2xxx_read_window(reg, 16, fw->risc_gp3_reg);
    971
    972		wrt_reg_word(&reg->pcr, 0x2400);
    973		qla2xxx_read_window(reg, 16, fw->risc_gp4_reg);
    974
    975		wrt_reg_word(&reg->pcr, 0x2500);
    976		qla2xxx_read_window(reg, 16, fw->risc_gp5_reg);
    977
    978		wrt_reg_word(&reg->pcr, 0x2600);
    979		qla2xxx_read_window(reg, 16, fw->risc_gp6_reg);
    980
    981		wrt_reg_word(&reg->pcr, 0x2700);
    982		qla2xxx_read_window(reg, 16, fw->risc_gp7_reg);
    983
    984		wrt_reg_word(&reg->ctrl_status, 0x10);
    985		qla2xxx_read_window(reg, 16, fw->frame_buf_hdw_reg);
    986
    987		wrt_reg_word(&reg->ctrl_status, 0x20);
    988		qla2xxx_read_window(reg, 64, fw->fpm_b0_reg);
    989
    990		wrt_reg_word(&reg->ctrl_status, 0x30);
    991		qla2xxx_read_window(reg, 64, fw->fpm_b1_reg);
    992
    993		/* Reset the ISP. */
    994		wrt_reg_word(&reg->ctrl_status, CSR_ISP_SOFT_RESET);
    995	}
    996
    997	for (cnt = 30000; RD_MAILBOX_REG(ha, reg, 0) != 0 &&
    998	    rval == QLA_SUCCESS; cnt--) {
    999		if (cnt)
   1000			udelay(100);
   1001		else
   1002			rval = QLA_FUNCTION_TIMEOUT;
   1003	}
   1004
   1005	/* Pause RISC. */
   1006	if (rval == QLA_SUCCESS && (IS_QLA2200(ha) || (IS_QLA2100(ha) &&
   1007	    (rd_reg_word(&reg->mctr) & (BIT_1 | BIT_0)) != 0))) {
   1008
   1009		wrt_reg_word(&reg->hccr, HCCR_PAUSE_RISC);
   1010		for (cnt = 30000;
   1011		    (rd_reg_word(&reg->hccr) & HCCR_RISC_PAUSE) == 0 &&
   1012		    rval == QLA_SUCCESS; cnt--) {
   1013			if (cnt)
   1014				udelay(100);
   1015			else
   1016				rval = QLA_FUNCTION_TIMEOUT;
   1017		}
   1018		if (rval == QLA_SUCCESS) {
   1019			/* Set memory configuration and timing. */
   1020			if (IS_QLA2100(ha))
   1021				wrt_reg_word(&reg->mctr, 0xf1);
   1022			else
   1023				wrt_reg_word(&reg->mctr, 0xf2);
   1024			rd_reg_word(&reg->mctr);	/* PCI Posting. */
   1025
   1026			/* Release RISC. */
   1027			wrt_reg_word(&reg->hccr, HCCR_RELEASE_RISC);
   1028		}
   1029	}
   1030
   1031	if (rval == QLA_SUCCESS) {
   1032		/* Get RISC SRAM. */
   1033		risc_address = 0x1000;
   1034 		WRT_MAILBOX_REG(ha, reg, 0, MBC_READ_RAM_WORD);
   1035		clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);
   1036	}
   1037	for (cnt = 0; cnt < ARRAY_SIZE(fw->risc_ram) && rval == QLA_SUCCESS;
   1038	    cnt++, risc_address++) {
   1039 		WRT_MAILBOX_REG(ha, reg, 1, risc_address);
   1040		wrt_reg_word(&reg->hccr, HCCR_SET_HOST_INT);
   1041
   1042		for (timer = 6000000; timer != 0; timer--) {
   1043			/* Check for pending interrupts. */
   1044			if (rd_reg_word(&reg->istatus) & ISR_RISC_INT) {
   1045				if (rd_reg_word(&reg->semaphore) & BIT_0) {
   1046					set_bit(MBX_INTERRUPT,
   1047					    &ha->mbx_cmd_flags);
   1048
   1049					mb0 = RD_MAILBOX_REG(ha, reg, 0);
   1050					mb2 = RD_MAILBOX_REG(ha, reg, 2);
   1051
   1052					wrt_reg_word(&reg->semaphore, 0);
   1053					wrt_reg_word(&reg->hccr,
   1054					    HCCR_CLR_RISC_INT);
   1055					rd_reg_word(&reg->hccr);
   1056					break;
   1057				}
   1058				wrt_reg_word(&reg->hccr, HCCR_CLR_RISC_INT);
   1059				rd_reg_word(&reg->hccr);
   1060			}
   1061			udelay(5);
   1062		}
   1063
   1064		if (test_and_clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags)) {
   1065			rval = mb0 & MBS_MASK;
   1066			fw->risc_ram[cnt] = htons(mb2);
   1067		} else {
   1068			rval = QLA_FUNCTION_FAILED;
   1069		}
   1070	}
   1071
   1072	if (rval == QLA_SUCCESS)
   1073		qla2xxx_copy_queues(ha, &fw->queue_dump[0]);
   1074
   1075	qla2xxx_dump_post_process(base_vha, rval);
   1076}
   1077
   1078void
   1079qla24xx_fw_dump(scsi_qla_host_t *vha)
   1080{
   1081	int		rval;
   1082	uint32_t	cnt;
   1083	struct qla_hw_data *ha = vha->hw;
   1084	struct device_reg_24xx __iomem *reg = &ha->iobase->isp24;
   1085	__le32 __iomem *dmp_reg;
   1086	__be32		*iter_reg;
   1087	__le16 __iomem *mbx_reg;
   1088	struct qla24xx_fw_dump *fw;
   1089	void		*nxt;
   1090	void		*nxt_chain;
   1091	__be32		*last_chain = NULL;
   1092	struct scsi_qla_host *base_vha = pci_get_drvdata(ha->pdev);
   1093
   1094	lockdep_assert_held(&ha->hardware_lock);
   1095
   1096	if (IS_P3P_TYPE(ha))
   1097		return;
   1098
   1099	ha->fw_dump_cap_flags = 0;
   1100
   1101	if (!ha->fw_dump) {
   1102		ql_log(ql_log_warn, vha, 0xd006,
   1103		    "No buffer available for dump.\n");
   1104		return;
   1105	}
   1106
   1107	if (ha->fw_dumped) {
   1108		ql_log(ql_log_warn, vha, 0xd007,
   1109		    "Firmware has been previously dumped (%p) "
   1110		    "-- ignoring request.\n",
   1111		    ha->fw_dump);
   1112		return;
   1113	}
   1114	QLA_FW_STOPPED(ha);
   1115	fw = &ha->fw_dump->isp.isp24;
   1116	qla2xxx_prep_dump(ha, ha->fw_dump);
   1117
   1118	fw->host_status = htonl(rd_reg_dword(&reg->host_status));
   1119
   1120	/*
   1121	 * Pause RISC. No need to track timeout, as resetting the chip
   1122	 * is the right approach incase of pause timeout
   1123	 */
   1124	qla24xx_pause_risc(reg, ha);
   1125
   1126	/* Host interface registers. */
   1127	dmp_reg = &reg->flash_addr;
   1128	for (cnt = 0; cnt < ARRAY_SIZE(fw->host_reg); cnt++, dmp_reg++)
   1129		fw->host_reg[cnt] = htonl(rd_reg_dword(dmp_reg));
   1130
   1131	/* Disable interrupts. */
   1132	wrt_reg_dword(&reg->ictrl, 0);
   1133	rd_reg_dword(&reg->ictrl);
   1134
   1135	/* Shadow registers. */
   1136	wrt_reg_dword(&reg->iobase_addr, 0x0F70);
   1137	rd_reg_dword(&reg->iobase_addr);
   1138	wrt_reg_dword(&reg->iobase_select, 0xB0000000);
   1139	fw->shadow_reg[0] = htonl(rd_reg_dword(&reg->iobase_sdata));
   1140
   1141	wrt_reg_dword(&reg->iobase_select, 0xB0100000);
   1142	fw->shadow_reg[1] = htonl(rd_reg_dword(&reg->iobase_sdata));
   1143
   1144	wrt_reg_dword(&reg->iobase_select, 0xB0200000);
   1145	fw->shadow_reg[2] = htonl(rd_reg_dword(&reg->iobase_sdata));
   1146
   1147	wrt_reg_dword(&reg->iobase_select, 0xB0300000);
   1148	fw->shadow_reg[3] = htonl(rd_reg_dword(&reg->iobase_sdata));
   1149
   1150	wrt_reg_dword(&reg->iobase_select, 0xB0400000);
   1151	fw->shadow_reg[4] = htonl(rd_reg_dword(&reg->iobase_sdata));
   1152
   1153	wrt_reg_dword(&reg->iobase_select, 0xB0500000);
   1154	fw->shadow_reg[5] = htonl(rd_reg_dword(&reg->iobase_sdata));
   1155
   1156	wrt_reg_dword(&reg->iobase_select, 0xB0600000);
   1157	fw->shadow_reg[6] = htonl(rd_reg_dword(&reg->iobase_sdata));
   1158
   1159	/* Mailbox registers. */
   1160	mbx_reg = &reg->mailbox0;
   1161	for (cnt = 0; cnt < ARRAY_SIZE(fw->mailbox_reg); cnt++, mbx_reg++)
   1162		fw->mailbox_reg[cnt] = htons(rd_reg_word(mbx_reg));
   1163
   1164	/* Transfer sequence registers. */
   1165	iter_reg = fw->xseq_gp_reg;
   1166	iter_reg = qla24xx_read_window(reg, 0xBF00, 16, iter_reg);
   1167	iter_reg = qla24xx_read_window(reg, 0xBF10, 16, iter_reg);
   1168	iter_reg = qla24xx_read_window(reg, 0xBF20, 16, iter_reg);
   1169	iter_reg = qla24xx_read_window(reg, 0xBF30, 16, iter_reg);
   1170	iter_reg = qla24xx_read_window(reg, 0xBF40, 16, iter_reg);
   1171	iter_reg = qla24xx_read_window(reg, 0xBF50, 16, iter_reg);
   1172	iter_reg = qla24xx_read_window(reg, 0xBF60, 16, iter_reg);
   1173	qla24xx_read_window(reg, 0xBF70, 16, iter_reg);
   1174
   1175	qla24xx_read_window(reg, 0xBFE0, 16, fw->xseq_0_reg);
   1176	qla24xx_read_window(reg, 0xBFF0, 16, fw->xseq_1_reg);
   1177
   1178	/* Receive sequence registers. */
   1179	iter_reg = fw->rseq_gp_reg;
   1180	iter_reg = qla24xx_read_window(reg, 0xFF00, 16, iter_reg);
   1181	iter_reg = qla24xx_read_window(reg, 0xFF10, 16, iter_reg);
   1182	iter_reg = qla24xx_read_window(reg, 0xFF20, 16, iter_reg);
   1183	iter_reg = qla24xx_read_window(reg, 0xFF30, 16, iter_reg);
   1184	iter_reg = qla24xx_read_window(reg, 0xFF40, 16, iter_reg);
   1185	iter_reg = qla24xx_read_window(reg, 0xFF50, 16, iter_reg);
   1186	iter_reg = qla24xx_read_window(reg, 0xFF60, 16, iter_reg);
   1187	qla24xx_read_window(reg, 0xFF70, 16, iter_reg);
   1188
   1189	qla24xx_read_window(reg, 0xFFD0, 16, fw->rseq_0_reg);
   1190	qla24xx_read_window(reg, 0xFFE0, 16, fw->rseq_1_reg);
   1191	qla24xx_read_window(reg, 0xFFF0, 16, fw->rseq_2_reg);
   1192
   1193	/* Command DMA registers. */
   1194	qla24xx_read_window(reg, 0x7100, 16, fw->cmd_dma_reg);
   1195
   1196	/* Queues. */
   1197	iter_reg = fw->req0_dma_reg;
   1198	iter_reg = qla24xx_read_window(reg, 0x7200, 8, iter_reg);
   1199	dmp_reg = &reg->iobase_q;
   1200	for (cnt = 0; cnt < 7; cnt++, dmp_reg++)
   1201		*iter_reg++ = htonl(rd_reg_dword(dmp_reg));
   1202
   1203	iter_reg = fw->resp0_dma_reg;
   1204	iter_reg = qla24xx_read_window(reg, 0x7300, 8, iter_reg);
   1205	dmp_reg = &reg->iobase_q;
   1206	for (cnt = 0; cnt < 7; cnt++, dmp_reg++)
   1207		*iter_reg++ = htonl(rd_reg_dword(dmp_reg));
   1208
   1209	iter_reg = fw->req1_dma_reg;
   1210	iter_reg = qla24xx_read_window(reg, 0x7400, 8, iter_reg);
   1211	dmp_reg = &reg->iobase_q;
   1212	for (cnt = 0; cnt < 7; cnt++, dmp_reg++)
   1213		*iter_reg++ = htonl(rd_reg_dword(dmp_reg));
   1214
   1215	/* Transmit DMA registers. */
   1216	iter_reg = fw->xmt0_dma_reg;
   1217	iter_reg = qla24xx_read_window(reg, 0x7600, 16, iter_reg);
   1218	qla24xx_read_window(reg, 0x7610, 16, iter_reg);
   1219
   1220	iter_reg = fw->xmt1_dma_reg;
   1221	iter_reg = qla24xx_read_window(reg, 0x7620, 16, iter_reg);
   1222	qla24xx_read_window(reg, 0x7630, 16, iter_reg);
   1223
   1224	iter_reg = fw->xmt2_dma_reg;
   1225	iter_reg = qla24xx_read_window(reg, 0x7640, 16, iter_reg);
   1226	qla24xx_read_window(reg, 0x7650, 16, iter_reg);
   1227
   1228	iter_reg = fw->xmt3_dma_reg;
   1229	iter_reg = qla24xx_read_window(reg, 0x7660, 16, iter_reg);
   1230	qla24xx_read_window(reg, 0x7670, 16, iter_reg);
   1231
   1232	iter_reg = fw->xmt4_dma_reg;
   1233	iter_reg = qla24xx_read_window(reg, 0x7680, 16, iter_reg);
   1234	qla24xx_read_window(reg, 0x7690, 16, iter_reg);
   1235
   1236	qla24xx_read_window(reg, 0x76A0, 16, fw->xmt_data_dma_reg);
   1237
   1238	/* Receive DMA registers. */
   1239	iter_reg = fw->rcvt0_data_dma_reg;
   1240	iter_reg = qla24xx_read_window(reg, 0x7700, 16, iter_reg);
   1241	qla24xx_read_window(reg, 0x7710, 16, iter_reg);
   1242
   1243	iter_reg = fw->rcvt1_data_dma_reg;
   1244	iter_reg = qla24xx_read_window(reg, 0x7720, 16, iter_reg);
   1245	qla24xx_read_window(reg, 0x7730, 16, iter_reg);
   1246
   1247	/* RISC registers. */
   1248	iter_reg = fw->risc_gp_reg;
   1249	iter_reg = qla24xx_read_window(reg, 0x0F00, 16, iter_reg);
   1250	iter_reg = qla24xx_read_window(reg, 0x0F10, 16, iter_reg);
   1251	iter_reg = qla24xx_read_window(reg, 0x0F20, 16, iter_reg);
   1252	iter_reg = qla24xx_read_window(reg, 0x0F30, 16, iter_reg);
   1253	iter_reg = qla24xx_read_window(reg, 0x0F40, 16, iter_reg);
   1254	iter_reg = qla24xx_read_window(reg, 0x0F50, 16, iter_reg);
   1255	iter_reg = qla24xx_read_window(reg, 0x0F60, 16, iter_reg);
   1256	qla24xx_read_window(reg, 0x0F70, 16, iter_reg);
   1257
   1258	/* Local memory controller registers. */
   1259	iter_reg = fw->lmc_reg;
   1260	iter_reg = qla24xx_read_window(reg, 0x3000, 16, iter_reg);
   1261	iter_reg = qla24xx_read_window(reg, 0x3010, 16, iter_reg);
   1262	iter_reg = qla24xx_read_window(reg, 0x3020, 16, iter_reg);
   1263	iter_reg = qla24xx_read_window(reg, 0x3030, 16, iter_reg);
   1264	iter_reg = qla24xx_read_window(reg, 0x3040, 16, iter_reg);
   1265	iter_reg = qla24xx_read_window(reg, 0x3050, 16, iter_reg);
   1266	qla24xx_read_window(reg, 0x3060, 16, iter_reg);
   1267
   1268	/* Fibre Protocol Module registers. */
   1269	iter_reg = fw->fpm_hdw_reg;
   1270	iter_reg = qla24xx_read_window(reg, 0x4000, 16, iter_reg);
   1271	iter_reg = qla24xx_read_window(reg, 0x4010, 16, iter_reg);
   1272	iter_reg = qla24xx_read_window(reg, 0x4020, 16, iter_reg);
   1273	iter_reg = qla24xx_read_window(reg, 0x4030, 16, iter_reg);
   1274	iter_reg = qla24xx_read_window(reg, 0x4040, 16, iter_reg);
   1275	iter_reg = qla24xx_read_window(reg, 0x4050, 16, iter_reg);
   1276	iter_reg = qla24xx_read_window(reg, 0x4060, 16, iter_reg);
   1277	iter_reg = qla24xx_read_window(reg, 0x4070, 16, iter_reg);
   1278	iter_reg = qla24xx_read_window(reg, 0x4080, 16, iter_reg);
   1279	iter_reg = qla24xx_read_window(reg, 0x4090, 16, iter_reg);
   1280	iter_reg = qla24xx_read_window(reg, 0x40A0, 16, iter_reg);
   1281	qla24xx_read_window(reg, 0x40B0, 16, iter_reg);
   1282
   1283	/* Frame Buffer registers. */
   1284	iter_reg = fw->fb_hdw_reg;
   1285	iter_reg = qla24xx_read_window(reg, 0x6000, 16, iter_reg);
   1286	iter_reg = qla24xx_read_window(reg, 0x6010, 16, iter_reg);
   1287	iter_reg = qla24xx_read_window(reg, 0x6020, 16, iter_reg);
   1288	iter_reg = qla24xx_read_window(reg, 0x6030, 16, iter_reg);
   1289	iter_reg = qla24xx_read_window(reg, 0x6040, 16, iter_reg);
   1290	iter_reg = qla24xx_read_window(reg, 0x6100, 16, iter_reg);
   1291	iter_reg = qla24xx_read_window(reg, 0x6130, 16, iter_reg);
   1292	iter_reg = qla24xx_read_window(reg, 0x6150, 16, iter_reg);
   1293	iter_reg = qla24xx_read_window(reg, 0x6170, 16, iter_reg);
   1294	iter_reg = qla24xx_read_window(reg, 0x6190, 16, iter_reg);
   1295	qla24xx_read_window(reg, 0x61B0, 16, iter_reg);
   1296
   1297	rval = qla24xx_soft_reset(ha);
   1298	if (rval != QLA_SUCCESS)
   1299		goto qla24xx_fw_dump_failed_0;
   1300
   1301	rval = qla24xx_dump_memory(ha, fw->code_ram, sizeof(fw->code_ram),
   1302	    &nxt);
   1303	if (rval != QLA_SUCCESS)
   1304		goto qla24xx_fw_dump_failed_0;
   1305
   1306	nxt = qla2xxx_copy_queues(ha, nxt);
   1307
   1308	qla24xx_copy_eft(ha, nxt);
   1309
   1310	nxt_chain = (void *)ha->fw_dump + ha->chain_offset;
   1311	nxt_chain = qla2xxx_copy_atioqueues(ha, nxt_chain, &last_chain);
   1312	if (last_chain) {
   1313		ha->fw_dump->version |= htonl(DUMP_CHAIN_VARIANT);
   1314		*last_chain |= htonl(DUMP_CHAIN_LAST);
   1315	}
   1316
   1317	/* Adjust valid length. */
   1318	ha->fw_dump_len = (nxt_chain - (void *)ha->fw_dump);
   1319
   1320qla24xx_fw_dump_failed_0:
   1321	qla2xxx_dump_post_process(base_vha, rval);
   1322}
   1323
   1324void
   1325qla25xx_fw_dump(scsi_qla_host_t *vha)
   1326{
   1327	int		rval;
   1328	uint32_t	cnt;
   1329	struct qla_hw_data *ha = vha->hw;
   1330	struct device_reg_24xx __iomem *reg = &ha->iobase->isp24;
   1331	__le32 __iomem *dmp_reg;
   1332	__be32		*iter_reg;
   1333	__le16 __iomem *mbx_reg;
   1334	struct qla25xx_fw_dump *fw;
   1335	void		*nxt, *nxt_chain;
   1336	__be32		*last_chain = NULL;
   1337	struct scsi_qla_host *base_vha = pci_get_drvdata(ha->pdev);
   1338
   1339	lockdep_assert_held(&ha->hardware_lock);
   1340
   1341	ha->fw_dump_cap_flags = 0;
   1342
   1343	if (!ha->fw_dump) {
   1344		ql_log(ql_log_warn, vha, 0xd008,
   1345		    "No buffer available for dump.\n");
   1346		return;
   1347	}
   1348
   1349	if (ha->fw_dumped) {
   1350		ql_log(ql_log_warn, vha, 0xd009,
   1351		    "Firmware has been previously dumped (%p) "
   1352		    "-- ignoring request.\n",
   1353		    ha->fw_dump);
   1354		return;
   1355	}
   1356	QLA_FW_STOPPED(ha);
   1357	fw = &ha->fw_dump->isp.isp25;
   1358	qla2xxx_prep_dump(ha, ha->fw_dump);
   1359	ha->fw_dump->version = htonl(2);
   1360
   1361	fw->host_status = htonl(rd_reg_dword(&reg->host_status));
   1362
   1363	/*
   1364	 * Pause RISC. No need to track timeout, as resetting the chip
   1365	 * is the right approach incase of pause timeout
   1366	 */
   1367	qla24xx_pause_risc(reg, ha);
   1368
   1369	/* Host/Risc registers. */
   1370	iter_reg = fw->host_risc_reg;
   1371	iter_reg = qla24xx_read_window(reg, 0x7000, 16, iter_reg);
   1372	qla24xx_read_window(reg, 0x7010, 16, iter_reg);
   1373
   1374	/* PCIe registers. */
   1375	wrt_reg_dword(&reg->iobase_addr, 0x7C00);
   1376	rd_reg_dword(&reg->iobase_addr);
   1377	wrt_reg_dword(&reg->iobase_window, 0x01);
   1378	dmp_reg = &reg->iobase_c4;
   1379	fw->pcie_regs[0] = htonl(rd_reg_dword(dmp_reg));
   1380	dmp_reg++;
   1381	fw->pcie_regs[1] = htonl(rd_reg_dword(dmp_reg));
   1382	dmp_reg++;
   1383	fw->pcie_regs[2] = htonl(rd_reg_dword(dmp_reg));
   1384	fw->pcie_regs[3] = htonl(rd_reg_dword(&reg->iobase_window));
   1385
   1386	wrt_reg_dword(&reg->iobase_window, 0x00);
   1387	rd_reg_dword(&reg->iobase_window);
   1388
   1389	/* Host interface registers. */
   1390	dmp_reg = &reg->flash_addr;
   1391	for (cnt = 0; cnt < ARRAY_SIZE(fw->host_reg); cnt++, dmp_reg++)
   1392		fw->host_reg[cnt] = htonl(rd_reg_dword(dmp_reg));
   1393
   1394	/* Disable interrupts. */
   1395	wrt_reg_dword(&reg->ictrl, 0);
   1396	rd_reg_dword(&reg->ictrl);
   1397
   1398	/* Shadow registers. */
   1399	wrt_reg_dword(&reg->iobase_addr, 0x0F70);
   1400	rd_reg_dword(&reg->iobase_addr);
   1401	wrt_reg_dword(&reg->iobase_select, 0xB0000000);
   1402	fw->shadow_reg[0] = htonl(rd_reg_dword(&reg->iobase_sdata));
   1403
   1404	wrt_reg_dword(&reg->iobase_select, 0xB0100000);
   1405	fw->shadow_reg[1] = htonl(rd_reg_dword(&reg->iobase_sdata));
   1406
   1407	wrt_reg_dword(&reg->iobase_select, 0xB0200000);
   1408	fw->shadow_reg[2] = htonl(rd_reg_dword(&reg->iobase_sdata));
   1409
   1410	wrt_reg_dword(&reg->iobase_select, 0xB0300000);
   1411	fw->shadow_reg[3] = htonl(rd_reg_dword(&reg->iobase_sdata));
   1412
   1413	wrt_reg_dword(&reg->iobase_select, 0xB0400000);
   1414	fw->shadow_reg[4] = htonl(rd_reg_dword(&reg->iobase_sdata));
   1415
   1416	wrt_reg_dword(&reg->iobase_select, 0xB0500000);
   1417	fw->shadow_reg[5] = htonl(rd_reg_dword(&reg->iobase_sdata));
   1418
   1419	wrt_reg_dword(&reg->iobase_select, 0xB0600000);
   1420	fw->shadow_reg[6] = htonl(rd_reg_dword(&reg->iobase_sdata));
   1421
   1422	wrt_reg_dword(&reg->iobase_select, 0xB0700000);
   1423	fw->shadow_reg[7] = htonl(rd_reg_dword(&reg->iobase_sdata));
   1424
   1425	wrt_reg_dword(&reg->iobase_select, 0xB0800000);
   1426	fw->shadow_reg[8] = htonl(rd_reg_dword(&reg->iobase_sdata));
   1427
   1428	wrt_reg_dword(&reg->iobase_select, 0xB0900000);
   1429	fw->shadow_reg[9] = htonl(rd_reg_dword(&reg->iobase_sdata));
   1430
   1431	wrt_reg_dword(&reg->iobase_select, 0xB0A00000);
   1432	fw->shadow_reg[10] = htonl(rd_reg_dword(&reg->iobase_sdata));
   1433
   1434	/* RISC I/O register. */
   1435	wrt_reg_dword(&reg->iobase_addr, 0x0010);
   1436	fw->risc_io_reg = htonl(rd_reg_dword(&reg->iobase_window));
   1437
   1438	/* Mailbox registers. */
   1439	mbx_reg = &reg->mailbox0;
   1440	for (cnt = 0; cnt < ARRAY_SIZE(fw->mailbox_reg); cnt++, mbx_reg++)
   1441		fw->mailbox_reg[cnt] = htons(rd_reg_word(mbx_reg));
   1442
   1443	/* Transfer sequence registers. */
   1444	iter_reg = fw->xseq_gp_reg;
   1445	iter_reg = qla24xx_read_window(reg, 0xBF00, 16, iter_reg);
   1446	iter_reg = qla24xx_read_window(reg, 0xBF10, 16, iter_reg);
   1447	iter_reg = qla24xx_read_window(reg, 0xBF20, 16, iter_reg);
   1448	iter_reg = qla24xx_read_window(reg, 0xBF30, 16, iter_reg);
   1449	iter_reg = qla24xx_read_window(reg, 0xBF40, 16, iter_reg);
   1450	iter_reg = qla24xx_read_window(reg, 0xBF50, 16, iter_reg);
   1451	iter_reg = qla24xx_read_window(reg, 0xBF60, 16, iter_reg);
   1452	qla24xx_read_window(reg, 0xBF70, 16, iter_reg);
   1453
   1454	iter_reg = fw->xseq_0_reg;
   1455	iter_reg = qla24xx_read_window(reg, 0xBFC0, 16, iter_reg);
   1456	iter_reg = qla24xx_read_window(reg, 0xBFD0, 16, iter_reg);
   1457	qla24xx_read_window(reg, 0xBFE0, 16, iter_reg);
   1458
   1459	qla24xx_read_window(reg, 0xBFF0, 16, fw->xseq_1_reg);
   1460
   1461	/* Receive sequence registers. */
   1462	iter_reg = fw->rseq_gp_reg;
   1463	iter_reg = qla24xx_read_window(reg, 0xFF00, 16, iter_reg);
   1464	iter_reg = qla24xx_read_window(reg, 0xFF10, 16, iter_reg);
   1465	iter_reg = qla24xx_read_window(reg, 0xFF20, 16, iter_reg);
   1466	iter_reg = qla24xx_read_window(reg, 0xFF30, 16, iter_reg);
   1467	iter_reg = qla24xx_read_window(reg, 0xFF40, 16, iter_reg);
   1468	iter_reg = qla24xx_read_window(reg, 0xFF50, 16, iter_reg);
   1469	iter_reg = qla24xx_read_window(reg, 0xFF60, 16, iter_reg);
   1470	qla24xx_read_window(reg, 0xFF70, 16, iter_reg);
   1471
   1472	iter_reg = fw->rseq_0_reg;
   1473	iter_reg = qla24xx_read_window(reg, 0xFFC0, 16, iter_reg);
   1474	qla24xx_read_window(reg, 0xFFD0, 16, iter_reg);
   1475
   1476	qla24xx_read_window(reg, 0xFFE0, 16, fw->rseq_1_reg);
   1477	qla24xx_read_window(reg, 0xFFF0, 16, fw->rseq_2_reg);
   1478
   1479	/* Auxiliary sequence registers. */
   1480	iter_reg = fw->aseq_gp_reg;
   1481	iter_reg = qla24xx_read_window(reg, 0xB000, 16, iter_reg);
   1482	iter_reg = qla24xx_read_window(reg, 0xB010, 16, iter_reg);
   1483	iter_reg = qla24xx_read_window(reg, 0xB020, 16, iter_reg);
   1484	iter_reg = qla24xx_read_window(reg, 0xB030, 16, iter_reg);
   1485	iter_reg = qla24xx_read_window(reg, 0xB040, 16, iter_reg);
   1486	iter_reg = qla24xx_read_window(reg, 0xB050, 16, iter_reg);
   1487	iter_reg = qla24xx_read_window(reg, 0xB060, 16, iter_reg);
   1488	qla24xx_read_window(reg, 0xB070, 16, iter_reg);
   1489
   1490	iter_reg = fw->aseq_0_reg;
   1491	iter_reg = qla24xx_read_window(reg, 0xB0C0, 16, iter_reg);
   1492	qla24xx_read_window(reg, 0xB0D0, 16, iter_reg);
   1493
   1494	qla24xx_read_window(reg, 0xB0E0, 16, fw->aseq_1_reg);
   1495	qla24xx_read_window(reg, 0xB0F0, 16, fw->aseq_2_reg);
   1496
   1497	/* Command DMA registers. */
   1498	qla24xx_read_window(reg, 0x7100, 16, fw->cmd_dma_reg);
   1499
   1500	/* Queues. */
   1501	iter_reg = fw->req0_dma_reg;
   1502	iter_reg = qla24xx_read_window(reg, 0x7200, 8, iter_reg);
   1503	dmp_reg = &reg->iobase_q;
   1504	for (cnt = 0; cnt < 7; cnt++, dmp_reg++)
   1505		*iter_reg++ = htonl(rd_reg_dword(dmp_reg));
   1506
   1507	iter_reg = fw->resp0_dma_reg;
   1508	iter_reg = qla24xx_read_window(reg, 0x7300, 8, iter_reg);
   1509	dmp_reg = &reg->iobase_q;
   1510	for (cnt = 0; cnt < 7; cnt++, dmp_reg++)
   1511		*iter_reg++ = htonl(rd_reg_dword(dmp_reg));
   1512
   1513	iter_reg = fw->req1_dma_reg;
   1514	iter_reg = qla24xx_read_window(reg, 0x7400, 8, iter_reg);
   1515	dmp_reg = &reg->iobase_q;
   1516	for (cnt = 0; cnt < 7; cnt++, dmp_reg++)
   1517		*iter_reg++ = htonl(rd_reg_dword(dmp_reg));
   1518
   1519	/* Transmit DMA registers. */
   1520	iter_reg = fw->xmt0_dma_reg;
   1521	iter_reg = qla24xx_read_window(reg, 0x7600, 16, iter_reg);
   1522	qla24xx_read_window(reg, 0x7610, 16, iter_reg);
   1523
   1524	iter_reg = fw->xmt1_dma_reg;
   1525	iter_reg = qla24xx_read_window(reg, 0x7620, 16, iter_reg);
   1526	qla24xx_read_window(reg, 0x7630, 16, iter_reg);
   1527
   1528	iter_reg = fw->xmt2_dma_reg;
   1529	iter_reg = qla24xx_read_window(reg, 0x7640, 16, iter_reg);
   1530	qla24xx_read_window(reg, 0x7650, 16, iter_reg);
   1531
   1532	iter_reg = fw->xmt3_dma_reg;
   1533	iter_reg = qla24xx_read_window(reg, 0x7660, 16, iter_reg);
   1534	qla24xx_read_window(reg, 0x7670, 16, iter_reg);
   1535
   1536	iter_reg = fw->xmt4_dma_reg;
   1537	iter_reg = qla24xx_read_window(reg, 0x7680, 16, iter_reg);
   1538	qla24xx_read_window(reg, 0x7690, 16, iter_reg);
   1539
   1540	qla24xx_read_window(reg, 0x76A0, 16, fw->xmt_data_dma_reg);
   1541
   1542	/* Receive DMA registers. */
   1543	iter_reg = fw->rcvt0_data_dma_reg;
   1544	iter_reg = qla24xx_read_window(reg, 0x7700, 16, iter_reg);
   1545	qla24xx_read_window(reg, 0x7710, 16, iter_reg);
   1546
   1547	iter_reg = fw->rcvt1_data_dma_reg;
   1548	iter_reg = qla24xx_read_window(reg, 0x7720, 16, iter_reg);
   1549	qla24xx_read_window(reg, 0x7730, 16, iter_reg);
   1550
   1551	/* RISC registers. */
   1552	iter_reg = fw->risc_gp_reg;
   1553	iter_reg = qla24xx_read_window(reg, 0x0F00, 16, iter_reg);
   1554	iter_reg = qla24xx_read_window(reg, 0x0F10, 16, iter_reg);
   1555	iter_reg = qla24xx_read_window(reg, 0x0F20, 16, iter_reg);
   1556	iter_reg = qla24xx_read_window(reg, 0x0F30, 16, iter_reg);
   1557	iter_reg = qla24xx_read_window(reg, 0x0F40, 16, iter_reg);
   1558	iter_reg = qla24xx_read_window(reg, 0x0F50, 16, iter_reg);
   1559	iter_reg = qla24xx_read_window(reg, 0x0F60, 16, iter_reg);
   1560	qla24xx_read_window(reg, 0x0F70, 16, iter_reg);
   1561
   1562	/* Local memory controller registers. */
   1563	iter_reg = fw->lmc_reg;
   1564	iter_reg = qla24xx_read_window(reg, 0x3000, 16, iter_reg);
   1565	iter_reg = qla24xx_read_window(reg, 0x3010, 16, iter_reg);
   1566	iter_reg = qla24xx_read_window(reg, 0x3020, 16, iter_reg);
   1567	iter_reg = qla24xx_read_window(reg, 0x3030, 16, iter_reg);
   1568	iter_reg = qla24xx_read_window(reg, 0x3040, 16, iter_reg);
   1569	iter_reg = qla24xx_read_window(reg, 0x3050, 16, iter_reg);
   1570	iter_reg = qla24xx_read_window(reg, 0x3060, 16, iter_reg);
   1571	qla24xx_read_window(reg, 0x3070, 16, iter_reg);
   1572
   1573	/* Fibre Protocol Module registers. */
   1574	iter_reg = fw->fpm_hdw_reg;
   1575	iter_reg = qla24xx_read_window(reg, 0x4000, 16, iter_reg);
   1576	iter_reg = qla24xx_read_window(reg, 0x4010, 16, iter_reg);
   1577	iter_reg = qla24xx_read_window(reg, 0x4020, 16, iter_reg);
   1578	iter_reg = qla24xx_read_window(reg, 0x4030, 16, iter_reg);
   1579	iter_reg = qla24xx_read_window(reg, 0x4040, 16, iter_reg);
   1580	iter_reg = qla24xx_read_window(reg, 0x4050, 16, iter_reg);
   1581	iter_reg = qla24xx_read_window(reg, 0x4060, 16, iter_reg);
   1582	iter_reg = qla24xx_read_window(reg, 0x4070, 16, iter_reg);
   1583	iter_reg = qla24xx_read_window(reg, 0x4080, 16, iter_reg);
   1584	iter_reg = qla24xx_read_window(reg, 0x4090, 16, iter_reg);
   1585	iter_reg = qla24xx_read_window(reg, 0x40A0, 16, iter_reg);
   1586	qla24xx_read_window(reg, 0x40B0, 16, iter_reg);
   1587
   1588	/* Frame Buffer registers. */
   1589	iter_reg = fw->fb_hdw_reg;
   1590	iter_reg = qla24xx_read_window(reg, 0x6000, 16, iter_reg);
   1591	iter_reg = qla24xx_read_window(reg, 0x6010, 16, iter_reg);
   1592	iter_reg = qla24xx_read_window(reg, 0x6020, 16, iter_reg);
   1593	iter_reg = qla24xx_read_window(reg, 0x6030, 16, iter_reg);
   1594	iter_reg = qla24xx_read_window(reg, 0x6040, 16, iter_reg);
   1595	iter_reg = qla24xx_read_window(reg, 0x6100, 16, iter_reg);
   1596	iter_reg = qla24xx_read_window(reg, 0x6130, 16, iter_reg);
   1597	iter_reg = qla24xx_read_window(reg, 0x6150, 16, iter_reg);
   1598	iter_reg = qla24xx_read_window(reg, 0x6170, 16, iter_reg);
   1599	iter_reg = qla24xx_read_window(reg, 0x6190, 16, iter_reg);
   1600	iter_reg = qla24xx_read_window(reg, 0x61B0, 16, iter_reg);
   1601	qla24xx_read_window(reg, 0x6F00, 16, iter_reg);
   1602
   1603	/* Multi queue registers */
   1604	nxt_chain = qla25xx_copy_mq(ha, (void *)ha->fw_dump + ha->chain_offset,
   1605	    &last_chain);
   1606
   1607	rval = qla24xx_soft_reset(ha);
   1608	if (rval != QLA_SUCCESS)
   1609		goto qla25xx_fw_dump_failed_0;
   1610
   1611	rval = qla24xx_dump_memory(ha, fw->code_ram, sizeof(fw->code_ram),
   1612	    &nxt);
   1613	if (rval != QLA_SUCCESS)
   1614		goto qla25xx_fw_dump_failed_0;
   1615
   1616	nxt = qla2xxx_copy_queues(ha, nxt);
   1617
   1618	qla24xx_copy_eft(ha, nxt);
   1619
   1620	/* Chain entries -- started with MQ. */
   1621	nxt_chain = qla25xx_copy_fce(ha, nxt_chain, &last_chain);
   1622	nxt_chain = qla25xx_copy_mqueues(ha, nxt_chain, &last_chain);
   1623	nxt_chain = qla2xxx_copy_atioqueues(ha, nxt_chain, &last_chain);
   1624	nxt_chain = qla25xx_copy_exlogin(ha, nxt_chain, &last_chain);
   1625	if (last_chain) {
   1626		ha->fw_dump->version |= htonl(DUMP_CHAIN_VARIANT);
   1627		*last_chain |= htonl(DUMP_CHAIN_LAST);
   1628	}
   1629
   1630	/* Adjust valid length. */
   1631	ha->fw_dump_len = (nxt_chain - (void *)ha->fw_dump);
   1632
   1633qla25xx_fw_dump_failed_0:
   1634	qla2xxx_dump_post_process(base_vha, rval);
   1635}
   1636
   1637void
   1638qla81xx_fw_dump(scsi_qla_host_t *vha)
   1639{
   1640	int		rval;
   1641	uint32_t	cnt;
   1642	struct qla_hw_data *ha = vha->hw;
   1643	struct device_reg_24xx __iomem *reg = &ha->iobase->isp24;
   1644	__le32 __iomem *dmp_reg;
   1645	__be32		*iter_reg;
   1646	__le16 __iomem *mbx_reg;
   1647	struct qla81xx_fw_dump *fw;
   1648	void		*nxt, *nxt_chain;
   1649	__be32		*last_chain = NULL;
   1650	struct scsi_qla_host *base_vha = pci_get_drvdata(ha->pdev);
   1651
   1652	lockdep_assert_held(&ha->hardware_lock);
   1653
   1654	ha->fw_dump_cap_flags = 0;
   1655
   1656	if (!ha->fw_dump) {
   1657		ql_log(ql_log_warn, vha, 0xd00a,
   1658		    "No buffer available for dump.\n");
   1659		return;
   1660	}
   1661
   1662	if (ha->fw_dumped) {
   1663		ql_log(ql_log_warn, vha, 0xd00b,
   1664		    "Firmware has been previously dumped (%p) "
   1665		    "-- ignoring request.\n",
   1666		    ha->fw_dump);
   1667		return;
   1668	}
   1669	fw = &ha->fw_dump->isp.isp81;
   1670	qla2xxx_prep_dump(ha, ha->fw_dump);
   1671
   1672	fw->host_status = htonl(rd_reg_dword(&reg->host_status));
   1673
   1674	/*
   1675	 * Pause RISC. No need to track timeout, as resetting the chip
   1676	 * is the right approach incase of pause timeout
   1677	 */
   1678	qla24xx_pause_risc(reg, ha);
   1679
   1680	/* Host/Risc registers. */
   1681	iter_reg = fw->host_risc_reg;
   1682	iter_reg = qla24xx_read_window(reg, 0x7000, 16, iter_reg);
   1683	qla24xx_read_window(reg, 0x7010, 16, iter_reg);
   1684
   1685	/* PCIe registers. */
   1686	wrt_reg_dword(&reg->iobase_addr, 0x7C00);
   1687	rd_reg_dword(&reg->iobase_addr);
   1688	wrt_reg_dword(&reg->iobase_window, 0x01);
   1689	dmp_reg = &reg->iobase_c4;
   1690	fw->pcie_regs[0] = htonl(rd_reg_dword(dmp_reg));
   1691	dmp_reg++;
   1692	fw->pcie_regs[1] = htonl(rd_reg_dword(dmp_reg));
   1693	dmp_reg++;
   1694	fw->pcie_regs[2] = htonl(rd_reg_dword(dmp_reg));
   1695	fw->pcie_regs[3] = htonl(rd_reg_dword(&reg->iobase_window));
   1696
   1697	wrt_reg_dword(&reg->iobase_window, 0x00);
   1698	rd_reg_dword(&reg->iobase_window);
   1699
   1700	/* Host interface registers. */
   1701	dmp_reg = &reg->flash_addr;
   1702	for (cnt = 0; cnt < ARRAY_SIZE(fw->host_reg); cnt++, dmp_reg++)
   1703		fw->host_reg[cnt] = htonl(rd_reg_dword(dmp_reg));
   1704
   1705	/* Disable interrupts. */
   1706	wrt_reg_dword(&reg->ictrl, 0);
   1707	rd_reg_dword(&reg->ictrl);
   1708
   1709	/* Shadow registers. */
   1710	wrt_reg_dword(&reg->iobase_addr, 0x0F70);
   1711	rd_reg_dword(&reg->iobase_addr);
   1712	wrt_reg_dword(&reg->iobase_select, 0xB0000000);
   1713	fw->shadow_reg[0] = htonl(rd_reg_dword(&reg->iobase_sdata));
   1714
   1715	wrt_reg_dword(&reg->iobase_select, 0xB0100000);
   1716	fw->shadow_reg[1] = htonl(rd_reg_dword(&reg->iobase_sdata));
   1717
   1718	wrt_reg_dword(&reg->iobase_select, 0xB0200000);
   1719	fw->shadow_reg[2] = htonl(rd_reg_dword(&reg->iobase_sdata));
   1720
   1721	wrt_reg_dword(&reg->iobase_select, 0xB0300000);
   1722	fw->shadow_reg[3] = htonl(rd_reg_dword(&reg->iobase_sdata));
   1723
   1724	wrt_reg_dword(&reg->iobase_select, 0xB0400000);
   1725	fw->shadow_reg[4] = htonl(rd_reg_dword(&reg->iobase_sdata));
   1726
   1727	wrt_reg_dword(&reg->iobase_select, 0xB0500000);
   1728	fw->shadow_reg[5] = htonl(rd_reg_dword(&reg->iobase_sdata));
   1729
   1730	wrt_reg_dword(&reg->iobase_select, 0xB0600000);
   1731	fw->shadow_reg[6] = htonl(rd_reg_dword(&reg->iobase_sdata));
   1732
   1733	wrt_reg_dword(&reg->iobase_select, 0xB0700000);
   1734	fw->shadow_reg[7] = htonl(rd_reg_dword(&reg->iobase_sdata));
   1735
   1736	wrt_reg_dword(&reg->iobase_select, 0xB0800000);
   1737	fw->shadow_reg[8] = htonl(rd_reg_dword(&reg->iobase_sdata));
   1738
   1739	wrt_reg_dword(&reg->iobase_select, 0xB0900000);
   1740	fw->shadow_reg[9] = htonl(rd_reg_dword(&reg->iobase_sdata));
   1741
   1742	wrt_reg_dword(&reg->iobase_select, 0xB0A00000);
   1743	fw->shadow_reg[10] = htonl(rd_reg_dword(&reg->iobase_sdata));
   1744
   1745	/* RISC I/O register. */
   1746	wrt_reg_dword(&reg->iobase_addr, 0x0010);
   1747	fw->risc_io_reg = htonl(rd_reg_dword(&reg->iobase_window));
   1748
   1749	/* Mailbox registers. */
   1750	mbx_reg = &reg->mailbox0;
   1751	for (cnt = 0; cnt < ARRAY_SIZE(fw->mailbox_reg); cnt++, mbx_reg++)
   1752		fw->mailbox_reg[cnt] = htons(rd_reg_word(mbx_reg));
   1753
   1754	/* Transfer sequence registers. */
   1755	iter_reg = fw->xseq_gp_reg;
   1756	iter_reg = qla24xx_read_window(reg, 0xBF00, 16, iter_reg);
   1757	iter_reg = qla24xx_read_window(reg, 0xBF10, 16, iter_reg);
   1758	iter_reg = qla24xx_read_window(reg, 0xBF20, 16, iter_reg);
   1759	iter_reg = qla24xx_read_window(reg, 0xBF30, 16, iter_reg);
   1760	iter_reg = qla24xx_read_window(reg, 0xBF40, 16, iter_reg);
   1761	iter_reg = qla24xx_read_window(reg, 0xBF50, 16, iter_reg);
   1762	iter_reg = qla24xx_read_window(reg, 0xBF60, 16, iter_reg);
   1763	qla24xx_read_window(reg, 0xBF70, 16, iter_reg);
   1764
   1765	iter_reg = fw->xseq_0_reg;
   1766	iter_reg = qla24xx_read_window(reg, 0xBFC0, 16, iter_reg);
   1767	iter_reg = qla24xx_read_window(reg, 0xBFD0, 16, iter_reg);
   1768	qla24xx_read_window(reg, 0xBFE0, 16, iter_reg);
   1769
   1770	qla24xx_read_window(reg, 0xBFF0, 16, fw->xseq_1_reg);
   1771
   1772	/* Receive sequence registers. */
   1773	iter_reg = fw->rseq_gp_reg;
   1774	iter_reg = qla24xx_read_window(reg, 0xFF00, 16, iter_reg);
   1775	iter_reg = qla24xx_read_window(reg, 0xFF10, 16, iter_reg);
   1776	iter_reg = qla24xx_read_window(reg, 0xFF20, 16, iter_reg);
   1777	iter_reg = qla24xx_read_window(reg, 0xFF30, 16, iter_reg);
   1778	iter_reg = qla24xx_read_window(reg, 0xFF40, 16, iter_reg);
   1779	iter_reg = qla24xx_read_window(reg, 0xFF50, 16, iter_reg);
   1780	iter_reg = qla24xx_read_window(reg, 0xFF60, 16, iter_reg);
   1781	qla24xx_read_window(reg, 0xFF70, 16, iter_reg);
   1782
   1783	iter_reg = fw->rseq_0_reg;
   1784	iter_reg = qla24xx_read_window(reg, 0xFFC0, 16, iter_reg);
   1785	qla24xx_read_window(reg, 0xFFD0, 16, iter_reg);
   1786
   1787	qla24xx_read_window(reg, 0xFFE0, 16, fw->rseq_1_reg);
   1788	qla24xx_read_window(reg, 0xFFF0, 16, fw->rseq_2_reg);
   1789
   1790	/* Auxiliary sequence registers. */
   1791	iter_reg = fw->aseq_gp_reg;
   1792	iter_reg = qla24xx_read_window(reg, 0xB000, 16, iter_reg);
   1793	iter_reg = qla24xx_read_window(reg, 0xB010, 16, iter_reg);
   1794	iter_reg = qla24xx_read_window(reg, 0xB020, 16, iter_reg);
   1795	iter_reg = qla24xx_read_window(reg, 0xB030, 16, iter_reg);
   1796	iter_reg = qla24xx_read_window(reg, 0xB040, 16, iter_reg);
   1797	iter_reg = qla24xx_read_window(reg, 0xB050, 16, iter_reg);
   1798	iter_reg = qla24xx_read_window(reg, 0xB060, 16, iter_reg);
   1799	qla24xx_read_window(reg, 0xB070, 16, iter_reg);
   1800
   1801	iter_reg = fw->aseq_0_reg;
   1802	iter_reg = qla24xx_read_window(reg, 0xB0C0, 16, iter_reg);
   1803	qla24xx_read_window(reg, 0xB0D0, 16, iter_reg);
   1804
   1805	qla24xx_read_window(reg, 0xB0E0, 16, fw->aseq_1_reg);
   1806	qla24xx_read_window(reg, 0xB0F0, 16, fw->aseq_2_reg);
   1807
   1808	/* Command DMA registers. */
   1809	qla24xx_read_window(reg, 0x7100, 16, fw->cmd_dma_reg);
   1810
   1811	/* Queues. */
   1812	iter_reg = fw->req0_dma_reg;
   1813	iter_reg = qla24xx_read_window(reg, 0x7200, 8, iter_reg);
   1814	dmp_reg = &reg->iobase_q;
   1815	for (cnt = 0; cnt < 7; cnt++, dmp_reg++)
   1816		*iter_reg++ = htonl(rd_reg_dword(dmp_reg));
   1817
   1818	iter_reg = fw->resp0_dma_reg;
   1819	iter_reg = qla24xx_read_window(reg, 0x7300, 8, iter_reg);
   1820	dmp_reg = &reg->iobase_q;
   1821	for (cnt = 0; cnt < 7; cnt++, dmp_reg++)
   1822		*iter_reg++ = htonl(rd_reg_dword(dmp_reg));
   1823
   1824	iter_reg = fw->req1_dma_reg;
   1825	iter_reg = qla24xx_read_window(reg, 0x7400, 8, iter_reg);
   1826	dmp_reg = &reg->iobase_q;
   1827	for (cnt = 0; cnt < 7; cnt++, dmp_reg++)
   1828		*iter_reg++ = htonl(rd_reg_dword(dmp_reg));
   1829
   1830	/* Transmit DMA registers. */
   1831	iter_reg = fw->xmt0_dma_reg;
   1832	iter_reg = qla24xx_read_window(reg, 0x7600, 16, iter_reg);
   1833	qla24xx_read_window(reg, 0x7610, 16, iter_reg);
   1834
   1835	iter_reg = fw->xmt1_dma_reg;
   1836	iter_reg = qla24xx_read_window(reg, 0x7620, 16, iter_reg);
   1837	qla24xx_read_window(reg, 0x7630, 16, iter_reg);
   1838
   1839	iter_reg = fw->xmt2_dma_reg;
   1840	iter_reg = qla24xx_read_window(reg, 0x7640, 16, iter_reg);
   1841	qla24xx_read_window(reg, 0x7650, 16, iter_reg);
   1842
   1843	iter_reg = fw->xmt3_dma_reg;
   1844	iter_reg = qla24xx_read_window(reg, 0x7660, 16, iter_reg);
   1845	qla24xx_read_window(reg, 0x7670, 16, iter_reg);
   1846
   1847	iter_reg = fw->xmt4_dma_reg;
   1848	iter_reg = qla24xx_read_window(reg, 0x7680, 16, iter_reg);
   1849	qla24xx_read_window(reg, 0x7690, 16, iter_reg);
   1850
   1851	qla24xx_read_window(reg, 0x76A0, 16, fw->xmt_data_dma_reg);
   1852
   1853	/* Receive DMA registers. */
   1854	iter_reg = fw->rcvt0_data_dma_reg;
   1855	iter_reg = qla24xx_read_window(reg, 0x7700, 16, iter_reg);
   1856	qla24xx_read_window(reg, 0x7710, 16, iter_reg);
   1857
   1858	iter_reg = fw->rcvt1_data_dma_reg;
   1859	iter_reg = qla24xx_read_window(reg, 0x7720, 16, iter_reg);
   1860	qla24xx_read_window(reg, 0x7730, 16, iter_reg);
   1861
   1862	/* RISC registers. */
   1863	iter_reg = fw->risc_gp_reg;
   1864	iter_reg = qla24xx_read_window(reg, 0x0F00, 16, iter_reg);
   1865	iter_reg = qla24xx_read_window(reg, 0x0F10, 16, iter_reg);
   1866	iter_reg = qla24xx_read_window(reg, 0x0F20, 16, iter_reg);
   1867	iter_reg = qla24xx_read_window(reg, 0x0F30, 16, iter_reg);
   1868	iter_reg = qla24xx_read_window(reg, 0x0F40, 16, iter_reg);
   1869	iter_reg = qla24xx_read_window(reg, 0x0F50, 16, iter_reg);
   1870	iter_reg = qla24xx_read_window(reg, 0x0F60, 16, iter_reg);
   1871	qla24xx_read_window(reg, 0x0F70, 16, iter_reg);
   1872
   1873	/* Local memory controller registers. */
   1874	iter_reg = fw->lmc_reg;
   1875	iter_reg = qla24xx_read_window(reg, 0x3000, 16, iter_reg);
   1876	iter_reg = qla24xx_read_window(reg, 0x3010, 16, iter_reg);
   1877	iter_reg = qla24xx_read_window(reg, 0x3020, 16, iter_reg);
   1878	iter_reg = qla24xx_read_window(reg, 0x3030, 16, iter_reg);
   1879	iter_reg = qla24xx_read_window(reg, 0x3040, 16, iter_reg);
   1880	iter_reg = qla24xx_read_window(reg, 0x3050, 16, iter_reg);
   1881	iter_reg = qla24xx_read_window(reg, 0x3060, 16, iter_reg);
   1882	qla24xx_read_window(reg, 0x3070, 16, iter_reg);
   1883
   1884	/* Fibre Protocol Module registers. */
   1885	iter_reg = fw->fpm_hdw_reg;
   1886	iter_reg = qla24xx_read_window(reg, 0x4000, 16, iter_reg);
   1887	iter_reg = qla24xx_read_window(reg, 0x4010, 16, iter_reg);
   1888	iter_reg = qla24xx_read_window(reg, 0x4020, 16, iter_reg);
   1889	iter_reg = qla24xx_read_window(reg, 0x4030, 16, iter_reg);
   1890	iter_reg = qla24xx_read_window(reg, 0x4040, 16, iter_reg);
   1891	iter_reg = qla24xx_read_window(reg, 0x4050, 16, iter_reg);
   1892	iter_reg = qla24xx_read_window(reg, 0x4060, 16, iter_reg);
   1893	iter_reg = qla24xx_read_window(reg, 0x4070, 16, iter_reg);
   1894	iter_reg = qla24xx_read_window(reg, 0x4080, 16, iter_reg);
   1895	iter_reg = qla24xx_read_window(reg, 0x4090, 16, iter_reg);
   1896	iter_reg = qla24xx_read_window(reg, 0x40A0, 16, iter_reg);
   1897	iter_reg = qla24xx_read_window(reg, 0x40B0, 16, iter_reg);
   1898	iter_reg = qla24xx_read_window(reg, 0x40C0, 16, iter_reg);
   1899	qla24xx_read_window(reg, 0x40D0, 16, iter_reg);
   1900
   1901	/* Frame Buffer registers. */
   1902	iter_reg = fw->fb_hdw_reg;
   1903	iter_reg = qla24xx_read_window(reg, 0x6000, 16, iter_reg);
   1904	iter_reg = qla24xx_read_window(reg, 0x6010, 16, iter_reg);
   1905	iter_reg = qla24xx_read_window(reg, 0x6020, 16, iter_reg);
   1906	iter_reg = qla24xx_read_window(reg, 0x6030, 16, iter_reg);
   1907	iter_reg = qla24xx_read_window(reg, 0x6040, 16, iter_reg);
   1908	iter_reg = qla24xx_read_window(reg, 0x6100, 16, iter_reg);
   1909	iter_reg = qla24xx_read_window(reg, 0x6130, 16, iter_reg);
   1910	iter_reg = qla24xx_read_window(reg, 0x6150, 16, iter_reg);
   1911	iter_reg = qla24xx_read_window(reg, 0x6170, 16, iter_reg);
   1912	iter_reg = qla24xx_read_window(reg, 0x6190, 16, iter_reg);
   1913	iter_reg = qla24xx_read_window(reg, 0x61B0, 16, iter_reg);
   1914	iter_reg = qla24xx_read_window(reg, 0x61C0, 16, iter_reg);
   1915	qla24xx_read_window(reg, 0x6F00, 16, iter_reg);
   1916
   1917	/* Multi queue registers */
   1918	nxt_chain = qla25xx_copy_mq(ha, (void *)ha->fw_dump + ha->chain_offset,
   1919	    &last_chain);
   1920
   1921	rval = qla24xx_soft_reset(ha);
   1922	if (rval != QLA_SUCCESS)
   1923		goto qla81xx_fw_dump_failed_0;
   1924
   1925	rval = qla24xx_dump_memory(ha, fw->code_ram, sizeof(fw->code_ram),
   1926	    &nxt);
   1927	if (rval != QLA_SUCCESS)
   1928		goto qla81xx_fw_dump_failed_0;
   1929
   1930	nxt = qla2xxx_copy_queues(ha, nxt);
   1931
   1932	qla24xx_copy_eft(ha, nxt);
   1933
   1934	/* Chain entries -- started with MQ. */
   1935	nxt_chain = qla25xx_copy_fce(ha, nxt_chain, &last_chain);
   1936	nxt_chain = qla25xx_copy_mqueues(ha, nxt_chain, &last_chain);
   1937	nxt_chain = qla2xxx_copy_atioqueues(ha, nxt_chain, &last_chain);
   1938	nxt_chain = qla25xx_copy_exlogin(ha, nxt_chain, &last_chain);
   1939	nxt_chain = qla81xx_copy_exchoffld(ha, nxt_chain, &last_chain);
   1940	if (last_chain) {
   1941		ha->fw_dump->version |= htonl(DUMP_CHAIN_VARIANT);
   1942		*last_chain |= htonl(DUMP_CHAIN_LAST);
   1943	}
   1944
   1945	/* Adjust valid length. */
   1946	ha->fw_dump_len = (nxt_chain - (void *)ha->fw_dump);
   1947
   1948qla81xx_fw_dump_failed_0:
   1949	qla2xxx_dump_post_process(base_vha, rval);
   1950}
   1951
   1952void
   1953qla83xx_fw_dump(scsi_qla_host_t *vha)
   1954{
   1955	int		rval;
   1956	uint32_t	cnt;
   1957	struct qla_hw_data *ha = vha->hw;
   1958	struct device_reg_24xx __iomem *reg = &ha->iobase->isp24;
   1959	__le32 __iomem *dmp_reg;
   1960	__be32		*iter_reg;
   1961	__le16 __iomem *mbx_reg;
   1962	struct qla83xx_fw_dump *fw;
   1963	void		*nxt, *nxt_chain;
   1964	__be32		*last_chain = NULL;
   1965	struct scsi_qla_host *base_vha = pci_get_drvdata(ha->pdev);
   1966
   1967	lockdep_assert_held(&ha->hardware_lock);
   1968
   1969	ha->fw_dump_cap_flags = 0;
   1970
   1971	if (!ha->fw_dump) {
   1972		ql_log(ql_log_warn, vha, 0xd00c,
   1973		    "No buffer available for dump!!!\n");
   1974		return;
   1975	}
   1976
   1977	if (ha->fw_dumped) {
   1978		ql_log(ql_log_warn, vha, 0xd00d,
   1979		    "Firmware has been previously dumped (%p) -- ignoring "
   1980		    "request...\n", ha->fw_dump);
   1981		return;
   1982	}
   1983	QLA_FW_STOPPED(ha);
   1984	fw = &ha->fw_dump->isp.isp83;
   1985	qla2xxx_prep_dump(ha, ha->fw_dump);
   1986
   1987	fw->host_status = htonl(rd_reg_dword(&reg->host_status));
   1988
   1989	/*
   1990	 * Pause RISC. No need to track timeout, as resetting the chip
   1991	 * is the right approach incase of pause timeout
   1992	 */
   1993	qla24xx_pause_risc(reg, ha);
   1994
   1995	wrt_reg_dword(&reg->iobase_addr, 0x6000);
   1996	dmp_reg = &reg->iobase_window;
   1997	rd_reg_dword(dmp_reg);
   1998	wrt_reg_dword(dmp_reg, 0);
   1999
   2000	dmp_reg = &reg->unused_4_1[0];
   2001	rd_reg_dword(dmp_reg);
   2002	wrt_reg_dword(dmp_reg, 0);
   2003
   2004	wrt_reg_dword(&reg->iobase_addr, 0x6010);
   2005	dmp_reg = &reg->unused_4_1[2];
   2006	rd_reg_dword(dmp_reg);
   2007	wrt_reg_dword(dmp_reg, 0);
   2008
   2009	/* select PCR and disable ecc checking and correction */
   2010	wrt_reg_dword(&reg->iobase_addr, 0x0F70);
   2011	rd_reg_dword(&reg->iobase_addr);
   2012	wrt_reg_dword(&reg->iobase_select, 0x60000000);	/* write to F0h = PCR */
   2013
   2014	/* Host/Risc registers. */
   2015	iter_reg = fw->host_risc_reg;
   2016	iter_reg = qla24xx_read_window(reg, 0x7000, 16, iter_reg);
   2017	iter_reg = qla24xx_read_window(reg, 0x7010, 16, iter_reg);
   2018	qla24xx_read_window(reg, 0x7040, 16, iter_reg);
   2019
   2020	/* PCIe registers. */
   2021	wrt_reg_dword(&reg->iobase_addr, 0x7C00);
   2022	rd_reg_dword(&reg->iobase_addr);
   2023	wrt_reg_dword(&reg->iobase_window, 0x01);
   2024	dmp_reg = &reg->iobase_c4;
   2025	fw->pcie_regs[0] = htonl(rd_reg_dword(dmp_reg));
   2026	dmp_reg++;
   2027	fw->pcie_regs[1] = htonl(rd_reg_dword(dmp_reg));
   2028	dmp_reg++;
   2029	fw->pcie_regs[2] = htonl(rd_reg_dword(dmp_reg));
   2030	fw->pcie_regs[3] = htonl(rd_reg_dword(&reg->iobase_window));
   2031
   2032	wrt_reg_dword(&reg->iobase_window, 0x00);
   2033	rd_reg_dword(&reg->iobase_window);
   2034
   2035	/* Host interface registers. */
   2036	dmp_reg = &reg->flash_addr;
   2037	for (cnt = 0; cnt < ARRAY_SIZE(fw->host_reg); cnt++, dmp_reg++)
   2038		fw->host_reg[cnt] = htonl(rd_reg_dword(dmp_reg));
   2039
   2040	/* Disable interrupts. */
   2041	wrt_reg_dword(&reg->ictrl, 0);
   2042	rd_reg_dword(&reg->ictrl);
   2043
   2044	/* Shadow registers. */
   2045	wrt_reg_dword(&reg->iobase_addr, 0x0F70);
   2046	rd_reg_dword(&reg->iobase_addr);
   2047	wrt_reg_dword(&reg->iobase_select, 0xB0000000);
   2048	fw->shadow_reg[0] = htonl(rd_reg_dword(&reg->iobase_sdata));
   2049
   2050	wrt_reg_dword(&reg->iobase_select, 0xB0100000);
   2051	fw->shadow_reg[1] = htonl(rd_reg_dword(&reg->iobase_sdata));
   2052
   2053	wrt_reg_dword(&reg->iobase_select, 0xB0200000);
   2054	fw->shadow_reg[2] = htonl(rd_reg_dword(&reg->iobase_sdata));
   2055
   2056	wrt_reg_dword(&reg->iobase_select, 0xB0300000);
   2057	fw->shadow_reg[3] = htonl(rd_reg_dword(&reg->iobase_sdata));
   2058
   2059	wrt_reg_dword(&reg->iobase_select, 0xB0400000);
   2060	fw->shadow_reg[4] = htonl(rd_reg_dword(&reg->iobase_sdata));
   2061
   2062	wrt_reg_dword(&reg->iobase_select, 0xB0500000);
   2063	fw->shadow_reg[5] = htonl(rd_reg_dword(&reg->iobase_sdata));
   2064
   2065	wrt_reg_dword(&reg->iobase_select, 0xB0600000);
   2066	fw->shadow_reg[6] = htonl(rd_reg_dword(&reg->iobase_sdata));
   2067
   2068	wrt_reg_dword(&reg->iobase_select, 0xB0700000);
   2069	fw->shadow_reg[7] = htonl(rd_reg_dword(&reg->iobase_sdata));
   2070
   2071	wrt_reg_dword(&reg->iobase_select, 0xB0800000);
   2072	fw->shadow_reg[8] = htonl(rd_reg_dword(&reg->iobase_sdata));
   2073
   2074	wrt_reg_dword(&reg->iobase_select, 0xB0900000);
   2075	fw->shadow_reg[9] = htonl(rd_reg_dword(&reg->iobase_sdata));
   2076
   2077	wrt_reg_dword(&reg->iobase_select, 0xB0A00000);
   2078	fw->shadow_reg[10] = htonl(rd_reg_dword(&reg->iobase_sdata));
   2079
   2080	/* RISC I/O register. */
   2081	wrt_reg_dword(&reg->iobase_addr, 0x0010);
   2082	fw->risc_io_reg = htonl(rd_reg_dword(&reg->iobase_window));
   2083
   2084	/* Mailbox registers. */
   2085	mbx_reg = &reg->mailbox0;
   2086	for (cnt = 0; cnt < ARRAY_SIZE(fw->mailbox_reg); cnt++, mbx_reg++)
   2087		fw->mailbox_reg[cnt] = htons(rd_reg_word(mbx_reg));
   2088
   2089	/* Transfer sequence registers. */
   2090	iter_reg = fw->xseq_gp_reg;
   2091	iter_reg = qla24xx_read_window(reg, 0xBE00, 16, iter_reg);
   2092	iter_reg = qla24xx_read_window(reg, 0xBE10, 16, iter_reg);
   2093	iter_reg = qla24xx_read_window(reg, 0xBE20, 16, iter_reg);
   2094	iter_reg = qla24xx_read_window(reg, 0xBE30, 16, iter_reg);
   2095	iter_reg = qla24xx_read_window(reg, 0xBE40, 16, iter_reg);
   2096	iter_reg = qla24xx_read_window(reg, 0xBE50, 16, iter_reg);
   2097	iter_reg = qla24xx_read_window(reg, 0xBE60, 16, iter_reg);
   2098	iter_reg = qla24xx_read_window(reg, 0xBE70, 16, iter_reg);
   2099	iter_reg = qla24xx_read_window(reg, 0xBF00, 16, iter_reg);
   2100	iter_reg = qla24xx_read_window(reg, 0xBF10, 16, iter_reg);
   2101	iter_reg = qla24xx_read_window(reg, 0xBF20, 16, iter_reg);
   2102	iter_reg = qla24xx_read_window(reg, 0xBF30, 16, iter_reg);
   2103	iter_reg = qla24xx_read_window(reg, 0xBF40, 16, iter_reg);
   2104	iter_reg = qla24xx_read_window(reg, 0xBF50, 16, iter_reg);
   2105	iter_reg = qla24xx_read_window(reg, 0xBF60, 16, iter_reg);
   2106	qla24xx_read_window(reg, 0xBF70, 16, iter_reg);
   2107
   2108	iter_reg = fw->xseq_0_reg;
   2109	iter_reg = qla24xx_read_window(reg, 0xBFC0, 16, iter_reg);
   2110	iter_reg = qla24xx_read_window(reg, 0xBFD0, 16, iter_reg);
   2111	qla24xx_read_window(reg, 0xBFE0, 16, iter_reg);
   2112
   2113	qla24xx_read_window(reg, 0xBFF0, 16, fw->xseq_1_reg);
   2114
   2115	qla24xx_read_window(reg, 0xBEF0, 16, fw->xseq_2_reg);
   2116
   2117	/* Receive sequence registers. */
   2118	iter_reg = fw->rseq_gp_reg;
   2119	iter_reg = qla24xx_read_window(reg, 0xFE00, 16, iter_reg);
   2120	iter_reg = qla24xx_read_window(reg, 0xFE10, 16, iter_reg);
   2121	iter_reg = qla24xx_read_window(reg, 0xFE20, 16, iter_reg);
   2122	iter_reg = qla24xx_read_window(reg, 0xFE30, 16, iter_reg);
   2123	iter_reg = qla24xx_read_window(reg, 0xFE40, 16, iter_reg);
   2124	iter_reg = qla24xx_read_window(reg, 0xFE50, 16, iter_reg);
   2125	iter_reg = qla24xx_read_window(reg, 0xFE60, 16, iter_reg);
   2126	iter_reg = qla24xx_read_window(reg, 0xFE70, 16, iter_reg);
   2127	iter_reg = qla24xx_read_window(reg, 0xFF00, 16, iter_reg);
   2128	iter_reg = qla24xx_read_window(reg, 0xFF10, 16, iter_reg);
   2129	iter_reg = qla24xx_read_window(reg, 0xFF20, 16, iter_reg);
   2130	iter_reg = qla24xx_read_window(reg, 0xFF30, 16, iter_reg);
   2131	iter_reg = qla24xx_read_window(reg, 0xFF40, 16, iter_reg);
   2132	iter_reg = qla24xx_read_window(reg, 0xFF50, 16, iter_reg);
   2133	iter_reg = qla24xx_read_window(reg, 0xFF60, 16, iter_reg);
   2134	qla24xx_read_window(reg, 0xFF70, 16, iter_reg);
   2135
   2136	iter_reg = fw->rseq_0_reg;
   2137	iter_reg = qla24xx_read_window(reg, 0xFFC0, 16, iter_reg);
   2138	qla24xx_read_window(reg, 0xFFD0, 16, iter_reg);
   2139
   2140	qla24xx_read_window(reg, 0xFFE0, 16, fw->rseq_1_reg);
   2141	qla24xx_read_window(reg, 0xFFF0, 16, fw->rseq_2_reg);
   2142	qla24xx_read_window(reg, 0xFEF0, 16, fw->rseq_3_reg);
   2143
   2144	/* Auxiliary sequence registers. */
   2145	iter_reg = fw->aseq_gp_reg;
   2146	iter_reg = qla24xx_read_window(reg, 0xB000, 16, iter_reg);
   2147	iter_reg = qla24xx_read_window(reg, 0xB010, 16, iter_reg);
   2148	iter_reg = qla24xx_read_window(reg, 0xB020, 16, iter_reg);
   2149	iter_reg = qla24xx_read_window(reg, 0xB030, 16, iter_reg);
   2150	iter_reg = qla24xx_read_window(reg, 0xB040, 16, iter_reg);
   2151	iter_reg = qla24xx_read_window(reg, 0xB050, 16, iter_reg);
   2152	iter_reg = qla24xx_read_window(reg, 0xB060, 16, iter_reg);
   2153	iter_reg = qla24xx_read_window(reg, 0xB070, 16, iter_reg);
   2154	iter_reg = qla24xx_read_window(reg, 0xB100, 16, iter_reg);
   2155	iter_reg = qla24xx_read_window(reg, 0xB110, 16, iter_reg);
   2156	iter_reg = qla24xx_read_window(reg, 0xB120, 16, iter_reg);
   2157	iter_reg = qla24xx_read_window(reg, 0xB130, 16, iter_reg);
   2158	iter_reg = qla24xx_read_window(reg, 0xB140, 16, iter_reg);
   2159	iter_reg = qla24xx_read_window(reg, 0xB150, 16, iter_reg);
   2160	iter_reg = qla24xx_read_window(reg, 0xB160, 16, iter_reg);
   2161	qla24xx_read_window(reg, 0xB170, 16, iter_reg);
   2162
   2163	iter_reg = fw->aseq_0_reg;
   2164	iter_reg = qla24xx_read_window(reg, 0xB0C0, 16, iter_reg);
   2165	qla24xx_read_window(reg, 0xB0D0, 16, iter_reg);
   2166
   2167	qla24xx_read_window(reg, 0xB0E0, 16, fw->aseq_1_reg);
   2168	qla24xx_read_window(reg, 0xB0F0, 16, fw->aseq_2_reg);
   2169	qla24xx_read_window(reg, 0xB1F0, 16, fw->aseq_3_reg);
   2170
   2171	/* Command DMA registers. */
   2172	iter_reg = fw->cmd_dma_reg;
   2173	iter_reg = qla24xx_read_window(reg, 0x7100, 16, iter_reg);
   2174	iter_reg = qla24xx_read_window(reg, 0x7120, 16, iter_reg);
   2175	iter_reg = qla24xx_read_window(reg, 0x7130, 16, iter_reg);
   2176	qla24xx_read_window(reg, 0x71F0, 16, iter_reg);
   2177
   2178	/* Queues. */
   2179	iter_reg = fw->req0_dma_reg;
   2180	iter_reg = qla24xx_read_window(reg, 0x7200, 8, iter_reg);
   2181	dmp_reg = &reg->iobase_q;
   2182	for (cnt = 0; cnt < 7; cnt++, dmp_reg++)
   2183		*iter_reg++ = htonl(rd_reg_dword(dmp_reg));
   2184
   2185	iter_reg = fw->resp0_dma_reg;
   2186	iter_reg = qla24xx_read_window(reg, 0x7300, 8, iter_reg);
   2187	dmp_reg = &reg->iobase_q;
   2188	for (cnt = 0; cnt < 7; cnt++, dmp_reg++)
   2189		*iter_reg++ = htonl(rd_reg_dword(dmp_reg));
   2190
   2191	iter_reg = fw->req1_dma_reg;
   2192	iter_reg = qla24xx_read_window(reg, 0x7400, 8, iter_reg);
   2193	dmp_reg = &reg->iobase_q;
   2194	for (cnt = 0; cnt < 7; cnt++, dmp_reg++)
   2195		*iter_reg++ = htonl(rd_reg_dword(dmp_reg));
   2196
   2197	/* Transmit DMA registers. */
   2198	iter_reg = fw->xmt0_dma_reg;
   2199	iter_reg = qla24xx_read_window(reg, 0x7600, 16, iter_reg);
   2200	qla24xx_read_window(reg, 0x7610, 16, iter_reg);
   2201
   2202	iter_reg = fw->xmt1_dma_reg;
   2203	iter_reg = qla24xx_read_window(reg, 0x7620, 16, iter_reg);
   2204	qla24xx_read_window(reg, 0x7630, 16, iter_reg);
   2205
   2206	iter_reg = fw->xmt2_dma_reg;
   2207	iter_reg = qla24xx_read_window(reg, 0x7640, 16, iter_reg);
   2208	qla24xx_read_window(reg, 0x7650, 16, iter_reg);
   2209
   2210	iter_reg = fw->xmt3_dma_reg;
   2211	iter_reg = qla24xx_read_window(reg, 0x7660, 16, iter_reg);
   2212	qla24xx_read_window(reg, 0x7670, 16, iter_reg);
   2213
   2214	iter_reg = fw->xmt4_dma_reg;
   2215	iter_reg = qla24xx_read_window(reg, 0x7680, 16, iter_reg);
   2216	qla24xx_read_window(reg, 0x7690, 16, iter_reg);
   2217
   2218	qla24xx_read_window(reg, 0x76A0, 16, fw->xmt_data_dma_reg);
   2219
   2220	/* Receive DMA registers. */
   2221	iter_reg = fw->rcvt0_data_dma_reg;
   2222	iter_reg = qla24xx_read_window(reg, 0x7700, 16, iter_reg);
   2223	qla24xx_read_window(reg, 0x7710, 16, iter_reg);
   2224
   2225	iter_reg = fw->rcvt1_data_dma_reg;
   2226	iter_reg = qla24xx_read_window(reg, 0x7720, 16, iter_reg);
   2227	qla24xx_read_window(reg, 0x7730, 16, iter_reg);
   2228
   2229	/* RISC registers. */
   2230	iter_reg = fw->risc_gp_reg;
   2231	iter_reg = qla24xx_read_window(reg, 0x0F00, 16, iter_reg);
   2232	iter_reg = qla24xx_read_window(reg, 0x0F10, 16, iter_reg);
   2233	iter_reg = qla24xx_read_window(reg, 0x0F20, 16, iter_reg);
   2234	iter_reg = qla24xx_read_window(reg, 0x0F30, 16, iter_reg);
   2235	iter_reg = qla24xx_read_window(reg, 0x0F40, 16, iter_reg);
   2236	iter_reg = qla24xx_read_window(reg, 0x0F50, 16, iter_reg);
   2237	iter_reg = qla24xx_read_window(reg, 0x0F60, 16, iter_reg);
   2238	qla24xx_read_window(reg, 0x0F70, 16, iter_reg);
   2239
   2240	/* Local memory controller registers. */
   2241	iter_reg = fw->lmc_reg;
   2242	iter_reg = qla24xx_read_window(reg, 0x3000, 16, iter_reg);
   2243	iter_reg = qla24xx_read_window(reg, 0x3010, 16, iter_reg);
   2244	iter_reg = qla24xx_read_window(reg, 0x3020, 16, iter_reg);
   2245	iter_reg = qla24xx_read_window(reg, 0x3030, 16, iter_reg);
   2246	iter_reg = qla24xx_read_window(reg, 0x3040, 16, iter_reg);
   2247	iter_reg = qla24xx_read_window(reg, 0x3050, 16, iter_reg);
   2248	iter_reg = qla24xx_read_window(reg, 0x3060, 16, iter_reg);
   2249	qla24xx_read_window(reg, 0x3070, 16, iter_reg);
   2250
   2251	/* Fibre Protocol Module registers. */
   2252	iter_reg = fw->fpm_hdw_reg;
   2253	iter_reg = qla24xx_read_window(reg, 0x4000, 16, iter_reg);
   2254	iter_reg = qla24xx_read_window(reg, 0x4010, 16, iter_reg);
   2255	iter_reg = qla24xx_read_window(reg, 0x4020, 16, iter_reg);
   2256	iter_reg = qla24xx_read_window(reg, 0x4030, 16, iter_reg);
   2257	iter_reg = qla24xx_read_window(reg, 0x4040, 16, iter_reg);
   2258	iter_reg = qla24xx_read_window(reg, 0x4050, 16, iter_reg);
   2259	iter_reg = qla24xx_read_window(reg, 0x4060, 16, iter_reg);
   2260	iter_reg = qla24xx_read_window(reg, 0x4070, 16, iter_reg);
   2261	iter_reg = qla24xx_read_window(reg, 0x4080, 16, iter_reg);
   2262	iter_reg = qla24xx_read_window(reg, 0x4090, 16, iter_reg);
   2263	iter_reg = qla24xx_read_window(reg, 0x40A0, 16, iter_reg);
   2264	iter_reg = qla24xx_read_window(reg, 0x40B0, 16, iter_reg);
   2265	iter_reg = qla24xx_read_window(reg, 0x40C0, 16, iter_reg);
   2266	iter_reg = qla24xx_read_window(reg, 0x40D0, 16, iter_reg);
   2267	iter_reg = qla24xx_read_window(reg, 0x40E0, 16, iter_reg);
   2268	qla24xx_read_window(reg, 0x40F0, 16, iter_reg);
   2269
   2270	/* RQ0 Array registers. */
   2271	iter_reg = fw->rq0_array_reg;
   2272	iter_reg = qla24xx_read_window(reg, 0x5C00, 16, iter_reg);
   2273	iter_reg = qla24xx_read_window(reg, 0x5C10, 16, iter_reg);
   2274	iter_reg = qla24xx_read_window(reg, 0x5C20, 16, iter_reg);
   2275	iter_reg = qla24xx_read_window(reg, 0x5C30, 16, iter_reg);
   2276	iter_reg = qla24xx_read_window(reg, 0x5C40, 16, iter_reg);
   2277	iter_reg = qla24xx_read_window(reg, 0x5C50, 16, iter_reg);
   2278	iter_reg = qla24xx_read_window(reg, 0x5C60, 16, iter_reg);
   2279	iter_reg = qla24xx_read_window(reg, 0x5C70, 16, iter_reg);
   2280	iter_reg = qla24xx_read_window(reg, 0x5C80, 16, iter_reg);
   2281	iter_reg = qla24xx_read_window(reg, 0x5C90, 16, iter_reg);
   2282	iter_reg = qla24xx_read_window(reg, 0x5CA0, 16, iter_reg);
   2283	iter_reg = qla24xx_read_window(reg, 0x5CB0, 16, iter_reg);
   2284	iter_reg = qla24xx_read_window(reg, 0x5CC0, 16, iter_reg);
   2285	iter_reg = qla24xx_read_window(reg, 0x5CD0, 16, iter_reg);
   2286	iter_reg = qla24xx_read_window(reg, 0x5CE0, 16, iter_reg);
   2287	qla24xx_read_window(reg, 0x5CF0, 16, iter_reg);
   2288
   2289	/* RQ1 Array registers. */
   2290	iter_reg = fw->rq1_array_reg;
   2291	iter_reg = qla24xx_read_window(reg, 0x5D00, 16, iter_reg);
   2292	iter_reg = qla24xx_read_window(reg, 0x5D10, 16, iter_reg);
   2293	iter_reg = qla24xx_read_window(reg, 0x5D20, 16, iter_reg);
   2294	iter_reg = qla24xx_read_window(reg, 0x5D30, 16, iter_reg);
   2295	iter_reg = qla24xx_read_window(reg, 0x5D40, 16, iter_reg);
   2296	iter_reg = qla24xx_read_window(reg, 0x5D50, 16, iter_reg);
   2297	iter_reg = qla24xx_read_window(reg, 0x5D60, 16, iter_reg);
   2298	iter_reg = qla24xx_read_window(reg, 0x5D70, 16, iter_reg);
   2299	iter_reg = qla24xx_read_window(reg, 0x5D80, 16, iter_reg);
   2300	iter_reg = qla24xx_read_window(reg, 0x5D90, 16, iter_reg);
   2301	iter_reg = qla24xx_read_window(reg, 0x5DA0, 16, iter_reg);
   2302	iter_reg = qla24xx_read_window(reg, 0x5DB0, 16, iter_reg);
   2303	iter_reg = qla24xx_read_window(reg, 0x5DC0, 16, iter_reg);
   2304	iter_reg = qla24xx_read_window(reg, 0x5DD0, 16, iter_reg);
   2305	iter_reg = qla24xx_read_window(reg, 0x5DE0, 16, iter_reg);
   2306	qla24xx_read_window(reg, 0x5DF0, 16, iter_reg);
   2307
   2308	/* RP0 Array registers. */
   2309	iter_reg = fw->rp0_array_reg;
   2310	iter_reg = qla24xx_read_window(reg, 0x5E00, 16, iter_reg);
   2311	iter_reg = qla24xx_read_window(reg, 0x5E10, 16, iter_reg);
   2312	iter_reg = qla24xx_read_window(reg, 0x5E20, 16, iter_reg);
   2313	iter_reg = qla24xx_read_window(reg, 0x5E30, 16, iter_reg);
   2314	iter_reg = qla24xx_read_window(reg, 0x5E40, 16, iter_reg);
   2315	iter_reg = qla24xx_read_window(reg, 0x5E50, 16, iter_reg);
   2316	iter_reg = qla24xx_read_window(reg, 0x5E60, 16, iter_reg);
   2317	iter_reg = qla24xx_read_window(reg, 0x5E70, 16, iter_reg);
   2318	iter_reg = qla24xx_read_window(reg, 0x5E80, 16, iter_reg);
   2319	iter_reg = qla24xx_read_window(reg, 0x5E90, 16, iter_reg);
   2320	iter_reg = qla24xx_read_window(reg, 0x5EA0, 16, iter_reg);
   2321	iter_reg = qla24xx_read_window(reg, 0x5EB0, 16, iter_reg);
   2322	iter_reg = qla24xx_read_window(reg, 0x5EC0, 16, iter_reg);
   2323	iter_reg = qla24xx_read_window(reg, 0x5ED0, 16, iter_reg);
   2324	iter_reg = qla24xx_read_window(reg, 0x5EE0, 16, iter_reg);
   2325	qla24xx_read_window(reg, 0x5EF0, 16, iter_reg);
   2326
   2327	/* RP1 Array registers. */
   2328	iter_reg = fw->rp1_array_reg;
   2329	iter_reg = qla24xx_read_window(reg, 0x5F00, 16, iter_reg);
   2330	iter_reg = qla24xx_read_window(reg, 0x5F10, 16, iter_reg);
   2331	iter_reg = qla24xx_read_window(reg, 0x5F20, 16, iter_reg);
   2332	iter_reg = qla24xx_read_window(reg, 0x5F30, 16, iter_reg);
   2333	iter_reg = qla24xx_read_window(reg, 0x5F40, 16, iter_reg);
   2334	iter_reg = qla24xx_read_window(reg, 0x5F50, 16, iter_reg);
   2335	iter_reg = qla24xx_read_window(reg, 0x5F60, 16, iter_reg);
   2336	iter_reg = qla24xx_read_window(reg, 0x5F70, 16, iter_reg);
   2337	iter_reg = qla24xx_read_window(reg, 0x5F80, 16, iter_reg);
   2338	iter_reg = qla24xx_read_window(reg, 0x5F90, 16, iter_reg);
   2339	iter_reg = qla24xx_read_window(reg, 0x5FA0, 16, iter_reg);
   2340	iter_reg = qla24xx_read_window(reg, 0x5FB0, 16, iter_reg);
   2341	iter_reg = qla24xx_read_window(reg, 0x5FC0, 16, iter_reg);
   2342	iter_reg = qla24xx_read_window(reg, 0x5FD0, 16, iter_reg);
   2343	iter_reg = qla24xx_read_window(reg, 0x5FE0, 16, iter_reg);
   2344	qla24xx_read_window(reg, 0x5FF0, 16, iter_reg);
   2345
   2346	iter_reg = fw->at0_array_reg;
   2347	iter_reg = qla24xx_read_window(reg, 0x7080, 16, iter_reg);
   2348	iter_reg = qla24xx_read_window(reg, 0x7090, 16, iter_reg);
   2349	iter_reg = qla24xx_read_window(reg, 0x70A0, 16, iter_reg);
   2350	iter_reg = qla24xx_read_window(reg, 0x70B0, 16, iter_reg);
   2351	iter_reg = qla24xx_read_window(reg, 0x70C0, 16, iter_reg);
   2352	iter_reg = qla24xx_read_window(reg, 0x70D0, 16, iter_reg);
   2353	iter_reg = qla24xx_read_window(reg, 0x70E0, 16, iter_reg);
   2354	qla24xx_read_window(reg, 0x70F0, 16, iter_reg);
   2355
   2356	/* I/O Queue Control registers. */
   2357	qla24xx_read_window(reg, 0x7800, 16, fw->queue_control_reg);
   2358
   2359	/* Frame Buffer registers. */
   2360	iter_reg = fw->fb_hdw_reg;
   2361	iter_reg = qla24xx_read_window(reg, 0x6000, 16, iter_reg);
   2362	iter_reg = qla24xx_read_window(reg, 0x6010, 16, iter_reg);
   2363	iter_reg = qla24xx_read_window(reg, 0x6020, 16, iter_reg);
   2364	iter_reg = qla24xx_read_window(reg, 0x6030, 16, iter_reg);
   2365	iter_reg = qla24xx_read_window(reg, 0x6040, 16, iter_reg);
   2366	iter_reg = qla24xx_read_window(reg, 0x6060, 16, iter_reg);
   2367	iter_reg = qla24xx_read_window(reg, 0x6070, 16, iter_reg);
   2368	iter_reg = qla24xx_read_window(reg, 0x6100, 16, iter_reg);
   2369	iter_reg = qla24xx_read_window(reg, 0x6130, 16, iter_reg);
   2370	iter_reg = qla24xx_read_window(reg, 0x6150, 16, iter_reg);
   2371	iter_reg = qla24xx_read_window(reg, 0x6170, 16, iter_reg);
   2372	iter_reg = qla24xx_read_window(reg, 0x6190, 16, iter_reg);
   2373	iter_reg = qla24xx_read_window(reg, 0x61B0, 16, iter_reg);
   2374	iter_reg = qla24xx_read_window(reg, 0x61C0, 16, iter_reg);
   2375	iter_reg = qla24xx_read_window(reg, 0x6530, 16, iter_reg);
   2376	iter_reg = qla24xx_read_window(reg, 0x6540, 16, iter_reg);
   2377	iter_reg = qla24xx_read_window(reg, 0x6550, 16, iter_reg);
   2378	iter_reg = qla24xx_read_window(reg, 0x6560, 16, iter_reg);
   2379	iter_reg = qla24xx_read_window(reg, 0x6570, 16, iter_reg);
   2380	iter_reg = qla24xx_read_window(reg, 0x6580, 16, iter_reg);
   2381	iter_reg = qla24xx_read_window(reg, 0x6590, 16, iter_reg);
   2382	iter_reg = qla24xx_read_window(reg, 0x65A0, 16, iter_reg);
   2383	iter_reg = qla24xx_read_window(reg, 0x65B0, 16, iter_reg);
   2384	iter_reg = qla24xx_read_window(reg, 0x65C0, 16, iter_reg);
   2385	iter_reg = qla24xx_read_window(reg, 0x65D0, 16, iter_reg);
   2386	iter_reg = qla24xx_read_window(reg, 0x65E0, 16, iter_reg);
   2387	qla24xx_read_window(reg, 0x6F00, 16, iter_reg);
   2388
   2389	/* Multi queue registers */
   2390	nxt_chain = qla25xx_copy_mq(ha, (void *)ha->fw_dump + ha->chain_offset,
   2391	    &last_chain);
   2392
   2393	rval = qla24xx_soft_reset(ha);
   2394	if (rval != QLA_SUCCESS) {
   2395		ql_log(ql_log_warn, vha, 0xd00e,
   2396		    "SOFT RESET FAILED, forcing continuation of dump!!!\n");
   2397		rval = QLA_SUCCESS;
   2398
   2399		ql_log(ql_log_warn, vha, 0xd00f, "try a bigger hammer!!!\n");
   2400
   2401		wrt_reg_dword(&reg->hccr, HCCRX_SET_RISC_RESET);
   2402		rd_reg_dword(&reg->hccr);
   2403
   2404		wrt_reg_dword(&reg->hccr, HCCRX_REL_RISC_PAUSE);
   2405		rd_reg_dword(&reg->hccr);
   2406
   2407		wrt_reg_dword(&reg->hccr, HCCRX_CLR_RISC_RESET);
   2408		rd_reg_dword(&reg->hccr);
   2409
   2410		for (cnt = 30000; cnt && (rd_reg_word(&reg->mailbox0)); cnt--)
   2411			udelay(5);
   2412
   2413		if (!cnt) {
   2414			nxt = fw->code_ram;
   2415			nxt += sizeof(fw->code_ram);
   2416			nxt += (ha->fw_memory_size - 0x100000 + 1);
   2417			goto copy_queue;
   2418		} else {
   2419			set_bit(RISC_RDY_AFT_RESET, &ha->fw_dump_cap_flags);
   2420			ql_log(ql_log_warn, vha, 0xd010,
   2421			    "bigger hammer success?\n");
   2422		}
   2423	}
   2424
   2425	rval = qla24xx_dump_memory(ha, fw->code_ram, sizeof(fw->code_ram),
   2426	    &nxt);
   2427	if (rval != QLA_SUCCESS)
   2428		goto qla83xx_fw_dump_failed_0;
   2429
   2430copy_queue:
   2431	nxt = qla2xxx_copy_queues(ha, nxt);
   2432
   2433	qla24xx_copy_eft(ha, nxt);
   2434
   2435	/* Chain entries -- started with MQ. */
   2436	nxt_chain = qla25xx_copy_fce(ha, nxt_chain, &last_chain);
   2437	nxt_chain = qla25xx_copy_mqueues(ha, nxt_chain, &last_chain);
   2438	nxt_chain = qla2xxx_copy_atioqueues(ha, nxt_chain, &last_chain);
   2439	nxt_chain = qla25xx_copy_exlogin(ha, nxt_chain, &last_chain);
   2440	nxt_chain = qla81xx_copy_exchoffld(ha, nxt_chain, &last_chain);
   2441	if (last_chain) {
   2442		ha->fw_dump->version |= htonl(DUMP_CHAIN_VARIANT);
   2443		*last_chain |= htonl(DUMP_CHAIN_LAST);
   2444	}
   2445
   2446	/* Adjust valid length. */
   2447	ha->fw_dump_len = (nxt_chain - (void *)ha->fw_dump);
   2448
   2449qla83xx_fw_dump_failed_0:
   2450	qla2xxx_dump_post_process(base_vha, rval);
   2451}
   2452
   2453/****************************************************************************/
   2454/*                         Driver Debug Functions.                          */
   2455/****************************************************************************/
   2456
   2457/* Write the debug message prefix into @pbuf. */
   2458static void ql_dbg_prefix(char *pbuf, int pbuf_size,
   2459			  const scsi_qla_host_t *vha, uint msg_id)
   2460{
   2461	if (vha) {
   2462		const struct pci_dev *pdev = vha->hw->pdev;
   2463
   2464		/* <module-name> [<dev-name>]-<msg-id>:<host>: */
   2465		snprintf(pbuf, pbuf_size, "%s [%s]-%04x:%lu: ", QL_MSGHDR,
   2466			 dev_name(&(pdev->dev)), msg_id, vha->host_no);
   2467	} else {
   2468		/* <module-name> [<dev-name>]-<msg-id>: : */
   2469		snprintf(pbuf, pbuf_size, "%s [%s]-%04x: : ", QL_MSGHDR,
   2470			 "0000:00:00.0", msg_id);
   2471	}
   2472}
   2473
   2474/*
   2475 * This function is for formatting and logging debug information.
   2476 * It is to be used when vha is available. It formats the message
   2477 * and logs it to the messages file.
   2478 * parameters:
   2479 * level: The level of the debug messages to be printed.
   2480 *        If ql2xextended_error_logging value is correctly set,
   2481 *        this message will appear in the messages file.
   2482 * vha:   Pointer to the scsi_qla_host_t.
   2483 * id:    This is a unique identifier for the level. It identifies the
   2484 *        part of the code from where the message originated.
   2485 * msg:   The message to be displayed.
   2486 */
   2487void
   2488ql_dbg(uint level, scsi_qla_host_t *vha, uint id, const char *fmt, ...)
   2489{
   2490	va_list va;
   2491	struct va_format vaf;
   2492	char pbuf[64];
   2493
   2494	if (!ql_mask_match(level) && !trace_ql_dbg_log_enabled())
   2495		return;
   2496
   2497	va_start(va, fmt);
   2498
   2499	vaf.fmt = fmt;
   2500	vaf.va = &va;
   2501
   2502	ql_dbg_prefix(pbuf, ARRAY_SIZE(pbuf), vha, id);
   2503
   2504	if (!ql_mask_match(level))
   2505		trace_ql_dbg_log(pbuf, &vaf);
   2506	else
   2507		pr_warn("%s%pV", pbuf, &vaf);
   2508
   2509	va_end(va);
   2510
   2511}
   2512
   2513/*
   2514 * This function is for formatting and logging debug information.
   2515 * It is to be used when vha is not available and pci is available,
   2516 * i.e., before host allocation. It formats the message and logs it
   2517 * to the messages file.
   2518 * parameters:
   2519 * level: The level of the debug messages to be printed.
   2520 *        If ql2xextended_error_logging value is correctly set,
   2521 *        this message will appear in the messages file.
   2522 * pdev:  Pointer to the struct pci_dev.
   2523 * id:    This is a unique id for the level. It identifies the part
   2524 *        of the code from where the message originated.
   2525 * msg:   The message to be displayed.
   2526 */
   2527void
   2528ql_dbg_pci(uint level, struct pci_dev *pdev, uint id, const char *fmt, ...)
   2529{
   2530	va_list va;
   2531	struct va_format vaf;
   2532	char pbuf[128];
   2533
   2534	if (pdev == NULL)
   2535		return;
   2536	if (!ql_mask_match(level))
   2537		return;
   2538
   2539	va_start(va, fmt);
   2540
   2541	vaf.fmt = fmt;
   2542	vaf.va = &va;
   2543
   2544	ql_dbg_prefix(pbuf, ARRAY_SIZE(pbuf), NULL, id + ql_dbg_offset);
   2545	pr_warn("%s%pV", pbuf, &vaf);
   2546
   2547	va_end(va);
   2548}
   2549
   2550/*
   2551 * This function is for formatting and logging log messages.
   2552 * It is to be used when vha is available. It formats the message
   2553 * and logs it to the messages file. All the messages will be logged
   2554 * irrespective of value of ql2xextended_error_logging.
   2555 * parameters:
   2556 * level: The level of the log messages to be printed in the
   2557 *        messages file.
   2558 * vha:   Pointer to the scsi_qla_host_t
   2559 * id:    This is a unique id for the level. It identifies the
   2560 *        part of the code from where the message originated.
   2561 * msg:   The message to be displayed.
   2562 */
   2563void
   2564ql_log(uint level, scsi_qla_host_t *vha, uint id, const char *fmt, ...)
   2565{
   2566	va_list va;
   2567	struct va_format vaf;
   2568	char pbuf[128];
   2569
   2570	if (level > ql_errlev)
   2571		return;
   2572
   2573	ql_dbg_prefix(pbuf, ARRAY_SIZE(pbuf), vha, id);
   2574
   2575	va_start(va, fmt);
   2576
   2577	vaf.fmt = fmt;
   2578	vaf.va = &va;
   2579
   2580	switch (level) {
   2581	case ql_log_fatal: /* FATAL LOG */
   2582		pr_crit("%s%pV", pbuf, &vaf);
   2583		break;
   2584	case ql_log_warn:
   2585		pr_err("%s%pV", pbuf, &vaf);
   2586		break;
   2587	case ql_log_info:
   2588		pr_warn("%s%pV", pbuf, &vaf);
   2589		break;
   2590	default:
   2591		pr_info("%s%pV", pbuf, &vaf);
   2592		break;
   2593	}
   2594
   2595	va_end(va);
   2596}
   2597
   2598/*
   2599 * This function is for formatting and logging log messages.
   2600 * It is to be used when vha is not available and pci is available,
   2601 * i.e., before host allocation. It formats the message and logs
   2602 * it to the messages file. All the messages are logged irrespective
   2603 * of the value of ql2xextended_error_logging.
   2604 * parameters:
   2605 * level: The level of the log messages to be printed in the
   2606 *        messages file.
   2607 * pdev:  Pointer to the struct pci_dev.
   2608 * id:    This is a unique id for the level. It identifies the
   2609 *        part of the code from where the message originated.
   2610 * msg:   The message to be displayed.
   2611 */
   2612void
   2613ql_log_pci(uint level, struct pci_dev *pdev, uint id, const char *fmt, ...)
   2614{
   2615	va_list va;
   2616	struct va_format vaf;
   2617	char pbuf[128];
   2618
   2619	if (pdev == NULL)
   2620		return;
   2621	if (level > ql_errlev)
   2622		return;
   2623
   2624	ql_dbg_prefix(pbuf, ARRAY_SIZE(pbuf), NULL, id);
   2625
   2626	va_start(va, fmt);
   2627
   2628	vaf.fmt = fmt;
   2629	vaf.va = &va;
   2630
   2631	switch (level) {
   2632	case ql_log_fatal: /* FATAL LOG */
   2633		pr_crit("%s%pV", pbuf, &vaf);
   2634		break;
   2635	case ql_log_warn:
   2636		pr_err("%s%pV", pbuf, &vaf);
   2637		break;
   2638	case ql_log_info:
   2639		pr_warn("%s%pV", pbuf, &vaf);
   2640		break;
   2641	default:
   2642		pr_info("%s%pV", pbuf, &vaf);
   2643		break;
   2644	}
   2645
   2646	va_end(va);
   2647}
   2648
   2649void
   2650ql_dump_regs(uint level, scsi_qla_host_t *vha, uint id)
   2651{
   2652	int i;
   2653	struct qla_hw_data *ha = vha->hw;
   2654	struct device_reg_2xxx __iomem *reg = &ha->iobase->isp;
   2655	struct device_reg_24xx __iomem *reg24 = &ha->iobase->isp24;
   2656	struct device_reg_82xx __iomem *reg82 = &ha->iobase->isp82;
   2657	__le16 __iomem *mbx_reg;
   2658
   2659	if (!ql_mask_match(level))
   2660		return;
   2661
   2662	if (IS_P3P_TYPE(ha))
   2663		mbx_reg = &reg82->mailbox_in[0];
   2664	else if (IS_FWI2_CAPABLE(ha))
   2665		mbx_reg = &reg24->mailbox0;
   2666	else
   2667		mbx_reg = MAILBOX_REG(ha, reg, 0);
   2668
   2669	ql_dbg(level, vha, id, "Mailbox registers:\n");
   2670	for (i = 0; i < 6; i++, mbx_reg++)
   2671		ql_dbg(level, vha, id,
   2672		    "mbox[%d] %#04x\n", i, rd_reg_word(mbx_reg));
   2673}
   2674
   2675void
   2676ql_dump_buffer(uint level, scsi_qla_host_t *vha, uint id, const void *buf,
   2677	       uint size)
   2678{
   2679	uint cnt;
   2680
   2681	if (!ql_mask_match(level))
   2682		return;
   2683
   2684	ql_dbg(level, vha, id,
   2685	    "%-+5d  0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F\n", size);
   2686	ql_dbg(level, vha, id,
   2687	    "----- -----------------------------------------------\n");
   2688	for (cnt = 0; cnt < size; cnt += 16) {
   2689		ql_dbg(level, vha, id, "%04x: ", cnt);
   2690		print_hex_dump(KERN_CONT, "", DUMP_PREFIX_NONE, 16, 1,
   2691			       buf + cnt, min(16U, size - cnt), false);
   2692	}
   2693}
   2694
   2695/*
   2696 * This function is for formatting and logging log messages.
   2697 * It is to be used when vha is available. It formats the message
   2698 * and logs it to the messages file. All the messages will be logged
   2699 * irrespective of value of ql2xextended_error_logging.
   2700 * parameters:
   2701 * level: The level of the log messages to be printed in the
   2702 *        messages file.
   2703 * vha:   Pointer to the scsi_qla_host_t
   2704 * id:    This is a unique id for the level. It identifies the
   2705 *        part of the code from where the message originated.
   2706 * msg:   The message to be displayed.
   2707 */
   2708void
   2709ql_log_qp(uint32_t level, struct qla_qpair *qpair, int32_t id,
   2710    const char *fmt, ...)
   2711{
   2712	va_list va;
   2713	struct va_format vaf;
   2714	char pbuf[128];
   2715
   2716	if (level > ql_errlev)
   2717		return;
   2718
   2719	ql_dbg_prefix(pbuf, ARRAY_SIZE(pbuf), qpair ? qpair->vha : NULL, id);
   2720
   2721	va_start(va, fmt);
   2722
   2723	vaf.fmt = fmt;
   2724	vaf.va = &va;
   2725
   2726	switch (level) {
   2727	case ql_log_fatal: /* FATAL LOG */
   2728		pr_crit("%s%pV", pbuf, &vaf);
   2729		break;
   2730	case ql_log_warn:
   2731		pr_err("%s%pV", pbuf, &vaf);
   2732		break;
   2733	case ql_log_info:
   2734		pr_warn("%s%pV", pbuf, &vaf);
   2735		break;
   2736	default:
   2737		pr_info("%s%pV", pbuf, &vaf);
   2738		break;
   2739	}
   2740
   2741	va_end(va);
   2742}
   2743
   2744/*
   2745 * This function is for formatting and logging debug information.
   2746 * It is to be used when vha is available. It formats the message
   2747 * and logs it to the messages file.
   2748 * parameters:
   2749 * level: The level of the debug messages to be printed.
   2750 *        If ql2xextended_error_logging value is correctly set,
   2751 *        this message will appear in the messages file.
   2752 * vha:   Pointer to the scsi_qla_host_t.
   2753 * id:    This is a unique identifier for the level. It identifies the
   2754 *        part of the code from where the message originated.
   2755 * msg:   The message to be displayed.
   2756 */
   2757void
   2758ql_dbg_qp(uint32_t level, struct qla_qpair *qpair, int32_t id,
   2759    const char *fmt, ...)
   2760{
   2761	va_list va;
   2762	struct va_format vaf;
   2763	char pbuf[128];
   2764
   2765	if (!ql_mask_match(level))
   2766		return;
   2767
   2768	va_start(va, fmt);
   2769
   2770	vaf.fmt = fmt;
   2771	vaf.va = &va;
   2772
   2773	ql_dbg_prefix(pbuf, ARRAY_SIZE(pbuf), qpair ? qpair->vha : NULL,
   2774		      id + ql_dbg_offset);
   2775	pr_warn("%s%pV", pbuf, &vaf);
   2776
   2777	va_end(va);
   2778
   2779}