* 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_usb.c b/common/cmd_usb.c
index 83004b5..3227db9 100644
--- a/common/cmd_usb.c
+++ b/common/cmd_usb.c
@@ -32,13 +32,6 @@
 
 #include <usb.h>
 
-#undef	CMD_USB_DEBUG
-
-#ifdef	CMD_USB_DEBUG
-#define	CMD_USB_PRINTF(fmt,args...)	printf (fmt ,##args)
-#else
-#define CMD_USB_PRINTF(fmt,args...)
-#endif
 static int usb_stor_curr_dev=-1; /* current device */
 
 /* some display routines (info command) */
@@ -317,8 +310,7 @@
 	char *boot_device = NULL;
 	char *ep;
 	int dev, part=0, rcode;
-	ulong cnt;
-	ulong addr;
+	ulong addr, cnt, checksum;
 	disk_partition_t info;
 	image_header_t *hdr;
 	block_dev_desc_t *stor_dev;
@@ -385,7 +377,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 (stor_dev->block_read(dev, info.start, 1, (ulong *)addr) != 1) {
@@ -395,17 +387,26 @@
 
 	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 {
+	if (hdr->ih_magic != IH_MAGIC) {
 		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 (stor_dev->block_read (dev, info.start+1, cnt,
 		      (ulong *)(addr+info.blksz)) != cnt) {
 		printf ("\n** Read error on %d:%d\n", dev, part);