Linux 5.19+iMX8平台下imx6q-pcie驱动添加remove函数后仍无unbind/bind属性的问题咨询
我之前调试平台驱动的时候也碰到过类似的sysfs属性不出现的情况,咱们一步步来排查解决:
先检查驱动是否禁用了绑定属性
内核驱动的struct device_driver结构体里有个suppress_bind_attrs字段,如果设置为true,会直接关闭bind/unbind这些sysfs属性。你去看看imx6_pcie_driver.driver部分有没有这个设置,如果有的话改成false或者直接删掉这行配置。确认remove函数的正确性与驱动更新生效
首先要保证你的imx6_pcie_remove函数签名是符合内核要求的:static int imx6_pcie_remove(struct platform_device *pdev) { // 你的逻辑,哪怕是空的也要返回0 return 0; }另外,一定要确认修改后的驱动代码已经被正确编译加载了:如果是内置驱动,必须重新编译内核并烧录;如果是可加载模块,要重新编译模块然后用
rmmod+insmod重新加载,不然你的修改根本没生效。检查设备树与设备状态
先查看驱动当前绑定的设备:ls /sys/bus/platform/drivers/imx6q-pcie/如果能看到对应的设备节点,再检查设备树里的PCIe节点配置,有没有设置类似
no-hotplug这样的属性阻止热移除。另外,确保内核配置里开启了PCI热插拔相关选项,比如用下面的命令检查:zcat /proc/config.gz | grep HOTPLUG_PCI要保证
CONFIG_HOTPLUG_PCI是y或者m,如果有针对iMX平台的专属配置(比如CONFIG_HOTPLUG_PCI_IMX6)也要确保开启。调试手段:手动创建sysfs属性
如果上面的步骤都没问题还是看不到bind/unbind,可以尝试在驱动注册成功后手动创建这些属性,添加代码:driver_create_file(&imx6_pcie_driver.driver, &driver_attr_unbind); driver_create_file(&imx6_pcie_driver.driver, &driver_attr_bind);这属于临时调试方法,正常情况下内核会自动创建这些属性,这么做能帮你确认是不是内核的自动创建逻辑被什么地方拦截了。
备注:内容来源于stack exchange,提问作者code_fodder

