device_probe_and_attach() fails in kernel built w/ clang

看板FB_current作者時間14年前 (2011/08/18 19:32), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串2/3 (看更多)
Hi everyone, I have a driver for PCI devices that have onboard I2C buses, so my driver needs to create an iicbus child for the PCI device. So in my driver I use DRIVER_MODULE(iicbus, <my_pci_driver>, iicbus_driver, iicbus_devclass, NULL, NULL). This works because iicbus_driver and iicbus_devclass are declared extern in iicbus.h. Then during device attachment I create the iicbus child using: device_add_child(parent, "iicbus", -1); .... device_probe_and_attach(iicbus_dev); This all works fine for a kernel built w/ gcc. But if I build the same kernel w/ clang, the device_probe_and_attach() call returns ENXIO. I was able to debug this far enough to determine that device_probe_child() in subr_bus.c wasn't finding any matching drivers, so first_matching_driver() returned NULL and the matching loops fell through. Interestingly enough, I have another driver for a similar class of devices that also uses iicbus, and if I load that driver after loading the first one, the *first* driver will be re-probed, and this time it will successfully create its iicbus devices and attach to the PCI devices. The *second* driver, though, will still fail to create its iicbuses. I'm not sure if this is some weird problem w/ the iicbus driver, with the kernel's probing routines, or with the module data structures and init calls generated by DRIVER_MODULE(). Whatever it is seems to be clang-related; removing optimization and march= from CFLAGS had no effect. I'm using r224899/amd64. Any help would be really appreciated. Cheers, Jason _______________________________________________ freebsd-current@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/freebsd-current To unsubscribe, send any mail to "freebsd-current-unsubscribe@freebsd.org"
文章代碼(AID): #1EJFWqP1 (FB_current)
文章代碼(AID): #1EJFWqP1 (FB_current)