diff --git a/common/xyzModem.c b/common/xyzModem.c
index 56f4bcaf99453d04bac277b39a63688ed6836263..5656aac48fb1b688a10247adf572444392779194 100644
--- a/common/xyzModem.c
+++ b/common/xyzModem.c
@@ -446,7 +446,7 @@ xyzModem_get_hdr (void)
   /* Verify checksum/CRC */
   if (xyz.crc_mode)
     {
-      cksum = cyg_crc16 (xyz.pkt, xyz.len);
+      cksum = crc16_ccitt(0, xyz.pkt, xyz.len);
       if (cksum != ((xyz.crc1 << 8) | xyz.crc2))
 	{
 	  ZM_DEBUG (zm_dprintf ("CRC error - recvd: %02x%02x, computed: %x\n",
diff --git a/drivers/mmc/mmc_spi.c b/drivers/mmc/mmc_spi.c
index 9032a73d7834754cb5d7a9e9f0a2ecbb7edce7df..7547e1aef88c1bdee9937471e8e217a4b87793c7 100644
--- a/drivers/mmc/mmc_spi.c
+++ b/drivers/mmc/mmc_spi.c
@@ -91,7 +91,7 @@ static uint mmc_spi_readdata(struct mmc *mmc, void *xbuf,
 			spi_xfer(spi, bsize * 8, NULL, buf, 0);
 			spi_xfer(spi, 2 * 8, NULL, &crc, 0);
 #ifdef CONFIG_MMC_SPI_CRC_ON
-			if (be_to_cpu16(cyg_crc16(buf, bsize)) != crc) {
+			if (be_to_cpu16(crc16_ccitt(0, buf, bsize)) != crc) {
 				debug("%s: CRC error\n", mmc->cfg->name);
 				r1 = R1_SPI_COM_CRC;
 				break;
@@ -120,7 +120,7 @@ static uint mmc_spi_writedata(struct mmc *mmc, const void *xbuf,
 	tok[1] = multi ? SPI_TOKEN_MULTI_WRITE : SPI_TOKEN_SINGLE;
 	while (bcnt--) {
 #ifdef CONFIG_MMC_SPI_CRC_ON
-		crc = cpu_to_be16(cyg_crc16((u8 *)buf, bsize));
+		crc = cpu_to_be16(crc16_ccitt(0, (u8 *)buf, bsize));
 #endif
 		spi_xfer(spi, 2 * 8, tok, NULL, 0);
 		spi_xfer(spi, bsize * 8, buf, NULL, 0);
diff --git a/include/crc.h b/include/crc.h
index 5085d4ed477919c0f01390742c7b5b23892e9894..b0031b20ab2e608eb49c0d3ff72be8f82f677e82 100644
--- a/include/crc.h
+++ b/include/crc.h
@@ -62,8 +62,8 @@ cyg_ether_crc32(unsigned char *s, int len);
 extern uint32_t
 cyg_ether_crc32_accumulate(uint32_t crc, unsigned char *s, int len);
 
-/* 16 bit CRC with polynomial x^16+x^12+x^5+1 */
+/* 16 bit CRC with polynomial x^16+x^12+x^5+1 (CRC-CCITT) */
 
-extern uint16_t cyg_crc16(unsigned char *s, int len);
+uint16_t crc16_ccitt(uint16_t crc_start, unsigned char *s, int len);
 
 #endif /* _SERVICES_CRC_CRC_H_ */
diff --git a/lib/crc16.c b/lib/crc16.c
index 57e46f82d903dc5da3bf1d76a9511650cd87d43e..753b987b0206e8f8cac1dc78fe132c5ab4e86622 100644
--- a/lib/crc16.c
+++ b/lib/crc16.c
@@ -61,12 +61,12 @@ static const uint16_t crc16_tab[] = {
 	0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0,
 };
 
-uint16_t cyg_crc16(unsigned char *buf, int len)
+uint16_t crc16_ccitt(uint16_t crc_start, unsigned char *buf, int len)
 {
 	int i;
 	uint16_t cksum;
 
-	cksum = 0;
+	cksum = crc_start;
 	for (i = 0;  i < len;  i++)
 		cksum = crc16_tab[((cksum>>8) ^ *buf++) & 0xff] ^ (cksum << 8);