#![allow(dead_code)]
use alloc::string::String;
pub const SATA_FIS_TYPE_SET_DEVICE_BITS_D2H: u8 = 161;
pub const SATA_FIS_TYPE_PIO_SETUP_D2H: u8 = 95;
pub const SATA_FIS_TYPE_BIST_ACT_BI: u8 = 88;
pub const SATA_FIS_TYPE_DATA_BI: u8 = 70;
pub const SATA_FIS_TYPE_DMA_SETUP_BI: u8 = 65;
pub const SATA_FIS_TYPE_DMA_ACT_D2H: u8 = 57;
pub const SATA_FIS_TYPE_REGISTER_D2H: u8 = 52;
pub const SATA_FIS_TYPE_REGISTER_H2D: u8 = 39;
pub const ATA_CMD_DEV_RESET: u8 = 0x08;
pub const ATA_CMD_CHK_POWER: u8 = 0xE5;
pub const ATA_CMD_STANDBY: u8 = 0xE2;
pub const ATA_CMD_IDLE: u8 = 0xE3;
pub const ATA_CMD_EDD: u8 = 0x90;
pub const ATA_CMD_DOWNLOAD_MICRO: u8 = 0x92;
pub const ATA_CMD_DOWNLOAD_MICRO_DMA: u8 = 0x93;
pub const ATA_CMD_NOP: u8 = 0x00;
pub const ATA_CMD_FLUSH: u8 = 0xE7;
pub const ATA_CMD_FLUSH_EXT: u8 = 0xEA;
pub const ATA_CMD_ID_ATA: u8 = 0xEC;
pub const ATA_CMD_ID_ATAPI: u8 = 0xA1;
pub const ATA_CMD_SERVICE: u8 = 0xA2;
pub const ATA_CMD_READ: u8 = 0xC8;
pub const ATA_CMD_READ_EXT: u8 = 0x25;
pub const ATA_CMD_READ_QUEUED: u8 = 0x26;
pub const ATA_CMD_READ_STREAM_EXT: u8 = 0x2B;
pub const ATA_CMD_READ_STREAM_DMA_EXT: u8 = 0x2A;
pub const ATA_CMD_WRITE: u8 = 0xCA;
pub const ATA_CMD_WRITE_EXT: u8 = 0x35;
pub const ATA_CMD_WRITE_QUEUED: u8 = 0x36;
pub const ATA_CMD_WRITE_STREAM_EXT: u8 = 0x3B;
pub const ATA_CMD_WRITE_STREAM_DMA_EXT: u8 = 0x3A;
pub const ATA_CMD_WRITE_FUA_EXT: u8 = 0x3D;
pub const ATA_CMD_WRITE_QUEUED_FUA_EXT: u8 = 0x3E;
pub const ATA_CMD_FPDMA_READ: u8 = 0x60;
pub const ATA_CMD_FPDMA_WRITE: u8 = 0x61;
pub const ATA_CMD_NCQ_NON_DATA: u8 = 0x63;
pub const ATA_CMD_FPDMA_SEND: u8 = 0x64;
pub const ATA_CMD_FPDMA_RECV: u8 = 0x65;
pub const ATA_CMD_PIO_READ: u8 = 0x20;
pub const ATA_CMD_PIO_READ_EXT: u8 = 0x24;
pub const ATA_CMD_PIO_WRITE: u8 = 0x30;
pub const ATA_CMD_PIO_WRITE_EXT: u8 = 0x34;
pub const ATA_CMD_READ_MULTI: u8 = 0xC4;
pub const ATA_CMD_READ_MULTI_EXT: u8 = 0x29;
pub const ATA_CMD_WRITE_MULTI: u8 = 0xC5;
pub const ATA_CMD_WRITE_MULTI_EXT: u8 = 0x39;
pub const ATA_CMD_WRITE_MULTI_FUA_EXT: u8 = 0xCE;
pub const ATA_CMD_SET_FEATURES: u8 = 0xEF;
pub const ATA_CMD_SET_MULTI: u8 = 0xC6;
pub const ATA_CMD_PACKET: u8 = 0xA0;
pub const ATA_CMD_VERIFY: u8 = 0x40;
pub const ATA_CMD_VERIFY_EXT: u8 = 0x42;
pub const ATA_CMD_WRITE_UNCORR_EXT: u8 = 0x45;
pub const ATA_CMD_STANDBYNOW1: u8 = 0xE0;
pub const ATA_CMD_IDLEIMMEDIATE: u8 = 0xE1;
pub const ATA_CMD_SLEEP: u8 = 0xE6;
pub const ATA_CMD_INIT_DEV_PARAMS: u8 = 0x91;
pub const ATA_CMD_READ_NATIVE_MAX: u8 = 0xF8;
pub const ATA_CMD_READ_NATIVE_MAX_EXT: u8 = 0x27;
pub const ATA_CMD_SET_MAX: u8 = 0xF9;
pub const ATA_CMD_SET_MAX_EXT: u8 = 0x37;
pub const ATA_CMD_READ_LOG_EXT: u8 = 0x2F;
pub const ATA_CMD_WRITE_LOG_EXT: u8 = 0x3F;
pub const ATA_CMD_READ_LOG_DMA_EXT: u8 = 0x47;
pub const ATA_CMD_WRITE_LOG_DMA_EXT: u8 = 0x57;
pub const ATA_CMD_TRUSTED_NONDATA: u8 = 0x5B;
pub const ATA_CMD_TRUSTED_RCV: u8 = 0x5C;
pub const ATA_CMD_TRUSTED_RCV_DMA: u8 = 0x5D;
pub const ATA_CMD_TRUSTED_SND: u8 = 0x5E;
pub const ATA_CMD_TRUSTED_SND_DMA: u8 = 0x5F;
pub const ATA_CMD_PMP_READ: u8 = 0xE4;
pub const ATA_CMD_PMP_READ_DMA: u8 = 0xE9;
pub const ATA_CMD_PMP_WRITE: u8 = 0xE8;
pub const ATA_CMD_PMP_WRITE_DMA: u8 = 0xEB;
pub const ATA_CMD_CONF_OVERLAY: u8 = 0xB1;
pub const ATA_CMD_SEC_SET_PASS: u8 = 0xF1;
pub const ATA_CMD_SEC_UNLOCK: u8 = 0xF2;
pub const ATA_CMD_SEC_ERASE_PREP: u8 = 0xF3;
pub const ATA_CMD_SEC_ERASE_UNIT: u8 = 0xF4;
pub const ATA_CMD_SEC_FREEZE_LOCK: u8 = 0xF5;
pub const ATA_CMD_SEC_DISABLE_PASS: u8 = 0xF6;
pub const ATA_CMD_CONFIG_STREAM: u8 = 0x51;
pub const ATA_CMD_SMART: u8 = 0xB0;
pub const ATA_CMD_MEDIA_LOCK: u8 = 0xDE;
pub const ATA_CMD_MEDIA_UNLOCK: u8 = 0xDF;
pub const ATA_CMD_DSM: u8 = 0x06;
pub const ATA_CMD_CHK_MED_CRD_TYP: u8 = 0xD1;
pub const ATA_CMD_CFA_REQ_EXT_ERR: u8 = 0x03;
pub const ATA_CMD_CFA_WRITE_NE: u8 = 0x38;
pub const ATA_CMD_CFA_TRANS_SECT: u8 = 0x87;
pub const ATA_CMD_CFA_ERASE: u8 = 0xC0;
pub const ATA_CMD_CFA_WRITE_MULT_NE: u8 = 0xCD;
pub const ATA_CMD_REQ_SENSE_DATA: u8 = 0x0B;
pub const ATA_CMD_SANITIZE_DEVICE: u8 = 0xB4;
pub const ATA_CMD_ZAC_MGMT_IN: u8 = 0x4A;
pub const ATA_CMD_ZAC_MGMT_OUT: u8 = 0x9F;
pub const ATA_ID_WORDS: usize = 256;
pub const ATA_ID_CONFIG: usize = 0;
pub const ATA_ID_CYLS: usize = 1;
pub const ATA_ID_HEADS: usize = 3;
pub const ATA_ID_SECTORS: usize = 6;
pub const ATA_ID_SERNO: usize = 10;
pub const ATA_ID_BUF_SIZE: usize = 21;
pub const ATA_ID_FW_REV: usize = 23;
pub const ATA_ID_PROD: usize = 27;
pub const ATA_ID_MAX_MULTSECT: usize = 47;
pub const ATA_ID_DWORD_IO: usize = 48;
pub const ATA_ID_TRUSTED: usize = 48;
pub const ATA_ID_CAPABILITY: usize = 49;
pub const ATA_ID_OLD_PIO_MODES: usize = 51;
pub const ATA_ID_OLD_DMA_MODES: usize = 52;
pub const ATA_ID_FIELD_VALID: usize = 53;
pub const ATA_ID_CUR_CYLS: usize = 54;
pub const ATA_ID_CUR_HEADS: usize = 55;
pub const ATA_ID_CUR_SECTORS: usize = 56;
pub const ATA_ID_MULTSECT: usize = 59;
pub const ATA_ID_LBA_CAPACITY: usize = 60;
pub const ATA_ID_SWDMA_MODES: usize = 62;
pub const ATA_ID_MWDMA_MODES: usize = 63;
pub const ATA_ID_PIO_MODES: usize = 64;
pub const ATA_ID_EIDE_DMA_MIN: usize = 65;
pub const ATA_ID_EIDE_DMA_TIME: usize = 66;
pub const ATA_ID_EIDE_PIO: usize = 67;
pub const ATA_ID_EIDE_PIO_IORDY: usize = 68;
pub const ATA_ID_ADDITIONAL_SUPP: usize = 69;
pub const ATA_ID_QUEUE_DEPTH: usize = 75;
pub const ATA_ID_SATA_CAPABILITY: usize = 76;
pub const ATA_ID_SATA_CAPABILITY_2: usize = 77;
pub const ATA_ID_FEATURE_SUPP: usize = 78;
pub const ATA_ID_MAJOR_VER: usize = 80;
pub const ATA_ID_COMMAND_SET_1: usize = 82;
pub const ATA_ID_COMMAND_SET_2: usize = 83;
pub const ATA_ID_CFSSE: usize = 84;
pub const ATA_ID_CFS_ENABLE_1: usize = 85;
pub const ATA_ID_CFS_ENABLE_2: usize = 86;
pub const ATA_ID_CSF_DEFAULT: usize = 87;
pub const ATA_ID_UDMA_MODES: usize = 88;
pub const ATA_ID_HW_CONFIG: usize = 93;
pub const ATA_ID_SPG: usize = 98;
pub const ATA_ID_LBA_CAPACITY_2: usize = 100;
pub const ATA_ID_SECTOR_SIZE: usize = 106;
pub const ATA_ID_WWN: usize = 108;
pub const ATA_ID_LOGICAL_SECTOR_SIZE: usize = 117;
pub const ATA_ID_COMMAND_SET_3: usize = 119;
pub const ATA_ID_COMMAND_SET_4: usize = 120;
pub const ATA_ID_LAST_LUN: usize = 126;
pub const ATA_ID_DLF: usize = 128;
pub const ATA_ID_CSFO: usize = 129;
pub const ATA_ID_CFA_POWER: usize = 160;
pub const ATA_ID_CFA_KEY_MGMT: usize = 162;
pub const ATA_ID_CFA_MODES: usize = 163;
pub const ATA_ID_DATA_SET_MGMT: usize = 169;
pub const ATA_ID_SCT_CMD_XPORT: usize = 206;
pub const ATA_ID_ROT_SPEED: usize = 217;
pub const ATA_ID_PIO4: usize = 2;
pub const ATA_ID_SERNO_LEN: usize = 20;
pub const ATA_ID_FW_REV_LEN: usize = 8;
pub const ATA_ID_PROD_LEN: usize = 40;
pub const ATA_ID_WWN_LEN: usize = 8;
pub fn ata_id_to_string(raw: &[u16], off: usize, len: usize) -> String {
let mut res = String::new();
for word in &raw[off..off + len / 2] {
let chars = word.to_be_bytes();
res.push(chars[0] as char);
res.push(chars[1] as char);
}
res
}
pub fn ata_id_u32(id: &[u16], n: usize) -> u32 {
(id[n + 1] as u32) << 16 | (id[n] as u32)
}
pub fn ata_id_u64(id: &[u16], n: usize) -> u64 {
let mut val: u64 = 0;
val |= (id[n + 3] as u64) << 48;
val |= (id[n + 2] as u64) << 32;
val |= (id[n + 1] as u64) << 16;
val |= id[n] as u64;
val
}
pub fn ata_id_has_lba(id: &[u16]) -> bool {
(id[ATA_ID_CAPABILITY] & (1 << 9)) != 0
}
pub fn ata_id_has_lba48(id: &[u16]) -> bool {
if (id[ATA_ID_COMMAND_SET_2] & 0xc000) != 0x4000 {
return false;
}
if ata_id_u64(id, ATA_ID_LBA_CAPACITY_2) == 0 {
return false;
}
(id[ATA_ID_COMMAND_SET_2] & (1 << 10)) != 0
}
pub fn ata_id_n_sectors(id: &[u16]) -> u64 {
if ata_id_has_lba(id) {
if ata_id_has_lba48(id) {
ata_id_u64(id, ATA_ID_LBA_CAPACITY_2)
} else {
ata_id_u32(id, ATA_ID_LBA_CAPACITY) as u64
}
} else {
0
}
}