首页 > 系统相关 >Linux内核中的通用PHY驱动

Linux内核中的通用PHY驱动

时间:2024-04-03 13:31:45浏览次数:26  
标签:init driver PHY phy 内核 Linux 驱动 genphy

一.  简介

前面一篇文章说明了有线网络的网络硬件方案。常用到的一种方案是:内部集成了MAC网络外设的SOC芯片(处理器),外接一个 PHY网络芯片。

前面文章也学习了Linux内核中的PHY子系统,也是为(上面这种方案)PHY网络芯片提供的驱动框架。

Linux内核内部提供了通用的PHY驱动。本文来学习一下Linux内核中的通用PHY驱动。

二.  Linux内核中的通用PHY驱动(网络)

前面多次提到 Linux 内核已经集成了通用 PHY 驱动,通用 PHY 驱动名字为 Generic PHY ,打开 drivers/net/phy/phy_device.c ,找到 phy_init 函数,内容如下:
static int __init phy_init(void)
{
	int rc;

	rc = mdio_bus_init();
	if (rc)
		return rc;

	rc = phy_drivers_register(genphy_driver,
				  ARRAY_SIZE(genphy_driver));
	if (rc)
		mdio_bus_exit();

	return rc;
}

phy_init 是整个 PHY 子系统的入口函数,第 9 行会调用 phy_drivers_register 函数向内核直 接注册一个通用 PHY 驱动: genphy_driver ,也就是通用 PHY 驱动,也就是说 Linux 系统启动 以后,默认就已经存在了通用 PHY 驱动。 genphy_driver 是一个数组,有两个数组元素,表示有两个通用的 PHY 驱动,一个是针对10/100/1000M 网络的,一个是针对 10G 网络的。 genphy_driver 定义在 drivers/net/phy/phy_device.c 里面,内容如下:
static struct phy_driver genphy_driver[] = {
{
	.phy_id		= 0xffffffff,
	.phy_id_mask	= 0xffffffff,
	.name		= "Generic PHY",
	.soft_reset	= genphy_soft_reset,
	.config_init	= genphy_config_init,
	.features	= PHY_GBIT_FEATURES | SUPPORTED_MII |
			  SUPPORTED_AUI | SUPPORTED_FIBRE |
			  SUPPORTED_BNC,
	.config_aneg	= genphy_config_aneg,
	.aneg_done	= genphy_aneg_done,
	.read_status	= genphy_read_status,
	.suspend	= genphy_suspend,
	.resume		= genphy_resume,
	.driver		= { .owner = THIS_MODULE, },
}, {
	.phy_id         = 0xffffffff,
	.phy_id_mask    = 0xffffffff,
	.name           = "Generic 10G PHY",
	.soft_reset	= gen10g_soft_reset,
	.config_init    = gen10g_config_init,
	.features       = 0,
	.config_aneg    = gen10g_config_aneg,
	.read_status    = gen10g_read_status,
	.suspend        = gen10g_suspend,
	.resume         = gen10g_resume,
	.driver         = {.owner = THIS_MODULE, },
} };

genphy_driver 数组有两个元素, genphy_driver[0] 为 10/100/1000M 的 PHY 驱动,名字为 “Generic PHY genphy_driver[1] 为 10G 的 PHY 驱动,名字为 “ Generic 10G PHY ”。 注意,很多另外编写的 PHY 驱动也会用到通用 PHY 驱动的一些函数 。 比如,正点原子 ALPHA 开发板所 用的 LAN8720A 是 SMSC 公司的产品,此公司针对自家的所有 PHY 芯片编写了一个驱动文件 smsc.c ,这驱动文件里面用到了大量的通用 PHY 驱动相关函数。

标签:init,driver,PHY,phy,内核,Linux,驱动,genphy
From: https://blog.csdn.net/wojiaxiaohuang2014/article/details/137224575

相关文章

  • 如何提高Linux RCU实时性
    简介     LinuxRCU(Read-Copy-Update)是一种同步机制,用于提高多处理器系统中读取频繁且写入少的数据结构的性能。在实时系统中,响应时间和预测性是非常重要的。实时性意味着系统能够在严格的时间限制内完成任务。RCU通过减少锁的需求和允许并行读取操作,提高了系统的实时性......
  • linux下mysql8.0更新密码报错解决方案(已知密码)
    先登录./mysql-uroot-p输入密码 然后更改密码直接执行ALTERUSER'root'@'localhost'IDENTIFIEDBY'密码';会失效会报:ERROR1396(HY000):OperationALTERUSERfailedfor'root'@'localhost'进行如下操作即可usemysql;updateuserset......
  • Linux中批量杀进程的方法(转)
    一、使用awk批量杀进程的命令:ps-ef|grephello|grep-vgrep|awk'{print"kill-9"$2}'|sh说明:ps-ef|grephello|grep-vgrep#列出了当前主机中运行的进程中包含hello关键字的进程ps-ef|grephello|grep-vgrep|awk'{print"kill-9"$2}'......
  • linux 中 vim编辑器设置忽略大小写查找
     001、测试数据[root@pc1test01]#lsa.txt[root@pc1test01]#cata.txteerootkkaaeedddeeROOTkkeeddRoot 002、方法1vim打开查找文件,在查找内容的后边增加\c,如果不在末尾增加\c,则表示的是不忽略大小写比如针对root忽略大小写查找:eerootkkaae......
  • LINUX之NFS服务器部署
    主机IP服务端192.168.201.131客户端192.168.201.1321.服务端配置1.1安装NFS和rpc[root@hx1~]#yuminstall-ynfs-utils[root@hx1~]#yuminstall-yrpcbind1.2 启动服务和设置开启启动[root@hx1~]#systemctlstartrpcbind[root@hx1~]#systemctlenablerpcb......
  • Linux 服务器设置 jar包开机自启动
    一、新建jar包启动sh文件新建startup.sh脚本文件,启动项目jar包nohupjava-jartest.jar>/dev/null2>&1&二、设置自动启动命令1.进入rc.d目录执行cd/etc/rc.d命令,进入rc.d目录如图所示(示例):2.修改rc.local文件内容执行命令virc.local,然后按下键盘上的【i】键进入修改模......
  • Linux 诊断工具sysdig
    1、跟踪系统调用sysdigproc.pid=31760sysdigproc.name=nginx2、分析系统性能sysdig-ctop:显示系统中消耗CPU最多的进程。sysdig-ctopprocs_cpu:显示消耗CPU最多的进程及其CPU占用率。sysdig-ctopprocs_mem:显示消耗内存最多的进程及其内存占用量。sysd......
  • Linux C++ 016-友元
    LinuxC++016-友元本节关键字:Linux、C++、友元及三种实现方式相关库函数:友元的概念及关键字friend在程序里,有些私有属性也可以让类外特殊的函数或者类进行访问,这就需要用到友元技术。友元的目的就是让一个函数或者类访问另一个类中私有成员。友元的三中实现方式(1......
  • Linux C++ 015-对象模型和this指针
    LinuxC++015-对象模型和this指针本节关键字:Linux、C++、对象模型、this指针相关库函数:成员变量和成员函数分开存储1、在C++中,类内的成员变量和成员函数分开存储,只有非静态成员变量才属于类的对象上;2、C++编译器会给每个空对象也分配一个字节的空间,是为了区分空对象占......
  • 在Linux中,有哪些虚拟化技术?
    在Linux系统中,虚拟化技术被广泛应用,旨在让一个物理服务器能够运行多个独立的虚拟机实例。以下是一些主要的Linux虚拟化技术:全虚拟化(FullVirtualization)KVM(Kernel-basedVirtualMachine):KVM是Linux内核模块,它将Linux本身转化为一个hypervisor(虚拟机监视器)。KVM允许Lin......