[PATCH driver/input/synaptics] For serial devices try reconnecting if device is wedged.
Daniel Stone
daniel at fooishbar.org
Mon Jul 29 07:21:05 PDT 2013
Hi,
On 29 July 2013 14:55, Mark Kettenis <mark.kettenis at xs4all.nl> wrote:
> C99, 7.1.3 Reserved identifiers:
>
> -- All identifiers that begin with an underscore and either an
> uppercase letter or another underscore are always reserved for
> any use.
>
> -- All identifiers that begin with an underscore are always reserved
> for use as identifiers with file scope in both the ordinary and
> tag name spaces.
>
>
> ... If the program declares or defines an identifier in a context
> in which it is reserved (other than as allowed by 7.1.4), or
> defines a reserved identifier as a macro name, the behavior is
> undefined.
>
> POSIX has similar provisions.
Ah yes, you're right: I'd forgotten about the uppercase rule. A dumb
rule, but a rule nonetheless. The further provision is that you're
not allowed to use anything beginning with an underscore at all in the
global namespace.
So, _deviceOn would be fine here.
>> nightslugs:~/x/xorg/xserver(master)% g -r '^_' **/*.[ch] | grep -v _X_
>> | wc -l
>> 1857
>
> That doesn't make it right.
I'll happily ack patches to de-underscore XKB, which is the primary
offender here.
Cheers,
Daniel
>> >> Signed-off-by: Takashi Iwai <tiwai at suse.de>
>> >> Signed-off-by: Egbert Eich <eich at freedesktop.org>
>> >> ---
>> >> src/eventcomm.c | 3 ++-
>> >> src/synaptics.c | 56 +++++++++++++++++++++++++++++++++++++++++++++++-------
>> >> src/synapticsstr.h | 3 +++
>> >> 3 files changed, 54 insertions(+), 8 deletions(-)
>> >>
>> >> diff --git a/src/eventcomm.c b/src/eventcomm.c
>> >> index 258a538..86b74cb 100644
>> >> --- a/src/eventcomm.c
>> >> +++ b/src/eventcomm.c
>> >> @@ -638,7 +638,8 @@ EventReadHwState(InputInfoPtr pInfo,
>> >> }
>> >>
>> >> while (SynapticsReadEvent(pInfo, &ev)) {
>> >> - switch (ev.type) {
>> >> + priv->comm_read++;
>> >> + switch (ev.type) {
>> >> case EV_SYN:
>> >> switch (ev.code) {
>> >> case SYN_REPORT:
>> >> diff --git a/src/synaptics.c b/src/synaptics.c
>> >> index f0a8269..31e147c 100644
>> >> --- a/src/synaptics.c
>> >> +++ b/src/synaptics.c
>> >> @@ -920,18 +920,30 @@ DeviceControl(DeviceIntPtr dev, int mode)
>> >> }
>> >>
>> >> static int
>> >> -DeviceOn(DeviceIntPtr dev)
>> >> +_DeviceOn(InputInfoPtr pInfo)
>> >> {
>> >> - InputInfoPtr pInfo = dev->public.devicePrivate;
>> >> SynapticsPrivate *priv = (SynapticsPrivate *) (pInfo->private);
>> >> + int n;
>> >>
>> >> DBG(3, "Synaptics DeviceOn called\n");
>> >>
>> >> - pInfo->fd = xf86OpenSerial(pInfo->options);
>> >> + for (n = priv->retries; n >= 0; n--) {
>> >> + pInfo->fd = xf86OpenSerial(pInfo->options);
>> >> + if (pInfo->fd != -1)
>> >> + break;
>> >> + if (n)
>> >> + xf86Msg(X_WARNING, "%s: cannot open input device - "
>> >> + "retrying %d more times\n", pInfo->name, n);
>> >> + }
>> >> if (pInfo->fd == -1) {
>> >> xf86IDrvMsg(pInfo, X_WARNING, "cannot open input device\n");
>> >> return !Success;
>> >> }
>> >> + /* This has succeeded once, so chances are the hardware *really* is present
>> >> + * - this is not a hotplug device after all.
>> >> + * Without trying really hard on some machines with some kernels the device
>> >> + * won't be found after S3/S4 again. */
>> >> + priv->retries = 4;
>> >>
>> >> if (priv->proto_ops->DeviceOnHook &&
>> >> !priv->proto_ops->DeviceOnHook(pInfo, &priv->synpara))
>> >> @@ -956,11 +968,21 @@ DeviceOn(DeviceIntPtr dev)
>> >> }
>> >>
>> >> xf86AddEnabledDevice(pInfo);
>> >> - dev->public.on = TRUE;
>> >>
>> >> return Success;
>> >> }
>> >>
>> >> +static int
>> >> +DeviceOn(DeviceIntPtr dev)
>> >> +{
>> >> + int ret = _DeviceOn(dev->public.devicePrivate);
>> >> +
>> >> + if (ret == Success)
>> >> + dev->public.on = TRUE;
>> >> +
>> >> + return ret;
>> >> +}
>> >> +
>> >> static void
>> >> SynapticsReset(SynapticsPrivate * priv)
>> >> {
>> >> @@ -995,9 +1017,8 @@ SynapticsReset(SynapticsPrivate * priv)
>> >> }
>> >>
>> >> static int
>> >> -DeviceOff(DeviceIntPtr dev)
>> >> +_DeviceOff(InputInfoPtr pInfo)
>> >> {
>> >> - InputInfoPtr pInfo = dev->public.devicePrivate;
>> >> SynapticsPrivate *priv = (SynapticsPrivate *) (pInfo->private);
>> >> Bool rc = Success;
>> >>
>> >> @@ -1018,11 +1039,18 @@ DeviceOff(DeviceIntPtr dev)
>> >> xf86CloseSerial(pInfo->fd);
>> >> pInfo->fd = -1;
>> >> }
>> >> - dev->public.on = FALSE;
>> >> return rc;
>> >> }
>> >>
>> >> static int
>> >> +DeviceOff(DeviceIntPtr dev)
>> >> +{
>> >> + int ret = _DeviceOff(dev->public.devicePrivate);
>> >> + dev->public.on = FALSE;
>> >> + return ret;
>> >> +}
>> >> +
>> >> +static int
>> >> DeviceClose(DeviceIntPtr dev)
>> >> {
>> >> Bool RetValue;
>> >> @@ -1469,6 +1497,7 @@ ReadInput(InputInfoPtr pInfo)
>> >>
>> >> SynapticsResetTouchHwState(hw, FALSE);
>> >>
>> >> + priv->comm_read = 0;
>> >> while (SynapticsGetHwState(pInfo, priv, hw)) {
>> >> /* Semi-mt device touch slots do not track touches. When there is a
>> >> * change in the number of touches, we must disregard the temporary
>> >> @@ -1487,6 +1516,19 @@ ReadInput(InputInfoPtr pInfo)
>> >> newDelay = TRUE;
>> >> }
>> >>
>> >> + if (!priv->comm_read) {
>> >> + /* strange callback, check the device and reconnect if needed */
>> >> + if (!priv->reconnecting) {
>> >> + priv->reconnecting = 1;
>> >> + xf86Msg(X_WARNING, "%s: reconnecting device...\n", pInfo->name);
>> >> + _DeviceOff(pInfo);
>> >> + usleep(100*1000);
>> >> + _DeviceOn(pInfo);
>> >> + xf86Msg(X_WARNING, "%s: reconnection done\n", pInfo->name);
>> >> + } else
>> >> + priv->reconnecting = 0;
>> >> + }
>> >> +
>> >> if (newDelay) {
>> >> priv->timer_time = GetTimeInMillis();
>> >> priv->timer = TimerSet(priv->timer, 0, delay, timerFunc, pInfo);
>> >> diff --git a/src/synapticsstr.h b/src/synapticsstr.h
>> >> index 428befa..98d6552 100644
>> >> --- a/src/synapticsstr.h
>> >> +++ b/src/synapticsstr.h
>> >> @@ -204,6 +204,9 @@ struct _SynapticsPrivateRec {
>> >> OsTimerPtr timer; /* for tap processing, etc */
>> >>
>> >> struct CommData comm;
>> >> + int comm_read; /* for reconnection check */
>> >> + int reconnecting; /* for reconnection check */
>> >> + int retries;
>> >>
>> >> struct SynapticsHwState *local_hw_state; /* used in place of local hw state variables */
>> >>
>> >> --
>> >> 1.8.1.4
>> >>
>> >> _______________________________________________
>> >> xorg-devel at lists.x.org: X.Org development
>> >> Archives: http://lists.x.org/archives/xorg-devel
>> >> Info: http://lists.x.org/mailman/listinfo/xorg-devel
>> >>
>> > _______________________________________________
>> > xorg-devel at lists.x.org: X.Org development
>> > Archives: http://lists.x.org/archives/xorg-devel
>> > Info: http://lists.x.org/mailman/listinfo/xorg-devel
>>
More information about the xorg-devel
mailing list