* [U-Boot] [PATCH v2 1/2] net: Add a command to access the EEPROM from ethernet devices
@ 2014-10-09 11:42 Alban Bedel
2014-10-09 11:42 ` [U-Boot] [PATCH v2 2/2] usb: eth: smsc95xx: Add EEPROM access support for LAN9514 Alban Bedel
2014-10-09 15:17 ` [U-Boot] [PATCH v2 1/2] net: Add a command to access the EEPROM from ethernet devices Marek Vasut
0 siblings, 2 replies; 6+ messages in thread
From: Alban Bedel @ 2014-10-09 11:42 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.
Signed-off-by: Alban Bedel <alban.bedel@avionic-design.de>
---
v2: * No changes since v1
---
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 v2 2/2] usb: eth: smsc95xx: Add EEPROM access support for LAN9514
2014-10-09 11:42 [U-Boot] [PATCH v2 1/2] net: Add a command to access the EEPROM from ethernet devices Alban Bedel
@ 2014-10-09 11:42 ` Alban Bedel
2014-10-09 21:00 ` Pavel Machek
2014-10-09 15:17 ` [U-Boot] [PATCH v2 1/2] net: Add a command to access the EEPROM from ethernet devices Marek Vasut
1 sibling, 1 reply; 6+ messages in thread
From: Alban Bedel @ 2014-10-09 11:42 UTC (permalink / raw)
To: u-boot
Use the new ethernet eeprom API to allow the user to read/write the
EEPROM.
Signed-off-by: Alban Bedel <alban.bedel@avionic-design.de>
---
v2: * Rework the defaults implementation to use the proper config
depending on the device type.
* Allow the board to override the defaults data.
* Use the proper defaults instead of the Tamonten config.
* Fix style error in usb_ether.h
* Add a comment to explain why the default MAC has all bits set
This patch is based on earlier work from Thierry Reding, I assumed
that the default config was derived from the datasheet. However it
turned out that this config had been customized for the Tamonten
boards. I restored the config according to the defaults found in the
datasheet. Sadly the datasheet doesn't properly document all the
fields from the EEPROM, so it may still have a few bugs as I don't
have the default values for all fields.
---
drivers/usb/eth/smsc95xx.c | 246 +++++++++++++++++++++++++++++++++++++++++++--
include/usb_ether.h | 8 ++
2 files changed, 247 insertions(+), 7 deletions(-)
diff --git a/drivers/usb/eth/smsc95xx.c b/drivers/usb/eth/smsc95xx.c
index 6bca34d..4e06be7 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,155 @@ struct smsc95xx_private {
int have_hwaddr; /* 1 if we have a hardware MAC address */
};
+#ifdef CONFIG_CMD_ETH_EEPROM
+struct smsc95xx_eeprom_device {
+ unsigned short vendor;
+ unsigned short product;
+ struct smsc95xx_eeprom_defaults *defaults;
+};
+
+/* Default values as used by the controller when the EEPROM hasn't
+ * been programmed yet. Note that when unset the MAC address has
+ * all bits set instead of all bits cleared as is usual in u-boot. */
+static u8 smsc9514_eeprom_defaults_data[] = {
+ /* 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 */
+ 0x04, /* HS Polling Interval for Interrupt Endpoint */
+ 0x05, /* 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) */
+ 0x02, /* 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 */
+};
+
+/* This can be overriden by the board to use custom data */
+struct smsc95xx_eeprom_defaults __weak smsc9514_eeprom_defaults = {
+ .data = smsc9514_eeprom_defaults_data,
+ .size = ARRAY_SIZE(smsc9514_eeprom_defaults_data),
+};
+
+static struct smsc95xx_eeprom_device smsc95xx_eeprom_devices[] = {
+ {
+ .vendor = 0x0424,
+ .product = 0x9514,
+ .defaults = &smsc9514_eeprom_defaults,
+ },
+ {}
+};
+#endif
+
/*
* Smsc95xx infrastructure commands
*/
@@ -285,9 +436,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 +462,81 @@ 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)
+{
+ struct ueth_data *ueth = (struct ueth_data *)eth->priv;
+ struct smsc95xx_eeprom_defaults *dflt;
+ struct usb_device *usb_dev;
+ int i;
+
+ /* Try to find the device type, we must look at the parent to handle
+ * devices like the LAN9512 and LAN9514 that include a usb hub. */
+ for (usb_dev = ueth->pusb_dev, dflt = NULL;
+ usb_dev && !dflt;
+ usb_dev = usb_dev->parent) {
+ for (i = 0; smsc95xx_eeprom_devices[i].defaults; i++) {
+ if (smsc95xx_eeprom_devices[i].vendor ==
+ usb_dev->descriptor.idVendor &&
+ smsc95xx_eeprom_devices[i].product ==
+ usb_dev->descriptor.idProduct) {
+ dflt = smsc95xx_eeprom_devices[i].defaults;
+ break;
+ }
+ }
+ }
+
+ if (dflt && dflt->data && dflt->size > 0)
+ return smsc95xx_write_eeprom(eth, 0, dflt->size, dflt->data);
+
+ return -1;
+}
+#endif
+
/*
* mii_nway_restart - restart NWay (autonegotiation) for this interface
*
@@ -349,12 +576,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 +733,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 +1120,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;
}
diff --git a/include/usb_ether.h b/include/usb_ether.h
index 35700a2..e7d371f 100644
--- a/include/usb_ether.h
+++ b/include/usb_ether.h
@@ -61,4 +61,12 @@ int smsc95xx_eth_probe(struct usb_device *dev, unsigned int ifnum,
int smsc95xx_eth_get_info(struct usb_device *dev, struct ueth_data *ss,
struct eth_device *eth);
+/* Default EEPROM data, to allow the boards to override it */
+struct smsc95xx_eeprom_defaults {
+ u8 *data;
+ u32 size;
+};
+
+extern struct smsc95xx_eeprom_defaults smsc9514_eeprom_defaults;
+
#endif /* __USB_ETHER_H__ */
--
2.1.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [U-Boot] [PATCH v2 1/2] net: Add a command to access the EEPROM from ethernet devices
2014-10-09 11:42 [U-Boot] [PATCH v2 1/2] net: Add a command to access the EEPROM from ethernet devices Alban Bedel
2014-10-09 11:42 ` [U-Boot] [PATCH v2 2/2] usb: eth: smsc95xx: Add EEPROM access support for LAN9514 Alban Bedel
@ 2014-10-09 15:17 ` Marek Vasut
2014-10-13 8:56 ` Alban Bedel
1 sibling, 1 reply; 6+ messages in thread
From: Marek Vasut @ 2014-10-09 15:17 UTC (permalink / raw)
To: u-boot
On Thursday, October 09, 2014 at 01:42:49 PM, Alban Bedel wrote:
> 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.
>
> Signed-off-by: Alban Bedel <alban.bedel@avionic-design.de>
I will not comment on the code yet, but would like to discuss the concept
instead. I wonder, can we not have a more generic command here? One which
can manage the ethernet device altogether, not just adjust it's eeprom?
Something like 'ethtool' in Linux ...
What do you think please ?
Best regards,
Marek Vasut
^ permalink raw reply [flat|nested] 6+ messages in thread
* [U-Boot] [PATCH v2 2/2] usb: eth: smsc95xx: Add EEPROM access support for LAN9514
2014-10-09 11:42 ` [U-Boot] [PATCH v2 2/2] usb: eth: smsc95xx: Add EEPROM access support for LAN9514 Alban Bedel
@ 2014-10-09 21:00 ` Pavel Machek
0 siblings, 0 replies; 6+ messages in thread
From: Pavel Machek @ 2014-10-09 21:00 UTC (permalink / raw)
To: u-boot
On Thu 2014-10-09 13:42:50, Alban Bedel wrote:
> Use the new ethernet eeprom API to allow the user to read/write the
> EEPROM.
>
> Signed-off-by: Alban Bedel <alban.bedel@avionic-design.de>
Acked-by: Pavel Machek <pavel@denx.de>
--
(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 v2 1/2] net: Add a command to access the EEPROM from ethernet devices
2014-10-09 15:17 ` [U-Boot] [PATCH v2 1/2] net: Add a command to access the EEPROM from ethernet devices Marek Vasut
@ 2014-10-13 8:56 ` Alban Bedel
2014-10-14 6:26 ` Joe Hershberger
0 siblings, 1 reply; 6+ messages in thread
From: Alban Bedel @ 2014-10-13 8:56 UTC (permalink / raw)
To: u-boot
On Thu, 9 Oct 2014 17:17:00 +0200
Marek Vasut <marex@denx.de> wrote:
> On Thursday, October 09, 2014 at 01:42:49 PM, Alban Bedel wrote:
> > 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.
> >
> > Signed-off-by: Alban Bedel <alban.bedel@avionic-design.de>
>
> I will not comment on the code yet, but would like to discuss the concept
> instead. I wonder, can we not have a more generic command here? One which
> can manage the ethernet device altogether, not just adjust it's eeprom?
> Something like 'ethtool' in Linux ...
>
> What do you think please ?
Currently this is all I need for the boards I'm working on. However I
have no problem with splitting the command from 'eth_eeprom' to
'eth eeprom' to leave room for other stuff.
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/20141013/06d9342c/attachment.pgp>
^ permalink raw reply [flat|nested] 6+ messages in thread
* [U-Boot] [PATCH v2 1/2] net: Add a command to access the EEPROM from ethernet devices
2014-10-13 8:56 ` Alban Bedel
@ 2014-10-14 6:26 ` Joe Hershberger
0 siblings, 0 replies; 6+ messages in thread
From: Joe Hershberger @ 2014-10-14 6:26 UTC (permalink / raw)
To: u-boot
On Mon, Oct 13, 2014 at 3:56 AM, Alban Bedel <alban.bedel@avionic-design.de>
wrote:
>
> On Thu, 9 Oct 2014 17:17:00 +0200
> Marek Vasut <marex@denx.de> wrote:
>
> > On Thursday, October 09, 2014 at 01:42:49 PM, Alban Bedel wrote:
> > > 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.
> > >
> > > Signed-off-by: Alban Bedel <alban.bedel@avionic-design.de>
> >
> > I will not comment on the code yet, but would like to discuss the
concept
> > instead. I wonder, can we not have a more generic command here? One
which
> > can manage the ethernet device altogether, not just adjust it's eeprom?
> > Something like 'ethtool' in Linux ...
> >
> > What do you think please ?
>
> Currently this is all I need for the boards I'm working on. However I
> have no problem with splitting the command from 'eth_eeprom' to
> 'eth eeprom' to leave room for other stuff.
I agree that the command would be better if it was "eth eeprom"
-Joe
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2014-10-14 6:26 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-10-09 11:42 [U-Boot] [PATCH v2 1/2] net: Add a command to access the EEPROM from ethernet devices Alban Bedel
2014-10-09 11:42 ` [U-Boot] [PATCH v2 2/2] usb: eth: smsc95xx: Add EEPROM access support for LAN9514 Alban Bedel
2014-10-09 21:00 ` Pavel Machek
2014-10-09 15:17 ` [U-Boot] [PATCH v2 1/2] net: Add a command to access the EEPROM from ethernet devices Marek Vasut
2014-10-13 8:56 ` Alban Bedel
2014-10-14 6:26 ` Joe Hershberger
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox