* Patch by Arun Dharankar, 24 Mar 2003:
  - add threads / scheduler example code

* Add patches by Robert Schwebel, 31 Mar 2003:
  - add ctrl-c support for kermit download
  - align bdinfo output on ARM

* Add CPU ID, version, and clock speed for INCA-IP
diff --git a/common/cmd_boot.c b/common/cmd_boot.c
index 1c9a41d..59bab35 100644
--- a/common/cmd_boot.c
+++ b/common/cmd_boot.c
@@ -163,10 +163,10 @@
 		printf ("%c%02X", i ? ':' : ' ', bd->bi_enetaddr[i]);
 	}
 	printf ("\n"
-		"ip_addr       = ");
+		"ip_addr     = ");
 	print_IPaddr (bd->bi_ip_addr);
 	printf ("\n"
-		"baudrate      = %d bps\n", bd->bi_baudrate);
+		"baudrate    = %d bps\n", bd->bi_baudrate);
 
 	return 0;
 }
@@ -575,6 +575,7 @@
 #define XON_CHAR        17
 #define XOFF_CHAR       19
 #define START_CHAR      0x01
+#define ETX_CHAR	0x03
 #define END_CHAR        0x0D
 #define SPACE           0x20
 #define K_ESCAPE        0x23
@@ -995,8 +996,18 @@
 #endif
 
 		/* get a packet */
-		/* wait for the starting character */
-		while (serial_getc () != START_CHAR);
+		/* wait for the starting character or ^C */
+		for (;;) {
+			switch (serial_getc ()) {
+			case START_CHAR:	/* start packet */
+				break;
+			case ETX_CHAR:		/* ^C waiting for packet */
+				return (0);
+			default:
+				;
+			}
+		}
+			
 		/* get length of packet */
 		sum = 0;
 		new_char = serial_getc ();
diff --git a/common/cmd_nand.c b/common/cmd_nand.c
index e933120..a041b29 100644
--- a/common/cmd_nand.c
+++ b/common/cmd_nand.c
@@ -1266,6 +1266,7 @@
 {
 	unsigned long nandptr;
 	struct Nand *mychip;
+	int ret = 0;
 
 	if (ofs & (nand->erasesize-1) || len & (nand->erasesize-1)) {
 		printf ("Offset and size must be sector aligned, erasesize = %d\n",
@@ -1275,6 +1276,17 @@
 
 	nandptr = nand->IO_ADDR;
 
+	/* Select the NAND device */
+	NAND_ENABLE_CE(nand);  /* set pin low */
+
+	/* Check the WP bit */
+	NanD_Command(nand, NAND_CMD_STATUS);
+	if (!(READ_NAND(nand->IO_ADDR) & 0x80)) {
+		printf ("nand_write_ecc: Device is write protected!!!\n");
+		ret = -1;
+		goto out;
+	}
+
 	/* FIXME: Do nand in the background. Use timers or schedule_task() */
 	while(len) {
 		mychip = &nand->chips[shr(ofs, nand->chipshift)];
@@ -1288,20 +1300,22 @@
 		if (READ_NAND(nandptr) & 1) {
 			printf("Error erasing at 0x%lx\n", (long)ofs);
 			/* There was an error */
-			goto callback;
+			ret = -1;
+			goto out;
 		}
 		ofs += nand->erasesize;
 		len -= nand->erasesize;
 	}
 
- callback:
-	return 0;
+out:
+	/* De-select the NAND device */
+	NAND_DISABLE_CE(nand);  /* set pin high */
+
+	return ret;
 }
 
 static inline int nandcheck(unsigned long potential, unsigned long physadr)
 {
-
-
 	return 0;
 }