[PATCH 0/5] crc16: Remove duplicate implementations

This patch series removes duplicate implementations of CRC-16 with polynomial x^16 + x^15 + x^2 + 1. One implementation is enough.
Atsha 5/5 patch depends on another atsha patch: https://patchwork.ozlabs.org/project/uboot/patch/20220402223634.20256-1-pali...
Pali Rohár (5): crc16-ccitt: Rename file with CRC-16-CCITT implementation to crc16-ccitt.c crc16: Rename fs/ubifs/crc16.h to include/linux/crc16.h crc16: Move standard CRC-16 implementation from ubifs to lib fs: ext4: Use CRC-16 implementation from linux/crc16.h misc: atsha204a: Remove duplicate CRC-16 implementation
drivers/misc/Kconfig | 1 + drivers/misc/atsha204a-i2c.c | 122 +-------------------------- fs/ext4/Makefile | 2 +- fs/ext4/crc16.c | 62 -------------- fs/ext4/crc16.h | 16 ---- fs/ext4/ext4_common.c | 8 +- fs/ext4/ext4_common.h | 2 +- fs/ubifs/Makefile | 2 +- fs/ubifs/crc16.c | 60 -------------- fs/ubifs/lpt.c | 2 +- fs/ubifs/lpt_commit.c | 2 +- {fs/ubifs => include/linux}/crc16.h | 0 include/u-boot/crc.h | 5 +- lib/Makefile | 7 +- lib/crc16-ccitt.c | 84 +++++++++++++++++++ lib/crc16.c | 124 +++++++++++----------------- tools/Makefile | 2 +- 17 files changed, 156 insertions(+), 345 deletions(-) delete mode 100644 fs/ext4/crc16.c delete mode 100644 fs/ext4/crc16.h delete mode 100644 fs/ubifs/crc16.c rename {fs/ubifs => include/linux}/crc16.h (100%) create mode 100644 lib/crc16-ccitt.c

U-Boot CRC-16 implementation uses polynomial x^16 + x^12 + x^5 + 1 which is not standard CRC-16 algorithm, but it is known as CRC-16-CCITT. Rename file crc16.c to crc16-ccitt.c to reduce confusion.
Signed-off-by: Pali Rohár pali@kernel.org --- include/u-boot/crc.h | 2 +- lib/Makefile | 8 ++++---- lib/{crc16.c => crc16-ccitt.c} | 2 +- tools/Makefile | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) rename lib/{crc16.c => crc16-ccitt.c} (99%)
diff --git a/include/u-boot/crc.h b/include/u-boot/crc.h index 52ec6a9e2d4b..eba8edfb4f31 100644 --- a/include/u-boot/crc.h +++ b/include/u-boot/crc.h @@ -25,7 +25,7 @@ */ unsigned int crc8(unsigned int crc_start, const unsigned char *vptr, int len);
-/* lib/crc16.c - 16 bit CRC with polynomial x^16+x^12+x^5+1 (CRC-CCITT) */ +/* lib/crc16-ccitt.c - 16 bit CRC with polynomial x^16+x^12+x^5+1 (CRC-CCITT) */ uint16_t crc16_ccitt(uint16_t crc_start, const unsigned char *s, int len); /** * crc16_ccitt_wd_buf - Perform CRC16-CCIT on an input buffer and return the diff --git a/lib/Makefile b/lib/Makefile index 11b03d1cbec8..b4f03cc149d3 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -37,7 +37,7 @@ obj-$(CONFIG_CIRCBUF) += circbuf.o endif
obj-y += crc8.o -obj-y += crc16.o +obj-y += crc16-ccitt.o obj-$(CONFIG_ERRNO_STR) += errno_str.o obj-$(CONFIG_FIT) += fdtdec_common.o obj-$(CONFIG_TEST_FDTDEC) += fdtdec_test.o @@ -90,9 +90,9 @@ obj-$(CONFIG_$(SPL_TPL_)OF_LIBFDT) += libfdt/ obj-$(CONFIG_$(SPL_TPL_)OF_REAL) += fdtdec_common.o fdtdec.o
ifdef CONFIG_SPL_BUILD -obj-$(CONFIG_SPL_YMODEM_SUPPORT) += crc16.o -obj-$(CONFIG_$(SPL_TPL_)HASH) += crc16.o -obj-$(CONFIG_MMC_SPI_CRC_ON) += crc16.o +obj-$(CONFIG_SPL_YMODEM_SUPPORT) += crc16-ccitt.o +obj-$(CONFIG_$(SPL_TPL_)HASH) += crc16-ccitt.o +obj-$(CONFIG_MMC_SPI_CRC_ON) += crc16-ccitt.o obj-y += net_utils.o endif obj-$(CONFIG_ADDR_MAP) += addr_map.o diff --git a/lib/crc16.c b/lib/crc16-ccitt.c similarity index 99% rename from lib/crc16.c rename to lib/crc16-ccitt.c index f46ba727c9a8..6cadbc103d3e 100644 --- a/lib/crc16.c +++ b/lib/crc16-ccitt.c @@ -2,7 +2,7 @@ /* *========================================================================== * - * crc16.c + * crc16-ccitt.c * * 16 bit CRC with polynomial x^16+x^12+x^5+1 * diff --git a/tools/Makefile b/tools/Makefile index 60231c728ceb..852dc638f418 100644 --- a/tools/Makefile +++ b/tools/Makefile @@ -131,7 +131,7 @@ dumpimage-mkimage-objs := aisimage.o \ $(ROCKCHIP_OBS) \ socfpgaimage.o \ sunxi_egon.o \ - lib/crc16.o \ + lib/crc16-ccitt.o \ lib/hash-checksum.o \ lib/sha1.o \ lib/sha256.o \

On 4/12/22 11:20, Pali Rohár wrote:
U-Boot CRC-16 implementation uses polynomial x^16 + x^12 + x^5 + 1 which is not standard CRC-16 algorithm, but it is known as CRC-16-CCITT. Rename file crc16.c to crc16-ccitt.c to reduce confusion.
Signed-off-by: Pali Rohár pali@kernel.org
Reviewed-by: Stefan Roese sr@denx.de
Thanks, Stefan
include/u-boot/crc.h | 2 +- lib/Makefile | 8 ++++---- lib/{crc16.c => crc16-ccitt.c} | 2 +- tools/Makefile | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) rename lib/{crc16.c => crc16-ccitt.c} (99%)
diff --git a/include/u-boot/crc.h b/include/u-boot/crc.h index 52ec6a9e2d4b..eba8edfb4f31 100644 --- a/include/u-boot/crc.h +++ b/include/u-boot/crc.h @@ -25,7 +25,7 @@ */ unsigned int crc8(unsigned int crc_start, const unsigned char *vptr, int len);
-/* lib/crc16.c - 16 bit CRC with polynomial x^16+x^12+x^5+1 (CRC-CCITT) */ +/* lib/crc16-ccitt.c - 16 bit CRC with polynomial x^16+x^12+x^5+1 (CRC-CCITT) */ uint16_t crc16_ccitt(uint16_t crc_start, const unsigned char *s, int len); /**
- crc16_ccitt_wd_buf - Perform CRC16-CCIT on an input buffer and return the
diff --git a/lib/Makefile b/lib/Makefile index 11b03d1cbec8..b4f03cc149d3 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -37,7 +37,7 @@ obj-$(CONFIG_CIRCBUF) += circbuf.o endif
obj-y += crc8.o -obj-y += crc16.o +obj-y += crc16-ccitt.o obj-$(CONFIG_ERRNO_STR) += errno_str.o obj-$(CONFIG_FIT) += fdtdec_common.o obj-$(CONFIG_TEST_FDTDEC) += fdtdec_test.o @@ -90,9 +90,9 @@ obj-$(CONFIG_$(SPL_TPL_)OF_LIBFDT) += libfdt/ obj-$(CONFIG_$(SPL_TPL_)OF_REAL) += fdtdec_common.o fdtdec.o
ifdef CONFIG_SPL_BUILD -obj-$(CONFIG_SPL_YMODEM_SUPPORT) += crc16.o -obj-$(CONFIG_$(SPL_TPL_)HASH) += crc16.o -obj-$(CONFIG_MMC_SPI_CRC_ON) += crc16.o +obj-$(CONFIG_SPL_YMODEM_SUPPORT) += crc16-ccitt.o +obj-$(CONFIG_$(SPL_TPL_)HASH) += crc16-ccitt.o +obj-$(CONFIG_MMC_SPI_CRC_ON) += crc16-ccitt.o obj-y += net_utils.o endif obj-$(CONFIG_ADDR_MAP) += addr_map.o diff --git a/lib/crc16.c b/lib/crc16-ccitt.c similarity index 99% rename from lib/crc16.c rename to lib/crc16-ccitt.c index f46ba727c9a8..6cadbc103d3e 100644 --- a/lib/crc16.c +++ b/lib/crc16-ccitt.c @@ -2,7 +2,7 @@ /* *==========================================================================
crc16.c
crc16-ccitt.c
16 bit CRC with polynomial x^16+x^12+x^5+1
diff --git a/tools/Makefile b/tools/Makefile index 60231c728ceb..852dc638f418 100644 --- a/tools/Makefile +++ b/tools/Makefile @@ -131,7 +131,7 @@ dumpimage-mkimage-objs := aisimage.o \ $(ROCKCHIP_OBS) \ socfpgaimage.o \ sunxi_egon.o \
lib/crc16.o \
lib/crc16-ccitt.o \ lib/hash-checksum.o \ lib/sha1.o \ lib/sha256.o \
Viele Grüße, Stefan Roese

On Tue, Apr 12, 2022 at 11:20:40AM +0200, Pali Rohár wrote:
U-Boot CRC-16 implementation uses polynomial x^16 + x^12 + x^5 + 1 which is not standard CRC-16 algorithm, but it is known as CRC-16-CCITT. Rename file crc16.c to crc16-ccitt.c to reduce confusion.
Signed-off-by: Pali Rohár pali@kernel.org Reviewed-by: Stefan Roese sr@denx.de
Applied to u-boot/master, thanks!

File fs/ubifs/crc16.h is standard linux's crc16.h include file. So move it from fs/ubifs to include/linux where are also other linux include files.
Signed-off-by: Pali Rohár pali@kernel.org --- fs/ubifs/crc16.c | 2 +- fs/ubifs/lpt.c | 2 +- fs/ubifs/lpt_commit.c | 2 +- {fs/ubifs => include/linux}/crc16.h | 0 4 files changed, 3 insertions(+), 3 deletions(-) rename {fs/ubifs => include/linux}/crc16.h (100%)
diff --git a/fs/ubifs/crc16.c b/fs/ubifs/crc16.c index 443ccf855d5e..7cf33fc7eb61 100644 --- a/fs/ubifs/crc16.c +++ b/fs/ubifs/crc16.c @@ -6,7 +6,7 @@ */
#include <linux/types.h> -#include "crc16.h" +#include <linux/crc16.h>
/** CRC table for the CRC-16. The poly is 0x8005 (x^16 + x^15 + x^2 + 1) */ u16 const crc16_table[256] = { diff --git a/fs/ubifs/lpt.c b/fs/ubifs/lpt.c index 62748b0210b2..27835e60d2c0 100644 --- a/fs/ubifs/lpt.c +++ b/fs/ubifs/lpt.c @@ -42,7 +42,7 @@ #include <linux/compat.h> #include <linux/err.h> #include <ubi_uboot.h> -#include "crc16.h" +#include <linux/crc16.h> #endif
/** diff --git a/fs/ubifs/lpt_commit.c b/fs/ubifs/lpt_commit.c index 897d0014306c..ba0b19a1f2b2 100644 --- a/fs/ubifs/lpt_commit.c +++ b/fs/ubifs/lpt_commit.c @@ -23,7 +23,7 @@ #include <linux/bitops.h> #include <linux/compat.h> #include <linux/err.h> -#include "crc16.h" +#include <linux/crc16.h> #endif #include "ubifs.h"
diff --git a/fs/ubifs/crc16.h b/include/linux/crc16.h similarity index 100% rename from fs/ubifs/crc16.h rename to include/linux/crc16.h

On 4/12/22 11:20, Pali Rohár wrote:
File fs/ubifs/crc16.h is standard linux's crc16.h include file. So move it from fs/ubifs to include/linux where are also other linux include files.
Signed-off-by: Pali Rohár pali@kernel.org
Reviewed-by: Stefan Roese sr@denx.de
Thanks, Stefan
fs/ubifs/crc16.c | 2 +- fs/ubifs/lpt.c | 2 +- fs/ubifs/lpt_commit.c | 2 +- {fs/ubifs => include/linux}/crc16.h | 0 4 files changed, 3 insertions(+), 3 deletions(-) rename {fs/ubifs => include/linux}/crc16.h (100%)
diff --git a/fs/ubifs/crc16.c b/fs/ubifs/crc16.c index 443ccf855d5e..7cf33fc7eb61 100644 --- a/fs/ubifs/crc16.c +++ b/fs/ubifs/crc16.c @@ -6,7 +6,7 @@ */
#include <linux/types.h> -#include "crc16.h" +#include <linux/crc16.h>
/** CRC table for the CRC-16. The poly is 0x8005 (x^16 + x^15 + x^2 + 1) */ u16 const crc16_table[256] = { diff --git a/fs/ubifs/lpt.c b/fs/ubifs/lpt.c index 62748b0210b2..27835e60d2c0 100644 --- a/fs/ubifs/lpt.c +++ b/fs/ubifs/lpt.c @@ -42,7 +42,7 @@ #include <linux/compat.h> #include <linux/err.h> #include <ubi_uboot.h> -#include "crc16.h" +#include <linux/crc16.h> #endif
/** diff --git a/fs/ubifs/lpt_commit.c b/fs/ubifs/lpt_commit.c index 897d0014306c..ba0b19a1f2b2 100644 --- a/fs/ubifs/lpt_commit.c +++ b/fs/ubifs/lpt_commit.c @@ -23,7 +23,7 @@ #include <linux/bitops.h> #include <linux/compat.h> #include <linux/err.h> -#include "crc16.h" +#include <linux/crc16.h> #endif #include "ubifs.h"
diff --git a/fs/ubifs/crc16.h b/include/linux/crc16.h similarity index 100% rename from fs/ubifs/crc16.h rename to include/linux/crc16.h
Viele Grüße, Stefan Roese

On Tue, Apr 12, 2022 at 11:20:41AM +0200, Pali Rohár wrote:
File fs/ubifs/crc16.h is standard linux's crc16.h include file. So move it from fs/ubifs to include/linux where are also other linux include files.
Signed-off-by: Pali Rohár pali@kernel.org Reviewed-by: Stefan Roese sr@denx.de
Applied to u-boot/master, thanks!

This implementation provides standard CRC-16 algorithm with polynomial x^16 + x^15 + x^2 + 1.
Signed-off-by: Pali Rohár pali@kernel.org --- fs/ubifs/Makefile | 2 +- include/u-boot/crc.h | 3 +++ lib/Makefile | 1 + {fs/ubifs => lib}/crc16.c | 0 4 files changed, 5 insertions(+), 1 deletion(-) rename {fs/ubifs => lib}/crc16.c (100%)
diff --git a/fs/ubifs/Makefile b/fs/ubifs/Makefile index 64d64472945e..631ba5f438cf 100644 --- a/fs/ubifs/Makefile +++ b/fs/ubifs/Makefile @@ -9,5 +9,5 @@
obj-y := ubifs.o io.o super.o sb.o master.o lpt.o obj-y += lpt_commit.o scan.o lprops.o -obj-y += tnc.o tnc_misc.o debug.o crc16.o budget.o +obj-y += tnc.o tnc_misc.o debug.o budget.o obj-y += log.o orphan.o recovery.o replay.o gc.o diff --git a/include/u-boot/crc.h b/include/u-boot/crc.h index eba8edfb4f31..5174bd7ac413 100644 --- a/include/u-boot/crc.h +++ b/include/u-boot/crc.h @@ -25,6 +25,9 @@ */ unsigned int crc8(unsigned int crc_start, const unsigned char *vptr, int len);
+/* lib/crc16.c - 16 bit CRC with polynomial x^16 + x^15 + x^2 + 1 */ +uint16_t crc16(uint16_t crc, const unsigned char *buffer, size_t len); + /* lib/crc16-ccitt.c - 16 bit CRC with polynomial x^16+x^12+x^5+1 (CRC-CCITT) */ uint16_t crc16_ccitt(uint16_t crc_start, const unsigned char *s, int len); /** diff --git a/lib/Makefile b/lib/Makefile index b4f03cc149d3..0d0261b8986f 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -37,6 +37,7 @@ obj-$(CONFIG_CIRCBUF) += circbuf.o endif
obj-y += crc8.o +obj-y += crc16.o obj-y += crc16-ccitt.o obj-$(CONFIG_ERRNO_STR) += errno_str.o obj-$(CONFIG_FIT) += fdtdec_common.o diff --git a/fs/ubifs/crc16.c b/lib/crc16.c similarity index 100% rename from fs/ubifs/crc16.c rename to lib/crc16.c

On 4/12/22 11:20, Pali Rohár wrote:
This implementation provides standard CRC-16 algorithm with polynomial x^16 + x^15 + x^2 + 1.
Signed-off-by: Pali Rohár pali@kernel.org
Reviewed-by: Stefan Roese sr@denx.de
Thanks, Stefan
fs/ubifs/Makefile | 2 +- include/u-boot/crc.h | 3 +++ lib/Makefile | 1 + {fs/ubifs => lib}/crc16.c | 0 4 files changed, 5 insertions(+), 1 deletion(-) rename {fs/ubifs => lib}/crc16.c (100%)
diff --git a/fs/ubifs/Makefile b/fs/ubifs/Makefile index 64d64472945e..631ba5f438cf 100644 --- a/fs/ubifs/Makefile +++ b/fs/ubifs/Makefile @@ -9,5 +9,5 @@
obj-y := ubifs.o io.o super.o sb.o master.o lpt.o obj-y += lpt_commit.o scan.o lprops.o -obj-y += tnc.o tnc_misc.o debug.o crc16.o budget.o +obj-y += tnc.o tnc_misc.o debug.o budget.o obj-y += log.o orphan.o recovery.o replay.o gc.o diff --git a/include/u-boot/crc.h b/include/u-boot/crc.h index eba8edfb4f31..5174bd7ac413 100644 --- a/include/u-boot/crc.h +++ b/include/u-boot/crc.h @@ -25,6 +25,9 @@ */ unsigned int crc8(unsigned int crc_start, const unsigned char *vptr, int len);
+/* lib/crc16.c - 16 bit CRC with polynomial x^16 + x^15 + x^2 + 1 */ +uint16_t crc16(uint16_t crc, const unsigned char *buffer, size_t len);
- /* lib/crc16-ccitt.c - 16 bit CRC with polynomial x^16+x^12+x^5+1 (CRC-CCITT) */ uint16_t crc16_ccitt(uint16_t crc_start, const unsigned char *s, int len); /**
diff --git a/lib/Makefile b/lib/Makefile index b4f03cc149d3..0d0261b8986f 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -37,6 +37,7 @@ obj-$(CONFIG_CIRCBUF) += circbuf.o endif
obj-y += crc8.o +obj-y += crc16.o obj-y += crc16-ccitt.o obj-$(CONFIG_ERRNO_STR) += errno_str.o obj-$(CONFIG_FIT) += fdtdec_common.o diff --git a/fs/ubifs/crc16.c b/lib/crc16.c similarity index 100% rename from fs/ubifs/crc16.c rename to lib/crc16.c
Viele Grüße, Stefan Roese

On Tue, Apr 12, 2022 at 11:20:42AM +0200, Pali Rohár wrote:
This implementation provides standard CRC-16 algorithm with polynomial x^16 + x^15 + x^2 + 1.
Signed-off-by: Pali Rohár pali@kernel.org Reviewed-by: Stefan Roese sr@denx.de
Applied to u-boot/master, thanks!

Implementation in linux/crc16.h provides standard CRC-16 algorithm with polynomial x^16 + x^15 + x^2 + 1. Use it and remove duplicate ext4 CRC-16 specific code.
Signed-off-by: Pali Rohár pali@kernel.org --- fs/ext4/Makefile | 2 +- fs/ext4/crc16.c | 62 ------------------------------------------- fs/ext4/crc16.h | 16 ----------- fs/ext4/ext4_common.c | 8 +++--- fs/ext4/ext4_common.h | 2 +- 5 files changed, 6 insertions(+), 84 deletions(-) delete mode 100644 fs/ext4/crc16.c delete mode 100644 fs/ext4/crc16.h
diff --git a/fs/ext4/Makefile b/fs/ext4/Makefile index c2544beee3a5..6ae44a2d0a34 100644 --- a/fs/ext4/Makefile +++ b/fs/ext4/Makefile @@ -8,4 +8,4 @@ #
obj-y := ext4fs.o ext4_common.o dev.o -obj-$(CONFIG_EXT4_WRITE) += ext4_write.o ext4_journal.o crc16.o +obj-$(CONFIG_EXT4_WRITE) += ext4_write.o ext4_journal.o diff --git a/fs/ext4/crc16.c b/fs/ext4/crc16.c deleted file mode 100644 index 3afb34daefa1..000000000000 --- a/fs/ext4/crc16.c +++ /dev/null @@ -1,62 +0,0 @@ -/* - * crc16.c - * - * This source code is licensed under the GNU General Public License, - * Version 2. See the file COPYING for more details. - */ - -#include <common.h> -#include <asm/byteorder.h> -#include <linux/stat.h> -#include "crc16.h" - -/** CRC table for the CRC-16. The poly is 0x8005 (x16 + x15 + x2 + 1) */ -static __u16 const crc16_table[256] = { - 0x0000, 0xC0C1, 0xC181, 0x0140, 0xC301, 0x03C0, 0x0280, 0xC241, - 0xC601, 0x06C0, 0x0780, 0xC741, 0x0500, 0xC5C1, 0xC481, 0x0440, - 0xCC01, 0x0CC0, 0x0D80, 0xCD41, 0x0F00, 0xCFC1, 0xCE81, 0x0E40, - 0x0A00, 0xCAC1, 0xCB81, 0x0B40, 0xC901, 0x09C0, 0x0880, 0xC841, - 0xD801, 0x18C0, 0x1980, 0xD941, 0x1B00, 0xDBC1, 0xDA81, 0x1A40, - 0x1E00, 0xDEC1, 0xDF81, 0x1F40, 0xDD01, 0x1DC0, 0x1C80, 0xDC41, - 0x1400, 0xD4C1, 0xD581, 0x1540, 0xD701, 0x17C0, 0x1680, 0xD641, - 0xD201, 0x12C0, 0x1380, 0xD341, 0x1100, 0xD1C1, 0xD081, 0x1040, - 0xF001, 0x30C0, 0x3180, 0xF141, 0x3300, 0xF3C1, 0xF281, 0x3240, - 0x3600, 0xF6C1, 0xF781, 0x3740, 0xF501, 0x35C0, 0x3480, 0xF441, - 0x3C00, 0xFCC1, 0xFD81, 0x3D40, 0xFF01, 0x3FC0, 0x3E80, 0xFE41, - 0xFA01, 0x3AC0, 0x3B80, 0xFB41, 0x3900, 0xF9C1, 0xF881, 0x3840, - 0x2800, 0xE8C1, 0xE981, 0x2940, 0xEB01, 0x2BC0, 0x2A80, 0xEA41, - 0xEE01, 0x2EC0, 0x2F80, 0xEF41, 0x2D00, 0xEDC1, 0xEC81, 0x2C40, - 0xE401, 0x24C0, 0x2580, 0xE541, 0x2700, 0xE7C1, 0xE681, 0x2640, - 0x2200, 0xE2C1, 0xE381, 0x2340, 0xE101, 0x21C0, 0x2080, 0xE041, - 0xA001, 0x60C0, 0x6180, 0xA141, 0x6300, 0xA3C1, 0xA281, 0x6240, - 0x6600, 0xA6C1, 0xA781, 0x6740, 0xA501, 0x65C0, 0x6480, 0xA441, - 0x6C00, 0xACC1, 0xAD81, 0x6D40, 0xAF01, 0x6FC0, 0x6E80, 0xAE41, - 0xAA01, 0x6AC0, 0x6B80, 0xAB41, 0x6900, 0xA9C1, 0xA881, 0x6840, - 0x7800, 0xB8C1, 0xB981, 0x7940, 0xBB01, 0x7BC0, 0x7A80, 0xBA41, - 0xBE01, 0x7EC0, 0x7F80, 0xBF41, 0x7D00, 0xBDC1, 0xBC81, 0x7C40, - 0xB401, 0x74C0, 0x7580, 0xB541, 0x7700, 0xB7C1, 0xB681, 0x7640, - 0x7200, 0xB2C1, 0xB381, 0x7340, 0xB101, 0x71C0, 0x7080, 0xB041, - 0x5000, 0x90C1, 0x9181, 0x5140, 0x9301, 0x53C0, 0x5280, 0x9241, - 0x9601, 0x56C0, 0x5780, 0x9741, 0x5500, 0x95C1, 0x9481, 0x5440, - 0x9C01, 0x5CC0, 0x5D80, 0x9D41, 0x5F00, 0x9FC1, 0x9E81, 0x5E40, - 0x5A00, 0x9AC1, 0x9B81, 0x5B40, 0x9901, 0x59C0, 0x5880, 0x9841, - 0x8801, 0x48C0, 0x4980, 0x8941, 0x4B00, 0x8BC1, 0x8A81, 0x4A40, - 0x4E00, 0x8EC1, 0x8F81, 0x4F40, 0x8D01, 0x4DC0, 0x4C80, 0x8C41, - 0x4400, 0x84C1, 0x8581, 0x4540, 0x8701, 0x47C0, 0x4680, 0x8641, - 0x8201, 0x42C0, 0x4380, 0x8341, 0x4100, 0x81C1, 0x8081, 0x4040 -}; - -/** - * Compute the CRC-16 for the data buffer -*/ - -unsigned int ext2fs_crc16(unsigned int crc, - const void *buffer, unsigned int len) -{ - const unsigned char *cp = buffer; - - while (len--) - crc = (((crc >> 8) & 0xffU) ^ - crc16_table[(crc ^ *cp++) & 0xffU]) & 0x0000ffffU; - return crc; -} diff --git a/fs/ext4/crc16.h b/fs/ext4/crc16.h deleted file mode 100644 index 5fd113a56c03..000000000000 --- a/fs/ext4/crc16.h +++ /dev/null @@ -1,16 +0,0 @@ -/* - * crc16.h - CRC-16 routine - * Implements the standard CRC-16: - * Width 16 - * Poly 0x8005 (x16 + x15 + x2 + 1) - * Init 0 - * - * Copyright (c) 2005 Ben Gardner bgardner@wabtec.com - * This source code is licensed under the GNU General Public License, - * Version 2. See the file COPYING for more details. - */ -#ifndef __CRC16_H -#define __CRC16_H -extern unsigned int ext2fs_crc16(unsigned int crc, - const void *buffer, unsigned int len); -#endif diff --git a/fs/ext4/ext4_common.c b/fs/ext4/ext4_common.c index c52cc400e1f2..d49ba4a9954d 100644 --- a/fs/ext4/ext4_common.c +++ b/fs/ext4/ext4_common.c @@ -427,14 +427,14 @@ uint16_t ext4fs_checksum_update(uint32_t i) if (le32_to_cpu(fs->sb->feature_ro_compat) & EXT4_FEATURE_RO_COMPAT_GDT_CSUM) { int offset = offsetof(struct ext2_block_group, bg_checksum);
- crc = ext2fs_crc16(~0, fs->sb->unique_id, + crc = crc16(~0, (__u8 *)fs->sb->unique_id, sizeof(fs->sb->unique_id)); - crc = ext2fs_crc16(crc, &le32_i, sizeof(le32_i)); - crc = ext2fs_crc16(crc, desc, offset); + crc = crc16(crc, (__u8 *)&le32_i, sizeof(le32_i)); + crc = crc16(crc, (__u8 *)desc, offset); offset += sizeof(desc->bg_checksum); /* skip checksum */ assert(offset == sizeof(*desc)); if (offset < fs->gdsize) { - crc = ext2fs_crc16(crc, (__u8 *)desc + offset, + crc = crc16(crc, (__u8 *)desc + offset, fs->gdsize - offset); } } diff --git a/fs/ext4/ext4_common.h b/fs/ext4/ext4_common.h index beaee9c80bd6..504c708b0647 100644 --- a/fs/ext4/ext4_common.h +++ b/fs/ext4/ext4_common.h @@ -27,7 +27,7 @@ #include <linux/errno.h> #if defined(CONFIG_EXT4_WRITE) #include "ext4_journal.h" -#include "crc16.h" +#include <linux/crc16.h> #endif
#define YES 1

On 4/12/22 11:20, Pali Rohár wrote:
Implementation in linux/crc16.h provides standard CRC-16 algorithm with polynomial x^16 + x^15 + x^2 + 1. Use it and remove duplicate ext4 CRC-16 specific code.
Signed-off-by: Pali Rohár pali@kernel.org
Reviewed-by: Stefan Roese sr@denx.de
Thanks, Stefan
fs/ext4/Makefile | 2 +- fs/ext4/crc16.c | 62 ------------------------------------------- fs/ext4/crc16.h | 16 ----------- fs/ext4/ext4_common.c | 8 +++--- fs/ext4/ext4_common.h | 2 +- 5 files changed, 6 insertions(+), 84 deletions(-) delete mode 100644 fs/ext4/crc16.c delete mode 100644 fs/ext4/crc16.h
diff --git a/fs/ext4/Makefile b/fs/ext4/Makefile index c2544beee3a5..6ae44a2d0a34 100644 --- a/fs/ext4/Makefile +++ b/fs/ext4/Makefile @@ -8,4 +8,4 @@ #
obj-y := ext4fs.o ext4_common.o dev.o -obj-$(CONFIG_EXT4_WRITE) += ext4_write.o ext4_journal.o crc16.o +obj-$(CONFIG_EXT4_WRITE) += ext4_write.o ext4_journal.o diff --git a/fs/ext4/crc16.c b/fs/ext4/crc16.c deleted file mode 100644 index 3afb34daefa1..000000000000 --- a/fs/ext4/crc16.c +++ /dev/null @@ -1,62 +0,0 @@ -/*
crc16.c
- This source code is licensed under the GNU General Public License,
- Version 2. See the file COPYING for more details.
- */
-#include <common.h> -#include <asm/byteorder.h> -#include <linux/stat.h> -#include "crc16.h"
-/** CRC table for the CRC-16. The poly is 0x8005 (x16 + x15 + x2 + 1) */ -static __u16 const crc16_table[256] = {
- 0x0000, 0xC0C1, 0xC181, 0x0140, 0xC301, 0x03C0, 0x0280, 0xC241,
- 0xC601, 0x06C0, 0x0780, 0xC741, 0x0500, 0xC5C1, 0xC481, 0x0440,
- 0xCC01, 0x0CC0, 0x0D80, 0xCD41, 0x0F00, 0xCFC1, 0xCE81, 0x0E40,
- 0x0A00, 0xCAC1, 0xCB81, 0x0B40, 0xC901, 0x09C0, 0x0880, 0xC841,
- 0xD801, 0x18C0, 0x1980, 0xD941, 0x1B00, 0xDBC1, 0xDA81, 0x1A40,
- 0x1E00, 0xDEC1, 0xDF81, 0x1F40, 0xDD01, 0x1DC0, 0x1C80, 0xDC41,
- 0x1400, 0xD4C1, 0xD581, 0x1540, 0xD701, 0x17C0, 0x1680, 0xD641,
- 0xD201, 0x12C0, 0x1380, 0xD341, 0x1100, 0xD1C1, 0xD081, 0x1040,
- 0xF001, 0x30C0, 0x3180, 0xF141, 0x3300, 0xF3C1, 0xF281, 0x3240,
- 0x3600, 0xF6C1, 0xF781, 0x3740, 0xF501, 0x35C0, 0x3480, 0xF441,
- 0x3C00, 0xFCC1, 0xFD81, 0x3D40, 0xFF01, 0x3FC0, 0x3E80, 0xFE41,
- 0xFA01, 0x3AC0, 0x3B80, 0xFB41, 0x3900, 0xF9C1, 0xF881, 0x3840,
- 0x2800, 0xE8C1, 0xE981, 0x2940, 0xEB01, 0x2BC0, 0x2A80, 0xEA41,
- 0xEE01, 0x2EC0, 0x2F80, 0xEF41, 0x2D00, 0xEDC1, 0xEC81, 0x2C40,
- 0xE401, 0x24C0, 0x2580, 0xE541, 0x2700, 0xE7C1, 0xE681, 0x2640,
- 0x2200, 0xE2C1, 0xE381, 0x2340, 0xE101, 0x21C0, 0x2080, 0xE041,
- 0xA001, 0x60C0, 0x6180, 0xA141, 0x6300, 0xA3C1, 0xA281, 0x6240,
- 0x6600, 0xA6C1, 0xA781, 0x6740, 0xA501, 0x65C0, 0x6480, 0xA441,
- 0x6C00, 0xACC1, 0xAD81, 0x6D40, 0xAF01, 0x6FC0, 0x6E80, 0xAE41,
- 0xAA01, 0x6AC0, 0x6B80, 0xAB41, 0x6900, 0xA9C1, 0xA881, 0x6840,
- 0x7800, 0xB8C1, 0xB981, 0x7940, 0xBB01, 0x7BC0, 0x7A80, 0xBA41,
- 0xBE01, 0x7EC0, 0x7F80, 0xBF41, 0x7D00, 0xBDC1, 0xBC81, 0x7C40,
- 0xB401, 0x74C0, 0x7580, 0xB541, 0x7700, 0xB7C1, 0xB681, 0x7640,
- 0x7200, 0xB2C1, 0xB381, 0x7340, 0xB101, 0x71C0, 0x7080, 0xB041,
- 0x5000, 0x90C1, 0x9181, 0x5140, 0x9301, 0x53C0, 0x5280, 0x9241,
- 0x9601, 0x56C0, 0x5780, 0x9741, 0x5500, 0x95C1, 0x9481, 0x5440,
- 0x9C01, 0x5CC0, 0x5D80, 0x9D41, 0x5F00, 0x9FC1, 0x9E81, 0x5E40,
- 0x5A00, 0x9AC1, 0x9B81, 0x5B40, 0x9901, 0x59C0, 0x5880, 0x9841,
- 0x8801, 0x48C0, 0x4980, 0x8941, 0x4B00, 0x8BC1, 0x8A81, 0x4A40,
- 0x4E00, 0x8EC1, 0x8F81, 0x4F40, 0x8D01, 0x4DC0, 0x4C80, 0x8C41,
- 0x4400, 0x84C1, 0x8581, 0x4540, 0x8701, 0x47C0, 0x4680, 0x8641,
- 0x8201, 0x42C0, 0x4380, 0x8341, 0x4100, 0x81C1, 0x8081, 0x4040
-};
-/**
- Compute the CRC-16 for the data buffer
-*/
-unsigned int ext2fs_crc16(unsigned int crc,
- const void *buffer, unsigned int len)
-{
- const unsigned char *cp = buffer;
- while (len--)
crc = (((crc >> 8) & 0xffU) ^
crc16_table[(crc ^ *cp++) & 0xffU]) & 0x0000ffffU;
- return crc;
-} diff --git a/fs/ext4/crc16.h b/fs/ext4/crc16.h deleted file mode 100644 index 5fd113a56c03..000000000000 --- a/fs/ext4/crc16.h +++ /dev/null @@ -1,16 +0,0 @@ -/*
- crc16.h - CRC-16 routine
- Implements the standard CRC-16:
- Width 16
- Poly 0x8005 (x16 + x15 + x2 + 1)
- Init 0
- Copyright (c) 2005 Ben Gardner bgardner@wabtec.com
- This source code is licensed under the GNU General Public License,
- Version 2. See the file COPYING for more details.
- */
-#ifndef __CRC16_H -#define __CRC16_H -extern unsigned int ext2fs_crc16(unsigned int crc,
- const void *buffer, unsigned int len);
-#endif diff --git a/fs/ext4/ext4_common.c b/fs/ext4/ext4_common.c index c52cc400e1f2..d49ba4a9954d 100644 --- a/fs/ext4/ext4_common.c +++ b/fs/ext4/ext4_common.c @@ -427,14 +427,14 @@ uint16_t ext4fs_checksum_update(uint32_t i) if (le32_to_cpu(fs->sb->feature_ro_compat) & EXT4_FEATURE_RO_COMPAT_GDT_CSUM) { int offset = offsetof(struct ext2_block_group, bg_checksum);
crc = ext2fs_crc16(~0, fs->sb->unique_id,
crc = crc16(~0, (__u8 *)fs->sb->unique_id, sizeof(fs->sb->unique_id));
crc = ext2fs_crc16(crc, &le32_i, sizeof(le32_i));
crc = ext2fs_crc16(crc, desc, offset);
crc = crc16(crc, (__u8 *)&le32_i, sizeof(le32_i));
offset += sizeof(desc->bg_checksum); /* skip checksum */ assert(offset == sizeof(*desc)); if (offset < fs->gdsize) {crc = crc16(crc, (__u8 *)desc, offset);
crc = ext2fs_crc16(crc, (__u8 *)desc + offset,
} }crc = crc16(crc, (__u8 *)desc + offset, fs->gdsize - offset);
diff --git a/fs/ext4/ext4_common.h b/fs/ext4/ext4_common.h index beaee9c80bd6..504c708b0647 100644 --- a/fs/ext4/ext4_common.h +++ b/fs/ext4/ext4_common.h @@ -27,7 +27,7 @@ #include <linux/errno.h> #if defined(CONFIG_EXT4_WRITE) #include "ext4_journal.h" -#include "crc16.h" +#include <linux/crc16.h> #endif
#define YES 1
Viele Grüße, Stefan Roese

On Tue, Apr 12, 2022 at 11:20:43AM +0200, Pali Rohár wrote:
Implementation in linux/crc16.h provides standard CRC-16 algorithm with polynomial x^16 + x^15 + x^2 + 1. Use it and remove duplicate ext4 CRC-16 specific code.
Signed-off-by: Pali Rohár pali@kernel.org Reviewed-by: Stefan Roese sr@denx.de
Applied to u-boot/master, thanks!

ATSHA204A uses bit-reversed checksum of standard CRC-16 with polynomial x^16 + x^15 + x^2 + 1.
This ATSHA204A specific checksum can be calculated just by using common U-Boot functions bitrev16() and crc16().
So replace custom driver CRC-16 implementation by common U-Boot functions.
Signed-off-by: Pali Rohár pali@kernel.org --- drivers/misc/Kconfig | 1 + drivers/misc/atsha204a-i2c.c | 122 +---------------------------------- 2 files changed, 4 insertions(+), 119 deletions(-)
diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig index 7029bb7b5c58..95bb678a6635 100644 --- a/drivers/misc/Kconfig +++ b/drivers/misc/Kconfig @@ -40,6 +40,7 @@ config ALTERA_SYSID
config ATSHA204A bool "Support for Atmel ATSHA204A module" + select BITREVERSE depends on MISC help Enable support for I2C connected Atmel's ATSHA204A diff --git a/drivers/misc/atsha204a-i2c.c b/drivers/misc/atsha204a-i2c.c index 8b0055f99893..aa6acf0f9a0e 100644 --- a/drivers/misc/atsha204a-i2c.c +++ b/drivers/misc/atsha204a-i2c.c @@ -18,6 +18,7 @@ #include <log.h> #include <asm/global_data.h> #include <linux/delay.h> +#include <linux/bitrev.h> #include <u-boot/crc.h>
#define ATSHA204A_TWLO 60 @@ -27,126 +28,9 @@
DECLARE_GLOBAL_DATA_PTR;
-/* - * The ATSHA204A uses an (to me) unknown CRC-16 algorithm. - * The Reveng CRC-16 catalogue does not contain it. - * - * Because in Atmel's documentation only a primitive implementation - * can be found, I have implemented this one with lookup table. - */ - -/* - * This is the code that computes the table below: - * - * int i, j; - * for (i = 0; i < 256; ++i) { - * u8 c = 0; - * for (j = 0; j < 8; ++j) { - * c = (c << 1) | ((i >> j) & 1); - * } - * bitreverse_table[i] = c; - * } - */ - -static u8 const bitreverse_table[256] = { - 0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0, - 0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0, - 0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8, - 0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8, - 0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4, - 0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4, - 0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec, - 0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc, - 0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2, - 0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2, - 0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea, - 0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa, - 0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6, - 0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6, - 0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee, - 0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe, - 0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1, - 0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1, - 0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9, - 0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9, - 0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5, - 0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5, - 0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed, - 0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd, - 0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3, - 0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3, - 0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb, - 0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb, - 0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7, - 0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7, - 0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef, - 0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff, -}; - -/* - * This is the code that computes the table below: - * - * int i, j; - * for (i = 0; i < 256; ++i) { - * u16 c = i << 8; - * for (j = 0; j < 8; ++j) { - * int b = c >> 15; - * c <<= 1; - * if (b) - * c ^= 0x8005; - * } - * crc16_table[i] = c; - * } - */ -static u16 const crc16_table[256] = { - 0x0000, 0x8005, 0x800f, 0x000a, 0x801b, 0x001e, 0x0014, 0x8011, - 0x8033, 0x0036, 0x003c, 0x8039, 0x0028, 0x802d, 0x8027, 0x0022, - 0x8063, 0x0066, 0x006c, 0x8069, 0x0078, 0x807d, 0x8077, 0x0072, - 0x0050, 0x8055, 0x805f, 0x005a, 0x804b, 0x004e, 0x0044, 0x8041, - 0x80c3, 0x00c6, 0x00cc, 0x80c9, 0x00d8, 0x80dd, 0x80d7, 0x00d2, - 0x00f0, 0x80f5, 0x80ff, 0x00fa, 0x80eb, 0x00ee, 0x00e4, 0x80e1, - 0x00a0, 0x80a5, 0x80af, 0x00aa, 0x80bb, 0x00be, 0x00b4, 0x80b1, - 0x8093, 0x0096, 0x009c, 0x8099, 0x0088, 0x808d, 0x8087, 0x0082, - 0x8183, 0x0186, 0x018c, 0x8189, 0x0198, 0x819d, 0x8197, 0x0192, - 0x01b0, 0x81b5, 0x81bf, 0x01ba, 0x81ab, 0x01ae, 0x01a4, 0x81a1, - 0x01e0, 0x81e5, 0x81ef, 0x01ea, 0x81fb, 0x01fe, 0x01f4, 0x81f1, - 0x81d3, 0x01d6, 0x01dc, 0x81d9, 0x01c8, 0x81cd, 0x81c7, 0x01c2, - 0x0140, 0x8145, 0x814f, 0x014a, 0x815b, 0x015e, 0x0154, 0x8151, - 0x8173, 0x0176, 0x017c, 0x8179, 0x0168, 0x816d, 0x8167, 0x0162, - 0x8123, 0x0126, 0x012c, 0x8129, 0x0138, 0x813d, 0x8137, 0x0132, - 0x0110, 0x8115, 0x811f, 0x011a, 0x810b, 0x010e, 0x0104, 0x8101, - 0x8303, 0x0306, 0x030c, 0x8309, 0x0318, 0x831d, 0x8317, 0x0312, - 0x0330, 0x8335, 0x833f, 0x033a, 0x832b, 0x032e, 0x0324, 0x8321, - 0x0360, 0x8365, 0x836f, 0x036a, 0x837b, 0x037e, 0x0374, 0x8371, - 0x8353, 0x0356, 0x035c, 0x8359, 0x0348, 0x834d, 0x8347, 0x0342, - 0x03c0, 0x83c5, 0x83cf, 0x03ca, 0x83db, 0x03de, 0x03d4, 0x83d1, - 0x83f3, 0x03f6, 0x03fc, 0x83f9, 0x03e8, 0x83ed, 0x83e7, 0x03e2, - 0x83a3, 0x03a6, 0x03ac, 0x83a9, 0x03b8, 0x83bd, 0x83b7, 0x03b2, - 0x0390, 0x8395, 0x839f, 0x039a, 0x838b, 0x038e, 0x0384, 0x8381, - 0x0280, 0x8285, 0x828f, 0x028a, 0x829b, 0x029e, 0x0294, 0x8291, - 0x82b3, 0x02b6, 0x02bc, 0x82b9, 0x02a8, 0x82ad, 0x82a7, 0x02a2, - 0x82e3, 0x02e6, 0x02ec, 0x82e9, 0x02f8, 0x82fd, 0x82f7, 0x02f2, - 0x02d0, 0x82d5, 0x82df, 0x02da, 0x82cb, 0x02ce, 0x02c4, 0x82c1, - 0x8243, 0x0246, 0x024c, 0x8249, 0x0258, 0x825d, 0x8257, 0x0252, - 0x0270, 0x8275, 0x827f, 0x027a, 0x826b, 0x026e, 0x0264, 0x8261, - 0x0220, 0x8225, 0x822f, 0x022a, 0x823b, 0x023e, 0x0234, 0x8231, - 0x8213, 0x0216, 0x021c, 0x8219, 0x0208, 0x820d, 0x8207, 0x0202, -}; - -static inline u16 crc16_byte(u16 crc, const u8 data) +static inline u16 atsha204a_crc16(const u8 *buffer, size_t len) { - u16 t = crc16_table[((crc >> 8) ^ bitreverse_table[data]) & 0xff]; - return ((crc << 8) ^ t); -} - -static u16 atsha204a_crc16(const u8 *buffer, size_t len) -{ - u16 crc = 0; - - while (len--) - crc = crc16_byte(crc, *buffer++); - - return crc; + return bitrev16(crc16(0, buffer, len)); }
static int atsha204a_send(struct udevice *dev, const u8 *buf, u8 len)

On 4/12/22 11:20, Pali Rohár wrote:
ATSHA204A uses bit-reversed checksum of standard CRC-16 with polynomial x^16 + x^15 + x^2 + 1.
This ATSHA204A specific checksum can be calculated just by using common U-Boot functions bitrev16() and crc16().
So replace custom driver CRC-16 implementation by common U-Boot functions.
Signed-off-by: Pali Rohár pali@kernel.org
Reviewed-by: Stefan Roese sr@denx.de
Thanks, Stefan
drivers/misc/Kconfig | 1 + drivers/misc/atsha204a-i2c.c | 122 +---------------------------------- 2 files changed, 4 insertions(+), 119 deletions(-)
diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig index 7029bb7b5c58..95bb678a6635 100644 --- a/drivers/misc/Kconfig +++ b/drivers/misc/Kconfig @@ -40,6 +40,7 @@ config ALTERA_SYSID
config ATSHA204A bool "Support for Atmel ATSHA204A module"
- select BITREVERSE depends on MISC help Enable support for I2C connected Atmel's ATSHA204A
diff --git a/drivers/misc/atsha204a-i2c.c b/drivers/misc/atsha204a-i2c.c index 8b0055f99893..aa6acf0f9a0e 100644 --- a/drivers/misc/atsha204a-i2c.c +++ b/drivers/misc/atsha204a-i2c.c @@ -18,6 +18,7 @@ #include <log.h> #include <asm/global_data.h> #include <linux/delay.h> +#include <linux/bitrev.h> #include <u-boot/crc.h>
#define ATSHA204A_TWLO 60 @@ -27,126 +28,9 @@
DECLARE_GLOBAL_DATA_PTR;
-/*
- The ATSHA204A uses an (to me) unknown CRC-16 algorithm.
- The Reveng CRC-16 catalogue does not contain it.
- Because in Atmel's documentation only a primitive implementation
- can be found, I have implemented this one with lookup table.
- */
-/*
- This is the code that computes the table below:
- int i, j;
- for (i = 0; i < 256; ++i) {
- u8 c = 0;
- for (j = 0; j < 8; ++j) {
c = (c << 1) | ((i >> j) & 1);
- }
- bitreverse_table[i] = c;
- }
- */
-static u8 const bitreverse_table[256] = {
- 0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0,
- 0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0,
- 0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8,
- 0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8,
- 0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4,
- 0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4,
- 0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec,
- 0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc,
- 0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2,
- 0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2,
- 0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea,
- 0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa,
- 0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6,
- 0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6,
- 0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee,
- 0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe,
- 0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1,
- 0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1,
- 0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9,
- 0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9,
- 0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5,
- 0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5,
- 0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed,
- 0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd,
- 0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3,
- 0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3,
- 0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb,
- 0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb,
- 0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7,
- 0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7,
- 0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef,
- 0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff,
-};
-/*
- This is the code that computes the table below:
- int i, j;
- for (i = 0; i < 256; ++i) {
- u16 c = i << 8;
- for (j = 0; j < 8; ++j) {
int b = c >> 15;
c <<= 1;
if (b)
c ^= 0x8005;
- }
- crc16_table[i] = c;
- }
- */
-static u16 const crc16_table[256] = {
- 0x0000, 0x8005, 0x800f, 0x000a, 0x801b, 0x001e, 0x0014, 0x8011,
- 0x8033, 0x0036, 0x003c, 0x8039, 0x0028, 0x802d, 0x8027, 0x0022,
- 0x8063, 0x0066, 0x006c, 0x8069, 0x0078, 0x807d, 0x8077, 0x0072,
- 0x0050, 0x8055, 0x805f, 0x005a, 0x804b, 0x004e, 0x0044, 0x8041,
- 0x80c3, 0x00c6, 0x00cc, 0x80c9, 0x00d8, 0x80dd, 0x80d7, 0x00d2,
- 0x00f0, 0x80f5, 0x80ff, 0x00fa, 0x80eb, 0x00ee, 0x00e4, 0x80e1,
- 0x00a0, 0x80a5, 0x80af, 0x00aa, 0x80bb, 0x00be, 0x00b4, 0x80b1,
- 0x8093, 0x0096, 0x009c, 0x8099, 0x0088, 0x808d, 0x8087, 0x0082,
- 0x8183, 0x0186, 0x018c, 0x8189, 0x0198, 0x819d, 0x8197, 0x0192,
- 0x01b0, 0x81b5, 0x81bf, 0x01ba, 0x81ab, 0x01ae, 0x01a4, 0x81a1,
- 0x01e0, 0x81e5, 0x81ef, 0x01ea, 0x81fb, 0x01fe, 0x01f4, 0x81f1,
- 0x81d3, 0x01d6, 0x01dc, 0x81d9, 0x01c8, 0x81cd, 0x81c7, 0x01c2,
- 0x0140, 0x8145, 0x814f, 0x014a, 0x815b, 0x015e, 0x0154, 0x8151,
- 0x8173, 0x0176, 0x017c, 0x8179, 0x0168, 0x816d, 0x8167, 0x0162,
- 0x8123, 0x0126, 0x012c, 0x8129, 0x0138, 0x813d, 0x8137, 0x0132,
- 0x0110, 0x8115, 0x811f, 0x011a, 0x810b, 0x010e, 0x0104, 0x8101,
- 0x8303, 0x0306, 0x030c, 0x8309, 0x0318, 0x831d, 0x8317, 0x0312,
- 0x0330, 0x8335, 0x833f, 0x033a, 0x832b, 0x032e, 0x0324, 0x8321,
- 0x0360, 0x8365, 0x836f, 0x036a, 0x837b, 0x037e, 0x0374, 0x8371,
- 0x8353, 0x0356, 0x035c, 0x8359, 0x0348, 0x834d, 0x8347, 0x0342,
- 0x03c0, 0x83c5, 0x83cf, 0x03ca, 0x83db, 0x03de, 0x03d4, 0x83d1,
- 0x83f3, 0x03f6, 0x03fc, 0x83f9, 0x03e8, 0x83ed, 0x83e7, 0x03e2,
- 0x83a3, 0x03a6, 0x03ac, 0x83a9, 0x03b8, 0x83bd, 0x83b7, 0x03b2,
- 0x0390, 0x8395, 0x839f, 0x039a, 0x838b, 0x038e, 0x0384, 0x8381,
- 0x0280, 0x8285, 0x828f, 0x028a, 0x829b, 0x029e, 0x0294, 0x8291,
- 0x82b3, 0x02b6, 0x02bc, 0x82b9, 0x02a8, 0x82ad, 0x82a7, 0x02a2,
- 0x82e3, 0x02e6, 0x02ec, 0x82e9, 0x02f8, 0x82fd, 0x82f7, 0x02f2,
- 0x02d0, 0x82d5, 0x82df, 0x02da, 0x82cb, 0x02ce, 0x02c4, 0x82c1,
- 0x8243, 0x0246, 0x024c, 0x8249, 0x0258, 0x825d, 0x8257, 0x0252,
- 0x0270, 0x8275, 0x827f, 0x027a, 0x826b, 0x026e, 0x0264, 0x8261,
- 0x0220, 0x8225, 0x822f, 0x022a, 0x823b, 0x023e, 0x0234, 0x8231,
- 0x8213, 0x0216, 0x021c, 0x8219, 0x0208, 0x820d, 0x8207, 0x0202,
-};
-static inline u16 crc16_byte(u16 crc, const u8 data) +static inline u16 atsha204a_crc16(const u8 *buffer, size_t len) {
- u16 t = crc16_table[((crc >> 8) ^ bitreverse_table[data]) & 0xff];
- return ((crc << 8) ^ t);
-}
-static u16 atsha204a_crc16(const u8 *buffer, size_t len) -{
- u16 crc = 0;
- while (len--)
crc = crc16_byte(crc, *buffer++);
- return crc;
return bitrev16(crc16(0, buffer, len)); }
static int atsha204a_send(struct udevice *dev, const u8 *buf, u8 len)
Viele Grüße, Stefan Roese

On Tue, Apr 12, 2022 at 11:20:44AM +0200, Pali Rohár wrote:
ATSHA204A uses bit-reversed checksum of standard CRC-16 with polynomial x^16 + x^15 + x^2 + 1.
This ATSHA204A specific checksum can be calculated just by using common U-Boot functions bitrev16() and crc16().
So replace custom driver CRC-16 implementation by common U-Boot functions.
Signed-off-by: Pali Rohár pali@kernel.org Reviewed-by: Stefan Roese sr@denx.de
Applied to u-boot/master, thanks!
participants (3)
-
Pali Rohár
-
Stefan Roese
-
Tom Rini