⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 qla_dbg.c

📁 h内核
💻 C
📖 第 1 页 / 共 3 页
字号:
				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] = mb2;		} else {			rval = QLA_FUNCTION_FAILED;		}	}	if (rval != QLA_SUCCESS) {		qla_printk(KERN_WARNING, ha,		    "Failed to dump firmware (%x)!!!\n", rval);		free_pages((unsigned long)ha->fw_dump, ha->fw_dump_order);		ha->fw_dump = NULL;	} else {		qla_printk(KERN_INFO, ha,		    "Firmware dump saved to temp buffer (%ld/%p).\n",		    ha->host_no, ha->fw_dump);	}qla2100_fw_dump_failed:	if (!hardware_locked)		spin_unlock_irqrestore(&ha->hardware_lock, flags);}/** * qla2100_ascii_fw_dump() - Converts a binary firmware dump to ASCII. * @ha: HA context */voidqla2100_ascii_fw_dump(scsi_qla_host_t *ha){	uint32_t cnt;	char *uiter;	char fw_info[30];	struct qla2100_fw_dump *fw;	uiter = ha->fw_dump_buffer;	fw = ha->fw_dump;	qla_uprintf(&uiter, "%s Firmware Version %s\n", ha->model_number,	    qla2x00_get_fw_version_str(ha, fw_info));	qla_uprintf(&uiter, "\n[==>BEG]\n");	qla_uprintf(&uiter, "HCCR Register:\n%04x\n\n", fw->hccr);	qla_uprintf(&uiter, "PBIU Registers:");	for (cnt = 0; cnt < sizeof (fw->pbiu_reg) / 2; cnt++) {		if (cnt % 8 == 0) {			qla_uprintf(&uiter, "\n");		}		qla_uprintf(&uiter, "%04x ", fw->pbiu_reg[cnt]);	}	qla_uprintf(&uiter, "\n\nMailbox Registers:");	for (cnt = 0; cnt < sizeof (fw->mailbox_reg) / 2; cnt++) {		if (cnt % 8 == 0) {			qla_uprintf(&uiter, "\n");		}		qla_uprintf(&uiter, "%04x ", fw->mailbox_reg[cnt]);	}	qla_uprintf(&uiter, "\n\nDMA Registers:");	for (cnt = 0; cnt < sizeof (fw->dma_reg) / 2; cnt++) {		if (cnt % 8 == 0) {			qla_uprintf(&uiter, "\n");		}		qla_uprintf(&uiter, "%04x ", fw->dma_reg[cnt]);	}	qla_uprintf(&uiter, "\n\nRISC Hardware Registers:");	for (cnt = 0; cnt < sizeof (fw->risc_hdw_reg) / 2; cnt++) {		if (cnt % 8 == 0) {			qla_uprintf(&uiter, "\n");		}		qla_uprintf(&uiter, "%04x ", fw->risc_hdw_reg[cnt]);	}	qla_uprintf(&uiter, "\n\nRISC GP0 Registers:");	for (cnt = 0; cnt < sizeof (fw->risc_gp0_reg) / 2; cnt++) {		if (cnt % 8 == 0) {			qla_uprintf(&uiter, "\n");		}		qla_uprintf(&uiter, "%04x ", fw->risc_gp0_reg[cnt]);	}	qla_uprintf(&uiter, "\n\nRISC GP1 Registers:");	for (cnt = 0; cnt < sizeof (fw->risc_gp1_reg) / 2; cnt++) {		if (cnt % 8 == 0) {			qla_uprintf(&uiter, "\n");		}		qla_uprintf(&uiter, "%04x ", fw->risc_gp1_reg[cnt]);	}	qla_uprintf(&uiter, "\n\nRISC GP2 Registers:");	for (cnt = 0; cnt < sizeof (fw->risc_gp2_reg) / 2; cnt++) {		if (cnt % 8 == 0) {			qla_uprintf(&uiter, "\n");		}		qla_uprintf(&uiter, "%04x ", fw->risc_gp2_reg[cnt]);	}	qla_uprintf(&uiter, "\n\nRISC GP3 Registers:");	for (cnt = 0; cnt < sizeof (fw->risc_gp3_reg) / 2; cnt++) {		if (cnt % 8 == 0) {			qla_uprintf(&uiter, "\n");		}		qla_uprintf(&uiter, "%04x ", fw->risc_gp3_reg[cnt]);	}	qla_uprintf(&uiter, "\n\nRISC GP4 Registers:");	for (cnt = 0; cnt < sizeof (fw->risc_gp4_reg) / 2; cnt++) {		if (cnt % 8 == 0) {			qla_uprintf(&uiter, "\n");		}		qla_uprintf(&uiter, "%04x ", fw->risc_gp4_reg[cnt]);	}	qla_uprintf(&uiter, "\n\nRISC GP5 Registers:");	for (cnt = 0; cnt < sizeof (fw->risc_gp5_reg) / 2; cnt++) {		if (cnt % 8 == 0) {			qla_uprintf(&uiter, "\n");		}		qla_uprintf(&uiter, "%04x ", fw->risc_gp5_reg[cnt]);	}	qla_uprintf(&uiter, "\n\nRISC GP6 Registers:");	for (cnt = 0; cnt < sizeof (fw->risc_gp6_reg) / 2; cnt++) {		if (cnt % 8 == 0) {			qla_uprintf(&uiter, "\n");		}		qla_uprintf(&uiter, "%04x ", fw->risc_gp6_reg[cnt]);	}	qla_uprintf(&uiter, "\n\nRISC GP7 Registers:");	for (cnt = 0; cnt < sizeof (fw->risc_gp7_reg) / 2; cnt++) {		if (cnt % 8 == 0) {			qla_uprintf(&uiter, "\n");		}		qla_uprintf(&uiter, "%04x ", fw->risc_gp7_reg[cnt]);	}	qla_uprintf(&uiter, "\n\nFrame Buffer Hardware Registers:");	for (cnt = 0; cnt < sizeof (fw->frame_buf_hdw_reg) / 2; cnt++) {		if (cnt % 8 == 0) {			qla_uprintf(&uiter, "\n");		}		qla_uprintf(&uiter, "%04x ", fw->frame_buf_hdw_reg[cnt]);	}	qla_uprintf(&uiter, "\n\nFPM B0 Registers:");	for (cnt = 0; cnt < sizeof (fw->fpm_b0_reg) / 2; cnt++) {		if (cnt % 8 == 0) {			qla_uprintf(&uiter, "\n");		}		qla_uprintf(&uiter, "%04x ", fw->fpm_b0_reg[cnt]);	}	qla_uprintf(&uiter, "\n\nFPM B1 Registers:");	for (cnt = 0; cnt < sizeof (fw->fpm_b1_reg) / 2; cnt++) {		if (cnt % 8 == 0) {			qla_uprintf(&uiter, "\n");		}		qla_uprintf(&uiter, "%04x ", fw->fpm_b1_reg[cnt]);	}	qla_uprintf(&uiter, "\n\nRISC SRAM:");	for (cnt = 0; cnt < sizeof (fw->risc_ram) / 2; cnt++) {		if (cnt % 8 == 0) {			qla_uprintf(&uiter, "\n%04x: ", cnt + 0x1000);		}		qla_uprintf(&uiter, "%04x ", fw->risc_ram[cnt]);	}	qla_uprintf(&uiter, "\n\n[<==END] ISP Debug Dump.");	return;}static intqla_uprintf(char **uiter, char *fmt, ...){	int	iter, len;	char	buf[128];	va_list	args; 	va_start(args, fmt);	len = vsprintf(buf, fmt, args);	va_end(args);	for (iter = 0; iter < len; iter++, *uiter += 1)		*uiter[0] = buf[iter];	return (len);}//FIXME/****************************************************************************//*                         Driver Debug Functions.                          *//****************************************************************************/void qla2x00_dump_regs(scsi_qla_host_t *ha) {	device_reg_t __iomem *reg = ha->iobase;	printk("Mailbox registers:\n");	printk("scsi(%ld): mbox 0 0x%04x \n",	    ha->host_no, RD_MAILBOX_REG(ha, reg, 0));	printk("scsi(%ld): mbox 1 0x%04x \n",	    ha->host_no, RD_MAILBOX_REG(ha, reg, 1));	printk("scsi(%ld): mbox 2 0x%04x \n",	    ha->host_no, RD_MAILBOX_REG(ha, reg, 2));	printk("scsi(%ld): mbox 3 0x%04x \n",	    ha->host_no, RD_MAILBOX_REG(ha, reg, 3));	printk("scsi(%ld): mbox 4 0x%04x \n",	    ha->host_no, RD_MAILBOX_REG(ha, reg, 4));	printk("scsi(%ld): mbox 5 0x%04x \n",	    ha->host_no, RD_MAILBOX_REG(ha, reg, 5));}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 = (struct scsi_qla_host *)cmd->device->host->hostdata;	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, "	    "serial_number_at_timeout=0x%lx\n",	    cmd->use_sg, cmd->allowed, cmd->retries,	    cmd->serial_number_at_timeout);	printk("  request buffer=0x%p, request buffer len=0x%x\n",	    cmd->request_buffer, cmd->request_bufflen);	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);	printk("  r_start=0x%lx, u_start=0x%lx, f_start=0x%lx, state=%d\n",	    sp->r_start, sp->u_start, sp->f_start, sp->state);	printk(" e_start= 0x%lx, ext_history=%d, fo retry=%d, loopid=%x, "	    "port path=%d\n", sp->e_start, sp->ext_history, sp->fo_retry_cnt,	    sp->lun_queue->fclun->fcport->loop_id,	    sp->lun_queue->fclun->fcport->cur_path);}#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 + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -