Коллеги,
Я реализую поддержку доверенных команд ATA
0x5C, TRUSTED RECEIVE,
0x5D, TRUSTED RECEIVE DMA,
0x5E, TRUSTED SEND
0x5F, TRUSTED SEND DMA,
для Linux (два хоста, Fedora 12 и 14) для поддержки дисков с самошифрованием. Я взял код с этой страницы http://www.jukie.net/bart/blog/ata-via-scsi в качестве базового кода. Для доверенного приема (на этом уровне оно идентично IDENTIFY, 0xEC):
sg_io.interface_id = 'S';
sg_io.cmdp = cdb;
sg_io.cmd_len = sizeof(cdb);
sg_io.dxferp = data_in_buffer;
sg_io.dxfer_len = data_in_length; // multiple of 512
sg_io.dxfer_direction = SG_DXFER_FROM_DEV;
sg_io.sbp = sense;
sg_io.mx_sb_len = sizeof(sense);
sg_io.timeout = 5000; // 5 seconds
cdb[0] = 0x85; // pass-through ATA16 command (no translation)
cdb[1] = (4 << 1); // data-in
cdb[2] = 0x2e; // data-in
cdb[4] = feature_id; // ATA feature ID
cdb[6] = 1; // number of sectors
cdb[7] = lba_low >> 8;
cdb[8] = lba_low;
cdb[9] = lba_mid >> 8;
cdb[10] = lba_mid;
cdb[11] = lba_high >> 8;
cdb[12] = lba_high;
cdb[14] = 0x5C; // TRUSTED RECEIVE
rc = ioctl (fd, SG_IO, &sg_io);
Он отлично работает для идентификации и всех других команд, но не для доверенных команд. Когда я подключаю анализатор протокола, я вижу, что эти команды не отправляются на шину SATA. Адаптер способен отправлять их, потому что они идут нормально под Windows (не мой код, но я думаю, используя ATA_PASS_THROUGH) И да, я запускаю этот код от имени root.
Пожалуйста, помогите разгадать эту тайну:)