]> xenbits.xensource.com Git - pvdrivers/win/xenvkbd.git/commitdiff
Read "feature-vkbd-standalone"
authorOwen Smith <owen.smith@citrix.com>
Wed, 7 Jun 2017 12:55:49 +0000 (13:55 +0100)
committerPaul Durrant <paul.durrant@citrix.com>
Mon, 12 Jun 2017 09:32:28 +0000 (10:32 +0100)
Read "feature-vkbd-standalone" and fail connect
if it is not 1. Writes "request-vkbd-standalone" before
transitioning to Connected.

Signed-off-by: Owen Smith <owen.smith@citrix.com>
src/xenvkbd/frontend.c
src/xenvkbd/hid.c
src/xenvkbd/ring.c

index ea85cd2a573bb273a94e59c99702c6f048abfa42..1d6d360dd6fe4f03450193695e6916ce09198470 100644 (file)
@@ -795,7 +795,7 @@ FrontendSetState(
     IN  XENVKBD_FRONTEND_STATE  State
     )
 {
-    BOOLEAN                     Failed;
+    NTSTATUS                    status;
     KIRQL                       Irql;
 
     KeAcquireSpinLock(&Frontend->Lock, &Irql);
@@ -805,10 +805,8 @@ FrontendSetState(
          FrontendStateName(Frontend->State),
          FrontendStateName(State));
 
-    Failed = FALSE;
-    while (Frontend->State != State && !Failed) {
-        NTSTATUS    status;
-
+    status = STATUS_SUCCESS;
+    while (Frontend->State != State && NT_SUCCESS(status)) {
         switch (Frontend->State) {
         case FRONTEND_UNKNOWN:
             switch (State) {
@@ -820,8 +818,6 @@ FrontendSetState(
                 status = FrontendClose(Frontend);
                 if (NT_SUCCESS(status)) {
                     Frontend->State = FRONTEND_CLOSED;
-                } else {
-                    Failed = TRUE;
                 }
                 break;
 
@@ -860,6 +856,9 @@ FrontendSetState(
                     Frontend->State = FRONTEND_CLOSED;
                 }
                 break;
+            case FRONTEND_UNKNOWN:
+                Frontend->State = FRONTEND_UNKNOWN;
+                break;
             default:
                 ASSERT(FALSE);
                 break;
@@ -935,7 +934,7 @@ FrontendSetState(
 
     Info("%s: <=====\n", __FrontendGetPath(Frontend));
 
-    return (!Failed) ? STATUS_SUCCESS : STATUS_UNSUCCESSFUL;
+    return status;
 }
 
 static FORCEINLINE VOID
index 03fc1a2eaa07c43841c6135074447adf6a9cceb8..8a90dd1fe491334bea049a285f4acf0c2976a3f9 100644 (file)
@@ -109,13 +109,11 @@ HidEnable(
 {
     PXENVKBD_HID_CONTEXT    Context = Interface->Context;
     KIRQL                   Irql;
-    BOOLEAN                 Exclusive;
     NTSTATUS                status;
 
     Trace("====>\n");
 
     AcquireMrswLockExclusive(&Context->Lock, &Irql);
-    Exclusive = TRUE;
 
     if (Context->Enabled)
         goto done;
@@ -128,11 +126,12 @@ HidEnable(
     KeMemoryBarrier();
 
     status = FrontendSetState(Context->Frontend, FRONTEND_ENABLED);
-    if (!NT_SUCCESS(status))
-        goto fail1;
+    if (!NT_SUCCESS(status)) {
+        if (status != STATUS_DEVICE_NOT_READY)
+            goto fail1;
+    }
 
 done:
-    ASSERT(Exclusive);
     ReleaseMrswLockExclusive(&Context->Lock, Irql, FALSE);
 
     Trace("<====\n");
@@ -149,10 +148,7 @@ fail1:
     Context->Argument = NULL;
     Context->Callback = NULL;
 
-    if (Exclusive)
-        ReleaseMrswLockExclusive(&Context->Lock, Irql, FALSE);
-    else
-        ReleaseMrswLockShared(&Context->Lock);
+    ReleaseMrswLockExclusive(&Context->Lock, Irql, FALSE);
 
     return status;
 }
index da1bd17a252b379b162e10254ff2bcadef94aa5b..914521c7de0e76fb8ea9a2d0fc4239867ddc7858 100644 (file)
@@ -78,6 +78,7 @@ struct _XENVKBD_RING {
     BOOLEAN                 Connected;
     BOOLEAN                 Enabled;
     BOOLEAN                 AbsPointer;
+    BOOLEAN                 VkbdStandalone;
 
     XENVKBD_HID_KEYBOARD    KeyboardReport;
     XENVKBD_HID_ABSMOUSE    AbsMouseReport;
@@ -497,6 +498,22 @@ RingReadFeatures(
     } else {
         Ring->AbsPointer = FALSE;
     }
+
+    status = XENBUS_STORE(Read,
+                          &Ring->StoreInterface,
+                          NULL,
+                          FrontendGetBackendPath(Ring->Frontend),
+                          "feature-vkbd-standalone",
+                          &Buffer);
+    if (NT_SUCCESS(status)) {
+        Ring->VkbdStandalone = (BOOLEAN)strtoul(Buffer, NULL, 2);
+
+        XENBUS_STORE(Free,
+                     &Ring->StoreInterface,
+                     Buffer);
+    } else {
+        Ring->VkbdStandalone = FALSE;
+    }
 }
 
 NTSTATUS
@@ -542,11 +559,15 @@ RingConnect(
     Ring->AbsMouseReport.ReportId = 2;
     RingReadFeatures(Ring);
 
+    status = STATUS_DEVICE_NOT_READY;
+    if (!Ring->VkbdStandalone)
+        goto fail6;
+
     Ring->Mdl = __AllocatePage();
     
     status = STATUS_NO_MEMORY;
     if (Ring->Mdl == NULL)
-        goto fail6;
+        goto fail7;
 
     ASSERT(Ring->Mdl->MdlFlags & MDL_MAPPED_TO_SYSTEM_VA);
     Ring->Shared = Ring->Mdl->MappedSystemVa;
@@ -566,7 +587,7 @@ RingConnect(
                            FALSE,
                            &Ring->Entry);
     if (!NT_SUCCESS(status))
-        goto fail7;
+        goto fail8;
 
     Ring->Channel = XENBUS_EVTCHN(Open,
                                   &Ring->EvtchnInterface,
@@ -578,7 +599,7 @@ RingConnect(
 
     status = STATUS_UNSUCCESSFUL;
     if (Ring->Channel == NULL)
-        goto fail8;
+        goto fail9;
 
     XENBUS_EVTCHN(Unmask,
                   &Ring->EvtchnInterface,
@@ -592,13 +613,13 @@ RingConnect(
                           Ring,
                           &Ring->DebugCallback);
     if (!NT_SUCCESS(status))
-        goto fail9;
+        goto fail10;
 
     Ring->Connected = TRUE;
     return STATUS_SUCCESS;
 
-fail9:
-    Error("fail9\n");
+fail10:
+    Error("fail10\n");
 
     XENBUS_EVTCHN(Close,
                   &Ring->EvtchnInterface,
@@ -607,8 +628,8 @@ fail9:
 
     Ring->Events = 0;
 
-fail8:
-    Error("fail8\n");
+fail9:
+    Error("fail9\n");
 
     (VOID) XENBUS_GNTTAB(RevokeForeignAccess,
                          &Ring->GnttabInterface,
@@ -617,13 +638,16 @@ fail8:
                          Ring->Entry);
     Ring->Entry = NULL;
 
-fail7:
-    Error("fail7\n");
+fail8:
+    Error("fail8\n");
 
     Ring->Shared = NULL;
     __FreePage(Ring->Mdl);
     Ring->Mdl = NULL;
 
+fail7:
+    Error("fail7\n");
+
 fail6:
     Error("fail6\n");
 
@@ -715,9 +739,21 @@ RingStoreWrite(
     if (!NT_SUCCESS(status))
         goto fail4;
 
+    status = XENBUS_STORE(Printf,
+                          &Ring->StoreInterface,
+                          Transaction,
+                          FrontendGetPath(Ring->Frontend),
+                          "request-vkbd-standalone",
+                          "%u",
+                          Ring->VkbdStandalone);
+    if (!NT_SUCCESS(status))
+        goto fail5;
+
     Trace("<=====\n");
     return STATUS_SUCCESS;
 
+fail5:
+    Error("fail5\n");
 fail4:
     Error("fail4\n");
 fail3:
@@ -817,6 +853,7 @@ RingTeardown(
     Ring->Dpcs = 0;
 
     Ring->AbsPointer = FALSE;
+    Ring->VkbdStandalone = FALSE;
 
     RtlZeroMemory(&Ring->Dpc, sizeof (KDPC));