From: Kevin Wolf <kwolf@redhat.com>
To: qemu-devel@nongnu.org
Cc: amit.shah@redhat.com, kwolf@redhat.com
Subject: [Qemu-devel] [PATCH 5/5] ide/atapi: Introduce NEED_DISK flag for commands
Date: Tue, 19 Apr 2011 14:36:43 +0200 [thread overview]
Message-ID: <1303216603-11658-6-git-send-email-kwolf@redhat.com> (raw)
In-Reply-To: <1303216603-11658-1-git-send-email-kwolf@redhat.com>
Some commands require a medium to be present in order to execute successfully.
Instead of duplicating the check in each command implementation, let's add a
flag and check it before calling the command.
This patch only converts existing checks, it does not introduce new checks for
any of the other commands that can/should report a Not Ready Condition.
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
---
hw/ide/atapi.c | 46 +++++++++++++++++++++-------------------------
1 files changed, 21 insertions(+), 25 deletions(-)
diff --git a/hw/ide/atapi.c b/hw/ide/atapi.c
index 032d1b0..88e7791 100644
--- a/hw/ide/atapi.c
+++ b/hw/ide/atapi.c
@@ -813,11 +813,7 @@ error_cmd:
static void cmd_test_unit_ready(IDEState *s, uint8_t *buf)
{
- if (bdrv_is_inserted(s->bs)) {
- ide_atapi_cmd_ok(s);
- } else {
- ide_atapi_cmd_error(s, SENSE_NOT_READY, ASC_MEDIUM_NOT_PRESENT);
- }
+ ide_atapi_cmd_ok(s);
}
static void cmd_prevent_allow_medium_removal(IDEState *s, uint8_t* buf)
@@ -883,11 +879,6 @@ static void cmd_seek(IDEState *s, uint8_t* buf)
unsigned int lba;
uint64_t total_sectors = s->nb_sectors >> 2;
- if (total_sectors == 0) {
- ide_atapi_cmd_error(s, SENSE_NOT_READY, ASC_MEDIUM_NOT_PRESENT);
- return;
- }
-
lba = ube32_to_cpu(buf + 2);
if (lba >= total_sectors) {
ide_atapi_cmd_error(s, SENSE_ILLEGAL_REQUEST, ASC_LOGICAL_BLOCK_OOR);
@@ -941,13 +932,8 @@ static void cmd_mechanism_status(IDEState *s, uint8_t* buf)
static void cmd_read_toc_pma_atip(IDEState *s, uint8_t* buf)
{
int format, msf, start_track, len;
- uint64_t total_sectors = s->nb_sectors >> 2;
int max_len;
-
- if (total_sectors == 0) {
- ide_atapi_cmd_error(s, SENSE_NOT_READY, ASC_MEDIUM_NOT_PRESENT);
- return;
- }
+ uint64_t total_sectors = s->nb_sectors >> 2;
max_len = ube16_to_cpu(buf + 7);
format = buf[9] >> 6;
@@ -986,11 +972,6 @@ static void cmd_read_cdvd_capacity(IDEState *s, uint8_t* buf)
{
uint64_t total_sectors = s->nb_sectors >> 2;
- if (total_sectors == 0) {
- ide_atapi_cmd_error(s, SENSE_NOT_READY, ASC_MEDIUM_NOT_PRESENT);
- return;
- }
-
/* NOTE: it is really the number of sectors minus 1 */
cpu_to_ube32(buf, total_sectors - 1);
cpu_to_ube32(buf + 4, 2048);
@@ -1062,22 +1043,29 @@ enum {
* unit attention condition. (See MMC-5, section 4.1.6.1)
*/
ALLOW_UA = 0x01,
+
+ /*
+ * Commands flagged with CHECK_READY can only execute if a medium is present.
+ * Otherwise they report the Not Ready Condition. (See MMC-5, section
+ * 4.1.8)
+ */
+ CHECK_READY = 0x02,
};
struct {
void (*handler)(IDEState *s, uint8_t *buf);
int flags;
} atapi_cmd_table[0x100] = {
- [ 0x00 ] = { cmd_test_unit_ready, 0 },
+ [ 0x00 ] = { cmd_test_unit_ready, CHECK_READY },
[ 0x03 ] = { cmd_request_sense, ALLOW_UA },
[ 0x12 ] = { cmd_inquiry, ALLOW_UA },
[ 0x1a ] = { cmd_mode_sense, /* (6) */ 0 },
[ 0x1b ] = { cmd_start_stop_unit, 0 },
[ 0x1e ] = { cmd_prevent_allow_medium_removal, 0 },
- [ 0x25 ] = { cmd_read_cdvd_capacity, 0 },
+ [ 0x25 ] = { cmd_read_cdvd_capacity, CHECK_READY },
[ 0x28 ] = { cmd_read, /* (10) */ 0 },
- [ 0x2b ] = { cmd_seek, 0 },
- [ 0x43 ] = { cmd_read_toc_pma_atip, 0 },
+ [ 0x2b ] = { cmd_seek, CHECK_READY },
+ [ 0x43 ] = { cmd_read_toc_pma_atip, CHECK_READY },
[ 0x46 ] = { cmd_get_configuration, ALLOW_UA },
[ 0x4a ] = { cmd_get_event_status_notification, ALLOW_UA },
[ 0x5a ] = { cmd_mode_sense, /* (10) */ 0 },
@@ -1126,6 +1114,14 @@ void ide_atapi_cmd(IDEState *s)
return;
}
+ /* Report a Not Ready condition if appropriate for the command */
+ if ((atapi_cmd_table[s->io_buffer[0]].flags & CHECK_READY) &&
+ (!media_present(s) || !bdrv_is_inserted(s->bs)))
+ {
+ ide_atapi_cmd_error(s, SENSE_NOT_READY, ASC_MEDIUM_NOT_PRESENT);
+ return;
+ }
+
/* Execute the command */
if (atapi_cmd_table[s->io_buffer[0]].handler) {
atapi_cmd_table[s->io_buffer[0]].handler(s, buf);
--
1.7.2.3
next prev parent reply other threads:[~2011-04-19 12:34 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-04-19 12:36 [Qemu-devel] [PATCH 0/5] atapi: Some code restructuring Kevin Wolf
2011-04-19 12:36 ` [Qemu-devel] [PATCH 1/5] ide: Split atapi.c out Kevin Wolf
2011-04-19 12:36 ` [Qemu-devel] [PATCH 2/5] ide/atapi: Factor some commands out Kevin Wolf
2011-04-19 12:36 ` [Qemu-devel] [PATCH 3/5] ide/atapi: Use table instead of switch for commands Kevin Wolf
2011-04-19 13:20 ` Amit Shah
2011-04-19 13:34 ` Kevin Wolf
2011-04-19 12:36 ` [Qemu-devel] [PATCH 4/5] ide/atapi: Replace bdrv_get_geometry calls by s->nb_sectors Kevin Wolf
2011-04-19 12:36 ` Kevin Wolf [this message]
2011-04-19 13:18 ` [Qemu-devel] [PATCH 5/5] ide/atapi: Introduce NEED_DISK flag for commands Amit Shah
2011-04-19 13:45 ` Kevin Wolf
2011-04-19 13:21 ` [Qemu-devel] [PATCH 0/5] atapi: Some code restructuring Amit Shah
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=1303216603-11658-6-git-send-email-kwolf@redhat.com \
--to=kwolf@redhat.com \
--cc=amit.shah@redhat.com \
--cc=qemu-devel@nongnu.org \
/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).