After working out the symptoms of a problem I was having using my scroll mouse with my KVM switch when running 2.6 kernels, I made this patch which fixes the problem for me. I think it would be useful to have this in the kernel, especially since it has other uses too. I have a Logitech mouse with a scroll wheel that 2.6 kernels detect as supporting the Logitech ps2++ protocol, and enable it as such. My KVM switch supports only the Microsoft imps2 protocol for using the scroll wheel, so after switching away from a box running a 2.6 kernel and back again, my scroll wheel no longer works; evbug doesn't see any mouse events at all when I turn the scroll wheel. 2.4 (and Windows) don't have this problem because they use imps2 drivers, which my mouse is compatible with. So the appended patch creates a new module/boot parameter, psmouse_imps2, largely copied =66rom psmouse_noext. With the option, the mouse detection is limited to only the base ps2 protocol and the imps2 extensions, my mouse is detected as a generic imps/2 device, and the scroll wheel works properly again. I've been using this patch for about a month. I've since seen another use for this parameter; with it it is possible to disable the synaptics touchpad driver and still use an external imps2 mouse. I'm not sure if short-circuiting the mouse detection this way might leave some mice wedged, or cause them to be improperly detected though. Do the tests for imps/2 mice depend on any of the commands in the detection this patch skips to initialize the mouse somehow? This patch is against -test4; it applies to -test4-mm4 with offsets (I'm running -mm4). More than half the length of the patch is indentation. Is there a possibility of getting this applied? Documentation/kernel-parameters.txt | 2 drivers/input/mouse/psmouse-base.c | 112 +++++++++++++++++++----------------- 2 files changed, 64 insertions(+), 50 deletions(-) diff -puN Documentation/kernel-parameters.txt~psmouse_ipms2-option Documentation/kernel-parameters.txt --- 25/Documentation/kernel-parameters.txt~psmouse_ipms2-option 2003-08-31 22:26:10.000000000 -0700 +++ 25-akpm/Documentation/kernel-parameters.txt 2003-08-31 22:26:10.000000000 -0700 @@ -786,6 +786,8 @@ running once the system is up. before loading. See Documentation/ramdisk.txt. + psmouse_imps2 [HW,MOUSE] Probe only for Intellimouse PS2 mouse protocol extensions + psmouse_noext [HW,MOUSE] Disable probing for PS2 mouse protocol extensions psmouse_resetafter= diff -puN drivers/input/mouse/psmouse-base.c~psmouse_ipms2-option drivers/input/mouse/psmouse-base.c --- 25/drivers/input/mouse/psmouse-base.c~psmouse_ipms2-option 2003-08-31 22:26:10.000000000 -0700 +++ 25-akpm/drivers/input/mouse/psmouse-base.c 2003-08-31 22:26:10.000000000 -0700 @@ -24,6 +24,8 @@ MODULE_AUTHOR("Vojtech Pavlik "); MODULE_DESCRIPTION("PS/2 mouse driver"); +MODULE_PARM(psmouse_imps2, "1i"); +MODULE_PARM_DESC(psmouse_imps2, "Limit protocol extensions to the Intellimouse protocol."); MODULE_PARM(psmouse_noext, "1i"); MODULE_PARM_DESC(psmouse_noext, "Disable any protocol extensions. Useful for KVM switches."); MODULE_PARM(psmouse_resolution, "i"); @@ -36,6 +38,7 @@ MODULE_LICENSE("GPL"); #define PSMOUSE_LOGITECH_SMARTSCROLL 1 +static int psmouse_imps2; static int psmouse_noext; int psmouse_resolution; int psmouse_smartscroll = PSMOUSE_LOGITECH_SMARTSCROLL; @@ -272,66 +275,68 @@ static int psmouse_extensions(struct psm if (psmouse_noext) return PSMOUSE_PS2; -/* - * Try Synaptics TouchPad magic ID - */ - - param[0] = 0; - psmouse_command(psmouse, param, PSMOUSE_CMD_SETRES); - psmouse_command(psmouse, param, PSMOUSE_CMD_SETRES); - psmouse_command(psmouse, param, PSMOUSE_CMD_SETRES); - psmouse_command(psmouse, param, PSMOUSE_CMD_SETRES); - psmouse_command(psmouse, param, PSMOUSE_CMD_GETINFO); + if (!psmouse_imps2) { - if (param[1] == 0x47) { - psmouse->vendor = "Synaptics"; - psmouse->name = "TouchPad"; - if (!synaptics_init(psmouse)) - return PSMOUSE_SYNAPTICS; - else - return PSMOUSE_PS2; - } + /* + * Try Synaptics TouchPad magic ID + */ -/* - * Try Genius NetMouse magic init. - */ + param[0] = 0; + psmouse_command(psmouse, param, PSMOUSE_CMD_SETRES); + psmouse_command(psmouse, param, PSMOUSE_CMD_SETRES); + psmouse_command(psmouse, param, PSMOUSE_CMD_SETRES); + psmouse_command(psmouse, param, PSMOUSE_CMD_SETRES); + psmouse_command(psmouse, param, PSMOUSE_CMD_GETINFO); + + if (param[1] == 0x47) { + psmouse->vendor = "Synaptics"; + psmouse->name = "TouchPad"; + if (!synaptics_init(psmouse)) + return PSMOUSE_SYNAPTICS; + else + return PSMOUSE_PS2; + } - param[0] = 3; - psmouse_command(psmouse, param, PSMOUSE_CMD_SETRES); - psmouse_command(psmouse, NULL, PSMOUSE_CMD_SETSCALE11); - psmouse_command(psmouse, NULL, PSMOUSE_CMD_SETSCALE11); - psmouse_command(psmouse, NULL, PSMOUSE_CMD_SETSCALE11); - psmouse_command(psmouse, param, PSMOUSE_CMD_GETINFO); + /* + * Try Genius NetMouse magic init. + */ - if (param[0] == 0x00 && param[1] == 0x33 && param[2] == 0x55) { + param[0] = 3; + psmouse_command(psmouse, param, PSMOUSE_CMD_SETRES); + psmouse_command(psmouse, NULL, PSMOUSE_CMD_SETSCALE11); + psmouse_command(psmouse, NULL, PSMOUSE_CMD_SETSCALE11); + psmouse_command(psmouse, NULL, PSMOUSE_CMD_SETSCALE11); + psmouse_command(psmouse, param, PSMOUSE_CMD_GETINFO); - set_bit(BTN_EXTRA, psmouse->dev.keybit); - set_bit(BTN_SIDE, psmouse->dev.keybit); - set_bit(REL_WHEEL, psmouse->dev.relbit); + if (param[0] == 0x00 && param[1] == 0x33 && param[2] == 0x55) { - psmouse->vendor = "Genius"; - psmouse->name = "Wheel Mouse"; - return PSMOUSE_GENPS; - } + set_bit(BTN_EXTRA, psmouse->dev.keybit); + set_bit(BTN_SIDE, psmouse->dev.keybit); + set_bit(REL_WHEEL, psmouse->dev.relbit); -/* - * Try Logitech magic ID. - */ + psmouse->vendor = "Genius"; + psmouse->name = "Wheel Mouse"; + return PSMOUSE_GENPS; + } - param[0] = 0; - psmouse_command(psmouse, param, PSMOUSE_CMD_SETRES); - psmouse_command(psmouse, NULL, PSMOUSE_CMD_SETSCALE11); - psmouse_command(psmouse, NULL, PSMOUSE_CMD_SETSCALE11); - psmouse_command(psmouse, NULL, PSMOUSE_CMD_SETSCALE11); - param[1] = 0; - psmouse_command(psmouse, param, PSMOUSE_CMD_GETINFO); + /* + * Try Logitech magic ID. + */ - if (param[1]) { - int type = ps2pp_detect_model(psmouse, param); - if (type) - return type; + param[0] = 0; + psmouse_command(psmouse, param, PSMOUSE_CMD_SETRES); + psmouse_command(psmouse, NULL, PSMOUSE_CMD_SETSCALE11); + psmouse_command(psmouse, NULL, PSMOUSE_CMD_SETSCALE11); + psmouse_command(psmouse, NULL, PSMOUSE_CMD_SETSCALE11); + param[1] = 0; + psmouse_command(psmouse, param, PSMOUSE_CMD_GETINFO); + + if (param[1]) { + int type = ps2pp_detect_model(psmouse, param); + if (type) + return type; + } } - /* * Try IntelliMouse magic init. */ @@ -614,6 +619,12 @@ static struct serio_dev psmouse_dev = { }; #ifndef MODULE +static int __init psmouse_imps2_setup(char *str) +{ + psmouse_imps2 = 1; + return 1; +} + static int __init psmouse_noext_setup(char *str) { psmouse_noext = 1; @@ -638,6 +649,7 @@ static int __init psmouse_resetafter_set return 1; } +__setup("psmouse_imps2", psmouse_imps2_setup); __setup("psmouse_noext", psmouse_noext_setup); __setup("psmouse_resolution=", psmouse_resolution_setup); __setup("psmouse_smartscroll=", psmouse_smartscroll_setup); _