]> git.ipfire.org Git - people/ms/u-boot.git/blobdiff - lib/crc8.c
usb: kbd: select SYS_STDIO_DEREGISTER
[people/ms/u-boot.git] / lib / crc8.c
index 8b68a29e40be79d95c85ce88c9c6bd65b643a1be..51d540fbcb4acc0a71a83a9055a9e295638c136f 100644 (file)
@@ -6,20 +6,27 @@
 
 #include "linux/crc8.h"
 
-unsigned int crc8(const unsigned char *vptr, int len)
+#define POLY   (0x1070U << 3)
+
+static unsigned char _crc8(unsigned short data)
 {
-       const unsigned char *data = vptr;
-       unsigned int crc = 0;
-       int i, j;
-
-       for (j = len; j; j--, data++) {
-               crc ^= (*data << 8);
-               for (i = 8; i; i--) {
-                       if (crc & 0x8000)
-                               crc ^= (0x1070 << 3);
-                       crc <<= 1;
-               }
+       int i;
+
+       for (i = 0; i < 8; i++) {
+               if (data & 0x8000)
+                       data = data ^ POLY;
+               data = data << 1;
        }
 
-       return (crc >> 8) & 0xff;
+       return (unsigned char)(data >> 8);
+}
+
+unsigned int crc8(unsigned int crc, const unsigned char *vptr, int len)
+{
+       int i;
+
+       for (i = 0; i < len; i++)
+               crc = _crc8((crc ^ vptr[i]) << 8);
+
+       return crc;
 }