📄 ixgb_ee.c
字号:
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 + -