Linux以太网之MDIO扫描注册phy及C22和C45 Linux以太网之MDIO扫描注册phy及C22和C45 | DDNotesLinux以太网之MDIO扫描注册phy及C22和C45MDIO扫描注册phy在 Linux 内核中MDIO 子系统对 PHY 设备的扫描和注册从GMAC驱动中对mdiobus注册开始主要涉及到几个关键文件中 硬件拓扑信息如扫描、ID匹配 → 主要代码在 drivers/net/phy/mdio_bus.c 设备树Device Tree → 主要代码在 drivers/ohttps://notes.z-dd.online/2026/05/12/Linux%E4%BB%A5%E5%A4%AA%E7%BD%91%E4%B9%8BMDIO%E6%89%AB%E6%8F%8F%E6%B3%A8%E5%86%8Cphy%E5%8F%8AC22%E5%92%8CC45/Linux以太网之MDIO扫描注册phy及C22和C45MDIO扫描注册phy在 Linux 内核中MDIO 子系统对 PHY 设备的扫描和注册从GMAC驱动中对mdiobus注册开始主要涉及到几个关键文件中硬件拓扑信息如扫描、ID匹配 → 主要代码在 drivers/net/phy/mdio_bus.c设备树Device Tree → 主要代码在 drivers/of/of_mdio.cACPI高级配置与电源接口 → 主要代码在 drivers/net/mdio/acpi_mdio.c平台特定板级信息 → 主要代码在 drivers/net/phy/mdio-boardinfo.c 说明场景 主要代码来源 核心触发函数 创建原理与示例自动扫描 (通用) drivers/net/phy/mdio_bus.c __mdiobus_register 注册 mii_bus 时自动扫描硬件创建节点。例如stmmac-0:01设备树 drivers/of/of_mdio.c of_mdiobus_register 依据设备树子节点信息创建节点覆盖自动扫描。例如stmmac-0:01ACPI drivers/net/mdio/acpi_mdio.c __acpi_mdiobus_register 依据ACPI表中子节点信息创建节点覆盖自动扫描。例如stmmac-0:01板级信息 drivers/net/phy/mdio-boardinfo.c mdiobus_setup_mdiodev_from_board_info 在注册 mii_bus 过程中使用预定义的平台数据创建设备。例如stmmac-0:01 1. 关键函数__mdiobus_register无论是走通用的mdiobus_register方式还是设备树或 ACPI 方式去注册最终都会调用此函数它负责将一个 mii_bus 实例注册到内核设备模型中。注册 mii_bus调用 device_register(bus-dev)。当内核的设备模型核心处理这个调用时会在 sysfs 中创建该总线的根节点例如 /sys/bus/mdio_bus/devices/stmmac-0。记录设备和驱动将当前正在运行的模块设置为该总线的所有者 (bus-owner owner)并将总线驱动指针设置为 MDIO_bus_driver。这个驱动负责匹配和管理总线上的设备。扫描并创建设备处理预声明信息调用 mdiobus_setup_mdiodev_from_board_info(bus)该函数会查找是否有平台预先为这条总线声明的设备信息。如果有会基于这些信息立即调用 mdio_device_register 创建设备节点。触发硬件扫描如果未指定 phy_mask 屏蔽所有地址的自动扫描则会调用 mdiobus_create_device遍历 PHY 地址0-31调用 get_phy_device。一旦在某个地址成功探测到硬件就立即调用 phy_device_register 注册它。phy_device_register 内部最终会调用 device_add随之在 /sys/bus/mdio_bus/devices/ 下创建该 PHY 的节点如 stmmac-0:01。 2. of_mdio.c设备树 (Device Tree) 的实现当硬件信息由设备树描述时会禁用自动扫描转而根据设备树子节点创建 PHY 设备。关键函数of_mdiobus_register 注册 mii_bus 本身遍历设备树相关的节点解析 reg 属性获取 PHY 地址为每个子节点调用 get_phy_device 和 phy_device_register。phy_device_register 内部会调用 device_add从而在 sysfs 中生成设备节点。 3. acpi_mdio.cACPI 的实现对于使用 ACPI 进行固件描述的系统drivers/net/mdio/acpi_mdio.c 提供了类似设备树的实现主要不同在于它从 ACPI 表中获取信息。关键函数__acpi_mdiobus_register 注册总线遍历 ACPI 固件节点的子节点 (fwnode_for_each_child_node)获取每个子节点的地址并对每个有效地址来创建具体的 PHY 设备。 4. mdio-boardinfo.c板级信息的实现对于无法通过设备树或 ACPI 自动发现的特殊硬件drivers/net/phy/mdio-boardinfo.c 提供了一种板级文件预先声明设备信息的机制。收集信息平台初始化代码可以调用 mdiobus_register_board_info 函数将 mdio_board_info 结构体包含总线ID、设备地址、驱动名等添加到一个全局的 mdio_board_list 链表中。创建节点当总线控制器驱动调用 __mdiobus_register 注册时会同步调用 mdiobus_setup_mdiodev_from_board_info来遍历全局链表查找匹配的设备。一旦找到匹配项会立即调用 mdio_device_register 向设备模型注册设备。整个过程不涉及硬件自动扫描。主要流程路径作者: Shell链接: https://notes.z-dd.online/2026/05/12/Linux%E4%BB%A5%E5%A4%AA%E7%BD%91%E4%B9%8BMDIO%E6%89%AB%E6%8F%8F%E6%B3%A8%E5%86%8Cphy%E5%8F%8AC22%E5%92%8CC45/来源: DDNotes著作权归作者所有。商业转载请联系作者获得授权非商业转载请注明出处。。。。 。。。更多请关注我的博客https://notes.z-dd.online/或我的