Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F177354069
D61286.1794180425.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Flag For Later
Award Token
Authored By
Unknown
Size
7 KB
Referenced Files
None
Subscribers
None
D61286.1794180425.diff
View Options
diff --git a/sys/dev/asmc/asmc.c b/sys/dev/asmc/asmc.c
--- a/sys/dev/asmc/asmc.c
+++ b/sys/dev/asmc/asmc.c
@@ -125,10 +125,6 @@
*/
static int asmc_mb_sysctl_fanid(SYSCTL_HANDLER_ARGS);
static int asmc_mb_sysctl_fanspeed(SYSCTL_HANDLER_ARGS);
-static int asmc_mb_sysctl_fansafespeed(SYSCTL_HANDLER_ARGS);
-static int asmc_mb_sysctl_fanminspeed(SYSCTL_HANDLER_ARGS);
-static int asmc_mb_sysctl_fanmaxspeed(SYSCTL_HANDLER_ARGS);
-static int asmc_mb_sysctl_fantargetspeed(SYSCTL_HANDLER_ARGS);
static int asmc_mb_sysctl_fanmanual(SYSCTL_HANDLER_ARGS);
static int asmc_temp_sysctl(SYSCTL_HANDLER_ARGS);
static int asmc_mb_sysctl_sms_x(SYSCTL_HANDLER_ARGS);
@@ -473,6 +469,56 @@
return (ENOMEM);
}
+/*
+ * The per-fan speed keys, selected by the high byte of a fan sysctl's arg2.
+ * Writable keys accept a new speed; the rest are reported only.
+ */
+#define ASMC_FAN_ARG2(which, fan) (((which) << 8) | (fan))
+#define ASMC_FAN_ARG2_WHICH(arg2) (((arg2) >> 8) & 0xff)
+#define ASMC_FAN_ARG2_FAN(arg2) ((arg2) & 0xff)
+
+#define ASMC_FANSPEED_CUR 0
+#define ASMC_FANSPEED_SAFE 1
+#define ASMC_FANSPEED_MIN 2
+#define ASMC_FANSPEED_MAX 3
+#define ASMC_FANSPEED_TARGET 4
+
+static const struct {
+ const char *key;
+ bool writable;
+} asmc_fan_speed_keys[] = {
+ [ASMC_FANSPEED_CUR] = { ASMC_KEY_FANSPEED, false },
+ [ASMC_FANSPEED_SAFE] = { ASMC_KEY_FANSAFESPEED, false },
+ [ASMC_FANSPEED_MIN] = { ASMC_KEY_FANMINSPEED, true },
+ [ASMC_FANSPEED_MAX] = { ASMC_KEY_FANMAXSPEED, true },
+ [ASMC_FANSPEED_TARGET] = { ASMC_KEY_FANTARGETSPEED, true },
+};
+
+/* The dev.asmc.n.fan.m leaves, in registration order. */
+static const struct {
+ const char *name;
+ const char *desc;
+ int ctlflags;
+ int (*handler)(SYSCTL_HANDLER_ARGS);
+ int which;
+ bool needs_safespeed;
+} asmc_fan_sysctls[] = {
+ { "id", "Fan ID", CTLTYPE_STRING | CTLFLAG_RD,
+ asmc_mb_sysctl_fanid, 0, false },
+ { "speed", "Fan speed in RPM", CTLTYPE_INT | CTLFLAG_RD,
+ asmc_mb_sysctl_fanspeed, ASMC_FANSPEED_CUR, false },
+ { "safespeed", "Fan safe speed in RPM", CTLTYPE_INT | CTLFLAG_RD,
+ asmc_mb_sysctl_fanspeed, ASMC_FANSPEED_SAFE, true },
+ { "minspeed", "Fan minimum speed in RPM", CTLTYPE_INT | CTLFLAG_RW,
+ asmc_mb_sysctl_fanspeed, ASMC_FANSPEED_MIN, false },
+ { "maxspeed", "Fan maximum speed in RPM", CTLTYPE_INT | CTLFLAG_RW,
+ asmc_mb_sysctl_fanspeed, ASMC_FANSPEED_MAX, false },
+ { "targetspeed", "Fan target speed in RPM", CTLTYPE_INT | CTLFLAG_RW,
+ asmc_mb_sysctl_fanspeed, ASMC_FANSPEED_TARGET, false },
+ { "manual", "Fan manual mode (0=auto, 1=manual)",
+ CTLTYPE_INT | CTLFLAG_RW, asmc_mb_sysctl_fanmanual, 0, false },
+};
+
static int
asmc_attach(device_t dev)
{
@@ -522,54 +568,20 @@
SYSCTL_CHILDREN(sc->sc_fan_tree[0]), OID_AUTO, name,
CTLFLAG_RD | CTLFLAG_MPSAFE, 0, "Fan Subtree");
- SYSCTL_ADD_PROC(sysctlctx,
- SYSCTL_CHILDREN(sc->sc_fan_tree[i]),
- OID_AUTO, "id",
- CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE, dev, j,
- asmc_mb_sysctl_fanid, "I", "Fan ID");
-
- SYSCTL_ADD_PROC(sysctlctx,
- SYSCTL_CHILDREN(sc->sc_fan_tree[i]),
- OID_AUTO, "speed",
- CTLTYPE_INT | CTLFLAG_RD | CTLFLAG_MPSAFE, dev, j,
- asmc_mb_sysctl_fanspeed, "I", "Fan speed in RPM");
+ for (unsigned int k = 0; k < nitems(asmc_fan_sysctls); k++) {
+ if (asmc_fan_sysctls[k].needs_safespeed &&
+ !sc->sc_has_safespeed)
+ continue;
- if (sc->sc_has_safespeed) {
- SYSCTL_ADD_PROC(sysctlctx,
+ /* SYSCTL_ADD_PROC() asserts flags at compile time. */
+ sysctl_add_oid(sysctlctx,
SYSCTL_CHILDREN(sc->sc_fan_tree[i]),
- OID_AUTO, "safespeed",
- CTLTYPE_INT | CTLFLAG_RD | CTLFLAG_MPSAFE, dev, j,
- asmc_mb_sysctl_fansafespeed, "I",
- "Fan safe speed in RPM");
+ OID_AUTO, asmc_fan_sysctls[k].name,
+ asmc_fan_sysctls[k].ctlflags | CTLFLAG_MPSAFE,
+ dev, ASMC_FAN_ARG2(asmc_fan_sysctls[k].which, j),
+ asmc_fan_sysctls[k].handler, "I",
+ asmc_fan_sysctls[k].desc, NULL);
}
-
- SYSCTL_ADD_PROC(sysctlctx,
- SYSCTL_CHILDREN(sc->sc_fan_tree[i]),
- OID_AUTO, "minspeed",
- CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_MPSAFE, dev, j,
- asmc_mb_sysctl_fanminspeed, "I",
- "Fan minimum speed in RPM");
-
- SYSCTL_ADD_PROC(sysctlctx,
- SYSCTL_CHILDREN(sc->sc_fan_tree[i]),
- OID_AUTO, "maxspeed",
- CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_MPSAFE, dev, j,
- asmc_mb_sysctl_fanmaxspeed, "I",
- "Fan maximum speed in RPM");
-
- SYSCTL_ADD_PROC(sysctlctx,
- SYSCTL_CHILDREN(sc->sc_fan_tree[i]),
- OID_AUTO, "targetspeed",
- CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_MPSAFE, dev, j,
- asmc_mb_sysctl_fantargetspeed, "I",
- "Fan target speed in RPM");
-
- SYSCTL_ADD_PROC(sysctlctx,
- SYSCTL_CHILDREN(sc->sc_fan_tree[i]),
- OID_AUTO, "manual",
- CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_MPSAFE, dev, j,
- asmc_mb_sysctl_fanmanual, "I",
- "Fan manual mode (0=auto, 1=manual)");
}
/*
@@ -2046,13 +2058,21 @@
asmc_mb_sysctl_fanspeed(SYSCTL_HANDLER_ARGS)
{
device_t dev = (device_t)arg1;
- int fan = arg2;
+ int which = ASMC_FAN_ARG2_WHICH(arg2);
+ int fan = ASMC_FAN_ARG2_FAN(arg2);
int error;
int32_t v;
- v = asmc_fan_getvalue(dev, ASMC_KEY_FANSPEED, fan);
+ v = asmc_fan_getvalue(dev, asmc_fan_speed_keys[which].key, fan);
error = sysctl_handle_int(oidp, &v, 0, req);
+ if (error == 0 && req->newptr != NULL &&
+ asmc_fan_speed_keys[which].writable) {
+ unsigned int newspeed = v;
+ asmc_fan_setvalue(dev, asmc_fan_speed_keys[which].key, fan,
+ newspeed);
+ }
+
return (error);
}
@@ -2061,7 +2081,7 @@
{
uint8_t buf[16];
device_t dev = (device_t)arg1;
- int fan = arg2;
+ int fan = ASMC_FAN_ARG2_FAN(arg2);
int error = true;
char *desc;
@@ -2073,83 +2093,12 @@
return (error);
}
-static int
-asmc_mb_sysctl_fansafespeed(SYSCTL_HANDLER_ARGS)
-{
- device_t dev = (device_t)arg1;
- int fan = arg2;
- int error;
- int32_t v;
-
- v = asmc_fan_getvalue(dev, ASMC_KEY_FANSAFESPEED, fan);
- error = sysctl_handle_int(oidp, &v, 0, req);
-
- return (error);
-}
-
-static int
-asmc_mb_sysctl_fanminspeed(SYSCTL_HANDLER_ARGS)
-{
- device_t dev = (device_t)arg1;
- int fan = arg2;
- int error;
- int32_t v;
-
- v = asmc_fan_getvalue(dev, ASMC_KEY_FANMINSPEED, fan);
- error = sysctl_handle_int(oidp, &v, 0, req);
-
- if (error == 0 && req->newptr != NULL) {
- unsigned int newspeed = v;
- asmc_fan_setvalue(dev, ASMC_KEY_FANMINSPEED, fan, newspeed);
- }
-
- return (error);
-}
-
-static int
-asmc_mb_sysctl_fanmaxspeed(SYSCTL_HANDLER_ARGS)
-{
- device_t dev = (device_t)arg1;
- int fan = arg2;
- int error;
- int32_t v;
-
- v = asmc_fan_getvalue(dev, ASMC_KEY_FANMAXSPEED, fan);
- error = sysctl_handle_int(oidp, &v, 0, req);
-
- if (error == 0 && req->newptr != NULL) {
- unsigned int newspeed = v;
- asmc_fan_setvalue(dev, ASMC_KEY_FANMAXSPEED, fan, newspeed);
- }
-
- return (error);
-}
-
-static int
-asmc_mb_sysctl_fantargetspeed(SYSCTL_HANDLER_ARGS)
-{
- device_t dev = (device_t)arg1;
- int fan = arg2;
- int error;
- int32_t v;
-
- v = asmc_fan_getvalue(dev, ASMC_KEY_FANTARGETSPEED, fan);
- error = sysctl_handle_int(oidp, &v, 0, req);
-
- if (error == 0 && req->newptr != NULL) {
- unsigned int newspeed = v;
- asmc_fan_setvalue(dev, ASMC_KEY_FANTARGETSPEED, fan, newspeed);
- }
-
- return (error);
-}
-
static int
asmc_mb_sysctl_fanmanual(SYSCTL_HANDLER_ARGS)
{
device_t dev = (device_t)arg1;
struct asmc_softc *sc = device_get_softc(dev);
- int fan = arg2;
+ int fan = ASMC_FAN_ARG2_FAN(arg2);
int error;
int32_t v;
uint8_t buf[2];
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Sun, Nov 8, 11:27 PM (1 h, 25 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
41591627
Default Alt Text
D61286.1794180425.diff (7 KB)
Attached To
Mode
D61286: asmc: collapse the per-fan speed sysctl handlers
Attached
Detach File
Event Timeline