前言
简单梳理Linux-3.12.37内核以太网PHY芯片初始化基本流程。 Linux-3.12.37 phy驱动匹配流程 1.内核扫描设备树mdio节点,匹配[.compatible = "fsl,fman-mdio",]-> 2.调用fsl_pq_mdio_probe() —— Fsl_pq_mdio.c (drivers) -> 3.调用of_mdiobus_register()注册mdiobus —— Of_mdio.c (drivers) -> 4.扫描设备树创建struct phy_device *phy设备数据结构 —— Of_mdio.c (drivers) -> 5.调用phy_device_register()注册phy设备数据结构 —— Phy_device.c (drivers) -> 6.调用device_add()将phy设备数据结构的dev添加到dev层级 —— Core.c (drivers) -> 7.调用bus_probe_device()执行dev和driver的匹配 —— Bus.c (drivers) -> 8.调用device_attach() Try to attach device to a driver —— Dd.c (drivers) -> 9.调用bus_for_each_drv(dev->bus, NULL, dev, _device_attach)枚举 注册到mdiobus上的驱动 —— Bus.c (drivers) -> 10.枚举所有驱动并逐一执行__device_attach()做最后的dev和driver的匹配 —— Dd.c (drivers) -> 11.调用driver_match_device()执行drv->bus->match —— Base.h (drivers) -> 12.驱动接口实例mdio_bus_match() —— Mdio_bus.c (drivers) -> 1
2
3
4
5
6struct bus_type mdio_bus_type = {
.name = "mdio_bus",
.match = mdio_bus_match,
.pm = MDIO_BUS_PM_OPS,
.dev_attrs = mdio_dev_attrs,
};
另,ifconfig配IP时,会调用phy_attach()接口,Do initial configuration here