From 36dfa30294f956377ba86778efd5ea3f001434bb Mon Sep 17 00:00:00 2001 From: dlukes <dlukes@4ea69e1a-61f1-4043-bf83-b5c94c648137> Date: Wed, 30 Dec 2009 22:05:00 +0000 Subject: [PATCH] Polishment of changes made in r3011 Based on valuable comments from [CF] Ticket #18 git-svn-id: https://smartmontools.svn.sourceforge.net/svnroot/smartmontools/trunk@3017 4ea69e1a-61f1-4043-bf83-b5c94c648137 --- smartmontools/os_freebsd.cpp | 45 ++++++++++-------------------------- 1 file changed, 12 insertions(+), 33 deletions(-) diff --git a/smartmontools/os_freebsd.cpp b/smartmontools/os_freebsd.cpp index 186787c5b..54c627861 100644 --- a/smartmontools/os_freebsd.cpp +++ b/smartmontools/os_freebsd.cpp @@ -264,7 +264,6 @@ bool freebsd_ata_device::ata_pass_through(const ata_cmd_in & in, ata_cmd_out & o if (!ata_cmd_is_ok(in, true, true, true)) // data_out_support return false; - char buffer[512]; struct ata_ioc_request request; bzero(&request,sizeof(struct ata_ioc_request)); @@ -272,14 +271,8 @@ bool freebsd_ata_device::ata_pass_through(const ata_cmd_in & in, ata_cmd_out & o request.u.ata.command=in.in_regs.command; request.u.ata.feature=in.in_regs.features; - request.u.ata.count = (in.in_regs.prev.sector_count<<16)|in.in_regs.sector_count; - request.u.ata.lba= - ((u_int64_t)in.in_regs.lba_high >> 8 & 0xFF) << 40 - | ((u_int64_t)in.in_regs.lba_mid >> 8 & 0xFF) << 32 - | ((u_int64_t)in.in_regs.lba_low >> 8 & 0xFF) << 24 - | ((u_int64_t)in.in_regs.lba_high & 0xFF) << 16 - | ((u_int64_t)in.in_regs.lba_mid & 0xFF) << 8 - | ((u_int64_t)in.in_regs.lba_low & 0xFF); + request.u.ata.count = in.in_regs.sector_count_16; + request.u.ata.lba = in.in_regs.lba_48; switch (in.direction) { case ata_cmd_in::no_data: @@ -295,34 +288,20 @@ bool freebsd_ata_device::ata_pass_through(const ata_cmd_in & in, ata_cmd_out & o request.data=(char *)in.buffer; request.count=in.size; break; + default: + return set_err(ENOSYS); } - - // Command specific processing - if (in.in_regs.command == ATA_CHECK_POWER_MODE) { - request.data = buffer; - request.data[0] = 0; - request.u.ata.feature=0; - } - clear_err(); errno = 0; - if (do_cmd(&request) || request.error) - { - if (!get_errno()) - set_err(errno); - return false; - } - - if (in.out_needed.error ) - out.out_regs.error = request.error; - if (in.out_needed.sector_count ) - out.out_regs.sector_count = request.u.ata.count; - if (in.out_needed.lba_high || in.out_needed.lba_high || in.out_needed.lba_high ) { - out.out_regs.lba_low = request.u.ata.lba & 0xFF | (request.u.ata.lba >> (24-8)) & 0xFF00; - out.out_regs.lba_mid = (request.u.ata.lba >> 8) & 0xFF | (request.u.ata.lba >> (32-8)) & 0xFF00; - out.out_regs.lba_high = (request.u.ata.lba >> 16) & 0xFF | (request.u.ata.lba >> (40-8)) & 0xFF00; - }; + if (do_cmd(&request)) + return set_err(errno); + if (request.error) + return set_err(EIO, "request failed, error code 0x%02x", request.error); + + out.out_regs.error = request.error; + out.out_regs.sector_count_16 = request.u.ata.count; + out.out_regs.lba_48 = request.u.ata.lba; // Command specific processing -- GitLab