diff --git a/drivers/net/enc28j60.c b/drivers/net/enc28j60.c
index 5731bdb..784d1dd 100644
--- a/drivers/net/enc28j60.c
+++ b/drivers/net/enc28j60.c
@@ -21,6 +21,7 @@
  */
 
 #include <common.h>
+#include <command.h>
 #include <net.h>
 #include <spi.h>
 #include <malloc.h>
@@ -926,6 +927,7 @@ static void enc_halt(struct eth_device *dev)
 	enc_release_bus(enc);
 }
 
+enc_dev_t *genc;
 /*
  * This is the only exported function.
  *
@@ -974,5 +976,65 @@ int enc28j60_initialize(unsigned int bus, unsigned int cs,
 #if defined(CONFIG_CMD_MII)
 	miiphy_register(dev->name, enc_miiphy_read, enc_miiphy_write);
 #endif
+	genc = enc;
 	return 0;
 }
+
+
+int do_enc(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
+{
+	char *cmd;
+	u32 reg;
+	u32 val;
+
+	/* at least two arguments */
+	if (argc < 3)
+		return cmd_usage(cmdtp);
+
+	cmd = argv[1];
+	if (strcmp(cmd, "r") == 0) {
+		if (argc < 3)
+			return cmd_usage(cmdtp);
+
+		reg = simple_strtoul(argv[2], NULL, 16);
+		printf("reg. 0x%02lx: 0x%02lx\n", (ulong)reg, (ulong)enc_r8(genc, (u16)reg));
+		return 0;
+	}
+	if (strcmp(cmd, "pr") == 0) {
+		if (argc < 3)
+			return cmd_usage(cmdtp);
+
+		reg = simple_strtoul(argv[2], NULL, 16);
+		printf("phy reg. 0x%02lx: 0x%04lx\n", (ulong)reg, (ulong)phy_read(genc, (u8)reg));
+		return 0;
+	}
+	if (strcmp(cmd, "w") == 0) {
+		if (argc < 4)
+			return cmd_usage(cmdtp);
+
+		reg = simple_strtoul(argv[2], NULL, 16);
+		val = simple_strtoul(argv[3], NULL, 16);
+		enc_w8(genc, (u16)reg, (u8)val);
+		return 0;
+	}
+	if (strcmp(cmd, "pw") == 0) {
+		if (argc < 4)
+			return cmd_usage(cmdtp);
+
+		reg = simple_strtoul(argv[2], NULL, 16);
+		val = simple_strtoul(argv[3], NULL, 16);
+		phy_write(genc, (u8)reg, (u16)val);
+		return 0;
+	}
+	/* No subcommand */
+	return 1;
+}
+
+U_BOOT_CMD(
+	enc,	4, 1, do_enc,
+	"enc28j60 register read/write",
+	"r <reg> - read register\n"
+	"enc w <reg> <value> - write register\n"
+	"enc pr <reg> - read PHY register\n"
+	"enc pw <reg> <value> - write PHY register"
+);
