It seems that we don't correctly read the RPM fan speed in smu(4).
I've noticed this because in my G5 the Front Fan is missing, but
sysctl though displays a value for it:
# sysctl -a | grep fan
hw.sensors.smu0.fan0=994 RPM (Rear Fan 0)
hw.sensors.smu0.fan1=994 RPM (Rear fan 1)
hw.sensors.smu0.fan2=994 RPM (Front Fan)
This diff adapts how the FreeBSD smu(4) driver reads the RPM fan
speed. It results on my G5 that the missing Front Fan gets
displayed correctly as '0':
# sysctl -a | grep fan
hw.sensors.smu0.fan0=1035 RPM (Rear Fan 0)
hw.sensors.smu0.fan1=1012 RPM (Rear fan 1)
hw.sensors.smu0.fan2=0 RPM (Front Fan)
Would be nice if more of you could regression test this.
Index: sys/arch/macppc/dev/smu.c
===================================================================
RCS file: /cvs/src/sys/arch/macppc/dev/smu.c,v
retrieving revision 1.28
diff -u -p -u -p -r1.28 smu.c
--- sys/arch/macppc/dev/smu.c 4 May 2016 08:20:58 -0000 1.28
+++ sys/arch/macppc/dev/smu.c 11 May 2016 18:29:04 -0000
@@ -565,15 +565,15 @@ smu_fan_refresh(struct smu_softc *sc, st
int error;
cmd->cmd = SMU_FAN;
- cmd->len = 2;
+ cmd->len = 1;
cmd->data[0] = 0x01; /* fan-rpm-control */
- cmd->data[1] = 0x01 << fan->reg;
error = smu_do_cmd(sc, 800);
if (error) {
fan->sensor.flags = SENSOR_FINVALID;
return (error);
}
- fan->sensor.value = (cmd->data[1] << 8) + cmd->data[2];
+ fan->sensor.value =
+ (cmd->data[fan->reg * 2 + 1] << 8) | cmd->data[fan->reg * 2 + 2];
fan->sensor.flags = 0;
return (0);
}