在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相关推荐

  1. Tri Mode Ethernet MAC的配置及使用

    以太网技术是当今被广泛应用的网络技术之一,Xilinx FPGA提供了可参数化.灵活配置的千兆以太网IP Core解决方案,可以实现以太网链路层和物理层的快速接入. 关于以太网的基础知识在此不在赘述, ...

  2. 10G Ethernet Mac IP核

    目录 1. 10G以太网结构 1.1 以太网媒体接入控制器(MAC) 1.2 物理接口收发器(PHY) 2.1 IP核使用 2.2 example 代码说明 1. 10G以太网结构 一个完整的10G以 ...

  3. FPGA基于Tri Mode Ethernet MAC实现UDP通信 提供3套工程源码和技术支持

    目录 1.前言 2.我这里已有的UDP方案 3.米联客UDP协议栈 4.详细设计方案 5.Tri Mode Ethernet MAC的使用 6.vivado工程1详解 7.vivado工程2详解 8. ...

  4. 【SA8295P 源码分析】23 - QNX Ethernet MAC 驱动 之 emac1_config.conf 配置文件解析

    [SA8295P 源码分析]23 - QNX Ethernet MAC 驱动 之 emac1_config.conf 配置文件解析 系列文章汇总见:<[SA8295P 源码分析]00 - 系列文 ...

  5. 【SA8295P 源码分析】28 - QNX Ethernet MAC 驱动 之 emac_mdio_link_monitor_thrd() MDIO监控线程 源码分析

    [SA8295P 源码分析]28 - QNX Ethernet MAC 驱动 之 emac_mdio_link_monitor_thrd MDIO监控线程 源码分析 一.emac_mdio_link_ ...

  6. 【SA8295P 源码分析】22 - QNX Ethernet MAC 驱动 之 emac_entry / emac_attach 函数源码分析

    [SA8295P 源码分析]22 - QNX Ethernet MAC 驱动 之 emac_entry / emac_attach 函数源码分析 一.EMAC:libdevnp-emac-eth.so ...

  7. 在mtk移植个linux内核,移植 Linux Kernel 造成無法開機之解決方案以及除錯工具

    一般在以下情況, 我們會進行移植 Linux Kernel 的動作. 1. 將新版 Linux Kernel 移植到全新 SoC 上 開發人員為 SoC 廠商(e.g. MTK, TI, Allwin ...

  8. Ethernet MAC

    最近在探究Multi-BSSID的virtual MAC address的时候寻找了一些MAC address assignment policy的资料,如下. 全球的MAC分布可以下载: http: ...

  9. 如何向 Linux Kernel 提交 Patch

    昨晚终于向内核上游提交了人生中第一个 Patch,今天早上起床迫不及待的看手机,发现维护者 Andrew Morton 在6点31分回复我了:The patch has been added to t ...

最新文章

  1. 从管道中飞出的不一定是炮弹,也可能是无人机
  2. sphinx索引分析——文件格式和字典是double array trie 检索树,索引存储 – 多路归并排序,文档id压缩 – Variable Byte Coding...
  3. 对数据库进行黑盒测试操作?
  4. dos拼接字符串以及截取字符串
  5. 配置DispatcherServlet
  6. 45分钟,411个中小品牌天猫双11实现新跨越
  7. mysql典型安装和自定义_Mysql8.0.19下载安装—windows版本自定义安装
  8. Linux(CentOS)安装Node.JS和npm的两种方式(yum安装和源码安装)
  9. 集成CCFlow工作流与GPM的办公系统驰骋CCOA介绍(三)
  10. OpenCV的序列数据结构(CvSeq)
  11. qt调用vc编写库文件的方法
  12. 好利来背后隐形富豪家族:店面千家,年入百亿
  13. PS学习总结三:修图必备的高阶操作
  14. 华为5500网络限流配置_华为USG防火墙综合解决方案
  15. Python:实现arithmetic算术算法(附完整源码)
  16. ios 持续获取定位 高德地图_【IOS开发】高德地图定位坐标偏差()
  17. 弘辽科技:惊!原来吸引淘宝买家眼球的标题是这么写出来的!
  18. cf-1327F. AND Segments
  19. 第26周-window程序设计(基础篇)-第5章(图形基础)-边界框及LINDEMO.C
  20. 假设检验-单样本比率检验(二项分布)

热门文章

  1. 慢慢学Linux驱动开发,第四篇,USB工作原理简单分析
  2. 信息化十七载 ERP重塑双良战略与核心价值
  3. sklearn:auc、roc_curve、roc_auc_score
  4. 枚举详解之EnumSet、EnumMap用法
  5. minio下载及安装:win linux平台
  6. redis编译包下载地址 redis-6.2.6.tar.gz
  7. 使用 LxRunOffine 迁移 WSL Ubuntu安装目录
  8. 【好文收藏】K8S集群部署CoreDNS服务
  9. 阿里DataV可视化大屏介绍
  10. Python3数字格式化代码示例