diff --git a/smartmontools/os_freebsd.cpp b/smartmontools/os_freebsd.cpp
index 89c375e0c6d25a7935a4cdd61536b8bae507c3bb..0fdab2bd8aad173c18cc5cd3cdfb938cbbe0fb79 100644
--- a/smartmontools/os_freebsd.cpp
+++ b/smartmontools/os_freebsd.cpp
@@ -217,7 +217,7 @@ bool freebsd_smart_device::open()
 {
   const char *dev = get_dev_name();
   if ((m_fd = ::open(dev,O_RDONLY))<0) {
-    perror("open failed");
+    set_err(errno);
     return false;
   }
   return true;
@@ -289,7 +289,7 @@ bool freebsd_atacam_device::open(){
   const char *dev = get_dev_name();
   
   if ((m_camdev = cam_open_device(dev, O_RDWR)) == NULL) {
-    perror("cam_open_device");
+    set_err(errno);
     return false;
   }
   set_fd(m_camdev->fd);
@@ -534,6 +534,7 @@ public:
 
 protected:
   virtual int ata_command_interface(smart_command_set command, int select, char * data);
+  virtual bool open();
 
 private:
   int m_escalade_type; ///< Type string for escalade_command_interface().
@@ -552,6 +553,19 @@ freebsd_escalade_device::freebsd_escalade_device(smart_interface * intf, const c
   set_info().info_name = strprintf("%s [3ware_disk_%02d]", dev_name, disknum);
 }
 
+bool freebsd_escalade_device::open()
+{
+  const char *dev = get_dev_name();
+  int fd;
+  
+  if ((fd = ::open(dev,O_RDWR))<0) {
+    set_err(errno);
+    return false;
+  }
+  set_fd(fd);
+  return true;
+}
+
 int freebsd_escalade_device::ata_command_interface(smart_command_set command, int select, char * data)
 {
   // to hold true file descriptor
@@ -828,7 +842,7 @@ bool freebsd_highpoint_device::open()
   int fd;
   
   if ((fd = ::open(dev,O_RDWR))<0) {
-    perror("open failed");
+    set_err(errno);
     return false;
   }
   set_fd(fd);
@@ -1016,7 +1030,7 @@ bool freebsd_scsi_device::open(){
   const char *dev = get_dev_name();
   
   if ((m_camdev = cam_open_device(dev, O_RDWR)) == NULL) {
-    perror("cam_open_device");
+    set_err(errno);
     return false;
   }
   set_fd(m_camdev->fd);
@@ -1157,7 +1171,7 @@ bool freebsd_cciss_device::open()
   return false;
 #endif  
   if ((fd = ::open(dev,O_RDWR))<0) {
-    perror("open failed");
+    set_err(errno);
     return false;
   }
   set_fd(fd);
@@ -1789,7 +1803,7 @@ smart_device * freebsd_smart_interface::autodetect_smart_device(const char * nam
       { // our disk device is CAM
         if ((cam_dev = cam_open_device(name, O_RDWR)) == NULL) {
           // open failure
-          perror("cam_open_device");
+          set_err(errno);
           return false;
         }