| From c36b58e8a9112017c2bcc322cc98e71241814303 Mon Sep 17 00:00:00 2001 |
| From: Igor Mammedov <imammedo@redhat.com> |
| Date: Mon, 18 Apr 2011 10:17:17 -0700 |
| Subject: Input: xen-kbdfront - fix mouse getting stuck after save/restore |
| |
| From: Igor Mammedov <imammedo@redhat.com> |
| |
| commit c36b58e8a9112017c2bcc322cc98e71241814303 upstream. |
| |
| Mouse gets "stuck" after restore of PV guest but buttons are in working |
| condition. |
| |
| If driver has been configured for ABS coordinates at start it will get |
| XENKBD_TYPE_POS events and then suddenly after restore it'll start getting |
| XENKBD_TYPE_MOTION events, that will be dropped later and they won't get |
| into user-space. |
| |
| Regression was introduced by hunk 5 and 6 of |
| 5ea5254aa0ad269cfbd2875c973ef25ab5b5e9db |
| ("Input: xen-kbdfront - advertise either absolute or relative |
| coordinates"). |
| |
| Driver on restore should ask xen for request-abs-pointer again if it is |
| available. So restore parts that did it before 5ea5254. |
| |
| Acked-by: Olaf Hering <olaf@aepfle.de> |
| Signed-off-by: Igor Mammedov <imammedo@redhat.com> |
| [v1: Expanded the commit description] |
| Signed-off-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> |
| Signed-off-by: Dmitry Torokhov <dtor@mail.ru> |
| |
| --- |
| drivers/input/xen-kbdfront.c | 12 +++++++++++- |
| 1 file changed, 11 insertions(+), 1 deletion(-) |
| |
| --- a/drivers/input/xen-kbdfront.c |
| +++ b/drivers/input/xen-kbdfront.c |
| @@ -284,7 +284,7 @@ static void xenkbd_backend_changed(struc |
| enum xenbus_state backend_state) |
| { |
| struct xenkbd_info *info = dev_get_drvdata(&dev->dev); |
| - int val; |
| + int ret, val; |
| |
| switch (backend_state) { |
| case XenbusStateInitialising: |
| @@ -295,6 +295,16 @@ static void xenkbd_backend_changed(struc |
| |
| case XenbusStateInitWait: |
| InitWait: |
| + ret = xenbus_scanf(XBT_NIL, info->xbdev->otherend, |
| + "feature-abs-pointer", "%d", &val); |
| + if (ret < 0) |
| + val = 0; |
| + if (val) { |
| + ret = xenbus_printf(XBT_NIL, info->xbdev->nodename, |
| + "request-abs-pointer", "1"); |
| + if (ret) |
| + pr_warning("can't request abs-pointer\n"); |
| + } |
| xenbus_switch_state(dev, XenbusStateConnected); |
| break; |
| |