Ticket #184: check_power_status_result.patch

File check_power_status_result.patch, 3.6 KB (added by Thomas Gatterweh, 4 years ago)
  • atacmds.cpp

     
    797797  if ((smartcommandhandler(device, CHECK_POWER_MODE, 0, (char *)&result)))
    798798    return -1;
    799799
    800   if (result!=0 && result!=0x80 && result!=0xff)
     800  if (result!=0x00 && result!=0x01
     801      && result!=0x40 && result!=0x41
     802      && result!=0x80 && result!=0x81 && result!=0x82 && result!=0x83
     803      && result!=0xff)
    801804    pout("ataCheckPowerMode(): ATA CHECK POWER MODE returned unknown Sector Count Register value %02x\n", result);
    802805
    803806  return (int)result;
  • smartd.cpp

     
    427427
    428428  bool powermodefail;                     // true if power mode check failed
    429429  int powerskipcnt;                       // Number of checks skipped due to idle or standby mode
     430  int lastpowermodeskipped;               // the last power mode that was skipped
    430431
    431432  // SCSI ONLY
    432433  unsigned char SmartPageSupported;       // has log sense IE page (0x2f)
     
    459460  tempmin_delay(0),
    460461  powermodefail(false),
    461462  powerskipcnt(0),
     463  lastpowermodeskipped(0),
    462464  SmartPageSupported(false),
    463465  TempPageSupported(false),
    464466  ReadECounterPageSupported(false),
     
    20662068      PrintOut(LOG_CRIT, "Device: %s, no ATA CHECK POWER STATUS support, ignoring -n Directive\n", name);
    20672069      cfg.powermode=0;
    20682070    }
    2069     else if (powermode!=0 && powermode!=0x80 && powermode!=0xff) {
     2071    else if (powermode!=0x00 && powermode!=0x01
     2072        && powermode!=0x40 && powermode!=0x41
     2073        && powermode!=0x80 && powermode!=0x81 && powermode!=0x82 && powermode!=0x83
     2074        && powermode!=0xff) {
    20702075      PrintOut(LOG_CRIT, "Device: %s, CHECK POWER STATUS returned %d, not ATA compliant, ignoring -n Directive\n",
    20712076               name, powermode);
    20722077      cfg.powermode=0;
     
    30443049      if (cfg.powermode>=1)
    30453050        dontcheck=1;
    30463051      break;
    3047     case 0:
     3052    case 0x00:
    30483053      // STANDBY
    30493054      mode="STANDBY";
    30503055      if (cfg.powermode>=2)
    30513056        dontcheck=1;
    30523057      break;
     3058    case 0x01:
     3059     // STANDBY_Y
     3060      mode="STANDBY_Y";
     3061      if (cfg.powermode>=2)
     3062        dontcheck=1;
     3063      break;
    30533064    case 0x80:
    30543065      // IDLE
    30553066      mode="IDLE";
     
    30563067      if (cfg.powermode>=3)
    30573068        dontcheck=1;
    30583069      break;
     3070    case 0x81:
     3071      // IDLE_A
     3072      mode="IDLE_A";
     3073      if (cfg.powermode>=3)
     3074        dontcheck=1;
     3075      break;
     3076    case 0x82:
     3077      // IDLE_B
     3078      mode="IDLE_B";
     3079      if (cfg.powermode>=3)
     3080        dontcheck=1;
     3081      break;
     3082    case 0x83:
     3083      // IDLE_C
     3084      mode="IDLE_C";
     3085      if (cfg.powermode>=3)
     3086        dontcheck=1;
     3087      break;
    30593088    case 0xff:
    30603089      // ACTIVE/IDLE
     3090    case 0x40:
     3091      // ACTIVE
     3092    case 0x41:
     3093      // ACTIVE
    30613094      mode="ACTIVE or IDLE";
    30623095      break;
    30633096    default:
     
    30733106      // skip at most powerskipmax checks
    30743107      if (!cfg.powerskipmax || state.powerskipcnt<cfg.powerskipmax) {
    30753108        CloseDevice(atadev, name);
    3076         if (!state.powerskipcnt && !cfg.powerquiet) // report first only and avoid waking up system disk
     3109        if ((!state.powerskipcnt || state.lastpowermodeskipped != powermode) && !cfg.powerquiet) { // report first only and avoid waking up system disk
    30773110          PrintOut(LOG_INFO, "Device: %s, is in %s mode, suspending checks\n", name, mode);
     3111          state.lastpowermodeskipped = powermode;
     3112        }
    30783113        state.powerskipcnt++;
    30793114        return 0;
    30803115      }