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的代码流程。