[U-Boot] [PATCH 1/2] net: Add a command to access the EEPROM from ethernet devices

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

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; }

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

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

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

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
participants (3)
-
Alban Bedel
-
Marek Vasut
-
Pavel Machek