Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/arch/sparc64/dev For the E250:
details: https://anonhg.NetBSD.org/src/rev/0c1589645ee9
branches: trunk
changeset: 979228:0c1589645ee9
user: jdc <jdc%NetBSD.org@localhost>
date: Sun Dec 20 09:08:15 2020 +0000
description:
For the E250:
set fans to medium speed when attaching and full speed when detaching.
remove unused PS fan definition.
In general:
return early from attach if the device isn't present.
handle errors from sysmon during attach so that detach doesn't crash.
try to handle errors when acquiring the iic bus during detach.
diffstat:
sys/arch/sparc64/dev/pcf8591_envctrl.c | 83 +++++++++++++++++++++------------
1 files changed, 53 insertions(+), 30 deletions(-)
diffs (146 lines):
diff -r ad7bda4c0473 -r 0c1589645ee9 sys/arch/sparc64/dev/pcf8591_envctrl.c
--- a/sys/arch/sparc64/dev/pcf8591_envctrl.c Sun Dec 20 08:26:32 2020 +0000
+++ b/sys/arch/sparc64/dev/pcf8591_envctrl.c Sun Dec 20 09:08:15 2020 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: pcf8591_envctrl.c,v 1.14 2020/12/07 13:24:15 jdc Exp $ */
+/* $NetBSD: pcf8591_envctrl.c,v 1.15 2020/12/20 09:08:15 jdc Exp $ */
/* $OpenBSD: pcf8591_envctrl.c,v 1.6 2007/10/25 21:17:20 kettenis Exp $ */
/*
@@ -19,7 +19,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pcf8591_envctrl.c,v 1.14 2020/12/07 13:24:15 jdc Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pcf8591_envctrl.c,v 1.15 2020/12/20 09:08:15 jdc Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -55,7 +55,6 @@
#define PCF8591_TEMP_SENS 0x00
#define PCF8591_CPU_FAN_CTRL 0x01
-#define PCF8591_PS_FAN_CTRL 0x02
struct ecadc_channel {
u_int chan_num;
@@ -89,6 +88,7 @@
static void ecadc_refresh(struct sysmon_envsys *, envsys_data_t *);
static void ecadc_get_limits(struct sysmon_envsys *, envsys_data_t *,
sysmon_envsys_lim_t *, u_int32_t *);
+static int ecadc_set_fan_speed(struct ecadc_softc *, u_int8_t, u_int8_t);
static void ecadc_timeout(void *);
static void ecadc_fan_adjust(void *);
@@ -205,31 +205,6 @@
sc->sc_nchan++;
}
- /*
- * Fan speed changing information is missing from OFW
- * The E250 CPU fan is connected to the sensor at addr 0x4a, channel 1
- */
- if (ia->ia_addr == 0x4a && !strcmp(machine_model, "SUNW,Ultra-250") &&
- OF_getprop(node, "cpu-fan-speeds", &sc->sc_cpu_fan_spd,
- XLATE_MAX) > 0) {
- sc->sc_channels[sc->sc_nchan].chan_num = 1;
- sc->sc_channels[sc->sc_nchan].chan_type = PCF8591_CPU_FAN_CTRL;
- sc->sc_channels[sc->sc_nchan].chan_speed = 0;
- sensor = &sc->sc_channels[sc->sc_nchan].chan_sensor;
- sensor->units = ENVSYS_INTEGER;
- sensor->flags = ENVSYS_FMONNOTSUPP;
- sensor->state = ENVSYS_SINVALID;
- strlcpy(sensor->desc, "CPUFAN", sizeof(sensor->desc));
- sc->sc_channels[sc->sc_nchan].chan_xlate = sc->sc_cpu_fan_spd;
- DPRINTF("%s: "
- "added CPUFAN sensor (chan %d) with cpu-fan xlate\n",
- device_xname(sc->sc_dev),
- sc->sc_channels[sc->sc_nchan].chan_num);
- sc->sc_nchan++;
-
- sc->sc_hastimer = 1;
- }
-
sc->sc_tag = ia->ia_tag;
sc->sc_addr = ia->ia_addr;
@@ -245,6 +220,36 @@
iic_release_bus(sc->sc_tag, 0);
+ /*
+ * Fan speed changing information is missing from OFW
+ * The E250 CPU fan is connected to the sensor at addr 0x4a, channel 1
+ */
+ if (ia->ia_addr == 0x4a && !strcmp(machine_model, "SUNW,Ultra-250") &&
+ OF_getprop(node, "cpu-fan-speeds", &sc->sc_cpu_fan_spd,
+ XLATE_MAX) > 0) {
+ sc->sc_channels[sc->sc_nchan].chan_num = 1;
+ sc->sc_channels[sc->sc_nchan].chan_type = PCF8591_CPU_FAN_CTRL;
+ sensor = &sc->sc_channels[sc->sc_nchan].chan_sensor;
+ sensor->units = ENVSYS_INTEGER;
+ sensor->flags = ENVSYS_FMONNOTSUPP;
+ sensor->state = ENVSYS_SINVALID;
+ strlcpy(sensor->desc, "CPUFAN", sizeof(sensor->desc));
+ sc->sc_channels[sc->sc_nchan].chan_xlate = sc->sc_cpu_fan_spd;
+ DPRINTF("%s: "
+ "added CPUFAN sensor (chan %d) with cpu-fan xlate\n",
+ device_xname(sc->sc_dev),
+ sc->sc_channels[sc->sc_nchan].chan_num);
+
+ /* Set the fan to medium speed */
+ sc->sc_channels[sc->sc_nchan].chan_speed =
+ (sc->sc_cpu_fan_spd[0]+sc->sc_cpu_fan_spd[XLATE_MAX])/2;
+ ecadc_set_fan_speed(sc, sc->sc_channels[sc->sc_nchan].chan_num,
+ sc->sc_channels[sc->sc_nchan].chan_speed);
+
+ sc->sc_nchan++;
+ sc->sc_hastimer = 1;
+ }
+
/* Hook us into the sysmon_envsys subsystem */
sc->sc_sme = sysmon_envsys_create();
sc->sc_sme->sme_name = device_xname(self);
@@ -280,6 +285,8 @@
ecadc_detach(device_t self, int flags)
{
struct ecadc_softc *sc = device_private(self);
+ int c, i;
+
if (sc->sc_hastimer) {
callout_halt(&sc->sc_timer, NULL);
callout_destroy(&sc->sc_timer);
@@ -288,6 +295,23 @@
if (sc->sc_sme != NULL)
sysmon_envsys_unregister(sc->sc_sme);
+ for (i = 0; i < sc->sc_nchan; i++) {
+ struct ecadc_channel *chp = &sc->sc_channels[i];
+
+ if (chp->chan_type == PCF8591_CPU_FAN_CTRL) {
+ /* Loop in case the bus is busy */
+ for (c = 0; c < 5; c++) {
+ chp->chan_speed = sc->sc_cpu_fan_spd[0];
+ if (!ecadc_set_fan_speed(sc, chp->chan_num,
+ chp->chan_speed))
+ return 0;
+ delay(10000);
+ }
+ aprint_error_dev(sc->sc_dev,
+ "cannot set fan speed (chan %d)\n", chp->chan_num);
+ }
+ }
+
return 0;
}
@@ -350,8 +374,7 @@
}
chp->chan_sensor.flags |= ENVSYS_FMONLIMITS;
}
- if (chp->chan_type == PCF8591_CPU_FAN_CTRL ||
- chp->chan_type == PCF8591_PS_FAN_CTRL)
+ if (chp->chan_type == PCF8591_CPU_FAN_CTRL)
chp->chan_sensor.value_cur = data[1 + chp->chan_num];
chp->chan_sensor.state = ENVSYS_SVALID;
Home |
Main Index |
Thread Index |
Old Index