Hardware/HDD/SSDSandforce.cs
author moel.mich
Tue, 14 Feb 2012 23:07:55 +0000
changeset 340 600962f8a298
parent 339 07a6126a4796
child 343 46b6b567f14f
permissions -rw-r--r--
Added a new sensor type "Factor" for dimensionless values (and similar) that are not to be shown as percent ("Level" type). Changed the write amplification sensor to use the new "Factor" sensor type. Added the temperature SMART attribute for Sandforce SSDs as hidden sensor (as it may show fake results on some hardware).
moel@324
     1
/*
moel@324
     2
  
moel@324
     3
  Version: MPL 1.1/GPL 2.0/LGPL 2.1
moel@324
     4
moel@324
     5
  The contents of this file are subject to the Mozilla Public License Version
moel@324
     6
  1.1 (the "License"); you may not use this file except in compliance with
moel@324
     7
  the License. You may obtain a copy of the License at
moel@324
     8
 
moel@324
     9
  http://www.mozilla.org/MPL/
moel@324
    10
moel@324
    11
  Software distributed under the License is distributed on an "AS IS" basis,
moel@324
    12
  WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
moel@324
    13
  for the specific language governing rights and limitations under the License.
moel@324
    14
moel@324
    15
  The Original Code is the Open Hardware Monitor code.
moel@324
    16
moel@324
    17
  The Initial Developer of the Original Code is 
moel@324
    18
  Michael Möller <m.moeller@gmx.ch>.
moel@325
    19
  Portions created by the Initial Developer are Copyright (C) 2009-2012
moel@324
    20
  the Initial Developer. All Rights Reserved.
moel@324
    21
moel@324
    22
  Contributor(s):
moel@324
    23
    Paul Werelds
moel@324
    24
 
moel@324
    25
  Alternatively, the contents of this file may be used under the terms of
moel@324
    26
  either the GNU General Public License Version 2 or later (the "GPL"), or
moel@324
    27
  the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
moel@324
    28
  in which case the provisions of the GPL or the LGPL are applicable instead
moel@324
    29
  of those above. If you wish to allow use of your version of this file only
moel@324
    30
  under the terms of either the GPL or the LGPL, and not to allow others to
moel@324
    31
  use your version of this file under the terms of the MPL, indicate your
moel@324
    32
  decision by deleting the provisions above and replace them with the notice
moel@324
    33
  and other provisions required by the GPL or the LGPL. If you do not delete
moel@324
    34
  the provisions above, a recipient may use your version of this file under
moel@324
    35
  the terms of any one of the MPL, the GPL or the LGPL.
moel@324
    36
 
moel@324
    37
*/
moel@324
    38
moel@324
    39
namespace OpenHardwareMonitor.Hardware.HDD {
moel@324
    40
  using System.Collections.Generic;
moel@324
    41
moel@338
    42
  [NamePrefix(""), RequireSmart(0xAB), RequireSmart(0xB1)]
moel@324
    43
  internal class SSDSandforce : AbstractHarddrive {
moel@324
    44
moel@324
    45
    private static readonly IEnumerable<SmartAttribute> smartAttributes =
moel@324
    46
      new List<SmartAttribute> {
moel@339
    47
      new SmartAttribute(0x01, SmartNames.RawReadErrorRate),
moel@339
    48
      new SmartAttribute(0x05, SmartNames.RetiredBlockCount, RawToInt),
moel@328
    49
      new SmartAttribute(0x09, SmartNames.PowerOnHours, RawToInt),
moel@328
    50
      new SmartAttribute(0x0C, SmartNames.PowerCycleCount, RawToInt),
moel@339
    51
      new SmartAttribute(0xAB, SmartNames.ProgramFailCount, RawToInt),
moel@339
    52
      new SmartAttribute(0xAC, SmartNames.EraseFailCount, RawToInt),
moel@339
    53
      new SmartAttribute(0xAE, SmartNames.UnexpectedPowerLossCount, RawToInt),
moel@339
    54
      new SmartAttribute(0xB1, SmartNames.WearRangeDelta, RawToInt),
moel@339
    55
      new SmartAttribute(0xB5, SmartNames.AlternativeProgramFailCount, RawToInt),
moel@339
    56
      new SmartAttribute(0xB6, SmartNames.AlternativeEraseFailCount, RawToInt),
moel@339
    57
      new SmartAttribute(0xBB, SmartNames.UncorrectableErrorCount, RawToInt),
moel@340
    58
      new SmartAttribute(0xC2, SmartNames.Temperature, (byte[] raw, byte value) 
moel@340
    59
        => { return value; }, SensorType.Temperature, 0, true), 
moel@328
    60
      new SmartAttribute(0xC3, SmartNames.UnrecoverableEcc), 
moel@339
    61
      new SmartAttribute(0xC4, SmartNames.ReallocationEventCount, RawToInt),
moel@339
    62
      new SmartAttribute(0xE7, SmartNames.RemainingLife, null, 
moel@339
    63
        SensorType.Level, 0),
moel@339
    64
      new SmartAttribute(0xE9, SmartNames.ControllerWritesToNAND, RawToInt,
moel@324
    65
        SensorType.Data, 0),
moel@339
    66
      new SmartAttribute(0xEA, SmartNames.HostWritesToController, RawToInt, 
moel@339
    67
        SensorType.Data, 1),
moel@339
    68
      new SmartAttribute(0xF1, SmartNames.HostWrites, RawToInt, 
moel@339
    69
        SensorType.Data, 1),
moel@339
    70
      new SmartAttribute(0xF2, SmartNames.HostReads, RawToInt, 
moel@339
    71
        SensorType.Data, 2)
moel@324
    72
    };
moel@324
    73
moel@339
    74
    private Sensor writeAmplification;
moel@339
    75
moel@325
    76
    public SSDSandforce(ISmart smart, string name, string firmwareRevision, 
moel@325
    77
      int index, ISettings settings) 
moel@325
    78
      : base(smart, name, firmwareRevision,  index, smartAttributes, settings) 
moel@339
    79
    {
moel@339
    80
      this.writeAmplification = new Sensor("Write Amplification", 1, 
moel@340
    81
        SensorType.Factor, this, settings);    
moel@339
    82
    }
moel@339
    83
moel@339
    84
    public override void UpdateAdditionalSensors(DriveAttributeValue[] values) {
moel@339
    85
      float? controllerWritesToNAND = null;
moel@339
    86
      float? hostWritesToController = null;
moel@339
    87
      foreach (DriveAttributeValue value in values) {
moel@339
    88
        if (value.Identifier == 0xE9)
moel@339
    89
          controllerWritesToNAND = RawToInt(value.RawValue, value.AttrValue);
moel@339
    90
moel@339
    91
        if (value.Identifier == 0xEA)
moel@339
    92
          hostWritesToController = RawToInt(value.RawValue, value.AttrValue);
moel@339
    93
      }
moel@339
    94
      if (controllerWritesToNAND.HasValue && hostWritesToController.HasValue) {
moel@340
    95
        writeAmplification.Value = 
moel@339
    96
          controllerWritesToNAND.Value / hostWritesToController.Value;
moel@339
    97
        ActivateSensor(writeAmplification);
moel@339
    98
      }
moel@339
    99
    }
moel@324
   100
  }
moel@324
   101
}