netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [ethtool] Add new Realtek devices
@ 2013-07-23  8:51 Peter Wu
  2013-07-23  8:51 ` [PATCH 1/2] realtek: convert to per-chip mask Peter Wu
                   ` (4 more replies)
  0 siblings, 5 replies; 10+ messages in thread
From: Peter Wu @ 2013-07-23  8:51 UTC (permalink / raw)
  To: Ben Hutchings, Francois Romieu; +Cc: netdev

Hi,

The list of devices supported by `ethtool -d eth0` was quite outdated
and did not support my onboard NIC. With the following two patches, the
supported devices list will be in sync with the r8169 kernel driver
(r8169 as of 3.11). Note that no new registers have been added, I am
sure that some registers are incorrect (like the Power Management wakeup
frames), but important information such as MAC address is still correct.

Another note, I have observed that memcpy_fromio results in invalid
reads for the RTL8111E (via `ethtool -d`). In fact, any reads of size
greater than or equal to 8 result in a sequence of FFs. As a quick hack,
I patched r8169 to perform reads of word size (see bottom), but I am not
sure what the cause is of this strange behavior. Francois, perhaps you
have an idea why reading in blocks of larger than 7 results in a error?

Regards,
Peter
---
--- a/drivers/net/ethernet/realtek/r8169.c
+++ b/drivers/net/ethernet/realtek/r8169.c
@@ -1897,12 +2050,17 @@ static void rtl8169_get_regs(struct net_device *dev, 
struct ethtool_regs *regs,
 			     void *p)
 {
 	struct rtl8169_private *tp = netdev_priv(dev);
+	char *bytes = p;
+	int i;
 
 	if (regs->len > R8169_REGS_SIZE)
 		regs->len = R8169_REGS_SIZE;
 
 	rtl_lock_work(tp);
-	memcpy_fromio(p, tp->mmio_addr, regs->len);
+	for (i = 0; i < regs->len - 4; i += 4)
+		memcpy_fromio(bytes + i, tp->mmio_addr + i, 4);
+	if (i < regs->len)
+		memcpy_fromio(bytes + i, tp->mmio_addr + i, regs->len - i);
 	rtl_unlock_work(tp);
 }

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [PATCH 1/2] realtek: convert to per-chip mask
  2013-07-23  8:51 [ethtool] Add new Realtek devices Peter Wu
@ 2013-07-23  8:51 ` Peter Wu
  2013-07-23 17:56   ` Ben Hutchings
  2013-07-23  8:51 ` [PATCH 2/2] realtek: update devices to 3.11 Peter Wu
                   ` (3 subsequent siblings)
  4 siblings, 1 reply; 10+ messages in thread
From: Peter Wu @ 2013-07-23  8:51 UTC (permalink / raw)
  To: Ben Hutchings, Francois Romieu; +Cc: netdev

The previous HW_REVID macro did not make identifiers more readable
(compared to hex values like 0x12345678) and only allowed for one static
mask. To make it easier to update the chips list, let's use similar
structures as r8169 and remove HW_REVID.

Names are removed and separated from the table and separated because the
mac_version does not have to be unique.

There are no functional changes for the output, except that the output
now mentions "TxConfig" instead of "mask" when a chip is not found.
Since the mask can be anything, the word is not masked either.

Signed-off-by: Peter Wu <lekensteyn@gmail.com>
---
 realtek.c | 106 
++++++++++++++++++++++++++++++++++++--------------------------
 1 file changed, 62 insertions(+), 44 deletions(-)

diff --git a/realtek.c b/realtek.c
index c3d7ae5..5a1fba7 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] = "RTL-8139",
+	[RTL8139_K] = "RTL-8139-K",
+	[RTL8139A] = "RTL-8139A",
+	[RTL8139A_G] = "RTL-8139A-G",
+	[RTL8139B] = "RTL-8139B",
+	[RTL8130] = "RTL-8130",
+	[RTL8139C] = "RTL-8139C",
+	[RTL8100] = "RTL-8100",
+	[RTL8100B_8139D] = "RTL-8100B/8139D",
+	[RTL8139C] = "RTL-8139C+",
+	[RTL8101] = "RTL-8101",
+
+	/* chips not handled by 8139too/8139cp module */
+	[RTL8169] = "RTL-8169",
+	[RTL8169S] = "RTL-8169S",
+	[RTL8110S] = "RTL-8110S",
+	[RTL8169_8110SB] = "RTL-8169/8110SB",
+	[RTL8169_8110SCd] = "RTL-8169/8110SCd",
+	[RTL8169_8110SCe] = "RTL-8169/8110SCe",
+	[RTL8168_8111Bb] = "RTL-8168/8111Bb",
+	[RTL8168_8111Bef] = "RTL-8168/8111Bef",
+	[RTL8101Ebc] = "RTL-8101Ebc",
+	[RTL8100E1] = "RTL-8100E(1)",
+	[RTL8100E2] = "RTL-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,	RTL8139C },
+	{ 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, 0x68000000,	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"
 		"--------------------------------------------------------\n",
-		ci->name);
+		chip_names[board_type]);
 
 	fprintf(stdout,
 		"0x00: MAC Address                      %02x:%02x:%02x:%02x:%02x:
%02x\n",
-- 
1.8.3.3

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [PATCH 2/2] realtek: update devices to 3.11
  2013-07-23  8:51 [ethtool] Add new Realtek devices Peter Wu
  2013-07-23  8:51 ` [PATCH 1/2] realtek: convert to per-chip mask Peter Wu
@ 2013-07-23  8:51 ` Peter Wu
  2013-07-23 18:04 ` [PATCH v2 " Peter Wu
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 10+ messages in thread
From: Peter Wu @ 2013-07-23  8:51 UTC (permalink / raw)
  To: Ben Hutchings, Francois Romieu; +Cc: netdev

RTL8168_8111Bb/RTL8168_8111Bef is like RTL8111B/RTL8168B, RTL8100E and 
RTL8101E
(datasheet revision 1.0 from 26 January 2006). Assume that RTL8101e is also
similar (I may be very wrong at that though...).

Note that the scanning heuristics is the same as the r8169 module: newer 
devices
with stronger masks come before the others. Perhaps the older 8139 cards 
should
be appended to the list, after all r8169 chips.

Signed-off-by: Peter Wu <lekensteyn@gmail.com>
---
 realtek.c | 221 
+++++++++++++++++++++++++++++++++++++++++++++++++-------------
 1 file changed, 177 insertions(+), 44 deletions(-)

diff --git a/realtek.c b/realtek.c
index 5a1fba7..a4bc680 100644
--- a/realtek.c
+++ b/realtek.c
@@ -19,17 +19,50 @@ enum chip_type {
 	RTL8101,
 
 	/* chips not handled by 8139too/8139cp module */
-	RTL8169,
-	RTL8169S,
-	RTL8110S,
-	RTL8169_8110SB,
-	RTL8169_8110SCd,
-	RTL8169_8110SCe,
-	RTL8168_8111Bb,
-	RTL8168_8111Bef,
-	RTL8101Ebc,
-	RTL8100E1,
-	RTL8100E2,
+	RTL_GIGA_MAC_VER_01,
+	RTL_GIGA_MAC_VER_02,
+	RTL_GIGA_MAC_VER_03,
+	RTL_GIGA_MAC_VER_04,
+	RTL_GIGA_MAC_VER_05,
+	RTL_GIGA_MAC_VER_06,
+	RTL_GIGA_MAC_VER_07,
+	RTL_GIGA_MAC_VER_08,
+	RTL_GIGA_MAC_VER_09,
+	RTL_GIGA_MAC_VER_10,
+	RTL_GIGA_MAC_VER_11,
+	RTL_GIGA_MAC_VER_12,
+	RTL_GIGA_MAC_VER_13,
+	RTL_GIGA_MAC_VER_14,
+	RTL_GIGA_MAC_VER_15,
+	RTL_GIGA_MAC_VER_16,
+	RTL_GIGA_MAC_VER_17,
+	RTL_GIGA_MAC_VER_18,
+	RTL_GIGA_MAC_VER_19,
+	RTL_GIGA_MAC_VER_20,
+	RTL_GIGA_MAC_VER_21,
+	RTL_GIGA_MAC_VER_22,
+	RTL_GIGA_MAC_VER_23,
+	RTL_GIGA_MAC_VER_24,
+	RTL_GIGA_MAC_VER_25,
+	RTL_GIGA_MAC_VER_26,
+	RTL_GIGA_MAC_VER_27,
+	RTL_GIGA_MAC_VER_28,
+	RTL_GIGA_MAC_VER_29,
+	RTL_GIGA_MAC_VER_30,
+	RTL_GIGA_MAC_VER_31,
+	RTL_GIGA_MAC_VER_32,
+	RTL_GIGA_MAC_VER_33,
+	RTL_GIGA_MAC_VER_34,
+	RTL_GIGA_MAC_VER_35,
+	RTL_GIGA_MAC_VER_36,
+	RTL_GIGA_MAC_VER_37,
+	RTL_GIGA_MAC_VER_38,
+	RTL_GIGA_MAC_VER_39,
+	RTL_GIGA_MAC_VER_40,
+	RTL_GIGA_MAC_VER_41,
+	RTL_GIGA_MAC_VER_42,
+	RTL_GIGA_MAC_VER_43,
+	RTL_GIGA_MAC_VER_44,
 };
 
 static const char * const chip_names[] = {
@@ -46,17 +79,50 @@ static const char * const chip_names[] = {
 	[RTL8101] = "RTL-8101",
 
 	/* chips not handled by 8139too/8139cp module */
-	[RTL8169] = "RTL-8169",
-	[RTL8169S] = "RTL-8169S",
-	[RTL8110S] = "RTL-8110S",
-	[RTL8169_8110SB] = "RTL-8169/8110SB",
-	[RTL8169_8110SCd] = "RTL-8169/8110SCd",
-	[RTL8169_8110SCe] = "RTL-8169/8110SCe",
-	[RTL8168_8111Bb] = "RTL-8168/8111Bb",
-	[RTL8168_8111Bef] = "RTL-8168/8111Bef",
-	[RTL8101Ebc] = "RTL-8101Ebc",
-	[RTL8100E1] = "RTL-8100E(1)",
-	[RTL8100E2] = "RTL-8100E(2)",
+	[RTL_GIGA_MAC_VER_01] = "RTL8169",
+	[RTL_GIGA_MAC_VER_02] = "RTL8169s",
+	[RTL_GIGA_MAC_VER_03] = "RTL8110s",
+	[RTL_GIGA_MAC_VER_04] = "RTL8169sb/8110sb",
+	[RTL_GIGA_MAC_VER_05] = "RTL8169sc/8110sc",
+	[RTL_GIGA_MAC_VER_06] = "RTL8169sc/8110sc",
+	[RTL_GIGA_MAC_VER_07] = "RTL8102e",
+	[RTL_GIGA_MAC_VER_08] = "RTL8102e",
+	[RTL_GIGA_MAC_VER_09] = "RTL8102e",
+	[RTL_GIGA_MAC_VER_10] = "RTL8101e",
+	[RTL_GIGA_MAC_VER_11] = "RTL8168b/8111b",
+	[RTL_GIGA_MAC_VER_12] = "RTL8168b/8111b",
+	[RTL_GIGA_MAC_VER_13] = "RTL8101e",
+	[RTL_GIGA_MAC_VER_14] = "RTL8100e",
+	[RTL_GIGA_MAC_VER_15] = "RTL8100e",
+	[RTL_GIGA_MAC_VER_16] = "RTL8101e",
+	[RTL_GIGA_MAC_VER_17] = "RTL8168b/8111b",
+	[RTL_GIGA_MAC_VER_18] = "RTL8168cp/8111cp",
+	[RTL_GIGA_MAC_VER_19] = "RTL8168c/8111c",
+	[RTL_GIGA_MAC_VER_20] = "RTL8168c/8111c",
+	[RTL_GIGA_MAC_VER_21] = "RTL8168c/8111c",
+	[RTL_GIGA_MAC_VER_22] = "RTL8168c/8111c",
+	[RTL_GIGA_MAC_VER_23] = "RTL8168cp/8111cp",
+	[RTL_GIGA_MAC_VER_24] = "RTL8168cp/8111cp",
+	[RTL_GIGA_MAC_VER_25] = "RTL8168d/8111d",
+	[RTL_GIGA_MAC_VER_26] = "RTL8168d/8111d",
+	[RTL_GIGA_MAC_VER_27] = "RTL8168dp/8111dp",
+	[RTL_GIGA_MAC_VER_28] = "RTL8168dp/8111dp",
+	[RTL_GIGA_MAC_VER_29] = "RTL8105e",
+	[RTL_GIGA_MAC_VER_30] = "RTL8105e",
+	[RTL_GIGA_MAC_VER_31] = "RTL8168dp/8111dp",
+	[RTL_GIGA_MAC_VER_32] = "RTL8168e/8111e",
+	[RTL_GIGA_MAC_VER_33] = "RTL8168e/8111e",
+	[RTL_GIGA_MAC_VER_34] = "RTL8168evl/8111evl",
+	[RTL_GIGA_MAC_VER_35] = "RTL8168f/8111f",
+	[RTL_GIGA_MAC_VER_36] = "RTL8168f/8111f",
+	[RTL_GIGA_MAC_VER_37] = "RTL8402",
+	[RTL_GIGA_MAC_VER_38] = "RTL8411",
+	[RTL_GIGA_MAC_VER_39] = "RTL8106e",
+	[RTL_GIGA_MAC_VER_40] = "RTL8168g/8111g",
+	[RTL_GIGA_MAC_VER_41] = "RTL8168g/8111g",
+	[RTL_GIGA_MAC_VER_42] = "RTL8168g/8111g",
+	[RTL_GIGA_MAC_VER_43] = "RTL8106e",
+	[RTL_GIGA_MAC_VER_44] = "RTL8411",
 };
 
 static struct chip_info {
@@ -77,17 +143,82 @@ static struct chip_info {
 	{ 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, 0x68000000,	RTL8169_8110SCe },
-	{ 0xfcc00000, 0x30000000,	RTL8168_8111Bb },
-	{ 0xfcc00000, 0x38000000,	RTL8168_8111Bef },
-	{ 0xfcc00000, 0x34000000,	RTL8101Ebc },
-	{ 0xfcc00000, 0x30800000,	RTL8100E1 },
-	{ 0xfcc00000, 0x38800000,	RTL8100E2 },
+	/* 8168G family. */
+	{ 0x7cf00000, 0x5c800000,	RTL_GIGA_MAC_VER_44 },
+	{ 0x7cf00000, 0x50900000,	RTL_GIGA_MAC_VER_42 },
+	{ 0x7cf00000, 0x4c100000,	RTL_GIGA_MAC_VER_41 },
+	{ 0x7cf00000, 0x4c000000,	RTL_GIGA_MAC_VER_40 },
+
+	/* 8168F family. */
+	{ 0x7c800000, 0x48800000,	RTL_GIGA_MAC_VER_38 },
+	{ 0x7cf00000, 0x48100000,	RTL_GIGA_MAC_VER_36 },
+	{ 0x7cf00000, 0x48000000,	RTL_GIGA_MAC_VER_35 },
+
+	/* 8168E family. */
+	{ 0x7c800000, 0x2c800000,	RTL_GIGA_MAC_VER_34 },
+	{ 0x7cf00000, 0x2c200000,	RTL_GIGA_MAC_VER_33 },
+	{ 0x7cf00000, 0x2c100000,	RTL_GIGA_MAC_VER_32 },
+	{ 0x7c800000, 0x2c000000,	RTL_GIGA_MAC_VER_33 },
+
+	/* 8168D family. */
+	{ 0x7cf00000, 0x28300000,	RTL_GIGA_MAC_VER_26 },
+	{ 0x7cf00000, 0x28100000,	RTL_GIGA_MAC_VER_25 },
+	{ 0x7c800000, 0x28000000,	RTL_GIGA_MAC_VER_26 },
+
+	/* 8168DP family. */
+	{ 0x7cf00000, 0x28800000,	RTL_GIGA_MAC_VER_27 },
+	{ 0x7cf00000, 0x28a00000,	RTL_GIGA_MAC_VER_28 },
+	{ 0x7cf00000, 0x28b00000,	RTL_GIGA_MAC_VER_31 },
+
+	/* 8168C family. */
+	{ 0x7cf00000, 0x3cb00000,	RTL_GIGA_MAC_VER_24 },
+	{ 0x7cf00000, 0x3c900000,	RTL_GIGA_MAC_VER_23 },
+	{ 0x7cf00000, 0x3c800000,	RTL_GIGA_MAC_VER_18 },
+	{ 0x7c800000, 0x3c800000,	RTL_GIGA_MAC_VER_24 },
+	{ 0x7cf00000, 0x3c000000,	RTL_GIGA_MAC_VER_19 },
+	{ 0x7cf00000, 0x3c200000,	RTL_GIGA_MAC_VER_20 },
+	{ 0x7cf00000, 0x3c300000,	RTL_GIGA_MAC_VER_21 },
+	{ 0x7cf00000, 0x3c400000,	RTL_GIGA_MAC_VER_22 },
+	{ 0x7c800000, 0x3c000000,	RTL_GIGA_MAC_VER_22 },
+
+	/* 8168B family. */
+	{ 0x7cf00000, 0x38000000,	RTL_GIGA_MAC_VER_12 },
+	{ 0x7cf00000, 0x38500000,	RTL_GIGA_MAC_VER_17 },
+	{ 0x7c800000, 0x38000000,	RTL_GIGA_MAC_VER_17 },
+	{ 0x7c800000, 0x30000000,	RTL_GIGA_MAC_VER_11 },
+
+	/* 8101 family. */
+	{ 0x7cf00000, 0x44900000,	RTL_GIGA_MAC_VER_39 },
+	{ 0x7c800000, 0x44800000,	RTL_GIGA_MAC_VER_39 },
+	{ 0x7c800000, 0x44000000,	RTL_GIGA_MAC_VER_37 },
+	{ 0x7cf00000, 0x40b00000,	RTL_GIGA_MAC_VER_30 },
+	{ 0x7cf00000, 0x40a00000,	RTL_GIGA_MAC_VER_30 },
+	{ 0x7cf00000, 0x40900000,	RTL_GIGA_MAC_VER_29 },
+	{ 0x7c800000, 0x40800000,	RTL_GIGA_MAC_VER_30 },
+	{ 0x7cf00000, 0x34a00000,	RTL_GIGA_MAC_VER_09 },
+	{ 0x7cf00000, 0x24a00000,	RTL_GIGA_MAC_VER_09 },
+	{ 0x7cf00000, 0x34900000,	RTL_GIGA_MAC_VER_08 },
+	{ 0x7cf00000, 0x24900000,	RTL_GIGA_MAC_VER_08 },
+	{ 0x7cf00000, 0x34800000,	RTL_GIGA_MAC_VER_07 },
+	{ 0x7cf00000, 0x24800000,	RTL_GIGA_MAC_VER_07 },
+	{ 0x7cf00000, 0x34000000,	RTL_GIGA_MAC_VER_13 },
+	{ 0x7cf00000, 0x34300000,	RTL_GIGA_MAC_VER_10 },
+	{ 0x7cf00000, 0x34200000,	RTL_GIGA_MAC_VER_16 },
+	{ 0x7c800000, 0x34800000,	RTL_GIGA_MAC_VER_09 },
+	{ 0x7c800000, 0x24800000,	RTL_GIGA_MAC_VER_09 },
+	{ 0x7c800000, 0x34000000,	RTL_GIGA_MAC_VER_16 },
+	/* FIXME: where did these entries come from ? -- FR */
+	{ 0xfc800000, 0x38800000,	RTL_GIGA_MAC_VER_15 },
+	{ 0xfc800000, 0x30800000,	RTL_GIGA_MAC_VER_14 },
+
+	/* 8110 family. */
+	{ 0xfc800000, 0x98000000,	RTL_GIGA_MAC_VER_06 },
+	{ 0xfc800000, 0x18000000,	RTL_GIGA_MAC_VER_05 },
+	{ 0xfc800000, 0x10000000,	RTL_GIGA_MAC_VER_04 },
+	{ 0xfc800000, 0x04000000,	RTL_GIGA_MAC_VER_03 },
+	{ 0xfc800000, 0x00800000,	RTL_GIGA_MAC_VER_02 },
+	{ 0xfc800000, 0x00000000,	RTL_GIGA_MAC_VER_01 },
+
 	{ }
 };
 
@@ -151,7 +282,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) {
+	if (board_type == RTL8139Cp || board_type >= RTL_GIGA_MAC_VER_01) {
 	fprintf(stdout,
 		"0x10: Dump Tally Counter Command   0x%08x 0x%08x\n",
 		data[0x10 >> 2],
@@ -187,8 +318,9 @@ realtek_dump_regs(struct ethtool_drvinfo *info, struct 
ethtool_regs *regs)
 		data[0x2C >> 2]);
 	}
 
-	if (board_type != RTL8168_8111Bb && board_type != RTL8168_8111Bef) {
-	if (board_type >= RTL8169) {
+	if (board_type < RTL_GIGA_MAC_VER_11 ||
+		board_type > RTL_GIGA_MAC_VER_17) {
+	if (board_type >= RTL_GIGA_MAC_VER_01) {
 	fprintf(stdout,
 		"0x30: Flash memory read/write                 0x%08x\n",
 		data[0x30 >> 2]);
@@ -224,7 +356,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) {
+	if (board_type < RTL_GIGA_MAC_VER_01) {
 	fprintf(stdout,
 		"0x38: Current Address of Packet Read (C mode)     0x%04x\n"
 		"0x3A: Current Rx buffer address (C mode)          0x%04x\n",
@@ -259,7 +391,7 @@ realtek_dump_regs(struct ethtool_drvinfo *info, struct 
ethtool_regs *regs)
 		data8[0x51],
 		data8[0x52]);
 
-	if (board_type >= RTL8169) {
+	if (board_type >= RTL_GIGA_MAC_VER_01) {
 	fprintf(stdout,
 		"0x53: Config 2                                      0x%02x\n"
 		"0x54: Config 3                                      0x%02x\n"
@@ -298,12 +430,13 @@ 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) {
+	if (board_type >= RTL_GIGA_MAC_VER_01) {
 	fprintf(stdout,
 		"0x60: PHY access                              0x%08x\n",
 		data[0x60 >> 2]);
 
-	if (board_type != RTL8168_8111Bb && board_type != RTL8168_8111Bef) {
+	if (board_type < RTL_GIGA_MAC_VER_11 ||
+		board_type > RTL_GIGA_MAC_VER_17) {
 	fprintf(stdout,
 		"0x64: TBI control and status                  0x%08x\n",
 		data[0x64 >> 2]);
@@ -492,7 +625,7 @@ realtek_dump_regs(struct ethtool_drvinfo *info, struct 
ethtool_regs *regs)
 	}
 	}
 
-	if (board_type == RTL8139Cp || board_type >= RTL8169) {
+	if (board_type == RTL8139Cp || board_type >= RTL_GIGA_MAC_VER_01) {
 	v = data[0xE0 >> 2] & 0xffff;
 	fprintf(stdout,
 		"0xE0: C+ Command                                  0x%04x\n",
@@ -536,9 +669,9 @@ 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) {
+	} else if (board_type >= RTL_GIGA_MAC_VER_01 &&
+		(board_type < RTL_GIGA_MAC_VER_11 ||
+		board_type > RTL_GIGA_MAC_VER_17)) {
 	fprintf(stdout,
 		"0xF0: Func Event                              0x%08x\n"
 		"0xF4: Func Event Mask                         0x%08x\n"
-- 
1.8.3.3

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH 1/2] realtek: convert to per-chip mask
  2013-07-23  8:51 ` [PATCH 1/2] realtek: convert to per-chip mask Peter Wu
@ 2013-07-23 17:56   ` Ben Hutchings
  0 siblings, 0 replies; 10+ messages in thread
From: Ben Hutchings @ 2013-07-23 17:56 UTC (permalink / raw)
  To: Peter Wu; +Cc: Francois Romieu, netdev

On Tue, 2013-07-23 at 10:51 +0200, Peter Wu wrote:
> The previous HW_REVID macro did not make identifiers more readable
> (compared to hex values like 0x12345678) and only allowed for one static
> mask. To make it easier to update the chips list, let's use similar
> structures as r8169 and remove HW_REVID.
> 
> Names are removed and separated from the table and separated because the
> mac_version does not have to be unique.
> 
> There are no functional changes for the output, except that the output
> now mentions "TxConfig" instead of "mask" when a chip is not found.
> Since the mask can be anything, the word is not masked either.
> 
> Signed-off-by: Peter Wu <lekensteyn@gmail.com>
> ---
>  realtek.c | 106 
> ++++++++++++++++++++++++++++++++++++--------------------------
>  1 file changed, 62 insertions(+), 44 deletions(-)
[...]

This patch has been corrupted by your mailer (specifically, it has been
word-wrapped).  See Documentation/email-clients.txt in the Linux source
tree.

Ben.

-- 
Ben Hutchings, Staff Engineer, Solarflare
Not speaking for my employer; that's the marketing department's job.
They asked us to note that Solarflare product names are trademarked.

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [PATCH v2 2/2] realtek: update devices to 3.11
  2013-07-23  8:51 [ethtool] Add new Realtek devices Peter Wu
  2013-07-23  8:51 ` [PATCH 1/2] realtek: convert to per-chip mask Peter Wu
  2013-07-23  8:51 ` [PATCH 2/2] realtek: update devices to 3.11 Peter Wu
@ 2013-07-23 18:04 ` Peter Wu
  2013-07-23 18:05 ` [PATCH v2 1/2] realtek: convert to per-chip mask Peter Wu
  2013-07-23 20:25 ` [ethtool] Add new Realtek devices Francois Romieu
  4 siblings, 0 replies; 10+ messages in thread
From: Peter Wu @ 2013-07-23 18:04 UTC (permalink / raw)
  To: Ben Hutchings; +Cc: Francois Romieu, netdev

RTL8168_8111Bb/RTL8168_8111Bef is like RTL8111B/RTL8168B, RTL8100E and RTL8101E
(datasheet revision 1.0 from 26 January 2006). Assume that RTL8101e is also
similar (I may be very wrong at that though...).

Note that the scanning heuristics is the same as the r8169 module: newer devices
with stronger masks come before the others. Perhaps the older 8139 cards should
be appended to the list, after all r8169 chips.

Signed-off-by: Peter Wu <lekensteyn@gmail.com>
---
 realtek.c | 221 +++++++++++++++++++++++++++++++++++++++++++++++++-------------
 1 file changed, 177 insertions(+), 44 deletions(-)

diff --git a/realtek.c b/realtek.c
index 5a1fba7..a4bc680 100644
--- a/realtek.c
+++ b/realtek.c
@@ -19,17 +19,50 @@ enum chip_type {
 	RTL8101,
 
 	/* chips not handled by 8139too/8139cp module */
-	RTL8169,
-	RTL8169S,
-	RTL8110S,
-	RTL8169_8110SB,
-	RTL8169_8110SCd,
-	RTL8169_8110SCe,
-	RTL8168_8111Bb,
-	RTL8168_8111Bef,
-	RTL8101Ebc,
-	RTL8100E1,
-	RTL8100E2,
+	RTL_GIGA_MAC_VER_01,
+	RTL_GIGA_MAC_VER_02,
+	RTL_GIGA_MAC_VER_03,
+	RTL_GIGA_MAC_VER_04,
+	RTL_GIGA_MAC_VER_05,
+	RTL_GIGA_MAC_VER_06,
+	RTL_GIGA_MAC_VER_07,
+	RTL_GIGA_MAC_VER_08,
+	RTL_GIGA_MAC_VER_09,
+	RTL_GIGA_MAC_VER_10,
+	RTL_GIGA_MAC_VER_11,
+	RTL_GIGA_MAC_VER_12,
+	RTL_GIGA_MAC_VER_13,
+	RTL_GIGA_MAC_VER_14,
+	RTL_GIGA_MAC_VER_15,
+	RTL_GIGA_MAC_VER_16,
+	RTL_GIGA_MAC_VER_17,
+	RTL_GIGA_MAC_VER_18,
+	RTL_GIGA_MAC_VER_19,
+	RTL_GIGA_MAC_VER_20,
+	RTL_GIGA_MAC_VER_21,
+	RTL_GIGA_MAC_VER_22,
+	RTL_GIGA_MAC_VER_23,
+	RTL_GIGA_MAC_VER_24,
+	RTL_GIGA_MAC_VER_25,
+	RTL_GIGA_MAC_VER_26,
+	RTL_GIGA_MAC_VER_27,
+	RTL_GIGA_MAC_VER_28,
+	RTL_GIGA_MAC_VER_29,
+	RTL_GIGA_MAC_VER_30,
+	RTL_GIGA_MAC_VER_31,
+	RTL_GIGA_MAC_VER_32,
+	RTL_GIGA_MAC_VER_33,
+	RTL_GIGA_MAC_VER_34,
+	RTL_GIGA_MAC_VER_35,
+	RTL_GIGA_MAC_VER_36,
+	RTL_GIGA_MAC_VER_37,
+	RTL_GIGA_MAC_VER_38,
+	RTL_GIGA_MAC_VER_39,
+	RTL_GIGA_MAC_VER_40,
+	RTL_GIGA_MAC_VER_41,
+	RTL_GIGA_MAC_VER_42,
+	RTL_GIGA_MAC_VER_43,
+	RTL_GIGA_MAC_VER_44,
 };
 
 static const char * const chip_names[] = {
@@ -46,17 +79,50 @@ static const char * const chip_names[] = {
 	[RTL8101] = "RTL-8101",
 
 	/* chips not handled by 8139too/8139cp module */
-	[RTL8169] = "RTL-8169",
-	[RTL8169S] = "RTL-8169S",
-	[RTL8110S] = "RTL-8110S",
-	[RTL8169_8110SB] = "RTL-8169/8110SB",
-	[RTL8169_8110SCd] = "RTL-8169/8110SCd",
-	[RTL8169_8110SCe] = "RTL-8169/8110SCe",
-	[RTL8168_8111Bb] = "RTL-8168/8111Bb",
-	[RTL8168_8111Bef] = "RTL-8168/8111Bef",
-	[RTL8101Ebc] = "RTL-8101Ebc",
-	[RTL8100E1] = "RTL-8100E(1)",
-	[RTL8100E2] = "RTL-8100E(2)",
+	[RTL_GIGA_MAC_VER_01] = "RTL8169",
+	[RTL_GIGA_MAC_VER_02] = "RTL8169s",
+	[RTL_GIGA_MAC_VER_03] = "RTL8110s",
+	[RTL_GIGA_MAC_VER_04] = "RTL8169sb/8110sb",
+	[RTL_GIGA_MAC_VER_05] = "RTL8169sc/8110sc",
+	[RTL_GIGA_MAC_VER_06] = "RTL8169sc/8110sc",
+	[RTL_GIGA_MAC_VER_07] = "RTL8102e",
+	[RTL_GIGA_MAC_VER_08] = "RTL8102e",
+	[RTL_GIGA_MAC_VER_09] = "RTL8102e",
+	[RTL_GIGA_MAC_VER_10] = "RTL8101e",
+	[RTL_GIGA_MAC_VER_11] = "RTL8168b/8111b",
+	[RTL_GIGA_MAC_VER_12] = "RTL8168b/8111b",
+	[RTL_GIGA_MAC_VER_13] = "RTL8101e",
+	[RTL_GIGA_MAC_VER_14] = "RTL8100e",
+	[RTL_GIGA_MAC_VER_15] = "RTL8100e",
+	[RTL_GIGA_MAC_VER_16] = "RTL8101e",
+	[RTL_GIGA_MAC_VER_17] = "RTL8168b/8111b",
+	[RTL_GIGA_MAC_VER_18] = "RTL8168cp/8111cp",
+	[RTL_GIGA_MAC_VER_19] = "RTL8168c/8111c",
+	[RTL_GIGA_MAC_VER_20] = "RTL8168c/8111c",
+	[RTL_GIGA_MAC_VER_21] = "RTL8168c/8111c",
+	[RTL_GIGA_MAC_VER_22] = "RTL8168c/8111c",
+	[RTL_GIGA_MAC_VER_23] = "RTL8168cp/8111cp",
+	[RTL_GIGA_MAC_VER_24] = "RTL8168cp/8111cp",
+	[RTL_GIGA_MAC_VER_25] = "RTL8168d/8111d",
+	[RTL_GIGA_MAC_VER_26] = "RTL8168d/8111d",
+	[RTL_GIGA_MAC_VER_27] = "RTL8168dp/8111dp",
+	[RTL_GIGA_MAC_VER_28] = "RTL8168dp/8111dp",
+	[RTL_GIGA_MAC_VER_29] = "RTL8105e",
+	[RTL_GIGA_MAC_VER_30] = "RTL8105e",
+	[RTL_GIGA_MAC_VER_31] = "RTL8168dp/8111dp",
+	[RTL_GIGA_MAC_VER_32] = "RTL8168e/8111e",
+	[RTL_GIGA_MAC_VER_33] = "RTL8168e/8111e",
+	[RTL_GIGA_MAC_VER_34] = "RTL8168evl/8111evl",
+	[RTL_GIGA_MAC_VER_35] = "RTL8168f/8111f",
+	[RTL_GIGA_MAC_VER_36] = "RTL8168f/8111f",
+	[RTL_GIGA_MAC_VER_37] = "RTL8402",
+	[RTL_GIGA_MAC_VER_38] = "RTL8411",
+	[RTL_GIGA_MAC_VER_39] = "RTL8106e",
+	[RTL_GIGA_MAC_VER_40] = "RTL8168g/8111g",
+	[RTL_GIGA_MAC_VER_41] = "RTL8168g/8111g",
+	[RTL_GIGA_MAC_VER_42] = "RTL8168g/8111g",
+	[RTL_GIGA_MAC_VER_43] = "RTL8106e",
+	[RTL_GIGA_MAC_VER_44] = "RTL8411",
 };
 
 static struct chip_info {
@@ -77,17 +143,82 @@ static struct chip_info {
 	{ 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, 0x68000000,	RTL8169_8110SCe },
-	{ 0xfcc00000, 0x30000000,	RTL8168_8111Bb },
-	{ 0xfcc00000, 0x38000000,	RTL8168_8111Bef },
-	{ 0xfcc00000, 0x34000000,	RTL8101Ebc },
-	{ 0xfcc00000, 0x30800000,	RTL8100E1 },
-	{ 0xfcc00000, 0x38800000,	RTL8100E2 },
+	/* 8168G family. */
+	{ 0x7cf00000, 0x5c800000,	RTL_GIGA_MAC_VER_44 },
+	{ 0x7cf00000, 0x50900000,	RTL_GIGA_MAC_VER_42 },
+	{ 0x7cf00000, 0x4c100000,	RTL_GIGA_MAC_VER_41 },
+	{ 0x7cf00000, 0x4c000000,	RTL_GIGA_MAC_VER_40 },
+
+	/* 8168F family. */
+	{ 0x7c800000, 0x48800000,	RTL_GIGA_MAC_VER_38 },
+	{ 0x7cf00000, 0x48100000,	RTL_GIGA_MAC_VER_36 },
+	{ 0x7cf00000, 0x48000000,	RTL_GIGA_MAC_VER_35 },
+
+	/* 8168E family. */
+	{ 0x7c800000, 0x2c800000,	RTL_GIGA_MAC_VER_34 },
+	{ 0x7cf00000, 0x2c200000,	RTL_GIGA_MAC_VER_33 },
+	{ 0x7cf00000, 0x2c100000,	RTL_GIGA_MAC_VER_32 },
+	{ 0x7c800000, 0x2c000000,	RTL_GIGA_MAC_VER_33 },
+
+	/* 8168D family. */
+	{ 0x7cf00000, 0x28300000,	RTL_GIGA_MAC_VER_26 },
+	{ 0x7cf00000, 0x28100000,	RTL_GIGA_MAC_VER_25 },
+	{ 0x7c800000, 0x28000000,	RTL_GIGA_MAC_VER_26 },
+
+	/* 8168DP family. */
+	{ 0x7cf00000, 0x28800000,	RTL_GIGA_MAC_VER_27 },
+	{ 0x7cf00000, 0x28a00000,	RTL_GIGA_MAC_VER_28 },
+	{ 0x7cf00000, 0x28b00000,	RTL_GIGA_MAC_VER_31 },
+
+	/* 8168C family. */
+	{ 0x7cf00000, 0x3cb00000,	RTL_GIGA_MAC_VER_24 },
+	{ 0x7cf00000, 0x3c900000,	RTL_GIGA_MAC_VER_23 },
+	{ 0x7cf00000, 0x3c800000,	RTL_GIGA_MAC_VER_18 },
+	{ 0x7c800000, 0x3c800000,	RTL_GIGA_MAC_VER_24 },
+	{ 0x7cf00000, 0x3c000000,	RTL_GIGA_MAC_VER_19 },
+	{ 0x7cf00000, 0x3c200000,	RTL_GIGA_MAC_VER_20 },
+	{ 0x7cf00000, 0x3c300000,	RTL_GIGA_MAC_VER_21 },
+	{ 0x7cf00000, 0x3c400000,	RTL_GIGA_MAC_VER_22 },
+	{ 0x7c800000, 0x3c000000,	RTL_GIGA_MAC_VER_22 },
+
+	/* 8168B family. */
+	{ 0x7cf00000, 0x38000000,	RTL_GIGA_MAC_VER_12 },
+	{ 0x7cf00000, 0x38500000,	RTL_GIGA_MAC_VER_17 },
+	{ 0x7c800000, 0x38000000,	RTL_GIGA_MAC_VER_17 },
+	{ 0x7c800000, 0x30000000,	RTL_GIGA_MAC_VER_11 },
+
+	/* 8101 family. */
+	{ 0x7cf00000, 0x44900000,	RTL_GIGA_MAC_VER_39 },
+	{ 0x7c800000, 0x44800000,	RTL_GIGA_MAC_VER_39 },
+	{ 0x7c800000, 0x44000000,	RTL_GIGA_MAC_VER_37 },
+	{ 0x7cf00000, 0x40b00000,	RTL_GIGA_MAC_VER_30 },
+	{ 0x7cf00000, 0x40a00000,	RTL_GIGA_MAC_VER_30 },
+	{ 0x7cf00000, 0x40900000,	RTL_GIGA_MAC_VER_29 },
+	{ 0x7c800000, 0x40800000,	RTL_GIGA_MAC_VER_30 },
+	{ 0x7cf00000, 0x34a00000,	RTL_GIGA_MAC_VER_09 },
+	{ 0x7cf00000, 0x24a00000,	RTL_GIGA_MAC_VER_09 },
+	{ 0x7cf00000, 0x34900000,	RTL_GIGA_MAC_VER_08 },
+	{ 0x7cf00000, 0x24900000,	RTL_GIGA_MAC_VER_08 },
+	{ 0x7cf00000, 0x34800000,	RTL_GIGA_MAC_VER_07 },
+	{ 0x7cf00000, 0x24800000,	RTL_GIGA_MAC_VER_07 },
+	{ 0x7cf00000, 0x34000000,	RTL_GIGA_MAC_VER_13 },
+	{ 0x7cf00000, 0x34300000,	RTL_GIGA_MAC_VER_10 },
+	{ 0x7cf00000, 0x34200000,	RTL_GIGA_MAC_VER_16 },
+	{ 0x7c800000, 0x34800000,	RTL_GIGA_MAC_VER_09 },
+	{ 0x7c800000, 0x24800000,	RTL_GIGA_MAC_VER_09 },
+	{ 0x7c800000, 0x34000000,	RTL_GIGA_MAC_VER_16 },
+	/* FIXME: where did these entries come from ? -- FR */
+	{ 0xfc800000, 0x38800000,	RTL_GIGA_MAC_VER_15 },
+	{ 0xfc800000, 0x30800000,	RTL_GIGA_MAC_VER_14 },
+
+	/* 8110 family. */
+	{ 0xfc800000, 0x98000000,	RTL_GIGA_MAC_VER_06 },
+	{ 0xfc800000, 0x18000000,	RTL_GIGA_MAC_VER_05 },
+	{ 0xfc800000, 0x10000000,	RTL_GIGA_MAC_VER_04 },
+	{ 0xfc800000, 0x04000000,	RTL_GIGA_MAC_VER_03 },
+	{ 0xfc800000, 0x00800000,	RTL_GIGA_MAC_VER_02 },
+	{ 0xfc800000, 0x00000000,	RTL_GIGA_MAC_VER_01 },
+
 	{ }
 };
 
@@ -151,7 +282,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) {
+	if (board_type == RTL8139Cp || board_type >= RTL_GIGA_MAC_VER_01) {
 	fprintf(stdout,
 		"0x10: Dump Tally Counter Command   0x%08x 0x%08x\n",
 		data[0x10 >> 2],
@@ -187,8 +318,9 @@ realtek_dump_regs(struct ethtool_drvinfo *info, struct ethtool_regs *regs)
 		data[0x2C >> 2]);
 	}
 
-	if (board_type != RTL8168_8111Bb && board_type != RTL8168_8111Bef) {
-	if (board_type >= RTL8169) {
+	if (board_type < RTL_GIGA_MAC_VER_11 ||
+		board_type > RTL_GIGA_MAC_VER_17) {
+	if (board_type >= RTL_GIGA_MAC_VER_01) {
 	fprintf(stdout,
 		"0x30: Flash memory read/write                 0x%08x\n",
 		data[0x30 >> 2]);
@@ -224,7 +356,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) {
+	if (board_type < RTL_GIGA_MAC_VER_01) {
 	fprintf(stdout,
 		"0x38: Current Address of Packet Read (C mode)     0x%04x\n"
 		"0x3A: Current Rx buffer address (C mode)          0x%04x\n",
@@ -259,7 +391,7 @@ realtek_dump_regs(struct ethtool_drvinfo *info, struct ethtool_regs *regs)
 		data8[0x51],
 		data8[0x52]);
 
-	if (board_type >= RTL8169) {
+	if (board_type >= RTL_GIGA_MAC_VER_01) {
 	fprintf(stdout,
 		"0x53: Config 2                                      0x%02x\n"
 		"0x54: Config 3                                      0x%02x\n"
@@ -298,12 +430,13 @@ 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) {
+	if (board_type >= RTL_GIGA_MAC_VER_01) {
 	fprintf(stdout,
 		"0x60: PHY access                              0x%08x\n",
 		data[0x60 >> 2]);
 
-	if (board_type != RTL8168_8111Bb && board_type != RTL8168_8111Bef) {
+	if (board_type < RTL_GIGA_MAC_VER_11 ||
+		board_type > RTL_GIGA_MAC_VER_17) {
 	fprintf(stdout,
 		"0x64: TBI control and status                  0x%08x\n",
 		data[0x64 >> 2]);
@@ -492,7 +625,7 @@ realtek_dump_regs(struct ethtool_drvinfo *info, struct ethtool_regs *regs)
 	}
 	}
 
-	if (board_type == RTL8139Cp || board_type >= RTL8169) {
+	if (board_type == RTL8139Cp || board_type >= RTL_GIGA_MAC_VER_01) {
 	v = data[0xE0 >> 2] & 0xffff;
 	fprintf(stdout,
 		"0xE0: C+ Command                                  0x%04x\n",
@@ -536,9 +669,9 @@ 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) {
+	} else if (board_type >= RTL_GIGA_MAC_VER_01 &&
+		(board_type < RTL_GIGA_MAC_VER_11 ||
+		board_type > RTL_GIGA_MAC_VER_17)) {
 	fprintf(stdout,
 		"0xF0: Func Event                              0x%08x\n"
 		"0xF4: Func Event Mask                         0x%08x\n"
-- 
1.8.3.3

^ permalink raw reply	[flat|nested] 10+ messages in thread

* [PATCH v2 1/2] realtek: convert to per-chip mask
  2013-07-23  8:51 [ethtool] Add new Realtek devices Peter Wu
                   ` (2 preceding siblings ...)
  2013-07-23 18:04 ` [PATCH v2 " Peter Wu
@ 2013-07-23 18:05 ` Peter Wu
  2013-07-23 20:24   ` Francois Romieu
  2013-07-23 20:25 ` [ethtool] Add new Realtek devices Francois Romieu
  4 siblings, 1 reply; 10+ messages in thread
From: Peter Wu @ 2013-07-23 18:05 UTC (permalink / raw)
  To: Ben Hutchings; +Cc: Francois Romieu, netdev

The previous HW_REVID macro did not make identifiers more readable
(compared to hex values like 0x12345678) and only allowed for one static
mask. To make it easier to update the chips list, let's use similar
structures as r8169 and remove HW_REVID.

Names are removed and separated from the table and separated because the
mac_version does not have to be unique.

There are no functional changes for the output, except that the output
now mentions "TxConfig" instead of "mask" when a chip is not found.
Since the mask can be anything, the word is not masked either.

Signed-off-by: Peter Wu <lekensteyn@gmail.com>
---
Attempt 2, sorry for the wordwrap issues, I have been fighting to get
git-send-email to work with kmail and forgot to disable wordwrapping.
---
 realtek.c | 106 ++++++++++++++++++++++++++++++++++++--------------------------
 1 file changed, 62 insertions(+), 44 deletions(-)

diff --git a/realtek.c b/realtek.c
index c3d7ae5..5a1fba7 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] = "RTL-8139",
+	[RTL8139_K] = "RTL-8139-K",
+	[RTL8139A] = "RTL-8139A",
+	[RTL8139A_G] = "RTL-8139A-G",
+	[RTL8139B] = "RTL-8139B",
+	[RTL8130] = "RTL-8130",
+	[RTL8139C] = "RTL-8139C",
+	[RTL8100] = "RTL-8100",
+	[RTL8100B_8139D] = "RTL-8100B/8139D",
+	[RTL8139C] = "RTL-8139C+",
+	[RTL8101] = "RTL-8101",
+
+	/* chips not handled by 8139too/8139cp module */
+	[RTL8169] = "RTL-8169",
+	[RTL8169S] = "RTL-8169S",
+	[RTL8110S] = "RTL-8110S",
+	[RTL8169_8110SB] = "RTL-8169/8110SB",
+	[RTL8169_8110SCd] = "RTL-8169/8110SCd",
+	[RTL8169_8110SCe] = "RTL-8169/8110SCe",
+	[RTL8168_8111Bb] = "RTL-8168/8111Bb",
+	[RTL8168_8111Bef] = "RTL-8168/8111Bef",
+	[RTL8101Ebc] = "RTL-8101Ebc",
+	[RTL8100E1] = "RTL-8100E(1)",
+	[RTL8100E2] = "RTL-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,	RTL8139C },
+	{ 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, 0x68000000,	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"
 		"--------------------------------------------------------\n",
-		ci->name);
+		chip_names[board_type]);
 
 	fprintf(stdout,
 		"0x00: MAC Address                      %02x:%02x:%02x:%02x:%02x:%02x\n",
-- 
1.8.3.3

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH v2 1/2] realtek: convert to per-chip mask
  2013-07-23 18:05 ` [PATCH v2 1/2] realtek: convert to per-chip mask Peter Wu
@ 2013-07-23 20:24   ` Francois Romieu
  2013-07-23 21:03     ` Peter Wu
  0 siblings, 1 reply; 10+ messages in thread
From: Francois Romieu @ 2013-07-23 20:24 UTC (permalink / raw)
  To: Peter Wu; +Cc: Ben Hutchings, netdev

Peter Wu <lekensteyn@gmail.com> :
[...]
> diff --git a/realtek.c b/realtek.c
> index c3d7ae5..5a1fba7 100644
> --- a/realtek.c
> +++ b/realtek.c
[...]
> @@ -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] = "RTL-8139",
> +	[RTL8139_K] = "RTL-8139-K",
> +	[RTL8139A] = "RTL-8139A",
> +	[RTL8139A_G] = "RTL-8139A-G",
> +	[RTL8139B] = "RTL-8139B",
> +	[RTL8130] = "RTL-8130",
> +	[RTL8139C] = "RTL-8139C",
> +	[RTL8100] = "RTL-8100",
> +	[RTL8100B_8139D] = "RTL-8100B/8139D",
> +	[RTL8139C] = "RTL-8139C+",
> +	[RTL8101] = "RTL-8101",
> +
> +	/* chips not handled by 8139too/8139cp module */
> +	[RTL8169] = "RTL-8169",
> +	[RTL8169S] = "RTL-8169S",
> +	[RTL8110S] = "RTL-8110S",
> +	[RTL8169_8110SB] = "RTL-8169/8110SB",
> +	[RTL8169_8110SCd] = "RTL-8169/8110SCd",
> +	[RTL8169_8110SCe] = "RTL-8169/8110SCe",
> +	[RTL8168_8111Bb] = "RTL-8168/8111Bb",
> +	[RTL8168_8111Bef] = "RTL-8168/8111Bef",
> +	[RTL8101Ebc] = "RTL-8101Ebc",
> +	[RTL8100E1] = "RTL-8100E(1)",
> +	[RTL8100E2] = "RTL-8100E(2)",

Tab after equal may be.

The "RTL-" prefix string could be shared.

-- 
Ueimor

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [ethtool] Add new Realtek devices
  2013-07-23  8:51 [ethtool] Add new Realtek devices Peter Wu
                   ` (3 preceding siblings ...)
  2013-07-23 18:05 ` [PATCH v2 1/2] realtek: convert to per-chip mask Peter Wu
@ 2013-07-23 20:25 ` Francois Romieu
  2013-07-23 21:08   ` Peter Wu
  4 siblings, 1 reply; 10+ messages in thread
From: Francois Romieu @ 2013-07-23 20:25 UTC (permalink / raw)
  To: Peter Wu; +Cc: Ben Hutchings, netdev

Peter Wu <lekensteyn@gmail.com> :
[...]
> sure what the cause is of this strange behavior. Francois, perhaps you
> have an idea why reading in blocks of larger than 7 results in a error?

No but it has been seen before. Platform or device thing ?

-- 
Ueimor

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH v2 1/2] realtek: convert to per-chip mask
  2013-07-23 20:24   ` Francois Romieu
@ 2013-07-23 21:03     ` Peter Wu
  0 siblings, 0 replies; 10+ messages in thread
From: Peter Wu @ 2013-07-23 21:03 UTC (permalink / raw)
  To: Francois Romieu; +Cc: Ben Hutchings, netdev

On Tuesday 23 July 2013 22:24:37 Francois Romieu wrote:
> Peter Wu <lekensteyn@gmail.com> :
> [...]
> > +	[RTL8100E1] = "RTL-8100E(1)",
> > +	[RTL8100E2] = "RTL-8100E(2)",
> 
> Tab after equal may be.
Originally I had [NAME <tab(s)>] = ..., but then checkpatch complained. I will 
fix it up.

> The "RTL-" prefix string could be shared.
Good point, I will also fix.

Regards,
Peter

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [ethtool] Add new Realtek devices
  2013-07-23 20:25 ` [ethtool] Add new Realtek devices Francois Romieu
@ 2013-07-23 21:08   ` Peter Wu
  0 siblings, 0 replies; 10+ messages in thread
From: Peter Wu @ 2013-07-23 21:08 UTC (permalink / raw)
  To: Francois Romieu; +Cc: Ben Hutchings, netdev

On Tuesday 23 July 2013 22:25:44 Francois Romieu wrote:
> Peter Wu <lekensteyn@gmail.com> :
> [...]
> 
> > sure what the cause is of this strange behavior. Francois, perhaps you
> > have an idea why reading in blocks of larger than 7 results in a error?
> 
> No but it has been seen before. Platform or device thing ?

What kind of devices were those? This issue occurs on an on-board PCIe chip 
where the memory is 64-bit, prefetchable. I have no issues with a PCI card, 
memory 32-bit, non-prefetchable.

PCI: RTL8168sb
PCIe: RTL8111E

Regards,
Peter

^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2013-07-23 21:08 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-07-23  8:51 [ethtool] Add new Realtek devices Peter Wu
2013-07-23  8:51 ` [PATCH 1/2] realtek: convert to per-chip mask Peter Wu
2013-07-23 17:56   ` Ben Hutchings
2013-07-23  8:51 ` [PATCH 2/2] realtek: update devices to 3.11 Peter Wu
2013-07-23 18:04 ` [PATCH v2 " Peter Wu
2013-07-23 18:05 ` [PATCH v2 1/2] realtek: convert to per-chip mask Peter Wu
2013-07-23 20:24   ` Francois Romieu
2013-07-23 21:03     ` Peter Wu
2013-07-23 20:25 ` [ethtool] Add new Realtek devices Francois Romieu
2013-07-23 21:08   ` Peter Wu

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).