2003-01-14 06:11:24

by Valdis Klētnieks

[permalink] [raw]
Subject: Linux 2.5.57, i8k driver versions..

The Linux 2.5.57 tarball has the 1.7 version of the i8k driver, but
the version in http://people.debian.org/~dz/i8k/i8kutils-1.17.tar.bz2
is version 1.13. A quick diff doesn't show anything that would prevent
a drop-in of the 1.13 version. What's the protocol to get this
synced to the latest-and-greatest?
--
Valdis Kletnieks
Computer Systems Senior Engineer
Virginia Tech


Attachments:
(No filename) (226.00 B)

2003-01-14 21:15:49

by James Cloos

[permalink] [raw]
Subject: [PATCH] Re: Linux 2.5.57, i8k driver versions..

>>>>> "Valdis" == Valdis Kletnieks <[email protected]> writes:

Valdis> The Linux 2.5.57 tarball has the 1.7 version of the i8k
Valdis> driver, but the version in
Valdis> http://people.debian.org/~dz/i8k/i8kutils-1.17.tar.bz2 is
Valdis> version 1.13. A quick diff doesn't show anything that would
Valdis> prevent a drop-in of the 1.13 version. What's the protocol to
Valdis> get this synced to the latest-and-greatest?

The following compiles, but has not yet been run-tested.

In addition to the diff from the 1.7 i8kutils release to the 1.17
release, I made the new globals static as per Rusty's namespace
pollution patch yesterday, and removed the reference to an include no
longer in 2.5.

It is also available from:

bk://cloos.bkbits.net/i8k-1.17

[email protected], 2003-01-14 13:23:37-05:00, [email protected]
Upgrade i8k.c to version from i8kutils-1.17

drivers/char/i8k.c | 105 ++++++++++++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 104 insertions(+), 1 deletion(-)


diff -Nru a/drivers/char/i8k.c b/drivers/char/i8k.c
--- a/drivers/char/i8k.c Tue Jan 14 16:19:19 2003
+++ b/drivers/char/i8k.c Tue Jan 14 16:19:19 2003
@@ -22,12 +22,14 @@
#include <linux/init.h>
#include <linux/proc_fs.h>
#include <linux/apm_bios.h>
+#include <linux/kbd_kern.h>
+#include <linux/timer.h>
#include <asm/uaccess.h>
#include <asm/io.h>

#include <linux/i8k.h>

-#define I8K_VERSION "1.7 21/11/2001"
+#define I8K_VERSION "1.13 14/05/2002"

#define I8K_SMM_FN_STATUS 0x0025
#define I8K_SMM_POWER_STATUS 0x0069
@@ -55,6 +57,19 @@

#define DELL_SIGNATURE "Dell Computer"

+/* Interval between polling of keys, in jiffies. */
+#define I8K_POLL_INTERVAL (HZ/20)
+#define I8K_REPEAT_DELAY 250 /* 250 ms */
+#define I8K_REPEAT_RATE 10
+
+/*
+ * (To be escaped) Scancodes for the keys. These were chosen to match other
+ * "Internet" keyboards.
+ */
+#define I8K_KEYS_UP_SCANCODE 0x30
+#define I8K_KEYS_DOWN_SCANCODE 0x2e
+#define I8K_KEYS_MUTE_SCANCODE 0x20
+
static char *supported_models[] = {
"Inspiron",
"Latitude",
@@ -67,19 +82,34 @@
static char serial_number[16] = "?";

static int force = 0;
+static int restricted = 0;
+static int handle_buttons = 0;
+static int repeat_delay = I8K_REPEAT_DELAY;
+static int repeat_rate = I8K_REPEAT_RATE;
static int power_status = 0;

+static struct timer_list i8k_keys_timer;
+
MODULE_AUTHOR("Massimo Dal Zotto ([email protected])");
MODULE_DESCRIPTION("Driver for accessing SMM BIOS on Dell laptops");
MODULE_LICENSE("GPL");
MODULE_PARM(force, "i");
+MODULE_PARM(restricted, "i");
+MODULE_PARM(handle_buttons, "i");
+MODULE_PARM(repeat_delay, "i");
+MODULE_PARM(repeat_rate, "i");
MODULE_PARM(power_status, "i");
MODULE_PARM_DESC(force, "Force loading without checking for supported models");
+MODULE_PARM_DESC(restricted, "Allow fan control if SYS_ADMIN capability set");
+MODULE_PARM_DESC(handle_buttons, "Generate keyboard events for i8k buttons");
+MODULE_PARM_DESC(repeat_delay, "I8k buttons repeat delay (ms)");
+MODULE_PARM_DESC(repeat_rate, "I8k buttons repeat rate");
MODULE_PARM_DESC(power_status, "Report power status in /proc/i8k");

static ssize_t i8k_read(struct file *, char *, size_t, loff_t *);
static int i8k_ioctl(struct inode *, struct file *, unsigned int,
unsigned long);
+static void i8k_keys_set_timer(void);

static struct file_operations i8k_fops = {
.read = i8k_read,
@@ -370,6 +400,9 @@
break;

case I8K_SET_FAN:
+ if (restricted && !capable(CAP_SYS_ADMIN)) {
+ return -EPERM;
+ }
if (copy_from_user(&val, (int *)arg, sizeof(int))) {
return -EFAULT;
}
@@ -483,6 +516,61 @@
return len;
}

+/*
+ * i8k_keys stuff. Thanks to David Bustos <[email protected]>
+ */
+
+static unsigned char i8k_keys_make_scancode(int x) {
+ switch (x) {
+ case I8K_FN_UP: return I8K_KEYS_UP_SCANCODE;
+ case I8K_FN_DOWN: return I8K_KEYS_DOWN_SCANCODE;
+ case I8K_FN_MUTE: return I8K_KEYS_MUTE_SCANCODE;
+ }
+
+ return 0;
+}
+
+static void i8k_keys_poll(unsigned long data) {
+ static int last = 0;
+ static int repeat = 0;
+
+ int curr;
+
+ curr = i8k_get_fn_status();
+ if (curr >= 0) {
+ if (curr != last) {
+ repeat = jiffies + (HZ * repeat_delay / 1000);
+
+ if (last != 0) {
+ handle_scancode(0xe0, 0);
+ handle_scancode(i8k_keys_make_scancode(last), 0);
+ }
+
+ if (curr != 0) {
+ handle_scancode(0xe0, 1);
+ handle_scancode(i8k_keys_make_scancode(curr), 1);
+ }
+ } else {
+ /* Generate keyboard repeat events with current scancode -- dz */
+ if ((curr) && (repeat_rate > 0) && (jiffies >= repeat)) {
+ repeat = jiffies + (HZ / repeat_rate);
+ handle_scancode(0xe0, 1);
+ handle_scancode(i8k_keys_make_scancode(curr), 1);
+ }
+ }
+
+ last = curr;
+ }
+
+ /* Reset the timer. */
+ i8k_keys_set_timer();
+}
+
+static void i8k_keys_set_timer() {
+ i8k_keys_timer.expires = jiffies + I8K_POLL_INTERVAL;
+ add_timer(&i8k_keys_timer);
+}
+
static char* __init string_trim(char *s, int size)
{
int len;
@@ -757,6 +845,16 @@
"Dell laptop SMM driver v%s Massimo Dal Zotto ([email protected])\n",
I8K_VERSION);

+ /* Register the i8k_keys timer. */
+ if (handle_buttons) {
+ printk(KERN_INFO
+ "i8k: enabling buttons events, delay=%d, rate=%d\n",
+ repeat_delay, repeat_rate);
+ init_timer(&i8k_keys_timer);
+ i8k_keys_timer.function = i8k_keys_poll;
+ i8k_keys_set_timer();
+ }
+
return 0;
}

@@ -770,6 +868,11 @@
{
/* Remove the proc entry */
remove_proc_entry("i8k", NULL);
+
+ /* Unregister the i8k_keys timer. */
+ while (handle_buttons && !del_timer(&i8k_keys_timer)) {
+ schedule_timeout(I8K_POLL_INTERVAL);
+ }

printk(KERN_INFO "i8k: module unloaded\n");
}

2003-01-15 21:36:02

by James Cloos

[permalink] [raw]
Subject: Re: [PATCH] Re: Linux 2.5.57, i8k driver versions..

The i8k.c upgrade included code that is not required in 2.5. The
patch below eliminates the unnecessary stuff, leaving the one new
feature that is useful: the option to restrict fan control to
processes with CAP_SYS_ADMIN set.


[email protected], 2003-01-15 16:24:02-05:00, [email protected]
The input system in 2.5 is able to see the volume keys on inspiron
notebooks w/o help from i8k.c. This patch therefore removes the
new code from i8kutils-1.17 for feeding those keypresses to the
keyboard driver.

This leaves only MODULE_PARM(restricted, "i") as the useful addition
to what was in 2.5.58's i8k.c. This module parm restricts control of
the system fans to processes with CAP_SYS_ADMIN set.

drivers/char/i8k.c | 97 -----------------------------------------------------
1 files changed, 97 deletions(-)


diff -Nru a/drivers/char/i8k.c b/drivers/char/i8k.c
--- a/drivers/char/i8k.c Wed Jan 15 16:31:55 2003
+++ b/drivers/char/i8k.c Wed Jan 15 16:31:55 2003
@@ -22,8 +22,6 @@
#include <linux/init.h>
#include <linux/proc_fs.h>
#include <linux/apm_bios.h>
-#include <linux/kbd_kern.h>
-#include <linux/timer.h>
#include <asm/uaccess.h>
#include <asm/io.h>

@@ -57,19 +55,6 @@

#define DELL_SIGNATURE "Dell Computer"

-/* Interval between polling of keys, in jiffies. */
-#define I8K_POLL_INTERVAL (HZ/20)
-#define I8K_REPEAT_DELAY 250 /* 250 ms */
-#define I8K_REPEAT_RATE 10
-
-/*
- * (To be escaped) Scancodes for the keys. These were chosen to match other
- * "Internet" keyboards.
- */
-#define I8K_KEYS_UP_SCANCODE 0x30
-#define I8K_KEYS_DOWN_SCANCODE 0x2e
-#define I8K_KEYS_MUTE_SCANCODE 0x20
-
static char *supported_models[] = {
"Inspiron",
"Latitude",
@@ -83,33 +68,21 @@

static int force = 0;
static int restricted = 0;
-static int handle_buttons = 0;
-static int repeat_delay = I8K_REPEAT_DELAY;
-static int repeat_rate = I8K_REPEAT_RATE;
static int power_status = 0;

-static struct timer_list i8k_keys_timer;
-
MODULE_AUTHOR("Massimo Dal Zotto ([email protected])");
MODULE_DESCRIPTION("Driver for accessing SMM BIOS on Dell laptops");
MODULE_LICENSE("GPL");
MODULE_PARM(force, "i");
MODULE_PARM(restricted, "i");
-MODULE_PARM(handle_buttons, "i");
-MODULE_PARM(repeat_delay, "i");
-MODULE_PARM(repeat_rate, "i");
MODULE_PARM(power_status, "i");
MODULE_PARM_DESC(force, "Force loading without checking for supported models");
MODULE_PARM_DESC(restricted, "Allow fan control if SYS_ADMIN capability set");
-MODULE_PARM_DESC(handle_buttons, "Generate keyboard events for i8k buttons");
-MODULE_PARM_DESC(repeat_delay, "I8k buttons repeat delay (ms)");
-MODULE_PARM_DESC(repeat_rate, "I8k buttons repeat rate");
MODULE_PARM_DESC(power_status, "Report power status in /proc/i8k");

static ssize_t i8k_read(struct file *, char *, size_t, loff_t *);
static int i8k_ioctl(struct inode *, struct file *, unsigned int,
unsigned long);
-static void i8k_keys_set_timer(void);

static struct file_operations i8k_fops = {
.read = i8k_read,
@@ -516,61 +489,6 @@
return len;
}

-/*
- * i8k_keys stuff. Thanks to David Bustos <[email protected]>
- */
-
-static unsigned char i8k_keys_make_scancode(int x) {
- switch (x) {
- case I8K_FN_UP: return I8K_KEYS_UP_SCANCODE;
- case I8K_FN_DOWN: return I8K_KEYS_DOWN_SCANCODE;
- case I8K_FN_MUTE: return I8K_KEYS_MUTE_SCANCODE;
- }
-
- return 0;
-}
-
-static void i8k_keys_poll(unsigned long data) {
- static int last = 0;
- static int repeat = 0;
-
- int curr;
-
- curr = i8k_get_fn_status();
- if (curr >= 0) {
- if (curr != last) {
- repeat = jiffies + (HZ * repeat_delay / 1000);
-
- if (last != 0) {
- handle_scancode(0xe0, 0);
- handle_scancode(i8k_keys_make_scancode(last), 0);
- }
-
- if (curr != 0) {
- handle_scancode(0xe0, 1);
- handle_scancode(i8k_keys_make_scancode(curr), 1);
- }
- } else {
- /* Generate keyboard repeat events with current scancode -- dz */
- if ((curr) && (repeat_rate > 0) && (jiffies >= repeat)) {
- repeat = jiffies + (HZ / repeat_rate);
- handle_scancode(0xe0, 1);
- handle_scancode(i8k_keys_make_scancode(curr), 1);
- }
- }
-
- last = curr;
- }
-
- /* Reset the timer. */
- i8k_keys_set_timer();
-}
-
-static void i8k_keys_set_timer() {
- i8k_keys_timer.expires = jiffies + I8K_POLL_INTERVAL;
- add_timer(&i8k_keys_timer);
-}
-
static char* __init string_trim(char *s, int size)
{
int len;
@@ -845,16 +763,6 @@
"Dell laptop SMM driver v%s Massimo Dal Zotto ([email protected])\n",
I8K_VERSION);

- /* Register the i8k_keys timer. */
- if (handle_buttons) {
- printk(KERN_INFO
- "i8k: enabling buttons events, delay=%d, rate=%d\n",
- repeat_delay, repeat_rate);
- init_timer(&i8k_keys_timer);
- i8k_keys_timer.function = i8k_keys_poll;
- i8k_keys_set_timer();
- }
-
return 0;
}

@@ -868,11 +776,6 @@
{
/* Remove the proc entry */
remove_proc_entry("i8k", NULL);
-
- /* Unregister the i8k_keys timer. */
- while (handle_buttons && !del_timer(&i8k_keys_timer)) {
- schedule_timeout(I8K_POLL_INTERVAL);
- }

printk(KERN_INFO "i8k: module unloaded\n");
}