Date: Mon, 1 Dec 1997 13:13:16 GMT
From: Roman Hodek <rnhodek@faui22c.informatik.uni-erlangen.de>
To: linux-m68k@lists.linux-m68k.org
Subject: Re: L68K: New Version of nvram patch
Sender: owner-linux-m68k@phil.uni-sb.de


Below is the latest nvram diff by Stefan Reinauer, the one that adds
support for a checksum over the second half of NV-RAM.

This time as add-on to the last patch, without CRs and not
base64-coded :-)

Roman

------------------------------------------------------------------------------
--- nvram.c.11	Mon Dec  1 13:05:27 1997
+++ nvram.c	Mon Dec  1 13:05:56 1997
@@ -29,7 +29,7 @@
  *
  */
 
-#define NVRAM_VERSION		"1.1"
+#define NVRAM_VERSION		"1.2"
 
 #include <linux/module.h>
 #include <linux/config.h>
@@ -56,6 +56,10 @@
 #define PC_CKS_RANGE_END	31
 #define PC_CKS_LOC			32
 
+#define PC_CKS_EXT_RANGE_START	50
+#define PC_CKS_EXT_RANGE_END	110
+#define PC_CKS_EXT_LOC			111
+
 #define	mach_check_checksum	pc_check_checksum
 #define	mach_set_checksum	pc_set_checksum
 #define	mach_proc_infos		pc_proc_infos
@@ -454,11 +458,24 @@
 static int pc_check_checksum( void )
 {
 	int i;
-	unsigned short sum = 0;
+	unsigned short sum = 0, ext_sum = 0;
 	
 	for( i = PC_CKS_RANGE_START; i <= PC_CKS_RANGE_END; ++i )
 		sum += nvram_read_int( i );
-	return( (sum & 0xffff) ==
+
+        if ( nvram_bytes == 114 ) {
+	  for( i = PC_CKS_EXT_RANGE_START; i <= PC_CKS_EXT_RANGE_END; ++i )
+		ext_sum += nvram_read_int( i );
+
+	  return( (sum & 0xffff) ==
+			  ((nvram_read_int(PC_CKS_LOC) << 8) |
+			   nvram_read_int(PC_CKS_LOC+1)) &&
+		  (ext_sum & 0xffff) ==
+			  ((nvram_read_int(PC_CKS_EXT_LOC) << 8) |
+			   nvram_read_int(PC_CKS_EXT_LOC+1)) );
+	}
+	else
+	  return( (sum & 0xffff) ==
 			((nvram_read_int(PC_CKS_LOC) << 8) |
 			 nvram_read_int(PC_CKS_LOC+1)) );
 }
@@ -466,12 +483,19 @@
 static void pc_set_checksum( void )
 {
 	int i;
-	unsigned short sum = 0;
+	unsigned short sum = 0, ext_sum = 0;
 	
 	for( i = PC_CKS_RANGE_START; i <= PC_CKS_RANGE_END; ++i )
 		sum += nvram_read_int( i );
 	nvram_write_int( sum >> 8, PC_CKS_LOC );
 	nvram_write_int( sum & 0xff, PC_CKS_LOC+1 );
+
+        if ( nvram_bytes == 114 ) {
+	  for( i = PC_CKS_EXT_RANGE_START; i <= PC_CKS_EXT_RANGE_END; ++i )
+		ext_sum += nvram_read_int( i );
+	  nvram_write_int( sum >> 8, PC_CKS_EXT_LOC );
+	  nvram_write_int( sum & 0xff, PC_CKS_EXT_LOC+1 );
+	}
 }
 
 #ifdef CONFIG_PROC_FS
