/*
* dev_interface.cpp
*
- * Home page of code is: http://smartmontools.sourceforge.net
+ * Home page of code is: http://www.smartmontools.org
*
- * Copyright (C) 2008-12 Christian Franke <smartmontools-support@lists.sourceforge.net>
+ * Copyright (C) 2008-13 Christian Franke <smartmontools-support@lists.sourceforge.net>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
#include "int64.h"
#include "dev_interface.h"
#include "dev_tunnelled.h"
+#include "atacmds.h" // ATA_SMART_CMD/STATUS
#include "utility.h"
#include <errno.h>
#include <sys/timeb.h>
#endif
-const char * dev_interface_cpp_cvsid = "$Id: dev_interface.cpp 3524 2012-03-21 22:19:31Z chrfranke $"
+const char * dev_interface_cpp_cvsid = "$Id: dev_interface.cpp 4120 2015-08-27 16:12:21Z samm2 $"
DEV_INTERFACE_H_CVSID;
/////////////////////////////////////////////////////////////////////////////
{
}
+bool smart_device::is_syscall_unsup() const
+{
+ if (get_errno() == ENOSYS)
+ return true;
+#ifdef ENOTSUP
+ if (get_errno() == ENOTSUP)
+ return true;
+#endif
+ return false;
+}
+
bool smart_device::set_err(int no, const char * msg, ...)
{
if (!msg)
return ata_pass_through(in, dummy);
}
-bool ata_device::ata_cmd_is_ok(const ata_cmd_in & in,
- bool data_out_support /*= false*/,
- bool multi_sector_support /*= false*/,
- bool ata_48bit_support /*= false*/)
+bool ata_device::ata_cmd_is_supported(const ata_cmd_in & in,
+ unsigned flags, const char * type /* = 0 */)
{
// Check DATA IN/OUT
switch (in.direction) {
}
// Check features
- if (in.direction == ata_cmd_in::data_out && !data_out_support)
- return set_err(ENOSYS, "DATA OUT ATA commands not supported");
- if (!(in.size == 0 || in.size == 512) && !multi_sector_support)
- return set_err(ENOSYS, "Multi-sector ATA commands not supported");
- if (in.in_regs.is_48bit_cmd() && !ata_48bit_support)
- return set_err(ENOSYS, "48-bit ATA commands not supported");
+ const char * errmsg = 0;
+ if (in.direction == ata_cmd_in::data_out && !(flags & supports_data_out))
+ errmsg = "DATA OUT ATA commands not implemented";
+ else if ( in.out_needed.is_set() && !(flags & supports_output_regs)
+ && !( in.in_regs.command == ATA_SMART_CMD
+ && in.in_regs.features == ATA_SMART_STATUS
+ && (flags & supports_smart_status)))
+ errmsg = "Read of ATA output registers not implemented";
+ else if (!(in.size == 0 || in.size == 512) && !(flags & supports_multi_sector))
+ errmsg = "Multi-sector ATA commands not implemented";
+ else if (in.in_regs.is_48bit_cmd() && !(flags & (supports_48bit_hi_null|supports_48bit)))
+ errmsg = "48-bit ATA commands not implemented";
+ else if (in.in_regs.is_real_48bit_cmd() && !(flags & supports_48bit))
+ errmsg = "48-bit ATA commands not fully implemented";
+
+ if (errmsg)
+ return set_err(ENOSYS, "%s%s%s%s", errmsg,
+ (type ? " [" : ""), (type ? type : ""), (type ? "]" : ""));
+
return true;
}
{
// default
std::string s =
- "ata, scsi, sat[,auto][,N][+TYPE], usbcypress[,X], usbjmicron[,x][,N], usbsunplus";
+ "ata, scsi, sat[,auto][,N][+TYPE], usbcypress[,X], usbjmicron[,p][,x][,N], usbsunplus";
// append custom
std::string s2 = get_valid_custom_dev_types_str();
if (!s2.empty()) {