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

📄 ixgb_ee.c

📁 linux-2.6.15.6
💻 C
📖 第 1 页 / 共 2 页
字号:
		udelay(50);	}	ASSERT(0);	return (FALSE);}/****************************************************************************** * Verifies that the EEPROM has a valid checksum * * hw - Struct containing variables accessed by shared code * * Reads the first 64 16 bit words of the EEPROM and sums the values read. * If the the sum of the 64 16 bit words is 0xBABA, the EEPROM's checksum is * valid. * * Returns: *  TRUE: Checksum is valid *  FALSE: Checksum is not valid. *****************************************************************************/boolean_tixgb_validate_eeprom_checksum(struct ixgb_hw *hw){	uint16_t checksum = 0;	uint16_t i;	for(i = 0; i < (EEPROM_CHECKSUM_REG + 1); i++)		checksum += ixgb_read_eeprom(hw, i);	if(checksum == (uint16_t) EEPROM_SUM)		return (TRUE);	else		return (FALSE);}/****************************************************************************** * Calculates the EEPROM checksum and writes it to the EEPROM * * hw - Struct containing variables accessed by shared code * * Sums the first 63 16 bit words of the EEPROM. Subtracts the sum from 0xBABA. * Writes the difference to word offset 63 of the EEPROM. *****************************************************************************/voidixgb_update_eeprom_checksum(struct ixgb_hw *hw){	uint16_t checksum = 0;	uint16_t i;	for(i = 0; i < EEPROM_CHECKSUM_REG; i++)		checksum += ixgb_read_eeprom(hw, i);	checksum = (uint16_t) EEPROM_SUM - checksum;	ixgb_write_eeprom(hw, EEPROM_CHECKSUM_REG, checksum);	return;}/****************************************************************************** * Writes a 16 bit word to a given offset in the EEPROM. * * hw - Struct containing variables accessed by shared code * reg - offset within the EEPROM to be written to * data - 16 bit word to be writen to the EEPROM * * If ixgb_update_eeprom_checksum is not called after this function, the * EEPROM will most likely contain an invalid checksum. * *****************************************************************************/voidixgb_write_eeprom(struct ixgb_hw *hw, uint16_t offset, uint16_t data){	struct ixgb_ee_map_type *ee_map = (struct ixgb_ee_map_type *)hw->eeprom;	/* Prepare the EEPROM for writing */	ixgb_setup_eeprom(hw);	/*  Send the 9-bit EWEN (write enable) command to the EEPROM (5-bit opcode	 *  plus 4-bit dummy).  This puts the EEPROM into write/erase mode.	 */	ixgb_shift_out_bits(hw, EEPROM_EWEN_OPCODE, 5);	ixgb_shift_out_bits(hw, 0, 4);	/*  Prepare the EEPROM  */	ixgb_standby_eeprom(hw);	/*  Send the Write command (3-bit opcode + 6-bit addr)  */	ixgb_shift_out_bits(hw, EEPROM_WRITE_OPCODE, 3);	ixgb_shift_out_bits(hw, offset, 6);	/*  Send the data  */	ixgb_shift_out_bits(hw, data, 16);	ixgb_wait_eeprom_command(hw);	/*  Recover from write  */	ixgb_standby_eeprom(hw);	/* Send the 9-bit EWDS (write disable) command to the EEPROM (5-bit	 * opcode plus 4-bit dummy).  This takes the EEPROM out of write/erase	 * mode.	 */	ixgb_shift_out_bits(hw, EEPROM_EWDS_OPCODE, 5);	ixgb_shift_out_bits(hw, 0, 4);	/*  Done with writing  */	ixgb_cleanup_eeprom(hw);	/* clear the init_ctrl_reg_1 to signify that the cache is invalidated */	ee_map->init_ctrl_reg_1 = le16_to_cpu(EEPROM_ICW1_SIGNATURE_CLEAR);	return;}/****************************************************************************** * Reads a 16 bit word from the EEPROM. * * hw - Struct containing variables accessed by shared code * offset - offset of 16 bit word in the EEPROM to read * * Returns: *  The 16-bit value read from the eeprom *****************************************************************************/uint16_tixgb_read_eeprom(struct ixgb_hw *hw,		  uint16_t offset){	uint16_t data;	/*  Prepare the EEPROM for reading  */	ixgb_setup_eeprom(hw);	/*  Send the READ command (opcode + addr)  */	ixgb_shift_out_bits(hw, EEPROM_READ_OPCODE, 3);	/*	 * We have a 64 word EEPROM, there are 6 address bits	 */	ixgb_shift_out_bits(hw, offset, 6);	/*  Read the data  */	data = ixgb_shift_in_bits(hw);	/*  End this read operation  */	ixgb_standby_eeprom(hw);	return (data);}/****************************************************************************** * Reads eeprom and stores data in shared structure. * Validates eeprom checksum and eeprom signature. * * hw - Struct containing variables accessed by shared code * * Returns: *      TRUE: if eeprom read is successful *      FALSE: otherwise. *****************************************************************************/boolean_tixgb_get_eeprom_data(struct ixgb_hw *hw){	uint16_t i;	uint16_t checksum = 0;	struct ixgb_ee_map_type *ee_map;	DEBUGFUNC("ixgb_get_eeprom_data");	ee_map = (struct ixgb_ee_map_type *)hw->eeprom;	DEBUGOUT("ixgb_ee: Reading eeprom data\n");	for(i = 0; i < IXGB_EEPROM_SIZE ; i++) {		uint16_t ee_data;		ee_data = ixgb_read_eeprom(hw, i);		checksum += ee_data;		hw->eeprom[i] = le16_to_cpu(ee_data);	}	if (checksum != (uint16_t) EEPROM_SUM) {		DEBUGOUT("ixgb_ee: Checksum invalid.\n");		/* clear the init_ctrl_reg_1 to signify that the cache is		 * invalidated */		ee_map->init_ctrl_reg_1 = le16_to_cpu(EEPROM_ICW1_SIGNATURE_CLEAR);		return (FALSE);	}	if ((ee_map->init_ctrl_reg_1 & le16_to_cpu(EEPROM_ICW1_SIGNATURE_MASK))		 != le16_to_cpu(EEPROM_ICW1_SIGNATURE_VALID)) {		DEBUGOUT("ixgb_ee: Signature invalid.\n");		return(FALSE);	}	return(TRUE);}/****************************************************************************** * Local function to check if the eeprom signature is good * If the eeprom signature is good, calls ixgb)get_eeprom_data. * * hw - Struct containing variables accessed by shared code * * Returns: *      TRUE: eeprom signature was good and the eeprom read was successful *      FALSE: otherwise. ******************************************************************************/static boolean_tixgb_check_and_get_eeprom_data (struct ixgb_hw* hw){	struct ixgb_ee_map_type *ee_map = (struct ixgb_ee_map_type *)hw->eeprom;	if ((ee_map->init_ctrl_reg_1 & le16_to_cpu(EEPROM_ICW1_SIGNATURE_MASK))	    == le16_to_cpu(EEPROM_ICW1_SIGNATURE_VALID)) {		return (TRUE);	} else {		return ixgb_get_eeprom_data(hw);	}}/****************************************************************************** * return a word from the eeprom * * hw - Struct containing variables accessed by shared code * index - Offset of eeprom word * * Returns: *          Word at indexed offset in eeprom, if valid, 0 otherwise. ******************************************************************************/uint16_tixgb_get_eeprom_word(struct ixgb_hw *hw, uint16_t index){	if ((index < IXGB_EEPROM_SIZE) &&		(ixgb_check_and_get_eeprom_data(hw) == TRUE)) {	   return(hw->eeprom[index]);	}	return(0);}/****************************************************************************** * return the mac address from EEPROM * * hw       - Struct containing variables accessed by shared code * mac_addr - Ethernet Address if EEPROM contents are valid, 0 otherwise * * Returns: None. ******************************************************************************/voidixgb_get_ee_mac_addr(struct ixgb_hw *hw,			uint8_t *mac_addr){	int i;	struct ixgb_ee_map_type *ee_map = (struct ixgb_ee_map_type *)hw->eeprom;	DEBUGFUNC("ixgb_get_ee_mac_addr");	if (ixgb_check_and_get_eeprom_data(hw) == TRUE) {		for (i = 0; i < IXGB_ETH_LENGTH_OF_ADDRESS; i++) {			mac_addr[i] = ee_map->mac_addr[i];			DEBUGOUT2("mac(%d) = %.2X\n", i, mac_addr[i]);		}	}}/****************************************************************************** * return the Printed Board Assembly number from EEPROM * * hw - Struct containing variables accessed by shared code * * Returns: *          PBA number if EEPROM contents are valid, 0 otherwise ******************************************************************************/uint32_tixgb_get_ee_pba_number(struct ixgb_hw *hw){	if(ixgb_check_and_get_eeprom_data(hw) == TRUE)		return (le16_to_cpu(hw->eeprom[EEPROM_PBA_1_2_REG])			| (le16_to_cpu(hw->eeprom[EEPROM_PBA_3_4_REG])<<16));	return(0);}/****************************************************************************** * return the Device Id from EEPROM * * hw - Struct containing variables accessed by shared code * * Returns: *          Device Id if EEPROM contents are valid, 0 otherwise ******************************************************************************/uint16_tixgb_get_ee_device_id(struct ixgb_hw *hw){	struct ixgb_ee_map_type *ee_map = (struct ixgb_ee_map_type *)hw->eeprom;	if(ixgb_check_and_get_eeprom_data(hw) == TRUE)		return (le16_to_cpu(ee_map->device_id));	return (0);}

⌨️ 快捷键说明

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