I am not familiar with all the fan hack specifics so please keep that in mind if my questions and comments seem trivial.
> This is an attempt to solve the problem slightly differently. > - Hook into acpitz and only speed the fan up when it is requesting active > cooling > - Never set the fan to a mode that would endanger the hardware should we > crash Your diff applies to all Thinkpad models. Is that okay? > > PS: It would be nice if there was a function to add cooling methods to > acpitz eg: acpitz_add(void (*fn)(struct acpitz_softc *, void *), void *arg) > I tried but getting struct acpitz_softc into a header is a bit messy. If needed you can move the softc in the acpivar.h header file. Nothing messy about it. What other model drivers would need this though? thinkpad_hotkey, sc, ACPIDEV_POLL); > + > + /* Make sure fan is in auto mode, otherwise we're not sure of support */ > + acpiec_read(acpi_softc->sc_ec, THINKPAD_ECOFFSET_FANLEVEL, 1, &level); > + if (level == THINKPAD_ECFANLEVEL_AUTO) > + acpitz_activecool = thinkpad_activecool; Why is there no support if the fan is not in auto mode? > + else if (tmp > psv-50) > + /* EC firmware fan control is too slow in some models. When > + * we're getting within 5C of active cooling mode, turn the > + * fan to MAX. Helps with oscillation between blast and auto */ This comment does not follow KNF :-) > + nlevel = THINKPAD_ECFANLEVEL_MAX; > + else > + nlevel = THINKPAD_ECFANLEVEL_AUTO; > + > + if (nlevel != level) { > + acpiec_write(acpi_softc->sc_ec, THINKPAD_ECOFFSET_FANLEVEL, 1, > + &nlevel); > + level = nlevel; > + } > } > Index: acpitz.c > =================================================================== > RCS file: /home/vcs/cvs/openbsd/src/sys/dev/acpi/acpitz.c,v > retrieving revision 1.49 > diff -u -p -r1.49 acpitz.c > --- acpitz.c 6 May 2015 01:41:55 -0000 1.49 > +++ acpitz.c 14 Jul 2015 23:52:14 -0000 > @@ -86,6 +86,7 @@ int acpitz_setfan(struct acpitz_softc *, > void acpitz_init(struct acpitz_softc *, int); > > void (*acpitz_cpu_setperf)(int); > +void (*acpitz_activecool)(int, int) = NULL; > int acpitz_perflevel = -1; > extern void (*cpu_setperf)(int); > extern int perflevel; > @@ -427,6 +428,11 @@ acpitz_refresh(void *arg) > acpitz_setfan(sc, i, "_OFF"); > } > } > + > + /* active cooling hook */ > + if (acpitz_activecool) > + acpitz_activecool(sc->sc_tmp, sc->sc_psv); > + I'm not sure, but is it ever possible for acpitz to attach BEFORE acpithinkpad and render this check false? Would you need to somehow tie the two together?