#ifndef DEV_INTERFACE_H
#define DEV_INTERFACE_H
-#define DEV_INTERFACE_H_CVSID "$Id: dev_interface.h 3524 2012-03-21 22:19:31Z chrfranke $\n"
+#define DEV_INTERFACE_H_CVSID "$Id: dev_interface.h 3663 2012-10-24 20:35:55Z chrfranke $\n"
#include "utility.h"
const char * get_errmsg() const
{ return m_err.msg.c_str(); }
+ /// Return true if last error indicates an unsupported system call.
+ /// Default implementation returns true on ENOSYS and ENOTSUP.
+ virtual bool is_syscall_unsup() const;
+
/// Set last error number and message.
/// Printf()-like formatting is supported.
/// Returns false always to allow use as a return expression.
/// Open device with autodetection support.
/// May return another device for further access.
/// In this case, the original pointer is no longer valid.
- /// Default Implementation calls 'open()' and returns 'this'.
+ /// Default implementation calls 'open()' and returns 'this'.
virtual smart_device * autodetect_open();
///////////////////////////////////////////////
virtual bool ata_identify_is_cached() const;
protected:
+ /// Flags for ata_cmd_is_supported().
+ enum {
+ supports_data_out = 0x01, // PIO DATA OUT
+ supports_smart_status = 0x02, // read output registers for SMART STATUS only
+ supports_output_regs = 0x04, // read output registers for all commands
+ supports_multi_sector = 0x08, // more than one sector (1 DRQ/sector variant)
+ supports_48bit_hi_null = 0x10, // 48-bit commands with null high bytes only
+ supports_48bit = 0x20, // all 48-bit commands
+ };
+
/// Check command input parameters.
+ /// Return false if required features are not implemented.
/// Calls set_err(...) accordingly.
+ bool ata_cmd_is_supported(const ata_cmd_in & in, unsigned flags,
+ const char * type = 0);
+
+ /// Check command input parameters (old version).
+ // TODO: Remove if no longer used.
bool 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_48bit_support = false)
+ {
+ return ata_cmd_is_supported(in,
+ (data_out_support ? supports_data_out : 0) |
+ supports_output_regs |
+ (multi_sector_support ? supports_multi_sector : 0) |
+ (ata_48bit_support ? supports_48bit : 0));
+ }
/// Hide/unhide ATA interface.
void hide_ata(bool hide = true)