[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[win-pv-devel] [PATCH 3/4] xenvkbd: Read "feature-vkbd-standalone"



From: Owen Smith <owen.smith@xxxxxxxxxx>

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@xxxxxxxxxx>
---
 src/xenvkbd/frontend.c | 15 +++++++------
 src/xenvkbd/hid.c      | 14 +++++--------
 src/xenvkbd/ring.c     | 57 +++++++++++++++++++++++++++++++++++++++++---------
 3 files changed, 59 insertions(+), 27 deletions(-)

diff --git a/src/xenvkbd/frontend.c b/src/xenvkbd/frontend.c
index ea85cd2..1d6d360 100644
--- a/src/xenvkbd/frontend.c
+++ b/src/xenvkbd/frontend.c
@@ -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
diff --git a/src/xenvkbd/hid.c b/src/xenvkbd/hid.c
index 03fc1a2..8a90dd1 100644
--- a/src/xenvkbd/hid.c
+++ b/src/xenvkbd/hid.c
@@ -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;
 }
diff --git a/src/xenvkbd/ring.c b/src/xenvkbd/ring.c
index da1bd17..914521c 100644
--- a/src/xenvkbd/ring.c
+++ b/src/xenvkbd/ring.c
@@ -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));
 
-- 
2.8.3


_______________________________________________
win-pv-devel mailing list
win-pv-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/cgi-bin/mailman/listinfo/win-pv-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.