qla_dbg.c

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

C
1,528
字号
qla24xx_fw_dump_failed_0:	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;	}qla24xx_fw_dump_failed:	if (!hardware_locked)		spin_unlock_irqrestore(&ha->hardware_lock, flags);}voidqla25xx_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 qla25xx_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 qla25xx_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 qla25xx_fw_dump_failed;	}	fw = &ha->fw_dump->isp.isp25;	qla2xxx_prep_dump(ha, ha->fw_dump);	ha->fw_dump->version = __constant_htonl(2);	fw->host_status = htonl(RD_REG_DWORD(&reg->host_status));	/* Pause RISC. */	rval = qla24xx_pause_risc(reg);	if (rval != QLA_SUCCESS)		goto qla25xx_fw_dump_failed_0;	/* Host/Risc registers. */	iter_reg = fw->host_risc_reg;	iter_reg = qla24xx_read_window(reg, 0x7000, 16, iter_reg);	qla24xx_read_window(reg, 0x7010, 16, iter_reg);	/* PCIe registers. */	WRT_REG_DWORD(&reg->iobase_addr, 0x7C00);	RD_REG_DWORD(&reg->iobase_addr);	WRT_REG_DWORD(&reg->iobase_window, 0x01);	dmp_reg = &reg->iobase_c4;	fw->pcie_regs[0] = htonl(RD_REG_DWORD(dmp_reg++));	fw->pcie_regs[1] = htonl(RD_REG_DWORD(dmp_reg++));	fw->pcie_regs[2] = htonl(RD_REG_DWORD(dmp_reg));	fw->pcie_regs[3] = htonl(RD_REG_DWORD(&reg->iobase_window));	WRT_REG_DWORD(&reg->iobase_window, 0x00);	RD_REG_DWORD(&reg->iobase_window);	/* 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));	WRT_REG_DWORD(&reg->iobase_select, 0xB0700000);	fw->shadow_reg[7] = htonl(RD_REG_DWORD(&reg->iobase_sdata));	WRT_REG_DWORD(&reg->iobase_select, 0xB0800000);	fw->shadow_reg[8] = htonl(RD_REG_DWORD(&reg->iobase_sdata));	WRT_REG_DWORD(&reg->iobase_select, 0xB0900000);	fw->shadow_reg[9] = htonl(RD_REG_DWORD(&reg->iobase_sdata));	WRT_REG_DWORD(&reg->iobase_select, 0xB0A00000);	fw->shadow_reg[10] = htonl(RD_REG_DWORD(&reg->iobase_sdata));	/* RISC I/O register. */	WRT_REG_DWORD(&reg->iobase_addr, 0x0010);	fw->risc_io_reg = htonl(RD_REG_DWORD(&reg->iobase_window));	/* 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);	iter_reg = fw->xseq_0_reg;	iter_reg = qla24xx_read_window(reg, 0xBFC0, 16, iter_reg);	iter_reg = qla24xx_read_window(reg, 0xBFD0, 16, iter_reg);	qla24xx_read_window(reg, 0xBFE0, 16, iter_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);	iter_reg = fw->rseq_0_reg;	iter_reg = qla24xx_read_window(reg, 0xFFC0, 16, iter_reg);	qla24xx_read_window(reg, 0xFFD0, 16, iter_reg);	qla24xx_read_window(reg, 0xFFE0, 16, fw->rseq_1_reg);	qla24xx_read_window(reg, 0xFFF0, 16, fw->rseq_2_reg);	/* Auxiliary sequence registers. */	iter_reg = fw->aseq_gp_reg;	iter_reg = qla24xx_read_window(reg, 0xB000, 16, iter_reg);	iter_reg = qla24xx_read_window(reg, 0xB010, 16, iter_reg);	iter_reg = qla24xx_read_window(reg, 0xB020, 16, iter_reg);	iter_reg = qla24xx_read_window(reg, 0xB030, 16, iter_reg);	iter_reg = qla24xx_read_window(reg, 0xB040, 16, iter_reg);	iter_reg = qla24xx_read_window(reg, 0xB050, 16, iter_reg);	iter_reg = qla24xx_read_window(reg, 0xB060, 16, iter_reg);	qla24xx_read_window(reg, 0xB070, 16, iter_reg);	iter_reg = fw->aseq_0_reg;	iter_reg = qla24xx_read_window(reg, 0xB0C0, 16, iter_reg);	qla24xx_read_window(reg, 0xB0D0, 16, iter_reg);	qla24xx_read_window(reg, 0xB0E0, 16, fw->aseq_1_reg);	qla24xx_read_window(reg, 0xB0F0, 16, fw->aseq_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);	iter_reg = qla24xx_read_window(reg, 0x3060, 16, iter_reg);	qla24xx_read_window(reg, 0x3070, 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);	iter_reg = qla24xx_read_window(reg, 0x61B0, 16, iter_reg);	qla24xx_read_window(reg, 0x6F00, 16, iter_reg);	rval = qla24xx_soft_reset(ha);	if (rval != QLA_SUCCESS)		goto qla25xx_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 qla25xx_fw_dump_failed_0;	nxt = qla2xxx_copy_queues(ha, nxt);	if (ha->eft)		memcpy(nxt, ha->eft, ntohl(ha->fw_dump->eft_size));qla25xx_fw_dump_failed_0:	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;	}qla25xx_fw_dump_failed:	if (!hardware_locked)		spin_unlock_irqrestore(&ha->hardware_lock, flags);}/****************************************************************************//*                         Driver Debug Functions.                          *//****************************************************************************/voidqla2x00_dump_regs(scsi_qla_host_t *ha){	int i;	struct device_reg_2xxx __iomem *reg = &ha->iobase->isp;	struct device_reg_24xx __iomem *reg24 = &ha->iobase->isp24;	uint16_t __iomem *mbx_reg;	mbx_reg = IS_FWI2_CAPABLE(ha) ? &reg24->mailbox0:	    MAILBOX_REG(ha, reg, 0);	printk("Mailbox registers:\n");	for (i = 0; i < 6; i++)		printk("scsi(%ld): mbox %d 0x%04x \n", ha->host_no, i,		    RD_REG_WORD(mbx_reg++));}voidqla2x00_dump_buffer(uint8_t * b, uint32_t size){	uint32_t cnt;	uint8_t c;	printk(" 0   1   2   3   4   5   6   7   8   9  "	    "Ah  Bh  Ch  Dh  Eh  Fh\n");	printk("----------------------------------------"	    "----------------------\n");	for (cnt = 0; cnt < size;) {		c = *b++;		printk("%02x",(uint32_t) c);		cnt++;		if (!(cnt % 16))			printk("\n");		else			printk("  ");	}	if (cnt % 16)		printk("\n");}/************************************************************************** *   qla2x00_print_scsi_cmd *	 Dumps out info about the scsi cmd and srb. *   Input *	 cmd : struct scsi_cmnd **************************************************************************/voidqla2x00_print_scsi_cmd(struct scsi_cmnd * cmd){	int i;	struct scsi_qla_host *ha;	srb_t *sp;	ha = shost_priv(cmd->device->host);	sp = (srb_t *) cmd->SCp.ptr;	printk("SCSI Command @=0x%p, Handle=0x%p\n", cmd, cmd->host_scribble);	printk("  chan=0x%02x, target=0x%02x, lun=0x%02x, cmd_len=0x%02x\n",	    cmd->device->channel, cmd->device->id, cmd->device->lun,	    cmd->cmd_len);	printk(" CDB: ");	for (i = 0; i < cmd->cmd_len; i++) {		printk("0x%02x ", cmd->cmnd[i]);	}	printk("\n  seg_cnt=%d, allowed=%d, retries=%d\n",	       scsi_sg_count(cmd), cmd->allowed, cmd->retries);	printk("  request buffer=0x%p, request buffer len=0x%x\n",	       scsi_sglist(cmd), scsi_bufflen(cmd));	printk("  tag=%d, transfersize=0x%x\n",	    cmd->tag, cmd->transfersize);	printk("  serial_number=%lx, SP=%p\n", cmd->serial_number, sp);	printk("  data direction=%d\n", cmd->sc_data_direction);	if (!sp)		return;	printk("  sp flags=0x%x\n", sp->flags);}voidqla2x00_dump_pkt(void *pkt){	uint32_t i;	uint8_t *data = (uint8_t *) pkt;	for (i = 0; i < 64; i++) {		if (!(i % 4))			printk("\n%02x: ", i);		printk("%02x ", data[i]);	}	printk("\n");}#if defined(QL_DEBUG_ROUTINES)/* * qla2x00_formatted_dump_buffer *       Prints string plus buffer. * * Input: *       string  = Null terminated string (no newline at end). *       buffer  = buffer address. *       wd_size = word size 8, 16, 32 or 64 bits *       count   = number of words. */voidqla2x00_formatted_dump_buffer(char *string, uint8_t * buffer,				uint8_t wd_size, uint32_t count){	uint32_t cnt;	uint16_t *buf16;	uint32_t *buf32;	if (strcmp(string, "") != 0)		printk("%s\n",string);	switch (wd_size) {		case 8:			printk(" 0    1    2    3    4    5    6    7    "				"8    9    Ah   Bh   Ch   Dh   Eh   Fh\n");			printk("-----------------------------------------"				"-------------------------------------\n");			for (cnt = 1; cnt <= count; cnt++, buffer++) {				printk("%02x",*buffer);				if (cnt % 16 == 0)					printk("\n");				else					printk("  ");			}			if (cnt % 16 != 0)				printk("\n");			break;		case 16:			printk("   0      2      4      6      8      Ah "				"	Ch     Eh\n");			printk("-----------------------------------------"				"-------------\n");			buf16 = (uint16_t *) buffer;			for (cnt = 1; cnt <= count; cnt++, buf16++) {				printk("%4x",*buf16);				if (cnt % 8 == 0)					printk("\n");				else if (*buf16 < 10)					printk("   ");				else					printk("  ");			}			if (cnt % 8 != 0)				printk("\n");			break;		case 32:			printk("       0          4          8          Ch\n");			printk("------------------------------------------\n");			buf32 = (uint32_t *) buffer;			for (cnt = 1; cnt <= count; cnt++, buf32++) {				printk("%8x", *buf32);				if (cnt % 4 == 0)					printk("\n");				else if (*buf32 < 10)					printk("   ");				else					printk("  ");			}			if (cnt % 4 != 0)				printk("\n");			break;		default:			break;	}}#endif

⌨️ 快捷键说明

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