qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Ryan Harper <ryanh@us.ibm.com>
To: Brian Wheeler <bdwheele@indiana.edu>
Cc: Kevin Wolf <kwolf@redhat.com>, qemu-devel <qemu-devel@nongnu.org>
Subject: Re: [Qemu-devel] [PATCH v5] PING: Fix ATA SMART and CHECK POWER MODE
Date: Tue, 8 Mar 2011 22:26:16 -0600	[thread overview]
Message-ID: <20110309042616.GN23238@us.ibm.com> (raw)
In-Reply-To: <1298986223.419.0.camel@nibbler.dlib.indiana.edu>

* Brian Wheeler <bdwheele@indiana.edu> [2011-03-01 07:35]:
> This patch fixes two things:
> 
>  1) CHECK POWER MODE
> 
> The error return value wasn't always zero, so it would show up as
> offline.  Error is now explicitly set to zero.
> 
>  2) SMART
> 
> The smart values that were returned were invalid and tools like skdump
> would not recognize that the smart data was actually valid and would
> dump weird output.  The data has been fixed up and raw value support
> was added.  Tools like skdump and palimpsest work as expected.
> 
> v5 changes:  rebase
> v4 changes:  incorporate changes from Ryan Harper
> v3 changes:  don't reformat code I didn't change
> v2 changes:  use single structure instead of one for thresholds and one
> for data.
> 

Sorry, haven't had a chance to catch up on qemu-devel, meant to respond
sooner.  Changes look good.

Acked-by: Ryan Harper <ryanh@us.ibm.com>

> Signed-off-by: bdwheele@indiana.edu
> ----------------
> diff --git a/hw/ide/core.c b/hw/ide/core.c
> index 9c91a49..1ffca56 100644
> --- a/hw/ide/core.c
> +++ b/hw/ide/core.c
> @@ -34,13 +34,26 @@
> 
>  #include <hw/ide/internal.h>
> 
> -static const int smart_attributes[][5] = {
> -    /* id,  flags, val, wrst, thrsh */
> -    { 0x01, 0x03, 0x64, 0x64, 0x06}, /* raw read */
> -    { 0x03, 0x03, 0x64, 0x64, 0x46}, /* spin up */
> -    { 0x04, 0x02, 0x64, 0x64, 0x14}, /* start stop count */
> -    { 0x05, 0x03, 0x64, 0x64, 0x36}, /* remapped sectors */
> -    { 0x00, 0x00, 0x00, 0x00, 0x00}
> +/* These values were based on a Seagate ST3500418AS but have been modified
> +   to make more sense in QEMU */
> +static const int smart_attributes[][12] = {
> +    /* id,  flags, hflags, val, wrst, raw (6 bytes), threshold */
> +    /* raw read error rate*/
> +    { 0x01, 0x03, 0x00, 0x64, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06},
> +    /* spin up */
> +    { 0x03, 0x03, 0x00, 0x64, 0x64, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
> +    /* start stop count */
> +    { 0x04, 0x02, 0x00, 0x64, 0x64, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14},
> +    /* remapped sectors */
> +    { 0x05, 0x03, 0x00, 0x64, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24},
> +    /* power on hours */
> +    { 0x09, 0x03, 0x00, 0x64, 0x64, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
> +    /* power cycle count */
> +    { 0x0c, 0x03, 0x00, 0x64, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
> +    /* airflow-temperature-celsius */
> +    { 190,  0x03, 0x00, 0x45, 0x45, 0x1f, 0x00, 0x1f, 0x1f, 0x00, 0x00, 0x32},
> +    /* end of list */
> +    { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}
>  };
> 
>  /* XXX: DVDs that could fit on a CD will be reported as a CD */
> @@ -1843,6 +1856,7 @@ void ide_exec_cmd(IDEBus *bus, uint32_t val)
>          break;
>      case WIN_CHECKPOWERMODE1:
>      case WIN_CHECKPOWERMODE2:
> +        s->error = 0;
>          s->nsector = 0xff; /* device active or idle */
>          s->status = READY_STAT | SEEK_STAT;
>          ide_set_irq(s->bus);
> @@ -2097,7 +2111,7 @@ void ide_exec_cmd(IDEBus *bus, uint32_t val)
>  		if (smart_attributes[n][0] == 0)
>  			break;
>  		s->io_buffer[2+0+(n*12)] = smart_attributes[n][0];
> -		s->io_buffer[2+1+(n*12)] = smart_attributes[n][4];
> +		s->io_buffer[2+1+(n*12)] = smart_attributes[n][11];
>  		}
>  		for (n=0; n<511; n++) /* checksum */
>  		s->io_buffer[511] += s->io_buffer[n];
> @@ -2110,12 +2124,13 @@ void ide_exec_cmd(IDEBus *bus, uint32_t val)
>  		memset(s->io_buffer, 0, 0x200);
>  		s->io_buffer[0] = 0x01; /* smart struct version */
>  		for (n=0; n<30; n++) {
> -		if (smart_attributes[n][0] == 0)
> +		    if (smart_attributes[n][0] == 0) {
>  			break;
> -		s->io_buffer[2+0+(n*12)] = smart_attributes[n][0];
> -		s->io_buffer[2+1+(n*12)] = smart_attributes[n][1];
> -		s->io_buffer[2+3+(n*12)] = smart_attributes[n][2];
> -		s->io_buffer[2+4+(n*12)] = smart_attributes[n][3];
> +		    }
> +		    int i;
> +		    for(i = 0; i < 11; i++) {
> +			s->io_buffer[2+i+(n*12)] = smart_attributes[n][i];
> +		    }
>  		}
>  		s->io_buffer[362] = 0x02 | (s->smart_autosave?0x80:0x00);
>  		if (s->smart_selftest_count == 0) {
> 
> 
> 
> 
> 

-- 
Ryan Harper
Software Engineer; Linux Technology Center
IBM Corp., Austin, Tx
ryanh@us.ibm.com

  parent reply	other threads:[~2011-03-09  4:26 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-03-01 13:30 [Qemu-devel] [PATCH v5] PING: Fix ATA SMART and CHECK POWER MODE Brian Wheeler
2011-03-06 19:26 ` Aurelien Jarno
2011-03-07  8:28   ` Kevin Wolf
2011-03-07  9:51     ` Stefan Hajnoczi
2011-03-09  4:26 ` Ryan Harper [this message]
2011-03-09  9:32   ` Kevin Wolf

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=20110309042616.GN23238@us.ibm.com \
    --to=ryanh@us.ibm.com \
    --cc=bdwheele@indiana.edu \
    --cc=kwolf@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).