4 * Home page of code is: http://www.smartmontools.org
6 * Copyright (C) 2008-18 Christian Franke
8 * SPDX-License-Identifier: GPL-2.0-or-later
14 #include "dev_ata_cmd_set.h"
18 const char * dev_ata_cmd_set_cpp_cvsid
= "$Id: dev_ata_cmd_set.cpp 4760 2018-08-19 18:45:53Z chrfranke $"
19 DEV_ATA_CMD_SET_H_CVSID
;
22 /////////////////////////////////////////////////////////////////////////////
23 // ata_device_with_command_set
25 // Adapter routine to implement new ATA pass through with old interface
27 bool ata_device_with_command_set::ata_pass_through(const ata_cmd_in
& in
, ata_cmd_out
& out
)
29 if (!ata_cmd_is_ok(in
, true)) // data_out_support
32 smart_command_set command
= (smart_command_set
)-1;
34 char * data
= (char *)in
.buffer
;
36 switch (in
.in_regs
.command
) {
37 case ATA_IDENTIFY_DEVICE
:
40 case ATA_IDENTIFY_PACKET_DEVICE
:
43 case ATA_CHECK_POWER_MODE
:
44 command
= CHECK_POWER_MODE
;
45 data
= buffer
; data
[0] = 0;
48 switch (in
.in_regs
.features
) {
49 case ATA_SMART_ENABLE
:
52 case ATA_SMART_READ_VALUES
:
53 command
= READ_VALUES
;
55 case ATA_SMART_READ_THRESHOLDS
:
56 command
= READ_THRESHOLDS
;
58 case ATA_SMART_READ_LOG_SECTOR
:
60 select
= in
.in_regs
.lba_low
;
62 case ATA_SMART_WRITE_LOG_SECTOR
:
64 select
= in
.in_regs
.lba_low
;
66 case ATA_SMART_DISABLE
:
69 case ATA_SMART_STATUS
:
70 command
= (in
.out_needed
.lba_high
? STATUS_CHECK
: STATUS
);
72 case ATA_SMART_AUTO_OFFLINE
:
73 command
= AUTO_OFFLINE
;
74 select
= in
.in_regs
.sector_count
;
76 case ATA_SMART_AUTOSAVE
:
78 select
= in
.in_regs
.sector_count
;
80 case ATA_SMART_IMMEDIATE_OFFLINE
:
81 command
= IMMEDIATE_OFFLINE
;
82 select
= in
.in_regs
.lba_low
;
85 return set_err(ENOSYS
, "Unknown SMART command");
89 return set_err(ENOSYS
, "Non-SMART commands not implemented");
92 clear_err(); errno
= 0;
93 int rc
= ata_command_interface(command
, select
, data
);
101 case CHECK_POWER_MODE
:
102 out
.out_regs
.sector_count
= data
[0];
106 case 0: // Good SMART status
107 out
.out_regs
.lba_high
= 0xc2; out
.out_regs
.lba_mid
= 0x4f;
109 case 1: // Bad SMART status
110 out
.out_regs
.lba_high
= 0x2c; out
.out_regs
.lba_mid
= 0xf4;