Module Name: src
Committed By: jakllsch
Date: Mon Jun 8 23:26:13 UTC 2009
Modified Files:
src/sbin/atactl: atactl.c
Log Message:
Improve "identify" output slightly:
- Capitialize "Name" in World Wide Name.
- Print the World Wide Name if it exists.
- Use LBA48 maximum address when available for "total sectors" output.
- So that geometry will display on more drives, don't be as strict when
checking for non-ATAPI devices. (This seemed to be an issue on at least
one instance of a Caviar SE16 drive.)
- Check more carefully for valid/relevant queue depth before printing it.
- Increment the queue depth by one for display.
While here, wrap some long lines that I should have had wrapped before they
were commited in rev. 1.46.
To generate a diff of this commit:
cvs rdiff -u -r1.54 -r1.55 src/sbin/atactl/atactl.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sbin/atactl/atactl.c
diff -u src/sbin/atactl/atactl.c:1.54 src/sbin/atactl/atactl.c:1.55
--- src/sbin/atactl/atactl.c:1.54 Sat Jun 6 09:18:55 2009
+++ src/sbin/atactl/atactl.c Mon Jun 8 23:26:13 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: atactl.c,v 1.54 2009/06/06 09:18:55 mlelstv Exp $ */
+/* $NetBSD: atactl.c,v 1.55 2009/06/08 23:26:13 jakllsch Exp $ */
/*-
* Copyright (c) 1998 The NetBSD Foundation, Inc.
@@ -35,7 +35,7 @@
#include <sys/cdefs.h>
#ifndef lint
-__RCSID("$NetBSD: atactl.c,v 1.54 2009/06/06 09:18:55 mlelstv Exp $");
+__RCSID("$NetBSD: atactl.c,v 1.55 2009/06/08 23:26:13 jakllsch Exp $");
#endif
@@ -218,7 +218,7 @@
{ ATA_CMDE_TL, "Time-limited Read/Write" },
{ ATA_CMDE_URGW, "URG bit for WRITE STREAM DMA/PIO" },
{ ATA_CMDE_URGR, "URG bit for READ STREAM DMA/PIO" },
- { ATA_CMDE_WWN, "World Wide name" },
+ { ATA_CMDE_WWN, "World Wide Name" },
{ ATA_CMDE_WQFE, "WRITE DMA QUEUED FUA EXT command" },
{ ATA_CMDE_WFE, "WRITE DMA/MULTIPLE FUA EXT commands" },
{ ATA_CMDE_GPL, "General Purpose Logging feature set" },
@@ -859,6 +859,7 @@
char model[sizeof(inqbuf->atap_model)+1];
char revision[sizeof(inqbuf->atap_revision)+1];
char serial[sizeof(inqbuf->atap_serial)+1];
+ uint64_t capacity;
int needswap = 0;
/* No arguments. */
@@ -899,20 +900,45 @@
printf("Model: %s, Rev: %s, Serial #: %s\n",
model, revision, serial);
+ if (inqbuf->atap_cmd_ext != 0 && inqbuf->atap_cmd_ext != 0xffff &&
+ inqbuf->atap_cmd_ext & ATA_CMDE_WWN)
+ printf("World Wide Name: %016" PRIX64 "\n",
+ ((uint64_t)inqbuf->atap_wwn[0] << 48) |
+ ((uint64_t)inqbuf->atap_wwn[1] << 32) |
+ ((uint64_t)inqbuf->atap_wwn[2] << 16) |
+ ((uint64_t)inqbuf->atap_wwn[3] << 0));
+
printf("Device type: %s, %s\n", inqbuf->atap_config & WDC_CFG_ATAPI ?
"ATAPI" : "ATA", inqbuf->atap_config & ATA_CFG_FIXED ? "fixed" :
"removable");
- if ((inqbuf->atap_config & WDC_CFG_ATAPI_MASK) == 0)
+ capacity = 0;
+
+ if (inqbuf->atap_cmd2_en != 0 && inqbuf->atap_cmd2_en != 0xffff &&
+ inqbuf->atap_cmd2_en & ATA_CMD2_LBA48) {
+ capacity =
+ ((uint64_t)inqbuf->atap_max_lba[3] << 48) |
+ ((uint64_t)inqbuf->atap_max_lba[2] << 32) |
+ ((uint64_t)inqbuf->atap_max_lba[1] << 16) |
+ ((uint64_t)inqbuf->atap_max_lba[0] << 0);
+ } else if (inqbuf->atap_capabilities1 & WDC_CAP_LBA) {
+ capacity = (inqbuf->atap_capacity[1] << 16) |
+ inqbuf->atap_capacity[0];
+ }
+ if ((inqbuf->atap_config & WDC_CFG_ATAPI_MASK) != WDC_CFG_ATAPI) {
+ if (capacity == 0)
+ capacity = inqbuf->atap_cylinders *
+ inqbuf->atap_heads * inqbuf->atap_sectors;
printf("Cylinders: %d, heads: %d, sec/track: %d, total "
- "sectors: %d\n", inqbuf->atap_cylinders,
- inqbuf->atap_heads, inqbuf->atap_sectors,
- (inqbuf->atap_capacity[1] << 16) |
- inqbuf->atap_capacity[0]);
+ "sectors: %" PRIu64 "\n", inqbuf->atap_cylinders,
+ inqbuf->atap_heads, inqbuf->atap_sectors, capacity);
+ }
- if (inqbuf->atap_queuedepth & WDC_QUEUE_DEPTH_MASK)
+ if (((inqbuf->atap_sata_caps & SATA_NATIVE_CMDQ) ||
+ (inqbuf->atap_cmd_set2 & ATA_CMD2_RWQ)) &&
+ (inqbuf->atap_queuedepth & WDC_QUEUE_DEPTH_MASK))
printf("Device supports command queue depth of %d\n",
- inqbuf->atap_queuedepth & WDC_QUEUE_DEPTH_MASK);
+ (inqbuf->atap_queuedepth & WDC_QUEUE_DEPTH_MASK) + 1);
printf("Device capabilities:\n");
print_bitinfo("\t", "\n", inqbuf->atap_capabilities1, ata_caps);
@@ -945,15 +971,22 @@
if (inqbuf->atap_sata_caps != 0 && inqbuf->atap_sata_caps != 0xffff) {
printf("Serial ATA capabilities:\n");
- print_bitinfo("\t", "\n", inqbuf->atap_sata_caps, ata_sata_caps);
+ print_bitinfo("\t", "\n",
+ inqbuf->atap_sata_caps, ata_sata_caps);
+
}
- if (inqbuf->atap_sata_features_supp != 0 && inqbuf->atap_sata_features_supp != 0xffff) {
+ if (inqbuf->atap_sata_features_supp != 0 &&
+ inqbuf->atap_sata_features_supp != 0xffff) {
printf("Serial ATA features:\n");
- if (inqbuf->atap_sata_features_en != 0 && inqbuf->atap_sata_features_en != 0xffff)
- print_bitinfo2("\t", "\n", inqbuf->atap_sata_features_supp, inqbuf->atap_sata_features_en, ata_sata_feat);
+ if (inqbuf->atap_sata_features_en != 0 &&
+ inqbuf->atap_sata_features_en != 0xffff)
+ print_bitinfo2("\t", "\n",
+ inqbuf->atap_sata_features_supp,
+ inqbuf->atap_sata_features_en, ata_sata_feat);
else
- print_bitinfo("\t", "\n", inqbuf->atap_sata_features_supp, ata_sata_feat);
+ print_bitinfo("\t", "\n",
+ inqbuf->atap_sata_features_supp, ata_sata_feat);
}
return;