amlogic: make the mac address reading sane

Change-Id: I47bfc201890eb4968f0964bce2a711ff90d67795
This commit is contained in:
Mauro Ribeiro
2014-12-17 22:52:03 -02:00
parent 608ed9a646
commit 733a012b01
3 changed files with 30 additions and 129 deletions

View File

@@ -9,6 +9,8 @@
obj-y +=early_init/
obj-$(CONFIG_EFUSE)+=efuse/
###For Display, this is for quick logo show##
obj-$(CONFIG_AM_DISPLAY_MODULE) += display/
@@ -46,7 +48,6 @@ obj-$(CONFIG_I2C) += i2c/
#obj-y += extern_io/
obj-$(CONFIG_EFUSE)+=efuse/
obj-$(CONFIG_AM_INPUT) += input/
ifneq ($(wildcard $(srctree)/../hardware/amlogic/touch),)

View File

@@ -239,40 +239,37 @@ static const struct file_operations efuse_fops = {
.unlocked_ioctl = efuse_unlocked_ioctl,
};
#if defined(CONFIG_MACH_MESON8B_ODROIDC)
/* function: aml_efuse_get_item
* key_name: key name
* data: key data
* return : >=0 ok, <0 error
* */
int aml_efuse_get_item(unsigned char* key_name, unsigned char* data)
unsigned char *aml_efuse_get_item(unsigned char* key_name)
{
char dec_mac[50] = {0};
efuseinfo_item_t info;
unsigned id=0;
unsigned char *ret;
if(strcmp(key_name,"mac")==0) id = EFUSE_MAC_ID;
else if(strcmp(key_name,"mac_bt")==0) id = EFUSE_MAC_BT_ID;
else if(strcmp(key_name,"mac_wifi")==0) id = EFUSE_MAC_WIFI_ID;
else if(strcmp(key_name,"usid")==0) id = EFUSE_USID_ID;
else {
printk(KERN_INFO"%s : UNKNOWN key_name\n",__func__);
pr_info("%s: UNKNOWN key_name\n", __func__);
return -EFAULT;
}
if(efuse_getinfo_byID(id, &info) < 0){
printk(KERN_INFO"ID is not found\n");
pr_emerg("mac: ID is not found\n");
return -EFAULT;
}
if (efuse_read_item(dec_mac, info.data_len, (loff_t*)&info.offset) < 0)
return -EFAULT;
if (efuse_read_item(dec_mac, info.data_len, (loff_t*)&info.offset) < 0) {
pr_emerg("mac: couldn't read efuse now\n");
return -EFAULT;
}
memcpy(&data[0],dec_mac,info.data_len);
return 0;
ret = kzalloc(info.data_len + 6, GFP_KERNEL);
sprintf(ret, "%02x:%02x:%02x:%02x:%02x:%02x", dec_mac[0],dec_mac[1],dec_mac[2],dec_mac[3],dec_mac[4],dec_mac[5]);
return ret;
}
EXPORT_SYMBOL(aml_efuse_get_item);
#endif
/* Sysfs Files */
static ssize_t mac_show(struct class *cla, struct class_attribute *attr, char *buf)

127
drivers/amlogic/ethernet/am_net8218.c Normal file → Executable file
View File

@@ -119,6 +119,7 @@ static int ethernet_reset(struct net_device *dev);
static int reset_mac(struct net_device *dev);
static void am_net_dump_macreg(void);
static void read_macreg(void);
extern char *aml_efuse_get_item(unsigned char* key_name);
/* --------------------------------------------------------------------------*/
/**
@@ -890,45 +891,6 @@ static int mac_pmt_enable(unsigned int enable)
* @return
*/
/* --------------------------------------------------------------------------*/
//#undef CONFIG_AML_NAND_KEY
#ifdef CONFIG_AML_NAND_KEY
extern int get_aml_key_kernel(const char* key_name, unsigned char* data, int ascii_flag);
extern int extenal_api_key_set_version(char *devvesion);
static char print_buff[1025];
void read_mac_from_nand(struct net_device *ndev)
{
int ret;
u8 mac[ETH_ALEN];
char *endp;
int j;
ret = get_aml_key_kernel("mac", print_buff, 0);
extenal_api_key_set_version("nand3");
printk("ret = %d\nprint_buff=%s\n", ret, print_buff);
if (ret >= 0) {
strcpy(ndev->dev_addr, print_buff);
for(j=0; j < ETH_ALEN; j++)
{
mac[j] = simple_strtol(&ndev->dev_addr[3 * j], &endp, 16);
printk("%d : %d\n", j, mac[j]);
}
memcpy(ndev->dev_addr, mac, ETH_ALEN);
}
}
#endif
#if defined(CONFIG_MACH_MESON8B_ODROIDC)
extern int aml_efuse_get_item(unsigned char* key_name, unsigned char* data);
void read_mac_from_efuse(struct net_device *ndev)
{
int ret;
ret = aml_efuse_get_item("mac", ndev->dev_addr);
if (ret < 0) {
printk(KERN_INFO "ERROR! failed to read hardware mac address\n");
random_ether_addr(ndev->dev_addr);
}
}
#endif
static int aml_mac_init(struct net_device *ndev)
{
@@ -937,18 +899,15 @@ static int aml_mac_init(struct net_device *ndev)
writel(1, (void*)(np->base_addr + ETH_DMA_0_Bus_Mode));
writel(0x00100800,(void*)(np->base_addr + ETH_DMA_0_Bus_Mode));
#if defined(CONFIG_MACH_MESON8B_ODROIDC)
read_mac_from_efuse(ndev);
#else
printk("--1--write mac add to:");
data_dump(ndev->dev_addr, 6);
#ifdef CONFIG_AML_NAND_KEY
read_mac_from_nand(ndev);
#endif
printk("--2--write mac add to:");
data_dump(ndev->dev_addr, 6);
#endif
write_mac_addr(ndev, ndev->dev_addr);
val = 0xc80c | //8<<8 | 8<<17; //tx and rx all 8bit mode;
@@ -1556,32 +1515,6 @@ static void tx_timeout(struct net_device *dev)
* @param macaddr
*/
/* --------------------------------------------------------------------------*/
/*static void get_mac_from_nand(struct net_device *dev, char *macaddr)
{
int ret;
int use_nand_mac=0;
u8 mac[ETH_ALEN];
extenal_api_key_set_version("nand3");
ret = get_aml_key_kernel("mac_wifi", print_buff, 0);
printk("ret = %d\nprint_buff=%s\n", ret, print_buff);
if (ret >= 0) {
strcpy(mac_addr, print_buff);
}
for(; j < ETH_ALEN; j++)
{
mac[j] = simple_strtol(&mac_addr[3 * j], &endp, 16);
printk("%d : %d\n", j, mac[j]);
}
memcpy(macaddr, mac, ETH_ALEN);
}
static void print_mac(char *macaddr)
{
printk("write mac add to:");
data_dump(macaddr, 6);
}*/
static void write_mac_addr(struct net_device *dev, char *macaddr)
{
@@ -1637,34 +1570,22 @@ static void config_mac_addr(struct net_device *dev, void *mac)
write_mac_addr(dev, dev->dev_addr);
}
/* --------------------------------------------------------------------------*/
/**
* @brief mac_addr_set
*
* @param line
*
* @return
*/
/* --------------------------------------------------------------------------*/
static int __init mac_addr_set(char *line)
static void mac_from_efuse_to_DEFMAC(void)
{
unsigned char mac[6];
int i = 0;
for (i = 0; i < 6 && line[0] != '\0' && line[1] != '\0'; i++) {
mac[i] = chartonum(line[0]) << 4 | chartonum(line[1]);
line += 3;
unsigned char *efuse_mac;
int i;
efuse_mac = aml_efuse_get_item("mac");
for (i = 0; i < 6 && efuse_mac[0] != '\0' && efuse_mac[1] != '\0'; i++) {
mac[i] = chartonum(efuse_mac[0]) << 4 | chartonum(efuse_mac[1]);
efuse_mac += 3;
}
memcpy(DEFMAC, mac, 6);
printk("******** uboot setup mac-addr: %x:%x:%x:%x:%x:%x\n",
DEFMAC[0], DEFMAC[1], DEFMAC[2], DEFMAC[3], DEFMAC[4], DEFMAC[5]);
g_mac_addr_setup++;
return 1;
}
__setup("mac=", mac_addr_set);
/* --------------------------------------------------------------------------*/
/**
* @brief phy_mc_hash
@@ -1893,31 +1814,13 @@ static int setup_net_device(struct net_device *dev)
(1 << 13) | //FBI: Fatal Bus Error Interrupt
(1) | //tx interrupt
0;
mac_from_efuse_to_DEFMAC();
config_mac_addr(dev, DEFMAC);
dev_alloc_name(dev, "eth%d");
memset(&np->stats, 0, sizeof(np->stats));
return res;
}
/*
M6TV
23
M6TVlite
24
M8
25
M6TVd
26
M8baby
27
G9TV
28
*/
#if 0
static unsigned int get_cpuid(){
return READ_CBUS_REG(0x1f53)&0xff;
}
#endif
/* --------------------------------------------------------------------------*/
/**
* @brief probe_init