All of lore.kernel.org
 help / color / mirror / Atom feed
* [U-Boot] [PATCH 1/2] net: Add a command to access the EEPROM from ethernet devices
@ 2014-10-07  9:19 Alban Bedel
  2014-10-07  9:19 ` [U-Boot] [PATCH 2/2] usb: eth: smsc95xx: Add EEPROM access support Alban Bedel
  0 siblings, 1 reply; 6+ messages in thread
From: Alban Bedel @ 2014-10-07  9:19 UTC (permalink / raw)
  To: u-boot

Many ethernet devices use an EEPROM to store various settings, most
commonly the device MAC address. But on some devices it can contains
a lot more, for example USB device might also have many USB related
parameters.

This commit add a set of commands to read/write this EEPROM, write a
default configuration and read/write the device MAC address. The
defaults command allow priming the EEPROM for devices that need more
than just a MAC address in the EEPROM.

Change-Id: I9f2d15f84b772dc680349c65c89e772780823745
Signed-off-by: Alban Bedel <alban.bedel@avionic-design.de>
---
 common/cmd_net.c | 134 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 include/net.h    |  28 ++++++++++++
 net/eth.c        |  46 +++++++++++++++++++
 3 files changed, 208 insertions(+)

diff --git a/common/cmd_net.c b/common/cmd_net.c
index 09489d4..f4952d5 100644
--- a/common/cmd_net.c
+++ b/common/cmd_net.c
@@ -445,3 +445,137 @@ U_BOOT_CMD(
 );
 
 #endif  /* CONFIG_CMD_LINK_LOCAL */
+
+#if defined(CONFIG_CMD_ETH_EEPROM)
+static int do_eth_eeprom_rw(struct eth_device *dev,
+			int argc, char * const argv[])
+{
+	ulong addr, offset, length = 1;
+
+	if (argc < 4)
+		return CMD_RET_USAGE;
+
+	addr = simple_strtoul(argv[2], NULL, 16);
+	offset = simple_strtoul(argv[3], NULL, 16);
+	if (argc > 4)
+		length = simple_strtoul(argv[4], NULL, 16);
+
+	if (!strcmp(argv[0], "write")) {
+		if (eth_eeprom_write(dev, offset, length, (void *)addr)) {
+			printf("EEPROM write failed\n");
+			return CMD_RET_FAILURE;
+		}
+		return CMD_RET_SUCCESS;
+	} else if (!strcmp(argv[0], "read")) {
+		if (eth_eeprom_read(dev, offset, length, (void *)addr)) {
+			printf("EEPROM read failed\n");
+			return CMD_RET_FAILURE;
+		}
+		return CMD_RET_SUCCESS;
+	}
+
+	return CMD_RET_USAGE;
+}
+
+static int do_eth_eeprom_defaults(struct eth_device *dev,
+				int argc, char * const argv[])
+{
+	if (eth_eeprom_defaults(dev)) {
+		printf("EEPROM write failed\n");
+		return CMD_RET_FAILURE;
+	}
+
+	return CMD_RET_SUCCESS;
+}
+
+static int do_eth_eeprom_set_mac(struct eth_device *dev,
+				int argc, char * const argv[])
+{
+	u8 mac[6];
+
+	if (argc < 3)
+		return CMD_RET_USAGE;
+
+	eth_parse_enetaddr(argv[2], mac);
+	if (!is_valid_ether_addr(mac)) {
+		printf("Invalid mac address given\n");
+		return CMD_RET_FAILURE;
+	}
+
+	printf("Writing MAC to EEPROM ....\n");
+	if (eth_eeprom_write_mac(dev, mac)) {
+		printf("EEPROM write failed\n");
+		return CMD_RET_FAILURE;
+	}
+
+	return CMD_RET_SUCCESS;
+}
+
+static int do_eth_eeprom_show_mac(struct eth_device *dev,
+				int argc, char * const argv[])
+{
+	u8 data[6];
+
+	if (eth_eeprom_read_mac(dev, data)) {
+		printf("EEPROM read failed\n");
+		return CMD_RET_FAILURE;
+	}
+
+	printf("%pM\n", data);
+	if (!is_valid_ether_addr(data))
+		printf("Warning: MAC address is not valid!\n");
+
+	return CMD_RET_SUCCESS;
+}
+
+static int do_eth_eeprom(cmd_tbl_t *cmdtp, int flag, int argc,
+			char * const argv[])
+{
+	struct eth_device *dev;
+	char *endp = NULL;
+	int index;
+
+	if (argc < 3)
+		return CMD_RET_USAGE;
+
+	/* Get the ethernet device, by ID or by name */
+	index = (int) simple_strtoul(argv[2], &endp, 16);
+	if (endp > argv[2])
+		dev = eth_get_dev_by_index(index);
+	else
+		dev = eth_get_dev_by_name(argv[2]);
+
+	if (!dev) {
+		printf("Ethernet device not found\n");
+		return CMD_RET_FAILURE;
+	}
+
+	if (!strcmp(argv[1], "read") || !strcmp(argv[1], "write"))
+		return do_eth_eeprom_rw(dev, argc - 1, argv + 1);
+	if (!strcmp(argv[1], "defaults"))
+		return do_eth_eeprom_defaults(dev, argc - 1, argv + 1);
+	if (!strcmp(argv[1], "set_mac"))
+		return do_eth_eeprom_set_mac(dev, argc - 1, argv + 1);
+	if (!strcmp(argv[1], "show_mac"))
+		return do_eth_eeprom_show_mac(dev, argc - 1, argv + 1);
+
+	printf("Unknown sub command: %s\n", argv[1]);
+
+	return CMD_RET_USAGE;
+}
+
+U_BOOT_CMD(
+	eth_eeprom,	6,	0,	do_eth_eeprom,
+	"access the EEPROM of ethernet devices",
+	"read dev addr off [size]\n"
+	"    - read 'size' bytes starting at offset 'off' to memory address 'addr'.\n"
+	"eth_eeprom write dev addr off [size]\n"
+	"    - write 'size' bytes starting at offset 'off' from memory address 'addr'.\n"
+	"eth_eeprom defaults dev\n"
+	"    - write default settings in the EEPROM.\n"
+	"eth_eeprom set_mac dev mac\n"
+	"    - set the MAC address in the EEPROM to 'mac'\n"
+	"eth_eeprom show_mac dev\n"
+	"    - read the MAC address from the EEPROM."
+);
+#endif
diff --git a/include/net.h b/include/net.h
index 735b0b9..39ea848 100644
--- a/include/net.h
+++ b/include/net.h
@@ -92,6 +92,25 @@ struct eth_device {
 	int (*mcast) (struct eth_device *, const u8 *enetaddr, u8 set);
 #endif
 	int  (*write_hwaddr) (struct eth_device *);
+#ifdef CONFIG_CMD_ETH_EEPROM
+	/* Read data from the ethernet device eeprom */
+	int (*eeprom_read)(struct eth_device *,
+			   u32 offset, u32 length, u8 *data);
+	/* Write data to the ethernet device eeprom */
+	int (*eeprom_write)(struct eth_device *,
+			    u32 offset, u32 length, u8 *data);
+	/* Write the default settings to the eeprom */
+	int (*eeprom_defaults)(struct eth_device *);
+	/* Read the MAC stored in the eeprom, if not implemented
+	 * the MAC is assumed to be at the given offset. */
+	int (*eeprom_read_mac)(struct eth_device *, u8 *enetaddr);
+	/* Write the MAC in the eeprom, if not implemented
+	 * the MAC is assumed to be at the given offset. */
+	int (*eeprom_write_mac)(struct eth_device *, u8 *enetaddr);
+	/* Offset of the MAC address for the default implementation.
+	 * Set to a negative value if the MAC is not in the EEPROM. */
+	int eeprom_mac_offset;
+#endif
 	struct eth_device *next;
 	int index;
 	void *priv;
@@ -172,6 +191,15 @@ int eth_mcast_join(IPaddr_t mcast_addr, u8 join);
 u32 ether_crc(size_t len, unsigned char const *p);
 #endif
 
+#ifdef CONFIG_CMD_ETH_EEPROM
+int eth_eeprom_read(struct eth_device *dev, u32 offset,
+		    u32 length, u8 *data);
+int eth_eeprom_write(struct eth_device *dev, u32 offset,
+		     u32 length, u8 *data);
+int eth_eeprom_defaults(struct eth_device *dev);
+int eth_eeprom_read_mac(struct eth_device *, u8 *enetaddr);
+int eth_eeprom_write_mac(struct eth_device *, u8 *enetaddr);
+#endif
 
 /**********************************************************************/
 /*
diff --git a/net/eth.c b/net/eth.c
index 76ffa05..2cde72c 100644
--- a/net/eth.c
+++ b/net/eth.c
@@ -542,3 +542,49 @@ char *eth_get_name(void)
 {
 	return eth_current ? eth_current->name : "unknown";
 }
+
+#ifdef CONFIG_CMD_ETH_EEPROM
+int eth_eeprom_read(struct eth_device *dev, u32 offset,
+		    u32 length, u8 *data)
+{
+	return dev->eeprom_read ?
+		dev->eeprom_read(dev, offset, length, data) :
+		-ENOSYS;
+}
+
+int eth_eeprom_write(struct eth_device *dev, u32 offset,
+		     u32 length, u8 *data)
+{
+	return dev->eeprom_write ?
+		dev->eeprom_write(dev, offset, length, data) :
+		-ENOSYS;
+}
+
+int eth_eeprom_defaults(struct eth_device *dev)
+{
+	return dev->eeprom_defaults ? dev->eeprom_defaults(dev) :
+		-ENOSYS;
+}
+
+int eth_eeprom_read_mac(struct eth_device *dev, u8 *enetaddr)
+{
+	if (dev->eeprom_read_mac)
+		return dev->eeprom_read_mac(dev, enetaddr);
+
+	return dev->eeprom_mac_offset >= 0 ?
+		eth_eeprom_read(dev, dev->eeprom_mac_offset,
+				6, enetaddr) :
+		-ENOSYS;
+}
+
+int eth_eeprom_write_mac(struct eth_device *dev, u8 *enetaddr)
+{
+	if (dev->eeprom_write_mac)
+		return dev->eeprom_write_mac(dev, enetaddr);
+
+	return dev->eeprom_mac_offset >= 0 ?
+		eth_eeprom_write(dev, dev->eeprom_mac_offset,
+				 6, enetaddr) :
+		-ENOSYS;
+}
+#endif
-- 
2.1.1

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

* [U-Boot] [PATCH 2/2] usb: eth: smsc95xx: Add EEPROM access support
  2014-10-07  9:19 [U-Boot] [PATCH 1/2] net: Add a command to access the EEPROM from ethernet devices Alban Bedel
@ 2014-10-07  9:19 ` Alban Bedel
  2014-10-07 12:22   ` Pavel Machek
  0 siblings, 1 reply; 6+ messages in thread
From: Alban Bedel @ 2014-10-07  9:19 UTC (permalink / raw)
  To: u-boot

Use the new ethernet eeprom API to allow the user to read/write the
EEPROM.

Change-Id: I21233b6ee805a75bd8a03ca12e22c41421b7629c
Signed-off-by: Alban Bedel <alban.bedel@avionic-design.de>
---
 drivers/usb/eth/smsc95xx.c | 199 +++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 192 insertions(+), 7 deletions(-)

diff --git a/drivers/usb/eth/smsc95xx.c b/drivers/usb/eth/smsc95xx.c
index 6bca34d..eb29565 100644
--- a/drivers/usb/eth/smsc95xx.c
+++ b/drivers/usb/eth/smsc95xx.c
@@ -59,6 +59,8 @@
 
 #define E2P_CMD				0x30
 #define E2P_CMD_BUSY_			0x80000000
+#define E2P_CMD_EWEN_			0x20000000
+#define E2P_CMD_WRITE_			0x30000000
 #define E2P_CMD_READ_			0x00000000
 #define E2P_CMD_TIMEOUT_		0x00000400
 #define E2P_CMD_LOADED_			0x00000200
@@ -146,6 +148,131 @@ struct smsc95xx_private {
 	int have_hwaddr;  /* 1 if we have a hardware MAC address */
 };
 
+#ifdef CONFIG_CMD_ETH_EEPROM
+static u8 eeprom_defaults[] = {
+	/* 0x00 */
+	0xA5,		/* Signature */
+	0xFF, 0xFF,	/* MAC bytes 0-1 */
+	0xFF, 0xFF,	/* MAC bytes 2-3 */
+	0xFF, 0xFF,	/* MAC bytes 4-5 */
+	0x01,		/* FS Polling Interval for Interrupt Endpoint */
+	0x01,		/* HS Polling Interval for Interrupt Endpoint */
+	0x01,		/* Configuration Flags */
+	0x09, 0x04,	/* Language ID */
+	0x0a,		/* Manufacturer ID String Descriptor Length (bytes) */
+	0x2f,		/* Manufacturer ID String Descriptor EEPROM Word Offset */
+	0x10,		/* Product Name String Descriptor Length (bytes) */
+	0x34,		/* Product Name String Descriptor EEPROM Word Offset */
+	/* 0x10 */
+	0x12,		/* Serial Number String Descriptor Length (bytes) */
+	0x3c,		/* Serial Number String Descriptor EEPROM Word Offset */
+	0x08,		/* Configuration String Descriptor Length (bytes) */
+	0x45,		/* Configuration String Descriptor Word Offset */
+	0x08,		/* Interface String Descriptor Length (bytes) */
+	0x49,		/* Interface String Descriptor Word Offset */
+	0x12,		/* Hi-Speed Device Descriptor Length (bytes) */
+	0x1d,		/* Hi-Speed Device Descriptor Word Offset */
+	0x12,		/* Hi-Speed Configuration and Interface Descriptor Length (bytes) */
+	0x26,		/* Hi-Speed Configuration and Interface Descriptor Word Offset */
+	0x12,		/* Full-Speed Device Descriptor Length (bytes) */
+	0x1d,		/* Full-Speed Device Descriptor Word Offset */
+	0x12,		/* Full-Speed Configuration and Interface Descriptor Length (bytes) */
+	0x26,		/* Full-Speed Configuration and Interface Descriptor Word Offset */
+	0x00, 0x00,	/* RESERVED */
+	/* 0x20 */
+	0x24, 0x04,	/* Vendor ID */
+	0x14, 0x95,	/* Product ID */
+	0x00, 0x01,	/* Device ID */
+	0x9b,		/* Config Data Byte 1 Register (CFG1) */
+	0x18,		/* Config Data Byte 2 Register (CFG2) */
+	0x00,		/* Config Data Byte 3 Register (CFG3) */
+	0x32,		/* Non-Removable Devices Register (NRD) */
+	0x00,		/* Port Disable (Self) Register (PDS) */
+	0x00,		/* Port Disable (Bus) Register (PDB) */
+	0x01,		/* Max Power (Self) Register (MAXPS) */
+	0x00,		/* Max Power (Bus) Register (MAXPB) */
+	0x01,		/* Hub Controller Max Current (Self) Register (HCMCS) */
+	0x00,		/* Hub Controller Max Current (Bus) Register (HCMCB) */
+	/* 0x30 */
+	0x32,		/* Power-on Time Register (PWRT) */
+	0x00,		/* Boost_Up Register (BOOSTUP) */
+	0x00,		/* Boost_5 Register (BOOST5) */
+	0x00,		/* Boost_4:2 Register (BOOST42) */
+	0x00,		/* RESERVED */
+	0x00,		/* Port Swap Register (PRTSP) */
+	0x21,		/* Port Remap 12 Register (PRTR12) */
+	0x43,		/* Port Remap 34 Register (PRTR34) */
+	0x05,		/* Port Remap 5 Register (PRTR5) */
+	0x01,		/* Status/Command Register (STCD) */
+	/* 0x3A		 - Device Descriptor */
+	0x12, 0x01,
+	0x00, 0x02,
+	0xff, 0x00,
+	/* 0x40 */
+	0xff, 0x40,
+	0x24, 0x04,
+	0x00, 0xec,
+	0x00, 0x01,
+	0x01, 0x02,
+	0x03, 0x01,
+	/* 0x4C		 - Configuration and Interface Descriptor */
+	0x09, 0x02,
+	0x27, 0x00,
+	/* 0x50 */
+	0x01, 0x01,
+	0x04, 0xc0,
+	0x00, 0x09,
+	0x04, 0x00,
+	0x00, 0x03,
+	0xff, 0x00,
+	0xff, 0x05,
+	/* 0x5E		 - Manufacturer ID String Descriptor */
+	0x0a, 0x03,
+	/* 0x60 */
+	0x53, 0x00,	/* S */
+	0x4d, 0x00,	/* M */
+	0x53, 0x00,	/* S */
+	0x43, 0x00,	/* C */
+	/* 0x68		 - Product Name String */
+	0x10, 0x03,
+	0x4c, 0x00,	/* L */
+	0x41, 0x00,	/* A */
+	0x4e, 0x00,	/* N */
+	/* 0x70 */
+	0x39, 0x00,	/* 9 */
+	0x35, 0x00,	/* 5 */
+	0x31, 0x00,	/* 1 */
+	0x34, 0x00,	/* 5 */
+	/* 0x78		 - Serial Number String Descriptor */
+	0x12, 0x03,
+	0x31, 0x00,	/* 1 */
+	0x32, 0x00,	/* 2 */
+	0x33, 0x00,	/* 3 */
+	/* 0x80 */
+	0x34, 0x00,	/* 4 */
+	0x35, 0x00,	/* 5 */
+	0x36, 0x00,	/* 6 */
+	0x37, 0x00,	/* 7 */
+	0x38, 0x00,	/* 8 */
+	/* 0x8A		 - Configuration String Descriptor */
+	0x08, 0x03,
+	0x43, 0x00,	/* C */
+	0x66, 0x00,	/* f */
+	/* 0x90 */
+	0x67, 0x00,	/* g */
+	/* 0x92		 - Interface String Descriptor */
+	0x08, 0x03,
+	0x69, 0x00,	/* i */
+	0x2f, 0x00,	/* / */
+	0x66, 0x00,	/* f */
+	/* 0x9A - END */
+	0x00, 0x00,
+	0x00, 0x00,
+	0x00, 0x00,
+	/* 0xA0 */
+};
+#endif
+
 /*
  * Smsc95xx infrastructure commands
  */
@@ -285,9 +412,10 @@ static int smsc95xx_wait_eeprom(struct ueth_data *dev)
 	return 0;
 }
 
-static int smsc95xx_read_eeprom(struct ueth_data *dev, u32 offset, u32 length,
-				u8 *data)
+static int smsc95xx_read_eeprom(struct eth_device *eth, u32 offset, u32 length,
+			u8 *data)
 {
+	struct ueth_data *dev = (struct ueth_data *)eth->priv;
 	u32 val;
 	int i, ret;
 
@@ -310,6 +438,58 @@ static int smsc95xx_read_eeprom(struct ueth_data *dev, u32 offset, u32 length,
 	return 0;
 }
 
+#ifdef CONFIG_CMD_ETH_EEPROM
+static int smsc95xx_write_eeprom(struct eth_device *eth, u32 offset, u32 length,
+			u8 *data)
+{
+	struct ueth_data *dev = (struct ueth_data *)eth->priv;
+	u32 val;
+	int i, ret;
+
+	ret = smsc95xx_eeprom_confirm_not_busy(dev);
+	if (ret)
+		return ret;
+
+	/* Issue write/erase enable command */
+	val = E2P_CMD_BUSY_ | E2P_CMD_EWEN_;
+	ret = smsc95xx_write_reg(dev, E2P_CMD, val);
+	if (ret < 0)
+		return ret;
+
+	ret = smsc95xx_wait_eeprom(dev);
+	if (ret < 0)
+		return ret;
+
+	for (i = 0; i < length; i++) {
+		/* Fill data register */
+		val = data[i];
+		ret = smsc95xx_write_reg(dev, E2P_DATA, val);
+		if (ret < 0)
+			return ret;
+
+		/* Send "write" command */
+		val = E2P_CMD_BUSY_ | E2P_CMD_WRITE_ |
+			(offset & E2P_CMD_ADDR_);
+		ret = smsc95xx_write_reg(dev, E2P_CMD, val);
+		if (ret < 0)
+			return ret;
+
+		ret = smsc95xx_wait_eeprom(dev);
+		if (ret < 0)
+			return ret;
+
+		offset++;
+	}
+	return 0;
+}
+
+static int smsc95xx_defaults_eeprom(struct eth_device *eth)
+{
+	return smsc95xx_write_eeprom(eth, 0, sizeof(eeprom_defaults),
+				eeprom_defaults);
+}
+#endif
+
 /*
  * mii_nway_restart - restart NWay (autonegotiation) for this interface
  *
@@ -349,12 +529,11 @@ static int smsc95xx_phy_initialize(struct ueth_data *dev)
 	return 0;
 }
 
-static int smsc95xx_init_mac_address(struct eth_device *eth,
-		struct ueth_data *dev)
+static int smsc95xx_init_mac_address(struct eth_device *eth)
 {
 	/* try reading mac address from EEPROM */
-	if (smsc95xx_read_eeprom(dev, EEPROM_MAC_OFFSET, ETH_ALEN,
-			eth->enetaddr) == 0) {
+	if (smsc95xx_read_eeprom(eth, EEPROM_MAC_OFFSET, ETH_ALEN,
+				 eth->enetaddr) == 0) {
 		if (is_valid_ether_addr(eth->enetaddr)) {
 			/* eeprom values are valid so use them */
 			debug("MAC address read from EEPROM\n");
@@ -507,7 +686,7 @@ static int smsc95xx_init(struct eth_device *eth, bd_t *bd)
 		debug("timeout waiting for PHY Reset\n");
 		return -1;
 	}
-	if (!priv->have_hwaddr && smsc95xx_init_mac_address(eth, dev) == 0)
+	if (!priv->have_hwaddr && smsc95xx_init_mac_address(eth) == 0)
 		priv->have_hwaddr = 1;
 	if (!priv->have_hwaddr) {
 		puts("Error: SMSC95xx: No MAC address set - set usbethaddr\n");
@@ -894,6 +1073,12 @@ int smsc95xx_eth_get_info(struct usb_device *dev, struct ueth_data *ss,
 	eth->recv = smsc95xx_recv;
 	eth->halt = smsc95xx_halt;
 	eth->write_hwaddr = smsc95xx_write_hwaddr;
+#ifdef CONFIG_CMD_ETH_EEPROM
+	eth->eeprom_read = smsc95xx_read_eeprom;
+	eth->eeprom_write = smsc95xx_write_eeprom;
+	eth->eeprom_defaults = smsc95xx_defaults_eeprom;
+	eth->eeprom_mac_offset = EEPROM_MAC_OFFSET;
+#endif
 	eth->priv = ss;
 	return 1;
 }
-- 
2.1.1

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

* [U-Boot] [PATCH 2/2] usb: eth: smsc95xx: Add EEPROM access support
  2014-10-07  9:19 ` [U-Boot] [PATCH 2/2] usb: eth: smsc95xx: Add EEPROM access support Alban Bedel
@ 2014-10-07 12:22   ` Pavel Machek
  2014-10-07 13:35     ` Alban Bedel
  0 siblings, 1 reply; 6+ messages in thread
From: Pavel Machek @ 2014-10-07 12:22 UTC (permalink / raw)
  To: u-boot

On Tue 2014-10-07 11:19:37, Alban Bedel wrote:
> Use the new ethernet eeprom API to allow the user to read/write the
> EEPROM.
> 
> Change-Id: I21233b6ee805a75bd8a03ca12e22c41421b7629c
> Signed-off-by: Alban Bedel <alban.bedel@avionic-design.de>
> ---
>  drivers/usb/eth/smsc95xx.c | 199 +++++++++++++++++++++++++++++++++++++++++++--
>  1 file changed, 192 insertions(+), 7 deletions(-)
> 
> diff --git a/drivers/usb/eth/smsc95xx.c b/drivers/usb/eth/smsc95xx.c
> index 6bca34d..eb29565 100644
> --- a/drivers/usb/eth/smsc95xx.c
> +++ b/drivers/usb/eth/smsc95xx.c
> @@ -59,6 +59,8 @@
>  
>  #define E2P_CMD				0x30
>  #define E2P_CMD_BUSY_			0x80000000
> +#define E2P_CMD_EWEN_			0x20000000
> +#define E2P_CMD_WRITE_			0x30000000
>  #define E2P_CMD_READ_			0x00000000
>  #define E2P_CMD_TIMEOUT_		0x00000400
>  #define E2P_CMD_LOADED_			0x00000200
> @@ -146,6 +148,131 @@ struct smsc95xx_private {
>  	int have_hwaddr;  /* 1 if we have a hardware MAC address */
>  };
>  
> +#ifdef CONFIG_CMD_ETH_EEPROM

Is this layout common for all machines using this driver? If not, is
it worth comment which machine is it?

> +static u8 eeprom_defaults[] = {
> +	/* 0x00 */
> +	0xA5,		/* Signature */
> +	0xFF, 0xFF,	/* MAC bytes 0-1 */
> +	0xFF, 0xFF,	/* MAC bytes 2-3 */
> +	0xFF, 0xFF,	/* MAC bytes 4-5 */

Normally, we use all zeros for unset...?

Best regards,
								Pavel

-- 
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html

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

* [U-Boot] [PATCH 2/2] usb: eth: smsc95xx: Add EEPROM access support
  2014-10-07 12:22   ` Pavel Machek
@ 2014-10-07 13:35     ` Alban Bedel
  2014-10-07 13:40       ` Marek Vasut
  2014-10-07 17:51       ` Pavel Machek
  0 siblings, 2 replies; 6+ messages in thread
From: Alban Bedel @ 2014-10-07 13:35 UTC (permalink / raw)
  To: u-boot

On Tue, 7 Oct 2014 14:22:09 +0200
Pavel Machek <pavel@denx.de> wrote:

> On Tue 2014-10-07 11:19:37, Alban Bedel wrote:
> > Use the new ethernet eeprom API to allow the user to read/write the
> > EEPROM.
> > 
> > Change-Id: I21233b6ee805a75bd8a03ca12e22c41421b7629c
> > Signed-off-by: Alban Bedel <alban.bedel@avionic-design.de>
> > ---
> >  drivers/usb/eth/smsc95xx.c | 199 +++++++++++++++++++++++++++++++++++++++++++--
> >  1 file changed, 192 insertions(+), 7 deletions(-)
> > 
> > diff --git a/drivers/usb/eth/smsc95xx.c b/drivers/usb/eth/smsc95xx.c
> > index 6bca34d..eb29565 100644
> > --- a/drivers/usb/eth/smsc95xx.c
> > +++ b/drivers/usb/eth/smsc95xx.c
> > @@ -59,6 +59,8 @@
> >  
> >  #define E2P_CMD				0x30
> >  #define E2P_CMD_BUSY_			0x80000000
> > +#define E2P_CMD_EWEN_			0x20000000
> > +#define E2P_CMD_WRITE_			0x30000000
> >  #define E2P_CMD_READ_			0x00000000
> >  #define E2P_CMD_TIMEOUT_		0x00000400
> >  #define E2P_CMD_LOADED_			0x00000200
> > @@ -146,6 +148,131 @@ struct smsc95xx_private {
> >  	int have_hwaddr;  /* 1 if we have a hardware MAC address */
> >  };
> >  
> > +#ifdef CONFIG_CMD_ETH_EEPROM
> 
> Is this layout common for all machines using this driver? If not, is
> it worth comment which machine is it?

These are supposed to be the same values as would be used by the
controller when the eeprom is not programmed. So they are not machine
specific, however it is specific to the LAN9514, looking at the
datasheet for the LAN9500 the eeprom layout is different.

Then I'll submit a new version that use per chip defaults, as well
as allowing the board file to override the default data.

> > +static u8 eeprom_defaults[] = {
> > +	/* 0x00 */
> > +	0xA5,		/* Signature */
> > +	0xFF, 0xFF,	/* MAC bytes 0-1 */
> > +	0xFF, 0xFF,	/* MAC bytes 2-3 */
> > +	0xFF, 0xFF,	/* MAC bytes 4-5 */
> 
> Normally, we use all zeros for unset...?

That's what the controller use when the EEPROM hasn't been programmed,
but I'll change it to all 0.

Alban

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: not available
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20141007/19b1b18a/attachment.pgp>

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

* [U-Boot] [PATCH 2/2] usb: eth: smsc95xx: Add EEPROM access support
  2014-10-07 13:35     ` Alban Bedel
@ 2014-10-07 13:40       ` Marek Vasut
  2014-10-07 17:51       ` Pavel Machek
  1 sibling, 0 replies; 6+ messages in thread
From: Marek Vasut @ 2014-10-07 13:40 UTC (permalink / raw)
  To: u-boot

On Tuesday, October 07, 2014 at 03:35:40 PM, Alban Bedel wrote:
> On Tue, 7 Oct 2014 14:22:09 +0200
> 
> Pavel Machek <pavel@denx.de> wrote:
> > On Tue 2014-10-07 11:19:37, Alban Bedel wrote:
> > > Use the new ethernet eeprom API to allow the user to read/write the
> > > EEPROM.
> > > 
> > > Change-Id: I21233b6ee805a75bd8a03ca12e22c41421b7629c
> > > Signed-off-by: Alban Bedel <alban.bedel@avionic-design.de>
> > > ---
> > > 
> > >  drivers/usb/eth/smsc95xx.c | 199
> > >  +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 192
> > >  insertions(+), 7 deletions(-)
> > > 
> > > diff --git a/drivers/usb/eth/smsc95xx.c b/drivers/usb/eth/smsc95xx.c
> > > index 6bca34d..eb29565 100644
> > > --- a/drivers/usb/eth/smsc95xx.c
> > > +++ b/drivers/usb/eth/smsc95xx.c
> > > @@ -59,6 +59,8 @@
> > > 
> > >  #define E2P_CMD				0x30
> > >  #define E2P_CMD_BUSY_			0x80000000
> > > 
> > > +#define E2P_CMD_EWEN_			0x20000000
> > > +#define E2P_CMD_WRITE_			0x30000000
> > > 
> > >  #define E2P_CMD_READ_			0x00000000
> > >  #define E2P_CMD_TIMEOUT_		0x00000400
> > >  #define E2P_CMD_LOADED_			0x00000200
> > > 
> > > @@ -146,6 +148,131 @@ struct smsc95xx_private {
> > > 
> > >  	int have_hwaddr;  /* 1 if we have a hardware MAC address */
> > >  
> > >  };
> > > 
> > > +#ifdef CONFIG_CMD_ETH_EEPROM
> > 
> > Is this layout common for all machines using this driver? If not, is
> > it worth comment which machine is it?
> 
> These are supposed to be the same values as would be used by the
> controller when the eeprom is not programmed. So they are not machine
> specific, however it is specific to the LAN9514, looking at the
> datasheet for the LAN9500 the eeprom layout is different.
> 
> Then I'll submit a new version that use per chip defaults, as well
> as allowing the board file to override the default data.
> 
> > > +static u8 eeprom_defaults[] = {
> > > +	/* 0x00 */
> > > +	0xA5,		/* Signature */
> > > +	0xFF, 0xFF,	/* MAC bytes 0-1 */
> > > +	0xFF, 0xFF,	/* MAC bytes 2-3 */
> > > +	0xFF, 0xFF,	/* MAC bytes 4-5 */
> > 
> > Normally, we use all zeros for unset...?
> 
> That's what the controller use when the EEPROM hasn't been programmed,
> but I'll change it to all 0.

Well isn't it better to use these settings as defaults then ?

Best regards,
Marek Vasut

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

* [U-Boot] [PATCH 2/2] usb: eth: smsc95xx: Add EEPROM access support
  2014-10-07 13:35     ` Alban Bedel
  2014-10-07 13:40       ` Marek Vasut
@ 2014-10-07 17:51       ` Pavel Machek
  1 sibling, 0 replies; 6+ messages in thread
From: Pavel Machek @ 2014-10-07 17:51 UTC (permalink / raw)
  To: u-boot

Hi!

> > > +static u8 eeprom_defaults[] = {
> > > +	/* 0x00 */
> > > +	0xA5,		/* Signature */
> > > +	0xFF, 0xFF,	/* MAC bytes 0-1 */
> > > +	0xFF, 0xFF,	/* MAC bytes 2-3 */
> > > +	0xFF, 0xFF,	/* MAC bytes 4-5 */
> > 
> > Normally, we use all zeros for unset...?
> 
> That's what the controller use when the EEPROM hasn't been programmed,
> but I'll change it to all 0.

Aha, if this is in-controller-default, don't change it. But comment
explaining where this comes from would be nice.

Thanks,
									Pavel
-- 
(english) http://www.livejournal.com/~pavelmachek
(cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html

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

end of thread, other threads:[~2014-10-07 17:51 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-10-07  9:19 [U-Boot] [PATCH 1/2] net: Add a command to access the EEPROM from ethernet devices Alban Bedel
2014-10-07  9:19 ` [U-Boot] [PATCH 2/2] usb: eth: smsc95xx: Add EEPROM access support Alban Bedel
2014-10-07 12:22   ` Pavel Machek
2014-10-07 13:35     ` Alban Bedel
2014-10-07 13:40       ` Marek Vasut
2014-10-07 17:51       ` Pavel Machek

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.