//------------------------------------------------------------------- //rtl_eeprom_read_sc(): // read one word from eeprom //------------------------------------------------------------------- u16 rtl_eeprom_read_sc(void __iomem *ioaddr, u16 reg) { int addr_sz = 6; u8 x; u16 data; if (rtl_eeprom_type(ioaddr)) addr_sz = 8; else addr_sz = 6; x = RTL_R8(Cfg9346); x &= ~(Cfg9346_EEDI | Cfg9346_EEDO | Cfg9346_EESK); x |= Cfg9346_EEM1 | Cfg9346_EECS; RTL_W8(Cfg9346, x); rtl_shift_out_bits(RTL_EEPROM_READ_OPCODE, 3, ioaddr); rtl_shift_out_bits(reg, addr_sz, ioaddr); data = rtl_shift_in_bits(ioaddr); rtl_eeprom_cleanup(ioaddr); return data; }
//------------------------------------------------------------------- //rtl_eeprom_read_sc(): // read one word from eeprom //------------------------------------------------------------------- u16 rtl_eeprom_read_sc(struct rtl8168_private *tp, u16 reg) { void __iomem *ioaddr=tp->mmio_addr; int addr_sz = 6; u8 x; u16 data; if(tp->eeprom_type == EEPROM_TYPE_NONE) { return -1; } if (tp->eeprom_type==EEPROM_TYPE_93C46) addr_sz = 6; else if (tp->eeprom_type==EEPROM_TYPE_93C56) addr_sz = 8; x = Cfg9346_EEM1 | Cfg9346_EECS; RTL_W8(Cfg9346, x); rtl_shift_out_bits(RTL_EEPROM_READ_OPCODE, 3, ioaddr); rtl_shift_out_bits(reg, addr_sz, ioaddr); data = rtl_shift_in_bits(ioaddr); rtl_eeprom_cleanup(ioaddr); RTL_W8(Cfg9346, 0); return data; }
//------------------------------------------------------------------- //rtl_eeprom_write_sc(): // write one word to a specific address in the eeprom //------------------------------------------------------------------- void rtl_eeprom_write_sc(struct rtl8168_private *tp, u16 reg, u16 data) { void __iomem *ioaddr=tp->mmio_addr; u8 x; int addr_sz = 6; int w_dummy_addr = 4; if(tp->eeprom_type == EEPROM_TYPE_NONE) { return ; } if (tp->eeprom_type==EEPROM_TYPE_93C46) { addr_sz = 6; w_dummy_addr = 4; } else if (tp->eeprom_type==EEPROM_TYPE_93C56) { addr_sz = 8; w_dummy_addr = 6; } x = Cfg9346_EEM1 | Cfg9346_EECS; RTL_W8(Cfg9346, x); rtl_shift_out_bits(RTL_EEPROM_EWEN_OPCODE, 5, ioaddr); rtl_shift_out_bits(reg, w_dummy_addr, ioaddr); rtl_stand_by(ioaddr); rtl_shift_out_bits(RTL_EEPROM_ERASE_OPCODE, 3, ioaddr); rtl_shift_out_bits(reg, addr_sz, ioaddr); if (rtl_eeprom_cmd_done(ioaddr) < 0) { return; } rtl_stand_by(ioaddr); rtl_shift_out_bits(RTL_EEPROM_WRITE_OPCODE, 3, ioaddr); rtl_shift_out_bits(reg, addr_sz, ioaddr); rtl_shift_out_bits(data, 16, ioaddr); if (rtl_eeprom_cmd_done(ioaddr) < 0) { return; } rtl_stand_by(ioaddr); rtl_shift_out_bits(RTL_EEPROM_EWDS_OPCODE, 5, ioaddr); rtl_shift_out_bits(reg, w_dummy_addr, ioaddr); rtl_eeprom_cleanup(ioaddr); RTL_W8(Cfg9346, 0); }
//------------------------------------------------------------------- //rtl_eeprom_write_sc(): // write one word to a specific address in the eeprom //------------------------------------------------------------------- void rtl_eeprom_write_sc(void __iomem *ioaddr, u16 reg, u16 data) { u8 x; int addr_sz = 6; int w_dummy_addr = 4; if (rtl_eeprom_type(ioaddr)) { addr_sz = 8; w_dummy_addr = 6; } else { addr_sz = 6; w_dummy_addr = 4; } x = RTL_R8(Cfg9346); x &= ~(Cfg9346_EEDI | Cfg9346_EEDO | Cfg9346_EESK); x |= Cfg9346_EEM1 | Cfg9346_EECS; RTL_W8(Cfg9346, x); rtl_shift_out_bits(RTL_EEPROM_EWEN_OPCODE, 5, ioaddr); rtl_shift_out_bits(reg, w_dummy_addr, ioaddr); rtl_stand_by(ioaddr); rtl_shift_out_bits(RTL_EEPROM_ERASE_OPCODE, 3, ioaddr); rtl_shift_out_bits(reg, addr_sz, ioaddr); if (rtl_eeprom_cmd_done(ioaddr) < 0) { return; } rtl_stand_by(ioaddr); rtl_shift_out_bits(RTL_EEPROM_WRITE_OPCODE, 3, ioaddr); rtl_shift_out_bits(reg, addr_sz, ioaddr); rtl_shift_out_bits(data, 16, ioaddr); if (rtl_eeprom_cmd_done(ioaddr) < 0) { return; } rtl_stand_by(ioaddr); rtl_shift_out_bits(RTL_EEPROM_EWDS_OPCODE, 5, ioaddr); rtl_shift_out_bits(reg, w_dummy_addr, ioaddr); rtl_eeprom_cleanup(ioaddr); }