diff -Nru smartmontools-6.4+svn4214/debian/changelog smartmontools-6.4+svn4214/debian/changelog --- smartmontools-6.4+svn4214/debian/changelog 2016-02-05 07:52:52.000000000 -0800 +++ smartmontools-6.4+svn4214/debian/changelog 2016-07-06 14:33:58.000000000 -0700 @@ -1,3 +1,10 @@ +smartmontools (6.4+svn4214-1ubuntu0.1) xenial; urgency=medium + + * debian/patches/add_acs2_support.patch: Support new ATA POWER MODE + values. Closes LP: #1569843. + + -- Nishanth Aravamudan Wed, 06 Jul 2016 14:33:58 -0700 + smartmontools (6.4+svn4214-1) unstable; urgency=medium [ Helmut Grohne ] diff -Nru smartmontools-6.4+svn4214/debian/patches/add_acs2_support.patch smartmontools-6.4+svn4214/debian/patches/add_acs2_support.patch --- smartmontools-6.4+svn4214/debian/patches/add_acs2_support.patch 1969-12-31 16:00:00.000000000 -0800 +++ smartmontools-6.4+svn4214/debian/patches/add_acs2_support.patch 2016-07-06 14:33:58.000000000 -0700 @@ -0,0 +1,156 @@ +Description: Support new ATA POWER MODE values +Author: Christian Franke +Origin: upstream, https://www.smartmontools.org/changeset/4255 +Origin: upstream, https://www.smartmontools.org/changeset/4256 +Bug: https://www.smartmontools.org/ticket/184 +Bug-Ubuntu: https://launchpad.net/bugs/1569843 + +--- a/atacmds.cpp ++++ b/atacmds.cpp +@@ -797,7 +797,10 @@ + if ((smartcommandhandler(device, CHECK_POWER_MODE, 0, (char *)&result))) + return -1; + +- if (result!=0 && result!=0x80 && result!=0xff) ++ if (result!=0x00 && result!=0x01 ++ && result!=0x40 && result!=0x41 ++ && result!=0x80 && result!=0x81 && result!=0x82 && result!=0x83 ++ && result!=0xff) + pout("ataCheckPowerMode(): ATA CHECK POWER MODE returned unknown Sector Count Register value %02x\n", result); + + return (int)result; +--- a/ataprint.cpp ++++ b/ataprint.cpp +@@ -2532,6 +2532,7 @@ + if (options.powermode) { + unsigned char powerlimit = 0xff; + int powermode = ataCheckPowerMode(device); ++ // TODO: Move to new function used by smartctl and smartd. + switch (powermode) { + case -1: + if (device->is_syscall_unsup()) { +@@ -2539,12 +2540,28 @@ + } + powername = "SLEEP"; powerlimit = 2; + break; +- case 0: ++ // Table 215 of T13/2015-D (ACS-2) Revision 7, June 22, 2011 ++ // Table 293 of T13/BSR INCITS 529 (ACS-4) Revision 12, February 18, 2016 ++ case 0x00: // PM2:Standby, EPC unavailable or Standby_z power condition + powername = "STANDBY"; powerlimit = 3; break; +- case 0x80: ++ case 0x01: // PM2:Standby, Standby_y power condition ++ powername = "STANDBY_Y"; powerlimit = 3; break; ++ case 0x80: // PM1:Idle, EPC unavailable + powername = "IDLE"; powerlimit = 4; break; +- case 0xff: ++ case 0x81: // PM1:Idle, Idle_a power condition ++ powername = "IDLE_A"; powerlimit = 4; break; ++ case 0x82: // PM1:Idle, Idle_b power condition ++ powername = "IDLE_B"; powerlimit = 4; break; ++ case 0x83: // PM1:Idle, Idle_c power condition ++ powername = "IDLE_C"; powerlimit = 4; break; ++ // 0x40/41 were declared obsolete in ACS-3 Revision 1 ++ case 0x40: // PM0:Active, NV Cache power mode enabled, spun down ++ powername = "ACTIVE_NV_DOWN"; break; ++ case 0x41: // PM0:Active, NV Cache power mode enabled, spun up ++ powername = "ACTIVE_NV_UP" ; break; ++ case 0xff: // PM0:Active or PM1:Idle + powername = "ACTIVE or IDLE"; break; ++ + default: + pout("CHECK POWER MODE returned unknown value 0x%02x, ignoring -n option\n", powermode); + break; +--- a/smartd.cpp ++++ b/smartd.cpp +@@ -431,6 +431,7 @@ + + bool powermodefail; // true if power mode check failed + int powerskipcnt; // Number of checks skipped due to idle or standby mode ++ int lastpowermodeskipped; // the last power mode that was skipped + + // SCSI ONLY + unsigned char SmartPageSupported; // has log sense IE page (0x2f) +@@ -463,6 +464,7 @@ + tempmin_delay(0), + powermodefail(false), + powerskipcnt(0), ++ lastpowermodeskipped(0), + SmartPageSupported(false), + TempPageSupported(false), + ReadECounterPageSupported(false), +@@ -2070,7 +2072,10 @@ + PrintOut(LOG_CRIT, "Device: %s, no ATA CHECK POWER STATUS support, ignoring -n Directive\n", name); + cfg.powermode=0; + } +- else if (powermode!=0 && powermode!=0x80 && powermode!=0xff) { ++ else if (powermode!=0x00 && powermode!=0x01 ++ && powermode!=0x40 && powermode!=0x41 ++ && powermode!=0x80 && powermode!=0x81 && powermode!=0x82 && powermode!=0x83 ++ && powermode!=0xff) { + PrintOut(LOG_CRIT, "Device: %s, CHECK POWER STATUS returned %d, not ATA compliant, ignoring -n Directive\n", + name, powermode); + cfg.powermode=0; +@@ -3048,20 +3053,48 @@ + if (cfg.powermode>=1) + dontcheck=1; + break; +- case 0: ++ case 0x00: + // STANDBY + mode="STANDBY"; + if (cfg.powermode>=2) + dontcheck=1; + break; ++ case 0x01: ++ // STANDBY_Y ++ mode="STANDBY_Y"; ++ if (cfg.powermode>=2) ++ dontcheck=1; ++ break; + case 0x80: + // IDLE + mode="IDLE"; + if (cfg.powermode>=3) + dontcheck=1; + break; ++ case 0x81: ++ // IDLE_A ++ mode="IDLE_A"; ++ if (cfg.powermode>=3) ++ dontcheck=1; ++ break; ++ case 0x82: ++ // IDLE_B ++ mode="IDLE_B"; ++ if (cfg.powermode>=3) ++ dontcheck=1; ++ break; ++ case 0x83: ++ // IDLE_C ++ mode="IDLE_C"; ++ if (cfg.powermode>=3) ++ dontcheck=1; ++ break; + case 0xff: + // ACTIVE/IDLE ++ case 0x40: ++ // ACTIVE ++ case 0x41: ++ // ACTIVE + mode="ACTIVE or IDLE"; + break; + default: +@@ -3077,8 +3110,11 @@ + // skip at most powerskipmax checks + if (!cfg.powerskipmax || state.powerskipcnt