aboutsummaryrefslogtreecommitdiff
path: root/src/sg_inq.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/sg_inq.c')
-rw-r--r--src/sg_inq.c92
1 files changed, 61 insertions, 31 deletions
diff --git a/src/sg_inq.c b/src/sg_inq.c
index 69fdb6f8..62d480e8 100644
--- a/src/sg_inq.c
+++ b/src/sg_inq.c
@@ -1201,8 +1201,10 @@ decode_dev_ids(const char * leadin, unsigned char * buff, int len, int do_hex)
}
if (k)
printf(" vendor specific: %.*s\n", i_len, ip);
- else
+ else {
+ printf(" vendor specific:\n");
dStrHex((const char *)ip, i_len, -1);
+ }
break;
case 1: /* T10 vendor identification */
printf(" vendor id: %.8s\n", ip);
@@ -1221,7 +1223,7 @@ decode_dev_ids(const char * leadin, unsigned char * buff, int len, int do_hex)
printf(" EUI-64 based %d byte identifier\n", i_len);
if (1 != c_set) {
fprintf(stderr, " << expected binary code_set (1)>>\n");
- dStrHex((const char *)ip, i_len, -1);
+ dStrHexErr((const char *)ip, i_len, -1);
break;
}
ci_off = 0;
@@ -1237,7 +1239,7 @@ decode_dev_ids(const char * leadin, unsigned char * buff, int len, int do_hex)
} else if ((8 != i_len) && (12 != i_len)) {
fprintf(stderr, " << can only decode 8, 12 and 16 "
"byte ids>>\n");
- dStrHex((const char *)ip, i_len, -1);
+ dStrHexErr((const char *)ip, i_len, -1);
break;
}
c_id = ((ip[ci_off] << 16) | (ip[ci_off + 1] << 8) |
@@ -1264,20 +1266,20 @@ decode_dev_ids(const char * leadin, unsigned char * buff, int len, int do_hex)
case 3: /* NAA */
if (1 != c_set) {
fprintf(stderr, " << expected binary code_set (1)>>\n");
- dStrHex((const char *)ip, i_len, -1);
+ dStrHexErr((const char *)ip, i_len, -1);
break;
}
naa = (ip[0] >> 4) & 0xff;
if ((naa < 2) || (naa > 6) || (4 == naa)) {
fprintf(stderr, " << unexpected naa [0x%x]>>\n", naa);
- dStrHex((const char *)ip, i_len, -1);
+ dStrHexErr((const char *)ip, i_len, -1);
break;
}
if (2 == naa) { /* NAA IEEE Extended */
if (8 != i_len) {
fprintf(stderr, " << unexpected NAA 2 identifier "
"length: 0x%x>>\n", i_len);
- dStrHex((const char *)ip, i_len, -1);
+ dStrHexErr((const char *)ip, i_len, -1);
break;
}
d_id = (((ip[0] & 0xf) << 8) | ip[1]);
@@ -1295,7 +1297,7 @@ decode_dev_ids(const char * leadin, unsigned char * buff, int len, int do_hex)
if (8 != i_len) {
fprintf(stderr, " << unexpected NAA 3 identifier "
"length: 0x%x>>\n", i_len);
- dStrHex((const char *)ip, i_len, -1);
+ dStrHexErr((const char *)ip, i_len, -1);
break;
}
printf(" NAA 3, Locally assigned:\n");
@@ -1307,7 +1309,7 @@ decode_dev_ids(const char * leadin, unsigned char * buff, int len, int do_hex)
if (8 != i_len) {
fprintf(stderr, " << unexpected NAA 5 identifier "
"length: 0x%x>>\n", i_len);
- dStrHex((const char *)ip, i_len, -1);
+ dStrHexErr((const char *)ip, i_len, -1);
break;
}
c_id = (((ip[0] & 0xf) << 20) | (ip[1] << 12) |
@@ -1328,7 +1330,7 @@ decode_dev_ids(const char * leadin, unsigned char * buff, int len, int do_hex)
if (16 != i_len) {
fprintf(stderr, " << unexpected NAA 6 identifier "
"length: 0x%x>>\n", i_len);
- dStrHex((const char *)ip, i_len, 0);
+ dStrHexErr((const char *)ip, i_len, 0);
break;
}
c_id = (((ip[0] & 0xf) << 20) | (ip[1] << 12) |
@@ -1359,7 +1361,7 @@ decode_dev_ids(const char * leadin, unsigned char * buff, int len, int do_hex)
if ((1 != c_set) || (1 != assoc) || (4 != i_len)) {
fprintf(stderr, " << expected binary code_set, target "
"port association, length 4>>\n");
- dStrHex((const char *)ip, i_len, -1);
+ dStrHexErr((const char *)ip, i_len, -1);
break;
}
d_id = ((ip[2] << 8) | ip[3]);
@@ -1369,7 +1371,7 @@ decode_dev_ids(const char * leadin, unsigned char * buff, int len, int do_hex)
if ((1 != c_set) || (1 != assoc) || (4 != i_len)) {
fprintf(stderr, " << expected binary code_set, target "
"port association, length 4>>\n");
- dStrHex((const char *)ip, i_len, -1);
+ dStrHexErr((const char *)ip, i_len, -1);
break;
}
d_id = ((ip[2] << 8) | ip[3]);
@@ -1379,7 +1381,7 @@ decode_dev_ids(const char * leadin, unsigned char * buff, int len, int do_hex)
if ((1 != c_set) || (0 != assoc) || (4 != i_len)) {
fprintf(stderr, " << expected binary code_set, logical "
"unit association, length 4>>\n");
- dStrHex((const char *)ip, i_len, -1);
+ dStrHexErr((const char *)ip, i_len, -1);
break;
}
d_id = ((ip[2] << 8) | ip[3]);
@@ -1389,7 +1391,7 @@ decode_dev_ids(const char * leadin, unsigned char * buff, int len, int do_hex)
if ((1 != c_set) || (0 != assoc)) {
fprintf(stderr, " << expected binary code_set, logical "
"unit association>>\n");
- dStrHex((const char *)ip, i_len, -1);
+ dStrHexErr((const char *)ip, i_len, -1);
break;
}
printf(" MD5 logical unit identifier:\n");
@@ -1398,7 +1400,7 @@ decode_dev_ids(const char * leadin, unsigned char * buff, int len, int do_hex)
case 8: /* SCSI name string */
if (3 != c_set) {
fprintf(stderr, " << expected UTF-8 code_set>>\n");
- dStrHex((const char *)ip, i_len, -1);
+ dStrHexErr((const char *)ip, i_len, -1);
break;
}
printf(" SCSI name string:\n");
@@ -1430,7 +1432,8 @@ decode_dev_ids(const char * leadin, unsigned char * buff, int len, int do_hex)
sg_get_trans_proto_str(p_id, sizeof(b), b));
break;
default: /* reserved */
- dStrHex((const char *)ip, i_len, -1);
+ fprintf(stderr, " reserved designator=0x%x\n", desig_type);
+ dStrHexErr((const char *)ip, i_len, -1);
break;
}
}
@@ -1442,7 +1445,7 @@ static void
export_dev_ids(unsigned char * buff, int len)
{
int u, j, m, id_len, c_set, assoc, desig_type, i_len;
- int off, d_id, naa, k;
+ int off, d_id, naa, k, p_id;
unsigned char * ucp;
unsigned char * ip;
const char * assoc_str;
@@ -1455,6 +1458,7 @@ export_dev_ids(unsigned char * buff, int len)
ip = buff;
c_set = 1;
assoc = 0;
+ p_id = 0xf;
desig_type = 3;
j = 1;
off = 16;
@@ -1474,6 +1478,7 @@ export_dev_ids(unsigned char * buff, int len)
return;
}
ip = ucp + 4;
+ p_id = ((ucp[0] >> 4) & 0xf); /* protocol identifier */
c_set = (ucp[0] & 0xf);
assoc = ((ucp[1] >> 4) & 0x3);
desig_type = (ucp[1] & 0xf);
@@ -1517,7 +1522,7 @@ export_dev_ids(unsigned char * buff, int len)
case 2: /* EUI-64 based */
if (1 != c_set) {
fprintf(stderr, " << expected binary code_set (1)>>\n");
- dStrHex((const char *)ip, i_len, 0);
+ dStrHexErr((const char *)ip, i_len, 0);
break;
}
printf("SCSI_IDENT_%s_EUI64=", assoc_str);
@@ -1528,20 +1533,20 @@ export_dev_ids(unsigned char * buff, int len)
case 3: /* NAA */
if (1 != c_set) {
fprintf(stderr, " << expected binary code_set (1)>>\n");
- dStrHex((const char *)ip, i_len, 0);
+ dStrHexErr((const char *)ip, i_len, 0);
break;
}
naa = (ip[0] >> 4) & 0xff;
if ((naa < 2) || (naa > 6) || (4 == naa)) {
fprintf(stderr, " << unexpected naa [0x%x]>>\n", naa);
- dStrHex((const char *)ip, i_len, 0);
+ dStrHexErr((const char *)ip, i_len, 0);
break;
}
if (6 != naa) {
if (8 != i_len) {
fprintf(stderr, " << unexpected NAA 2 identifier "
"length: 0x%x>>\n", i_len);
- dStrHex((const char *)ip, i_len, 0);
+ dStrHexErr((const char *)ip, i_len, 0);
break;
}
printf("SCSI_IDENT_%s_NAA=", assoc_str);
@@ -1552,7 +1557,7 @@ export_dev_ids(unsigned char * buff, int len)
if (16 != i_len) {
fprintf(stderr, " << unexpected NAA 6 identifier "
"length: 0x%x>>\n", i_len);
- dStrHex((const char *)ip, i_len, 0);
+ dStrHexErr((const char *)ip, i_len, 0);
break;
}
printf("SCSI_IDENT_%s_NAA=", assoc_str);
@@ -1565,7 +1570,7 @@ export_dev_ids(unsigned char * buff, int len)
if ((1 != c_set) || (1 != assoc) || (4 != i_len)) {
fprintf(stderr, " << expected binary code_set, target "
"port association, length 4>>\n");
- dStrHex((const char *)ip, i_len, 0);
+ dStrHexErr((const char *)ip, i_len, 0);
break;
}
d_id = ((ip[2] << 8) | ip[3]);
@@ -1575,7 +1580,7 @@ export_dev_ids(unsigned char * buff, int len)
if ((1 != c_set) || (1 != assoc) || (4 != i_len)) {
fprintf(stderr, " << expected binary code_set, target "
"port association, length 4>>\n");
- dStrHex((const char *)ip, i_len, 0);
+ dStrHexErr((const char *)ip, i_len, 0);
break;
}
d_id = ((ip[2] << 8) | ip[3]);
@@ -1585,7 +1590,7 @@ export_dev_ids(unsigned char * buff, int len)
if ((1 != c_set) || (0 != assoc) || (4 != i_len)) {
fprintf(stderr, " << expected binary code_set, logical "
"unit association, length 4>>\n");
- dStrHex((const char *)ip, i_len, 0);
+ dStrHexErr((const char *)ip, i_len, 0);
break;
}
d_id = ((ip[2] << 8) | ip[3]);
@@ -1595,7 +1600,7 @@ export_dev_ids(unsigned char * buff, int len)
if ((1 != c_set) || (0 != assoc)) {
fprintf(stderr, " << expected binary code_set, logical "
"unit association>>\n");
- dStrHex((const char *)ip, i_len, 0);
+ dStrHexErr((const char *)ip, i_len, 0);
break;
}
printf("SCSI_IDENT_%s_MD5=", assoc_str);
@@ -1604,16 +1609,41 @@ export_dev_ids(unsigned char * buff, int len)
case 8: /* SCSI name string */
if (3 != c_set) {
fprintf(stderr, " << expected UTF-8 code_set>>\n");
- dStrHex((const char *)ip, i_len, -1);
+ dStrHexErr((const char *)ip, i_len, -1);
break;
}
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 */
+ case 9: /* Protocol specific port identifier */
+ if (TPROTO_UAS == p_id) {
+ if ((4 != i_len) || (1 != assoc)) {
+ fprintf(stderr, " << UAS (USB) expected target "
+ "port association>>\n");
+ dStrHexErr((const char *)ip, i_len, 0);
+ break;
+ }
+ printf("SCSI_IDENT_%s_UAS_DEVICE_ADDRESS=0x%x\n", assoc_str,
+ ip[0] & 0x7f);
+ printf("SCSI_IDENT_%s_UAS_INTERFACE_NUMBER=0x%x\n", assoc_str,
+ ip[2]);
+ } else if (TPROTO_SOP == p_id) {
+ if ((4 != i_len) && (8 != i_len)) { /* spc4r36h confused */
+ fprintf(stderr, " << SOP (PCIe) descriptor "
+ "length=%d >>\n", i_len);
+ dStrHexErr((const char *)ip, i_len, 0);
+ break;
+ }
+ printf("SCSI_IDENT_%s_SOP_ROUTING_ID=0x%x\n", assoc_str,
+ ((ip[0] << 8) | ip[1]));
+ } else {
+ fprintf(stderr, " << Protocol specific port identifier "
+ "protocol_id=0x%x>>\n", p_id);
+ }
+ break;
default: /* reserved */
- dStrHex((const char *)ip, i_len, -1);
+ fprintf(stderr, " reserved designator=0x%x\n", desig_type);
+ dStrHexErr((const char *)ip, i_len, -1);
break;
}
}
@@ -1737,13 +1767,13 @@ 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), 0); */
+ /* dStrHexErr((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);
- dStrHex((const char *)ucp, ((len > 24) ? 24 : len), 0);
+ dStrHexErr((const char *)ucp, ((len > 24) ? 24 : len), 0);
bump = 24;
break;
}