Module Name: src
Committed By: thorpej
Date: Tue Aug 27 13:44:56 UTC 2024
Modified Files:
src/sys/kern: subr_device.c
src/sys/sys: device.h
Log Message:
- Remove devhandle_impl_inherit() and re-implement as devhandle_impl_subclass()
and a helper devhandle_subclass().
- Add a devhandle_t argument to device_call_generic(); don't imply it from
the device; let the device_call() wrapper own that logic.
(Ride the bump to 10.99.12; I've been sitting on this change for ages
waiting for a version bump to go by.)
To generate a diff of this commit:
cvs rdiff -u -r1.13 -r1.14 src/sys/kern/subr_device.c
cvs rdiff -u -r1.188 -r1.189 src/sys/sys/device.h
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/kern/subr_device.c
diff -u src/sys/kern/subr_device.c:1.13 src/sys/kern/subr_device.c:1.14
--- src/sys/kern/subr_device.c:1.13 Mon Mar 28 12:38:59 2022
+++ src/sys/kern/subr_device.c Tue Aug 27 13:44:55 2024
@@ -1,4 +1,4 @@
-/* $NetBSD: subr_device.c,v 1.13 2022/03/28 12:38:59 riastradh Exp $ */
+/* $NetBSD: subr_device.c,v 1.14 2024/08/27 13:44:55 thorpej Exp $ */
/*
* Copyright (c) 2006, 2021 The NetBSD Foundation, Inc.
@@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: subr_device.c,v 1.13 2022/03/28 12:38:59 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: subr_device.c,v 1.14 2024/08/27 13:44:55 thorpej Exp $");
#include <sys/param.h>
#include <sys/device.h>
@@ -147,11 +147,28 @@ devhandle_lookup_device_call(devhandle_t
}
void
-devhandle_impl_inherit(struct devhandle_impl *impl,
- const struct devhandle_impl *super)
+devhandle_impl_subclass(struct devhandle_impl *new_impl,
+ const struct devhandle_impl *super,
+ device_call_t (*new_lookup)(devhandle_t, const char *, devhandle_t *))
+{
+ new_impl->type = super->type;
+ new_impl->super = super;
+ new_impl->lookup_device_call = new_lookup;
+}
+
+/*
+ * Helper function that provides a short-hand method of the common
+ * "subclass a device handle" flow.
+ */
+devhandle_t
+devhandle_subclass(devhandle_t handle,
+ struct devhandle_impl *new_impl,
+ device_call_t (*new_lookup)(devhandle_t, const char *, devhandle_t *))
{
- memcpy(impl, super, sizeof(*impl));
- impl->super = super;
+ devhandle_impl_subclass(new_impl, handle.impl, new_lookup);
+ handle.impl = new_impl;
+
+ return handle;
}
/*
@@ -345,9 +362,9 @@ device_handle(device_t dev)
}
int
-device_call_generic(device_t dev, const struct device_call_generic *gen)
+device_call_generic(device_t dev, devhandle_t handle,
+ const struct device_call_generic *gen)
{
- devhandle_t handle = device_handle(dev);
device_call_t call;
devhandle_t call_handle;
Index: src/sys/sys/device.h
diff -u src/sys/sys/device.h:1.188 src/sys/sys/device.h:1.189
--- src/sys/sys/device.h:1.188 Mon Jan 15 18:15:37 2024
+++ src/sys/sys/device.h Tue Aug 27 13:44:55 2024
@@ -1,4 +1,4 @@
-/* $NetBSD: device.h,v 1.188 2024/01/15 18:15:37 thorpej Exp $ */
+/* $NetBSD: device.h,v 1.189 2024/08/27 13:44:55 thorpej Exp $ */
/*
* Copyright (c) 2021 The NetBSD Foundation, Inc.
@@ -622,11 +622,16 @@ bool devhandle_is_valid(devhandle_t);
devhandle_t devhandle_invalid(void);
devhandle_type_t devhandle_type(devhandle_t);
int devhandle_compare(devhandle_t, devhandle_t);
+devhandle_t devhandle_subclass(devhandle_t, struct devhandle_impl *,
+ device_call_t (*)(devhandle_t, const char *,
+ devhandle_t *));
device_call_t devhandle_lookup_device_call(devhandle_t, const char *,
devhandle_t *);
-void devhandle_impl_inherit(struct devhandle_impl *,
- const struct devhandle_impl *);
+void devhandle_impl_subclass(struct devhandle_impl *,
+ const struct devhandle_impl *,
+ device_call_t (*)(devhandle_t, const char *,
+ devhandle_t *));
device_t deviter_first(deviter_t *, deviter_flags_t);
void deviter_init(deviter_t *, deviter_flags_t);
@@ -717,10 +722,13 @@ struct device_call_generic {
void *args;
};
-int device_call_generic(device_t, const struct device_call_generic *);
+int device_call_generic(device_t, devhandle_t,
+ const struct device_call_generic *);
#define device_call(dev, call) \
- device_call_generic((dev), &(call)->generic)
+ device_call_generic((dev), device_handle(dev), &(call)->generic)
+#define devhandle_call(handle, call) \
+ device_call_generic(NULL, (handle), &(call)->generic)
#endif /* _KERNEL */