[Please CC me, I am not on this list.]
After recently updating my XFree86 CVS to 4.3 branch and compiling it,
I notized that X needs ages for starting and console switches (VT -> X,
not X -> VT).
It turned out that the major reason for that is the mouse driver which
tries 11 times to reset the mouse doing several hundred usleeps.
Now, the actual trouble is due to the fact that I am using an IMPS/2
mouse and GPM as repeater:
--------<XF86Config>---------
Section "InputDevice"
Driver "mouse"
Identifier "Mouse[1]"
Option "ButtonNumber" "5"
Option "Device" "/dev/gpmdata" <-- GPM
Option "Name" "WheelMouse"
Option "Protocol" "ImPS/2"
Option "ZAxisMapping" "4 5"
Option "CorePointer"
Option "SkipInit" "1" <-- see patch below
EndSection
-----------------------------
When switching from VT to X console, XFree86 opens /dev/gpmdata
and wants to configrure it -- something it actually cannot:
initMouseHW (Xserver/hw/xfree86/input/mouse/mouse.c) gets called
which executes the block (around line 2600)
if(ps2Init) { REDO: ... if(paramlen>0) { if(!ps2SendPacket()) ...
In the function ps2SendPacket() from (dito/pnp.c):
it traps the following code:
/* Some mice accidently enter wrap mode during init */
if (c == *(bytes + i) /* wrap mode */
&& (*(bytes + i) != 0xEC)) /* avoid recursion */
ps2DisableWrapMode(pInfo);
(because strace told me that after writing a byte to /dev/gpmdata,
XFree86 reads exactly this byte again thinking it is "wrap mode"
triggering a ps2DisableWrapMode() calling again ps2SendPacket(),
having again 10 tries, all that with usleep(10000)).
In fact, we loop the code with the REDO: statement above for 11 times
until finally bailing out without having done any initialisation.
This turns out to take quite a lot of time spent in useless usleeps.
But hey, we can do that more quckly by simply skipping this senseless
tries right from the beginning:
The solution is simple. The device is managed by GPM, so there is
nothing to configure anyways, so XFree86 does not need to.
I wrote the following quick hack which skips the PS/2 init in case
this is requested by
Option "SkipInit" "1"
The patch works perfectly for me reducing VT switch time
about 5 seconds (!!).
I.e. before the patch, the windows appear filled with background color
and X freezes for 5 seconds -- after the patch, the windows appear
immedately with proper content.
However, due to *NOTE* (see patch), this is just a quick hack.
The skip_init should be included in pInfo->private or so.
(Directory: xc/programs/Xserver/hw/xfree86/input/mouse)
-----------------------------<patch>-----------------------------------------
--- mouse.c-orig 2003-04-02 13:16:19.000000000 +0200
+++ mouse.c 2003-04-02 14:42:16.000000000 +0200
@@ -198,7 +198,8 @@
OPTION_FLOW_CONTROL,
OPTION_VTIME,
OPTION_VMIN,
- OPTION_DRAGLOCKBUTTONS
+ OPTION_DRAGLOCKBUTTONS,
+ OPTION_SKIPINIT
} MouseOpts;
static const OptionInfoRec mouseOptions[] = {
@@ -237,6 +238,7 @@
{ OPTION_VTIME, "VTime", OPTV_INTEGER, {0}, FALSE },
{ OPTION_VMIN, "VMin", OPTV_INTEGER, {0}, FALSE },
{ OPTION_DRAGLOCKBUTTONS, "DragLockButtons",OPTV_STRING, {0}, FALSE },
+ { OPTION_SKIPINIT, "SkipInit", OPTV_BOOLEAN, {0}, FALSE },
/* end serial options */
{ -1, NULL, OPTV_NONE, {0}, FALSE }
};
@@ -362,6 +364,8 @@
}
#endif
+Bool skip_init=0; <-- *NOTE*
+
/* Process options common to all mouse types. */
static void
MouseCommonOptions(InputInfoPtr pInfo)
@@ -657,6 +661,10 @@
from = X_CONFIG;
xf86Msg(from, "%s: Buttons: %d\n", pInfo->name, pMse->buttons);
+ if (xf86SetBoolOption(pInfo->options, "SkipInit", FALSE)) {
+ xf86Msg(X_CONFIG, "%s: skip init\n", pInfo->name);
+ skip_init=1;
+ }
}
/*
* map bits corresponding to lock buttons.
@@ -2389,7 +2397,7 @@
unsigned char *param = NULL;
int paramlen = 0;
int count = 10;
- Bool ps2Init = TRUE;
+ Bool ps2Init = !skip_init;
switch (pMse->protocolID) {
case PROT_LOGI: /* Logitech Mice */
----------------------------------------------------------------------------
Would you please consider applying some patch like that for those
using GPM?
(It's cool, because using GPM is now faster than using /dev/psaux.)
Especially note that when using GPM, this patch does NOT change
anything. By setting ps2Init = !skip_init, we do not enter the
config block in initMouseHW(). Previous behavior was to enter it
and leave it after 11 Resets without having done anything else
than trying 11 times to reset.
[Please CC me, I am not on this list.]
Regards,
Wolfgang
_______________________________________________
Devel mailing list
[EMAIL PROTECTED]
http://XFree86.Org/mailman/listinfo/devel