MTK Read/Write Ethernet Mac Addrees from Kernel NvRAM Patch
生活随笔
收集整理的這篇文章主要介紹了
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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MTK 添加自定义PMS权限 Patch
- 下一篇: MTK Read/Write IMEI