From: Kevin Wolf <kwolf@redhat.com>
To: Amit Shah <amit.shah@redhat.com>
Cc: Juan Quintela <quintela@redhat.com>,
Stefan Hajnoczi <stefanha@gmail.com>,
Markus Armbruster <armbru@redhat.com>,
qemu list <qemu-devel@nongnu.org>,
Paolo Bonzini <pbonzini@redhat.com>
Subject: Re: [Qemu-devel] [PATCH v4 5/5] atapi: GESN: implement 'media' subcommand
Date: Tue, 12 Apr 2011 16:54:53 +0200 [thread overview]
Message-ID: <4DA467BD.3010705@redhat.com> (raw)
In-Reply-To: <1632463ee09a9df5690475f0b507757c0876fce9.1302617257.git.amit.shah@redhat.com>
Am 12.04.2011 16:09, schrieb Amit Shah:
> Implement the 'media' sub-command of the GET_EVENT_STATUS_NOTIFICATION
> command. This helps us report tray open, tray closed, no media, media
> present states to the guest.
>
> Newer Linux kernels (2.6.38+) rely on this command to revalidate discs
> after media change.
>
> This patch also sends out tray open/closed status to the guest driver
> when requested e.g. via the CDROM_DRIVE_STATUS ioctl (thanks Markus).
> Without such notification, the guest and qemu's tray open/close status
> was frequently out of sync, causing installers like Anaconda detecting
> no disc instead of tray open, confusing them terribly.
>
> Signed-off-by: Amit Shah <amit.shah@redhat.com>
> ---
> hw/ide/core.c | 109 ++++++++++++++++++++++++++++++++++++++++++++++++++--
> hw/ide/internal.h | 6 +++
> 2 files changed, 110 insertions(+), 5 deletions(-)
>
> diff --git a/hw/ide/core.c b/hw/ide/core.c
> index dafc049..209d8e6 100644
> --- a/hw/ide/core.c
> +++ b/hw/ide/core.c
> @@ -1084,6 +1084,49 @@ static int ide_dvd_read_structure(IDEState *s, int format,
> }
> }
>
> +static unsigned int event_status_media(IDEState *s,
> + uint8_t *buf,
> + unsigned int max_len)
> +{
> + enum media_event_code {
> + no_change = 0, /* Status unchanged */
> + eject_requested, /* received a request from user to eject */
> + new_media, /* new media inserted and ready for access */
> + media_removal, /* only for media changers */
> + media_changed, /* only for media changers */
> + bg_format_completed, /* MRW or DVD+RW b/g format completed */
> + bg_format_restarted, /* MRW or DVD+RW b/g format restarted */
> + };
> + enum media_status {
> + tray_open = 1,
> + media_present = 2,
> + };
> + uint8_t event_code, media_status;
> +
> + media_status = 0;
> + if (s->bs->tray_open) {
> + media_status = tray_open;
> + } else if (bdrv_is_inserted(s->bs)) {
> + media_status = media_present;
> + }
> +
> + /* Event notification descriptor */
> + event_code = no_change;
> + if (media_status != tray_open && s->events.new_media) {
> + event_code = new_media;
> + s->events.new_media = false;
> + }
> +
> + buf[4] = event_code;
> + buf[5] = media_status;
> +
> + /* These fields are reserved, just clear them. */
> + buf[6] = 0;
> + buf[7] = 0;
> +
> + return 8; /* We wrote to 4 extra bytes from the header */
> +}
> +
> static void handle_get_event_status_notification(IDEState *s,
> uint8_t *buf,
> const uint8_t *packet)
> @@ -1104,6 +1147,26 @@ static void handle_get_event_status_notification(IDEState *s,
> uint8_t supported_events;
> } __attribute((packed)) *gesn_event_header;
>
> + enum notification_class_request_type {
> + reserved1 = 1 << 0,
> + operational_change = 1 << 1,
> + power_management = 1 << 2,
> + external_request = 1 << 3,
> + media = 1 << 4,
> + multi_host = 1 << 5,
> + device_busy = 1 << 6,
> + reserved2 = 1 << 7,
> + };
> + enum event_notification_class_field {
> + enc_no_events = 0,
> + enc_operational_change,
> + enc_power_management,
> + enc_external_request,
> + enc_media,
> + enc_multiple_hosts,
> + enc_device_busy,
> + enc_reserved,
> + };
> unsigned int max_len, used_len;
>
> gesn_cdb = (void *)packet;
> @@ -1121,12 +1184,25 @@ static void handle_get_event_status_notification(IDEState *s,
>
> /* polling mode operation */
>
> - /* We don't support any event class (yet). */
> - gesn_event_header->supported_events = 0;
> -
> - gesn_event_header->notification_class = 0x80; /* No event available */
> - used_len = sizeof(*gesn_event_header);
> + /*
> + * These are the supported events.
> + *
> + * We currently only support requests of the 'media' type.
> + */
> + gesn_event_header->supported_events = media;
>
> + /*
> + * Responses to requests are to be based on request priority. The
> + * notification_class_request_type enum above specifies the
> + * priority: upper elements are higher prio than lower ones.
> + */
> + if (gesn_cdb->class & media) {
> + gesn_event_header->notification_class |= enc_media;
Am I missing where this field is initialized or should it be = instead
of |= ?
The rest of the series looks good, but I have seen this code by far too
often now, so maybe someone else should take over and find the remaining
bugs that I'm missing now...
Kevin
next prev parent reply other threads:[~2011-04-12 14:52 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-04-12 14:09 [Qemu-devel] [PATCH v4 0/5] atapi: Implement 'media' subcommand for GESN Amit Shah
2011-04-12 14:09 ` [Qemu-devel] [PATCH v4 1/5] atapi: Allow GET_EVENT_STATUS_NOTIFICATION after media change Amit Shah
2011-04-12 14:09 ` [Qemu-devel] [PATCH v4 2/5] atapi: Move GET_EVENT_STATUS_NOTIFICATION command handling to its own function Amit Shah
2011-04-12 14:09 ` [Qemu-devel] [PATCH v4 3/5] atapi: GESN: Use structs for commonly-used field types Amit Shah
2011-04-12 14:09 ` [Qemu-devel] [PATCH v4 4/5] atapi: GESN: Standardise event response handling for future additions Amit Shah
2011-04-12 14:09 ` [Qemu-devel] [PATCH v4 5/5] atapi: GESN: implement 'media' subcommand Amit Shah
2011-04-12 14:54 ` Kevin Wolf [this message]
2011-04-12 15:03 ` Amit Shah
2011-04-12 15:05 ` Amit Shah
2011-04-12 15:11 ` Kevin Wolf
2011-04-12 15:16 ` Amit Shah
2011-04-12 15:03 ` Jes Sorensen
2011-04-12 15:13 ` Kevin Wolf
2011-04-12 15:13 ` Jes Sorensen
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4DA467BD.3010705@redhat.com \
--to=kwolf@redhat.com \
--cc=amit.shah@redhat.com \
--cc=armbru@redhat.com \
--cc=pbonzini@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=quintela@redhat.com \
--cc=stefanha@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).