Annotation of embedaddon/smartmontools/ataidentify.cpp, revision 1.1
1.1 ! misho 1: /*
! 2: * ataidentify.cpp
! 3: *
! 4: * Home page of code is: http://smartmontools.sourceforge.net
! 5: *
! 6: * Copyright (C) 2012-13 Christian Franke <smartmontools-support@lists.sourceforge.net>
! 7: *
! 8: * This program is free software; you can redistribute it and/or modify
! 9: * it under the terms of the GNU General Public License as published by
! 10: * the Free Software Foundation; either version 2, or (at your option)
! 11: * any later version.
! 12: *
! 13: * You should have received a copy of the GNU General Public License
! 14: * (for example COPYING); If not, see <http://www.gnu.org/licenses/>.
! 15: *
! 16: */
! 17:
! 18: #include "config.h"
! 19: #include "ataidentify.h"
! 20:
! 21: const char * ataidentify_cpp_cvsid = "$Id: ataidentify.cpp 3785 2013-03-07 21:58:05Z chrfranke $"
! 22: ATAIDENTIFY_H_CVSID;
! 23:
! 24: #include "int64.h"
! 25: #include "utility.h"
! 26:
! 27:
! 28: // Table 12 of X3T10/0948D (ATA-2) Revision 4c, March 18, 1996
! 29: // Table 9 of X3T13/2008D (ATA-3) Revision 7b, January 27, 1997
! 30: // Tables 11 and 13 of T13/1153D (ATA/ATAPI-4) revision 18, August 19, 1998
! 31: // Tables 20 and 22 of T13/1321D (ATA/ATAPI-5) Revision 3, February 29, 2000
! 32: // Tables 27 and 29 of T13/1410D (ATA/ATAPI-6) Revision 3b, February 26, 2002
! 33: // Tables 16 and 18 of T13/1532D (ATA/ATAPI-7) Volume 1 Revision 4b, April 21, 2004
! 34: // Tables 29 and 39 of T13/1699-D (ATA8-ACS) Revision 6a, September 6, 2008
! 35: // Tables 50 and 61 of T13/2015-D (ACS-2) Revision 7, June 22, 2011
! 36: // Tables 51 and 56 of T13/2161-D (ACS-3) Revision 4g, February 27, 2013
! 37:
! 38: const char * const identify_descriptions[] = {
! 39: " 0 General configuration",
! 40: ". 15 Device identifier: 0 = ATA, 1 = ATAPI",
! 41: ". 14:8 ATA: Vendor specific [RET-3]",
! 42: ". 14 ATAPI: Must be set to 0",
! 43: ". 13 ATAPI: Reserved",
! 44: ". 12:8 ATAPI: Command set: 0x05 = CD/DVD",
! 45: ". 7 Removable media device",
! 46: ". 6 ATA: Not removable controller and/or device [OBS-6]",
! 47: ". 5:3 ATA: Vendor specific [RET-3]",
! 48: ". 6:5 ATAPI: DRQ after PACKET cmd: 0x0 = 3ms, 0x2 = 50us",
! 49: ". 4:3 ATAPI: Reserved",
! 50: ". 2 Response incomplete",
! 51: ". 1 ATA: Vendor specific [RET-3]",
! 52: ". 0 ATA: Reserved",
! 53: ". 1:0 ATAPI: Packet size: 0x0 = 12 byte, 0x1 = 16 byte",
! 54:
! 55: " 1 Cylinders [OBS-6]",
! 56: " 2 Specific configuration (0x37c8/738c/8c73/c837)",
! 57: " 3 Heads [OBS-6]",
! 58: " 4 Vendor specific [RET-3]",
! 59: " 5 Vendor specific [RET-3]",
! 60: " 6 Sectors per track [OBS-6]",
! 61: " 7-8 Reserved for CFA (Sectors per card)",
! 62: " 9 Vendor specific [RET-4]",
! 63: " 10-19 Serial number (String)",
! 64: " 20 Vendor specific [RET-3]",
! 65: " 21 Vendor specific [RET-3]",
! 66: " 22 Vendor specific bytes on READ/WRITE LONG [OBS-4]",
! 67: " 23-26 Firmware revision (String)",
! 68: " 27-46 Model number (String)",
! 69:
! 70: " 47 READ/WRITE MULTIPLE support",
! 71: ". 15:8 Must be set to 0x80",
! 72: ". 7:0 Maximum sectors per DRQ on READ/WRITE MULTIPLE",
! 73:
! 74: " 48 Trusted Computing feature set options",
! 75: ". 15:14 Must be set to 0x1",
! 76: ". 13:1 Reserved for the Trusted Computing Group",
! 77: ". 0 Trusted Computing feature set supported",
! 78:
! 79: " 49 Capabilities",
! 80: ". 15:14 ATA: Reserved for IDENTIFY PACKET DEVICE",
! 81: ". 15 ATAPI: Interleaved DMA supported [OBS-8]",
! 82: ". 14 ATAPI: Command queuing supported [OBS-8]",
! 83: ". 13 ATA: Standard standby timer values supported",
! 84: ". 13 ATAPI: Overlap operation supported [OBS-8]",
! 85: ". 12 ATA: Reserved for IDENTIFY PACKET DEVICE",
! 86: ". 12 ATAPI: ATA software reset required [OBS-5]",
! 87: ". 11 IORDY supported",
! 88: ". 10 IORDY may be disabled",
! 89: ". 9 LBA supported",
! 90: ". 8 DMA supported",
! 91: ". 7:0 Vendor specific [RET-4]",
! 92:
! 93: " 50 Capabilities",
! 94: ". 15:14 Must be set to 0x1",
! 95: ". 13:2 Reserved",
! 96: ". 1 Reserved [OBS-6]",
! 97: ". 0 Vendor specific minimum standby timer value",
! 98:
! 99: " 51 PIO data transfer mode [OBS-5]",
! 100: " 52 Single Word DMA data transfer mode [OBS-3]",
! 101:
! 102: " 53 Field validity / Free-fall Control",
! 103: ". 15:8 Free-fall Control sensitivity",
! 104: ". 7:3 Reserved",
! 105: ". 2 Word 88 (Ultra DMA modes) is valid",
! 106: ". 1 Words 64-70 (PIO modes) are valid",
! 107: ". 0 Words 54-58 (CHS) are valid [OBS-6]",
! 108:
! 109: " 54 Current cylinders [OBS-6]",
! 110: " 55 Current heads [OBS-6]",
! 111: " 56 Current sectors per track [OBS-6]",
! 112: " 57-58 Current capacity in sectors (DWord) [OBS-6]",
! 113:
! 114: " 59 Sanitize Device - READ/WRITE MULTIPLE support",
! 115: ". 15 BLOCK ERASE EXT supported",
! 116: ". 14 OVERWRITE EXT supported",
! 117: ". 13 CRYPTO SCRAMBLE EXT supported",
! 118: ". 12 Sanitize Device feature set supported",
! 119: ". 11:9 Reserved",
! 120: ". 8 Bits 7:0 are valid",
! 121: ". 7:0 Current sectors per DRQ on READ/WRITE MULTIPLE",
! 122:
! 123: " 60-61 User addressable sectors for 28-bit commands (DWord)",
! 124: " 62 Single Word DMA modes [OBS-3]",
! 125:
! 126: " 63 Multiword DMA modes",
! 127: ". 15:11 Reserved",
! 128: ". 10 Multiword DMA mode 2 selected",
! 129: ". 9 Multiword DMA mode 1 selected",
! 130: ". 8 Multiword DMA mode 0 selected",
! 131: ". 7:3 Reserved",
! 132: ". 2 Multiword DMA mode 2 and below supported",
! 133: ". 1 Multiword DMA mode 1 and below supported",
! 134: ". 0 Multiword DMA mode 0 supported",
! 135:
! 136: " 64 PIO modes",
! 137: ". 15:2 Reserved",
! 138: ". 1 PIO mode 4 supported",
! 139: ". 0 PIO mode 3 supported",
! 140:
! 141: " 65 Minimum Multiword DMA cycle time per word in ns",
! 142: " 66 Recommended Multiword DMA cycle time in ns",
! 143: " 67 Minimum PIO cycle time without flow control in ns",
! 144: " 68 Minimum PIO cycle time with IORDY flow control in ns",
! 145:
! 146: " 69 Additional support",
! 147: ". 15 CFast specification supported",
! 148: ". 14 Deterministic data after trim supported",
! 149: ". 13 LPS Alignment Error Reporting Control supported",
! 150: ". 12 DCO IDENTIFY/SET DMA supported [OBS-ACS-3]",
! 151: ". 11 READ BUFFER DMA supported",
! 152: ". 10 WRITE BUFFER DMA supported",
! 153: ". 9 SET MAX SET PASSWORD/UNLOCK DMA supported [OBS-ACS-3]",
! 154: ". 8 DOWNLOAD MICROCODE DMA supported",
! 155: ". 7 Reserved for IEEE 1667",
! 156: ". 6 Optional ATA device 28-bit commands supported",
! 157: ". 5 Trimmed LBA range(s) returning zeroed data supported",
! 158: ". 4 Device encrypts all user data",
! 159: ". 3 Extended number of user addressable sectors supported",
! 160: ". 2 All write cache is non-volatile",
! 161: ". 1:0 Reserved",
! 162:
! 163: " 70 Reserved",
! 164: " 71-74 ATA: Reserved for IDENTIFY PACKET DEVICE",
! 165: " 71 ATAPI: Time in ns from PACKET to bus release [OBS-8]",
! 166: " 72 ATAPI: Time in ns from SERVICE to BSY cleared [OBS-8]",
! 167: " 73-74 ATAPI: Reserved",
! 168:
! 169: " 75 Queue depth",
! 170: ". 15:5 Reserved",
! 171: ". 4:0 Maximum queue depth - 1",
! 172:
! 173: " 76 Serial ATA capabilities",
! 174: ". 15 READ LOG DMA EXT as equiv to READ LOG EXT supported",
! 175: ". 14 Device Auto Partial to Slumber transitions supported",
! 176: ". 13 Host Auto Partial to Slumber transitions supported",
! 177: ". 12 NCQ priority information supported",
! 178: ". 11 Unload while NCQ commands are outstanding supported",
! 179: ". 10 Phy Event Counters supported",
! 180: ". 9 Receipt of host initiated PM requests supported",
! 181: ". 8 NCQ feature set supported",
! 182: ". 7:4 Reserved for Serial ATA",
! 183: ". 3 SATA Gen3 signaling speed (6.0 Gb/s) supported",
! 184: ". 2 SATA Gen2 signaling speed (3.0 Gb/s) supported",
! 185: ". 1 SATA Gen1 signaling speed (1.5 Gb/s) supported",
! 186: ". 0 Must be set to 0",
! 187:
! 188: " 77 Serial ATA additional capabilities", // ACS-3
! 189: ". 15:7 Reserved for Serial ATA",
! 190: ". 6 RECEIVE/SEND FPDMA QUEUED supported",
! 191: ". 5 NCQ Queue Management supported",
! 192: ". 4 NCQ Streaming supported",
! 193: ". 3:1 Current Serial ATA signal speed",
! 194: ". 0 Must be set to 0",
! 195:
! 196: " 78 Serial ATA features supported",
! 197: ". 15:8 Reserved for Serial ATA",
! 198: ". 7 NCQ Autosense supported", // ACS-3
! 199: ". 6 Software Settings Preservation supported",
! 200: ". 5 Hardware Feature Control supported", // ACS-3
! 201: ". 4 In-order data delivery supported",
! 202: ". 3 Device initiated power management supported",
! 203: ". 2 DMA Setup auto-activation supported",
! 204: ". 1 Non-zero buffer offsets supported",
! 205: ". 0 Must be set to 0",
! 206:
! 207: " 79 Serial ATA features enabled",
! 208: ". 15:8 Reserved for Serial ATA",
! 209: ". 7 Automatic Partial to Slumber transitions enabled", // ACS-3
! 210: ". 6 Software Settings Preservation enabled",
! 211: ". 5 Hardware Feature Control enabled", // ACS-3
! 212: ". 4 In-order data delivery enabled",
! 213: ". 3 Device initiated power management enabled",
! 214: ". 2 DMA Setup auto-activation enabled",
! 215: ". 1 Non-zero buffer offsets enabled",
! 216: ". 0 Must be set to 0",
! 217:
! 218: " 80 Major version number",
! 219: ". 15:11 Reserved",
! 220: ". 10 ACS-3 supported",
! 221: ". 9 ACS-2 supported",
! 222: ". 8 ATA8-ACS supported",
! 223: ". 7 ATA/ATAPI-7 supported",
! 224: ". 6 ATA/ATAPI-6 supported",
! 225: ". 5 ATA/ATAPI-5 supported",
! 226: ". 4 ATA/ATAPI-4 supported [OBS-8]",
! 227: ". 3 ATA-3 supported [OBS-7]",
! 228: ". 2 ATA-2 supported [OBS-6]",
! 229: ". 1 ATA-1 supported [OBS-5]",
! 230: ". 0 Reserved",
! 231:
! 232: " 81 Minor version number",
! 233:
! 234: " 82 Commands and feature sets supported",
! 235: ". 15 IDENTIFY DEVICE DMA supported [OBS-4]", // ATA-4 r07-r14 only
! 236: ". 14 NOP supported",
! 237: ". 13 READ BUFFER supported",
! 238: ". 12 WRITE BUFFER supported",
! 239: ". 11 WRITE VERIFY supported [OBS-4]", // ATA-4 r07-r13 only
! 240: ". 10 HPA feature set supported [OBS-ACS-3]",
! 241: ". 9 DEVICE RESET supported", // ATA:0, ATAPI:1
! 242: ". 8 SERVICE interrupt supported [OBS-ACS-2]",
! 243: ". 7 Release interrupt supported [OBS-ACS-2]",
! 244: ". 6 Read look-ahead supported",
! 245: ". 5 Volatile write cache supported",
! 246: ". 4 PACKET feature set supported", // ATA:0, ATAPI:1
! 247: ". 3 Power Management feature set supported",
! 248: ". 2 Removable Media feature set supported [OBS-8]",
! 249: ". 1 Security feature set supported",
! 250: ". 0 SMART feature set supported",
! 251:
! 252: " 83 Commands and feature sets supported",
! 253: ". 15:14 Must be set to 0x1",
! 254: ". 13 FLUSH CACHE EXT supported",
! 255: ". 12 FLUSH CACHE supported",
! 256: ". 11 DCO feature set supported [OBS-ACS-3]",
! 257: ". 10 48-bit Address feature set supported",
! 258: ". 9 AAM feature set supported [OBS-ACS-2]",
! 259: ". 8 SET MAX security extension supported [OBS-ACS-3]",
! 260: ". 7 Reserved for Address Offset Reserved Area Boot Method",
! 261: ". 6 SET FEATURES subcommand required to spin-up",
! 262: ". 5 PUIS feature set supported",
! 263: ". 4 Removable Media Status Notification supported [OBS-8]",
! 264: ". 3 APM feature set supported",
! 265: ". 2 CFA feature set supported",
! 266: ". 1 TCQ feature set supported [OBS-ACS-2]",
! 267: ". 0 DOWNLOAD MICROCODE supported",
! 268:
! 269: " 84 Commands and feature sets supported",
! 270: ". 15:14 Must be set to 0x1",
! 271: ". 13 IDLE IMMEDIATE with UNLOAD feature supported",
! 272: ". 12:11 Reserved for TLC [OBS-ACS-3]",
! 273: ". 10 URG bit for WRITE STREAM (DMA) EXT supported [OBS-8]",
! 274: ". 9 URG bit for READ STREAM (DMA) EXT supported [OBS-8]",
! 275: ". 8 64-bit World Wide Name supported",
! 276: ". 7 WRITE DMA QUEUED FUA EXT supported",
! 277: ". 6 WRITE DMA/MULTIPLE FUA EXT supported",
! 278: ". 5 GPL feature set supported",
! 279: ". 4 Streaming feature set supported [OBS-ACS-3]",
! 280: ". 3 Media Card Pass Through Command supported [OBS-ACS-2]",
! 281: ". 2 Media serial number supported", // ACS-3 r3 or later: Reserved
! 282: ". 1 SMART self-test supported",
! 283: ". 0 SMART error logging supported",
! 284:
! 285: " 85 Commands and feature sets supported or enabled",
! 286: ". 15 IDENTIFY DEVICE DMA supported [OBS-4]", // ATA-4 r07-r14 only
! 287: ". 14 NOP supported",
! 288: ". 13 READ BUFFER supported",
! 289: ". 12 WRITE BUFFER supported",
! 290: ". 11 WRITE VERIFY supported [OBS-4]", // ATA-4 r07-r13 only
! 291: ". 10 HPA feature set supported [OBS-ACS-3]",
! 292: ". 9 DEVICE RESET supported", // ATA:0, ATAPI:1
! 293: ". 8 SERVICE interrupt enabled [OBS-ACS-2]",
! 294: ". 7 Release interrupt enabled [OBS-ACS-2]",
! 295: ". 6 Read look-ahead enabled",
! 296: ". 5 Write cache enabled",
! 297: ". 4 PACKET feature set supported", // ATA:0, ATAPI:1
! 298: ". 3 Power Management feature set supported",
! 299: ". 2 Removable Media feature set supported [OBS-8]",
! 300: ". 1 Security feature set enabled",
! 301: ". 0 SMART feature set enabled",
! 302:
! 303: " 86 Commands and feature sets supported or enabled",
! 304: ". 15 Words 119-120 are valid",
! 305: ". 14 Reserved",
! 306: ". 13 FLUSH CACHE EXT supported",
! 307: ". 12 FLUSH CACHE supported",
! 308: ". 11 DCO feature set supported [OBS-ACS-3]",
! 309: ". 10 48-bit Address features set supported",
! 310: ". 9 AAM feature set enabled [OBS-ACS-2]",
! 311: ". 8 SET MAX security extension enabled [OBS-ACS-3]",
! 312: ". 7 Reserved for Address Offset Reserved Area Boot Method",
! 313: ". 6 SET FEATURES subcommand required to spin-up",
! 314: ". 5 PUIS feature set enabled",
! 315: ". 4 Removable Media Status Notification enabled [OBS-8]",
! 316: ". 3 APM feature set enabled",
! 317: ". 2 CFA feature set supported",
! 318: ". 1 TCQ feature set supported [OBS-ACS-2]",
! 319: ". 0 DOWNLOAD MICROCODE supported",
! 320:
! 321: " 87 Commands and feature sets supported or enabled",
! 322: ". 15:14 Must be set to 0x1",
! 323: ". 13 IDLE IMMEDIATE with UNLOAD FEATURE supported",
! 324: ". 12:11 Reserved for TLC [OBS-ACS-3]",
! 325: ". 10 URG bit for WRITE STREAM (DMA) EXT supported [OBS-8]",
! 326: ". 9 URG bit for READ STREAM (DMA) EXT supported [OBS-8]",
! 327: ". 8 64-bit World Wide Name supported",
! 328: ". 7 WRITE DMA QUEUED FUA EXT supported [OBS-ACS-2]",
! 329: ". 6 WRITE DMA/MULTIPLE FUA EXT supported",
! 330: ". 5 GPL feature set supported",
! 331: ". 4 Valid CONFIGURE STREAM has been executed [OBS-8]",
! 332: ". 3 Media Card Pass Through Command supported [OBS-ACS-2]",
! 333: ". 2 Media serial number is valid",
! 334: ". 1 SMART self-test supported",
! 335: ". 0 SMART error logging supported",
! 336:
! 337: " 88 Ultra DMA modes",
! 338: ". 15 Reserved",
! 339: ". 14 Ultra DMA mode 6 selected",
! 340: ". 13 Ultra DMA mode 5 selected",
! 341: ". 12 Ultra DMA mode 4 selected",
! 342: ". 11 Ultra DMA mode 3 selected",
! 343: ". 10 Ultra DMA mode 2 selected",
! 344: ". 9 Ultra DMA mode 1 selected",
! 345: ". 8 Ultra DMA mode 0 selected",
! 346: ". 7 Reserved",
! 347: ". 6 Ultra DMA mode 6 and below supported",
! 348: ". 5 Ultra DMA mode 5 and below supported",
! 349: ". 4 Ultra DMA mode 4 and below supported",
! 350: ". 3 Ultra DMA mode 3 and below supported",
! 351: ". 2 Ultra DMA mode 2 and below supported",
! 352: ". 1 Ultra DMA mode 1 and below supported",
! 353: ". 0 Ultra DMA mode 0 supported",
! 354:
! 355: " 89 SECURITY ERASE UNIT time",
! 356: " 90 ENHANCED SECURITY ERASE UNIT time",
! 357: " 91 Current APM level",
! 358: " 92 Master password revision code",
! 359:
! 360: " 93 Hardware reset result (PATA)",
! 361: ". 15:14 Must be set to 0x1",
! 362: ". 13 Device detected CBLID- above(1)/below(0) ViHB",
! 363: ". 12 Reserved",
! 364: ". 11 Device 1 asserted PDIAG-",
! 365: ". 10:9 Device 1 detection method: -, Jumper, CSEL, other",
! 366: ". 8 Must be set to 1",
! 367: ". 7 Reserved",
! 368: ". 6 Device 0 responds when device 1 selected",
! 369: ". 5 Device 0 detected the assertion of DASP-",
! 370: ". 4 Device 0 detected the assertion of PDIAG-",
! 371: ". 3 Device 0 passed diagnostics",
! 372: ". 2:1 Device 0 detection method: -, Jumper, CSEL, other",
! 373: ". 0 Must be set to 1",
! 374:
! 375: " 94 AAM level [OBS-ACS-2]",
! 376: ". 15:8 Recommended AAM level [OBS-ACS-2]",
! 377: ". 7:0 Current AAM level [OBS-ACS-2]",
! 378:
! 379: " 95 Stream Minimum Request Size",
! 380: " 96 Streaming Transfer Time - DMA",
! 381: " 97 Streaming Access Latency - DMA and PIO",
! 382: " 98-99 Streaming Performance Granularity (DWord)",
! 383: "100-103 User addressable sectors for 48-bit commands (QWord)",
! 384: "104 Streaming Transfer Time - PIO",
! 385: "105 Max blocks of LBA Range Entries per DS MANAGEMENT cmd",
! 386:
! 387: "106 Physical sector size / logical sector size",
! 388: ". 15:14 Must be set to 0x1",
! 389: ". 13 Multiple logical sectors per physical sector",
! 390: ". 12 Logical Sector longer than 256 words",
! 391: ". 11:4 Reserved",
! 392: ". 3:0 2^X logical sectors per physical sector",
! 393:
! 394: "107 Inter-seek delay for ISO 7779 acoustic testing",
! 395: "108-111 64-bit World Wide Name",
! 396: "112-115 Reserved for a 128-bit World Wide Name",
! 397: "116 Reserved for TLC [OBS-ACS-3]",
! 398: "117-118 Logical sector size (DWord)",
! 399:
! 400: "119 Commands and feature sets supported",
! 401: ". 15:14 Must be set to 0x1",
! 402: ". 13:10 Reserved",
! 403: ". 9 DSN feature set supported", // ACS-3
! 404: ". 8 Accessible Max Address Config feature set supported", // ACS-3
! 405: ". 7 Extended Power Conditions feature set supported",
! 406: ". 6 Sense Data Reporting feature set supported",
! 407: ". 5 Free-fall Control feature set supported",
! 408: ". 4 DOWNLOAD MICROCODE with mode 3 supported",
! 409: ". 3 READ/WRITE LOG DMA EXT supported",
! 410: ". 2 WRITE UNCORRECTABLE EXT supported",
! 411: ". 1 Write-Read-Verify feature set supported",
! 412: ". 0 Reserved for DDT [OBS-ACS-3]",
! 413:
! 414: "120 Commands and feature sets supported or enabled",
! 415: ". 15:14 Must be set to 0x1",
! 416: ". 13:10 Reserved",
! 417: ". 9 DSN feature set enabled", // ACS-3
! 418: ". 8 Reserved",
! 419: ". 7 Extended Power Conditions feature set enabled",
! 420: ". 6 Sense Data Reporting feature set enabled",
! 421: ". 5 Free-fall Control feature set enabled",
! 422: ". 4 DOWNLOAD MICROCODE with mode 3 supported",
! 423: ". 3 READ/WRITE LOG DMA EXT supported",
! 424: ". 2 WRITE UNCORRECTABLE EXT supported",
! 425: ". 1 Write-Read-Verify feature set enabled",
! 426: ". 0 Reserved for DDT [OBS-ACS-3]",
! 427:
! 428: "121-126 ATA: Reserved",
! 429: "121-124 ATAPI: Reserved",
! 430: "125 ATAPI: Byte count = 0 behavior",
! 431: "126 ATAPI: Byte count = 0 behavior [OBS-6]",
! 432:
! 433: "127 Removable Media Status Notification [OBS-8]",
! 434: ". 15:1 Reserved",
! 435: ". 0 Removable Media Status Notification supported",
! 436:
! 437: "128 Security status",
! 438: ". 15:9 Reserved",
! 439: ". 8 Master password capability: 0 = High, 1 = Maximum",
! 440: ". 7:6 Reserved",
! 441: ". 5 Enhanced security erase supported",
! 442: ". 4 Security count expired",
! 443: ". 3 Security frozen",
! 444: ". 2 Security locked",
! 445: ". 1 Security enabled",
! 446: ". 0 Security supported",
! 447:
! 448: "129-159 Vendor specific",
! 449:
! 450: "160 CFA power mode",
! 451: // ". 15 Word 160 supported",
! 452: // ". 14 Reserved",
! 453: // ". 13 CFA power mode 1 is required for some commands",
! 454: // ". 12 CFA power mode 1 disabled",
! 455: // ". 11:0 Maximum current in mA",
! 456: "161-167 Reserved for CFA",
! 457:
! 458: "168 Form factor",
! 459: ". 15:4 Reserved",
! 460: ". 3:0 Nominal form factor: -, 5.25, 3.5, 2.5, 1.8, <1.8",
! 461:
! 462: "169 Data Set Management support",
! 463: ". 15:1 Reserved",
! 464: ". 0 Trim bit in DATA SET MANAGEMENT command supported",
! 465:
! 466: "170-173 Additional product identifier (String)",
! 467: "174-175 Reserved",
! 468: "176-205 Current media serial number (String)",
! 469:
! 470: "206 SCT Command Transport",
! 471: ". 15:12 Vendor Specific",
! 472: ". 11:8 Reserved",
! 473: ". 7 Reserved for Serial ATA",
! 474: ". 6 Reserved",
! 475: ". 5 SCT Data Tables supported",
! 476: ". 4 SCT Feature Control supported",
! 477: ". 3 SCT Error Recovery Control supported",
! 478: ". 2 SCT Write Same supported",
! 479: ". 1 SCT Read/Write Long supported [OBS-ACS-2]",
! 480: ". 0 SCT Command Transport supported",
! 481:
! 482: "207-208 Reserved for CE-ATA",
! 483:
! 484: "209 Alignment of logical sectors",
! 485: ". 15:14 Must be set to 0x1",
! 486: ". 13:0 Logical sector offset",
! 487:
! 488: "210-211 Write-Read-Verify sector count mode 3 (DWord)",
! 489: "212-213 Write-Read-Verify sector count mode 2 (DWord)",
! 490:
! 491: "214 NV Cache capabilities [OBS-ACS-3]",
! 492: ". 15:12 NV Cache feature set version [OBS-ACS-3]",
! 493: ". 11:8 NV Cache Power Mode feature set version [OBS-ACS-3]",
! 494: ". 7:5 Reserved [OBS-ACS-3]",
! 495: ". 4 NV Cache feature set enabled [OBS-ACS-3]",
! 496: ". 3:2 Reserved",
! 497: ". 1 NV Cache Power Mode feature set enabled [OBS-ACS-3]",
! 498: ". 0 NV Cache Power Mode feature set supported [OBS-ACS-3]",
! 499:
! 500: "215-216 NV Cache size in logical blocks (DWord) [OBS-ACS-3]",
! 501: "217 Nominal media rotation rate",
! 502: "218 Reserved",
! 503:
! 504: "219 NV Cache options [OBS-ACS-3]",
! 505: ". 15:8 Reserved [OBS-ACS-3]",
! 506: ". 7:0 Estimated time to spin up in seconds [OBS-ACS-3]",
! 507:
! 508: "220 Write-Read-Verify mode",
! 509: ". 15:8 Reserved",
! 510: ". 7:0 Write-Read-Verify feature set current mode",
! 511:
! 512: "221 Reserved",
! 513:
! 514: "222 Transport major version number",
! 515: ". 15:12 Transport type: 0x0 = Parallel, 0x1 = Serial",
! 516: ". 11:7 Reserved | Reserved",
! 517: ". 6 Reserved | SATA 3.1",
! 518: ". 5 Reserved | SATA 3.0",
! 519: ". 4 Reserved | SATA 2.6",
! 520: ". 3 Reserved | SATA 2.5",
! 521: ". 2 Reserved | SATA II: Extensions",
! 522: ". 1 ATA/ATAPI-7 | SATA 1.0a",
! 523: ". 0 ATA8-APT | ATA8-AST",
! 524:
! 525: "223 Transport minor version number",
! 526: "224-229 Reserved",
! 527: "230-233 Extended number of user addressable sectors (QWord)",
! 528: "234 Minimum blocks per DOWNLOAD MICROCODE mode 3 command",
! 529: "235 Maximum blocks per DOWNLOAD MICROCODE mode 3 command",
! 530: "236-254 Reserved",
! 531:
! 532: "255 Integrity word",
! 533: ". 15:8 Checksum",
! 534: ". 7:0 Signature"
! 535: };
! 536:
! 537: const int num_identify_descriptions = sizeof(identify_descriptions)/sizeof(identify_descriptions[0]);
! 538:
! 539: static inline unsigned short get_word(const void * id, int word)
! 540: {
! 541: const unsigned char * p = ((const unsigned char *)id) + 2 * word;
! 542: return p[0] + (p[1] << 8);
! 543: }
! 544:
! 545: void ata_print_identify_data(const void * id, bool all_words, int bit_level)
! 546: {
! 547: // ATA or ATAPI ?
! 548: unsigned short w = get_word(id, 0);
! 549: bool is_atapi = ((w & 0x8000) && (w != 0x848a/*CompactFlash Signature*/));
! 550:
! 551: int prev_word = -1, prev_bit = -1;
! 552: pout("Word %s Value Description\n", (bit_level >= 0 ? "Bit " : " "));
! 553:
! 554: for (int i = 0; i < num_identify_descriptions; i++) {
! 555: // Parse table entry
! 556: const char * desc = identify_descriptions[i];
! 557:
! 558: int word = prev_word, word2 = -1;
! 559: int bit = -1, bit2 = -1;
! 560:
! 561: int nc;
! 562: unsigned v1, v2;
! 563: if (word >= 0 && sscanf(desc, ". %u:%u %n", &v1, &v2, (nc=-1, &nc)) == 2 && nc > 0 && 16 > v1 && v1 > v2) {
! 564: bit = v1; bit2 = v2;
! 565: }
! 566: else if (word >= 0 && sscanf(desc, ". %u %n", &v1, (nc=-1, &nc)) == 1 && nc > 0 && v1 < 16) {
! 567: bit = v1;
! 568: }
! 569: else if (sscanf(desc, "%u-%u %n", &v1, &v2, (nc=-1, &nc)) == 2 && nc > 0 && v1 < v2 && v2 < 256) {
! 570: word = v1, word2 = v2;
! 571: }
! 572: else if (sscanf(desc, "%u %n", &v1, (nc=-1, &nc)) == 1 && nc > 0 && v1 < 256) {
! 573: word = v1;
! 574: }
! 575: else {
! 576: pout("Error: #%d: Syntax\n", i);
! 577: continue;
! 578: }
! 579: desc += nc;
! 580:
! 581: // Check for ATA/ATAPI specific entries
! 582: if (str_starts_with(desc, "ATA: ")) {
! 583: if (is_atapi)
! 584: continue;
! 585: desc += sizeof("ATA: ")-1;
! 586: }
! 587: else if (str_starts_with(desc, "ATAPI: ")) {
! 588: if (!is_atapi)
! 589: continue;
! 590: }
! 591:
! 592: // Check table entry
! 593: if (bit < 0) {
! 594: if (word != prev_word+1) {
! 595: pout("Error: #%d: Missing word %d\n", i, prev_word+1);
! 596: return;
! 597: }
! 598: else if (prev_bit > 0) {
! 599: pout("Error: #%d: Missing bit 0 from word %d\n", i, prev_word);
! 600: return;
! 601: }
! 602: }
! 603: else if (!((prev_bit < 0 && bit == 15) || bit == prev_bit-1)) {
! 604: pout("Error: #%d: Missing bit %d from word %d\n", i, bit+1, word);
! 605: return;
! 606: }
! 607:
! 608: w = get_word(id, word);
! 609: bool w_is_set = (w != 0x0000 && w != 0xffff);
! 610:
! 611: if (bit >= 0) {
! 612: int b;
! 613: if (bit2 >= 0)
! 614: b = (w >> bit2) & ~(~0 << (bit-bit2+1));
! 615: else
! 616: b = (w >> bit) & 1;
! 617:
! 618: if ( (bit_level >= 0 && b)
! 619: || (bit_level >= 1 && w_is_set)
! 620: || (bit_level >= 2 && all_words)) {
! 621: if (bit2 >= 0) {
! 622: // Print bitfield
! 623: char valstr[20];
! 624: snprintf(valstr, sizeof(valstr), "0x%0*x", (bit - bit2 + 4) >> 2, b);
! 625: pout("%4d %2d:%-2d %6s %s\n", word, bit, bit2, valstr, desc);
! 626: }
! 627: else {
! 628: // Print bit
! 629: pout("%4d %2d %u %s\n", word, bit, b, desc);
! 630: }
! 631: }
! 632:
! 633: prev_bit = (bit2 >= 0 ? bit2 : bit);
! 634: }
! 635: else {
! 636: if (word2 >= 0) {
! 637: for (int j = word+1; !w_is_set && j <= word2; j++) {
! 638: if (get_word(id, j) != w)
! 639: w_is_set = true;
! 640: }
! 641:
! 642: // Print word array
! 643: if (all_words || w_is_set) {
! 644: pout("%s%4d-%-3d %s",
! 645: (bit_level >= 0 ? "\n" : ""), word, word2,
! 646: (bit_level >= 0 ? "- " : ""));
! 647:
! 648: if (!w_is_set) {
! 649: pout("0x%02x... %s\n", w & 0xff, desc);
! 650: }
! 651: else {
! 652: bool is_str = !!strstr(desc, "(String)");
! 653: pout(". %s", desc);
! 654:
! 655: for (int j = word; j <= word2; j += 4) {
! 656: if (j + 2*4 < word2 && !nonempty((const unsigned char *)id + 2*j, 2*(word2-j+1))) {
! 657: // Remaining words are null
! 658: pout("\n%4d-%-3d %s0x0000:0000:0000:00...", j, word2,
! 659: (bit_level >= 0 ? ". " : ""));
! 660: break;
! 661: }
! 662: // Print 4 words in a row
! 663: pout("\n%4d-%-3d %s0x", j, (j+3 <= word2 ? j+3 : word2),
! 664: (bit_level >= 0 ? ". " : ""));
! 665: int k;
! 666: for (k = 0; k < 4 && j+k <= word2; k++)
! 667: pout("%s%04x", (k == 0 ? "" : ":"), get_word(id, j+k));
! 668:
! 669: if (is_str) {
! 670: // Append little endian string
! 671: pout("%*s \"", 20 - 5 * k, "");
! 672: for (k = 0; k < 4 && j+k <= word2; k++) {
! 673: char c2 = ((const char *)id)[2*(j+k) ];
! 674: char c1 = ((const char *)id)[2*(j+k) + 1];
! 675: pout("%c%c", (' ' <= c1 && c1 <= '~' ? c1 : '.'),
! 676: (' ' <= c2 && c2 <= '~' ? c2 : '.') );
! 677: }
! 678: pout("\"");
! 679: }
! 680: }
! 681:
! 682: // Print decimal value of D/QWords
! 683: if (word + 1 == word2 && strstr(desc, "(DWord)"))
! 684: pout(" (%u)\n", ((unsigned)get_word(id, word2) << 16) | w);
! 685: else if (word + 3 == word2 && strstr(desc, "(QWord)"))
! 686: pout(" (%"PRIu64")\n", ((uint64_t)get_word(id, word + 3) << 48)
! 687: | ((uint64_t)get_word(id, word + 2) << 32)
! 688: | ((unsigned)get_word(id, word + 1) << 16) | (unsigned)w);
! 689: else
! 690: pout("\n");
! 691: }
! 692: }
! 693: }
! 694: else {
! 695: // Print word
! 696: if (all_words || w_is_set)
! 697: pout("%s%4d %s0x%04x %s\n",
! 698: (bit_level >= 0 ? "\n" : ""), word,
! 699: (bit_level >= 0 ? "- " : ""), w, desc);
! 700: }
! 701:
! 702: prev_word = (word2 >= 0 ? word2 : word);
! 703: prev_bit = -1;
! 704: }
! 705: }
! 706:
! 707: pout("\n");
! 708: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>