diff --git a/sm5/CHANGELOG b/sm5/CHANGELOG
index 20e5e12e141c18e4a1099b57c85a020016e5bfe7..158eca100fb14b86fc0553f3a4607e92ff8de697 100644
--- a/sm5/CHANGELOG
+++ b/sm5/CHANGELOG
@@ -1,6 +1,6 @@
 CHANGELOG for smartmontools
 
-$Id: CHANGELOG,v 1.760 2009/01/11 13:24:53 manfred99 Exp $
+$Id: CHANGELOG,v 1.761 2009/01/14 02:39:00 sxzzsf Exp $
 
 The most recent version of this file is:
 http://smartmontools.cvs.sourceforge.net/smartmontools/sm5/CHANGELOG?view=markup
@@ -34,13 +34,16 @@ Maintainers / Developers Key (alphabetic order):
 [SS]  Sergey Svishchev
 [PW]  Phil Williams
 [LW]  Leon Woestenberg
-[SZ]  Sf Zhou
+[SZ]  Shengfeng Zhou
 [RZ]  Richard Zybert
 
 NOTES FOR FUTURE RELEASES: see TODO file.
 
 <DEVELOPERS: ADDITIONS TO THE CHANGE LOG GO JUST BELOW HERE, PLEASE>
 
+  [SZ] os_freebsd.cpp, os_freebsd.h updates:
+       Support HighPoint RocketRAID controller under FreeBSD
+
   [MS] knowndrives.cpp updates:
        - Added Western Digital RE3 32MB cache variants
        - Added WD Caviar Green 32MB cache variant (WD10EADS)
diff --git a/sm5/os_freebsd.cpp b/sm5/os_freebsd.cpp
index cf4118f7d63cd99b7d37476fdf7d92d8f5859f96..064610385aa7f4f53862e805d38a21699d2ef6bc 100644
--- a/sm5/os_freebsd.cpp
+++ b/sm5/os_freebsd.cpp
@@ -46,9 +46,9 @@
 #include "extern.h"
 #include "os_freebsd.h"
 
-static __unused const char *filenameandversion="$Id: os_freebsd.cpp,v 1.72 2008/12/19 15:49:38 dlukes Exp $";
+static __unused const char *filenameandversion="$Id: os_freebsd.cpp,v 1.73 2009/01/14 02:39:00 sxzzsf Exp $";
 
-const char *os_XXXX_c_cvsid="$Id: os_freebsd.cpp,v 1.72 2008/12/19 15:49:38 dlukes Exp $" \
+const char *os_XXXX_c_cvsid="$Id: os_freebsd.cpp,v 1.73 2009/01/14 02:39:00 sxzzsf Exp $" \
 ATACMDS_H_CVSID CCISS_H_CVSID CONFIG_H_CVSID INT64_H_CVSID OS_FREEBSD_H_CVSID SCSICMDS_H_CVSID UTILITY_H_CVSID;
 
 extern smartmonctrl * con;
@@ -164,6 +164,15 @@ int deviceopen (const char* dev, __unused char* mode) {
     }
   }
 
+  if (parse_ok == CONTROLLER_HPT) {
+    if ((fdchan->device = open(dev,O_RDWR))<0) {
+      int myerror = errno;	// preserve across free call
+      free(fdchan);
+      errno = myerror;
+      return -1;
+    }
+  }
+
   if (parse_ok == CONTROLLER_CCISS) {
     if ((fdchan->device = open(dev,O_RDWR))<0) {
       int myerror = errno;	// preserve across free call
@@ -266,8 +275,158 @@ int marvell_command_interface(__unused int fd, __unused smart_command_set comman
   return -1;
 }
 
-int highpoint_command_interface(__unused int fd, __unused smart_command_set command, __unused int select, __unused char *data) {
-  return -1;
+int highpoint_command_interface(int fd, smart_command_set command, int select, char *data) {
+  int ids[2];
+  struct freebsd_dev_channel* fbcon;
+  HPT_IOCTL_PARAM param;
+  HPT_CHANNEL_INFO_V2 info;
+  unsigned char* buff[512 + 2 * sizeof(HPT_PASS_THROUGH_HEADER)];
+  PHPT_PASS_THROUGH_HEADER pide_pt_hdr, pide_pt_hdr_out;
+
+  // check that "file descriptor" is valid
+  if (isnotopen(&fd, &fbcon))
+      return -1;
+
+  // get internal deviceid
+  ids[0] = con->hpt_data[0] - 1;
+  ids[1] = con->hpt_data[1] - 1;
+
+  memset(&param, 0, sizeof(HPT_IOCTL_PARAM));
+
+  param.magic = HPT_IOCTL_MAGIC;
+  param.ctrl_code = HPT_IOCTL_GET_CHANNEL_INFO_V2;
+  param.in = (unsigned char *)ids;
+  param.in_size = sizeof(unsigned int) * 2;
+  param.out = (unsigned char *)&info;
+  param.out_size = sizeof(HPT_CHANNEL_INFO_V2);
+
+  if (con->hpt_data[2]==1) {
+    param.ctrl_code = HPT_IOCTL_GET_CHANNEL_INFO;
+    param.out_size = sizeof(HPT_CHANNEL_INFO);
+  }
+  if (ioctl(fbcon->device, HPT_DO_IOCONTROL, &param)!=0 ||
+      info.devices[con->hpt_data[2]-1]==0) {
+    return -1;
+  }
+
+  // perform smart action
+  memset(buff, 0, 512 + 2 * sizeof(HPT_PASS_THROUGH_HEADER));
+  pide_pt_hdr = (PHPT_PASS_THROUGH_HEADER)buff;
+
+  pide_pt_hdr->lbamid = 0x4f;
+  pide_pt_hdr->lbahigh = 0xc2;
+  pide_pt_hdr->command = ATA_SMART_CMD;
+  pide_pt_hdr->id = info.devices[con->hpt_data[2] - 1];
+
+  switch (command){
+  case READ_VALUES:
+    pide_pt_hdr->feature=ATA_SMART_READ_VALUES;
+    pide_pt_hdr->protocol=HPT_READ;
+    break;
+  case READ_THRESHOLDS:
+    pide_pt_hdr->feature=ATA_SMART_READ_THRESHOLDS;
+    pide_pt_hdr->protocol=HPT_READ;
+    break;
+  case READ_LOG:
+    pide_pt_hdr->feature=ATA_SMART_READ_LOG_SECTOR;
+    pide_pt_hdr->lbalow=select;
+    pide_pt_hdr->protocol=HPT_READ;
+    break;
+  case IDENTIFY:
+    pide_pt_hdr->command=ATA_IDENTIFY_DEVICE;
+    pide_pt_hdr->protocol=HPT_READ;
+    break;
+  case ENABLE:
+    pide_pt_hdr->feature=ATA_SMART_ENABLE;
+    break;
+  case DISABLE:
+    pide_pt_hdr->feature=ATA_SMART_DISABLE;
+    break;
+  case AUTO_OFFLINE:
+    pide_pt_hdr->feature=ATA_SMART_AUTO_OFFLINE;
+    pide_pt_hdr->sectorcount=select;
+    break;
+  case AUTOSAVE:
+    pide_pt_hdr->feature=ATA_SMART_AUTOSAVE;
+    pide_pt_hdr->sectorcount=select;
+    break;
+  case IMMEDIATE_OFFLINE:
+    pide_pt_hdr->feature=ATA_SMART_IMMEDIATE_OFFLINE;
+    pide_pt_hdr->lbalow=select;
+    break;
+  case STATUS_CHECK:
+  case STATUS:
+    pide_pt_hdr->feature=ATA_SMART_STATUS;
+    break;
+  case CHECK_POWER_MODE:
+    pide_pt_hdr->command=ATA_CHECK_POWER_MODE;
+    break;
+  case WRITE_LOG:
+    memcpy(buff+sizeof(HPT_PASS_THROUGH_HEADER), data, 512);
+    pide_pt_hdr->feature=ATA_SMART_WRITE_LOG_SECTOR;
+    pide_pt_hdr->lbalow=select;
+    pide_pt_hdr->protocol=HPT_WRITE;
+    break;
+  default:
+    pout("Unrecognized command %d in highpoint_command_interface()\n"
+         "Please contact " PACKAGE_BUGREPORT "\n", command);
+    errno=ENOSYS;
+    return -1;
+  }
+  if (pide_pt_hdr->protocol!=0) {
+    pide_pt_hdr->sectors = 1;
+    pide_pt_hdr->sectorcount = 1;
+  }
+
+  memset(&param, 0, sizeof(HPT_IOCTL_PARAM));
+
+  param.magic = HPT_IOCTL_MAGIC;
+  param.ctrl_code = HPT_IOCTL_IDE_PASS_THROUGH;
+  param.in = (unsigned char *)buff;
+  param.in_size = sizeof(HPT_PASS_THROUGH_HEADER) + (pide_pt_hdr->protocol==HPT_READ ? 0 : pide_pt_hdr->sectors * 512);
+  param.out = (unsigned char *)buff+param.in_size;
+  param.out_size = sizeof(HPT_PASS_THROUGH_HEADER) + (pide_pt_hdr->protocol==HPT_READ ? pide_pt_hdr->sectors * 512 : 0);
+
+  pide_pt_hdr_out = (PHPT_PASS_THROUGH_HEADER)param.out;
+
+  if ((ioctl(fbcon->device, HPT_DO_IOCONTROL, &param)!=0) ||
+      (pide_pt_hdr_out->command & 1)) {
+    return -1;
+  }
+
+  if (command==STATUS_CHECK){
+    unsigned const char normal_lo=0x4f, normal_hi=0xc2;
+    unsigned const char failed_lo=0xf4, failed_hi=0x2c;
+    unsigned char low,high;
+
+    high = pide_pt_hdr_out->lbahigh;
+    low = pide_pt_hdr_out->lbamid;
+
+    // Cyl low and Cyl high unchanged means "Good SMART status"
+    if (low==normal_lo && high==normal_hi)
+      return 0;
+
+    // These values mean "Bad SMART status"
+    if (low==failed_lo && high==failed_hi)
+      return 1;
+
+    // We haven't gotten output that makes sense; print out some debugging info
+    char buf[512];
+    sprintf(buf,"CMD=0x%02x\nFR =0x%02x\nNS =0x%02x\nSC =0x%02x\nCL =0x%02x\nCH =0x%02x\nRETURN =0x%04x\n",
+            (int)pide_pt_hdr_out->command,
+            (int)pide_pt_hdr_out->feature,
+            (int)pide_pt_hdr_out->sectorcount,
+            (int)pide_pt_hdr_out->lbalow,
+            (int)pide_pt_hdr_out->lbamid,
+            (int)pide_pt_hdr_out->lbahigh,
+            (int)pide_pt_hdr_out->sectors);
+    printwarning(BAD_SMART,buf);
+  }
+  else if (command==CHECK_POWER_MODE)
+    data[0] = pide_pt_hdr_out->sectorcount & 0xff;
+  else if (pide_pt_hdr->protocol==HPT_READ)
+    memcpy(data, (unsigned char *)buff + 2 * sizeof(HPT_PASS_THROUGH_HEADER), pide_pt_hdr->sectors * 512);
+  return 0;
 }
 
 int areca_command_interface(__unused int fd, __unused int disknum, __unused smart_command_set command, __unused int select, __unused char *data) {
@@ -882,6 +1041,17 @@ static int get_tw_channel_unit (const char* name, int* unit, int* dev) {
   return 0;
 }
 
+static int hpt_hba(const char* name) {
+  int i=0;
+  const char *hpt_node[]={"hptmv", "hptmv6", "hptrr", "hptiop", "hptmviop", "hpt32xx", "rr2320",
+                          "rr232x", "rr2310", "rr2310_00", "rr2300", "rr2340", "rr1740", NULL};
+  while (hpt_node[i]) {
+    if (!strncmp(name, hpt_node[i], strlen(hpt_node[i])))
+      return 1;
+    i++;
+  }
+  return 0;
+}
 
 #ifndef ATA_DEVICE
 #define ATA_DEVICE "/dev/ata"
@@ -1030,6 +1200,11 @@ static int parse_ata_chan_dev(const char * dev_name, struct freebsd_dev_channel
     }
     return CONTROLLER_3WARE_678K_CHAR;
   }
+
+  if (hpt_hba(dev_name)) {
+    return CONTROLLER_HPT;
+  }
+
   // form /dev/ciss*
   if (!strncmp(fbsd_dev_cciss, dev_name,
                strlen(fbsd_dev_cciss)))
diff --git a/sm5/os_freebsd.h b/sm5/os_freebsd.h
index 47c96532b312ed6d468fa0ceab0544e998bdcbb9..6793a43484e112a39b1aa52f61ab96e1e8bb35a1 100644
--- a/sm5/os_freebsd.h
+++ b/sm5/os_freebsd.h
@@ -82,7 +82,7 @@
 #ifndef OS_FREEBSD_H_
 #define OS_FREEBSD_H_
 
-#define OS_FREEBSD_H_CVSID "$Id: os_freebsd.h,v 1.25 2008/03/29 23:32:11 shattered Exp $\n"
+#define OS_FREEBSD_H_CVSID "$Id: os_freebsd.h,v 1.26 2009/01/14 02:39:00 sxzzsf Exp $\n"
 
 struct freebsd_dev_channel {
   int   channel;                // the ATA channel to work with
@@ -574,6 +574,56 @@ typedef struct tw_osli_ioctl_with_payload {
 
 #endif
 
+#define HPT_CTL_CODE(x) (x+0xFF00)
+#define HPT_IOCTL_GET_CHANNEL_INFO          HPT_CTL_CODE(3)
+#define HPT_IOCTL_GET_CHANNEL_INFO_V2       HPT_CTL_CODE(53)
+#define HPT_IOCTL_IDE_PASS_THROUGH          HPT_CTL_CODE(24)
+
+#define HPT_READ 1
+#define HPT_WRITE 2
+
+#define HPT_IOCTL_MAGIC   0xA1B2C3D4
+
+#define MAXDEV_PER_CHANNEL 2
+#define PMPORT_PER_CHANNEL 15 /* max devices connected to this channel via pmport */
+
+typedef struct _HPT_CHANNEL_INFO {
+  unsigned int reserve1;
+  unsigned int reserve2;
+  unsigned int devices[MAXDEV_PER_CHANNEL];
+} HPT_CHANNEL_INFO, *PHPT_CHANNEL_INFO;
+
+typedef struct _HPT_CHANNEL_INFO_V2 {
+  unsigned int reserve1;
+  unsigned int reserve2;
+  unsigned int devices[PMPORT_PER_CHANNEL];
+} HPT_CHANNEL_INFO_V2, *PHPT_CHANNEL_INFO_V2;
+
+typedef struct _HPT_IOCTL_PARAM {
+  unsigned int magic;     /* used to check if it's a valid ioctl packet */
+  unsigned int ctrl_code; /* operation control code */
+  void* in;               /* input data buffer */
+  unsigned int in_size;   /* size of input data buffer */
+  void* out;              /* output data buffer */
+  unsigned int out_size;  /* size of output data buffer */
+  void* returned_size;    /* count of chars returned */
+} HPT_IOCTL_PARAM, *PHPT_IOCTL_PARAM;
+#define HPT_DO_IOCONTROL	_IOW('H', 0, HPT_IOCTL_PARAM)
+
+typedef struct _HPT_PASS_THROUGH_HEADER {
+  unsigned int id;          /* disk ID */
+  unsigned char feature;
+  unsigned char sectorcount;
+  unsigned char lbalow;
+  unsigned char lbamid;
+  unsigned char lbahigh;
+  unsigned char driverhead;
+  unsigned char command;
+  unsigned char sectors;    /* data size in sectors, if the command has data transfer */
+  unsigned char protocol;   /* HPT_(READ,WRITE) or zero for non-DATA */
+  unsigned char reserve[3];
+}
+HPT_PASS_THROUGH_HEADER, *PHPT_PASS_THROUGH_HEADER;
 
 #ifndef __unused
 #define __unused __attribute__ ((__unused__))
diff --git a/sm5/smartctl.8.in b/sm5/smartctl.8.in
index 2845a22f28c89f422dc39f30d80b953f869db749..f9d87e76f0ff46c4779f7edab3f7e4e7b6d4b9f0 100644
--- a/sm5/smartctl.8.in
+++ b/sm5/smartctl.8.in
@@ -1,7 +1,7 @@
 .ig
  Copyright (C) 2002-8 Bruce Allen <smartmontools-support@lists.sourceforge.net>
 
- $Id: smartctl.8.in,v 1.117 2008/12/12 12:38:08 steffeng Exp $
+ $Id: smartctl.8.in,v 1.118 2009/01/14 02:39:00 sxzzsf Exp $
  
  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 the Free
@@ -213,8 +213,8 @@ use the exit status of \fBsmartctl\fP (see RETURN VALUES below).
 .TP
 .B \-d TYPE, \-\-device=TYPE
 Specifies the type of the device.  The valid arguments to this option
-are \fIata\fP, \fIscsi\fP, \fIsat\fP, \fImarvell\fP, \fI3ware,N\fP, \fIareca,N\fP, \fIusbcypress\fP, and \fIhpt,L/M\fP,
-\fIcciss,N\fP or \fIhpt,L/M/N\fP.  If this option is not used then
+are \fIata\fP, \fIscsi\fP, \fIsat\fP, \fImarvell\fP, \fI3ware,N\fP, \fIareca,N\fP, \fIusbcypress\fP, \fIcciss,N\fP, and
+\fIhpt,L/M\fP (or \fIhpt,L/M/N\fP).  If this option is not used then
 \fBsmartctl\fP will attempt to guess the device type from the device name.
 
 The \'sat\' device type is for ATA disks that have a SCSI to ATA
@@ -351,21 +351,28 @@ error messages and no SMART information.
 To look at (S)ATA disks behind HighPoint RocketRAID controllers, use syntax
 such as:
 .nf
-\fBsmartctl \-a \-d hpt,1/3 /dev/sda\fP
+\fBsmartctl \-a \-d hpt,1/3 /dev/sda\fP    (under Linux)
 .fi
-or
 .nf
-\fBsmartctl \-a \-d hpt,1/2/3 /dev/sda\fP
+\fBsmartctl \-a \-d hpt,1/2/3 /dev/sda\fP    (under Linux)
+.fi
+.nf
+\fBsmartctl \-a \-d hpt,1/3 /dev/hptrr\fP    (under FreeBSD)
+.fi
+.nf
+\fBsmartctl \-a \-d hpt,1/2/3 /dev/hptrr\fP    (under FreeBSD)
 .fi
 where in the argument \fIhpt,L/M\fP or \fIhpt,L/M/N\fP, the integer L is the
 controller id, the integer M is the channel number, and the integer N is the
 PMPort number if it is available. The allowed values of L are from 1 to 4
-inclusive, M are from 1 to 8 inclusive and N from 1 to 4 if PMPort available.
+inclusive, M are from 1 to 8 inclusive and N from 1 to 5 if PMPort available.
 Note that the /dev/sda\-z form should be the device node which stands for
-the disks derived from the HighPoint RocketRAID controllers.  And also
-these values are limited by the model of the HighPoint RocketRAID controller.
+the disks derived from the HighPoint RocketRAID controllers under Linux and
+under FreeBSD, it is the character device which the driver registered (eg,
+/dev/hptrr, /dev/hptmv6).  And also these values are limited by the model
+of the HighPoint RocketRAID controller.
 
-.B HighPoint RocketRAID controllers are currently ONLY supported under Linux.
+.B HighPoint RocketRAID controllers are currently ONLY supported under Linux and FreeBSD.
 
 .B cciss controllers are currently ONLY supported under Linux.
 
@@ -1481,14 +1488,16 @@ Start a long self\-test on the fourth SATA disk connected to an Areca RAID
 controller addressed by /dev/sg2.
 .PP
 .nf
-.B smartctl \-a \-d hpt,1/3 /dev/sda
+.B smartctl \-a \-d hpt,1/3 /dev/sda    (under Linux)
+.B smartctl \-a \-d hpt,1/3 /dev/hptrr    (under FreeBSD)
 .fi
 Examine all SMART data for the (S)ATA disk directly connected to the third channel of the
 first HighPoint RocketRAID controller card.
 .nf
 .PP
 .nf
-.B smartctl \-t short \-d hpt,1/1/2 /dev/sda
+.B smartctl \-t short \-d hpt,1/1/2 /dev/sda    (under Linux)
+.B smartctl \-t short \-d hpt,1/1/2 /dev/hptrr    (under FreeBSD)
 .fi
 Start a short self\-test on the (S)ATA disk connected to second pmport on the
 first channel of the first HighPoint RocketRAID controller card.
@@ -1635,7 +1644,7 @@ these documents may be found in the References section of the
 
 .SH
 CVS ID OF THIS PAGE:
-$Id: smartctl.8.in,v 1.117 2008/12/12 12:38:08 steffeng Exp $
+$Id: smartctl.8.in,v 1.118 2009/01/14 02:39:00 sxzzsf Exp $
 .\" Local Variables:	         
 .\" mode: nroff         
 .\" End:
diff --git a/sm5/smartd.8.in b/sm5/smartd.8.in
index c84f505a18b6b86669a476b4108177a634b54581..365d9a96d3f061882b2315ccbae5cec3be1d1485 100644
--- a/sm5/smartd.8.in
+++ b/sm5/smartd.8.in
@@ -1,7 +1,7 @@
 .ig
 Copyright (C) 2002-8 Bruce Allen <smartmontools-support@lists.sourceforge.net>
  
-$Id: smartd.8.in,v 1.133 2008/11/04 19:28:42 chrfranke Exp $
+$Id: smartd.8.in,v 1.134 2009/01/14 02:39:00 sxzzsf Exp $
 
 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
@@ -601,16 +601,25 @@ Section below!
 .B # Three SATA disks on a HighPoint RocketRAID controller.
 .B # Start short self-tests daily between 1-2, 2-3, and
 .B # 3-4 am.
+.B # under Linux
 .B \ \ /dev/sde -d hpt,1/1 -a -s S/../.././01
 .B \ \ /dev/sde -d hpt,1/2 -a -s S/../.././02
 .B \ \ /dev/sde -d hpt,1/3 -a -s S/../.././03
+.B # or under FreeBSD
+.B # /dev/hptrr -d hpt,1/1 -a -s S/../.././01
+.B # /dev/hptrr -d hpt,1/2 -a -s S/../.././02
+.B # /dev/hptrr -d hpt,1/3 -a -s S/../.././03
 .B #
 .nf
 .B # Two SATA disks connected to a HighPoint RocketRAID 
 .B # via a pmport device.  Start long self-tests Sundays
 .B # between midnight and 1am and 2-3 am.
+.B # under Linux
 .B \ \ /dev/sde -d hpt,1/4/1 -a -s L/../../7/00
 .B \ \ /dev/sde -d hpt,1/4/2 -a -s L/../../7/02
+.B # or under FreeBSD
+.B # /dev/hptrr -d hpt,1/4/1 -a -s L/../../7/00
+.B # /dev/hptrr -d hpt,1/4/2 -a -s L/../../7/02
 .B #
 .nf
 .B # Three SATA disks connected to an Areca
@@ -813,7 +822,7 @@ In log files and email messages this disk will be identified as
 hpt_X/X/X and X/X/X is the same as L/M/N, note if no N indicated, N set
 to the default value 1.
 
-.B HighPoint RocketRAID controllers are currently ONLY supported under Linux.
+.B HighPoint RocketRAID controllers are currently ONLY supported under Linux and FreeBSD.
 
 .I removable
 \- the device or its media is removable.  This indicates to
@@ -1232,11 +1241,11 @@ HighPoint RocketRAID controller.
 is set to the device description.  For SMARTD_DEVICETYPE of ata or
 scsi, this is the same as SMARTD_DEVICE.  For 3ware RAID controllers,
 the form used is \'/dev/sdc [3ware_disk_01]\'.  For HighPoint
-RocketRAID controller, the form is \'/dev/sdd [hpt_1/1/1]\'.  For
-Areca controllers, the form is \'/dev/sg2 [areca_disk_09]\'.  In these
-cases the device string contains a space and is NOT quoted.  So to use
-$SMARTD_DEVICESTRING in a bash script you should probably enclose it
-in double quotes.
+RocketRAID controller, the form is \'/dev/sdd [hpt_1/1/1]\' under Linux
+or \'/dev/hptrr [hpt_1/1/1]\' under FreeBSD.  For Areca controllers, the
+form is \'/dev/sg2 [areca_disk_09]\'.  In these cases the device string
+contains a space and is NOT quoted.  So to use $SMARTD_DEVICESTRING in a
+bash script you should probably enclose it in double quotes.
 .IP \fBSMARTD_FAILTYPE\fP 4
 gives the reason for the warning or message email.  The possible values that
 it takes and their meanings are:
@@ -2036,7 +2045,7 @@ The following have made large contributions to smartmontools:
 \fBSergey Svishchev\fP (NetBSD interface)
 \fBDavid Snyder and Sergey Svishchev\fP (OpenBSD interface)
 \fBPhil Williams\fP (User interface and drive database)
-\fBShengfeng Zhou\fP (Linux HighPoint RocketRAID interface)
+\fBShengfeng Zhou\fP (Linux/FreeBSD HighPoint RocketRAID interface)
 .fi
 Many other individuals have made smaller contributions and corrections.
 
@@ -2087,4 +2096,4 @@ smartmontools home page at \fBhttp://smartmontools.sourceforge.net/#references\f
 
 .SH
 CVS ID OF THIS PAGE:
-$Id: smartd.8.in,v 1.133 2008/11/04 19:28:42 chrfranke Exp $
+$Id: smartd.8.in,v 1.134 2009/01/14 02:39:00 sxzzsf Exp $
diff --git a/sm5/smartd.conf.5.in b/sm5/smartd.conf.5.in
index 3ca9e855201ff56588483c07f039bdb8003964a9..ee39a88fcab4ab176b3cd152f03c4364eb538f67 100644
--- a/sm5/smartd.conf.5.in
+++ b/sm5/smartd.conf.5.in
@@ -1,7 +1,7 @@
 .ig
 Copyright (C) 2002-8 Bruce Allen <smartmontools-support@lists.sourceforge.net>
 
-$Id: smartd.conf.5.in,v 1.97 2008/11/04 19:28:42 chrfranke Exp $
+$Id: smartd.conf.5.in,v 1.98 2009/01/14 02:39:00 sxzzsf Exp $
 
 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 the Free
@@ -186,16 +186,25 @@ Section below!
 .B # Three SATA disks on a HighPoint RocketRAID controller.
 .B # Start short self-tests daily between 1-2, 2-3, and
 .B # 3-4 am.
+.B # under Linux
 .B \ \ /dev/sde -d hpt,1/1 -a -s S/../.././01
 .B \ \ /dev/sde -d hpt,1/2 -a -s S/../.././02
 .B \ \ /dev/sde -d hpt,1/3 -a -s S/../.././03
+.B # or under FreeBSD
+.B # /dev/hptrr -d hpt,1/1 -a -s S/../.././01
+.B # /dev/hptrr -d hpt,1/2 -a -s S/../.././02
+.B # /dev/hptrr -d hpt,1/3 -a -s S/../.././03
 .B #
 .nf
 .B # Two SATA disks connected to a HighPoint RocketRAID 
 .B # via a pmport device.  Start long self-tests Sundays
 .B # between midnight and 1am and 2-3 am.
+.B # under Linux
 .B \ \ /dev/sde -d hpt,1/4/1 -a -s L/../../7/00
 .B \ \ /dev/sde -d hpt,1/4/2 -a -s L/../../7/02
+.B # or under FreeBSD
+.B # /dev/hptrr -d hpt,1/4/1 -a -s L/../../7/00
+.B # /dev/hptrr -d hpt,1/4/2 -a -s L/../../7/02
 .B #
 .nf
 .B # Three SATA disks connected to an Areca
@@ -817,11 +826,11 @@ HighPoint RocketRAID controller.
 is set to the device description.  For SMARTD_DEVICETYPE of ata or
 scsi, this is the same as SMARTD_DEVICE.  For 3ware RAID controllers,
 the form used is \'/dev/sdc [3ware_disk_01]\'.  For HighPoint
-RocketRAID controller, the form is \'/dev/sdd [hpt_1/1/1]\'.  For
-Areca controllers, the form is \'/dev/sg2 [areca_disk_09]\'.  In these
-cases the device string contains a space and is NOT quoted.  So to use
-$SMARTD_DEVICESTRING in a bash script you should probably enclose it
-in double quotes.
+RocketRAID controller, the form is \'/dev/sdd [hpt_1/1/1]\' under Linux
+or \'/dev/hptrr [hpt_1/1/1]\' under FreeBSD.  For Areca controllers, the
+form is \'/dev/sg2 [areca_disk_09]\'.  In these cases the device string
+contains a space and is NOT quoted.  So to use $SMARTD_DEVICESTRING in a
+bash script you should probably enclose it in double quotes.
 .IP \fBSMARTD_FAILTYPE\fP 4
 gives the reason for the warning or message email.  The possible values that
 it takes and their meanings are:
@@ -1442,4 +1451,4 @@ SEE ALSO:
 
 .SH
 CVS ID OF THIS PAGE:
-$Id: smartd.conf.5.in,v 1.97 2008/11/04 19:28:42 chrfranke Exp $
+$Id: smartd.conf.5.in,v 1.98 2009/01/14 02:39:00 sxzzsf Exp $