MX28 has two built-in FECs (Fast Ethernet Controller). OCOTP register can be used to only store 4 bytes of MAC addresses.
In order to workaround this limitation, let the MAC address of FEC1 be the FEC0 address plus one. Signed-off-by: Fabio Estevam <fabio.este...@freescale.com> --- Changes since v5: No changes. Newly introduced on this series arch/arm/cpu/arm926ejs/mx28/mx28.c | 8 ++++++-- drivers/net/fec_mxc.c | 16 ++++++++++++++++ drivers/net/fec_mxc.h | 1 + 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/arch/arm/cpu/arm926ejs/mx28/mx28.c b/arch/arm/cpu/arm926ejs/mx28/mx28.c index a25814e..79b4001 100644 --- a/arch/arm/cpu/arm926ejs/mx28/mx28.c +++ b/arch/arm/cpu/arm926ejs/mx28/mx28.c @@ -227,7 +227,7 @@ void set_mac_vendor(char *mac) #define MXS_OCOTP_MAX_TIMEOUT 1000000 -void imx_get_mac_from_fuse(char *mac) +void mx28_get_mac_from_fuse(int dev_id, char *mac) { struct mx28_ocotp_regs *ocotp_regs = (struct mx28_ocotp_regs *)MXS_OCOTP_BASE; @@ -249,10 +249,14 @@ void imx_get_mac_from_fuse(char *mac) mac[3] = (data >> 16) & 0xff; mac[4] = (data >> 8) & 0xff; mac[5] = data & 0xff; + /* Assume that FEC1 MAC address is MAC0 + 1 */ + if (dev_id == 1) + mac[5]+= 1; + set_mac_vendor(mac); } #else -void imx_get_mac_from_fuse(char *mac) +void mx28_get_mac_from_fuse(int dev_id, char *mac) { memset(mac, 0, 6); } diff --git a/drivers/net/fec_mxc.c b/drivers/net/fec_mxc.c index b05a4c0..a6bf597 100644 --- a/drivers/net/fec_mxc.c +++ b/drivers/net/fec_mxc.c @@ -345,11 +345,20 @@ static void fec_rbd_clean(int last, struct fec_bd *pRbd) writew(0, &pRbd->data_length); } +#ifndef CONFIG_MX28 static int fec_get_hwaddr(struct eth_device *dev, unsigned char *mac) { imx_get_mac_from_fuse(mac); return !is_valid_ether_addr(mac); } +#else +static int mx28_fec_get_hwaddr(struct eth_device *dev, int dev_id, + unsigned char *mac) +{ + mx28_get_mac_from_fuse(dev_id, mac); + return !is_valid_ether_addr(mac); +} +#endif static int fec_set_hwaddr(struct eth_device *dev) { @@ -812,10 +821,17 @@ static int fec_probe(bd_t *bd, int dev_id, int phy_id, uint32_t base_addr) eth_register(edev); +#ifndef CONFIG_MX28 if (fec_get_hwaddr(edev, ethaddr) == 0) { debug("got MAC address from fuse: %pM\n", ethaddr); memcpy(edev->enetaddr, ethaddr, 6); } +#else + if (mx28_fec_get_hwaddr(edev, dev_id, ethaddr) == 0) { + debug("got MAC%d address from fuse: %pM\n", dev_id, ethaddr); + memcpy(edev->enetaddr, ethaddr, 6); + } +#endif return ret; diff --git a/drivers/net/fec_mxc.h b/drivers/net/fec_mxc.h index 8b26645..e2cfe4a 100644 --- a/drivers/net/fec_mxc.h +++ b/drivers/net/fec_mxc.h @@ -33,6 +33,7 @@ #define __FEC_MXC_H void imx_get_mac_from_fuse(unsigned char *mac); +void mx28_get_mac_from_fuse(int dev_id, unsigned char *mac); /** * Layout description of the FEC -- 1.7.1 _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot