From: Kevin Wolf <kwolf@redhat.com>
To: Aurelien Jarno <aurelien@aurel32.net>
Cc: qemu-devel <qemu-devel@nongnu.org>
Subject: Re: [Qemu-devel] [PATCH v5] PING: Fix ATA SMART and CHECK POWER MODE
Date: Mon, 07 Mar 2011 09:28:13 +0100 [thread overview]
Message-ID: <4D74971D.5040905@redhat.com> (raw)
In-Reply-To: <20110306192657.GE14590@volta.aurel32.net>
Am 06.03.2011 20:26, schrieb Aurelien Jarno:
> You should Cc: the IDE maintainer (Kevin Wolf) so that this patch can
> get acked. Done with this mail.
Thanks. In fact, I saw the patch, but it still needs a review. Can
whoever commented on the previous versions give it the review and post
an Acked-by? If not, I'll try to get to it myself.
Kevin
>
> On Tue, Mar 01, 2011 at 08:30:23AM -0500, Brian Wheeler wrote:
>> 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.
>>
>> 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) {
>>
>>
>>
>>
>>
>>
>>
>
next prev parent reply other threads:[~2011-03-07 8: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 [this message]
2011-03-07 9:51 ` Stefan Hajnoczi
2011-03-09 4:26 ` Ryan Harper
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=4D74971D.5040905@redhat.com \
--to=kwolf@redhat.com \
--cc=aurelien@aurel32.net \
--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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.