--- a/Makefile.am
+++ b/Makefile.am
@@ -10,7 +10,7 @@ ethtool_SOURCES = ethtool.c ethtool-copy
 		  fec_8xx.c ibm_emac.c ixgb.c ixgbe.c natsemi.c	\
 		  pcnet32.c realtek.c tg3.c marvell.c vioc.c	\
 		  smsc911x.c at76c50x-usb.c sfc.c stmmac.c	\
-		  rxclass.c sfpid.c sfpdiag.c
+		  rxclass.c sfpid.c sfpdiag.c ixp4xx.c
 
 TESTS = test-cmdline test-features
 check_PROGRAMS = test-cmdline test-features
--- a/Makefile.in
+++ b/Makefile.in
@@ -78,7 +78,7 @@ am_ethtool_OBJECTS = ethtool.$(OBJEXT) a
 	tg3.$(OBJEXT) marvell.$(OBJEXT) vioc.$(OBJEXT) \
 	smsc911x.$(OBJEXT) at76c50x-usb.$(OBJEXT) sfc.$(OBJEXT) \
 	stmmac.$(OBJEXT) rxclass.$(OBJEXT) sfpid.$(OBJEXT) \
-	sfpdiag.$(OBJEXT)
+	sfpdiag.$(OBJEXT) ixp4xx.$(OBJEXT)
 ethtool_OBJECTS = $(am_ethtool_OBJECTS)
 ethtool_LDADD = $(LDADD)
 ethtool_DEPENDENCIES =
@@ -286,7 +286,7 @@ ethtool_SOURCES = ethtool.c ethtool-copy
 		  fec_8xx.c ibm_emac.c ixgb.c ixgbe.c natsemi.c	\
 		  pcnet32.c realtek.c tg3.c marvell.c vioc.c	\
 		  smsc911x.c at76c50x-usb.c sfc.c stmmac.c	\
-		  rxclass.c sfpid.c sfpdiag.c
+		  rxclass.c sfpid.c sfpdiag.c ixp4xx.c
 
 test_cmdline_SOURCES = test-cmdline.c test-common.c $(ethtool_SOURCES) 
 test_cmdline_CFLAGS = -DTEST_ETHTOOL
@@ -431,6 +431,7 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sfpid.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/smsc911x.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stmmac.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ixp4xx.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_cmdline-amd8111e.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_cmdline-at76c50x-usb.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/test_cmdline-de2104x.Po@am__quote@
--- a/ethtool.c
+++ b/ethtool.c
@@ -873,6 +873,7 @@ static const struct {
 	{ "igb", igb_dump_regs },
 	{ "ixgb", ixgb_dump_regs },
 	{ "ixgbe", ixgbe_dump_regs },
+	{ "ixp4xx", ixp4xx_dump_regs },
 	{ "natsemi", natsemi_dump_regs },
 	{ "e100", e100_dump_regs },
 	{ "amd8111e", amd8111e_dump_regs },
--- a/internal.h
+++ b/internal.h
@@ -241,6 +241,9 @@ int st_gmac_dump_regs(struct ethtool_drv
 /* Et131x ethernet controller */
 int et131x_dump_regs(struct ethtool_drvinfo *info, struct ethtool_regs *regs);
 
+/* Intel IXP4xx internal MAC */
+int ixp4xx_dump_regs(struct ethtool_drvinfo *info, struct ethtool_regs *regs);
+
 /* Rx flow classification */
 int rxclass_parse_ruleopts(struct cmd_context *ctx,
 			   struct ethtool_rx_flow_spec *fsp);
--- /dev/null
+++ b/ixp4xx.c
@@ -0,0 +1,130 @@
+/*
+ * Copyright (c) 2006 Christian Hohnstaed <chohnstaedt@innominate.com>
+ * This file is released under the GPLv2
+ */
+
+#include <stdio.h>
+#include "internal.h"
+
+#ifndef BIT
+#define BIT(x) (1<<x)
+#endif
+
+#define TX_CNTRL1_TX_EN         BIT(0)
+#define TX_CNTRL1_DUPLEX        BIT(1)
+#define TX_CNTRL1_RETRY         BIT(2)
+#define TX_CNTRL1_PAD_EN        BIT(3)
+#define TX_CNTRL1_FCS_EN        BIT(4)
+#define TX_CNTRL1_2DEFER        BIT(5)
+#define TX_CNTRL1_RMII          BIT(6)
+
+/* TX Control Register 2 */
+#define TX_CNTRL2_RETRIES_MASK  0xf
+
+/* RX Control Register 1 */
+#define RX_CNTRL1_RX_EN         BIT(0)
+#define RX_CNTRL1_PADSTRIP_EN   BIT(1)
+#define RX_CNTRL1_CRC_EN        BIT(2)
+#define RX_CNTRL1_PAUSE_EN      BIT(3)
+#define RX_CNTRL1_LOOP_EN       BIT(4)
+#define RX_CNTRL1_ADDR_FLTR_EN  BIT(5)
+#define RX_CNTRL1_RX_RUNT_EN    BIT(6)
+#define RX_CNTRL1_BCAST_DIS     BIT(7)
+
+/* Core Control Register */
+#define CORE_RESET              BIT(0)
+#define CORE_RX_FIFO_FLUSH      BIT(1)
+#define CORE_TX_FIFO_FLUSH      BIT(2)
+#define CORE_SEND_JAM           BIT(3)
+#define CORE_MDC_EN             BIT(4)
+
+#define MAC "%02x:%02x:%02x:%02x:%02x:%02x"
+#define MAC_DATA(d) (d)[0], (d)[1], (d)[2], (d)[3], (d)[4], (d)[5]
+
+int ixp4xx_dump_regs(struct ethtool_drvinfo *info, struct ethtool_regs *regs)
+{
+	u8 *data = regs->data;
+
+	fprintf(stdout,
+		"TXctrl:          0x%02x:0x%02x\n"
+		"    Enable:      %s\n"
+		"    Duplex:      %s\n"
+		"    Retry:       %s (%d)\n"
+		"    Padding:     %s\n"
+		"    Frame check: %s\n"
+		"    TX deferral: %s\n"
+		"    Connection:  %s\n"
+		"\n",
+		data[0], data[1],
+		data[0] & TX_CNTRL1_TX_EN   ? "yes"      : "no",
+		data[0] & TX_CNTRL1_DUPLEX  ? "half"     : "full",
+		data[0] & TX_CNTRL1_RETRY   ? "enabled"  : "disabled",
+		data[1] & TX_CNTRL2_RETRIES_MASK,
+		data[0] & TX_CNTRL1_PAD_EN  ? "enabled"  : "disabled",
+		data[0] & TX_CNTRL1_FCS_EN  ? "enabled"  : "disabled",
+		data[0] & TX_CNTRL1_2DEFER  ? "two-part" : "one-part",
+		data[0] & TX_CNTRL1_RMII    ? "RMII"     : "Full MII"
+	);
+
+	fprintf(stdout,
+		"RXctrl:          0x%02x\n"
+		"    Enable:      %s\n"
+		"    Pad strip:   %s\n"
+		"    CRC check:   %s\n"
+		"    Pause:       %s\n"
+		"    Loop:        %s\n"
+		"    Promiscous:  %s\n"
+		"    Runt frames: %s\n"
+		"    Broadcast:   %s\n"
+		"\n",
+		data[2],
+		data[2] & RX_CNTRL1_RX_EN        ? "yes"      : "no",
+		data[2] & RX_CNTRL1_PADSTRIP_EN  ? "enabled"  : "disabled",
+		data[2] & RX_CNTRL1_CRC_EN       ? "enabled"  : "disabled",
+		data[2] & RX_CNTRL1_PAUSE_EN     ? "enabled"  : "disabled",
+		data[2] & RX_CNTRL1_LOOP_EN      ? "enabled"  : "disabled",
+		data[2] & RX_CNTRL1_ADDR_FLTR_EN ? "disabled" : "enabled",
+		data[2] & RX_CNTRL1_RX_RUNT_EN   ? "forward"  : "discard",
+		data[2] & RX_CNTRL1_BCAST_DIS    ? "disabled" : "enabled"
+	);
+	fprintf(stdout,
+		"Core control:    0x%02x\n"
+		"    Core state:  %s\n"
+		"    RX fifo:     %s\n"
+		"    TX fifo:     %s\n"
+		"    Send jam:    %s\n"
+		"    MDC clock    %s\n"
+		"\n",
+		data[32],
+		data[32] & CORE_RESET          ? "reset"  : "normal operation",
+		data[32] & CORE_RX_FIFO_FLUSH  ? "flush"  : "ok",
+		data[32] & CORE_TX_FIFO_FLUSH  ? "flush"  : "ok",
+		data[32] & CORE_SEND_JAM       ? "yes"    : "no",
+		data[32] & CORE_MDC_EN         ? "output" : "input"
+	);
+	fprintf(stdout,
+		"MAC addresses: \n"
+		"  Multicast mask:     " MAC "\n"
+		"  Multicast address:  " MAC "\n"
+		"  Unicast address:    " MAC "\n"
+		"\n",
+		MAC_DATA(data+13), MAC_DATA(data+19), MAC_DATA(data+26)
+	);
+	fprintf(stdout,
+		"Random seed:      0x%02x\n"
+		"Threshold empty:   %3d\n"
+		"Threshold full:    %3d\n"
+		"TX buffer size:    %3d\n"
+		"TX deferral:       %3d\n"
+		"RX deferral:       %3d\n"
+		"TX two deferral 1: %3d\n"
+		"TX two deferral 2: %3d\n"
+		"Slot time:         %3d\n"
+		"Internal clock:    %3d\n"
+		"\n",
+		data[4], data[5], data[6], data[7], data[8], data[9],
+		data[10], data[11], data[12], data[25]
+	);
+
+	return 0;
+}