git://scm.lunaixsky.com
/
lunaix-os.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
feat: taskfs for export process to filesystem
[lunaix-os.git]
/
lunaix-os
/
kernel
/
device
/
device.c
diff --git
a/lunaix-os/kernel/device/device.c
b/lunaix-os/kernel/device/device.c
index aafdf0e5694b30d3566b2339dcbc2b89941aeb40..beb1f18050b15097bb02d5696b037a8a8f32e5a6 100644
(file)
--- a/
lunaix-os/kernel/device/device.c
+++ b/
lunaix-os/kernel/device/device.c
@@
-9,20
+9,23
@@
static DEFINE_LLIST(root_list);
static volatile dev_t devid = 0;
struct device*
static volatile dev_t devid = 0;
struct device*
-
__
device_add(struct device* parent,
-
void* underlay,
-
char* name_fmt,
-
uint32_t type,
-
va_list args)
+device_add(struct device* parent,
+ void* underlay,
+ char* name_fmt,
+ uint32_t type,
+ va_list args)
{
struct device* dev = vzalloc(sizeof(struct device));
if (parent) {
assert((parent->dev_type & DEV_MSKIF) == DEV_IFCAT);
{
struct device* dev = vzalloc(sizeof(struct device));
if (parent) {
assert((parent->dev_type & DEV_MSKIF) == DEV_IFCAT);
+ llist_append(&parent->children, &dev->siblings);
+ } else {
+ llist_append(&root_list, &dev->siblings);
}
size_t strlen =
}
size_t strlen =
- __sprintf_internal(dev->name_val, name_fmt, DEVICE_NAME_SIZE, args);
+ __
k
sprintf_internal(dev->name_val, name_fmt, DEVICE_NAME_SIZE, args);
dev->dev_id = devid++;
dev->name = HSTR(dev->name_val, strlen);
dev->dev_id = devid++;
dev->name = HSTR(dev->name_val, strlen);
@@
-31,7
+34,7
@@
__device_add(struct device* parent,
dev->dev_type = type;
hstr_rehash(&dev->name, HSTR_FULL_HASH);
dev->dev_type = type;
hstr_rehash(&dev->name, HSTR_FULL_HASH);
- llist_
append(&root_list, &dev->siblings
);
+ llist_
init_head(&dev->children
);
return dev;
}
return dev;
}
@@
-43,7
+46,7
@@
device_addseq(struct device* parent, void* underlay, char* name_fmt, ...)
va_start(args, name_fmt);
struct device* dev =
va_start(args, name_fmt);
struct device* dev =
-
__
device_add(parent, underlay, name_fmt, DEV_IFSEQ, args);
+ device_add(parent, underlay, name_fmt, DEV_IFSEQ, args);
va_end(args);
return dev;
va_end(args);
return dev;
@@
-56,7
+59,7
@@
device_addvol(struct device* parent, void* underlay, char* name_fmt, ...)
va_start(args, name_fmt);
struct device* dev =
va_start(args, name_fmt);
struct device* dev =
-
__
device_add(parent, underlay, name_fmt, DEV_IFVOL, args);
+ device_add(parent, underlay, name_fmt, DEV_IFVOL, args);
va_end(args);
return dev;
va_end(args);
return dev;
@@
-68,7
+71,7
@@
device_addcat(struct device* parent, char* name_fmt, ...)
va_list args;
va_start(args, name_fmt);
va_list args;
va_start(args, name_fmt);
- struct device* dev =
__
device_add(parent, NULL, name_fmt, DEV_IFCAT, args);
+ struct device* dev = device_add(parent, NULL, name_fmt, DEV_IFCAT, args);
va_end(args);
return dev;
va_end(args);
return dev;
@@
-90,9
+93,9
@@
device_getbyid(struct llist_header* devlist, dev_t id)
}
struct device*
}
struct device*
-device_getby
name(struct llist_header* devlist
, struct hstr* name)
+device_getby
hname(struct device* root_dev
, struct hstr* name)
{
{
-
devlist = devlist ? devlist
: &root_list;
+
struct llist_header* devlist = root_dev ? &root_dev->children
: &root_list;
struct device *pos, *n;
llist_for_each(pos, n, devlist, siblings)
{
struct device *pos, *n;
llist_for_each(pos, n, devlist, siblings)
{
@@
-104,6
+107,15
@@
device_getbyname(struct llist_header* devlist, struct hstr* name)
return NULL;
}
return NULL;
}
+struct device*
+device_getbyname(struct device* root_dev, const char* name, size_t len)
+{
+ struct hstr hname = HSTR(name, len);
+ hstr_rehash(&hname, HSTR_FULL_HASH);
+
+ return device_getbyhname(root_dev, &hname);
+}
+
void
device_remove(struct device* dev)
{
void
device_remove(struct device* dev)
{
@@
-112,9
+124,9
@@
device_remove(struct device* dev)
}
struct device*
}
struct device*
-device_getbyoffset(struct
llist_header* devlist
, int offset)
+device_getbyoffset(struct
device* root_dev
, int offset)
{
{
-
devlist = devlist ? devlist
: &root_list;
+
struct llist_header* devlist = root_dev ? &root_dev->children
: &root_list;
struct device *pos, *n;
int off = 0;
llist_for_each(pos, n, devlist, siblings)
struct device *pos, *n;
int off = 0;
llist_for_each(pos, n, devlist, siblings)