diff options
-rw-r--r-- | realtek.c | 110 |
1 files changed, 64 insertions, 46 deletions
@@ -5,8 +5,9 @@ #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) -#define HW_REVID(b30, b29, b28, b27, b26, b23, b22) \ - (b30<<30 | b29<<29 | b28<<28 | b27<<27 | b26<<26 | b23<<23 | b22<<22) +#define HW_REVID(b31, b30, b29, b28, b27, b26, b23, b22) \ + (b31<<31 | b30<<30 | b29<<29 | b28<<28 | \ + b27<<27 | b26<<26 | b23<<23 | b22<<22) enum chip_type { RTLNONE, @@ -22,34 +23,48 @@ enum chip_type { RTL8139Cp, RTL8101, RTL8169, - RTL8169s, - RTL8110 + RTL8169S, + RTL8110S, + RTL8169_8110SB, + RTL8169_8110SCd, + RTL8169_8110SCe, + RTL8168_8111Bb, + RTL8168_8111Bef, + RTL8101Ebc, + RTL8100E1, + RTL8100E2, }; enum { - chip_type_mask = HW_REVID(1, 1, 1, 1, 1, 1, 1) + chip_type_mask = HW_REVID(1, 1, 1, 1, 1, 1, 1, 1) }; static struct chip_info { const char *name; u32 id_mask; } rtl_info_tbl[] = { - { "RTL-8139", HW_REVID(1, 0, 0, 0, 0, 0, 0) }, - { "RTL-8139-K", HW_REVID(1, 1, 0, 0, 0, 0, 0) }, - { "RTL-8139A", HW_REVID(1, 1, 1, 0, 0, 0, 0) }, - { "RTL-8139A-G", HW_REVID(1, 1, 1, 0, 0, 1, 0) }, - { "RTL-8139B", HW_REVID(1, 1, 1, 1, 0, 0, 0) }, - { "RTL-8130", HW_REVID(1, 1, 1, 1, 1, 0, 0) }, - { "RTL-8139C", HW_REVID(1, 1, 1, 0, 1, 0, 0) }, - { "RTL-8100", HW_REVID(1, 1, 1, 1, 0, 1, 0) }, - { "RTL-8100B/8139D", HW_REVID(1, 1, 1, 0, 1, 0, 1) }, - { "RTL-8139C+", HW_REVID(1, 1, 1, 0, 1, 1, 0) }, - { "RTL-8101", HW_REVID(1, 1, 1, 0, 1, 1, 1) }, - { "RTL-8168B/8111B", HW_REVID(0, 1, 1, 1, 0, 0, 0) }, - { "RTL-8101E", HW_REVID(0, 1, 1, 0, 1, 0, 0) }, - { "RTL-8169", HW_REVID(0, 0, 0, 0, 0, 0, 0) }, - { "RTL-8169s", HW_REVID(0, 0, 0, 0, 1, 0, 0) }, - { "RTL-8110", HW_REVID(0, 0, 1, 0, 0, 0, 0) }, + { "RTL-8139", HW_REVID(0, 1, 0, 0, 0, 0, 0, 0) }, + { "RTL-8139-K", HW_REVID(0, 1, 1, 0, 0, 0, 0, 0) }, + { "RTL-8139A", HW_REVID(0, 1, 1, 1, 0, 0, 0, 0) }, + { "RTL-8139A-G", HW_REVID(0, 1, 1, 1, 0, 0, 1, 0) }, + { "RTL-8139B", HW_REVID(0, 1, 1, 1, 1, 0, 0, 0) }, + { "RTL-8130", HW_REVID(0, 1, 1, 1, 1, 1, 0, 0) }, + { "RTL-8139C", HW_REVID(0, 1, 1, 1, 0, 1, 0, 0) }, + { "RTL-8100", HW_REVID(0, 1, 1, 1, 1, 0, 1, 0) }, + { "RTL-8100B/8139D", HW_REVID(0, 1, 1, 1, 0, 1, 0, 1) }, + { "RTL-8139C+", HW_REVID(0, 1, 1, 1, 0, 1, 1, 0) }, + { "RTL-8101", HW_REVID(0, 1, 1, 1, 0, 1, 1, 1) }, + { "RTL-8169", HW_REVID(0, 0, 0, 0, 0, 0, 0, 0) }, + { "RTL-8169S", HW_REVID(0, 0, 0, 0, 0, 0, 1, 0) }, + { "RTL-8110S", HW_REVID(0, 0, 0, 0, 0, 1, 0, 0) }, + { "RTL-8169/8110SB", HW_REVID(0, 0, 0, 1, 0, 0, 0, 0) }, + { "RTL-8169/8110SCd", HW_REVID(0, 0, 0, 1, 1, 0, 0, 0) }, + { "RTL-8169/8110SCe", HW_REVID(1, 0, 0, 1, 1, 0, 0, 0) }, + { "RTL-8168/8111Bb", HW_REVID(0, 0, 1, 1, 0, 0, 0, 0) }, + { "RTL-8168/8111Bef", HW_REVID(0, 0, 1, 1, 1, 0, 0, 0) }, + { "RTL-8101Ebc", HW_REVID(0, 0, 1, 1, 0, 1, 0, 0) }, + { "RTL-8100E(1)", HW_REVID(0, 0, 1, 1, 0, 0, 1, 0) }, + { "RTL-8100E(2)", HW_REVID(0, 0, 1, 1, 1, 0, 1, 0) }, { } }; @@ -89,7 +104,7 @@ realtek_dump_regs(struct ethtool_drvinfo *info, struct ethtool_regs *regs) ci++; } if (v != ci->id_mask) { - fprintf(stderr, "unknown RealTek chip\n"); + fprintf(stderr, "Unknown RealTek chip (mask: 0x%08x)\n", v); return 91; } for (i = 0; i < ARRAY_SIZE(rtl_info_tbl); i++) { @@ -101,7 +116,7 @@ realtek_dump_regs(struct ethtool_drvinfo *info, struct ethtool_regs *regs) fprintf(stdout, "RealTek %s registers:\n" - "------------------------------\n", + "--------------------------------------------------------\n", ci->name); fprintf(stdout, @@ -118,10 +133,7 @@ realtek_dump_regs(struct ethtool_drvinfo *info, struct ethtool_regs *regs) data[0x08 >> 2], data[0x0c >> 2]); - if (board_type == RTL8139Cp || - board_type == RTL8169 || - board_type == RTL8169s || - board_type == RTL8110) { + if (board_type == RTL8139Cp || board_type >= RTL8169) { fprintf(stdout, "0x10: Dump Tally Counter Command 0x%08x 0x%08x\n", data[0x10 >> 2], @@ -157,9 +169,8 @@ realtek_dump_regs(struct ethtool_drvinfo *info, struct ethtool_regs *regs) data[0x2C >> 2]); } - if (board_type == RTL8169 || - board_type == RTL8169s || - board_type == RTL8110) { + if (board_type != RTL8168_8111Bb && board_type != RTL8168_8111Bef) { + if (board_type >= RTL8169) { fprintf(stdout, "0x30: Flash memory read/write 0x%08x\n", data[0x30 >> 2]); @@ -168,6 +179,7 @@ realtek_dump_regs(struct ethtool_drvinfo *info, struct ethtool_regs *regs) "0x30: Rx buffer addr (C mode) 0x%08x\n", data[0x30 >> 2]); } + } v = data8[0x36]; fprintf(stdout, @@ -194,9 +206,7 @@ realtek_dump_regs(struct ethtool_drvinfo *info, struct ethtool_regs *regs) v & (1 << 2) ? "on" : "off", v & (1 << 4) ? ", RESET" : ""); - if (board_type != RTL8169 && - board_type != RTL8169s && - board_type != RTL8110) { + if (board_type < RTL8169) { fprintf(stdout, "0x38: Current Address of Packet Read (C mode) 0x%04x\n" "0x3A: Current Rx buffer address (C mode) 0x%04x\n", @@ -231,9 +241,7 @@ realtek_dump_regs(struct ethtool_drvinfo *info, struct ethtool_regs *regs) data8[0x51], data8[0x52]); - if (board_type == RTL8169 || - board_type == RTL8169s || - board_type == RTL8110) { + if (board_type >= RTL8169) { fprintf(stdout, "0x53: Config 2 0x%02x\n" "0x54: Config 3 0x%02x\n" @@ -272,20 +280,21 @@ realtek_dump_regs(struct ethtool_drvinfo *info, struct ethtool_regs *regs) "0x5C: Multiple Interrupt Select 0x%04x\n", data[0x5c >> 2] & 0xffff); - if (board_type == RTL8169 || - board_type == RTL8169s || - board_type == RTL8110) { + if (board_type >= RTL8169) { + fprintf(stdout, + "0x60: PHY access 0x%08x\n", + data[0x60 >> 2]); + + if (board_type != RTL8168_8111Bb && board_type != RTL8168_8111Bef) { fprintf(stdout, - "0x60: PHY access 0x%08x\n" "0x64: TBI control and status 0x%08x\n", - data[0x60 >> 2], data[0x64 >> 2]); - fprintf(stdout, "0x68: TBI Autonegotiation advertisement (ANAR) 0x%04x\n" "0x6A: TBI Link partner ability (LPAR) 0x%04x\n", data[0x68 >> 2] & 0xffff, data[0x68 >> 2] >> 16); + } fprintf(stdout, "0x6C: PHY status 0x%02x\n", @@ -465,10 +474,7 @@ realtek_dump_regs(struct ethtool_drvinfo *info, struct ethtool_regs *regs) } } - if (board_type == RTL8139Cp || - board_type == RTL8169 || - board_type == RTL8169s || - board_type == RTL8110) { + if (board_type == RTL8139Cp || board_type >= RTL8169) { v = data[0xE0 >> 2] & 0xffff; fprintf(stdout, "0xE0: C+ Command 0x%04x\n", @@ -512,6 +518,18 @@ realtek_dump_regs(struct ethtool_drvinfo *info, struct ethtool_regs *regs) fprintf(stdout, "0xFC: External MII register 0x%08x\n", data[0xFC >> 2]); + } else if (board_type >= RTL8169 && + board_type != RTL8168_8111Bb && + board_type != RTL8168_8111Bef) { + fprintf(stdout, + "0xF0: Func Event 0x%08x\n" + "0xF4: Func Event Mask 0x%08x\n" + "0xF8: Func Preset State 0x%08x\n" + "0xFC: Func Force Event 0x%08x\n", + data[0xF0 >> 2], + data[0xF4 >> 2], + data[0xF8 >> 2], + data[0xFC >> 2]); } } |