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,一经查实,立即删除!

相关文章

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口…

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…

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

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

ubuntu修改用户名、计算机名、主目录名

今天是MPI并行程序设计这门课交作业的截止日期&#xff0c;我们寝室的张佳和刘庆的本科同学来了&#xff0c;所以他们也没有时间搞&#xff0c;我就又做一回好人吧&#xff01;帮他们搞一下&#xff01;帮他们写报告的过程中最主要的问题就是跑那个MPI的程序&#xff0c;因为我…

linux redis可视化工具,几款开源的图形化Redis客户端管理软件

Redis是一个超精简的基于内存的键值对数据库(key-value)&#xff0c;一般对并发有一定要求的应用都用其储存session&#xff0c;乃至整个数据库。 它自带一个最小化的命令行式的数据库管理工具&#xff0c;有时侯使用起来并不方便。不过Github上面已经有了很多图形化的管理工具…

linux c 将虚拟地址转化为物理地址_面试不懂 Linux 内存管理?我用 20 张图给你讲明白...

微信搜索公众号「 后端技术学堂 」回复「1024」获取50本计算机电子书&#xff0c;回复「学习路线」获取超详细后端技术学习路线思维导图&#xff0c;文章每周持续更新&#xff0c;我们下期见&#xff01;大家好&#xff0c;我是柠檬哥。分享编程学习&#xff0c;助力程序员成长…

nginx源码分析—模块及其初始化

Content 0. 序 1. nginx有哪些模块&#xff1f; 2. nginx如何描述这些模块&#xff1f; 2.1 模块数据结构 2.1.1 ngx_module_t结构 2.1.2 ngx_command_t结构 2.2 模块类图 3. nginx如何组织这些模块&#xff1f; 3.1 全局数组ngx_modules 3.2 模块组织结构图 4. nginx的模块种类…

linux 网络相关,Linux系统管理员必备的21个网络相关监控

Linux系统管理员必备的21个网络相关监控1. ntopngntopng 是 ntop 的升级版&#xff0c;它提供了一个能通过浏览器进行网络监控的图形用户界面。它还有其他用途&#xff0c;如&#xff1a;地理定位主机&#xff0c;显示网络流量和 ip流量分布并能进行分析。2. iftopiftop 类似于…

固态硬盘 linux 文件系统,SSD是否需要使用特别的文件系统?

用认真的态度与专业的情怀倾注于存储&#xff0c;欢迎关注我&#xff0c;与我交流哦&#xff01;我们常用的电脑系统主要是Windows和Linux&#xff0c;其中&#xff0c;Windows系统中常用的文件系统主要是FAT和NFTS&#xff0c;FAT是旧Windows和U盘用的较多&#xff0c;最新Win…

java二维数组数字数显次数_【每日一题】118.数组中数字出现的次数

关注我们获取更多计算机考研信息? 今日习题在一个数组 nums 中除一个数字只出现一次之外&#xff0c;其他数字都出现了三次。请找出那个只出现一次的数字。示例 1&#xff1a;输入&#xff1a;nums [3,4,3,3]输出&#xff1a;4示例 2&#xff1a;输入&#xff1a;nums [9,1,…

微软的转型中?

北京时间8月23日夜&#xff0c;微软在其官网上发表新闻称&#xff0c;微软首席执行官Steve Ballmer将在12个月内退休。 微软在这篇《微软CEO Steve Ballmer将在12个月内退休》新闻中表示&#xff0c;其首席执行官Steve Ballmer已决定将在12个月内退休&#xff0c;尤其是当新的首…

k均值的损失函数_一种基于均值不等式的Listwise损失函数

1 前言1.1 Learning to Rank 简介Learning to Rank (LTR) , 也被叫做排序学习, 是搜索中的重要技术, 其目的是根据候选文档和查询语句的相关性对候选文档进行排序, 或者选取topk文档. 比如在搜索引擎中, 需要根据用户问题选取最相关的搜索结果展示到首页. 下图是搜索引擎的搜索…

HBase 集群搭建

文章目录 安装前准备兼容性官方网址 集群搭建搭建 Hadoop 集群搭建 Zookeeper 集群解压缩安装配置文件高可用配置分发 HBase 文件 服务的启停启动顺序停止顺序 验证进程查看 Web 端页面 安装前准备 兼容性 1&#xff09;与 Zookeeper 的兼容性问题&#xff0c;越新越好&#…

在哪个Linux发行版上运行python,怎么在linux上运行python

Linux默认是已经安装好了Python程序目前来说&#xff0c;大多数的Linux发行版是安装了两个版本的Python程序一个是Python 2.x一个是Python 3.x一些系统自带的程序文件需要Python 2的支持&#xff0c;另外Python 3又是大势所趋所以&#xff0c;我们最好不要动系统的Python版本需…

职场上个人的核心技术_职场上,这3种人表面老实,实际却是个“高手”,要远离...

职场上&#xff0c;这3种人表面老实&#xff0c;实际却是个“高手”&#xff0c;要远离&#xff01;在职场生活中&#xff0c;每一步都需要走好&#xff0c;因为你不慎走错了一步也就可能满盘皆输。而公司里面也有一种比较特殊的情况&#xff0c;也就是有这么3种类型的人&#…

linux编程参数列表,Linux编程 14 文件权限(用户列表passwd,用户控制shadow,useradd模板与useradd命令参数介绍)...

一. 概述linux安全系统的核心是用户账户。 创建用户时会分配用户ID(UID)。 UID是唯一的&#xff0c;但在登录系统时不是用UID&#xff0c;而是用登录名。在讲文件权限之之前&#xff0c;先了解下linux是怎样处理用户账户的。以及用户账户需要的文件和工具&#xff0c;这样处理文…

GitHub托管BootStrap资源汇总(持续更新中…)

Twitter BootStrap已经火过大江南北&#xff0c;对于无法依赖美工的程序员来说&#xff0c;这一成熟前卫的前端框架简直就一神器&#xff0c;轻轻松松地实现出专业的UI效果。GitHub上相关的的开源项目更是层出不穷&#xff0c;在此整理列举一些感觉不错的组件或增强实现&#x…