Diff for /embedaddon/smartmontools/atacmds.cpp between versions 1.1.1.3 and 1.1.1.4

version 1.1.1.3, 2013/07/22 01:17:35 version 1.1.1.4, 2013/10/14 07:54:03
Line 2443  int ataReadSCTTempHist(ata_device * device, ata_sct_te Line 2443  int ataReadSCTTempHist(ata_device * device, ata_sct_te
   return 0;    return 0;
 }  }
   
   // Get/Set Write Cache Reordering
   int ataGetSetSCTWriteCacheReordering(ata_device * device, bool enable, bool persistent, bool set)
   {
     // Check initial status
     ata_sct_status_response sts;
     if (ataReadSCTStatus(device, &sts))
       return -1;
   
     // Do nothing if other SCT command is executing
     if (sts.ext_status_code == 0xffff) {
       pout("Another SCT command is executing, abort Feature Control\n"
            "(SCT ext_status_code 0x%04x, action_code=%u, function_code=%u)\n",
         sts.ext_status_code, sts.action_code, sts.function_code);
       return -1;
     }
   
     ata_sct_feature_control_command cmd; memset(&cmd, 0, sizeof(cmd));
     // CAUTION: DO NOT CHANGE THIS VALUE (SOME ACTION CODES MAY ERASE DISK)
     cmd.action_code   = 4; // Feature Control command
     cmd.function_code  = (set ? 1 : 2); // 1=Set, 2=Get
     cmd.feature_code  = 2; //  Enable/Disable Write Cache Reordering 
     cmd.state         = (enable ? 1 : 2); // 1 enable, 2 disable
     cmd.option_flags  = (persistent ? 0x01 : 0x00);
   
     // swap endian order if needed
     if (isbigendian()) {
       swapx(&cmd.action_code);
       swapx(&cmd.function_code);
       swapx(&cmd.feature_code);
       swapx(&cmd.state);
       swapx(&cmd.option_flags);
     }
   
     // write command via SMART log page 0xe0
     // TODO: Debug output
     ata_cmd_in in;
     in.in_regs.command = ATA_SMART_CMD;
     in.in_regs.lba_high = SMART_CYL_HI; in.in_regs.lba_mid = SMART_CYL_LOW;
     in.in_regs.features = ATA_SMART_WRITE_LOG_SECTOR;
     in.in_regs.lba_low = 0xe0;
     in.set_data_out(&cmd, 1);
   
     if (!set)
       // Time limit returned in ATA registers
       in.out_needed.sector_count = in.out_needed.lba_low = true;
   
     ata_cmd_out out;
     if (!device->ata_pass_through(in, out)) {
       pout("Write SCT (%cet) XXX Error Recovery Control Command failed: %s\n",
         (!set ? 'G' : 'S'), device->get_errmsg());
       return -1;
     }
     int state = out.out_regs.sector_count | (out.out_regs.lba_low << 8);
   
     // re-read and check SCT status
     if (ataReadSCTStatus(device, &sts))
       return -1;
   
     if (!(sts.ext_status_code == 0 && sts.action_code == 4 && sts.function_code == (set ? 1 : 2))) {
       pout("Unexpected SCT status 0x%04x (action_code=%u, function_code=%u)\n",
         sts.ext_status_code, sts.action_code, sts.function_code);
       return -1;
     }
     return state;
   }
   
   
 // Set SCT Temperature Logging Interval  // Set SCT Temperature Logging Interval
 int ataSetSCTTempInterval(ata_device * device, unsigned interval, bool persistent)  int ataSetSCTTempInterval(ata_device * device, unsigned interval, bool persistent)
 {  {

Removed from v.1.1.1.3  
changed lines
  Added in v.1.1.1.4


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>