Fix 48-bit ATA commands.

This commit is contained in:
2021-07-29 00:46:47 +01:00
parent 29aa181be2
commit bdd467547a
4 changed files with 100 additions and 95 deletions

View File

@@ -321,9 +321,12 @@ typedef struct
{
uint16_t feature;
uint16_t sector_count;
uint16_t lba_low;
uint16_t lba_mid;
uint16_t lba_high;
uint8_t lba_low_prev;
uint8_t lba_low_cur;
uint8_t lba_mid_prev;
uint8_t lba_mid_cur;
uint8_t lba_high_prev;
uint8_t lba_high_cur;
uint8_t device_head;
uint8_t command;
} AtaRegistersLba48;
@@ -333,9 +336,12 @@ typedef struct
uint8_t status;
uint8_t error;
uint16_t sector_count;
uint16_t lba_low;
uint16_t lba_mid;
uint16_t lba_high;
uint8_t lba_low_prev;
uint8_t lba_low_cur;
uint8_t lba_mid_prev;
uint8_t lba_mid_cur;
uint8_t lba_high_prev;
uint8_t lba_high_cur;
uint8_t device_head;
} AtaErrorRegistersLba48;

View File

@@ -296,12 +296,12 @@ int32_t SendAtaLba48Command(void* device_ctx,
camccb->ataio.cmd.command = registers.command;
camccb->ataio.cmd.device = 0x40 | registers.device_head;
camccb->ataio.cmd.lba_high_exp = (registers.lba_high & 0xFF00) >> 8;
camccb->ataio.cmd.lba_high = registers.lba_high & 0xFF;
camccb->ataio.cmd.lba_mid_exp = (registers.lba_mid & 0xFF00) >> 8;
camccb->ataio.cmd.lba_mid = registers.lba_mid & 0xFF;
camccb->ataio.cmd.lba_low_exp = (registers.lba_low & 0xFF00) >> 8;
camccb->ataio.cmd.lba_low = registers.lba_low & 0xFF;
camccb->ataio.cmd.lba_high_exp = registers.lba_high_cur;
camccb->ataio.cmd.lba_high = registers.lba_high_prev;
camccb->ataio.cmd.lba_mid_exp = registers.lba_mid_cur;
camccb->ataio.cmd.lba_mid = registers.lba_mid_prev;
camccb->ataio.cmd.lba_low_exp = registers.lba_low_cur;
camccb->ataio.cmd.lba_low = registers.lba_low_prev;
camccb->ataio.cmd.features_exp = (registers.feature & 0xFF00) >> 8;
camccb->ataio.cmd.features = registers.feature & 0xFF;
camccb->ataio.cmd.sector_count_exp = (registers.sector_count & 0xFF00) >> 8;

View File

@@ -236,12 +236,12 @@ int32_t SendAtaLba48Command(void* device_ctx,
cdb[4] = (registers.feature & 0xFF);
cdb[5] = ((registers.sector_count & 0xFF00) >> 8);
cdb[6] = (registers.sector_count & 0xFF);
cdb[7] = ((registers.lba_low & 0xFF00) >> 8);
cdb[8] = (registers.lba_low & 0xFF);
cdb[9] = ((registers.lba_mid & 0xFF00) >> 8);
cdb[10] = (registers.lba_mid & 0xFF);
cdb[11] = ((registers.lba_high & 0xFF00) >> 8);
cdb[12] = (registers.lba_high & 0xFF);
cdb[7] = registers.lba_low_prev;
cdb[8] = registers.lba_low_cur;
cdb[9] = registers.lba_mid_prev;
cdb[10] = registers.lba_mid_cur;
cdb[11] = registers.lba_high_prev;
cdb[12] = registers.lba_high_cur;
cdb[13] = registers.device_head;
cdb[14] = registers.command;
@@ -262,9 +262,12 @@ int32_t SendAtaLba48Command(void* device_ctx,
error_registers->error = sense_buf[11];
error_registers->sector_count = (uint16_t)((sense_buf[12] << 8) + sense_buf[13]);
error_registers->lba_low = (uint16_t)((sense_buf[14] << 8) + sense_buf[15]);
error_registers->lba_mid = (uint16_t)((sense_buf[16] << 8) + sense_buf[17]);
error_registers->lba_high = (uint16_t)((sense_buf[18] << 8) + sense_buf[19]);
error_registers->lba_low_prev = sense_buf[14];
error_registers->lba_low_cur = sense_buf[15];
error_registers->lba_mid_prev = sense_buf[16];
error_registers->lba_mid_cur = sense_buf[17];
error_registers->lba_high_prev = sense_buf[18];
error_registers->lba_high_cur = sense_buf[19];
error_registers->device_head = sense_buf[20];
error_registers->status = sense_buf[21];

View File

@@ -516,9 +516,11 @@ void* WorkingLoop(void* arguments)
pkt_res_scsi = (AaruPacketResScsi*)out_buf;
if(sense_buf) memcpy(out_buf + sizeof(AaruPacketResScsi), sense_buf, sense_len);
if(buffer) memcpy(out_buf + sizeof(AaruPacketResScsi) + sense_len, buffer, le32toh(pkt_cmd_scsi->buf_len));
if(buffer)
memcpy(out_buf + sizeof(AaruPacketResScsi) + sense_len, buffer, le32toh(pkt_cmd_scsi->buf_len));
pkt_res_scsi->hdr.len = htole32(sizeof(AaruPacketResScsi) + sense_len + le32toh(pkt_cmd_scsi->buf_len));
pkt_res_scsi->hdr.len =
htole32(sizeof(AaruPacketResScsi) + sense_len + le32toh(pkt_cmd_scsi->buf_len));
pkt_res_scsi->hdr.packet_type = AARUREMOTE_PACKET_TYPE_RESPONSE_SCSI;
pkt_res_scsi->hdr.version = AARUREMOTE_PACKET_VERSION;
pkt_res_scsi->hdr.remote_id = htole32(AARUREMOTE_REMOTE_ID);
@@ -913,9 +915,6 @@ void* WorkingLoop(void* arguments)
pkt_cmd_ata_lba48->buf_len = le32toh(pkt_cmd_ata_lba48->buf_len);
// Swapping
pkt_cmd_ata_lba48->registers.lba_high = le16toh(pkt_cmd_ata_lba48->registers.lba_high);
pkt_cmd_ata_lba48->registers.lba_mid = le16toh(pkt_cmd_ata_lba48->registers.lba_mid);
pkt_cmd_ata_lba48->registers.lba_low = le16toh(pkt_cmd_ata_lba48->registers.lba_low);
pkt_cmd_ata_lba48->registers.sector_count = le16toh(pkt_cmd_ata_lba48->registers.sector_count);
duration = 0;
@@ -956,9 +955,6 @@ void* WorkingLoop(void* arguments)
pkt_res_ata_lba48->hdr.packet_id = htole32(AARUREMOTE_PACKET_ID);
// Swapping
ata_lba48_error_regs.lba_high = htole16(ata_lba48_error_regs.lba_high);
ata_lba48_error_regs.lba_mid = htole16(ata_lba48_error_regs.lba_mid);
ata_lba48_error_regs.lba_low = htole16(ata_lba48_error_regs.lba_low);
ata_lba48_error_regs.sector_count = htole16(ata_lba48_error_regs.sector_count);
pkt_res_ata_lba48->registers = ata_lba48_error_regs;