SMSC PHY 驱动走读
从phy driver, 在drivers/net/phy里面针对一个品牌的网络交换设备对应添加一个文件 例如,我们这里要讲的smsc, 目录中就有一个smsc.c 文件。
同一个品牌,会有不同型号,就会有很多个设备,每一个设备型号,内核抽象出来,用一个结构体数组保存,如下代码:struct phy_driver smsc_phy_driver[] 这个结构就是很好的体现。该数组类型为统一的类型 struct phy_driver。
文件路径:
W:\hisi\3520_3521_project\Hi3521A_SDK_V1.0.5.0\osdrv\opensource\kernel\linux-3.10.y\drivers\net\phy\smsc.c 文件
这个文件功能,主要是将SMSC 设备 注册到 PHY驱动 上。
module_init(smsc_init);
static int __init smsc_init(void)
{
return phy_drivers_register(smsc_phy_driver,
ARRAY_SIZE(smsc_phy_driver));
}
在这 phy_drivers_register 进行注册 smsc phy driver。
static struct phy_driver smsc_phy_driver[] = {
{
.phy_id = 0x0007c0a0, /* OUI=0x00800f, Model#=0x0a */
.phy_id_mask = 0xfffffff0,
.name = "SMSC LAN83C185",
.features = (PHY_BASIC_FEATURES | SUPPORTED_Pause
| SUPPORTED_Asym_Pause),
.flags = PHY_HAS_INTERRUPT | PHY_HAS_MAGICANEG,
/* basic functions */
.config_aneg = genphy_config_aneg,
.read_status = genphy_read_status,
.config_init = smsc_phy_config_init,
/* IRQ related */
.ack_interrupt = smsc_phy_ack_interrupt,
.config_intr = smsc_phy_config_intr,
.suspend = genphy_suspend,
.resume = genphy_resume,
.driver = { .owner = THIS_MODULE, }
}, {
.phy_id = 0x0007c0b0, /* OUI=0x00800f, Model#=0x0b */
.phy_id_mask = 0xfffffff0,
.name = "SMSC LAN8187",
.features = (PHY_BASIC_FEATURES | SUPPORTED_Pause
| SUPPORTED_Asym_Pause),
.flags = PHY_HAS_INTERRUPT | PHY_HAS_MAGICANEG,
/* basic functions */
.config_aneg = genphy_config_aneg,
.read_status = genphy_read_status,
.config_init = smsc_phy_config_init,
/* IRQ related */
.ack_interrupt = smsc_phy_ack_interrupt,
.config_intr = smsc_phy_config_intr,
.suspend = genphy_suspend,
.resume = genphy_resume,
.driver = { .owner = THIS_MODULE, }
}, {
.phy_id = 0x0007c0c0, /* OUI=0x00800f, Model#=0x0c */
.phy_id_mask = 0xfffffff0,
.name = "SMSC LAN8700",
.features = (PHY_BASIC_FEATURES | SUPPORTED_Pause
| SUPPORTED_Asym_Pause),
.flags = PHY_HAS_INTERRUPT | PHY_HAS_MAGICANEG,
/* basic functions */
.config_aneg = genphy_config_aneg,
.read_status = genphy_read_status,
.config_init = smsc_phy_config_init,
/* IRQ related */
.ack_interrupt = smsc_phy_ack_interrupt,
.config_intr = smsc_phy_config_intr,
.suspend = genphy_suspend,
.resume = genphy_resume,
.driver = { .owner = THIS_MODULE, }
}, {
.phy_id = 0x0007c0d0, /* OUI=0x00800f, Model#=0x0d */
.phy_id_mask = 0xfffffff0,
.name = "SMSC LAN911x Internal PHY",
.features = (PHY_BASIC_FEATURES | SUPPORTED_Pause
| SUPPORTED_Asym_Pause),
.flags = PHY_HAS_INTERRUPT | PHY_HAS_MAGICANEG,
/* basic functions */
.config_aneg = genphy_config_aneg,
.read_status = genphy_read_status,
.config_init = lan911x_config_init,
/* IRQ related */
.ack_interrupt = smsc_phy_ack_interrupt,
.config_intr = smsc_phy_config_intr,
.suspend = genphy_suspend,
.resume = genphy_resume,
.driver = { .owner = THIS_MODULE, }
}, {
.phy_id = 0x0007c0f0, /* OUI=0x00800f, Model#=0x0f */
.phy_id_mask = 0xfffffff0,
.name = "SMSC LAN8710/LAN8720",
.features = (PHY_BASIC_FEATURES | SUPPORTED_Pause
| SUPPORTED_Asym_Pause),
.flags = PHY_HAS_INTERRUPT | PHY_HAS_MAGICANEG,
/* basic functions */
.config_aneg = genphy_config_aneg,
.read_status = lan87xx_read_status,
.config_init = smsc_phy_config_init,
/* IRQ related */
.ack_interrupt = smsc_phy_ack_interrupt,
.config_intr = smsc_phy_config_intr,
.suspend = genphy_suspend,
.resume = genphy_resume,
.driver = { .owner = THIS_MODULE, }
} };
由于3520D中我们的网卡芯片是 SMSC LAN8710 型号。因此我们主要看看 LAN8710 部分。
{
.phy_id = 0x0007c0f0, /* OUI=0x00800f, Model#=0x0f */
.phy_id_mask = 0xfffffff0,
.name = "SMSC LAN8710/LAN8720",
.features = (PHY_BASIC_FEATURES | SUPPORTED_Pause
| SUPPORTED_Asym_Pause),
.flags = PHY_HAS_INTERRUPT | PHY_HAS_MAGICANEG,
/* basic functions */
.config_aneg = genphy_config_aneg,
.read_status = lan87xx_read_status,
.config_init = smsc_phy_config_init,
/* IRQ related */
.ack_interrupt = smsc_phy_ack_interrupt,
.config_intr = smsc_phy_config_intr,
.suspend = genphy_suspend,
.resume = genphy_resume,
.driver = { .owner = THIS_MODULE, }
}
SMSC PHY 驱动走读相关推荐
- PHY驱动调试之 --- PHY控制器驱动(二)
1. 前言 内核版本:linux 4.9.225,以freescale为例. 2. 概述 PHY芯片为OSI的最底层-物理层(Physical Layer),通过MII/GMII/RMII/SGMII ...
- a5d2 phy驱动
1. 下面代码实现了phy驱动的实现和注册 2. device tree实现了phy的device 3. 在mdio总线注册后,总线会调用总线驱动的match函数,进行device和driver的匹配 ...
- linux PHY驱动
本文参考3.17版本的内核,结合TI的cpsw驱动(但去掉cpsw大部分代码,保留phy相关的),追踪一下通用PHY驱动.文中使用函数及主要功能语句的形式给出调用过程. MDIO驱动 Linux的md ...
- 高通SDX55平台:R8168 PHY驱动适配
高通SDX55平台 R8168 PHY驱动适配 1. SDX55 CPE应用场景 高通5G平台SDX55支持5G独立组网(SA)和非独立组网(NSA)两种网络架构,同时兼容LTE和WCDMA制式,拥有 ...
- phy 驱动与 switch 驱动
phy 驱动与 switch 驱动 phy 驱动 phy 与 cpu 的硬件连接 一般为 MAC-PHY 模式: ----------- | CPU | RGMII/| ------| MII --- ...
- 全志V3s USB PHY驱动分析
USB PHY作用 USB控制器接受的是数字信号,USB PHY负责:在USB控制器与USB接口之间做数字信号与模拟信号的转换. 参考: 维基百科 PHY usb-phy usb-phy 设备树节点 ...
- Mstar Mac Phy 驱动学习
MII.h 和 MII.c 这是MII协议.里面有MII协议的PHY寄存器地址,及MII通信接口库 Linux的mdio主要是为了管理PHY芯片寄存器的,跟踪代码发现,它会进行创建PHY设备及一些初始 ...
- Linux Ethernet PHY 驱动
今年在FPGA上和IC那边一起验证了MAC/PHY, 基于linux 3.6.4, 这边小结一下代码. phy的初始化顺序 第一步 phy_init mdio_bus_init bus_r ...
- Linux eth phy驱动框架分析
Linux中,对于eth phy的驱动,是依附于 mdiobus的,物理上,soc内部会有 mac控制器,要想实现以太网数据收发,需要外挂一颗 phy芯片,然后 soc内部的mac控制器驱动,一般都由 ...
最新文章
- P1522 牛的旅行
- 2018python培训-2018年5月python自动化运维开发课程新班正式开课!
- 卷积神经网络迁移学习
- Serverless Devs 2.0 开箱测评:Serverless 开发最佳实践
- 180°舵机的使用步骤
- ssm项目集成ftp_ssm开发旅游信息管理系统,包括前台和后台
- 剖析供应链攻击的防范
- C# 9.0 新功能一览!
- Spring 下注解说明
- 深度探索C++对象模型读书笔记(1)
- 计算机图形学入门:什么是光线追踪?
- 科研伦理与学术规范期末考试1题库
- 古人教你怎样识人不走眼
- python 主力资金_真正的主力进场加仓指标源码
- 思考是勤奋的一部分,人最大的懒惰是思想懒惰
- 2020-12-26[B]比赛总结
- Crowding Counter 之 修改ShanghaiTech数据集
- 编程实战(4)——python识别图像中的坐标点并保存坐标数据
- if语句判断真假的几种情况
- C#如何读取身份证阅读器
热门文章
- 冯洛伊曼计算机工作原理的设计思想是,冯?诺依曼计算机工作原理的设计思想是( )。...
- 万泽云库平台怎么样,靠谱么
- 深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)读书笔记
- Flutter学习资料集合(开发必备)
- 图片转成bin文件存储,及转回图片格式
- 电脑上最好用的3个mobi阅读器
- Log4J的日志文件控制大小
- Homework8_ch7 继承和派生(1)
- English Learning - Day2 作业打卡 2022.12.8 周四
- sqlalchemy.exc.ResourceClosedError: This result object does not return rows. It has been closed auto