CC'ing Gerd.
On Wed, 7 Jul 2010, John Haxby wrote:
> 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 <john.haxby@xxxxxxxxxx>
Acked-by: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx>
> ---
> 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 8c92739..afd0bf2 100644
> --- a/hw/xen_backend.c
> +++ b/hw/xen_backend.c
> @@ -401,13 +401,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;
>
> @@ -421,10 +421,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;
> }
>
> @@ -433,6 +433,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.
> @@ -484,7 +506,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 672a857..7e89ef4 100644
> --- a/hw/xen_backend.h
> +++ b/hw/xen_backend.h
> @@ -19,7 +19,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 f1c2f8b..a4e97ca 100644
> --- a/hw/xen_console.c
> +++ b/hw/xen_console.c
> @@ -209,7 +209,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;
> @@ -278,7 +278,7 @@ struct XenDevOps xen_console_ops = {
> .size = sizeof(struct XenConsole),
> .flags = DEVOPS_FLAG_IGNORE_STATE|DEVOPS_FLAG_NEED_GNTDEV,
> .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 97960ba..c96cfe6 100644
> --- a/hw/xenfb.c
> +++ b/hw/xenfb.c
> @@ -361,7 +361,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;
> @@ -863,7 +863,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;
> @@ -957,7 +957,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,
> };
> @@ -965,7 +965,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,
> --
> 1.7.1
>
>
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@xxxxxxxxxxxxxxxxxxx
> http://lists.xensource.com/xen-devel
>
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|