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相关推荐
- Tri Mode Ethernet MAC的配置及使用
以太网技术是当今被广泛应用的网络技术之一,Xilinx FPGA提供了可参数化.灵活配置的千兆以太网IP Core解决方案,可以实现以太网链路层和物理层的快速接入. 关于以太网的基础知识在此不在赘述, ...
- 10G Ethernet Mac IP核
目录 1. 10G以太网结构 1.1 以太网媒体接入控制器(MAC) 1.2 物理接口收发器(PHY) 2.1 IP核使用 2.2 example 代码说明 1. 10G以太网结构 一个完整的10G以 ...
- 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. ...
- 【SA8295P 源码分析】23 - QNX Ethernet MAC 驱动 之 emac1_config.conf 配置文件解析
[SA8295P 源码分析]23 - QNX Ethernet MAC 驱动 之 emac1_config.conf 配置文件解析 系列文章汇总见:<[SA8295P 源码分析]00 - 系列文 ...
- 【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_ ...
- 【SA8295P 源码分析】22 - QNX Ethernet MAC 驱动 之 emac_entry / emac_attach 函数源码分析
[SA8295P 源码分析]22 - QNX Ethernet MAC 驱动 之 emac_entry / emac_attach 函数源码分析 一.EMAC:libdevnp-emac-eth.so ...
- 在mtk移植个linux内核,移植 Linux Kernel 造成無法開機之解決方案以及除錯工具
一般在以下情況, 我們會進行移植 Linux Kernel 的動作. 1. 將新版 Linux Kernel 移植到全新 SoC 上 開發人員為 SoC 廠商(e.g. MTK, TI, Allwin ...
- Ethernet MAC
最近在探究Multi-BSSID的virtual MAC address的时候寻找了一些MAC address assignment policy的资料,如下. 全球的MAC分布可以下载: http: ...
- 如何向 Linux Kernel 提交 Patch
昨晚终于向内核上游提交了人生中第一个 Patch,今天早上起床迫不及待的看手机,发现维护者 Andrew Morton 在6点31分回复我了:The patch has been added to t ...
最新文章
- 从管道中飞出的不一定是炮弹,也可能是无人机
- sphinx索引分析——文件格式和字典是double array trie 检索树,索引存储 – 多路归并排序,文档id压缩 – Variable Byte Coding...
- 对数据库进行黑盒测试操作?
- dos拼接字符串以及截取字符串
- 配置DispatcherServlet
- 45分钟,411个中小品牌天猫双11实现新跨越
- mysql典型安装和自定义_Mysql8.0.19下载安装—windows版本自定义安装
- Linux(CentOS)安装Node.JS和npm的两种方式(yum安装和源码安装)
- 集成CCFlow工作流与GPM的办公系统驰骋CCOA介绍(三)
- OpenCV的序列数据结构(CvSeq)
- qt调用vc编写库文件的方法
- 好利来背后隐形富豪家族:店面千家,年入百亿
- PS学习总结三:修图必备的高阶操作
- 华为5500网络限流配置_华为USG防火墙综合解决方案
- Python:实现arithmetic算术算法(附完整源码)
- ios 持续获取定位 高德地图_【IOS开发】高德地图定位坐标偏差()
- 弘辽科技:惊!原来吸引淘宝买家眼球的标题是这么写出来的!
- cf-1327F. AND Segments
- 第26周-window程序设计(基础篇)-第5章(图形基础)-边界框及LINDEMO.C
- 假设检验-单样本比率检验(二项分布)
热门文章
- 慢慢学Linux驱动开发,第四篇,USB工作原理简单分析
- 信息化十七载 ERP重塑双良战略与核心价值
- sklearn:auc、roc_curve、roc_auc_score
- 枚举详解之EnumSet、EnumMap用法
- minio下载及安装:win linux平台
- redis编译包下载地址 redis-6.2.6.tar.gz
- 使用 LxRunOffine 迁移 WSL Ubuntu安装目录
- 【好文收藏】K8S集群部署CoreDNS服务
- 阿里DataV可视化大屏介绍
- Python3数字格式化代码示例