* Removed '--no-warn-mismatch' option from Makefile. This option
  makes 'ld' to overlook binary objects compatibility.

* Moved $(PLATFORM_LIBS) from the library group (--start-group ...
  --end-group) outside of the group. This will make 'ld' to do
  _multiple_ search in the library group when resolving symbol
  references and do only a _single_ seach in libgcc.a after the group
  search.

* Fix stability problems on CPC45 board again.

* Make image detection for diskboot / usbboot / scsiboot more robust
  (also check header checksum)
diff --git a/common/cmd_scsi.c b/common/cmd_scsi.c
index 2da9ac9..062b1c9 100644
--- a/common/cmd_scsi.c
+++ b/common/cmd_scsi.c
@@ -27,7 +27,6 @@
 /*
  * SCSI support.
  */
-
 #include <common.h>
 #include <command.h>
 #include <asm/processor.h>
@@ -35,15 +34,6 @@
 #include <image.h>
 #include <pci.h>
 
-
-#undef	SCSI_DEBUG
-
-#ifdef	SCSI_DEBUG
-#define	PRINTF(fmt,args...)	printf (fmt ,##args)
-#else
-#define PRINTF(fmt,args...)
-#endif
-
 #if (CONFIG_COMMANDS & CFG_CMD_SCSI)
 
 #ifdef CONFIG_SCSI_SYM53C8XX
@@ -120,7 +110,7 @@
 			scsi_setup_inquiry(pccb);
 			if(scsi_exec(pccb)!=TRUE) {
 				if(pccb->contr_stat==SCSI_SEL_TIME_OUT) {
-					PRINTF("Selection timeout ID %d\n",pccb->target);
+					debug ("Selection timeout ID %d\n",pccb->target);
 					continue; /* selection timeout => assuming no device present */
 				}
 				scsi_print_error(pccb);
@@ -211,8 +201,7 @@
 	char *boot_device = NULL;
 	char *ep;
 	int dev, part = 0;
-	ulong cnt;
-	ulong addr;
+	ulong addr, cnt, checksum;
 	disk_partition_t info;
 	image_header_t *hdr;
 	int rcode = 0;
@@ -270,7 +259,7 @@
 		"Name: %.32s  Type: %.32s\n",
 		dev, part, info.name, info.type);
 
-	PRINTF ("First Block: %ld,  # of blocks: %ld, Block Size: %ld\n",
+	debug ("First Block: %ld,  # of blocks: %ld, Block Size: %ld\n",
 		info.start, info.size, info.blksz);
 
 	if (scsi_read (dev, info.start, 1, (ulong *)addr) != 1) {
@@ -281,17 +270,24 @@
 	hdr = (image_header_t *)addr;
 
 	if (hdr->ih_magic == IH_MAGIC) {
-
-		print_image_hdr (hdr);
-		cnt = (hdr->ih_size + sizeof(image_header_t));
-		cnt += info.blksz - 1;
-		cnt /= info.blksz;
-		cnt -= 1;
-	} else {
 		printf("\n** Bad Magic Number **\n");
 		return 1;
 	}
 
+	checksum = ntohl(hdr->ih_hcrc);
+	hdr->ih_hcrc = 0;
+
+	if (crc32 (0, (char *)hdr, sizeof(image_header_t)) != checksum) {
+		puts ("\n** Bad Header Checksum **\n");
+		return 1;
+	}
+
+	print_image_hdr (hdr);
+	cnt = (hdr->ih_size + sizeof(image_header_t));
+	cnt += info.blksz - 1;
+	cnt /= info.blksz;
+	cnt -= 1;
+
 	if (scsi_read (dev, info.start+1, cnt,
 		      (ulong *)(addr+info.blksz)) != cnt) {
 		printf ("** Read error on %d:%d\n", dev, part);
@@ -359,7 +355,7 @@
 						ok++;
 						if (dev)
 							printf("\n");
-						PRINTF("print_part of %x\n",dev);
+						debug ("print_part of %x\n",dev);
 							print_part(&scsi_dev_desc[dev]);
 					}
 				}
@@ -435,7 +431,7 @@
 	buf_addr=(unsigned long)buffer;
 	start=blknr;
 	blks=blkcnt;
-	PRINTF("\nscsi_read: dev %d startblk %lx, blccnt %lx buffer %lx\n",device,start,blks,(unsigned long)buffer);
+	debug ("\nscsi_read: dev %d startblk %lx, blccnt %lx buffer %lx\n",device,start,blks,(unsigned long)buffer);
 	do {
 		pccb->pdata=(unsigned char *)buf_addr;
 		if(blks>SCSI_MAX_READ_BLK) {
@@ -452,7 +448,7 @@
 			start+=blks;
 			blks=0;
 		}
-		PRINTF("scsi_read_ext: startblk %lx, blccnt %x buffer %lx\n",start,smallblks,buf_addr);
+		debug ("scsi_read_ext: startblk %lx, blccnt %x buffer %lx\n",start,smallblks,buf_addr);
 		if(scsi_exec(pccb)!=TRUE) {
 			scsi_print_error(pccb);
 			blkcnt-=blks;
@@ -460,7 +456,7 @@
 		}
 		buf_addr+=pccb->datalen;
 	} while(blks!=0);
-	PRINTF("scsi_read_ext: end startblk %lx, blccnt %x buffer %lx\n",start,smallblks,buf_addr);
+	debug ("scsi_read_ext: end startblk %lx, blccnt %x buffer %lx\n",start,smallblks,buf_addr);
 	return(blkcnt);
 }
 
@@ -551,7 +547,7 @@
 	pccb->cmd[6]=0;
 	pccb->cmdlen=10;
 	pccb->msgout[0]=SCSI_IDENTIFY; /* NOT USED */
-	PRINTF("scsi_setup_read_ext: cmd: %02X %02X startblk %02X%02X%02X%02X blccnt %02X%02X\n",
+	debug ("scsi_setup_read_ext: cmd: %02X %02X startblk %02X%02X%02X%02X blccnt %02X%02X\n",
 		pccb->cmd[0],pccb->cmd[1],
 		pccb->cmd[2],pccb->cmd[3],pccb->cmd[4],pccb->cmd[5],
 		pccb->cmd[7],pccb->cmd[8]);
@@ -567,7 +563,7 @@
 	pccb->cmd[5]=0;
 	pccb->cmdlen=6;
 	pccb->msgout[0]=SCSI_IDENTIFY; /* NOT USED */
-	PRINTF("scsi_setup_read6: cmd: %02X %02X startblk %02X%02X blccnt %02X\n",
+	debug ("scsi_setup_read6: cmd: %02X %02X startblk %02X%02X blccnt %02X\n",
 		pccb->cmd[0],pccb->cmd[1],
 		pccb->cmd[2],pccb->cmd[3],pccb->cmd[4]);
 }