Hi List, The changes I've sent to Lukasz seem to work well for him and might be worth evaluating for inclusion in a future version of ipmitool to get a correct reading on non-linear analog sensors.
Best regards, Holger Liebig -----Original Message----- From: Lukasz Michalski [mailto:[EMAIL PROTECTED] Sent: Monday, May 19, 2008 8:32 PM To: Liebig, Holger Subject: Re: [Ipmitool-devel] FSC-1501 motherboard On Monday 19 of May 2008 15:44:48 you wrote: > > More or less. We do not have CVS Access from behind the corporate > > firewall, so I took a snapshot some time ago at home. I can send you > > a complete tarball if you need it. > > > > > > > > Let me know if it works for you. > > Correction: This is from an older version, based on 1.8.2. > A quick hacked/merged version based on 1.8.9 is attached. > > Please let me know if it works for you. > Yes, it works perfectly! I have reading from CPU Fan and System Fan 3. They are replaced - CPU Fan is reported as System Fan 3 and System Fan 3 is reported as CPU Fan. I discovered it by disconnecting System Fan 3 for a while. As far as I understand this is because BMC is reporting it like that and this is not a problem for me. I attached your changes without commented code as a patch made against 1.8.9 sources. Although I don't have any knowedge about IPMI standard and OpenIPMI API, from your changes I see that they are generic and this patch can be added to ipmitool? Best Regards and thanks again for help, Ćukasz
diff -ur ipmitool-1.8.9/lib/ipmi_sensor.c ipmitool-1.8.9-patched/lib/ipmi_sensor.c
--- ipmitool-1.8.9/lib/ipmi_sensor.c 2007-02-22 09:38:57.000000000 +0100
+++ ipmitool-1.8.9-patched/lib/ipmi_sensor.c 2008-05-19 20:04:18.584540671 +0200
@@ -47,6 +47,57 @@
#define READING_UNAVAILABLE 0x20
static
+int
+ipmi_sensor_get_sensor_reading_factors(
+ struct ipmi_intf * intf,
+ struct sdr_record_full_sensor * sensor,
+ uint8_t reading)
+{
+ struct ipmi_rq req;
+ struct ipmi_rs * rsp;
+ uint8_t req_data[2];
+
+ char id[17];
+
+ if (intf == NULL || sensor == NULL)
+ return -1;
+
+ memset(id, 0, sizeof(id));
+ memcpy(id, sensor->id_string, 16);
+
+ req_data[0] = sensor->keys.sensor_num;
+ req_data[1] = reading;
+
+ memset(&req, 0, sizeof(req));
+ req.msg.netfn = IPMI_NETFN_SE;
+ req.msg.cmd = GET_SENSOR_FACTORS;
+ req.msg.data = req_data;
+ req.msg.data_len = sizeof(req_data);
+
+ rsp = intf->sendrecv(intf, &req);
+
+ if (rsp == NULL) {
+ lprintf(LOG_ERR, "Error updating reading factor for sensor %s (#%02x)",
+ id, sensor->keys.sensor_num);
+ return -1;
+ } else if (rsp->ccode) {
+ return -1;
+ } else {
+ /* Update SDR copy with updated Reading Factors for this reading */
+ /* Note:
+ * The Format of the returned data is exactly as in the SDR definition (Little Endian Format),
+ * therefore we can use raw copy operation here.
+ * Note: rsp->data[0] would point to the next valid entry in the sampling table
+ */
+ // BUGBUG: uses 'hardcoded' length information from SDR Definition
+ memcpy(&sensor->mtol, &rsp->data[1], sizeof(sensor->mtol));
+ memcpy(&sensor->bacc, &rsp->data[3], sizeof(sensor->bacc));
+ return 0;
+ }
+
+}
+
+static
struct ipmi_rs *
ipmi_sensor_set_sensor_thresholds(struct ipmi_intf *intf,
uint8_t sensor,
@@ -177,12 +228,6 @@
memset(id, 0, sizeof (id));
memcpy(id, sensor->id_string, 16);
- /* only handle linear and linearized sensors (for now) */
- if (sensor->linearization >= SDR_SENSOR_L_NONLINEAR) {
- printf("sensor %s non-linear!\n", id);
- return -1;
- }
-
/*
* Get current reading
*/
@@ -199,6 +244,15 @@
} else if (!(rsp->data[1] & SCANNING_DISABLED)) {
validread = 0;
} else {
+
+ /* Non linear sensors might provide updated reading factors */
+ if (sensor->linearization>=SDR_SENSOR_L_NONLINEAR && sensor->linearization<=0x7F) {
+ if (ipmi_sensor_get_sensor_reading_factors(intf, sensor, rsp->data[0]) < 0){
+ printf("sensor %s non-linear!\n", id);
+ return -1;
+ }
+ }
+
/* convert RAW reading into units */
val = (rsp->data[0] > 0)
? sdr_convert_sensor_reading(sensor, rsp->data[0])
signature.asc
Description: signature.asc
------------------------------------------------------------------------- This SF.net email is sponsored by: Microsoft Defy all challenges. Microsoft(R) Visual Studio 2008. http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________ Ipmitool-devel mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/ipmitool-devel
