diff --git a/common/xyzModem.c b/common/xyzModem.c
index 3c86b13..4a137bf 100644
--- a/common/xyzModem.c
+++ b/common/xyzModem.c
@@ -1,65 +1,67 @@
-//==========================================================================
-//
-//      xyzModem.c
-//
-//      RedBoot stream handler for xyzModem protocol
-//
-//==========================================================================
-//####ECOSGPLCOPYRIGHTBEGIN####
-// -------------------------------------------
-// This file is part of eCos, the Embedded Configurable Operating System.
-// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
-// Copyright (C) 2002 Gary Thomas
-//
-// eCos is free software; you can redistribute it and/or modify it under
-// the terms of the GNU General Public License as published by the Free
-// Software Foundation; either version 2 or (at your option) any later version.
-//
-// eCos is distributed in the hope that it will be useful, but WITHOUT ANY
-// WARRANTY; without even the implied warranty of MERCHANTABILITY or
-// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
-// for more details.
-//
-// You should have received a copy of the GNU General Public License along
-// with eCos; if not, write to the Free Software Foundation, Inc.,
-// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
-//
-// As a special exception, if other files instantiate templates or use macros
-// or inline functions from this file, or you compile this file and link it
-// with other works to produce a work based on this file, this file does not
-// by itself cause the resulting work to be covered by the GNU General Public
-// License. However the source code for this file must still be made available
-// in accordance with section (3) of the GNU General Public License.
-//
-// This exception does not invalidate any other reasons why a work based on
-// this file might be covered by the GNU General Public License.
-//
-// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
-// at http://sources.redhat.com/ecos/ecos-license/
-// -------------------------------------------
-//####ECOSGPLCOPYRIGHTEND####
-//==========================================================================
-//#####DESCRIPTIONBEGIN####
-//
-// Author(s):    gthomas
-// Contributors: gthomas, tsmith, Yoshinori Sato
-// Date:         2000-07-14
-// Purpose:      
-// Description:  
-//              
-// This code is part of RedBoot (tm).
-//
-//####DESCRIPTIONEND####
-//
-//==========================================================================
+/*
+ *==========================================================================
+ *
+ *      xyzModem.c
+ *
+ *      RedBoot stream handler for xyzModem protocol
+ *
+ *==========================================================================
+ *####ECOSGPLCOPYRIGHTBEGIN####
+ * -------------------------------------------
+ * This file is part of eCos, the Embedded Configurable Operating System.
+ * Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
+ * Copyright (C) 2002 Gary Thomas
+ *
+ * eCos is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 or (at your option) any later version.
+ *
+ * eCos is distributed in the hope that it will be useful, but WITHOUT ANY
+ * WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with eCos; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ *
+ * As a special exception, if other files instantiate templates or use macros
+ * or inline functions from this file, or you compile this file and link it
+ * with other works to produce a work based on this file, this file does not
+ * by itself cause the resulting work to be covered by the GNU General Public
+ * License. However the source code for this file must still be made available
+ * in accordance with section (3) of the GNU General Public License.
+ *
+ * This exception does not invalidate any other reasons why a work based on
+ * this file might be covered by the GNU General Public License.
+ *
+ * Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
+ * at http: *sources.redhat.com/ecos/ecos-license/
+ * -------------------------------------------
+ *####ECOSGPLCOPYRIGHTEND####
+ *==========================================================================
+ *#####DESCRIPTIONBEGIN####
+ *
+ * Author(s):    gthomas
+ * Contributors: gthomas, tsmith, Yoshinori Sato
+ * Date:         2000-07-14
+ * Purpose:
+ * Description:
+ *
+ * This code is part of RedBoot (tm).
+ *
+ *####DESCRIPTIONEND####
+ *
+ *==========================================================================
+ */
 #include <common.h>
 #include <xyzModem.h>
 #include <stdarg.h>
 #include <crc.h>
 
-// Assumption - run xyzModem protocol over the console port
+/* Assumption - run xyzModem protocol over the console port */
 
-// Values magic to the protocol
+/* Values magic to the protocol */
 #define SOH 0x01
 #define STX 0x02
 #define EOT 0x04
@@ -67,11 +69,11 @@
 #define BSP 0x08
 #define NAK 0x15
 #define CAN 0x18
-#define EOF 0x1A  // ^Z for DOS officionados
+#define EOF 0x1A  /* ^Z for DOS officionados */
 
 #define USE_YMODEM_LENGTH
 
-// Data & state local to the protocol
+/* Data & state local to the protocol */
 static struct {
 #ifdef REDBOOT
     hal_virtual_comm_table_t* __chan;
@@ -80,7 +82,7 @@
 #endif
     unsigned char pkt[1024], *bufp;
     unsigned char blk,cblk,crc1,crc2;
-    unsigned char next_blk;  // Expected block
+    unsigned char next_blk;  /* Expected block */
     int len, mode, total_retries;
     int total_SOH, total_STX, total_CAN;
     bool crc_mode, at_eof, tx_ack;
@@ -89,13 +91,13 @@
 #endif
 } xyz;
 
-#define xyzModem_CHAR_TIMEOUT            2000  // 2 seconds
+#define xyzModem_CHAR_TIMEOUT            2000  /* 2 seconds */
 #define xyzModem_MAX_RETRIES             20
 #define xyzModem_MAX_RETRIES_WITH_CRC    10
-#define xyzModem_CAN_COUNT                3    // Wait for 3 CAN before quitting
+#define xyzModem_CAN_COUNT                3    /* Wait for 3 CAN before quitting */
 
 
-#ifndef REDBOOT  //SB
+#ifndef REDBOOT  /*SB */
 typedef int cyg_int32;
 int CYGACC_COMM_IF_GETC_TIMEOUT (char chan,char *c) {
 #define DELAY 20
@@ -115,7 +117,7 @@
 	putc(y);
 }
 
-// Validate a hex character
+/* Validate a hex character */
 __inline__ static bool
 _is_hex(char c)
 {
@@ -124,7 +126,7 @@
             ((c >= 'a') && (c <= 'f')));
 }
 
-// Convert a single hex nibble
+/* Convert a single hex nibble */
 __inline__ static int
 _from_hex(char c)
 {
@@ -140,7 +142,7 @@
     return ret;
 }
 
-// Convert a character to lower case
+/* Convert a character to lower case */
 __inline__ static char
 _tolower(char c)
 {
@@ -150,11 +152,7 @@
     return c;
 }
 
-
-
-//
-// Parse (scan) a number
-//
+/* Parse (scan) a number */
 bool
 parse_num(char *s, unsigned long *val, char **es, char *delim)
 {
@@ -173,10 +171,10 @@
         first = false;
         c = *s++;
         if (_is_hex(c) && ((digit = _from_hex(c)) < radix)) {
-            // Valid digit
+            /* Valid digit */
 #ifdef CYGPKG_HAL_MIPS
-            // FIXME: tx49 compiler generates 0x2539018 for MUL which
-            // isn't any good.
+            /* FIXME: tx49 compiler generates 0x2539018 for MUL which */
+            /* isn't any good. */
             if (16 == radix)
                 result = result << 4;
             else
@@ -187,12 +185,12 @@
 #endif
         } else {
             if (delim != (char *)0) {
-                // See if this character is one of the delimiters
+                /* See if this character is one of the delimiters */
                 char *dp = delim;
                 while (*dp && (c != *dp)) dp++;
-                if (*dp) break;  // Found a good delimiter
+                if (*dp) break;  /* Found a good delimiter */
             }
-            return false;  // Malformatted number
+            return false;  /* Malformatted number */
         }
     }
     *val = result;
@@ -207,11 +205,11 @@
 #define USE_SPRINTF
 #ifdef DEBUG
 #ifndef USE_SPRINTF
-//
-// Note: this debug setup only works if the target platform has two serial ports
-// available so that the other one (currently only port 1) can be used for debug
-// messages.
-//
+/*
+ * Note: this debug setup only works if the target platform has two serial ports
+ * available so that the other one (currently only port 1) can be used for debug
+ * messages.
+ */
 static int
 zm_dprintf(char *fmt, ...)
 {
@@ -235,9 +233,9 @@
 }
 
 #else
-//
-// Note: this debug setup works by storing the strings in a fixed buffer
-//
+/*
+ * Note: this debug setup works by storing the strings in a fixed buffer
+ */
 #define FINAL
 #ifdef FINAL
 static char *zm_out = (char *)0x00380000;
@@ -308,7 +306,7 @@
 #define ZM_DEBUG(x)
 #endif
 
-// Wait for the line to go idle
+/* Wait for the line to go idle */
 static void
 xyzModem_flush(void)
 {
@@ -330,7 +328,7 @@
     unsigned short cksum;
 
     ZM_DEBUG(zm_new());
-    // Find the start of a header
+    /* Find the start of a header */
     can_total = 0;
     hdr_chars = 0;
 
@@ -356,11 +354,11 @@
                 if (++can_total == xyzModem_CAN_COUNT) {
                     return xyzModem_cancel;
                 } else {
-                    // Wait for multiple CAN to avoid early quits
+                    /* Wait for multiple CAN to avoid early quits */
                     break;
                 }
             case EOT:
-                // EOT only supported if no noise
+                /* EOT only supported if no noise */
                 if (hdr_chars == 1) {
                     CYGACC_COMM_IF_PUTC(*xyz.__chan, ACK);
                     ZM_DEBUG(zm_dprintf("ACK on EOT #%d\n", __LINE__));
@@ -368,19 +366,19 @@
                     return xyzModem_eof;
                 }
             default:
-                // Ignore, waiting for start of header
+                /* Ignore, waiting for start of header */
                 ;
             }
         } else {
-            // Data stream timed out
-            xyzModem_flush();  // Toss any current input
+            /* Data stream timed out */
+            xyzModem_flush();  /* Toss any current input */
             ZM_DEBUG(zm_dump(__LINE__));
             CYGACC_CALL_IF_DELAY_US((cyg_int32)250000);
             return xyzModem_timeout;
         }
     }
 
-    // Header found, now read the data
+    /* Header found, now read the data */
     res = CYGACC_COMM_IF_GETC_TIMEOUT(*xyz.__chan, &xyz.blk);
     ZM_DEBUG(zm_save(xyz.blk));
     if (!res) {
@@ -420,18 +418,18 @@
         }
     }
     ZM_DEBUG(zm_dump(__LINE__));
-    // Validate the message
+    /* Validate the message */
     if ((xyz.blk ^ xyz.cblk) != (unsigned char)0xFF) {
         ZM_DEBUG(zm_dprintf("Framing error - blk: %x/%x/%x\n", xyz.blk, xyz.cblk, (xyz.blk ^ xyz.cblk)));
         ZM_DEBUG(zm_dump_buf(xyz.pkt, xyz.len));
         xyzModem_flush();
         return xyzModem_frame;
     }
-    // Verify checksum/CRC
+    /* Verify checksum/CRC */
     if (xyz.crc_mode) {
         cksum = cyg_crc16(xyz.pkt, xyz.len);
         if (cksum != ((xyz.crc1 << 8) | xyz.crc2)) {
-            ZM_DEBUG(zm_dprintf("CRC error - recvd: %02x%02x, computed: %x\n", 
+            ZM_DEBUG(zm_dprintf("CRC error - recvd: %02x%02x, computed: %x\n",
                                 xyz.crc1, xyz.crc2, cksum & 0xFFFF));
             return xyzModem_cksum;
         }
@@ -445,18 +443,18 @@
             return xyzModem_cksum;
         }
     }
-    // If we get here, the message passes [structural] muster
+    /* If we get here, the message passes [structural] muster */
     return 0;
 }
 
-int 
+int
 xyzModem_stream_open(connection_info_t *info, int *err)
 {
     int console_chan, stat=0;
     int retries = xyzModem_MAX_RETRIES;
     int crc_retries = xyzModem_MAX_RETRIES_WITH_CRC;
 
-//    ZM_DEBUG(zm_out = zm_out_start);
+/*    ZM_DEBUG(zm_out = zm_out_start); */
 #ifdef xyzModem_zmodem
     if (info->mode == xyzModem_zmodem) {
         *err = xyzModem_noZmodem;
@@ -465,7 +463,7 @@
 #endif
 
 #ifdef REDBOOT
-    // Set up the I/O channel.  Note: this allows for using a different port in the future
+    /* Set up the I/O channel.  Note: this allows for using a different port in the future */
     console_chan = CYGACC_CALL_IF_SET_CONSOLE_COMM(CYGNUM_CALL_IF_SET_COMM_ID_QUERY_CURRENT);
     if (info->chan >= 0) {
         CYGACC_CALL_IF_SET_CONSOLE_COMM(info->chan);
@@ -477,9 +475,9 @@
     CYGACC_CALL_IF_SET_CONSOLE_COMM(console_chan);
     CYGACC_COMM_IF_CONTROL(*xyz.__chan, __COMMCTL_SET_TIMEOUT, xyzModem_CHAR_TIMEOUT);
 #else
-// TODO: CHECK !
+/* TODO: CHECK ! */
     int dummy;
-    xyz.__chan=&dummy; 
+    xyz.__chan=&dummy;
 #endif
     xyz.len = 0;
     xyz.crc_mode = true;
@@ -494,11 +492,11 @@
     xyz.read_length = 0;
     xyz.file_length = 0;
 #endif
-    
+
     CYGACC_COMM_IF_PUTC(*xyz.__chan, (xyz.crc_mode ? 'C' : NAK));
 
     if (xyz.mode == xyzModem_xmodem) {
-	    // X-modem doesn't have an information header - exit here
+	    /* X-modem doesn't have an information header - exit here */
             xyz.next_blk = 1;
             return 0;
     }
@@ -506,24 +504,24 @@
     while (retries-- > 0) {
         stat = xyzModem_get_hdr();
         if (stat == 0) {
-            // Y-modem file information header
+            /* Y-modem file information header */
             if (xyz.blk == 0) {
 #ifdef USE_YMODEM_LENGTH
-                // skip filename
+                /* skip filename */
                 while (*xyz.bufp++);
-                // get the length
+                /* get the length */
                 parse_num(xyz.bufp, &xyz.file_length, NULL, " ");
 #endif
-                // The rest of the file name data block quietly discarded
+                /* The rest of the file name data block quietly discarded */
                 xyz.tx_ack = true;
             }
             xyz.next_blk = 1;
             xyz.len = 0;
             return 0;
-        } else 
+        } else
         if (stat == xyzModem_timeout) {
             if (--crc_retries <= 0) xyz.crc_mode = false;
-            CYGACC_CALL_IF_DELAY_US(5*100000);   // Extra delay for startup
+            CYGACC_CALL_IF_DELAY_US(5*100000);   /* Extra delay for startup */
             CYGACC_COMM_IF_PUTC(*xyz.__chan, (xyz.crc_mode ? 'C' : NAK));
             xyz.total_retries++;
             ZM_DEBUG(zm_dprintf("NAK (%d)\n", __LINE__));
@@ -537,7 +535,7 @@
     return -1;
 }
 
-int 
+int
 xyzModem_stream_read(char *buf, int size, int *err)
 {
     int stat, total, len;
@@ -545,7 +543,7 @@
 
     total = 0;
     stat = xyzModem_cancel;
-    // Try and get 'size' bytes into the buffer
+    /* Try and get 'size' bytes into the buffer */
     while (!xyz.at_eof && (size > 0)) {
         if (xyz.len == 0) {
             retries = xyzModem_MAX_RETRIES;
@@ -562,8 +560,8 @@
 #else
                         if (1) {
 #endif
-                            // Data blocks can be padded with ^Z (EOF) characters
-                            // This code tries to detect and remove them
+                            /* Data blocks can be padded with ^Z (EOF) characters */
+                            /* This code tries to detect and remove them */
                             if ((xyz.bufp[xyz.len-1] == EOF) &&
                                 (xyz.bufp[xyz.len-2] == EOF) &&
                                 (xyz.bufp[xyz.len-3] == EOF)) {
@@ -574,10 +572,12 @@
                         }
 
 #ifdef USE_YMODEM_LENGTH
-                        // See if accumulated length exceeds that of the file.
-                        // If so, reduce size (i.e., cut out pad bytes)
-                        // Only do this for Y-modem (and Z-modem should it ever
-                        // be supported since it can fall back to Y-modem mode).
+			/*
+                         * See if accumulated length exceeds that of the file.
+                         * If so, reduce size (i.e., cut out pad bytes)
+                         * Only do this for Y-modem (and Z-modem should it ever
+                         * be supported since it can fall back to Y-modem mode).
+			 */
                         if (xyz.mode != xyzModem_xmodem && 0 != xyz.file_length) {
                             xyz.read_length += xyz.len;
                             if (xyz.read_length > xyz.file_length) {
@@ -587,9 +587,9 @@
 #endif
                         break;
                     } else if (xyz.blk == ((xyz.next_blk - 1) & 0xFF)) {
-                        // Just re-ACK this so sender will get on with it
+                        /* Just re-ACK this so sender will get on with it */
                         CYGACC_COMM_IF_PUTC(*xyz.__chan, ACK);
-                        continue;  // Need new header
+                        continue;  /* Need new header */
                     } else {
                         stat = xyzModem_sequence;
                     }
@@ -604,7 +604,7 @@
                         CYGACC_COMM_IF_PUTC(*xyz.__chan, (xyz.crc_mode ? 'C' : NAK));
                         xyz.total_retries++;
                         ZM_DEBUG(zm_dprintf("Reading Final Header\n"));
-                        stat = xyzModem_get_hdr();                        
+                        stat = xyzModem_get_hdr();
                         CYGACC_COMM_IF_PUTC(*xyz.__chan, ACK);
                         ZM_DEBUG(zm_dprintf("FINAL ACK (%d)\n", __LINE__));
                     }
@@ -621,7 +621,7 @@
                 return total;
             }
         }
-        // Don't "read" data from the EOF protocol package
+        /* Don't "read" data from the EOF protocol package */
         if (!xyz.at_eof) {
             len = xyz.len;
             if (size < len) len = size;
@@ -639,15 +639,15 @@
 void
 xyzModem_stream_close(int *err)
 {
-    diag_printf("xyzModem - %s mode, %d(SOH)/%d(STX)/%d(CAN) packets, %d retries\n", 
+    diag_printf("xyzModem - %s mode, %d(SOH)/%d(STX)/%d(CAN) packets, %d retries\n",
                 xyz.crc_mode ? "CRC" : "Cksum",
                 xyz.total_SOH, xyz.total_STX, xyz.total_CAN,
                 xyz.total_retries);
     ZM_DEBUG(zm_flush());
 }
 
-// Need to be able to clean out the input buffer, so have to take the
-// getc
+/* Need to be able to clean out the input buffer, so have to take the */
+/* getc */
 void xyzModem_stream_terminate(bool abort, int (*getc)(void))
 {
   int c;
@@ -657,8 +657,8 @@
       switch (xyz.mode) {
 	case xyzModem_xmodem:
 	case xyzModem_ymodem:
-	  // The X/YMODEM Spec seems to suggest that multiple CAN followed by an equal
-	  // number of Backspaces is a friendly way to get the other end to abort.
+	  /* The X/YMODEM Spec seems to suggest that multiple CAN followed by an equal */
+	  /* number of Backspaces is a friendly way to get the other end to abort. */
 	  CYGACC_COMM_IF_PUTC(*xyz.__chan,CAN);
 	  CYGACC_COMM_IF_PUTC(*xyz.__chan,CAN);
 	  CYGACC_COMM_IF_PUTC(*xyz.__chan,CAN);
@@ -667,29 +667,33 @@
 	  CYGACC_COMM_IF_PUTC(*xyz.__chan,BSP);
 	  CYGACC_COMM_IF_PUTC(*xyz.__chan,BSP);
 	  CYGACC_COMM_IF_PUTC(*xyz.__chan,BSP);
-	  // Now consume the rest of what's waiting on the line.
+	  /* Now consume the rest of what's waiting on the line. */
 	  ZM_DEBUG(zm_dprintf("Flushing serial line.\n"));
 	  xyzModem_flush();
           xyz.at_eof = true;
 	break;
 #ifdef xyzModem_zmodem
 	case xyzModem_zmodem:
-	  // Might support it some day I suppose.
+	  /* Might support it some day I suppose. */
 #endif
 	break;
       }
   } else {
       ZM_DEBUG(zm_dprintf("Engaging cleanup mode...\n"));
-      // Consume any trailing crap left in the inbuffer from
-      // previous recieved blocks. Since very few files are an exact multiple
-      // of the transfer block size, there will almost always be some gunk here.
-      // If we don't eat it now, RedBoot will think the user typed it.
+      /*
+       * Consume any trailing crap left in the inbuffer from
+       * previous recieved blocks. Since very few files are an exact multiple
+       * of the transfer block size, there will almost always be some gunk here.
+       * If we don't eat it now, RedBoot will think the user typed it.
+       */
       ZM_DEBUG(zm_dprintf("Trailing gunk:\n"));
       while ((c = (*getc)()) > -1) ;
       ZM_DEBUG(zm_dprintf("\n"));
-      // Make a small delay to give terminal programs like minicom
-      // time to get control again after their file transfer program
-      // exits.
+      /*
+       * Make a small delay to give terminal programs like minicom
+       * time to get control again after their file transfer program
+       * exits.
+       */
       CYGACC_CALL_IF_DELAY_US((cyg_int32)250000);
   }
 }
@@ -728,12 +732,12 @@
     }
 }
 
-//
-// RedBoot interface
-//
-#if 0 // SB
+/*
+ * RedBoot interface
+ */
+#if 0 /* SB */
 GETC_IO_FUNCS(xyzModem_io, xyzModem_stream_open, xyzModem_stream_close,
               xyzModem_stream_terminate, xyzModem_stream_read, xyzModem_error);
 RedBoot_load(xmodem, xyzModem_io, false, false, xyzModem_xmodem);
 RedBoot_load(ymodem, xyzModem_io, false, false, xyzModem_ymodem);
-#endif 
+#endif
