diff options
author | Hayes Wang <hayeswang@realtek.com> | 2011-07-06 09:58:05 +0200 |
---|---|---|
committer | Francois Romieu <romieu@fr.zoreil.com> | 2011-07-14 23:22:24 +0200 |
commit | 133ac40ac26a6cba957ad5765892f0531ba6ccee (patch) | |
tree | 8db211136f72feccf0031b3be235c02e1b43adab /drivers/net/r8169.c | |
parent | r8169: modify the flow of the hw reset. (diff) | |
download | linux-133ac40ac26a6cba957ad5765892f0531ba6ccee.tar.xz linux-133ac40ac26a6cba957ad5765892f0531ba6ccee.zip |
r8169: add ERI functions.
Add the ERI functions which would be used by the new chips.
Signed-off-by: Hayes Wang <hayeswang@realtek.com>
Acked-by: Francois Romieu <romieu@fr.zoreil.com>
Diffstat (limited to 'drivers/net/r8169.c')
-rw-r--r-- | drivers/net/r8169.c | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c index 604f94647b63..a983eaaaf2e3 100644 --- a/drivers/net/r8169.c +++ b/drivers/net/r8169.c @@ -1046,6 +1046,49 @@ static u32 rtl_csi_read(void __iomem *ioaddr, int addr) return value; } +static +void rtl_eri_write(void __iomem *ioaddr, int addr, u32 mask, u32 val, int type) +{ + unsigned int i; + + BUG_ON((addr & 3) || (mask == 0)); + RTL_W32(ERIDR, val); + RTL_W32(ERIAR, ERIAR_WRITE_CMD | type | mask | addr); + + for (i = 0; i < 100; i++) { + if (!(RTL_R32(ERIAR) & ERIAR_FLAG)) + break; + udelay(100); + } +} + +static u32 rtl_eri_read(void __iomem *ioaddr, int addr, int type) +{ + u32 value = ~0x00; + unsigned int i; + + RTL_W32(ERIAR, ERIAR_READ_CMD | type | ERIAR_MASK_1111 | addr); + + for (i = 0; i < 100; i++) { + if (RTL_R32(ERIAR) & ERIAR_FLAG) { + value = RTL_R32(ERIDR); + break; + } + udelay(100); + } + + return value; +} + +static void +rtl_w1w0_eri(void __iomem *ioaddr, int addr, u32 mask, u32 p, u32 m, int type) +{ + u32 val; + + val = rtl_eri_read(ioaddr, addr, type); + rtl_eri_write(ioaddr, addr, mask, (val & ~m) | p, type); +} + static u8 rtl8168d_efuse_read(void __iomem *ioaddr, int reg_addr) { u8 value = 0xff; |