linux网络设备—mdio总线

一.结构体

struct mii_bus {const char *name;	//总线名char id[MII_BUS_ID_SIZE];	//idvoid *priv;	//私有数据int (*read)(struct mii_bus *bus, int phy_id, int regnum);	//读方法int (*write)(struct mii_bus *bus, int phy_id, int regnum, u16 val);	//写方法int (*reset)(struct mii_bus *bus);	//复位struct mutex mdio_lock;struct device *parent;	//父设备enum {MDIOBUS_ALLOCATED = 1,MDIOBUS_REGISTERED,MDIOBUS_UNREGISTERED,MDIOBUS_RELEASED,} state;	//总线状态struct device dev;	//设备文件struct phy_device *phy_map[PHY_MAX_ADDR];	//PHY设备数组u32 phy_mask;int *irq;	//中断
};

二.初始化过程

在phy_init函数中调用了mdio_bus_init初始化mdio总线

int __init mdio_bus_init(void)
{int ret;ret = class_register(&mdio_bus_class);	//注册设备类if (!ret) {ret = bus_register(&mdio_bus_type);	//注册mdio总线if (ret)class_unregister(&mdio_bus_class);}return ret;
}

设备类"/sys/class/mdio_bus"

static struct class mdio_bus_class = {.name		= "mdio_bus",.dev_release	= mdiobus_release,
};

总线类型"/sys/bus/mdio"

struct bus_type mdio_bus_type = {.name		= "mdio_bus",.match		= mdio_bus_match,	//匹配方法.pm		= MDIO_BUS_PM_OPS,
};
EXPORT_SYMBOL(mdio_bus_type);

三.mdio总线注册
1.调用mdiobus_alloc函数分配内存

struct mii_bus *mdiobus_alloc(void)
{struct mii_bus *bus;bus = kzalloc(sizeof(*bus), GFP_KERNEL);	//分配内存if (bus != NULL)bus->state = MDIOBUS_ALLOCATED;return bus;
}
EXPORT_SYMBOL(mdiobus_alloc);

2.填充mii_bus的结构体成员

mii_bus->name 	= ;
mii_bus->read 	= ;
mii_bus->write	= ;
mii_bus->reset	= ;
mii_bus->parent	= ;
mii_bus->priv 	= ;
mii_bus->id	= ;

3.注册mii_bus

int mdiobus_register(struct mii_bus *bus)
{int i, err;if (NULL == bus || NULL == bus->name || NULL == bus->read ||NULL == bus->write)return -EINVAL;BUG_ON(bus->state != MDIOBUS_ALLOCATED &&bus->state != MDIOBUS_UNREGISTERED);bus->dev.parent = bus->parent;bus->dev.class = &mdio_bus_class;	//总线设备类"/sys/bus/mdio_bus"bus->dev.groups = NULL;dev_set_name(&bus->dev, "%s", bus->id);	//设置总线设备名err = device_register(&bus->dev);	//注册设备文件if (err) {printk(KERN_ERR "mii_bus %s failed to register\n", bus->id);return -EINVAL;}mutex_init(&bus->mdio_lock);if (bus->reset)bus->reset(bus);	//总线复位for (i = 0; i < PHY_MAX_ADDR; i++) {if ((bus->phy_mask & (1 << i)) == 0) {struct phy_device *phydev;phydev = mdiobus_scan(bus, i);	//扫描phy设备if (IS_ERR(phydev)) {err = PTR_ERR(phydev);goto error;}}}bus->state = MDIOBUS_REGISTERED;	//状态设置为已注册pr_info("%s: probed\n", bus->name);return 0;
error:while (--i >= 0) {if (bus->phy_map[i])device_unregister(&bus->phy_map[i]->dev);}device_del(&bus->dev);return err;
}
EXPORT_SYMBOL(mdiobus_register);

调用了mdiobus_scan函数

struct phy_device *mdiobus_scan(struct mii_bus *bus, int addr)
{struct phy_device *phydev;int err;phydev = get_phy_device(bus, addr);	//获取创建phy设备if (IS_ERR(phydev) || phydev == NULL)return phydev;err = phy_device_register(phydev);	//注册phy设备if (err) {phy_device_free(phydev);return NULL;}return phydev;
}
EXPORT_SYMBOL(mdiobus_scan);

动态地创建了PHY设备

四.mii、mdio、phy、mac关系图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/433250.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

运营管理整改报告范文_整改报告 反馈问题整改报告范文精选5篇

反馈问题整改报告范文精选5篇所谓的进步就是将过去的错误更正&#xff0c;小编精选了一些关于整改报告的优秀范文&#xff0c;让我们一起来看看吧。反馈问题整改报告20**年3月17日至4月20日&#xff0c;省委第六巡视组对甘肃省广播电视网络股份有限公司进行了为期一个月的专项巡…

oracle报错00838,oracle11g的内存分配不当,导致的错误ORA-01034,ORA-00838,ORA-27101

由于开发需要&#xff0c;oracle11g被应用于虚拟机&#xff0c;所以系统资源显得弥足珍贵&#xff0c;百度了一下就有答案。用dba身份进入Oracle&#xff0c;笔者在plsql中对数据库进行管理&#xff1a;show parameter sga; --显示内存分配情况alter system set sga_max_size20…

汇编语言学习——第四章 第一个汇编程序

1、一个汇编语言程序从写出到最终执行的简要过程&#xff1a; 编写--> 编译,链接 --> 执行 2、编译&#xff0c;链接 使用汇编语言编译程序&#xff08;MASM.EXE&#xff09;对源程序文件中的源程序进行编译&#xff0c;产生目标文件&#xff1b; 再用连接程序&#xff0…

使用内存文件系统

在Linux中可以将一部分内存mount为分区来使用&#xff0c;通常称之为RamDisk。 RamDisk有三种实现方式&#xff1a; 第一种就是传统意义上的&#xff0c;可以格式化&#xff0c;然后加载。 这在Linux内核2.0/2.2就已经支持&#xff0c;其不足之处是大小固定&#xff0…

射频通路 隔直_2.4G射频双向功放电路的设计与制作

2.4G射频双向功放电路的设计与制作在两个或多个网络互连时&#xff0c;无线局域网的低功率与高频率限制了其覆盖范围&#xff0c;为了扩大覆盖范围&#xff0c;可以引入蜂窝或者微蜂窝的网络结构或者通过增大发射功率扩大覆盖半径等措施来实现。前者实现成本较高&#xff0c;而…

Navicat怎么看oracle作业,[数据库] Navicat for Oracle基本用法图文介绍

打开具体的T_USER_INFO.sql文件代码以下所示&#xff1a;/*Navicat Oracle Data TransferOracle Client Version : 11.2.0Source Server : 远程oracle链接Source Server Version : 110200Source Host : XXXSource Schema : XXXXXXTarget Server Type : ORACLETarget Server Ver…

慕课乐学python单元测试答案_中国大学慕课第三章单元测试答案_乐学软件工程免费答案...

佩戴铂金的好处有哪些人教版八年级下册思想品德全品学练考第七课第1课时财产属于谁答案白金项链变黑了怎么办&#xff0c;如何清洗白金的种类有哪些天津少儿医保如何结算报销&#xff1f;铂金和白金哪个贵&#xff0c;需注意什么黄金项链的保养方法有哪些佩戴铂金的好处有哪些人…

linux arp 文件,LINUX 下ARP 的查找

由于内网无法正常连接网关&#xff0c;远程登陆网关已无法实现。因此一切操作均在网关服务器本地进行。3.1 在服务器本地端口抓包[rootRouted-Server tmp]# tcpdump -nn -i eth1 > error.networktcpdump: listening on eth12749 packets received by filter0 packets…

Android的Recovery中font_10x10.h字库文件制作

任务是要汉化Android中的Recovery&#xff0c;就了解了bootable/recovery/minui/font_10x18.h这个英文字库的来历&#xff0c;最终汉化的时候并没有自己汉字字库&#xff0c;用的github上现成的&#xff0c;但font_10x18.h来历短暂的留存在脑子里边不如记下来&#xff0c;这样会…

git 新建分支并切换到该分支_Git何谓分支

在 Git 中提交时&#xff0c;会保存一个提交(commit)对象&#xff0c;该对象包含一个指向暂存内容快照的指针&#xff0c;包含本次提交的作者等相关附属信息&#xff0c;包含零个或多个指向该提交对象的父对象指针&#xff1a;首次提交是没有直接祖先的&#xff0c;普通提交有一…

linux用户恢复正常,Linux系统用户口令安全恢复方法

Linux系统用户口令安全恢复方法2007-09-07eNet&Ciweek有许多原因可能导致用户口令的遗失&#xff0c;这对系统管理员而言&#xff0c;可能不是一个问题&#xff0c;只要以root账号登录&#xff0c;再用passwd命令更改用户口令就可以了。可是&#xff0c;如果丢失的是root口…

A20 init.sun7i.rc 文件

如果需要在开机的时候&#xff0c;自动加载一些ko文件&#xff0c;或者通过chmod修改一些设备文件的属性&#xff0c;都可以再 init.sun7i.rc文件中添加insmod和chmod命令来实现。 init.sun7i.rc文件在 android4.2/out/target/product/wing-mbox230/root目录下。 但是实际操…

python 多元线性回归的系数检验 t p值_多元线性回归检验t检验(P值),F检验,R方等参数的含义...

做线性回归的时候&#xff0c;检验回归方程和各变量对因变量的解释参数很容易搞混乱&#xff0c;下面对这些参数进行一下说明&#xff1a;1.t检验&#xff1a;t检验是对单个变量系数的显著性检验 一般看p值&#xff1b; 如果p值小于0.05表示该自变量对因变量解释性很强。2…

linux c 内存elf,gcc加入linux ELF有什么功能?

这些大多数是在“主”程序本身之前或之后执行代码的各种方法,大多数都在crtstuff.c(https://github.com/gcc-mirror/gcc/blob/master/libgcc/crtstuff.c)中.它们存在以支持各种C类编程语言的特征,但它们也可以在C中访问.这可能似乎过于复杂,因为其中一些代表了传统的行李,还有一…

hdu 4322 最大费用流

题目链接&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid4322 #include <cstdio> #include <cstring> #include <iostream> #include <cmath> #include <algorithm> #include <queue> #include <vector> using namespace s…

es6遍历树结构并判断_ES6和ES5中数据结构的遍历

看了ES6就感觉各种数据结构的遍历方法好多好混乱&#xff0c;就写下来总结下&#xff0c;看看应用场景上有什么区别Array:ES5:(1)Array.prototype.forEach(function(item,index,array){...})(2)Array.prototype.map(function(value,index,array){...//return value,该值会被插入…

EAT/IAT Hook

标 题: EAT/IAT Hook 作 者: Y4ng 时 间: 2013-08-21 链 接: http://www.cnblogs.com/Y4ng/p/EAT_IAT_HOOK.html #include <windows.h> #include <shlwapi.h> #include <wchar.h> DWORD MyZwGetContextThread(HANDLE Thread,LPCONTEXT lpContext) {memset(l…

wireshark过滤规则

1.过 滤 IP&#xff0c;如来源IP或者目标IP等于某个IP例子:ip.src eq 192.168.1.107 or ip.dst eq 192.168.1.107或者ip.addr eq 192.168.1.107 // 都能显示来源IP和目标IP2.过滤 端 口例子:tcp.port eq 80 // 不管端口是来源的还是目标的都显示tcp.port 80tcp.port eq 2722tc…

springboot 别名不起作用_springboot之mybatis别名的设置

mybatis别名设置在具体的mapper.xml文件中&#xff0c;定义很多的statement&#xff0c;statement需要parameterType指定输入参数的类型、需要resultType指定输出结果的映射类型。一.mybatis默认支持别名别名映射的类型_bytebyte_longlong_shortshort_intint_integerint_double…

Linux 编译 libc log,在Android的源码中添加LOG

想在Opencore代码中添加打印信息&#xff0c;但是使用OpenCore自带的PVLOGGER&#xff0c;有一定的局限&#xff0c;因为只能在创建对象调用相应的ThreadLogon()后才能使用。所以不能实现在任何函数中添加。于是通过添加Log.h的方法来添加。首先转下别人的经验我试了下还是出先…