[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH v5] PING: Fix ATA SMART and CHECK POWER MODE
From: |
Kevin Wolf |
Subject: |
Re: [Qemu-devel] [PATCH v5] PING: Fix ATA SMART and CHECK POWER MODE |
Date: |
Mon, 07 Mar 2011 09:28:13 +0100 |
User-agent: |
Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.15) Gecko/20101027 Fedora/3.0.10-1.fc12 Thunderbird/3.0.10 |
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: address@hidden
>> ----------------
>> 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) {
>>
>>
>>
>>
>>
>>
>>
>