diff --git a/Makefile.am b/Makefile.am
index edbda57..14f79b6 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -14,7 +14,7 @@ ethtool_SOURCES += \
 		  pcnet32.c realtek.c tg3.c marvell.c vioc.c	\
 		  smsc911x.c at76c50x-usb.c sfc.c stmmac.c	\
 		  sff-common.c sff-common.h sfpid.c sfpdiag.c	\
-		  ixgbevf.c tse.c vmxnet3.c qsfp.c qsfp.h fjes.c
+		  ixgbevf.c tse.c vmxnet3.c qsfp.c qsfp.h fjes.c lan78xx.c
 endif
 
 TESTS = test-cmdline test-features
diff --git a/ethtool.c b/ethtool.c
index da7421c..3494402 100644
--- a/ethtool.c
+++ b/ethtool.c
@@ -1160,6 +1160,7 @@ static const struct {
 	{ "altera_tse", altera_tse_dump_regs },
 	{ "vmxnet3", vmxnet3_dump_regs },
 	{ "fjes", fjes_dump_regs },
+	{ "lan78xx", lan78xx_dump_regs },
 #endif
 };
 
diff --git a/internal.h b/internal.h
index 913f4eb..b239dc7 100644
--- a/internal.h
+++ b/internal.h
@@ -350,4 +350,8 @@ void sff8636_show_all(const __u8 *id, __u32 eeprom_len);
 
 /* FUJITSU Extended Socket network device */
 int fjes_dump_regs(struct ethtool_drvinfo *info, struct ethtool_regs *regs);
+
+/* MICROCHIP LAN78XX USB ETHERNET Controller */
+int lan78xx_dump_regs(struct ethtool_drvinfo *info, struct ethtool_regs *regs);
+
 #endif /* ETHTOOL_INTERNAL_H__ */
diff --git a/lan78xx.c b/lan78xx.c
new file mode 100644
index 0000000..bb64e80
--- /dev/null
+++ b/lan78xx.c
@@ -0,0 +1,87 @@
+#include <stdio.h>
+#include <string.h>
+#include "internal.h"
+
+int lan78xx_dump_regs(struct ethtool_drvinfo *info, struct ethtool_regs *regs)
+{
+	unsigned int *lan78xx_reg = (unsigned int *)regs->data;
+
+	fprintf(stdout, "LAN78xx Registers:\n");
+	fprintf(stdout, "------------------\n");
+	fprintf(stdout, "ID_REV       = 0x%08X\n", *lan78xx_reg++);
+	fprintf(stdout, "INT_STS      = 0x%08X\n", *lan78xx_reg++);
+	fprintf(stdout, "HW_CFG       = 0x%08X\n", *lan78xx_reg++);
+	fprintf(stdout, "PMT_CTRL     = 0x%08X\n", *lan78xx_reg++);
+	fprintf(stdout, "E2P_CMD      = 0x%08X\n", *lan78xx_reg++);
+	fprintf(stdout, "E2P_DATA     = 0x%08X\n", *lan78xx_reg++);
+	fprintf(stdout, "USB_STATUS   = 0x%08X\n", *lan78xx_reg++);
+	fprintf(stdout, "VLAN_TYPE    = 0x%08X\n", *lan78xx_reg++);
+	fprintf(stdout, "\n");
+
+	fprintf(stdout, "MAC Registers:\n");
+	fprintf(stdout, "--------------\n");
+	fprintf(stdout, "MAC_CR             = 0x%08X\n", *lan78xx_reg++);
+	fprintf(stdout, "MAC_RX             = 0x%08X\n", *lan78xx_reg++);
+	fprintf(stdout, "MAC_TX             = 0x%08X\n", *lan78xx_reg++);
+	fprintf(stdout, "FLOW               = 0x%08X\n", *lan78xx_reg++);
+	fprintf(stdout, "ERR_STS            = 0x%08X\n", *lan78xx_reg++);
+	fprintf(stdout, "MII_ACC            = 0x%08X\n", *lan78xx_reg++);
+	fprintf(stdout, "MII_DATA           = 0x%08X\n", *lan78xx_reg++);
+	fprintf(stdout, "EEE_TX_LPI_REQ_DLY = 0x%08X\n", *lan78xx_reg++);
+	fprintf(stdout, "EEE_TW_TX_SYS      = 0x%08X\n", *lan78xx_reg++);
+	fprintf(stdout, "EEE_TX_LPI_REM_DLY = 0x%08X\n", *lan78xx_reg++);
+	fprintf(stdout, "WUCSR              = 0x%08X\n", *lan78xx_reg++);
+	fprintf(stdout, "\n");
+
+	fprintf(stdout, "PHY Registers:\n");
+	fprintf(stdout, "--------------\n");
+	fprintf(stdout, "Mode Control = 0x%04X\n", *lan78xx_reg++);
+	fprintf(stdout, "Mode Status  = 0x%04X\n", *lan78xx_reg++);
+	fprintf(stdout, "Device identifier1   = 0x%04X\n", *lan78xx_reg++);
+	fprintf(stdout, "Device identifier2   = 0x%04X\n", *lan78xx_reg++);
+	fprintf(stdout, "Auto-Neg Advertisement         = 0x%04X\n",
+		*lan78xx_reg++);
+	fprintf(stdout, "Auto-Neg Link Partner Ability  = 0x%04X\n",
+		*lan78xx_reg++);
+	fprintf(stdout, "Auto-Neg Expansion      = 0x%04X\n", *lan78xx_reg++);
+	fprintf(stdout, "Auto-Neg Next Page TX   = 0x%04X\n", *lan78xx_reg++);
+	fprintf(stdout, "Auto-Neg Link Partner Next Page RX  = 0x%04X\n",
+		*lan78xx_reg++);
+	fprintf(stdout, "1000BASE-T Control  = 0x%04X\n", *lan78xx_reg++);
+	fprintf(stdout, "1000BASE-T Status   = 0x%04X\n", *lan78xx_reg++);
+	fprintf(stdout, "Reserved  = 0x%04X\n", *lan78xx_reg++);
+	fprintf(stdout, "Reserved  = 0x%04X\n", *lan78xx_reg++);
+	fprintf(stdout, "MMD Access Control       = 0x%04X\n", *lan78xx_reg++);
+	fprintf(stdout, "MMD Access Address/Data  = 0x%04X\n", *lan78xx_reg++);
+	fprintf(stdout, "1000BASE-T Status Extension1  = 0x%04X\n",
+		*lan78xx_reg++);
+	fprintf(stdout, "1000BASE-TX Status Extension  = 0x%04X\n",
+		*lan78xx_reg++);
+	fprintf(stdout, "1000BASE-T Status Extension2  = 0x%04X\n",
+		*lan78xx_reg++);
+	fprintf(stdout, "Bypass Control  = 0x%04X\n", *lan78xx_reg++);
+	fprintf(stdout,
+		"100BASE-TX/1000BASE-T Rx Error Counter    = 0x%04X\n",
+		*lan78xx_reg++);
+	fprintf(stdout,
+		"100BASE-TX/1000BASE-T FC Err Counter      = 0x%04X\n",
+		*lan78xx_reg++);
+	fprintf(stdout,
+		"10BASE-T/100BASE-TX/1000BASE-T LD Counter = 0x%04X\n",
+		*lan78xx_reg++);
+	fprintf(stdout, "Extended 10BASE-T Control and Status      = 0x%04X\n",
+		*lan78xx_reg++);
+	fprintf(stdout, "Extended PHY Control1  = 0x%04X\n", *lan78xx_reg++);
+	fprintf(stdout, "Extended PHY Control2  = 0x%04X\n", *lan78xx_reg++);
+	fprintf(stdout, "Interrupt Mask    = 0x%04X\n", *lan78xx_reg++);
+	fprintf(stdout, "Interrupt Status  = 0x%04X\n", *lan78xx_reg++);
+	fprintf(stdout, "Reserved  = 0x%04X\n", *lan78xx_reg++);
+	fprintf(stdout, "Auxiliary Control and Status  = 0x%04X\n",
+		*lan78xx_reg++);
+	fprintf(stdout, "LED Mode Select  = 0x%04X\n", *lan78xx_reg++);
+	fprintf(stdout, "LED Behavior     = 0x%04X\n", *lan78xx_reg++);
+	fprintf(stdout, "Extended Page Access  = 0x%04X\n", *lan78xx_reg++);
+	fprintf(stdout, "\n");
+
+	return 0;
+}
