diff options
author | Douglas Gilbert <dgilbert@interlog.com> | 2012-02-24 19:00:45 +0000 |
---|---|---|
committer | Douglas Gilbert <dgilbert@interlog.com> | 2012-02-24 19:00:45 +0000 |
commit | dfcdb2bc3c00d328233373dfcfa3803ca0726716 (patch) | |
tree | 703875b95af995e5b9bda36b6f0354f4fff9e8bc /src | |
parent | c410806c13d2baab90641ef6816866cd6e6bfeff (diff) | |
download | sg3_utils-dfcdb2bc3c00d328233373dfcfa3803ca0726716.tar.gz |
more sync with spc4r34 and sbc3r30
git-svn-id: https://svn.bingwo.ca/repos/sg3_utils/trunk@442 6180dd3e-e324-4e3e-922d-17de1ae2f315
Diffstat (limited to 'src')
-rw-r--r-- | src/sg_inq.c | 120 | ||||
-rw-r--r-- | src/sg_inq_data.c | 16 | ||||
-rw-r--r-- | src/sg_logs.c | 24 | ||||
-rw-r--r-- | src/sg_modes.c | 29 | ||||
-rw-r--r-- | src/sg_persist.c | 30 | ||||
-rw-r--r-- | src/sg_read_buffer.c | 6 | ||||
-rw-r--r-- | src/sg_vpd.c | 65 |
7 files changed, 212 insertions, 78 deletions
diff --git a/src/sg_inq.c b/src/sg_inq.c index d641a260..522164ed 100644 --- a/src/sg_inq.c +++ b/src/sg_inq.c @@ -66,9 +66,10 @@ * information [MAINTENANCE IN, service action = 0xc]; see sg_opcodes. */ -static char * version_str = "1.04 20120222"; /* SPC-4 rev 34 */ +static char * version_str = "1.04 20120224"; /* SPC-4 rev 34 */ +/* Following VPD pages are in ascending page number order */ #define VPD_SUPPORTED_VPDS 0x0 #define VPD_UNIT_SERIAL_NUM 0x80 #define VPD_DEVICE_ID 0x83 @@ -82,11 +83,12 @@ static char * version_str = "1.04 20120222"; /* SPC-4 rev 34 */ #define VPD_DEVICE_CONSTITUENTS 0x8b #define VPD_CFA_PROFILE_INFO 0x8c #define VPD_POWER_CONSUMPTION 0x8d +#define VPD_3PARTY_COPY 0x8f #define VPD_PROTO_LU 0x90 #define VPD_PROTO_PORT 0x91 #define VPD_BLOCK_LIMITS 0xb0 #define VPD_BLOCK_DEV_CHARS 0xb1 -#define VPD_MAN_ASS_SN 0xb1 +#define VPD_MAN_ASS_SN 0xb1 #define VPD_LB_PROVISIONING 0xb2 #define VPD_REFERRALS 0xb3 #define VPD_UPR_EMC 0xc0 @@ -137,7 +139,6 @@ static struct svpd_values_name_t vpd_pg[] = { {VPD_BLOCK_DEV_CHARS, 0, 0, 0, "bdc", "Block device characteristics (SBC)"}, {VPD_BLOCK_LIMITS, 0, 0, 0, "bl", "Block limits (SBC)"}, - {VPD_REFERRALS, 0, 0, 0, "ref", "Referrals (SBC)"}, {VPD_DEVICE_ID, 0, -1, 0, "di", "Device identification"}, #if 0 {VPD_DEVICE_ID, VPD_DI_SEL_AS_IS, -1, 0, "di_asis", "Like 'di' " @@ -150,19 +151,22 @@ static struct svpd_values_name_t vpd_pg[] = { "identification, target device only"}, #endif {VPD_EXT_INQ, 0, -1, 0, "ei", "Extended inquiry data"}, - {VPD_MAN_NET_ADDR, 0, -1, 0, "mna", "Management network addresses"}, - {VPD_MODE_PG_POLICY, 0, -1, 0, "mpp", "Mode page policy"}, {VPD_LB_PROVISIONING, 0, 0, 0, "lbpv", "Logical block provisioning " "(SBC)"}, + {VPD_MAN_NET_ADDR, 0, -1, 0, "mna", "Management network addresses"}, + {VPD_MODE_PG_POLICY, 0, -1, 0, "mpp", "Mode page policy"}, {VPD_POWER_CONDITION, 0, -1, 0, "po", "Power condition"}, {VPD_POWER_CONSUMPTION, 0, -1, 0, "psm", "Power consumption"}, {VPD_PROTO_LU, 0, 0x0, 0, "pslu", "Protocol-specific logical unit " "information"}, {VPD_PROTO_PORT, 0, 0x0, 0, "pspo", "Protocol-specific port information"}, + {VPD_REFERRALS, 0, 0, 0, "ref", "Referrals (SBC)"}, {VPD_SOFTW_INF_ID, 0, -1, 0, "sii", "Software interface identification"}, {VPD_UNIT_SERIAL_NUM, 0, -1, 0, "sn", "Unit serial number"}, {VPD_SCSI_PORTS, 0, -1, 0, "sp", "SCSI ports"}, {VPD_SUPPORTED_VPDS, 0, -1, 0, "sv", "Supported VPD pages"}, + {VPD_3PARTY_COPY, 0, -1, 0, "tpc", "Third party copy"}, + /* Following are vendor specific */ {VPD_RDAC_VAC, 0, -1, 1, "rdac_vac", "RDAC volume access control (IBM)"}, {VPD_RDAC_VERS, 0, -1, 1, "rdac_vers", "RDAC software version (IBM)"}, {VPD_UPR_EMC, 0, -1, 1, "upr", "Unit path report (EMC)"}, @@ -247,7 +251,8 @@ usage() " --export|-u SCSI_IDENT_<assoc>_<type>=<ident> output " "format.\n" " Defaults to device id page (0x83) if --page " - "not given\n" + "not given,\n" + " only supported for VPD pages 0x80 and 0x83\n" " --extended|-E|-x decode extended INQUIRY data VPD page " "(0x86)\n" " --help|-h print usage message then exit\n" @@ -664,6 +669,45 @@ dStrRaw(const char* str, int len) printf("%c", str[k]); } +static int +encode_whitespaces(unsigned char *str, int inlen) +{ + int outlen = inlen; + int i, j = 0, k, valid = 0; + + /* Skip initial whitespaces */ + while (isblank(str[j])) + j++; + k = j; + /* Strip trailing whitespaces */ + while (outlen > k && + (isblank(str[outlen - 1]) || str[outlen - 1] == '\0')) { + str[outlen - 1] = '\0'; + outlen--; + } + for (i = 0; (k < outlen); ++k) { + if (isblank(str[k])) { + if (i > 0 && str[i - 1] != '_') { + str[i] = '_'; + valid++; + i++; + } + } else if (!isprint(str[k])) { + str[i] = '.'; + i++; + } else { + str[i] = str[k]; + valid++; + i++; + } + } + if (!valid) { + i = 0; + } + str[i] = '\0'; + return i; +} + struct vpd_name { int number; int peri_type; @@ -687,6 +731,7 @@ static struct vpd_name vpd_name_arr[] = { {VPD_DEVICE_CONSTITUENTS, 0, "Device constituents"}, {VPD_CFA_PROFILE_INFO, 0, "CFA profile information"}, /* 0x8c */ {VPD_POWER_CONSUMPTION, 0, "Power consumption"}, /* 0x8d */ + {VPD_3PARTY_COPY, 0, "Third party copy"}, /* 0x8f */ /* 0xb0 to 0xbf are per peripheral device type */ {VPD_BLOCK_LIMITS, 0, "Block limits (sbc2)"}, /* 0xb0 */ {VPD_BLOCK_DEV_CHARS, 0, "Block device characteristics (sbc3)"}, @@ -1186,6 +1231,11 @@ decode_dev_ids(const char * leadin, unsigned char * buff, int len, int do_hex) */ printf(" %s\n", (const char *)ip); break; + case 9: /* PCIe routing ID */ + /* added in sbc4r34, no limits on code_set or association ?? */ + d_id = ((ip[0] << 8) | ip[1]); + printf(" PCIe routing ID: 0x%x\n", d_id); + break; default: /* reserved */ dStrHex((const char *)ip, i_len, -1); break; @@ -1238,28 +1288,16 @@ export_dev_ids(unsigned char * buff, int len) case 0: /* vendor specific */ k = 0; if ((1 == c_set) || (2 == c_set)) { /* ASCII or UTF-8 */ - for (k = 0; (k < i_len); ++k) { - if (isblank(ip[k])) { - ip[k]='_'; - } else if (!isprint(ip[k])) { - ip[k] = '.'; - } - } + k = encode_whitespaces(ip, i_len); if (k >= i_len) k = 1; } if (k) - printf("SCSI_IDENT_%s_VENDOR=%.*s\n", assoc_str, i_len, ip); - else - dStrHex((const char *)ip, i_len, 0); + printf("SCSI_IDENT_%s_VENDOR=%.*s\n", assoc_str, k, ip); break; case 1: /* T10 vendor identification */ - for (k = 0; (k < i_len); ++k) { - if (isblank(ip[k])) { - ip[k]='_'; - } - } - printf("SCSI_IDENT_%s_T10=%.*s\n", assoc_str, i_len, ip); + k = encode_whitespaces(ip, i_len); + printf("SCSI_IDENT_%s_T10=%.*s\n", assoc_str, k, ip); break; case 2: /* EUI-64 based */ if (1 != c_set) { @@ -1357,6 +1395,8 @@ export_dev_ids(unsigned char * buff, int len) printf("SCSI_IDENT_%s_NAME=%.*s\n", assoc_str, i_len, (const char *)ip); break; + case 9: /* PCIe Routing ID */ + /* new in spc4r34, looks under-specified, drop through now */ default: /* reserved */ dStrHex((const char *)ip, i_len, -1); break; @@ -1368,7 +1408,7 @@ export_dev_ids(unsigned char * buff, int len) } /* Transport IDs are initiator port identifiers, typically other than the - initiator port issuing a SCSI command. Code borrowed from sg_persist.c */ + initiator port issuing a SCSI command. */ static void decode_transport_id(const char * leadin, unsigned char * ucp, int len) { @@ -1481,6 +1521,10 @@ decode_transport_id(const char * leadin, unsigned char * ucp, int len) bump = 24; break; case TPROTO_NONE: + fprintf(stderr, "%s No specified protocol\n", leadin); + /* dStrHex((const char *)ucp, ((len > 24) ? 24 : len), 0); */ + bump = 24; + break; default: fprintf(stderr, "%s unknown protocol id=0x%x " "format_code=%d\n", leadin, proto_id, format_code); @@ -1522,6 +1566,8 @@ decode_x_inq_vpd(unsigned char * buff, int len, int do_hex) (buff[10] << 8) + buff[11]); /* spc4r27 */ printf(" POA_SUP=%d HRA_SUP=%d VSA_SUP=%d\n", /* spc4r32 */ !!(buff[12] & 0x80), !!(buff[12] & 0x40), !!(buff[12] & 0x20)); + printf(" Maximum supported sense data length=%d\n", + buff[13]); /* spc4r34 */ } /* VPD_SOFTW_INF_ID */ @@ -2397,7 +2443,7 @@ decode_vpd(int sg_fd, const struct opts_t * optsp) switch (optsp->page_num) { case VPD_UNIT_SERIAL_NUM: - if (! optsp->do_raw) + if (! optsp->do_raw && ! optsp->do_export) printf("VPD INQUIRY: Unit serial number page\n"); res = sg_ll_inquiry(sg_fd, 0, 1, VPD_UNIT_SERIAL_NUM, rsp_buff, DEF_ALLOC_LEN, 1, optsp->do_verbose); @@ -2420,7 +2466,12 @@ decode_vpd(int sg_fd, const struct opts_t * optsp) if (len >= (int)sizeof(obuff)) len = sizeof(obuff) - 1; memcpy(obuff, rsp_buff + 4, len); - printf(" Unit serial number: %s\n", obuff); + if (optsp->do_export) { + len = encode_whitespaces((unsigned char *)obuff, len); + printf("SCSI_IDENT_SERIAL=%s\n", obuff); + } else { + printf(" Unit serial number: %s\n", obuff); + } } } break; @@ -2911,11 +2962,6 @@ main(int argc, char * argv[]) fprintf(stderr, "Version string: %s\n", version_str); return 0; } - if (opts.do_export && (NULL == opts.page_arg)) { - opts.page_num = VPD_DEVICE_ID; - ++opts.do_decode; - ++opts.do_vpd; - } if (opts.page_arg) { if (opts.page_num >= 0) { fprintf(stderr, "Given '-p' option and another option that " @@ -2962,6 +3008,20 @@ main(int argc, char * argv[]) opts.page_num = n; } } + if (opts.do_export) { + if (NULL == opts.page_arg) { + opts.page_num = VPD_DEVICE_ID; + } + if (opts.page_num != VPD_DEVICE_ID && + opts.page_num != VPD_UNIT_SERIAL_NUM) { + fprintf(stderr, "Option '--export' only supported " + "for VPD pages 0x80 and 0x83\n"); + usage_for(&opts); + return SG_LIB_SYNTAX_ERROR; + } + ++opts.do_decode; + ++opts.do_vpd; + } if ((0 == opts.do_cmddt) && (opts.page_num >= 0) && opts.p_given) ++opts.do_vpd; diff --git a/src/sg_inq_data.c b/src/sg_inq_data.c index 83a77768..690b88bc 100644 --- a/src/sg_inq_data.c +++ b/src/sg_inq_data.c @@ -9,7 +9,7 @@ /* A utility program originally written for the Linux OS SCSI subsystem. -* Copyright (C) 2000-2011 D. Gilbert +* Copyright (C) 2000-2012 D. Gilbert * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2, or (at your option) @@ -48,7 +48,7 @@ struct sg_version_descriptor { const char * name; }; -/* table from SPC-4 revision 33 [sorted numerically (from Annex D.8)] */ +/* table from SPC-4 revision 34 [sorted numerically (from Annex E.9)] */ /* Can also be obtained from : http://www.t10.org/lists/stds.txt */ struct sg_version_descriptor sg_version_descriptor_arr[] = { {0x0, "Version Descriptor not supported or No standard identified"}, @@ -167,6 +167,7 @@ struct sg_version_descriptor sg_version_descriptor_arr[] = { {0x3e7, "SES-2 T10/1559-D revision 19"}, {0x3eb, "SES-2 T10/1559-D revision 20"}, {0x3f0, "SES-2 ANSI INCITS 448-2008"}, + {0x3f2, "SES-2 ISO/IEC 14776-372"}, {0x400, "SSC-3 (no version claimed)"}, {0x403, "SSC-3 T10/1611-D revision 04a"}, {0x407, "SSC-3 T10/1611-D revision 05"}, @@ -186,6 +187,7 @@ struct sg_version_descriptor sg_version_descriptor_arr[] = { {0x463, "SPC-4 T10/1731-D revision 23"}, {0x480, "SMC-3 (no version claimed)"}, {0x482, "SMC-3 T10/1730-D revision 15"}, + {0x482, "SMC-3 T10/1730-D revision 16"}, {0x4a0, "ADC-2 (no version claimed)"}, {0x4a7, "ADC-2 T10/1741-D revision 7"}, {0x4aa, "ADC-2 T10/1741-D revision 8"}, @@ -196,7 +198,8 @@ struct sg_version_descriptor sg_version_descriptor_arr[] = { {0x4e5, "MMC-6 T10/1836-D revision 02g"}, {0x4e6, "MMC-6 MMC-6 ANSI INCITS 468-2010"}, {0x500, "ADC-3 (no version claimed)"}, - {0x502, "ADC-3 T10/1895-D revision 04"}, + {0x502, "ADC-3 T10/1895-D revision 04"}, + {0x504, "ADC-3 T10/1895-D revision 05"}, {0x520, "SSC-4 (no version claimed)"}, {0x523, "SSC-4 T10/2123-D revision 2"}, {0x560, "OSD-3 (no version claimed)"}, @@ -261,6 +264,7 @@ struct sg_version_descriptor sg_version_descriptor_arr[] = { {0xa42, "FCP-4 T10/1828-D revision 01"}, {0xa44, "FCP-4 T10/1828-D revision 02"}, {0xa45, "FCP-4 T10/1828-D revision 02b"}, + {0xa46, "FCP-4 ANSI INCITS 481-2011"}, {0xaa0, "SPI (no version claimed)"}, {0xab9, "SPI T10/0855-D revision 15a"}, {0xaba, "SPI ANSI INCITS 253-1995"}, @@ -302,6 +306,7 @@ struct sg_version_descriptor sg_version_descriptor_arr[] = { {0xc07, "SAS-1.1 T10/1602-D revision 9"}, {0xc0f, "SAS-1.1 T10/1602-D revision 10"}, {0xc11, "SAS-1.1 ANSI INCITS 417-2006"}, + {0xc12, "SAS-1.1 ISO/IEC 14776-151"}, {0xc20, "SAS-2 (no version claimed)"}, {0xc23, "SAS-2 T10/1760-D revision 14"}, {0xc27, "SAS-2 T10/1760-D revision 15"}, @@ -311,6 +316,7 @@ struct sg_version_descriptor sg_version_descriptor_arr[] = { {0xc48, "SAS-2.1 T10/2125-D revision 04"}, {0xc4a, "SAS-2.1 T10/2125-D revision 06"}, {0xc4b, "SAS-2.1 T10/2125-D revision 07"}, + {0xc4e, "SAS-2.1 ANSI INCITS 478-2011"}, {0xc60, "SAS-3 (no version claimed)"}, {0xd20, "FC-PH (no version claimed)"}, {0xd3b, "FC-PH ANSI INCITS 230-1994"}, @@ -363,6 +369,7 @@ struct sg_version_descriptor sg_version_descriptor_arr[] = { {0xee2, "FC-FS-3 T11/1861-D revision 0.9"}, {0xee7, "FC-FS-3 T11/1861-D revision 1.0"}, {0xee9, "FC-FS-3 T11/1861-D revision 1.10"}, + {0xeeb, "FC-FS-3 ANSI INCITS 470-2011"}, {0xf00, "FC-LS-2 (no version claimed)"}, {0xf03, "FC-LS-2 T11/2103-D revision 2.11"}, {0xf05, "FC-LS-2 T11/2103-D revision 2.21"}, @@ -372,6 +379,7 @@ struct sg_version_descriptor sg_version_descriptor_arr[] = { {0xf28, "FC-PI-5 T11/2118-D revision 3.00"}, {0xf2a, "FC-PI-5 T11/2118-D revision 6.00"}, {0xf2b, "FC-PI-5 T11/2118-D revision 6.10"}, + {0xf2e, "FC-PI-5 ANSI INCITS 479-2011"}, {0xf40, "FC-PI-6 (no version claimed)"}, {0xf60, "FC-FS-4 (no version claimed)"}, {0xf80, "FC-LS-3 (no version claimed)"}, @@ -411,6 +419,7 @@ struct sg_version_descriptor sg_version_descriptor_arr[] = { {0x1600, "ATA/ATAPI-7 (no version claimed)"}, {0x1602, "ATA/ATAPI-7 T13/1532-D revision 3"}, {0x161c, "ATA/ATAPI-7 ANSI INCITS 397-2005"}, + {0x161e, "ATA/ATAPI-7 ISO/IEC 24739"}, {0x1620, "ATA/ATAPI-8 ATA-AAM Architecture model (no version claimed)"}, {0x1621, "ATA/ATAPI-8 ATA-PT Parallel transport (no version claimed)"}, {0x1622, "ATA/ATAPI-8 ATA-AST Serial transport (no version claimed)"}, @@ -441,6 +450,7 @@ struct sg_version_descriptor sg_version_descriptor_arr[] = { {0x20a5, "SPL T10/2124-D revision 7"}, {0x20a7, "SPL SPL ANSI INCITS 476-2011"}, {0x20c0, "SPL-2 (no version claimed)"}, + {0x20c2, "SPL-2 T10/2228-D revision 4"}, {0x20e0, "SPL-3 (no version claimed)"}, {0x21e0, "SOP (no version claimed)"}, {0x2200, "PQI (no version claimed)"}, diff --git a/src/sg_logs.c b/src/sg_logs.c index 0b8dc4c6..3a1460ea 100644 --- a/src/sg_logs.c +++ b/src/sg_logs.c @@ -1,3 +1,14 @@ +/* A utility program originally written for the Linux OS SCSI subsystem. +* Copyright (C) 2000-2012 D. Gilbert +* This program is free software; you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation; either version 2, or (at your option) +* any later version. + + This program outputs information provided by a SCSI LOG SENSE command. + +*/ + #include <unistd.h> #include <fcntl.h> #include <stdio.h> @@ -14,18 +25,7 @@ #include "sg_lib.h" #include "sg_cmds_basic.h" -/* A utility program originally written for the Linux OS SCSI subsystem. -* Copyright (C) 2000-2011 D. Gilbert -* This program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation; either version 2, or (at your option) -* any later version. - - This program outputs information provided by a SCSI LOG SENSE command. - -*/ - -static char * version_str = "1.05 20111020"; /* spc4r30 + sbc3r28 */ +static char * version_str = "1.06 20120223"; /* spc4r34 + sbc3r30 */ #define MX_ALLOC_LEN (0xfffc) #define SHORT_RESP_LEN 128 diff --git a/src/sg_modes.c b/src/sg_modes.c index 0bf89b69..d7180493 100644 --- a/src/sg_modes.c +++ b/src/sg_modes.c @@ -1,3 +1,16 @@ +/* + * Copyright (C) 2000-2012 D. Gilbert + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program outputs information provided by a SCSI MODE SENSE command. + * Does 10 byte MODE SENSE commands by default, Trent Piepho added a "-6" + * switch for force 6 byte mode sense commands. + * This utility cannot modify mode pages. See the sdparm utility for that. + */ + #include <unistd.h> #include <fcntl.h> #include <stdio.h> @@ -12,21 +25,7 @@ #include "sg_lib.h" #include "sg_cmds_basic.h" -/* -* Copyright (C) 2000-2011 D. Gilbert -* This program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation; either version 2, or (at your option) -* any later version. - - This program outputs information provided by a SCSI MODE SENSE command. - Does 10 byte MODE SENSE commands by default, Trent Piepho added a "-6" - switch for force 6 byte mode sense commands. - This utility cannot modify mode pages. See the sdparm utility for that. - -*/ - -static char * version_str = "1.37 20111113"; +static char * version_str = "1.38 20120224"; #define DEF_ALLOC_LEN (1024 * 4) #define DEF_6_ALLOC_LEN 252 diff --git a/src/sg_persist.c b/src/sg_persist.c index 8bc188e3..6f34f036 100644 --- a/src/sg_persist.c +++ b/src/sg_persist.c @@ -1,3 +1,13 @@ +/* A utility program originally written for the Linux OS SCSI subsystem. + * Copyright (C) 2004-2012 D. Gilbert + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program issues the SCSI PERSISTENT IN and OUT commands. + */ + #include <unistd.h> #include <fcntl.h> #include <stdio.h> @@ -16,18 +26,7 @@ #include "sg_cmds_basic.h" #include "sg_cmds_extra.h" -/* A utility program originally written for the Linux OS SCSI subsystem. -* Copyright (C) 2004-2012 D. Gilbert -* This program is free software; you can redistribute it and/or modify -* it under the terms of the GNU General Public License as published by -* the Free Software Foundation; either version 2, or (at your option) -* any later version. - - This program issues the SCSI PERSISTENT IN and OUT commands. - -*/ - -static char * version_str = "0.38 20120222"; +static char * version_str = "0.38 20120224"; #define PRIN_RKEY_SA 0x0 @@ -198,6 +197,10 @@ usage() "Performs a SCSI PERSISTENT RESERVE (IN or OUT) command\n"); } +/* If num_tids==0 then only one TransportID is assumed with len bytes in + * it. If num_tids>0 then that many TransportIDs is assumed, each in an + * element that is MX_TID_LEN bytes long (and the 'len' argument is + * ignored). */ static void decode_transport_id(const char * leadin, unsigned char * ucp, int len, int num_tids) @@ -302,6 +305,9 @@ decode_transport_id(const char * leadin, unsigned char * ucp, int len, } break; case TPROTO_NONE: + fprintf(stderr, "%s No specified protocol\n", leadin); + /* dStrHex((const char *)ucp, ((len > 24) ? 24 : len), -1); */ + break; default: fprintf(stderr, "%s unknown protocol id=0x%x " "format_code=%d\n", leadin, proto_id, format_code); diff --git a/src/sg_read_buffer.c b/src/sg_read_buffer.c index 52cc08b2..731ed336 100644 --- a/src/sg_read_buffer.c +++ b/src/sg_read_buffer.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006-2011 Luben Tuikov and Douglas Gilbert. + * Copyright (c) 2006-2012 Luben Tuikov and Douglas Gilbert. * All rights reserved. * Use of this source code is governed by a BSD-style * license that can be found in the BSD_LICENSE file. @@ -25,7 +25,7 @@ * This utility issues the SCSI READ BUFFER command to the given device. */ -static char * version_str = "1.07 20110216"; +static char * version_str = "1.08 20120224"; static struct option long_options[] = { @@ -316,7 +316,7 @@ main(int argc, char * argv[]) printf("Echo buffer capacity: %d (0x%x)\n", k, k); break; default: - dStrHex((const char *)resp, rb_len, 1); + dStrHex((const char *)resp, rb_len, (verbose > 1 ? 0 : 1)); break; } } diff --git a/src/sg_vpd.c b/src/sg_vpd.c index 8167eae8..272ecab9 100644 --- a/src/sg_vpd.c +++ b/src/sg_vpd.c @@ -30,7 +30,7 @@ */ -static char * version_str = "0.59 20120222"; /* spc4r34 + sbc3r30 */ +static char * version_str = "0.59 20120224"; /* spc4r34 + sbc3r30 */ extern void svpd_enumerate_vendor(void); extern int svpd_decode_vendor(int sg_fd, int num_vpd, int subvalue, @@ -40,7 +40,7 @@ extern const struct svpd_values_name_t * svpd_find_vendor_by_acron(const char * ap); -/* standard VPD pages */ +/* standard VPD pages, in ascending page number order */ #define VPD_SUPPORTED_VPDS 0x0 #define VPD_UNIT_SERIAL_NUM 0x80 #define VPD_IMP_OP_DEF 0x81 /* obsolete in SPC-2 */ @@ -56,6 +56,7 @@ extern const struct svpd_values_name_t * #define VPD_DEVICE_CONSTITUENTS 0x8b #define VPD_CFA_PROFILE_INFO 0x8c #define VPD_POWER_CONSUMPTION 0x8d +#define VPD_3PARTY_COPY 0x8f #define VPD_PROTO_LU 0x90 #define VPD_PROTO_PORT 0x91 #define VPD_BLOCK_LIMITS 0xb0 /* SBC-3 */ @@ -176,6 +177,7 @@ static struct svpd_values_name_t standard_vpd_pg[] = { {VPD_SECURITY_TOKEN, 0, 0x11, 0, "st", "Security token (OSD)"}, {VPD_SUPPORTED_VPDS, 0, -1, 0, "sv", "Supported VPD pages"}, {VPD_TA_SUPPORTED, 0, 1, 0, "tas", "TapeAlert supported flags (SSC)"}, + {VPD_3PARTY_COPY, 0, -1, 0, "tpc", "Third party copy"}, {0, 0, 0, 0, NULL, NULL}, }; @@ -723,6 +725,8 @@ decode_dev_ids_quiet(unsigned char * buff, int len, int m_assoc, */ printf("%s\n", (const char *)ip); break; + case 9: /* PCIe routing ID */ + break; default: /* reserved */ break; } @@ -994,6 +998,11 @@ decode_designation_descriptor(const unsigned char * ucp, int i_len, */ printf(" %s\n", (const char *)ip); break; + case 9: /* PCIe routing ID */ + /* added in sbc4r34, no limits on code_set or association ?? */ + d_id = ((ip[0] << 8) | ip[1]); + printf(" PCIe routing ID: 0x%x\n", d_id); + break; default: /* reserved */ dStrHex((const char *)ip, i_len, 0); break; @@ -1043,7 +1052,7 @@ decode_dev_ids(const char * print_if_found, unsigned char * buff, int len, } /* Transport IDs are initiator port identifiers, typically other than the - initiator port issuing a SCSI command. Code borrowed from sg_persist.c */ + initiator port issuing a SCSI command. */ static void decode_transport_id(const char * leadin, unsigned char * ucp, int len) { @@ -1156,6 +1165,10 @@ decode_transport_id(const char * leadin, unsigned char * ucp, int len) bump = 24; break; case TPROTO_NONE: + fprintf(stderr, "%s No specified protocol\n", leadin); + /* dStrHex((const char *)ucp, ((len > 24) ? 24 : len), 0); */ + bump = 24; + break; default: fprintf(stderr, "%s unknown protocol id=0x%x " "format_code=%d\n", leadin, proto_id, format_code); @@ -1246,6 +1259,8 @@ decode_x_inq_vpd(unsigned char * b, int len, int do_hex, int do_long, printf(" POA_SUP=%d\n", !!(b[12] & 0x80)); /* spc4r32 */ printf(" HRA_SUP=%d\n", !!(b[12] & 0x40)); /* spc4r32 */ printf(" VSA_SUP=%d\n", !!(b[12] & 0x20)); /* spc4r32 */ + printf(" Maximum supported sense data length=%d\n", + b[13]); /* spc4r34 */ return; } printf(" ACTIVATE_MICROCODE=%d SPT=%d GRD_CHK=%d APP_CHK=%d " @@ -1263,6 +1278,7 @@ decode_x_inq_vpd(unsigned char * b, int len, int do_hex, int do_long, (b[10] << 8) + b[11]); /* spc4r27 */ printf(" POA_SUP=%d HRA_SUP=%d VSA_SUP=%d\n", /* spc4r32 */ !!(b[12] & 0x80), !!(b[12] & 0x40), !!(b[12] & 0x20)); + printf(" Maximum supported sense data length=%d\n", b[13]); /* spc4r34 */ } /* VPD_SOFTW_INF_ID */ @@ -2441,6 +2457,49 @@ svpd_decode_t10(int sg_fd, int num_vpd, int subvalue, int maxlen, int do_hex, return 0; } break; + case VPD_3PARTY_COPY: /* 0x8f */ + if ((! do_raw) && (! do_quiet)) + printf("Third party copy VPD page:\n"); + res = sg_ll_inquiry(sg_fd, 0, 1, num_vpd, rsp_buff, alloc_len, 1, + verbose); + if (0 == res) { + len = ((rsp_buff[2] << 8) + rsp_buff[3]) + 4; /* spc4r25 */ + if (num_vpd != rsp_buff[1]) { + fprintf(stderr, "invalid VPD response; probably a STANDARD " + "INQUIRY response\n"); + if (verbose) { + fprintf(stderr, "First 32 bytes of bad response\n"); + dStrHex((const char *)rsp_buff, 32, 0); + } + return SG_LIB_CAT_MALFORMED; + } + if (len > alloc_len) { + if ((0 == maxlen) && (len < MX_ALLOC_LEN)) { + res = sg_ll_inquiry(sg_fd, 0, 1, num_vpd, rsp_buff, len, + 1, verbose); + if (res) { + fprintf(stderr, "fetching Third party copy page " + "(alloc_len=%d) failed\n", len); + return res; + } + } else { + fprintf(stderr, ">>> warning: response length (%d) " + "longer than requested (%d)\n", len, alloc_len); + len = alloc_len; + } + } + if (do_raw) + dStrRaw((const char *)rsp_buff, len); + else if (do_hex) + dStrHex((const char *)rsp_buff, len, 0); + else { + printf(" Leave decoding of this page until it is wanted, " + "in hex:\n"); + dStrHex((const char *)rsp_buff, len, 0); + } + return 0; + } + break; case VPD_PROTO_LU: /* 0x90 */ if ((! do_raw) && (! do_quiet)) printf("Protocol-specific logical unit information:\n"); |