将平台驱动程序绑定到平台设备的问题
Issue with binding platform driver to the platform device
我想使用 mt7622 soc 的以太网控制器并遇到这个问题。我编译了 mtk_soc_eth
driver as mkt_eth
module and I have an entry in mt7622-bananapi-bpi-r64.dts
device tree for device, compatible with driver.
在启动过程中,这个模块会自动加载到系统中(我认为是在安装 rootfs 之后):
[root@nixos:~]# lsmod | grep mtk_eth
mtk_eth 69632 0
dsa_core 98304 1 mtk_eth
它似乎注册为平台驱动程序:
[root@nixos:~]# ls /sys/bus/platform/drivers/mtk_soc_eth
bind module uevent unbind
启动后我还有一个平台设备:
[root@nixos:~]# ls /sys/bus/platform/devices/1b100000.ethernet
driver_override
modalias
of_node
power
subsystem
supplier:platform:10006000.power-controller
supplier:platform:10209000.apmixedsys
supplier:platform:10210000.topckgen
supplier:platform:10211000.pinctrl
supplier:platform:1b000000.syscon
supplier:platform:1b128000.sgmiisys
uevent
waiting_for_supplier
但是由于某些原因它们没有被绑定。此外,当我尝试手动绑定它们时,出现错误:
[root@nixos:~]# echo '1b100000.ethernet' > /sys/bus/platform/drivers/mtk_soc_eth/bind
-bash: echo: write error: Resource temporarily unavailable
我如何理解为什么以太网设备不与驱动程序绑定?
嗯,我好像找到问题出在哪里了。 linux 内核似乎有丰富的调试选项)我启用了动态调试来跟踪 __driver_probe_device
https://github.com/torvalds/linux/blob/master/drivers/base/dd.c#L730 函数中发生的事情:
[root@nixos:~]# echo 'file dd.c +p'>/sys/kernel/debug/dynamic_debug/control
[root@nixos:~]# echo 'file core.c +p'>/sys/kernel/debug/dynamic_debug/control
然后尝试绑定设备驱动程序和设备:
[root@nixos:~]# echo '1b100000.ethernet' >/sys/bus/platform/drivers/mtk_soc_eth/bind
-bash: echo: write error: Resource temporarily unavailable
[root@nixos:~]# dmesg -T | tail
...
[Sat Jan 1 00:03:27 2000] bus: 'platform': __driver_probe_device: matched device 1b100000.ethernet with driver mtk_soc_eth
[Sat Jan 1 00:03:27 2000] platform 1b100000.ethernet: error -EPROBE_DEFER: supplier 1b000000.syscon not ready
似乎其中一个依赖设备 (1b000000.syscon
) 尚未就绪(同时 /sys/bus/platform/devices/1b100000.ethernet/waiting_for_supplier
由于某种原因仍 0
)。我还需要加载 clk-mt7622-eth
驱动程序。
我想使用 mt7622 soc 的以太网控制器并遇到这个问题。我编译了 mtk_soc_eth
driver as mkt_eth
module and I have an entry in mt7622-bananapi-bpi-r64.dts
device tree for device, compatible with driver.
在启动过程中,这个模块会自动加载到系统中(我认为是在安装 rootfs 之后):
[root@nixos:~]# lsmod | grep mtk_eth
mtk_eth 69632 0
dsa_core 98304 1 mtk_eth
它似乎注册为平台驱动程序:
[root@nixos:~]# ls /sys/bus/platform/drivers/mtk_soc_eth
bind module uevent unbind
启动后我还有一个平台设备:
[root@nixos:~]# ls /sys/bus/platform/devices/1b100000.ethernet
driver_override
modalias
of_node
power
subsystem
supplier:platform:10006000.power-controller
supplier:platform:10209000.apmixedsys
supplier:platform:10210000.topckgen
supplier:platform:10211000.pinctrl
supplier:platform:1b000000.syscon
supplier:platform:1b128000.sgmiisys
uevent
waiting_for_supplier
但是由于某些原因它们没有被绑定。此外,当我尝试手动绑定它们时,出现错误:
[root@nixos:~]# echo '1b100000.ethernet' > /sys/bus/platform/drivers/mtk_soc_eth/bind
-bash: echo: write error: Resource temporarily unavailable
我如何理解为什么以太网设备不与驱动程序绑定?
嗯,我好像找到问题出在哪里了。 linux 内核似乎有丰富的调试选项)我启用了动态调试来跟踪 __driver_probe_device
https://github.com/torvalds/linux/blob/master/drivers/base/dd.c#L730 函数中发生的事情:
[root@nixos:~]# echo 'file dd.c +p'>/sys/kernel/debug/dynamic_debug/control
[root@nixos:~]# echo 'file core.c +p'>/sys/kernel/debug/dynamic_debug/control
然后尝试绑定设备驱动程序和设备:
[root@nixos:~]# echo '1b100000.ethernet' >/sys/bus/platform/drivers/mtk_soc_eth/bind
-bash: echo: write error: Resource temporarily unavailable
[root@nixos:~]# dmesg -T | tail
...
[Sat Jan 1 00:03:27 2000] bus: 'platform': __driver_probe_device: matched device 1b100000.ethernet with driver mtk_soc_eth
[Sat Jan 1 00:03:27 2000] platform 1b100000.ethernet: error -EPROBE_DEFER: supplier 1b000000.syscon not ready
似乎其中一个依赖设备 (1b000000.syscon
) 尚未就绪(同时 /sys/bus/platform/devices/1b100000.ethernet/waiting_for_supplier
由于某种原因仍 0
)。我还需要加载 clk-mt7622-eth
驱动程序。