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

📄 qla_sup.c

📁 linux-2.6.15.6
💻 C
📖 第 1 页 / 共 2 页
字号:
		ret = QLA_SUCCESS;	} else		qla2x00_write_nvram_word(ha, 0, wprot_old);	return ret;}static voidqla2x00_set_nvram_protection(scsi_qla_host_t *ha, int stat){	struct device_reg_2xxx __iomem *reg = &ha->iobase->isp;	uint32_t word;	if (stat != QLA_SUCCESS)		return;	/* Set NVRAM write protection. */	/* Write enable. */	qla2x00_nv_write(ha, NVR_DATA_OUT);	qla2x00_nv_write(ha, 0);	qla2x00_nv_write(ha, 0);	for (word = 0; word < 8; word++)		qla2x00_nv_write(ha, NVR_DATA_OUT);	qla2x00_nv_deselect(ha);	/* Enable protection register. */	qla2x00_nv_write(ha, NVR_PR_ENABLE | NVR_DATA_OUT);	qla2x00_nv_write(ha, NVR_PR_ENABLE);	qla2x00_nv_write(ha, NVR_PR_ENABLE);	for (word = 0; word < 8; word++)		qla2x00_nv_write(ha, NVR_DATA_OUT | NVR_PR_ENABLE);	qla2x00_nv_deselect(ha);	/* Enable protection register. */	qla2x00_nv_write(ha, NVR_PR_ENABLE | NVR_DATA_OUT);	qla2x00_nv_write(ha, NVR_PR_ENABLE);	qla2x00_nv_write(ha, NVR_PR_ENABLE | NVR_DATA_OUT);	for (word = 0; word < 8; word++)		qla2x00_nv_write(ha, NVR_PR_ENABLE);	qla2x00_nv_deselect(ha);	/* Wait for NVRAM to become ready. */	WRT_REG_WORD(&reg->nvram, NVR_SELECT);	RD_REG_WORD(&reg->nvram);		/* PCI Posting. */	do {		NVRAM_DELAY();		word = RD_REG_WORD(&reg->nvram);	} while ((word & NVR_DATA_IN) == 0);}/*****************************************************************************//* Flash Manipulation Routines                                               *//*****************************************************************************/static inline uint32_tflash_conf_to_access_addr(uint32_t faddr){	return FARX_ACCESS_FLASH_CONF | faddr;}static inline uint32_tflash_data_to_access_addr(uint32_t faddr){	return FARX_ACCESS_FLASH_DATA | faddr;}static inline uint32_tnvram_conf_to_access_addr(uint32_t naddr){	return FARX_ACCESS_NVRAM_CONF | naddr;}static inline uint32_tnvram_data_to_access_addr(uint32_t naddr){	return FARX_ACCESS_NVRAM_DATA | naddr;}uint32_tqla24xx_read_flash_dword(scsi_qla_host_t *ha, uint32_t addr){	int rval;	uint32_t cnt, data;	struct device_reg_24xx __iomem *reg = &ha->iobase->isp24;	WRT_REG_DWORD(&reg->flash_addr, addr & ~FARX_DATA_FLAG);	/* Wait for READ cycle to complete. */	rval = QLA_SUCCESS;	for (cnt = 3000;	    (RD_REG_DWORD(&reg->flash_addr) & FARX_DATA_FLAG) == 0 &&	    rval == QLA_SUCCESS; cnt--) {		if (cnt)			udelay(10);		else			rval = QLA_FUNCTION_TIMEOUT;	}	/* TODO: What happens if we time out? */	data = 0xDEADDEAD;	if (rval == QLA_SUCCESS)		data = RD_REG_DWORD(&reg->flash_data);	return data;}uint32_t *qla24xx_read_flash_data(scsi_qla_host_t *ha, uint32_t *dwptr, uint32_t faddr,    uint32_t dwords){	uint32_t i;	/* Dword reads to flash. */	for (i = 0; i < dwords; i++, faddr++)		dwptr[i] = cpu_to_le32(qla24xx_read_flash_dword(ha,		    flash_data_to_access_addr(faddr)));	return dwptr;}intqla24xx_write_flash_dword(scsi_qla_host_t *ha, uint32_t addr, uint32_t data){	int rval;	uint32_t cnt;	struct device_reg_24xx __iomem *reg = &ha->iobase->isp24;	WRT_REG_DWORD(&reg->flash_data, data);	RD_REG_DWORD(&reg->flash_data);		/* PCI Posting. */	WRT_REG_DWORD(&reg->flash_addr, addr | FARX_DATA_FLAG);	/* Wait for Write cycle to complete. */	rval = QLA_SUCCESS;	for (cnt = 500000; (RD_REG_DWORD(&reg->flash_addr) & FARX_DATA_FLAG) &&	    rval == QLA_SUCCESS; cnt--) {		if (cnt)			udelay(10);		else			rval = QLA_FUNCTION_TIMEOUT;	}	return rval;}voidqla24xx_get_flash_manufacturer(scsi_qla_host_t *ha, uint8_t *man_id,    uint8_t *flash_id){	uint32_t ids;	ids = qla24xx_read_flash_dword(ha, flash_data_to_access_addr(0xd03ab));	*man_id = LSB(ids);	*flash_id = MSB(ids);}intqla24xx_write_flash_data(scsi_qla_host_t *ha, uint32_t *dwptr, uint32_t faddr,    uint32_t dwords){	int ret;	uint32_t liter;	uint32_t sec_mask, rest_addr, conf_addr;	uint32_t fdata;	uint8_t	man_id, flash_id;	struct device_reg_24xx __iomem *reg = &ha->iobase->isp24;	ret = QLA_SUCCESS;	qla24xx_get_flash_manufacturer(ha, &man_id, &flash_id);	DEBUG9(printk("%s(%ld): Flash man_id=%d flash_id=%d\n", __func__,	    ha->host_no, man_id, flash_id));	conf_addr = flash_conf_to_access_addr(0x03d8);	switch (man_id) {	case 0xbf: /* STT flash. */		rest_addr = 0x1fff;		sec_mask = 0x3e000;		if (flash_id == 0x80)			conf_addr = flash_conf_to_access_addr(0x0352);		break;	case 0x13: /* ST M25P80. */		rest_addr = 0x3fff;		sec_mask = 0x3c000;		break;	default:		/* Default to 64 kb sector size. */		rest_addr = 0x3fff;		sec_mask = 0x3c000;		break;	}	/* Enable flash write. */	WRT_REG_DWORD(&reg->ctrl_status,	    RD_REG_DWORD(&reg->ctrl_status) | CSRX_FLASH_ENABLE);	RD_REG_DWORD(&reg->ctrl_status);	/* PCI Posting. */	/* Disable flash write-protection. */	qla24xx_write_flash_dword(ha, flash_conf_to_access_addr(0x101), 0);	do {    /* Loop once to provide quick error exit. */		for (liter = 0; liter < dwords; liter++, faddr++, dwptr++) {			/* Are we at the beginning of a sector? */			if ((faddr & rest_addr) == 0) {				fdata = (faddr & sec_mask) << 2;				ret = qla24xx_write_flash_dword(ha, conf_addr,				    (fdata & 0xff00) |((fdata << 16) &				    0xff0000) | ((fdata >> 16) & 0xff));				if (ret != QLA_SUCCESS) {					DEBUG9(printk("%s(%ld) Unable to flash "					    "sector: address=%x.\n", __func__,					    ha->host_no, faddr));					break;				}			}			ret = qla24xx_write_flash_dword(ha,			    flash_data_to_access_addr(faddr),			    cpu_to_le32(*dwptr));			if (ret != QLA_SUCCESS) {				DEBUG9(printk("%s(%ld) Unable to program flash "				    "address=%x data=%x.\n", __func__,				    ha->host_no, faddr, *dwptr));				break;			}		}	} while (0);	/* Disable flash write. */	WRT_REG_DWORD(&reg->ctrl_status,	    RD_REG_DWORD(&reg->ctrl_status) & ~CSRX_FLASH_ENABLE);	RD_REG_DWORD(&reg->ctrl_status);	/* PCI Posting. */	return ret;}uint8_t *qla2x00_read_nvram_data(scsi_qla_host_t *ha, uint8_t *buf, uint32_t naddr,    uint32_t bytes){	uint32_t i;	uint16_t *wptr;	/* Word reads to NVRAM via registers. */	wptr = (uint16_t *)buf;	qla2x00_lock_nvram_access(ha);	for (i = 0; i < bytes >> 1; i++, naddr++)		wptr[i] = cpu_to_le16(qla2x00_get_nvram_word(ha,		    naddr));	qla2x00_unlock_nvram_access(ha);	return buf;}uint8_t *qla24xx_read_nvram_data(scsi_qla_host_t *ha, uint8_t *buf, uint32_t naddr,    uint32_t bytes){	uint32_t i;	uint32_t *dwptr;	/* Dword reads to flash. */	dwptr = (uint32_t *)buf;	for (i = 0; i < bytes >> 2; i++, naddr++)		dwptr[i] = cpu_to_le32(qla24xx_read_flash_dword(ha,		    nvram_data_to_access_addr(naddr)));	return buf;}intqla2x00_write_nvram_data(scsi_qla_host_t *ha, uint8_t *buf, uint32_t naddr,    uint32_t bytes){	int ret, stat;	uint32_t i;	uint16_t *wptr;	ret = QLA_SUCCESS;	qla2x00_lock_nvram_access(ha);	/* Disable NVRAM write-protection. */	stat = qla2x00_clear_nvram_protection(ha);	wptr = (uint16_t *)buf;	for (i = 0; i < bytes >> 1; i++, naddr++) {		qla2x00_write_nvram_word(ha, naddr,		    cpu_to_le16(*wptr));		wptr++;	}	/* Enable NVRAM write-protection. */	qla2x00_set_nvram_protection(ha, stat);	qla2x00_unlock_nvram_access(ha);	return ret;}intqla24xx_write_nvram_data(scsi_qla_host_t *ha, uint8_t *buf, uint32_t naddr,    uint32_t bytes){	int ret;	uint32_t i;	uint32_t *dwptr;	struct device_reg_24xx __iomem *reg = &ha->iobase->isp24;	ret = QLA_SUCCESS;	/* Enable flash write. */	WRT_REG_DWORD(&reg->ctrl_status,	    RD_REG_DWORD(&reg->ctrl_status) | CSRX_FLASH_ENABLE);	RD_REG_DWORD(&reg->ctrl_status);	/* PCI Posting. */	/* Disable NVRAM write-protection. */	qla24xx_write_flash_dword(ha, nvram_conf_to_access_addr(0x101),	    0);	qla24xx_write_flash_dword(ha, nvram_conf_to_access_addr(0x101),	    0);	/* Dword writes to flash. */	dwptr = (uint32_t *)buf;	for (i = 0; i < bytes >> 2; i++, naddr++, dwptr++) {		ret = qla24xx_write_flash_dword(ha,		    nvram_data_to_access_addr(naddr),		    cpu_to_le32(*dwptr));		if (ret != QLA_SUCCESS) {			DEBUG9(printk("%s(%ld) Unable to program "			    "nvram address=%x data=%x.\n", __func__,			    ha->host_no, naddr, *dwptr));			break;		}	}	/* Enable NVRAM write-protection. */	qla24xx_write_flash_dword(ha, nvram_conf_to_access_addr(0x101),	    0x8c);	/* Disable flash write. */	WRT_REG_DWORD(&reg->ctrl_status,	    RD_REG_DWORD(&reg->ctrl_status) & ~CSRX_FLASH_ENABLE);	RD_REG_DWORD(&reg->ctrl_status);	/* PCI Posting. */	return ret;}

⌨️ 快捷键说明

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