欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

MTK Read/Write Ethernet Mac Addrees from Kernel NvRAM Patch

发布时间:2024/10/14 编程问答 56 豆豆
生活随笔 收集整理的这篇文章主要介绍了 MTK Read/Write Ethernet Mac Addrees from Kernel NvRAM Patch 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

在Kernel Ethernet Driver中读nvram , 更新以太网Mac 地址。

 

add Read and Write Ethernet Mac Addrees from NVRAMSigned-off-by: Leon <shh@xxxx.com>diff --git a/kernel-3.18/drivers/net/usb/r8152.c b/kernel-3.18/drivers/net/usb/r8152.c old mode 100644 new mode 100755 index c6554c7..a09a570 --- a/kernel-3.18/drivers/net/usb/r8152.c +++ b/kernel-3.18/drivers/net/usb/r8152.c @@ -993,12 +993,93 @@ out1:return ret;}+#define IS_SUPPORT_NVRAM 1 +#if IS_SUPPORT_NVRAM +#define ETHERNET_NVRAM_CUSTOM_NAME "/vendor/nvdata/APCFG/APRDEB/ETHERNET" +unsigned char g_nvram_macaddr[6]; + +static int nvram_read(char *filename, char *buf, ssize_t len, int offset) +{ + struct file *fd; + //ssize_t ret; + int retLen = -1; + + mm_segment_t old_fs = get_fs(); + set_fs(KERNEL_DS); + + fd = filp_open(filename, O_WRONLY|O_CREAT, 0644); + + if(IS_ERR(fd)) { + printk("Leon [nvram_read] failed to open!!\n"); + return -1; + } + do{ + if ((fd->f_op == NULL) || (fd->f_op->read == NULL)) + { + printk("Leon [nvram_read] file can not be read!!\n"); + break; + } + + if (fd->f_pos != offset) { + if (fd->f_op->llseek) { + if(fd->f_op->llseek(fd, offset, 0) != offset) { + printk("[nvram_read] : failed to seek!!\n"); + break; + } + } else { + fd->f_pos = offset; + } + } + + retLen = fd->f_op->read(fd,buf,len,&fd->f_pos); + + }while(false); + + filp_close(fd, NULL); + + set_fs(old_fs); + + return retLen; +} + +static int nvram_write(char *filename, unsigned char *buf, int count) +{ + struct file *fd; + const char __user *p = (__force const char __user *)buf; + int result; + mm_segment_t oldfs; + fd = filp_open(filename, O_WRONLY|O_CREAT, 0644); + + if(IS_ERR(fd)) { + printk("Leon [nvram_write] failed to open!!\n"); + return -1; + } + + oldfs = get_fs(); + set_fs(KERNEL_DS); + fd->f_pos = 0; + result = fd->f_op->write(fd, p, count, &fd->f_pos); + set_fs(oldfs); + return result; +} + + +int load_nvram_macaddr( char * filename, char * buf, int len) +{ + return nvram_read( filename, buf, len, sizeof(u16) + sizeof(u16)); +} + + +#endifstatic int set_ethernet_addr(struct r8152 *tp){struct net_device *dev = tp->netdev;struct sockaddr sa;int ret; - +#if IS_SUPPORT_NVRAM + int i = 0; + printk("nvram rtl8152---set_ethernet_addr---\n"); +#endifif (tp->version == RTL_VER_01)ret = pla_ocp_read(tp, PLA_IDR, 8, sa.sa_data);else @@ -1009,8 +1090,60 @@ static int set_ethernet_addr(struct r8152 *tp)} else if (!is_valid_ether_addr(sa.sa_data)) {netif_err(tp, probe, dev, "Invalid ether addr %pM\n",sa.sa_data); +#if IS_SUPPORT_NVRAM + g_nvram_macaddr[0] = 0; + g_nvram_macaddr[1] = 0; + g_nvram_macaddr[2] = 0; + g_nvram_macaddr[3] = 0; + g_nvram_macaddr[4] = 0; + g_nvram_macaddr[5] = 0; + load_nvram_macaddr(ETHERNET_NVRAM_CUSTOM_NAME,(char *)&g_nvram_macaddr, sizeof(g_nvram_macaddr)); + printk("Leon Read nvram >: g_nvram_macaddr %02x%02x%02x%02x%02x%02x\n", + g_nvram_macaddr[0], g_nvram_macaddr[1], g_nvram_macaddr[2], + g_nvram_macaddr[3], g_nvram_macaddr[4], g_nvram_macaddr[5]); + + + //1.读eth nvram里面mac , 就判断0下标,无就随机生成一组 + if(g_nvram_macaddr[0] == 0){ + //2.随机生成函数 + eth_hw_addr_random(dev); + //3.写到sa.sa_data,长度6 + ether_addr_copy(sa.sa_data, dev->dev_addr); + //4.准备数据,写到nvram里面 + g_nvram_macaddr[0] = 0;//sa.sa_data[0]; + g_nvram_macaddr[1] = 0;//sa.sa_data[1]; + g_nvram_macaddr[2] = 0;//sa.sa_data[2]; + g_nvram_macaddr[3] = 0;//sa.sa_data[3]; + g_nvram_macaddr[4] = sa.sa_data[0]; + g_nvram_macaddr[5] = sa.sa_data[1]; + g_nvram_macaddr[6] = sa.sa_data[2]; + g_nvram_macaddr[7] = sa.sa_data[3]; + g_nvram_macaddr[8] = sa.sa_data[4]; + g_nvram_macaddr[9] = sa.sa_data[5]; + /* + 上层读是下标从4开始才算以太网address + for(i = 0; i < 6; i++){ + sa.sa_data[i] = g_nvram_macaddr[i]; + } + nvram_write(ETHERNET_NVRAM_CUSTOM_NAME,(char *)&sa.sa_data, sizeof(sa.sa_data)*2); + */ + //5.写到nvram + nvram_write(ETHERNET_NVRAM_CUSTOM_NAME,(char *)&g_nvram_macaddr, sizeof(g_nvram_macaddr)*2); + //6.打印随机生成的eth mac + printk("Leon eth_hw_addr_random > %02x%02x%02x%02x%02x%02x\n",sa.sa_data[0], sa.sa_data[1], sa.sa_data[2] + }else{ + //nvram里面有数据,赋值到sa.sa_data + for(i = 0; i < 6; i++){ + sa.sa_data[i] = g_nvram_macaddr[i]; + } + //打印从nvram里面写的mac address + printk("Leon read nvram to sa.sa_data > %02x%02x%02x%02x%02x%02x\n",g_nvram_macaddr[0], g_nvram_macaddr[ + } + +#elseeth_hw_addr_random(dev);ether_addr_copy(sa.sa_data, dev->dev_addr); +#endifret = rtl8152_set_mac_address(dev, &sa);netif_info(tp, probe, dev, "Random ether addr %pM\n",sa.sa_data); @@ -1024,6 +1157,8 @@ static int set_ethernet_addr(struct r8152 *tp)return ret;}+

总结

以上是生活随笔为你收集整理的MTK Read/Write Ethernet Mac Addrees from Kernel NvRAM Patch的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。