Talk:Patch for controlling fan speed

From ThinkWiki
Revision as of 23:04, 1 November 2005 by Thinker (Talk | contribs) (Patch for 2.6.14 with gkrellm compatibility)

Jump to: navigation, search

I can confirm that it works on Thinkpad T43 here. However after applying the patch, the fan speed monitor of gkrellm 2.2.7 cannot read value correctly. Maybe we gkrellm is reading the second line for speed but instead find the line for level, so it got confused? Would it be possible to interchange the lines so that speed still appears in the second line and level appears in the third instead? I'm no coder, just a suggestion to improve the patch. --Jiang


I'd say it's a bug in gkrellm. It should parse the line header rather than relying on line numbers. But feel free to change (and test) the patch if you wish.

--Thinker 05:14, 26 Oct 2005 (CEST)


patch to keep gkrell working against 2.6.14

As in "works for me on a T43p", use with caution at your own risk. And thanks to thinker for the original patch, very nice work.

--- drivers/acpi/ibm_acpi.c.orig        2005-11-01 19:47:44.262270250 +0100
+++ drivers/acpi/ibm_acpi.c     2005-11-01 20:16:16.081252250 +0100
@@ -1465,6 +1465,7 @@
 {
        int len = 0;
        int s;
+       char status_read = 0;
        u8 lo, hi, status;

        if (gfan_handle) {
@@ -1477,9 +1478,11 @@
                /* all except 570, 600e/x, 770e, 770x */
                if (!acpi_ec_read(fan_status_offset, &status))
                        len += sprintf(p + len, "status:\t\tunreadable\n");
-               else
+               else {
                        len += sprintf(p + len, "status:\t\t%s\n",
-                                      enabled(status, 7));
+                                     status ? "enabled" : "disabled");
+                       status_read = 1;
+               }

                if (!acpi_ec_read(fan_rpm_offset, &lo) ||
                    !acpi_ec_read(fan_rpm_offset + 1, &hi))
@@ -1487,6 +1490,14 @@
                else
                        len += sprintf(p + len, "speed:\t\t%d\n",
                                       (hi << 8) + lo);
+               if (status_read) {
+                       if (status & 0x40)
+                               len += sprintf(p + len, "level:\t\tdisengaged\n");
+                       else if (status & 0x80)
+                               len += sprintf(p + len, "level:\t\tauto\n");
+                       else
+                               len += sprintf(p + len, "level:\t\t%d\n", status);
+               }
        }

        if (sfan_handle)
@@ -1495,7 +1506,10 @@
                               " (<level> is 0-7)\n");
        if (!gfan_handle)
                /* all except 570, 600e/x, 770e, 770x */
-               len += sprintf(p + len, "commands:\tenable, disable\n");
+               len += sprintf(p + len, 
+                             "commands:\tenable, disable, level <level>\n"
+                             "         \t(<level> is 0-7, auto "
+                             "or disengaged)\n");
        if (fans_handle)
                /* X31, X40 */
                len += sprintf(p + len, "commands:\tspeed <speed>"
@@ -1516,7 +1530,8 @@
                        /* 570, 770x-JL */
                        if (!acpi_evalf(sfan_handle, NULL, NULL, "vd", level))
                                return -EIO;
-               } else if (!gfan_handle && strlencmp(cmd, "enable") == 0) {
+               } else if (!gfan_handle && ( (strlencmp(cmd, "enable") == 0) || 
+                               (strlencmp(cmd, "level auto") == 0) ) ) {
                        /* all except 570, 600e/x, 770e, 770x */
                        if (!acpi_ec_write(fan_status_offset, 0x80))
                                return -EIO;
@@ -1524,6 +1539,17 @@
                        /* all except 570, 600e/x, 770e, 770x */
                        if (!acpi_ec_write(fan_status_offset, 0x00))
                                return -EIO;
+               } else if (!gfan_handle &&
+                          strlencmp(cmd, "level disengaged") == 0) {
+                       /* all except 570, 600e/x, 770e, 770x */
+                       if (!acpi_ec_write(fan_status_offset, 0x40))
+                               return -EIO;
+               } else if (!gfan_handle &&
+                   sscanf(cmd, "level %d", &level) == 1 &&
+                   level >=0 && level <= 7) {
+                       /* all except 570, 600e/x, 770e, 770x */
+                       if (!acpi_ec_write(fan_status_offset, level))
+                               return -EIO;
                } else if (fans_handle &&
                           sscanf(cmd, "speed %d", &speed) == 1 &&
                           speed >= 0 && speed <= 65535) {

--Spiney

Looks excellent, why not add it to the article page? Also, care to provide a license (preferably public domain like my patch) so the kernel guys can handle it? Speaking of which, the kernel people seem to like their patches generated via "diff -up vanilla-kernel-2.6.14 patched-kernel-2.6.14".

--Thinker 22:04, 1 Nov 2005 (CET)