diff -Naur linux-2.6.21.6.orig/Documentation/thinkpad-acpi.txt linux-2.6.21.6/Documentation/thinkpad-acpi.txt
--- linux-2.6.21.6.orig/Documentation/thinkpad-acpi.txt	2007-07-08 12:46:13.000000000 -0400
+++ linux-2.6.21.6/Documentation/thinkpad-acpi.txt	2007-07-08 12:47:11.000000000 -0400
@@ -482,6 +482,7 @@
 
 	echo on  > /proc/acpi/ibm/light
 	echo off > /proc/acpi/ibm/light
+	echo toggle > /proc/acpi/ibm/light
 
 Docking / undocking -- /proc/acpi/ibm/dock
 ------------------------------------------
diff -Naur linux-2.6.21.6.orig/drivers/misc/thinkpad_acpi.c linux-2.6.21.6/drivers/misc/thinkpad_acpi.c
--- linux-2.6.21.6.orig/drivers/misc/thinkpad_acpi.c	2007-07-08 12:46:13.000000000 -0400
+++ linux-2.6.21.6/drivers/misc/thinkpad_acpi.c	2007-07-08 12:44:58.000000000 -0400
@@ -2015,12 +2015,12 @@
 		len += sprintf(p + len, "status:\t\tnot supported\n");
 	} else if (!tp_features.light_status) {
 		len += sprintf(p + len, "status:\t\tunknown\n");
-		len += sprintf(p + len, "commands:\ton, off\n");
+		len += sprintf(p + len, "commands:\ton, off, toggle\n");
 	} else {
 		if (!acpi_evalf(ec_handle, &status, "KBLT", "d"))
 			return -EIO;
 		len += sprintf(p + len, "status:\t\t%s\n", onoff(status, 0));
-		len += sprintf(p + len, "commands:\ton, off\n");
+		len += sprintf(p + len, "commands:\ton, off, toggle\n");
 	}
 
 	return len;
@@ -2042,6 +2042,17 @@
 		} else if (strlencmp(cmd, "off") == 0) {
 			cmos_cmd = 0x0d;
 			lght_cmd = 0;
+		} else if (strlencmp(cmd, "toggle") == 0) {
+			if (!acpi_evalf(ec_handle, &status, "KBLT", "d"))
+				return -EIO;
+			if (status == 0) {
+				cmos_cmd = 0x0c;
+				lght_cmd = 1;
+			}
+			else
+				cmos_cmd = 0x0d;
+				lght_cmd = 0;
+			}
 		} else
 			return -EINVAL;
 
