driver model: fix device interfaces.
- Remove struct intf_data. It was silly, and gave us an unbalanced interface. Instead, when removing a device_interface, all of a class's devices are iterated over, and intf->remove_device() is called for each. (Instead of the device's list of interfaces it belongs to). Interfaces are expected to tell if they support the device being removed. - Remove struct device::intf_list. - Protect classes' device list access with devclass_sem, which is taken when a device or interface is added or removed. This allows access to the list w/o taking the class's lock, which allows subordinate objects to be registered (e.g. the interface itself, or objects the interfaces create for a device). - This should fix a deadlock when devices are added to interfaces, which calls intf->add_device(), then interface_add_data(), which call kobject_register() and hangs, since it tries to take the class's lock again.
Showing
Please register or sign in to comment