diff --git a/sm5/ataprint.c b/sm5/ataprint.c
index 4ba9dba67604d7224c45323df71dc3f9ab312141..d5b395627b7d22db12bcbb787a1c331721a9e668 100644
--- a/sm5/ataprint.c
+++ b/sm5/ataprint.c
@@ -35,7 +35,7 @@
 #include "knowndrives.h"
 #include "config.h"
 
-const char *ataprint_c_cvsid="$Id: ataprint.c,v 1.149 2004/04/02 05:57:40 ballen4705 Exp $"
+const char *ataprint_c_cvsid="$Id: ataprint.c,v 1.150 2004/04/10 00:24:14 ballen4705 Exp $"
 ATACMDNAMES_H_CVSID ATACMDS_H_CVSID ATAPRINT_H_CVSID CONFIG_H_CVSID EXTERN_H_CVSID INT64_H_CVSID KNOWNDRIVES_H_CVSID SMARTCTL_H_CVSID UTILITY_H_CVSID;
 
 // for passing global control variables
@@ -924,8 +924,9 @@ int ataPrintSmartErrorlog(struct ata_smart_errorlog *data){
        "\tDC = Device Command Register [HEX]\n"
        "\tER = Error register [HEX]\n"
        "\tST = Status register [HEX]\n"
-       "Timestamp = decimal seconds since the previous disk power-on.\n"
-       "Note: timestamp \"wraps\" after 2^32 msec = 49.710 days.\n\n");
+       "Powered_Up_Time is measured from power on, and printed as\n"
+       "DDd+hh:mm:SS.sss where DD=days, hh=hours, mm=minutes,\n"
+       "SS=sec, and sss=millisec. It \"wraps\" after 49.710 days.\n\n");
   
   // now step through the five error log data structures (table 39 of spec)
   for (k = 4; k >= 0; k-- ) {
@@ -982,8 +983,8 @@ int ataPrintSmartErrorlog(struct ata_smart_errorlog *data){
       }
       pout("\n\n");
       pout("  Commands leading to the command that caused the error were:\n"
-           "  CR FR SC SN CL CH DH DC  Power_Up_Time    Command/Feature_Name\n"
-           "  -- -- -- -- -- -- -- --  ---------------  --------------------\n");
+           "  CR FR SC SN CL CH DH DC   Powered_Up_Time  Command/Feature_Name\n"
+           "  -- -- -- -- -- -- -- --  ----------------  --------------------\n");
       for ( j = 4; j >= 0; j--){
         struct ata_smart_errorlog_command_struct *thiscommand=elog->commands+j;
 
@@ -994,7 +995,7 @@ int ataPrintSmartErrorlog(struct ata_smart_errorlog *data){
 	  // Convert integer milliseconds to a text-format string
 	  MsecToText(thiscommand->timestamp, timestring);
 	  
-          pout("  %02x %02x %02x %02x %02x %02x %02x %02x %16s  %s\n",
+          pout("  %02x %02x %02x %02x %02x %02x %02x %02x  %16s  %s\n",
                (int)thiscommand->commandreg,
                (int)thiscommand->featuresreg,
                (int)thiscommand->sector_count,
diff --git a/sm5/ataprint.cpp b/sm5/ataprint.cpp
index 09a4d440afbf353dbad7a5f17ef1c495e36820da..8db0f1cf8ffa80ef264df7414198f6d482dcd30d 100644
--- a/sm5/ataprint.cpp
+++ b/sm5/ataprint.cpp
@@ -35,7 +35,7 @@
 #include "knowndrives.h"
 #include "config.h"
 
-const char *ataprint_c_cvsid="$Id: ataprint.cpp,v 1.149 2004/04/02 05:57:40 ballen4705 Exp $"
+const char *ataprint_c_cvsid="$Id: ataprint.cpp,v 1.150 2004/04/10 00:24:14 ballen4705 Exp $"
 ATACMDNAMES_H_CVSID ATACMDS_H_CVSID ATAPRINT_H_CVSID CONFIG_H_CVSID EXTERN_H_CVSID INT64_H_CVSID KNOWNDRIVES_H_CVSID SMARTCTL_H_CVSID UTILITY_H_CVSID;
 
 // for passing global control variables
@@ -924,8 +924,9 @@ int ataPrintSmartErrorlog(struct ata_smart_errorlog *data){
        "\tDC = Device Command Register [HEX]\n"
        "\tER = Error register [HEX]\n"
        "\tST = Status register [HEX]\n"
-       "Timestamp = decimal seconds since the previous disk power-on.\n"
-       "Note: timestamp \"wraps\" after 2^32 msec = 49.710 days.\n\n");
+       "Powered_Up_Time is measured from power on, and printed as\n"
+       "DDd+hh:mm:SS.sss where DD=days, hh=hours, mm=minutes,\n"
+       "SS=sec, and sss=millisec. It \"wraps\" after 49.710 days.\n\n");
   
   // now step through the five error log data structures (table 39 of spec)
   for (k = 4; k >= 0; k-- ) {
@@ -982,8 +983,8 @@ int ataPrintSmartErrorlog(struct ata_smart_errorlog *data){
       }
       pout("\n\n");
       pout("  Commands leading to the command that caused the error were:\n"
-           "  CR FR SC SN CL CH DH DC  Power_Up_Time    Command/Feature_Name\n"
-           "  -- -- -- -- -- -- -- --  ---------------  --------------------\n");
+           "  CR FR SC SN CL CH DH DC   Powered_Up_Time  Command/Feature_Name\n"
+           "  -- -- -- -- -- -- -- --  ----------------  --------------------\n");
       for ( j = 4; j >= 0; j--){
         struct ata_smart_errorlog_command_struct *thiscommand=elog->commands+j;
 
@@ -994,7 +995,7 @@ int ataPrintSmartErrorlog(struct ata_smart_errorlog *data){
 	  // Convert integer milliseconds to a text-format string
 	  MsecToText(thiscommand->timestamp, timestring);
 	  
-          pout("  %02x %02x %02x %02x %02x %02x %02x %02x %16s  %s\n",
+          pout("  %02x %02x %02x %02x %02x %02x %02x %02x  %16s  %s\n",
                (int)thiscommand->commandreg,
                (int)thiscommand->featuresreg,
                (int)thiscommand->sector_count,
diff --git a/sm5/knowndrives.c b/sm5/knowndrives.c
index 1b4c7be4dcf178886062ce4605e5d3f1bc0d92ea..16d15022321a4f6ea0a40dc7c3c3115abbdcbe3a 100644
--- a/sm5/knowndrives.c
+++ b/sm5/knowndrives.c
@@ -26,7 +26,7 @@
 #include "utility.h" // includes <regex.h>
 #include "config.h"
 
-const char *knowndrives_c_cvsid="$Id: knowndrives.c,v 1.98 2004/03/13 15:03:56 chrfranke Exp $"
+const char *knowndrives_c_cvsid="$Id: knowndrives.c,v 1.99 2004/04/10 00:24:14 ballen4705 Exp $"
 ATACMDS_H_CVSID ATAPRINT_H_CVSID CONFIG_H_CVSID EXTERN_H_CVSID INT64_H_CVSID KNOWNDRIVES_H_CVSID UTILITY_H_CVSID;
 
 #define MODEL_STRING_LENGTH                         40
@@ -112,8 +112,10 @@ const unsigned char vendoropts_Hitachi_DK23XX[][2] = {
 const char same_as_minus_F[]="Fixes byte order in some SMART data (same as -F samsung)";
 const char same_as_minus_F2[]="Fixes byte order in some SMART data (same as -F samsung2)";
 
-const char may_need_minus_F_disabled[]="May need -F samsung disabled; see manual for details.";
+const char may_need_minus_F_disabled[] ="May need -F samsung disabled; see manual for details.";
 const char may_need_minus_F2_disabled[]="May need -F samsung2 disabled; see manual for details.";
+const char may_need_minus_F2_enabled[] ="May need -F samsung2 enabled; see manual for details.";
+const char may_need_minus_F_enabled[]  ="May need -F samsung or -F samsung2 enabled; see manual for details.";
 
 /* Special-purpose functions for use in knowndrives[]. */
 void specialpurpose_reverse_samsung(smartmonctrl *con)
@@ -231,9 +233,9 @@ const drivesettings knowndrives[] = {
     specialpurpose_reverse_samsung2,
     same_as_minus_F2
   },
-  { // Any other Samsung disk with *-23 firmware
+  { // Any other Samsung disk with *-23 *-24 firmware
     "^SAMSUNG .*$",
-    ".*-23$",
+    ".*-2[34]$",
     may_need_minus_F2_disabled,
     vendoropts_Samsung_SV4012H,
     specialpurpose_reverse_samsung2,
@@ -279,12 +281,13 @@ const drivesettings knowndrives[] = {
     specialpurpose_reverse_samsung,
     same_as_minus_F
   },
-  { //Samsung SP1604N, tested with FW TM100-23
+  { //Samsung SP1604N, tested with FW TM100-23 and TM100-24
     "^SAMSUNG SP1604N$",
-    ".*",
-    NULL,
+    ".*-2[34]",
+    may_need_minus_F2_disabled,
     vendoropts_Samsung_SV4012H,
-    NULL,NULL
+    specialpurpose_reverse_samsung2,
+    same_as_minus_F2
   },
   { //SAMSUNG SV0322A with FW JK200-35
     "^SAMSUNG SV0322A$",
@@ -297,7 +300,7 @@ const drivesettings knowndrives[] = {
   { // All Samsung drives with '.*-25' firmware
     "^SAMSUNG.*",
     ".*-25$",
-    "May need -F samsung2 enabled; see manual for details.\n",
+    may_need_minus_F2_enabled,
     vendoropts_9_halfminutes,
     NULL, NULL
   },
@@ -312,7 +315,7 @@ const drivesettings knowndrives[] = {
   { // Samsung ALL OTHER DRIVES
     "^SAMSUNG.*",
     ".*",
-    "May need -F samsung or -F samsung2 enabled; see manual for details.\n",
+    may_need_minus_F_enabled,
     NULL, NULL, NULL
   },
   { // Maxtor DiamondMax Plus D740X family
diff --git a/sm5/knowndrives.cpp b/sm5/knowndrives.cpp
index 320b304621003a52950453115d94d41c442d4850..b4834d10b61a3b385fb163710d234b290d648c24 100644
--- a/sm5/knowndrives.cpp
+++ b/sm5/knowndrives.cpp
@@ -26,7 +26,7 @@
 #include "utility.h" // includes <regex.h>
 #include "config.h"
 
-const char *knowndrives_c_cvsid="$Id: knowndrives.cpp,v 1.98 2004/03/13 15:03:56 chrfranke Exp $"
+const char *knowndrives_c_cvsid="$Id: knowndrives.cpp,v 1.99 2004/04/10 00:24:14 ballen4705 Exp $"
 ATACMDS_H_CVSID ATAPRINT_H_CVSID CONFIG_H_CVSID EXTERN_H_CVSID INT64_H_CVSID KNOWNDRIVES_H_CVSID UTILITY_H_CVSID;
 
 #define MODEL_STRING_LENGTH                         40
@@ -112,8 +112,10 @@ const unsigned char vendoropts_Hitachi_DK23XX[][2] = {
 const char same_as_minus_F[]="Fixes byte order in some SMART data (same as -F samsung)";
 const char same_as_minus_F2[]="Fixes byte order in some SMART data (same as -F samsung2)";
 
-const char may_need_minus_F_disabled[]="May need -F samsung disabled; see manual for details.";
+const char may_need_minus_F_disabled[] ="May need -F samsung disabled; see manual for details.";
 const char may_need_minus_F2_disabled[]="May need -F samsung2 disabled; see manual for details.";
+const char may_need_minus_F2_enabled[] ="May need -F samsung2 enabled; see manual for details.";
+const char may_need_minus_F_enabled[]  ="May need -F samsung or -F samsung2 enabled; see manual for details.";
 
 /* Special-purpose functions for use in knowndrives[]. */
 void specialpurpose_reverse_samsung(smartmonctrl *con)
@@ -231,9 +233,9 @@ const drivesettings knowndrives[] = {
     specialpurpose_reverse_samsung2,
     same_as_minus_F2
   },
-  { // Any other Samsung disk with *-23 firmware
+  { // Any other Samsung disk with *-23 *-24 firmware
     "^SAMSUNG .*$",
-    ".*-23$",
+    ".*-2[34]$",
     may_need_minus_F2_disabled,
     vendoropts_Samsung_SV4012H,
     specialpurpose_reverse_samsung2,
@@ -279,12 +281,13 @@ const drivesettings knowndrives[] = {
     specialpurpose_reverse_samsung,
     same_as_minus_F
   },
-  { //Samsung SP1604N, tested with FW TM100-23
+  { //Samsung SP1604N, tested with FW TM100-23 and TM100-24
     "^SAMSUNG SP1604N$",
-    ".*",
-    NULL,
+    ".*-2[34]",
+    may_need_minus_F2_disabled,
     vendoropts_Samsung_SV4012H,
-    NULL,NULL
+    specialpurpose_reverse_samsung2,
+    same_as_minus_F2
   },
   { //SAMSUNG SV0322A with FW JK200-35
     "^SAMSUNG SV0322A$",
@@ -297,7 +300,7 @@ const drivesettings knowndrives[] = {
   { // All Samsung drives with '.*-25' firmware
     "^SAMSUNG.*",
     ".*-25$",
-    "May need -F samsung2 enabled; see manual for details.\n",
+    may_need_minus_F2_enabled,
     vendoropts_9_halfminutes,
     NULL, NULL
   },
@@ -312,7 +315,7 @@ const drivesettings knowndrives[] = {
   { // Samsung ALL OTHER DRIVES
     "^SAMSUNG.*",
     ".*",
-    "May need -F samsung or -F samsung2 enabled; see manual for details.\n",
+    may_need_minus_F_enabled,
     NULL, NULL, NULL
   },
   { // Maxtor DiamondMax Plus D740X family