
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.estevam@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