Ticket #184: check_power_status_result.patch
File check_power_status_result.patch, 3.6 KB (added by , 9 years ago) |
---|
-
atacmds.cpp
797 797 if ((smartcommandhandler(device, CHECK_POWER_MODE, 0, (char *)&result))) 798 798 return -1; 799 799 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) 801 804 pout("ataCheckPowerMode(): ATA CHECK POWER MODE returned unknown Sector Count Register value %02x\n", result); 802 805 803 806 return (int)result; -
smartd.cpp
427 427 428 428 bool powermodefail; // true if power mode check failed 429 429 int powerskipcnt; // Number of checks skipped due to idle or standby mode 430 int lastpowermodeskipped; // the last power mode that was skipped 430 431 431 432 // SCSI ONLY 432 433 unsigned char SmartPageSupported; // has log sense IE page (0x2f) … … 459 460 tempmin_delay(0), 460 461 powermodefail(false), 461 462 powerskipcnt(0), 463 lastpowermodeskipped(0), 462 464 SmartPageSupported(false), 463 465 TempPageSupported(false), 464 466 ReadECounterPageSupported(false), … … 2066 2068 PrintOut(LOG_CRIT, "Device: %s, no ATA CHECK POWER STATUS support, ignoring -n Directive\n", name); 2067 2069 cfg.powermode=0; 2068 2070 } 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) { 2070 2075 PrintOut(LOG_CRIT, "Device: %s, CHECK POWER STATUS returned %d, not ATA compliant, ignoring -n Directive\n", 2071 2076 name, powermode); 2072 2077 cfg.powermode=0; … … 3044 3049 if (cfg.powermode>=1) 3045 3050 dontcheck=1; 3046 3051 break; 3047 case 0 :3052 case 0x00: 3048 3053 // STANDBY 3049 3054 mode="STANDBY"; 3050 3055 if (cfg.powermode>=2) 3051 3056 dontcheck=1; 3052 3057 break; 3058 case 0x01: 3059 // STANDBY_Y 3060 mode="STANDBY_Y"; 3061 if (cfg.powermode>=2) 3062 dontcheck=1; 3063 break; 3053 3064 case 0x80: 3054 3065 // IDLE 3055 3066 mode="IDLE"; … … 3056 3067 if (cfg.powermode>=3) 3057 3068 dontcheck=1; 3058 3069 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; 3059 3088 case 0xff: 3060 3089 // ACTIVE/IDLE 3090 case 0x40: 3091 // ACTIVE 3092 case 0x41: 3093 // ACTIVE 3061 3094 mode="ACTIVE or IDLE"; 3062 3095 break; 3063 3096 default: … … 3073 3106 // skip at most powerskipmax checks 3074 3107 if (!cfg.powerskipmax || state.powerskipcnt<cfg.powerskipmax) { 3075 3108 CloseDevice(atadev, name); 3076 if ( !state.powerskipcnt && !cfg.powerquiet)// report first only and avoid waking up system disk3109 if ((!state.powerskipcnt || state.lastpowermodeskipped != powermode) && !cfg.powerquiet) { // report first only and avoid waking up system disk 3077 3110 PrintOut(LOG_INFO, "Device: %s, is in %s mode, suspending checks\n", name, mode); 3111 state.lastpowermodeskipped = powermode; 3112 } 3078 3113 state.powerskipcnt++; 3079 3114 return 0; 3080 3115 }