From patchwork Fri Mar 11 13:10:41 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Stefano Stabellini X-Patchwork-Id: 86419 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [199.232.76.165]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 8620EB6EDD for ; Sat, 12 Mar 2011 00:12:10 +1100 (EST) Received: from localhost ([127.0.0.1]:34147 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1Py28V-0007Pp-Hl for incoming@patchwork.ozlabs.org; Fri, 11 Mar 2011 08:12:07 -0500 Received: from [140.186.70.92] (port=45404 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1Py27j-0007ON-QT for qemu-devel@nongnu.org; Fri, 11 Mar 2011 08:11:21 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Py27h-0000n7-Of for qemu-devel@nongnu.org; Fri, 11 Mar 2011 08:11:19 -0500 Received: from smtp02.citrix.com ([66.165.176.63]:23807) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Py27h-0000mv-K9 for qemu-devel@nongnu.org; Fri, 11 Mar 2011 08:11:17 -0500 X-IronPort-AV: E=Sophos;i="4.62,303,1297054800"; d="scan'208";a="139780028" Received: from ftlpexchmx02.citrite.net ([10.9.154.127]) by FTLPIPO02.CITRIX.COM with ESMTP; 11 Mar 2011 08:11:15 -0500 Received: from smtp01.ad.xensource.com ([10.219.128.104]) by FTLPEXCHMX02.citrite.net with Microsoft SMTPSVC(6.0.3790.4675); Fri, 11 Mar 2011 08:11:15 -0500 Received: from localhost.localdomain (kaball.uk.xensource.com [10.80.2.59]) by smtp01.ad.xensource.com (8.13.1/8.13.1) with ESMTP id p2BDBB97005617; Fri, 11 Mar 2011 05:11:13 -0800 From: stefano.stabellini@eu.citrix.com To: qemu-devel@nongnu.org Date: Fri, 11 Mar 2011 13:10:41 +0000 Message-Id: <1299849042-2001-1-git-send-email-stefano.stabellini@eu.citrix.com> X-Mailer: git-send-email 1.7.0.4 X-OriginalArrivalTime: 11 Mar 2011 13:11:15.0479 (UTC) FILETIME=[CD4CB270:01CBDFED] X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 66.165.176.63 Cc: john.haxby@oracle.com, Stefano.Stabellini@eu.citrix.com Subject: [Qemu-devel] [PATCH 1/2][REPOST] Introduce a new 'connected' xendev op called when Connected. X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org From: John Haxby Rename the existing xendev 'connect' op to 'initialised' and introduce a new 'connected' op. This new op, if defined, is called when the backend is connected. Note that since there is no state transition this may be called more than once. Signed-off-by: John Haxby Acked-by: Stefano Stabellini --- hw/xen_backend.c | 39 +++++++++++++++++++++++++++++++++------ hw/xen_backend.h | 3 ++- hw/xen_console.c | 4 ++-- hw/xenfb.c | 8 ++++---- 4 files changed, 41 insertions(+), 13 deletions(-) diff --git a/hw/xen_backend.c b/hw/xen_backend.c index a2e408f..b99055a 100644 --- a/hw/xen_backend.c +++ b/hw/xen_backend.c @@ -400,13 +400,13 @@ static int xen_be_try_init(struct XenDevice *xendev) } /* - * Try to connect xendev. Depends on the frontend being ready + * Try to initialise xendev. Depends on the frontend being ready * for it (shared ring and evtchn info in xenstore, state being * Initialised or Connected). * * Goes to Connected on success. */ -static int xen_be_try_connect(struct XenDevice *xendev) +static int xen_be_try_initialise(struct XenDevice *xendev) { int rc = 0; @@ -420,10 +420,10 @@ static int xen_be_try_connect(struct XenDevice *xendev) } } - if (xendev->ops->connect) - rc = xendev->ops->connect(xendev); + if (xendev->ops->initialise) + rc = xendev->ops->initialise(xendev); if (rc != 0) { - xen_be_printf(xendev, 0, "connect() failed\n"); + xen_be_printf(xendev, 0, "initialise() failed\n"); return rc; } @@ -432,6 +432,28 @@ static int xen_be_try_connect(struct XenDevice *xendev) } /* + * Try to let xendev know that it is connected. Depends on the + * frontend being Connected. Note that this may be called more + * than once since the backend state is not modified. + */ +static void xen_be_try_connected(struct XenDevice *xendev) +{ + if (!xendev->ops->connected) + return; + + if (xendev->fe_state != XenbusStateConnected) { + if (xendev->ops->flags & DEVOPS_FLAG_IGNORE_STATE) { + xen_be_printf(xendev, 2, "frontend not ready, ignoring\n"); + } else { + xen_be_printf(xendev, 2, "frontend not ready (yet)\n"); + return; + } + } + + xendev->ops->connected(xendev); +} + +/* * Teardown connection. * * Goes to Closed when done. @@ -483,7 +505,12 @@ void xen_be_check_state(struct XenDevice *xendev) rc = xen_be_try_init(xendev); break; case XenbusStateInitWait: - rc = xen_be_try_connect(xendev); + rc = xen_be_try_initialise(xendev); + break; + case XenbusStateConnected: + /* xendev->be_state doesn't change */ + xen_be_try_connected(xendev); + rc = -1; break; case XenbusStateClosed: rc = xen_be_try_reset(xendev); diff --git a/hw/xen_backend.h b/hw/xen_backend.h index 1b428e3..dc4fcbf 100644 --- a/hw/xen_backend.h +++ b/hw/xen_backend.h @@ -21,7 +21,8 @@ struct XenDevOps { uint32_t flags; void (*alloc)(struct XenDevice *xendev); int (*init)(struct XenDevice *xendev); - int (*connect)(struct XenDevice *xendev); + int (*initialise)(struct XenDevice *xendev); + void (*connected)(struct XenDevice *xendev); void (*event)(struct XenDevice *xendev); void (*disconnect)(struct XenDevice *xendev); int (*free)(struct XenDevice *xendev); diff --git a/hw/xen_console.c b/hw/xen_console.c index d2261f4..258c003 100644 --- a/hw/xen_console.c +++ b/hw/xen_console.c @@ -202,7 +202,7 @@ static int con_init(struct XenDevice *xendev) return 0; } -static int con_connect(struct XenDevice *xendev) +static int con_initialise(struct XenDevice *xendev) { struct XenConsole *con = container_of(xendev, struct XenConsole, xendev); int limit; @@ -263,7 +263,7 @@ struct XenDevOps xen_console_ops = { .size = sizeof(struct XenConsole), .flags = DEVOPS_FLAG_IGNORE_STATE, .init = con_init, - .connect = con_connect, + .initialise = con_initialise, .event = con_event, .disconnect = con_disconnect, }; diff --git a/hw/xenfb.c b/hw/xenfb.c index da5297b..b535d8c 100644 --- a/hw/xenfb.c +++ b/hw/xenfb.c @@ -359,7 +359,7 @@ static int input_init(struct XenDevice *xendev) return 0; } -static int input_connect(struct XenDevice *xendev) +static int input_initialise(struct XenDevice *xendev) { struct XenInput *in = container_of(xendev, struct XenInput, c.xendev); int rc; @@ -861,7 +861,7 @@ static int fb_init(struct XenDevice *xendev) return 0; } -static int fb_connect(struct XenDevice *xendev) +static int fb_initialise(struct XenDevice *xendev) { struct XenFB *fb = container_of(xendev, struct XenFB, c.xendev); struct xenfb_page *fb_page; @@ -955,7 +955,7 @@ static void fb_event(struct XenDevice *xendev) struct XenDevOps xen_kbdmouse_ops = { .size = sizeof(struct XenInput), .init = input_init, - .connect = input_connect, + .initialise = input_initialise, .disconnect = input_disconnect, .event = input_event, }; @@ -963,7 +963,7 @@ struct XenDevOps xen_kbdmouse_ops = { struct XenDevOps xen_framebuffer_ops = { .size = sizeof(struct XenFB), .init = fb_init, - .connect = fb_connect, + .initialise = fb_initialise, .disconnect = fb_disconnect, .event = fb_event, .frontend_changed = fb_frontend_changed,