phy driver代码流程(最新kernel版)

本文详细解析了Linux5.4.0版本中PHYDriver的代码流程,包括MDIO总线和PHYDriver注册过程。MDIO流程涉及从扫描到创建PHY设备,初始化状态机并注册设备。PHYDriver流程则涉及驱动注册、添加及匹配过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

phy driver代码流程(最新kernel版)

1.流程是基于Linux的设备-总线-驱动展开的,分为两部分一个是mdio总线,另一个是phy driver的注册

注意:
1.代码跳转使用ctags的跳转功能就可以了,本流程忽略了一些函数代码。
2.流程是两部分呢?不是还少了一个phy device吗?其实是因为在mdio总线流程顺便注册了phy device。
3.该流程代码是Linux5.4.0版本的。

1.mdio流程

文件路径:drivers\net\phy\mdio_bus.c
--> __mdiobus_register
--> device_register
--> mdiobus_scan
    --> get_phy_device
        --> get_phy_id // 通过调用mdiobus_read()实现读取
            -->  phy_device_create // 创建phy设备,定义了初始值,速度,双工,链接状态,默认自动协商。
               --> INIT_DELAYED_WORK(&dev->state_queue, phy_state_machine); // !!!!!!初始化状态机函数
    --> phy_device_register                                       
-->phy_scan_fixups    //可以对phy进行一些预设,可以在MAC驱动里注册fixup函数,在这儿就会进行调用

2.phy driver流程

文件路径:drivers/net/phy/phy_device.c
-->phy_driver_regitster 
   -->driver_register    //检测mdio_bus_type上是否已经注册该设备了。将驱动注册到总线。
      -->bus_add_driver//添加driver到总线上去,驱动注册到总线的实现函数
         -->driver_attach  //:让总线上的设备与驱动匹配.
            -->bus_for_each_dev
               -->__driver_attach(通过bus_for_each_dev(drv->bus, NULL, drv, __driver_attach);参数回调),真正起注册作用的
                  -->device_driver_attach
                     -->driver_probe_device(drv, dev) //通过轮询匹配driver 与 device。
                        -->really_probe(dev, drv)//完成,可以打印/这个信息可以看到我们注册的总 驱动、设备和总线  信息
                           -->driver_bound(dev)//结束

以上就是phy的代码流程。

<think>嗯,用户想了解以太网PHY设备的初始化及启动流程。首先,我需要回忆一下PHY的基本知识。PHY是物理层设备,负责处理物理信号转换和介质访问控制。在Linux系统中,PHY的初始化通常由网络驱动和内核的子系统共同完成。 我记得PHY的启动流程可能包括硬件检测、自动协商、状态设置等步骤。比如,自动协商是PHY和链路伙伴协商速率和双工模式的重要过程。用户提到的引用[1]里提到,初始化时将phydev->state设置为PHY_READY,这可能是在准备PHY进入就绪状态,等待后续操作。 接下来要考虑的是启动流程的具体步骤。可能需要从电源管理开始,然后是复位、配置寄存器、启动自动协商,最后等待连接建立。另外,驱动程序中可能会有不同的状态转换,比如从PHY_DOWN到PHY_READY,再到PHY_UP。 用户的问题中还提到生成相关问题,我需要确保回答结构清晰,并且涵盖可能的子问题。比如,如何配置PHY的寄存器,自动协商失败的处理,或者PHY状态机的管理。 需要注意的是,不同的PHY芯片可能有细微差异,但通用流程应该类似。同时,要结合Linux内核的具体实现,比如使用mdio总线进行通信,以及phylib的作用。 最后,检查是否有遗漏的关键点,比如软复位步骤、中断处理,或者与MAC层的交互。确保回答准确且易于理解,避免过于技术化的术语,但保持专业性。</think>### 以太网PHY初始化及启动流程详解 以太网PHY设备的初始化及启动流程可分为硬件初始化、软件配置、状态机转换三个阶段,以下为详细步骤: 1. **硬件初始化阶段** - 系统上电后,MAC控制器通过MDIO/MDC总线检测PHY设备 - PHY完成内部电源稳定和时钟同步后,发送硬件复位信号(持续约1ms) $$ \text{PHY\_CTRL寄存器} \rightarrow \text{BMCR\_RESET(bit15)=1} $$ - PHY进入默认工作模式(通常为10Mbps半双工) 2. **软件配置阶段** - 驱动加载时调用`phy_init()`初始化PHY数据结构 - 配置PHY特殊功能寄存器: ```c phy_write(phydev, MII_BMCR, BMCR_FULLDPLX | BMCR_SPEED100); // 示例:强制100M全双工 ``` - 关键配置包括: - 自动协商使能/禁用 - 中断模式设置 - 省电模式配置 - LED指示灯行为 3. **状态机转换阶段(核心流程)** ``` PHY_DOWN → PHY_READY → PHY_UP → PHY_RUNNING ``` - 状态转换触发条件: ```python # 伪代码示例 if phydev->state == PHY_READY: phy_start_aneg(phydev) # 启动自动协商[^1] set_bit(PHY_UP, &phydev->state) ``` **自动协商过程详解** 1. 发送base page code(包含支持速率/双工能力) 2. 接收link partner的base page 3. 计算公共能力集: $$ \text{Advertised} \cap \text{LPA} = \text{Common\_mode} $$ 4. 根据优先级选择最优模式(千兆 > 百兆 > 十兆) **Linux驱动关键函数调用链**: ``` phy_attach()phy_init_hw()phy_start()phy_start_aneg()phy_state_machine() # 状态机主循环 ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值