summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--realtek.c108
1 files changed, 63 insertions, 45 deletions
diff --git a/realtek.c b/realtek.c
index c3d7ae5..17b0b7e 100644
--- a/realtek.c
+++ b/realtek.c
@@ -5,13 +5,8 @@
#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
-#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,
- RTL8139,
+ RTL8139 = 1,
RTL8139_K,
RTL8139A,
RTL8139A_G,
@@ -22,6 +17,8 @@ enum chip_type {
RTL8100B_8139D,
RTL8139Cp,
RTL8101,
+
+ /* chips not handled by 8139too/8139cp module */
RTL8169,
RTL8169S,
RTL8110S,
@@ -35,36 +32,62 @@ enum chip_type {
RTL8100E2,
};
-enum {
- chip_type_mask = HW_REVID(1, 1, 1, 1, 1, 1, 1, 1)
+static const char * const chip_names[] = {
+ [RTL8139] = "8139",
+ [RTL8139_K] = "8139-K",
+ [RTL8139A] = "8139A",
+ [RTL8139A_G] = "8139A-G",
+ [RTL8139B] = "8139B",
+ [RTL8130] = "8130",
+ [RTL8139C] = "8139C",
+ [RTL8100] = "8100",
+ [RTL8100B_8139D] = "8100B/8139D",
+ [RTL8139Cp] = "8139C+",
+ [RTL8101] = "8101",
+
+ /* chips not handled by 8139too/8139cp module */
+ [RTL8169] = "8169",
+ [RTL8169S] = "8169S",
+ [RTL8110S] = "8110S",
+ [RTL8169_8110SB] = "8169/8110SB",
+ [RTL8169_8110SCd] = "8169/8110SCd",
+ [RTL8169_8110SCe] = "8169/8110SCe",
+ [RTL8168_8111Bb] = "8168/8111Bb",
+ [RTL8168_8111Bef] = "8168/8111Bef",
+ [RTL8101Ebc] = "8101Ebc",
+ [RTL8100E1] = "8100E(1)",
+ [RTL8100E2] = "8100E(2)",
};
static struct chip_info {
- const char *name;
u32 id_mask;
+ u32 id_val;
+ int mac_version;
} rtl_info_tbl[] = {
- { "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) },
+ { 0xfcc00000, 0x40000000, RTL8139 },
+ { 0xfcc00000, 0x60000000, RTL8139_K },
+ { 0xfcc00000, 0x70000000, RTL8139A },
+ { 0xfcc00000, 0x70800000, RTL8139A_G },
+ { 0xfcc00000, 0x78000000, RTL8139B },
+ { 0xfcc00000, 0x7c000000, RTL8130 },
+ { 0xfcc00000, 0x74000000, RTL8139C },
+ { 0xfcc00000, 0x78800000, RTL8100 },
+ { 0xfcc00000, 0x74400000, RTL8100B_8139D },
+ { 0xfcc00000, 0x74800000, RTL8139Cp },
+ { 0xfcc00000, 0x74c00000, RTL8101 },
+
+ /* chips not handled by 8139too/8139cp module */
+ { 0xfcc00000, 0x00000000, RTL8169 },
+ { 0xfcc00000, 0x00800000, RTL8169S },
+ { 0xfcc00000, 0x04000000, RTL8110S },
+ { 0xfcc00000, 0x10000000, RTL8169_8110SB },
+ { 0xfcc00000, 0x18000000, RTL8169_8110SCd },
+ { 0xfcc00000, 0x98000000, RTL8169_8110SCe },
+ { 0xfcc00000, 0x30000000, RTL8168_8111Bb },
+ { 0xfcc00000, 0x38000000, RTL8168_8111Bef },
+ { 0xfcc00000, 0x34000000, RTL8101Ebc },
+ { 0xfcc00000, 0x30800000, RTL8100E1 },
+ { 0xfcc00000, 0x38800000, RTL8100E2 },
{ }
};
@@ -93,31 +116,26 @@ realtek_dump_regs(struct ethtool_drvinfo *info, struct ethtool_regs *regs)
u8 *data8 = (u8 *) regs->data;
u32 v;
struct chip_info *ci;
- unsigned int board_type = RTLNONE, i;
+ unsigned int board_type;
- v = data[0x40 >> 2] & chip_type_mask;
+ v = data[0x40 >> 2]; /* TxConfig */
ci = &rtl_info_tbl[0];
- while (ci->name) {
- if (v == ci->id_mask)
+ while (ci->mac_version) {
+ if ((v & ci->id_mask) == ci->id_val)
break;
ci++;
}
- if (v != ci->id_mask) {
- fprintf(stderr, "Unknown RealTek chip (mask: 0x%08x)\n", v);
+ board_type = ci->mac_version;
+ if (!board_type) {
+ fprintf(stderr, "Unknown RealTek chip (TxConfig: 0x%08x)\n", v);
return 91;
}
- for (i = 0; i < ARRAY_SIZE(rtl_info_tbl); i++) {
- if (ci == &rtl_info_tbl[i])
- board_type = i + 1;
- }
- if (board_type == RTLNONE)
- abort();
fprintf(stdout,
- "RealTek %s registers:\n"
+ "RealTek RTL%s registers:\n"
"--------------------------------------------------------\n",
- ci->name);
+ chip_names[board_type]);
fprintf(stdout,
"0x00: MAC Address %02x:%02x:%02x:%02x:%02x:%02x\n",