qla_dbg.c

来自「linux 内核源代码」· C语言 代码 · 共 1,528 行 · 第 1/3 页

C
1,528
字号
		data_ram_cnt = ha->fw_memory_size - risc_address + 1; 		WRT_MAILBOX_REG(ha, reg, 0, MBC_READ_RAM_EXTENDED);		clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);	}	for (cnt = 0; cnt < data_ram_cnt && rval == QLA_SUCCESS;	    cnt++, risc_address++) { 		WRT_MAILBOX_REG(ha, reg, 1, LSW(risc_address)); 		WRT_MAILBOX_REG(ha, reg, 8, MSW(risc_address));		WRT_REG_WORD(&reg->hccr, HCCR_SET_HOST_INT);		for (timer = 6000000; timer; timer--) {			/* Check for pending interrupts. */ 			stat = RD_REG_DWORD(&reg->u.isp2300.host_status);			if (stat & HSR_RISC_INT) {				stat &= 0xff;				if (stat == 0x1 || stat == 0x2) {					set_bit(MBX_INTERRUPT,					    &ha->mbx_cmd_flags);					mb0 = RD_MAILBOX_REG(ha, reg, 0);					mb2 = RD_MAILBOX_REG(ha, reg, 2);					/* Release mailbox registers. */					WRT_REG_WORD(&reg->semaphore, 0);					WRT_REG_WORD(&reg->hccr,					    HCCR_CLR_RISC_INT);					RD_REG_WORD(&reg->hccr);					break;				} else if (stat == 0x10 || stat == 0x11) {					set_bit(MBX_INTERRUPT,					    &ha->mbx_cmd_flags);					mb0 = RD_MAILBOX_REG(ha, reg, 0);					mb2 = RD_MAILBOX_REG(ha, reg, 2);					WRT_REG_WORD(&reg->hccr,					    HCCR_CLR_RISC_INT);					RD_REG_WORD(&reg->hccr);					break;				}				/* clear this intr; it wasn't a mailbox intr */				WRT_REG_WORD(&reg->hccr, HCCR_CLR_RISC_INT);				RD_REG_WORD(&reg->hccr);			}			udelay(5);		}		if (test_and_clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags)) {			rval = mb0 & MBS_MASK;			fw->data_ram[cnt] = htons(mb2);		} else {			rval = QLA_FUNCTION_FAILED;		}	}	if (rval == QLA_SUCCESS)		qla2xxx_copy_queues(ha, &fw->data_ram[cnt]);	if (rval != QLA_SUCCESS) {		qla_printk(KERN_WARNING, ha,		    "Failed to dump firmware (%x)!!!\n", rval);		ha->fw_dumped = 0;	} else {		qla_printk(KERN_INFO, ha,		    "Firmware dump saved to temp buffer (%ld/%p).\n",		    ha->host_no, ha->fw_dump);		ha->fw_dumped = 1;	}qla2300_fw_dump_failed:	if (!hardware_locked)		spin_unlock_irqrestore(&ha->hardware_lock, flags);}/** * qla2100_fw_dump() - Dumps binary data from the 2100/2200 firmware. * @ha: HA context * @hardware_locked: Called with the hardware_lock */voidqla2100_fw_dump(scsi_qla_host_t *ha, int hardware_locked){	int		rval;	uint32_t	cnt, timer;	uint16_t	risc_address;	uint16_t	mb0, mb2;	struct device_reg_2xxx __iomem *reg = &ha->iobase->isp;	uint16_t __iomem *dmp_reg;	unsigned long	flags;	struct qla2100_fw_dump	*fw;	risc_address = 0;	mb0 = mb2 = 0;	flags = 0;	if (!hardware_locked)		spin_lock_irqsave(&ha->hardware_lock, flags);	if (!ha->fw_dump) {		qla_printk(KERN_WARNING, ha,		    "No buffer available for dump!!!\n");		goto qla2100_fw_dump_failed;	}	if (ha->fw_dumped) {		qla_printk(KERN_WARNING, ha,		    "Firmware has been previously dumped (%p) -- ignoring "		    "request...\n", ha->fw_dump);		goto qla2100_fw_dump_failed;	}	fw = &ha->fw_dump->isp.isp21;	qla2xxx_prep_dump(ha, ha->fw_dump);	rval = QLA_SUCCESS;	fw->hccr = htons(RD_REG_WORD(&reg->hccr));	/* Pause RISC. */	WRT_REG_WORD(&reg->hccr, HCCR_PAUSE_RISC);	for (cnt = 30000; (RD_REG_WORD(&reg->hccr) & HCCR_RISC_PAUSE) == 0 &&	    rval == QLA_SUCCESS; cnt--) {		if (cnt)			udelay(100);		else			rval = QLA_FUNCTION_TIMEOUT;	}	if (rval == QLA_SUCCESS) {		dmp_reg = &reg->flash_address;		for (cnt = 0; cnt < sizeof(fw->pbiu_reg) / 2; cnt++)			fw->pbiu_reg[cnt] = htons(RD_REG_WORD(dmp_reg++));		dmp_reg = &reg->u.isp2100.mailbox0;		for (cnt = 0; cnt < ha->mbx_count; cnt++) {			if (cnt == 8)				dmp_reg = &reg->u_end.isp2200.mailbox8;			fw->mailbox_reg[cnt] = htons(RD_REG_WORD(dmp_reg++));		}		dmp_reg = &reg->u.isp2100.unused_2[0];		for (cnt = 0; cnt < sizeof(fw->dma_reg) / 2; cnt++)			fw->dma_reg[cnt] = htons(RD_REG_WORD(dmp_reg++));		WRT_REG_WORD(&reg->ctrl_status, 0x00);		dmp_reg = &reg->risc_hw;		for (cnt = 0; cnt < sizeof(fw->risc_hdw_reg) / 2; cnt++)			fw->risc_hdw_reg[cnt] = htons(RD_REG_WORD(dmp_reg++));		WRT_REG_WORD(&reg->pcr, 0x2000);		qla2xxx_read_window(reg, 16, fw->risc_gp0_reg);		WRT_REG_WORD(&reg->pcr, 0x2100);		qla2xxx_read_window(reg, 16, fw->risc_gp1_reg);		WRT_REG_WORD(&reg->pcr, 0x2200);		qla2xxx_read_window(reg, 16, fw->risc_gp2_reg);		WRT_REG_WORD(&reg->pcr, 0x2300);		qla2xxx_read_window(reg, 16, fw->risc_gp3_reg);		WRT_REG_WORD(&reg->pcr, 0x2400);		qla2xxx_read_window(reg, 16, fw->risc_gp4_reg);		WRT_REG_WORD(&reg->pcr, 0x2500);		qla2xxx_read_window(reg, 16, fw->risc_gp5_reg);		WRT_REG_WORD(&reg->pcr, 0x2600);		qla2xxx_read_window(reg, 16, fw->risc_gp6_reg);		WRT_REG_WORD(&reg->pcr, 0x2700);		qla2xxx_read_window(reg, 16, fw->risc_gp7_reg);		WRT_REG_WORD(&reg->ctrl_status, 0x10);		qla2xxx_read_window(reg, 16, fw->frame_buf_hdw_reg);		WRT_REG_WORD(&reg->ctrl_status, 0x20);		qla2xxx_read_window(reg, 64, fw->fpm_b0_reg);		WRT_REG_WORD(&reg->ctrl_status, 0x30);		qla2xxx_read_window(reg, 64, fw->fpm_b1_reg);		/* Reset the ISP. */		WRT_REG_WORD(&reg->ctrl_status, CSR_ISP_SOFT_RESET);	}	for (cnt = 30000; RD_MAILBOX_REG(ha, reg, 0) != 0 &&	    rval == QLA_SUCCESS; cnt--) {		if (cnt)			udelay(100);		else			rval = QLA_FUNCTION_TIMEOUT;	}	/* Pause RISC. */	if (rval == QLA_SUCCESS && (IS_QLA2200(ha) || (IS_QLA2100(ha) &&	    (RD_REG_WORD(&reg->mctr) & (BIT_1 | BIT_0)) != 0))) {		WRT_REG_WORD(&reg->hccr, HCCR_PAUSE_RISC);		for (cnt = 30000;		    (RD_REG_WORD(&reg->hccr) & HCCR_RISC_PAUSE) == 0 &&		    rval == QLA_SUCCESS; cnt--) {			if (cnt)				udelay(100);			else				rval = QLA_FUNCTION_TIMEOUT;		}		if (rval == QLA_SUCCESS) {			/* Set memory configuration and timing. */			if (IS_QLA2100(ha))				WRT_REG_WORD(&reg->mctr, 0xf1);			else				WRT_REG_WORD(&reg->mctr, 0xf2);			RD_REG_WORD(&reg->mctr);	/* PCI Posting. */			/* Release RISC. */			WRT_REG_WORD(&reg->hccr, HCCR_RELEASE_RISC);		}	}	if (rval == QLA_SUCCESS) {		/* Get RISC SRAM. */		risc_address = 0x1000; 		WRT_MAILBOX_REG(ha, reg, 0, MBC_READ_RAM_WORD);		clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);	}	for (cnt = 0; cnt < sizeof(fw->risc_ram) / 2 && rval == QLA_SUCCESS;	    cnt++, risc_address++) { 		WRT_MAILBOX_REG(ha, reg, 1, risc_address);		WRT_REG_WORD(&reg->hccr, HCCR_SET_HOST_INT);		for (timer = 6000000; timer != 0; timer--) {			/* Check for pending interrupts. */			if (RD_REG_WORD(&reg->istatus) & ISR_RISC_INT) {				if (RD_REG_WORD(&reg->semaphore) & BIT_0) {					set_bit(MBX_INTERRUPT,					    &ha->mbx_cmd_flags);					mb0 = RD_MAILBOX_REG(ha, reg, 0);					mb2 = RD_MAILBOX_REG(ha, reg, 2);					WRT_REG_WORD(&reg->semaphore, 0);					WRT_REG_WORD(&reg->hccr,					    HCCR_CLR_RISC_INT);					RD_REG_WORD(&reg->hccr);					break;				}				WRT_REG_WORD(&reg->hccr, HCCR_CLR_RISC_INT);				RD_REG_WORD(&reg->hccr);			}			udelay(5);		}		if (test_and_clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags)) {			rval = mb0 & MBS_MASK;			fw->risc_ram[cnt] = htons(mb2);		} else {			rval = QLA_FUNCTION_FAILED;		}	}	if (rval == QLA_SUCCESS)		qla2xxx_copy_queues(ha, &fw->risc_ram[cnt]);	if (rval != QLA_SUCCESS) {		qla_printk(KERN_WARNING, ha,		    "Failed to dump firmware (%x)!!!\n", rval);		ha->fw_dumped = 0;	} else {		qla_printk(KERN_INFO, ha,		    "Firmware dump saved to temp buffer (%ld/%p).\n",		    ha->host_no, ha->fw_dump);		ha->fw_dumped = 1;	}qla2100_fw_dump_failed:	if (!hardware_locked)		spin_unlock_irqrestore(&ha->hardware_lock, flags);}voidqla24xx_fw_dump(scsi_qla_host_t *ha, int hardware_locked){	int		rval;	uint32_t	cnt;	uint32_t	risc_address;	struct device_reg_24xx __iomem *reg = &ha->iobase->isp24;	uint32_t __iomem *dmp_reg;	uint32_t	*iter_reg;	uint16_t __iomem *mbx_reg;	unsigned long	flags;	struct qla24xx_fw_dump *fw;	uint32_t	ext_mem_cnt;	void		*nxt;	risc_address = ext_mem_cnt = 0;	flags = 0;	if (!hardware_locked)		spin_lock_irqsave(&ha->hardware_lock, flags);	if (!ha->fw_dump) {		qla_printk(KERN_WARNING, ha,		    "No buffer available for dump!!!\n");		goto qla24xx_fw_dump_failed;	}	if (ha->fw_dumped) {		qla_printk(KERN_WARNING, ha,		    "Firmware has been previously dumped (%p) -- ignoring "		    "request...\n", ha->fw_dump);		goto qla24xx_fw_dump_failed;	}	fw = &ha->fw_dump->isp.isp24;	qla2xxx_prep_dump(ha, ha->fw_dump);	fw->host_status = htonl(RD_REG_DWORD(&reg->host_status));	/* Pause RISC. */	rval = qla24xx_pause_risc(reg);	if (rval != QLA_SUCCESS)		goto qla24xx_fw_dump_failed_0;	/* Host interface registers. */	dmp_reg = &reg->flash_addr;	for (cnt = 0; cnt < sizeof(fw->host_reg) / 4; cnt++)		fw->host_reg[cnt] = htonl(RD_REG_DWORD(dmp_reg++));	/* Disable interrupts. */	WRT_REG_DWORD(&reg->ictrl, 0);	RD_REG_DWORD(&reg->ictrl);	/* Shadow registers. */	WRT_REG_DWORD(&reg->iobase_addr, 0x0F70);	RD_REG_DWORD(&reg->iobase_addr);	WRT_REG_DWORD(&reg->iobase_select, 0xB0000000);	fw->shadow_reg[0] = htonl(RD_REG_DWORD(&reg->iobase_sdata));	WRT_REG_DWORD(&reg->iobase_select, 0xB0100000);	fw->shadow_reg[1] = htonl(RD_REG_DWORD(&reg->iobase_sdata));	WRT_REG_DWORD(&reg->iobase_select, 0xB0200000);	fw->shadow_reg[2] = htonl(RD_REG_DWORD(&reg->iobase_sdata));	WRT_REG_DWORD(&reg->iobase_select, 0xB0300000);	fw->shadow_reg[3] = htonl(RD_REG_DWORD(&reg->iobase_sdata));	WRT_REG_DWORD(&reg->iobase_select, 0xB0400000);	fw->shadow_reg[4] = htonl(RD_REG_DWORD(&reg->iobase_sdata));	WRT_REG_DWORD(&reg->iobase_select, 0xB0500000);	fw->shadow_reg[5] = htonl(RD_REG_DWORD(&reg->iobase_sdata));	WRT_REG_DWORD(&reg->iobase_select, 0xB0600000);	fw->shadow_reg[6] = htonl(RD_REG_DWORD(&reg->iobase_sdata));	/* Mailbox registers. */	mbx_reg = &reg->mailbox0;	for (cnt = 0; cnt < sizeof(fw->mailbox_reg) / 2; cnt++)		fw->mailbox_reg[cnt] = htons(RD_REG_WORD(mbx_reg++));	/* Transfer sequence registers. */	iter_reg = fw->xseq_gp_reg;	iter_reg = qla24xx_read_window(reg, 0xBF00, 16, iter_reg);	iter_reg = qla24xx_read_window(reg, 0xBF10, 16, iter_reg);	iter_reg = qla24xx_read_window(reg, 0xBF20, 16, iter_reg);	iter_reg = qla24xx_read_window(reg, 0xBF30, 16, iter_reg);	iter_reg = qla24xx_read_window(reg, 0xBF40, 16, iter_reg);	iter_reg = qla24xx_read_window(reg, 0xBF50, 16, iter_reg);	iter_reg = qla24xx_read_window(reg, 0xBF60, 16, iter_reg);	qla24xx_read_window(reg, 0xBF70, 16, iter_reg);	qla24xx_read_window(reg, 0xBFE0, 16, fw->xseq_0_reg);	qla24xx_read_window(reg, 0xBFF0, 16, fw->xseq_1_reg);	/* Receive sequence registers. */	iter_reg = fw->rseq_gp_reg;	iter_reg = qla24xx_read_window(reg, 0xFF00, 16, iter_reg);	iter_reg = qla24xx_read_window(reg, 0xFF10, 16, iter_reg);	iter_reg = qla24xx_read_window(reg, 0xFF20, 16, iter_reg);	iter_reg = qla24xx_read_window(reg, 0xFF30, 16, iter_reg);	iter_reg = qla24xx_read_window(reg, 0xFF40, 16, iter_reg);	iter_reg = qla24xx_read_window(reg, 0xFF50, 16, iter_reg);	iter_reg = qla24xx_read_window(reg, 0xFF60, 16, iter_reg);	qla24xx_read_window(reg, 0xFF70, 16, iter_reg);	qla24xx_read_window(reg, 0xFFD0, 16, fw->rseq_0_reg);	qla24xx_read_window(reg, 0xFFE0, 16, fw->rseq_1_reg);	qla24xx_read_window(reg, 0xFFF0, 16, fw->rseq_2_reg);	/* Command DMA registers. */	qla24xx_read_window(reg, 0x7100, 16, fw->cmd_dma_reg);	/* Queues. */	iter_reg = fw->req0_dma_reg;	iter_reg = qla24xx_read_window(reg, 0x7200, 8, iter_reg);	dmp_reg = &reg->iobase_q;	for (cnt = 0; cnt < 7; cnt++)		*iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));	iter_reg = fw->resp0_dma_reg;	iter_reg = qla24xx_read_window(reg, 0x7300, 8, iter_reg);	dmp_reg = &reg->iobase_q;	for (cnt = 0; cnt < 7; cnt++)		*iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));	iter_reg = fw->req1_dma_reg;	iter_reg = qla24xx_read_window(reg, 0x7400, 8, iter_reg);	dmp_reg = &reg->iobase_q;	for (cnt = 0; cnt < 7; cnt++)		*iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++));	/* Transmit DMA registers. */	iter_reg = fw->xmt0_dma_reg;	iter_reg = qla24xx_read_window(reg, 0x7600, 16, iter_reg);	qla24xx_read_window(reg, 0x7610, 16, iter_reg);	iter_reg = fw->xmt1_dma_reg;	iter_reg = qla24xx_read_window(reg, 0x7620, 16, iter_reg);	qla24xx_read_window(reg, 0x7630, 16, iter_reg);	iter_reg = fw->xmt2_dma_reg;	iter_reg = qla24xx_read_window(reg, 0x7640, 16, iter_reg);	qla24xx_read_window(reg, 0x7650, 16, iter_reg);	iter_reg = fw->xmt3_dma_reg;	iter_reg = qla24xx_read_window(reg, 0x7660, 16, iter_reg);	qla24xx_read_window(reg, 0x7670, 16, iter_reg);	iter_reg = fw->xmt4_dma_reg;	iter_reg = qla24xx_read_window(reg, 0x7680, 16, iter_reg);	qla24xx_read_window(reg, 0x7690, 16, iter_reg);	qla24xx_read_window(reg, 0x76A0, 16, fw->xmt_data_dma_reg);	/* Receive DMA registers. */	iter_reg = fw->rcvt0_data_dma_reg;	iter_reg = qla24xx_read_window(reg, 0x7700, 16, iter_reg);	qla24xx_read_window(reg, 0x7710, 16, iter_reg);	iter_reg = fw->rcvt1_data_dma_reg;	iter_reg = qla24xx_read_window(reg, 0x7720, 16, iter_reg);	qla24xx_read_window(reg, 0x7730, 16, iter_reg);	/* RISC registers. */	iter_reg = fw->risc_gp_reg;	iter_reg = qla24xx_read_window(reg, 0x0F00, 16, iter_reg);	iter_reg = qla24xx_read_window(reg, 0x0F10, 16, iter_reg);	iter_reg = qla24xx_read_window(reg, 0x0F20, 16, iter_reg);	iter_reg = qla24xx_read_window(reg, 0x0F30, 16, iter_reg);	iter_reg = qla24xx_read_window(reg, 0x0F40, 16, iter_reg);	iter_reg = qla24xx_read_window(reg, 0x0F50, 16, iter_reg);	iter_reg = qla24xx_read_window(reg, 0x0F60, 16, iter_reg);	qla24xx_read_window(reg, 0x0F70, 16, iter_reg);	/* Local memory controller registers. */	iter_reg = fw->lmc_reg;	iter_reg = qla24xx_read_window(reg, 0x3000, 16, iter_reg);	iter_reg = qla24xx_read_window(reg, 0x3010, 16, iter_reg);	iter_reg = qla24xx_read_window(reg, 0x3020, 16, iter_reg);	iter_reg = qla24xx_read_window(reg, 0x3030, 16, iter_reg);	iter_reg = qla24xx_read_window(reg, 0x3040, 16, iter_reg);	iter_reg = qla24xx_read_window(reg, 0x3050, 16, iter_reg);	qla24xx_read_window(reg, 0x3060, 16, iter_reg);	/* Fibre Protocol Module registers. */	iter_reg = fw->fpm_hdw_reg;	iter_reg = qla24xx_read_window(reg, 0x4000, 16, iter_reg);	iter_reg = qla24xx_read_window(reg, 0x4010, 16, iter_reg);	iter_reg = qla24xx_read_window(reg, 0x4020, 16, iter_reg);	iter_reg = qla24xx_read_window(reg, 0x4030, 16, iter_reg);	iter_reg = qla24xx_read_window(reg, 0x4040, 16, iter_reg);	iter_reg = qla24xx_read_window(reg, 0x4050, 16, iter_reg);	iter_reg = qla24xx_read_window(reg, 0x4060, 16, iter_reg);	iter_reg = qla24xx_read_window(reg, 0x4070, 16, iter_reg);	iter_reg = qla24xx_read_window(reg, 0x4080, 16, iter_reg);	iter_reg = qla24xx_read_window(reg, 0x4090, 16, iter_reg);	iter_reg = qla24xx_read_window(reg, 0x40A0, 16, iter_reg);	qla24xx_read_window(reg, 0x40B0, 16, iter_reg);	/* Frame Buffer registers. */	iter_reg = fw->fb_hdw_reg;	iter_reg = qla24xx_read_window(reg, 0x6000, 16, iter_reg);	iter_reg = qla24xx_read_window(reg, 0x6010, 16, iter_reg);	iter_reg = qla24xx_read_window(reg, 0x6020, 16, iter_reg);	iter_reg = qla24xx_read_window(reg, 0x6030, 16, iter_reg);	iter_reg = qla24xx_read_window(reg, 0x6040, 16, iter_reg);	iter_reg = qla24xx_read_window(reg, 0x6100, 16, iter_reg);	iter_reg = qla24xx_read_window(reg, 0x6130, 16, iter_reg);	iter_reg = qla24xx_read_window(reg, 0x6150, 16, iter_reg);	iter_reg = qla24xx_read_window(reg, 0x6170, 16, iter_reg);	iter_reg = qla24xx_read_window(reg, 0x6190, 16, iter_reg);	qla24xx_read_window(reg, 0x61B0, 16, iter_reg);	rval = qla24xx_soft_reset(ha);	if (rval != QLA_SUCCESS)		goto qla24xx_fw_dump_failed_0;	rval = qla24xx_dump_memory(ha, fw->code_ram, sizeof(fw->code_ram),	    fw->ext_mem, &nxt);	if (rval != QLA_SUCCESS)		goto qla24xx_fw_dump_failed_0;	nxt = qla2xxx_copy_queues(ha, nxt);	if (ha->eft)		memcpy(nxt, ha->eft, ntohl(ha->fw_dump->eft_size));

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?