* Added support for generic drivers.
* If init_driver() fails, the device manager now prints a message to syslog. * device_node::CompareTo() was broken: it never correctly compared the last attribute. This could cause duplicate nodes. * Removed superfluous white space. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@26489 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -42,6 +42,7 @@
|
|||||||
|
|
||||||
|
|
||||||
#define DEVICE_MANAGER_ROOT_NAME "system/devices_root/driver_v1"
|
#define DEVICE_MANAGER_ROOT_NAME "system/devices_root/driver_v1"
|
||||||
|
#define DEVICE_MANAGER_GENERIC_NAME "system/devices_generic/driver_v1"
|
||||||
|
|
||||||
|
|
||||||
struct device_attr_private : device_attr,
|
struct device_attr_private : device_attr,
|
||||||
@@ -346,13 +347,13 @@ control_device_manager(const char* subsystem, uint32 function, void* buffer,
|
|||||||
|
|
||||||
device_node* node = (device_node*)cookie;
|
device_node* node = (device_node*)cookie;
|
||||||
NodeList::ConstIterator iterator = node->Children().GetIterator();
|
NodeList::ConstIterator iterator = node->Children().GetIterator();
|
||||||
|
|
||||||
if (!iterator.HasNext()) {
|
if (!iterator.HasNext()) {
|
||||||
return B_ENTRY_NOT_FOUND;
|
return B_ENTRY_NOT_FOUND;
|
||||||
}
|
}
|
||||||
node = iterator.Next();
|
node = iterator.Next();
|
||||||
cookie = (device_node_cookie)node;
|
cookie = (device_node_cookie)node;
|
||||||
|
|
||||||
// copy back to user space
|
// copy back to user space
|
||||||
return user_memcpy(buffer, &cookie, sizeof(device_node_cookie));
|
return user_memcpy(buffer, &cookie, sizeof(device_node_cookie));
|
||||||
}
|
}
|
||||||
@@ -372,7 +373,7 @@ control_device_manager(const char* subsystem, uint32 function, void* buffer,
|
|||||||
if (!last->Parent())
|
if (!last->Parent())
|
||||||
return B_ENTRY_NOT_FOUND;
|
return B_ENTRY_NOT_FOUND;
|
||||||
NodeList::ConstIterator iterator = last->Parent()->Children().GetIterator();
|
NodeList::ConstIterator iterator = last->Parent()->Children().GetIterator();
|
||||||
|
|
||||||
// skip those we already traversed
|
// skip those we already traversed
|
||||||
while (iterator.HasNext() && last != NULL) {
|
while (iterator.HasNext() && last != NULL) {
|
||||||
device_node* node = iterator.Next();
|
device_node* node = iterator.Next();
|
||||||
@@ -385,7 +386,7 @@ control_device_manager(const char* subsystem, uint32 function, void* buffer,
|
|||||||
return B_ENTRY_NOT_FOUND;
|
return B_ENTRY_NOT_FOUND;
|
||||||
device_node* node = iterator.Next();
|
device_node* node = iterator.Next();
|
||||||
cookie = (device_node_cookie)node;
|
cookie = (device_node_cookie)node;
|
||||||
|
|
||||||
// copy back to user space
|
// copy back to user space
|
||||||
return user_memcpy(buffer, &cookie, sizeof(device_node_cookie));
|
return user_memcpy(buffer, &cookie, sizeof(device_node_cookie));
|
||||||
}
|
}
|
||||||
@@ -1187,8 +1188,13 @@ device_node::InitDriver()
|
|||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fDriver->init_driver != NULL)
|
if (fDriver->init_driver != NULL) {
|
||||||
status = fDriver->init_driver(this, &fDriverData);
|
status = fDriver->init_driver(this, &fDriverData);
|
||||||
|
if (status != B_OK) {
|
||||||
|
dprintf("driver %s init failed: %s\n", ModuleName(),
|
||||||
|
strerror(status));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (status < B_OK) {
|
if (status < B_OK) {
|
||||||
if (Parent() != NULL)
|
if (Parent() != NULL)
|
||||||
@@ -1969,13 +1975,17 @@ device_node::CompareTo(const device_attr* attributes) const
|
|||||||
// find corresponding attribute
|
// find corresponding attribute
|
||||||
AttributeList::ConstIterator iterator = Attributes().GetIterator();
|
AttributeList::ConstIterator iterator = Attributes().GetIterator();
|
||||||
device_attr_private* attr = NULL;
|
device_attr_private* attr = NULL;
|
||||||
|
bool found = false;
|
||||||
|
|
||||||
while (iterator.HasNext()) {
|
while (iterator.HasNext()) {
|
||||||
attr = iterator.Next();
|
attr = iterator.Next();
|
||||||
|
|
||||||
if (!strcmp(attr->name, attributes->name))
|
if (!strcmp(attr->name, attributes->name)) {
|
||||||
|
found = true;
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (!iterator.HasNext())
|
if (!found)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
int compare = device_attr_private::Compare(attr, attributes);
|
int compare = device_attr_private::Compare(attr, attributes);
|
||||||
@@ -2069,7 +2079,7 @@ device_node::Dump(int32 level)
|
|||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
init_root_node(void)
|
init_node_tree(void)
|
||||||
{
|
{
|
||||||
device_attr attrs[] = {
|
device_attr attrs[] = {
|
||||||
{B_DEVICE_PRETTY_NAME, B_STRING_TYPE, {string: "Devices Root"}},
|
{B_DEVICE_PRETTY_NAME, B_STRING_TYPE, {string: "Devices Root"}},
|
||||||
@@ -2079,10 +2089,24 @@ init_root_node(void)
|
|||||||
{NULL}
|
{NULL}
|
||||||
};
|
};
|
||||||
|
|
||||||
if (register_node(NULL, DEVICE_MANAGER_ROOT_NAME, attrs, NULL, NULL)
|
device_node* node;
|
||||||
|
if (register_node(NULL, DEVICE_MANAGER_ROOT_NAME, attrs, NULL, &node)
|
||||||
!= B_OK) {
|
!= B_OK) {
|
||||||
dprintf("Cannot register Devices Root Node\n");
|
dprintf("Cannot register Devices Root Node\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
device_attr genericAttrs[] = {
|
||||||
|
{B_DEVICE_PRETTY_NAME, B_STRING_TYPE, {string: "Generic"}},
|
||||||
|
{B_DEVICE_BUS, B_STRING_TYPE, {string: "generic"}},
|
||||||
|
{B_DEVICE_FLAGS, B_UINT32_TYPE, {ui32: B_FIND_MULTIPLE_CHILDREN
|
||||||
|
| B_KEEP_DRIVER_LOADED | B_FIND_CHILD_ON_DEMAND}},
|
||||||
|
{NULL}
|
||||||
|
};
|
||||||
|
|
||||||
|
if (register_node(node, DEVICE_MANAGER_GENERIC_NAME, genericAttrs, NULL,
|
||||||
|
NULL) != B_OK) {
|
||||||
|
dprintf("Cannot register Generic Devices Node\n");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -2092,6 +2116,15 @@ driver_module_info gDeviceRootModule = {
|
|||||||
0,
|
0,
|
||||||
NULL,
|
NULL,
|
||||||
},
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
driver_module_info gDeviceGenericModule = {
|
||||||
|
{
|
||||||
|
DEVICE_MANAGER_GENERIC_NAME,
|
||||||
|
0,
|
||||||
|
NULL,
|
||||||
|
},
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -2121,7 +2154,7 @@ device_manager_init(struct kernel_args* args)
|
|||||||
dm_init_io_resources();
|
dm_init_io_resources();
|
||||||
|
|
||||||
recursive_lock_init(&sLock, "device manager");
|
recursive_lock_init(&sLock, "device manager");
|
||||||
init_root_node();
|
init_node_tree();
|
||||||
|
|
||||||
#ifdef TRACE_DEVICE_MANAGER
|
#ifdef TRACE_DEVICE_MANAGER
|
||||||
sRootNode->Dump();
|
sRootNode->Dump();
|
||||||
|
|||||||
Reference in New Issue
Block a user