diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c index 1b3096d..b29ba6f --- a/arch/arm/kernel/setup.c +++ b/arch/arm/kernel/setup.c @@ -31,6 +31,7 @@ #include #include #include +#include #include #include @@ -1103,6 +1104,13 @@ static int c_show(struct seq_file *m, void *v) seq_printf(m, "Serial\t\t: %08x%08x\n", system_serial_high, system_serial_low); + #define SW_VA_SID_IO_BASE 0xf1c23800 + seq_printf(m, "Chipid\t\t: %08x-%08x-%08x-%08x\n", + readl(SW_VA_SID_IO_BASE), + readl(SW_VA_SID_IO_BASE + 0x4), + readl(SW_VA_SID_IO_BASE + 0x8), + readl(SW_VA_SID_IO_BASE + 0xc) + ); return 0; } diff --git a/drivers/net/ethernet/allwinner/gmac/gmac_core.c b/drivers/net/ethernet/allwinner/gmac/gmac_core.c index 44619cf..55f9860 --- a/drivers/net/ethernet/allwinner/gmac/gmac_core.c +++ b/drivers/net/ethernet/allwinner/gmac/gmac_core.c @@ -38,6 +38,7 @@ #include #include +#include #include #include @@ -78,8 +79,7 @@ #define GMAC_ALIGN(x) L1_CACHE_ALIGN(x) #define JUMBO_LEN 9000 -#define GMAC_MAC_ADDRESS "00:00:00:00:00:00" -static char *mac_str = GMAC_MAC_ADDRESS; +static char *mac_str = ":"; module_param(mac_str, charp, S_IRUGO | S_IWUSR); MODULE_PARM_DESC(mac_str, "MAC Address String.(xx:xx:xx:xx:xx:xx)"); @@ -773,21 +773,45 @@ static void gmac_dma_interrupt(struct gmac_priv *priv) static void gmac_check_ether_addr(struct gmac_priv *priv) { - int i; - char *p = mac_str; + + /* verify if the MAC address is valid, in case of failures it * generates a random MAC address */ if (!is_valid_ether_addr(priv->ndev->dev_addr)) { - if (!is_valid_ether_addr(priv->ndev->dev_addr)) { + + if (strlen(mac_str) == 17) { + int i; + char *p = mac_str; + + pr_info("gmac: use mac address from mac_str\n"); for (i=0; i<6; i++,p++) priv->ndev->dev_addr[i] = simple_strtoul(p, &p, 16); } - if (!is_valid_ether_addr(priv->ndev->dev_addr)) - random_ether_addr(priv->ndev->dev_addr); + if (!is_valid_ether_addr(priv->ndev->dev_addr)) { + unsigned int reg_val; + + reg_val = readl(SW_VA_SID_IO_BASE); + pr_info("gmac: use mac address from chipid\n"); + priv->ndev->dev_addr[0] = 0x02; /* Non OUI / registered MAC address */ + priv->ndev->dev_addr[1] = (reg_val >> 0) & 0xff; + reg_val = readl(SW_VA_SID_IO_BASE + 0x0c); + priv->ndev->dev_addr[2] = (reg_val >> 24) & 0xff; + priv->ndev->dev_addr[3] = (reg_val >> 16) & 0xff; + priv->ndev->dev_addr[4] = (reg_val >> 8) & 0xff; + priv->ndev->dev_addr[5] = (reg_val >> 0) & 0xff; + + if (!is_valid_ether_addr(priv->ndev->dev_addr)) { + random_ether_addr(priv->ndev->dev_addr); + pr_info("gmac: use random mac address\n"); + } + } + } else { + pr_info("gmac: use mac address from cmdline\n"); } - printk(KERN_WARNING "%s: device MAC address %pM\n", priv->ndev->name, - priv->ndev->dev_addr); + + pr_info("gmac: device MAC address %pM\n", priv->ndev->dev_addr); + } /** diff --git a/drivers/net/ethernet/allwinner/gmac/gmac_desc.c b/drivers/net/ethernet/allwinner/gmac/gmac_desc.c index 57ae52f..bfa4d76 --- a/drivers/net/ethernet/allwinner/gmac/gmac_desc.c +++ b/drivers/net/ethernet/allwinner/gmac/gmac_desc.c @@ -49,7 +49,7 @@ int desc_get_tx_status(void *data, struct gmac_extra_stats *x, } if (p->desc0.tx.vlan_tag) { - pr_debug("GMAC TX status: VLAN frame\n"); +/* pr_debug("GMAC TX status: VLAN frame\n");*/ x->tx_vlan++; }