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

📄 qla1280.c

📁 linux 内核源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
		goto fail;	if (mb[1] != 0xAAAA || mb[2] != 0x5555 || mb[3] != 0xAA55 ||	    mb[4] != 0x55AA || mb[5] != 0xA5A5 || mb[6] != 0x5A5A ||	    mb[7] != 0x2525) {		printk(KERN_INFO "qla1280: Failed mbox check\n");		goto fail;	}	dprintk(3, "qla1280_chip_diag: exiting normally\n");	return 0; fail:	dprintk(2, "qla1280_chip_diag: **** FAILED ****\n");	return status;}static intqla1280_load_firmware_pio(struct scsi_qla_host *ha){	uint16_t risc_address, *risc_code_address, risc_code_size;	uint16_t mb[MAILBOX_REGISTER_COUNT], i;	int err;	/* Load RISC code. */	risc_address = *ql1280_board_tbl[ha->devnum].fwstart;	risc_code_address = ql1280_board_tbl[ha->devnum].fwcode;	risc_code_size = *ql1280_board_tbl[ha->devnum].fwlen;	for (i = 0; i < risc_code_size; i++) {		mb[0] = MBC_WRITE_RAM_WORD;		mb[1] = risc_address + i;		mb[2] = risc_code_address[i];		err = qla1280_mailbox_command(ha, BIT_0 | BIT_1 | BIT_2, mb);		if (err) {			printk(KERN_ERR "scsi(%li): Failed to load firmware\n",					ha->host_no);			return err;		}	}	return 0;}#define DUMP_IT_BACK 0		/* for debug of RISC loading */static intqla1280_load_firmware_dma(struct scsi_qla_host *ha){	uint16_t risc_address, *risc_code_address, risc_code_size;	uint16_t mb[MAILBOX_REGISTER_COUNT], cnt;	int err = 0, num, i;#if DUMP_IT_BACK	uint8_t *sp, *tbuf;	dma_addr_t p_tbuf;	tbuf = pci_alloc_consistent(ha->pdev, 8000, &p_tbuf);	if (!tbuf)		return -ENOMEM;#endif	/* Load RISC code. */	risc_address = *ql1280_board_tbl[ha->devnum].fwstart;	risc_code_address = ql1280_board_tbl[ha->devnum].fwcode;	risc_code_size = *ql1280_board_tbl[ha->devnum].fwlen;	dprintk(1, "%s: DMA RISC code (%i) words\n",			__FUNCTION__, risc_code_size);	num = 0;	while (risc_code_size > 0) {		int warn __attribute__((unused)) = 0;		cnt = 2000 >> 1;		if (cnt > risc_code_size)			cnt = risc_code_size;		dprintk(2, "qla1280_setup_chip:  loading risc @ =(0x%p),"			"%d,%d(0x%x)\n",			risc_code_address, cnt, num, risc_address);		for(i = 0; i < cnt; i++)			((__le16 *)ha->request_ring)[i] =				cpu_to_le16(risc_code_address[i]);		mb[0] = MBC_LOAD_RAM;		mb[1] = risc_address;		mb[4] = cnt;		mb[3] = ha->request_dma & 0xffff;		mb[2] = (ha->request_dma >> 16) & 0xffff;		mb[7] = pci_dma_hi32(ha->request_dma) & 0xffff;		mb[6] = pci_dma_hi32(ha->request_dma) >> 16;		dprintk(2, "%s: op=%d  0x%p = 0x%4x,0x%4x,0x%4x,0x%4x\n",				__FUNCTION__, mb[0],				(void *)(long)ha->request_dma,				mb[6], mb[7], mb[2], mb[3]);		err = qla1280_mailbox_command(ha, BIT_4 | BIT_3 | BIT_2 |				BIT_1 | BIT_0, mb);		if (err) {			printk(KERN_ERR "scsi(%li): Failed to load partial "			       "segment of f\n", ha->host_no);			goto out;		}#if DUMP_IT_BACK		mb[0] = MBC_DUMP_RAM;		mb[1] = risc_address;		mb[4] = cnt;		mb[3] = p_tbuf & 0xffff;		mb[2] = (p_tbuf >> 16) & 0xffff;		mb[7] = pci_dma_hi32(p_tbuf) & 0xffff;		mb[6] = pci_dma_hi32(p_tbuf) >> 16;		err = qla1280_mailbox_command(ha, BIT_4 | BIT_3 | BIT_2 |				BIT_1 | BIT_0, mb);		if (err) {			printk(KERN_ERR			       "Failed to dump partial segment of f/w\n");			goto out;		}		sp = (uint8_t *)ha->request_ring;		for (i = 0; i < (cnt << 1); i++) {			if (tbuf[i] != sp[i] && warn++ < 10) {				printk(KERN_ERR "%s: FW compare error @ "						"byte(0x%x) loop#=%x\n",						__FUNCTION__, i, num);				printk(KERN_ERR "%s: FWbyte=%x  "						"FWfromChip=%x\n",						__FUNCTION__, sp[i], tbuf[i]);				/*break; */			}		}#endif		risc_address += cnt;		risc_code_size = risc_code_size - cnt;		risc_code_address = risc_code_address + cnt;		num++;	} out:#if DUMP_IT_BACK	pci_free_consistent(ha->pdev, 8000, tbuf, p_tbuf);#endif	return err;}static intqla1280_start_firmware(struct scsi_qla_host *ha){	uint16_t mb[MAILBOX_REGISTER_COUNT];	int err;	dprintk(1, "%s: Verifying checksum of loaded RISC code.\n",			__FUNCTION__);	/* Verify checksum of loaded RISC code. */	mb[0] = MBC_VERIFY_CHECKSUM;	/* mb[1] = ql12_risc_code_addr01; */	mb[1] = *ql1280_board_tbl[ha->devnum].fwstart;	err = qla1280_mailbox_command(ha, BIT_1 | BIT_0, mb);	if (err) {		printk(KERN_ERR "scsi(%li): RISC checksum failed.\n", ha->host_no);		return err;	}	/* Start firmware execution. */	dprintk(1, "%s: start firmware running.\n", __FUNCTION__);	mb[0] = MBC_EXECUTE_FIRMWARE;	mb[1] = *ql1280_board_tbl[ha->devnum].fwstart;	err = qla1280_mailbox_command(ha, BIT_1 | BIT_0, &mb[0]);	if (err) {		printk(KERN_ERR "scsi(%li): Failed to start firmware\n",				ha->host_no);	}	return err;}static intqla1280_load_firmware(struct scsi_qla_host *ha){	int err;	err = qla1280_chip_diag(ha);	if (err)		goto out;	if (IS_ISP1040(ha))		err = qla1280_load_firmware_pio(ha);	else		err = qla1280_load_firmware_dma(ha);	if (err)		goto out;	err = qla1280_start_firmware(ha); out:	return err;}/* * Initialize rings * * Input: *      ha                = adapter block pointer. *      ha->request_ring  = request ring virtual address *      ha->response_ring = response ring virtual address *      ha->request_dma   = request ring physical address *      ha->response_dma  = response ring physical address * * Returns: *      0 = success. */static intqla1280_init_rings(struct scsi_qla_host *ha){	uint16_t mb[MAILBOX_REGISTER_COUNT];	int status = 0;	ENTER("qla1280_init_rings");	/* Clear outstanding commands array. */	memset(ha->outstanding_cmds, 0,	       sizeof(struct srb *) * MAX_OUTSTANDING_COMMANDS);	/* Initialize request queue. */	ha->request_ring_ptr = ha->request_ring;	ha->req_ring_index = 0;	ha->req_q_cnt = REQUEST_ENTRY_CNT;	/* mb[0] = MBC_INIT_REQUEST_QUEUE; */	mb[0] = MBC_INIT_REQUEST_QUEUE_A64;	mb[1] = REQUEST_ENTRY_CNT;	mb[3] = ha->request_dma & 0xffff;	mb[2] = (ha->request_dma >> 16) & 0xffff;	mb[4] = 0;	mb[7] = pci_dma_hi32(ha->request_dma) & 0xffff;	mb[6] = pci_dma_hi32(ha->request_dma) >> 16;	if (!(status = qla1280_mailbox_command(ha, BIT_7 | BIT_6 | BIT_4 |					       BIT_3 | BIT_2 | BIT_1 | BIT_0,					       &mb[0]))) {		/* Initialize response queue. */		ha->response_ring_ptr = ha->response_ring;		ha->rsp_ring_index = 0;		/* mb[0] = MBC_INIT_RESPONSE_QUEUE; */		mb[0] = MBC_INIT_RESPONSE_QUEUE_A64;		mb[1] = RESPONSE_ENTRY_CNT;		mb[3] = ha->response_dma & 0xffff;		mb[2] = (ha->response_dma >> 16) & 0xffff;		mb[5] = 0;		mb[7] = pci_dma_hi32(ha->response_dma) & 0xffff;		mb[6] = pci_dma_hi32(ha->response_dma) >> 16;		status = qla1280_mailbox_command(ha, BIT_7 | BIT_6 | BIT_5 |						 BIT_3 | BIT_2 | BIT_1 | BIT_0,						 &mb[0]);	}	if (status)		dprintk(2, "qla1280_init_rings: **** FAILED ****\n");	LEAVE("qla1280_init_rings");	return status;}static voidqla1280_print_settings(struct nvram *nv){	dprintk(1, "qla1280 : initiator scsi id bus[0]=%d\n",		nv->bus[0].config_1.initiator_id);	dprintk(1, "qla1280 : initiator scsi id bus[1]=%d\n",		nv->bus[1].config_1.initiator_id);	dprintk(1, "qla1280 : bus reset delay[0]=%d\n",		nv->bus[0].bus_reset_delay);	dprintk(1, "qla1280 : bus reset delay[1]=%d\n",		nv->bus[1].bus_reset_delay);	dprintk(1, "qla1280 : retry count[0]=%d\n", nv->bus[0].retry_count);	dprintk(1, "qla1280 : retry delay[0]=%d\n", nv->bus[0].retry_delay);	dprintk(1, "qla1280 : retry count[1]=%d\n", nv->bus[1].retry_count);	dprintk(1, "qla1280 : retry delay[1]=%d\n", nv->bus[1].retry_delay);	dprintk(1, "qla1280 : async data setup time[0]=%d\n",		nv->bus[0].config_2.async_data_setup_time);	dprintk(1, "qla1280 : async data setup time[1]=%d\n",		nv->bus[1].config_2.async_data_setup_time);	dprintk(1, "qla1280 : req/ack active negation[0]=%d\n",		nv->bus[0].config_2.req_ack_active_negation);	dprintk(1, "qla1280 : req/ack active negation[1]=%d\n",		nv->bus[1].config_2.req_ack_active_negation);	dprintk(1, "qla1280 : data line active negation[0]=%d\n",		nv->bus[0].config_2.data_line_active_negation);	dprintk(1, "qla1280 : data line active negation[1]=%d\n",		nv->bus[1].config_2.data_line_active_negation);	dprintk(1, "qla1280 : disable loading risc code=%d\n",		nv->cntr_flags_1.disable_loading_risc_code);	dprintk(1, "qla1280 : enable 64bit addressing=%d\n",		nv->cntr_flags_1.enable_64bit_addressing);	dprintk(1, "qla1280 : selection timeout limit[0]=%d\n",		nv->bus[0].selection_timeout);	dprintk(1, "qla1280 : selection timeout limit[1]=%d\n",		nv->bus[1].selection_timeout);	dprintk(1, "qla1280 : max queue depth[0]=%d\n",		nv->bus[0].max_queue_depth);	dprintk(1, "qla1280 : max queue depth[1]=%d\n",		nv->bus[1].max_queue_depth);}static voidqla1280_set_target_defaults(struct scsi_qla_host *ha, int bus, int target){	struct nvram *nv = &ha->nvram;	nv->bus[bus].target[target].parameter.renegotiate_on_error = 1;	nv->bus[bus].target[target].parameter.auto_request_sense = 1;	nv->bus[bus].target[target].parameter.tag_queuing = 1;	nv->bus[bus].target[target].parameter.enable_sync = 1;#if 1	/* Some SCSI Processors do not seem to like this */	nv->bus[bus].target[target].parameter.enable_wide = 1;#endif	nv->bus[bus].target[target].execution_throttle =		nv->bus[bus].max_queue_depth - 1;	nv->bus[bus].target[target].parameter.parity_checking = 1;	nv->bus[bus].target[target].parameter.disconnect_allowed = 1;	if (IS_ISP1x160(ha)) {		nv->bus[bus].target[target].flags.flags1x160.device_enable = 1;		nv->bus[bus].target[target].flags.flags1x160.sync_offset = 0x0e;		nv->bus[bus].target[target].sync_period = 9;		nv->bus[bus].target[target].ppr_1x160.flags.enable_ppr = 1;		nv->bus[bus].target[target].ppr_1x160.flags.ppr_options = 2;		nv->bus[bus].target[target].ppr_1x160.flags.ppr_bus_width = 1;	} else {		nv->bus[bus].target[target].flags.flags1x80.device_enable = 1;		nv->bus[bus].target[target].flags.flags1x80.sync_offset = 12;		nv->bus[bus].target[target].sync_period = 10;	}}static voidqla1280_set_defaults(struct scsi_qla_host *ha){	struct nvram *nv = &ha->nvram;	int bus, target;	dprintk(1, "Using defaults for NVRAM: \n");	memset(nv, 0, sizeof(struct nvram));	/* nv->cntr_flags_1.disable_loading_risc_code = 1; */	nv->firmware_feature.f.enable_fast_posting = 1;	nv->firmware_feature.f.disable_synchronous_backoff = 1;	nv->termination.scsi_bus_0_control = 3;	nv->termination.scsi_bus_1_control = 3;	nv->termination.auto_term_support = 1;	/*	 * Set default FIFO magic - What appropriate values would be here	 * is unknown. This is what I have found testing with 12160s.	 *	 * Now, I would love the magic decoder ring for this one, the	 * header file provided by QLogic seems to be bogus or incomplete	 * at best.	 */	nv->isp_config.burst_enable = 1;	if (IS_ISP1040(ha))		nv->isp_config.fifo_threshold |= 3;	else		nv->isp_config.fifo_threshold |= 4;	if (IS_ISP1x160(ha))		nv->isp_parameter = 0x01; /* fast memory enable */	for (bus = 0; bus < MAX_BUSES; bus++) {		nv->bus[bus].config_1.initiator_id = 7;		nv->bus[bus].config_2.req_ack_active_negation = 1;		nv->bus[bus].config_2.data_line_active_negation = 1;		nv->bus[bus].selection_timeout = 250;		nv->bus[bus].max_queue_depth = 256;		if (IS_ISP1040(ha)) {			nv->bus[bus].bus_reset_delay = 3;			nv->bus[bus].config_2.async_data_setup_time = 6;			nv->bus[bus].retry_delay = 1;		} else {			nv->bus[bus].bus_reset_delay = 5;			nv->bus[bus].config_2.async_data_setup_time = 8;		}		for (target = 0; target < MAX_TARGETS; target++)			qla1280_set_target_defaults(ha, bus, target);	}}static intqla1280_config_target(struct scsi_qla_host *ha, int bus, int target){	struct nvram *nv = &ha->nvram;	uint16_t mb[MAILBOX_REGISTER_COUNT];	int status, lun;	uint16_t flag;	/* Set Target Parameters. */	mb[0] = MBC_SET_TARGET_PARAMETERS;	mb[1] = (uint16_t)

⌨️ 快捷键说明

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