X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=extras%2Fata_id%2Fata_id.c;h=e38a7d1aa522b94492916009945d589ffa148675;hb=0bbe8838e75bf97792d61b33f8592a32f1fc8bd4;hp=cb4a1a1f075b4a0587f7e953ba29e57ee2fde401;hpb=e48e2912023b5600d291904b0f7b0017387e8cb2;p=elogind.git diff --git a/extras/ata_id/ata_id.c b/extras/ata_id/ata_id.c index cb4a1a1f0..e38a7d1aa 100644 --- a/extras/ata_id/ata_id.c +++ b/extras/ata_id/ata_id.c @@ -448,6 +448,7 @@ int main(int argc, char *argv[]) struct udev *udev; struct hd_driveid id; uint8_t identify[512]; + uint16_t *identify_words; char model[41]; char model_enc[256]; char serial[21]; @@ -535,22 +536,23 @@ int main(int argc, char *argv[]) info(udev, "HDIO_GET_IDENTITY unsupported for '%s'\n", node); rc = 2; } else { - err(udev, "HDIO_GET_IDENTITY failed for '%s'\n", node); + err(udev, "HDIO_GET_IDENTITY failed for '%s': %m\n", node); rc = 3; } goto close; } } + identify_words = (uint16_t *) identify; memcpy (model, id.model, 40); model[40] = '\0'; udev_util_encode_string(model, model_enc, sizeof(model_enc)); - udev_util_replace_whitespace((char *) id.model, model, 40); - udev_util_replace_chars(model, NULL); - udev_util_replace_whitespace((char *) id.serial_no, serial, 20); - udev_util_replace_chars(serial, NULL); - udev_util_replace_whitespace((char *) id.fw_rev, revision, 8); - udev_util_replace_chars(revision, NULL); + util_replace_whitespace((char *) id.model, model, 40); + util_replace_chars(model, NULL); + util_replace_whitespace((char *) id.serial_no, serial, 20); + util_replace_chars(serial, NULL); + util_replace_whitespace((char *) id.fw_rev, revision, 8); + util_replace_chars(revision, NULL); if (export) { /* Set this to convey the disk speaks the ATA protocol */ @@ -700,6 +702,15 @@ int main(int argc, char *argv[]) /* ATA devices have no vendor extension */ printf("ID_WWN_WITH_EXTENSION=0x%llx\n", (unsigned long long int) wwwn); } + + /* from Linux's include/linux/ata.h */ + if (identify_words[0] == 0x848a || identify_words[0] == 0x844a) { + printf("ID_ATA_CFA=1\n"); + } else { + if ((identify_words[83] & 0xc004) == 0x4004) { + printf("ID_ATA_CFA=1\n"); + } + } } else { if (serial[0] != '\0') printf("%s_%s\n", model, serial);