From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from [140.186.70.92] (port=51201 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1PxAyf-0003o7-Ss for qemu-devel@nongnu.org; Tue, 08 Mar 2011 23:26:27 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1PxAye-0007eF-9U for qemu-devel@nongnu.org; Tue, 08 Mar 2011 23:26:25 -0500 Received: from e6.ny.us.ibm.com ([32.97.182.146]:32782) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1PxAye-0007dl-2V for qemu-devel@nongnu.org; Tue, 08 Mar 2011 23:26:24 -0500 Received: from d01dlp02.pok.ibm.com (d01dlp02.pok.ibm.com [9.56.224.85]) by e6.ny.us.ibm.com (8.14.4/8.13.1) with ESMTP id p29423rm003262 for ; Tue, 8 Mar 2011 23:02:03 -0500 Received: from d01relay07.pok.ibm.com (d01relay07.pok.ibm.com [9.56.227.147]) by d01dlp02.pok.ibm.com (Postfix) with ESMTP id CE56A6E8036 for ; Tue, 8 Mar 2011 23:26:19 -0500 (EST) Received: from d01av01.pok.ibm.com (d01av01.pok.ibm.com [9.56.224.215]) by d01relay07.pok.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id p294QJKv2392182 for ; Tue, 8 Mar 2011 23:26:19 -0500 Received: from d01av01.pok.ibm.com (loopback [127.0.0.1]) by d01av01.pok.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id p294QJc3026124 for ; Tue, 8 Mar 2011 23:26:19 -0500 Date: Tue, 8 Mar 2011 22:26:16 -0600 From: Ryan Harper Subject: Re: [Qemu-devel] [PATCH v5] PING: Fix ATA SMART and CHECK POWER MODE Message-ID: <20110309042616.GN23238@us.ibm.com> References: <1298986223.419.0.camel@nibbler.dlib.indiana.edu> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1298986223.419.0.camel@nibbler.dlib.indiana.edu> List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Brian Wheeler Cc: Kevin Wolf , qemu-devel * Brian Wheeler [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 > 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 > > -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