50
50
#define SAT_ATA_PASS_THROUGH16 0x85
51
51
#define SAT_ATA_PASS_THROUGH16_LEN 16
52
52
#define SAT_ATA_RETURN_DESC 9 /* ATA Return (sense) Descriptor */
53
#define ASCQ_ATA_PT_INFO_AVAILABLE 0x1d
54
55
#define ATA_CHECK_POWER_MODE 0xe5
56
57
#define EBUFF_SZ 256
58
static char * version_str = "1.03 20070129";
59
static const char * version_str = "1.04 20120319";
63
/* Returns length of decoded fixed format sense for SAT ATA pass-through
64
* command, else returns 0. If returns 0 (expected sense data not found)
65
* then '\0' placed in first byte of bp. */
67
sg_sat_decode_fixed_sense(const unsigned char * sp, int slen, char * bp,
68
int max_blen, int verbose)
72
if ((NULL == bp) || (NULL == sp) || (max_blen < 1) || (slen < 14))
75
if ((0x70 != (0x7f & sp[0])) ||
76
(SPC_SK_RECOVERED_ERROR != (0xf & sp[2])) ||
77
(0 != sp[12]) || (ASCQ_ATA_PT_INFO_AVAILABLE != sp[13]))
79
n = snprintf(bp, max_blen, "error=0x%x, status=0x%x, device=0x%x, "
80
"sector_count(7:0)=0x%x%c\n", sp[3], sp[4], sp[5], sp[6],
81
((0x40 & sp[8]) ? '+' : ' '));
84
n += snprintf(bp + n, max_blen - n, "extend=%d, log_index=0x%x, "
85
"lba_high,mid,low(7:0)=0x%x,0x%x,0x%x%c\n",
86
(!!(0x80 & sp[8])), (0xf & sp[8]), sp[9], sp[10], sp[11],
87
((0x20 & sp[8]) ? '+' : ' '));
91
n += snprintf(bp + n, max_blen - n, " sector_count_upper_nonzero="
92
"%d, lba_upper_nonzero=%d\n", !!(0x40 & sp[8]),
94
return (n >= max_blen) ? max_blen - 1 : n;
60
98
int main(int argc, char * argv[])