--- linux/include/linux/sysctl.h.orig Tue Jul 31 23:49:42 2001 +++ linux/include/linux/sysctl.h Thu Aug 2 03:41:34 2001 @@ -594,7 +594,8 @@ DEV_HWMON=2, DEV_PARPORT=3, DEV_RAID=4, - DEV_MAC_HID=5 + DEV_MAC_HID=5, + DEV_PSAUX=6, }; /* /proc/sys/dev/cdrom */ @@ -653,6 +654,13 @@ DEV_MAC_HID_MOUSE_BUTTON2_KEYCODE=4, DEV_MAC_HID_MOUSE_BUTTON3_KEYCODE=5, DEV_MAC_HID_ADB_MOUSE_SENDS_KEYCODES=6 +}; + +/* /proc/sys/dev/psaux */ +enum { + DEV_PSMOUSE_RECONNECT=1, + DEV_KBD_REPORT_UNKN=2, + DEV_KBD_REPORT_TO=3, }; #ifdef __KERNEL__ --- linux/drivers/char/pc_keyb.c.orig Fri Apr 6 19:42:55 2001 +++ linux/drivers/char/pc_keyb.c Thu Aug 2 04:01:15 2001 @@ -92,8 +92,83 @@ #define AUX_INTS_ON (KBD_MODE_KCC | KBD_MODE_SYS | KBD_MODE_MOUSE_INT | KBD_MODE_KBD_INT) #define MAX_RETRIES 60 /* some aux operations take long time*/ + #endif /* CONFIG_PSMOUSE */ +/* We want to be able to handle the psmouse reconnect token; unfortunately the + * Synaptics touchpads (and probably others too) use it for their extented + * functionality and produce them in extended mode (as set by gpm -t synps2). + * So we make this adjustable via a sysctl. garloff@suse.de, 2001-08-01 */ + +#ifdef CONFIG_SYSCTL +#include +#ifdef CONFIG_PSMOUSE +int sysctl_psmouse_reconnect = 1; +#endif +int sysctl_kbd_report_unkn = 0; +int sysctl_kbd_report_to = 0; + +static int psaux_sysctl_handler (ctl_table *ctl, int write, struct file *filp, + void *buffer, size_t *lenp) +{ + int *valp = ctl->data; + int ret = proc_dointvec(ctl, write, filp, buffer, lenp); + if (write) { + if (*valp) + *valp = 1; + } + return ret; +} + + +ctl_table psaux_table[] = { +#ifdef CONFIG_PSMOUSE + {DEV_PSMOUSE_RECONNECT, "psmouse_reconnect", &sysctl_psmouse_reconnect, + sizeof(int), 0644, NULL, &psaux_sysctl_handler}, +#endif + {DEV_KBD_REPORT_UNKN, "kbd_report_unknown", &sysctl_kbd_report_unkn, + sizeof(int), 0644, NULL, &psaux_sysctl_handler}, + {DEV_KBD_REPORT_TO, "kbd_report_timeout", &sysctl_kbd_report_to, + sizeof(int), 0644, NULL, &psaux_sysctl_handler}, + {0} +}; + +ctl_table psaux_psaux_table[] = { + {DEV_CDROM, "ps2", NULL, 0, 0555, psaux_table}, + {0} + }; + +ctl_table psaux_root_table[] = { +#ifdef CONFIG_PROC_FS + {CTL_DEV, "dev", NULL, 0, 0555, psaux_psaux_table}, +#endif /* CONFIG_PROC_FS */ + {0} + }; +static struct ctl_table_header *psaux_sysctl_header; + +static void psaux_sysctl_register (void) +{ + static int initialized; + if (initialized) return; + + psaux_sysctl_header = register_sysctl_table (psaux_root_table, 1); + /*psaux_root_table->child->de->owner = THIS_MODULE;*/ + initialized++; +} + +/* +static void psaux_sysctl_unregister (void) +{ + if (psaux_sysctl_header) + unregister_sysctl_table (psaux_sysctl_header); +} + */ +#else /* CONFIG_SYSCTL */ +#define sysctl_psmouse_reconnect 1 +#define sysctl_kbd_report_unkn 0 +#define sysctl_kbd_report_to 0 +#endif /* CONFIG_SYSCTL */ + /* * Wait for keyboard controller input buffer to drain. * @@ -123,9 +198,8 @@ mdelay(1); timeout--; } while (timeout); -#ifdef KBD_REPORT_TIMEOUTS - printk(KERN_WARNING "Keyboard timed out[1]\n"); -#endif + if (sysctl_kbd_report_to) + printk(KERN_WARNING "Keyboard timed out[1]\n"); } /* @@ -320,10 +394,8 @@ *keycode = E1_PAUSE; prev_scancode = 0; } else { -#ifdef KBD_REPORT_UNKN - if (!raw_mode) + if (!raw_mode && sysctl_kbd_report_unkn) printk(KERN_INFO "keyboard: unknown e1 escape sequence\n"); -#endif prev_scancode = 0; return 0; } @@ -348,11 +420,9 @@ if (e0_keys[scancode]) *keycode = e0_keys[scancode]; else { -#ifdef KBD_REPORT_UNKN - if (!raw_mode) + if (!raw_mode && sysctl_kbd_report_unkn) printk(KERN_INFO "keyboard: unknown scancode e0 %02x\n", scancode); -#endif return 0; } } @@ -370,11 +440,9 @@ *keycode = high_keys[scancode - SC_LIM]; if (!*keycode) { - if (!raw_mode) { -#ifdef KBD_REPORT_UNKN + if (!raw_mode && sysctl_kbd_report_unkn) { printk(KERN_INFO "keyboard: unrecognized scancode (%02x)" " - ignored\n", scancode); -#endif } return 0; } @@ -404,12 +472,15 @@ mouse_reply_expected = 0; } else if(scancode == AUX_RECONNECT){ - queue->head = queue->tail = 0; /* Flush input queue */ - __aux_write_ack(AUX_ENABLE_DEV); /* ping the mouse :) */ - return; + if (sysctl_psmouse_reconnect) { + queue->head = queue->tail = 0; /* Flush input queue */ + __aux_write_ack(AUX_ENABLE_DEV); /* ping the mouse :) */ + return; + } } + else + add_mouse_randomness(scancode); - add_mouse_randomness(scancode); if (aux_count) { int head = queue->head; @@ -511,17 +582,14 @@ if (resend) break; mdelay(1); - if (!--timeout) { -#ifdef KBD_REPORT_TIMEOUTS + if (!--timeout && sysctl_kbd_report_to) { printk(KERN_WARNING "keyboard: Timeout - AT keyboard not present?\n"); -#endif return 0; } } } while (retries-- > 0); -#ifdef KBD_REPORT_TIMEOUTS - printk(KERN_WARNING "keyboard: Too many NACKs -- noisy kbd cable?\n"); -#endif + if (sysctl_kbd_report_to) + printk(KERN_WARNING "keyboard: Too many NACKs -- noisy kbd cable?\n"); return 0; } @@ -751,6 +819,7 @@ /* Ok, finally allocate the IRQ, and off we go.. */ kbd_request_irq(keyboard_interrupt); + psaux_sysctl_register (); } #if defined CONFIG_PSMOUSE