---
 ethtool-copy.h |   12 ++++++++
 ethtool.c      |   84 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 96 insertions(+)

Index: ethtool-2.6.39/ethtool-copy.h
===================================================================
--- ethtool-2.6.39.orig/ethtool-copy.h
+++ ethtool-2.6.39/ethtool-copy.h
@@ -772,6 +772,12 @@ enum ethtool_sfeatures_retval_bits {
 #define SUPPORTED_10000baseKX4_Full	(1 << 18)
 #define SUPPORTED_10000baseKR_Full	(1 << 19)
 #define SUPPORTED_10000baseR_FEC	(1 << 20)
+#define SUPPORTED_20000baseMLD2_Full	(1 << 21)
+#define SUPPORTED_20000baseKR2_Full	(1 << 22)
+#define SUPPORTED_40000baseKR4_Full	(1 << 23)
+#define SUPPORTED_40000baseCR4_Full	(1 << 24)
+#define SUPPORTED_40000baseSR4_Full	(1 << 25)
+#define SUPPORTED_40000baseLR4_Full	(1 << 26)
 
 /* Indicates what features are advertised by the interface. */
 #define ADVERTISED_10baseT_Half		(1 << 0)
@@ -795,6 +801,12 @@ enum ethtool_sfeatures_retval_bits {
 #define ADVERTISED_10000baseKX4_Full	(1 << 18)
 #define ADVERTISED_10000baseKR_Full	(1 << 19)
 #define ADVERTISED_10000baseR_FEC	(1 << 20)
+#define ADVERTISED_20000baseMLD2_Full	(1 << 21)
+#define ADVERTISED_20000baseKR2_Full	(1 << 22)
+#define ADVERTISED_40000baseKR4_Full	(1 << 23)
+#define ADVERTISED_40000baseCR4_Full	(1 << 24)
+#define ADVERTISED_40000baseSR4_Full	(1 << 25)
+#define ADVERTISED_40000baseLR4_Full	(1 << 26)
 
 /* The following are all involved in forcing a particular link
  * mode for the device for setting things.  When getting the
Index: ethtool-2.6.39/ethtool.c
===================================================================
--- ethtool-2.6.39.orig/ethtool.c
+++ ethtool-2.6.39/ethtool.c
@@ -1239,6 +1239,48 @@ static void dump_supported(struct ethtoo
 	if (mask & SUPPORTED_10000baseKX4_Full) {
 		did1++; fprintf(stdout, "10000baseKX4/Full ");
 	}
+	if (did1 && (mask & SUPPORTED_20000baseMLD2_Full)) {
+		fprintf(stdout, "\n");
+		fprintf(stdout, "	                        ");
+	}
+	if (mask & SUPPORTED_20000baseMLD2_Full) {
+		did1++; fprintf(stdout, "20000baseMLD2/Full");
+	}
+	if (did1 && (mask & SUPPORTED_20000baseKR2_Full)) {
+		fprintf(stdout, "\n");
+		fprintf(stdout, "	                        ");
+	}
+	if (mask & SUPPORTED_20000baseKR2_Full) {
+		did1++; fprintf(stdout, "20000baseKR2/Full");
+	}
+	if (did1 && (mask & SUPPORTED_40000baseKR4_Full)) {
+		fprintf(stdout, "\n");
+		fprintf(stdout, "	                        ");
+	}
+	if (mask & SUPPORTED_40000baseKR4_Full) {
+		did1++; fprintf(stdout, "40000baseKR4/Full");
+	}
+	if (did1 && (mask & SUPPORTED_40000baseCR4_Full)) {
+		fprintf(stdout, "\n");
+		fprintf(stdout, "	                        ");
+	}
+	if (mask & SUPPORTED_40000baseCR4_Full) {
+		did1++; fprintf(stdout, "40000baseCR4/Full");
+	}
+	if (did1 && (mask & SUPPORTED_40000baseSR4_Full)) {
+		fprintf(stdout, "\n");
+		fprintf(stdout, "	                        ");
+	}
+	if (mask & SUPPORTED_40000baseSR4_Full) {
+		did1++; fprintf(stdout, "40000baseSR4/Full");
+	}
+	if (did1 && (mask & SUPPORTED_40000baseLR4_Full)) {
+		fprintf(stdout, "\n");
+		fprintf(stdout, "	                        ");
+	}
+	if (mask & SUPPORTED_40000baseLR4_Full) {
+		did1++; fprintf(stdout, "40000baseLR4/Full");
+	}
 	fprintf(stdout, "\n");
 
 	fprintf(stdout, "	Supports auto-negotiation: ");
@@ -1310,6 +1352,48 @@ static void dump_advertised(struct ethto
 	if (mask & ADVERTISED_10000baseKX4_Full) {
 		did1++; fprintf(stdout, "10000baseKX4/Full ");
 	}
+	if (did1 && (mask & ADVERTISED_20000baseMLD2_Full)) {
+		fprintf(stdout, "\n");
+		fprintf(stdout, "	%*s", indent, "");
+	}
+	if (mask & ADVERTISED_20000baseMLD2_Full) {
+		did1++; fprintf(stdout, "20000baseMLD2/Full");
+	}
+	if (did1 && (mask & ADVERTISED_20000baseKR2_Full)) {
+		fprintf(stdout, "\n");
+		fprintf(stdout, "	%*s", indent, "");
+	}
+	if (mask & ADVERTISED_20000baseKR2_Full) {
+		did1++; fprintf(stdout, "20000baseKR2/Full");
+	}
+	if (did1 && (mask & ADVERTISED_40000baseKR4_Full)) {
+		fprintf(stdout, "\n");
+		fprintf(stdout, "	%*s", indent, "");
+	}
+	if (mask & ADVERTISED_40000baseKR4_Full) {
+		did1++; fprintf(stdout, "40000baseKR4/Full");
+	}
+	if (did1 && (mask & ADVERTISED_40000baseCR4_Full)) {
+		fprintf(stdout, "\n");
+		fprintf(stdout, "	%*s", indent, "");
+	}
+	if (mask & ADVERTISED_40000baseCR4_Full) {
+		did1++; fprintf(stdout, "40000baseCR4/Full");
+	}
+	if (did1 && (mask & ADVERTISED_40000baseSR4_Full)) {
+		fprintf(stdout, "\n");
+		fprintf(stdout, "	%*s", indent, "");
+	}
+	if (mask & ADVERTISED_40000baseSR4_Full) {
+		did1++; fprintf(stdout, "40000baseSR4/Full");
+	}
+	if (did1 && (mask & ADVERTISED_40000baseLR4_Full)) {
+		fprintf(stdout, "\n");
+		fprintf(stdout, "	%*s", indent, "");
+	}
+	if (mask & ADVERTISED_40000baseLR4_Full) {
+		did1++; fprintf(stdout, "40000baseLR4/Full");
+	}
 	if (did1 == 0)
 		 fprintf(stdout, "Not reported");
 	fprintf(stdout, "\n");
