From 476eace31e6877bd56125bddfe88b206652011dd Mon Sep 17 00:00:00 2001
From: ballen4705 <ballen4705@4ea69e1a-61f1-4043-bf83-b5c94c648137>
Date: Sat, 26 Oct 2002 11:44:01 +0000
Subject: [PATCH] Made the driveid integrity word ALWAYS correctly referenced,
 regardless of which version of the driveid definition you have. Ugly, but
 functional.

git-svn-id: https://smartmontools.svn.sourceforge.net/svnroot/smartmontools/trunk@142 4ea69e1a-61f1-4043-bf83-b5c94c648137
---
 sm5/atacmds.c   | 19 +++++++++----------
 sm5/atacmds.cpp | 19 +++++++++----------
 2 files changed, 18 insertions(+), 20 deletions(-)

diff --git a/sm5/atacmds.c b/sm5/atacmds.c
index 7de7c9b9b..778c4d674 100644
--- a/sm5/atacmds.c
+++ b/sm5/atacmds.c
@@ -29,7 +29,7 @@
 #include <errno.h>
 #include "atacmds.h"
 
-const char *CVSid1="$Id: atacmds.c,v 1.26 2002/10/26 11:32:33 ballen4705 Exp $" CVSID1;
+const char *CVSid1="$Id: atacmds.c,v 1.27 2002/10/26 11:44:01 ballen4705 Exp $" CVSID1;
 
 // These Drive Identity tables are taken from hdparm 5.2, and are also
 // given in the ATA/ATAPI specs for the IDENTIFY DEVICE command.  Note
@@ -157,34 +157,33 @@ int ataReadHDIdentity (int device, struct hd_driveid *buf){
   // copy data into driveid structure
   memcpy(buf,parms+HDIO_DRIVE_CMD_HDR_SIZE,sizeof(*buf));
   
-  // Note -- the declaration that appears in
-  // /usr/include/linux/hdreg.h: short words160_255[95], is WRONG.
-  // It should say: short words160_255[96]. I have written to Andre
-  // Hedrick about this on Oct 17 2002.  Please remove this comment
-  // once the fix has made it into the stock kernel tree.
-
 #if 0
   // The following ifdef is a HACK to distinguish different versions
   // of the header file defining hd_driveid
 #ifdef CFA_REQ_EXT_ERROR_CODE
   driveidchecksum=buf->integrity_word;
 #else
+  // Note -- the declaration that appears in
+  // /usr/include/linux/hdreg.h: short words160_255[95], is WRONG.
+  // It should say: short words160_255[96]. I have written to Andre
+  // Hedrick about this on Oct 17 2002.  Please remove this comment
+  // once the fix has made it into the stock kernel tree.
   driveidchecksum=buf->words160_255[95];
 #endif
 #else
   // This way is ugly and you may feel ill -- but it always works...
   {
     unsigned short *rawstructure=
-      (unsigned short *)(parms+HDIO_DRIVE_CMD_HDR_SIZE);
+      (unsigned short *)buf;
     driveidchecksum=rawstructure[255];
   }
 #endif
-
+  
   if ((driveidchecksum & 0x00ff) == 0x00a5){
     // Device identity structure contains a checksum
     unsigned char cksum=0;
     int i;
-
+    
     for (i=0;i<sizeof(*buf);i++)
       cksum+=parms[i+HDIO_DRIVE_CMD_HDR_SIZE];
     
diff --git a/sm5/atacmds.cpp b/sm5/atacmds.cpp
index f1c672b72..54d72c496 100644
--- a/sm5/atacmds.cpp
+++ b/sm5/atacmds.cpp
@@ -29,7 +29,7 @@
 #include <errno.h>
 #include "atacmds.h"
 
-const char *CVSid1="$Id: atacmds.cpp,v 1.26 2002/10/26 11:32:33 ballen4705 Exp $" CVSID1;
+const char *CVSid1="$Id: atacmds.cpp,v 1.27 2002/10/26 11:44:01 ballen4705 Exp $" CVSID1;
 
 // These Drive Identity tables are taken from hdparm 5.2, and are also
 // given in the ATA/ATAPI specs for the IDENTIFY DEVICE command.  Note
@@ -157,34 +157,33 @@ int ataReadHDIdentity (int device, struct hd_driveid *buf){
   // copy data into driveid structure
   memcpy(buf,parms+HDIO_DRIVE_CMD_HDR_SIZE,sizeof(*buf));
   
-  // Note -- the declaration that appears in
-  // /usr/include/linux/hdreg.h: short words160_255[95], is WRONG.
-  // It should say: short words160_255[96]. I have written to Andre
-  // Hedrick about this on Oct 17 2002.  Please remove this comment
-  // once the fix has made it into the stock kernel tree.
-
 #if 0
   // The following ifdef is a HACK to distinguish different versions
   // of the header file defining hd_driveid
 #ifdef CFA_REQ_EXT_ERROR_CODE
   driveidchecksum=buf->integrity_word;
 #else
+  // Note -- the declaration that appears in
+  // /usr/include/linux/hdreg.h: short words160_255[95], is WRONG.
+  // It should say: short words160_255[96]. I have written to Andre
+  // Hedrick about this on Oct 17 2002.  Please remove this comment
+  // once the fix has made it into the stock kernel tree.
   driveidchecksum=buf->words160_255[95];
 #endif
 #else
   // This way is ugly and you may feel ill -- but it always works...
   {
     unsigned short *rawstructure=
-      (unsigned short *)(parms+HDIO_DRIVE_CMD_HDR_SIZE);
+      (unsigned short *)buf;
     driveidchecksum=rawstructure[255];
   }
 #endif
-
+  
   if ((driveidchecksum & 0x00ff) == 0x00a5){
     // Device identity structure contains a checksum
     unsigned char cksum=0;
     int i;
-
+    
     for (i=0;i<sizeof(*buf);i++)
       cksum+=parms[i+HDIO_DRIVE_CMD_HDR_SIZE];
     
-- 
GitLab