lib/crc7: Shift crc7() output left 1 bit

This eliminates a 1-bit left shift in every single caller,
and makes the inner loop of the CRC computation more efficient.

Renamed crc7 to crc7_be (big-endian) since the interface changed.

Also purged #include <linux/crc7.h> from files that don't use it at all.

Signed-off-by: George Spelvin <linux@horizon.com>
Reviewed-by: Pavel Machek <pavel@ucw.cz>
Acked-by: Ulf Hansson <ulf.hansson@linaro.org>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
George Spelvin 2014-05-10 10:32:57 -04:00 committed by John W. Linville
parent d91a48cbae
commit 1836eea209
7 changed files with 53 additions and 49 deletions

View file

@ -472,7 +472,7 @@ mmc_spi_command_send(struct mmc_spi_host *host,
*cp++ = (u8)(arg >> 16); *cp++ = (u8)(arg >> 16);
*cp++ = (u8)(arg >> 8); *cp++ = (u8)(arg >> 8);
*cp++ = (u8)arg; *cp++ = (u8)arg;
*cp++ = (crc7(0, &data->status[1], 5) << 1) | 0x01; *cp++ = crc7_be(0, &data->status[1], 5) | 0x01;
/* Then, read up to 13 bytes (while writing all-ones): /* Then, read up to 13 bytes (while writing all-ones):
* - N(CR) (== 1..8) bytes of all-ones * - N(CR) (== 1..8) bytes of all-ones

View file

@ -2,7 +2,6 @@
#include <linux/module.h> #include <linux/module.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/crc7.h>
#include "wl1251.h" #include "wl1251.h"
#include "reg.h" #include "reg.h"

View file

@ -2,7 +2,6 @@
#include <linux/module.h> #include <linux/module.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/crc7.h>
#include <linux/etherdevice.h> #include <linux/etherdevice.h>
#include "wl1251.h" #include "wl1251.h"

View file

@ -122,8 +122,7 @@ static void wl1251_spi_wake(struct wl1251 *wl)
crc[3] = cmd[6]; crc[3] = cmd[6];
crc[4] = cmd[5]; crc[4] = cmd[5];
cmd[4] |= crc7(0, crc, WSPI_INIT_CMD_CRC_LEN) << 1; cmd[4] = crc7_be(0, crc, WSPI_INIT_CMD_CRC_LEN) | WSPI_INIT_CMD_END;
cmd[4] |= WSPI_INIT_CMD_END;
t.tx_buf = cmd; t.tx_buf = cmd;
t.len = WSPI_INIT_CMD_LEN; t.len = WSPI_INIT_CMD_LEN;

View file

@ -151,8 +151,7 @@ static void wl12xx_spi_init(struct device *child)
crc[3] = cmd[6]; crc[3] = cmd[6];
crc[4] = cmd[5]; crc[4] = cmd[5];
cmd[4] |= crc7(0, crc, WSPI_INIT_CMD_CRC_LEN) << 1; cmd[4] = crc7_be(0, crc, WSPI_INIT_CMD_CRC_LEN) | WSPI_INIT_CMD_END;
cmd[4] |= WSPI_INIT_CMD_END;
t.tx_buf = cmd; t.tx_buf = cmd;
t.len = WSPI_INIT_CMD_LEN; t.len = WSPI_INIT_CMD_LEN;

View file

@ -2,13 +2,13 @@
#define _LINUX_CRC7_H #define _LINUX_CRC7_H
#include <linux/types.h> #include <linux/types.h>
extern const u8 crc7_syndrome_table[256]; extern const u8 crc7_be_syndrome_table[256];
static inline u8 crc7_byte(u8 crc, u8 data) static inline u8 crc7_be_byte(u8 crc, u8 data)
{ {
return crc7_syndrome_table[(crc << 1) ^ data]; return crc7_be_syndrome_table[crc ^ data];
} }
extern u8 crc7(u8 crc, const u8 *buffer, size_t len); extern u8 crc7_be(u8 crc, const u8 *buffer, size_t len);
#endif #endif

View file

@ -10,42 +10,47 @@
#include <linux/crc7.h> #include <linux/crc7.h>
/* Table for CRC-7 (polynomial x^7 + x^3 + 1) */ /*
const u8 crc7_syndrome_table[256] = { * Table for CRC-7 (polynomial x^7 + x^3 + 1).
0x00, 0x09, 0x12, 0x1b, 0x24, 0x2d, 0x36, 0x3f, * This is a big-endian CRC (msbit is highest power of x),
0x48, 0x41, 0x5a, 0x53, 0x6c, 0x65, 0x7e, 0x77, * aligned so the msbit of the byte is the x^6 coefficient
0x19, 0x10, 0x0b, 0x02, 0x3d, 0x34, 0x2f, 0x26, * and the lsbit is not used.
0x51, 0x58, 0x43, 0x4a, 0x75, 0x7c, 0x67, 0x6e, */
0x32, 0x3b, 0x20, 0x29, 0x16, 0x1f, 0x04, 0x0d, const u8 crc7_be_syndrome_table[256] = {
0x7a, 0x73, 0x68, 0x61, 0x5e, 0x57, 0x4c, 0x45, 0x00, 0x12, 0x24, 0x36, 0x48, 0x5a, 0x6c, 0x7e,
0x2b, 0x22, 0x39, 0x30, 0x0f, 0x06, 0x1d, 0x14, 0x90, 0x82, 0xb4, 0xa6, 0xd8, 0xca, 0xfc, 0xee,
0x63, 0x6a, 0x71, 0x78, 0x47, 0x4e, 0x55, 0x5c, 0x32, 0x20, 0x16, 0x04, 0x7a, 0x68, 0x5e, 0x4c,
0x64, 0x6d, 0x76, 0x7f, 0x40, 0x49, 0x52, 0x5b, 0xa2, 0xb0, 0x86, 0x94, 0xea, 0xf8, 0xce, 0xdc,
0x2c, 0x25, 0x3e, 0x37, 0x08, 0x01, 0x1a, 0x13, 0x64, 0x76, 0x40, 0x52, 0x2c, 0x3e, 0x08, 0x1a,
0x7d, 0x74, 0x6f, 0x66, 0x59, 0x50, 0x4b, 0x42, 0xf4, 0xe6, 0xd0, 0xc2, 0xbc, 0xae, 0x98, 0x8a,
0x35, 0x3c, 0x27, 0x2e, 0x11, 0x18, 0x03, 0x0a, 0x56, 0x44, 0x72, 0x60, 0x1e, 0x0c, 0x3a, 0x28,
0x56, 0x5f, 0x44, 0x4d, 0x72, 0x7b, 0x60, 0x69, 0xc6, 0xd4, 0xe2, 0xf0, 0x8e, 0x9c, 0xaa, 0xb8,
0x1e, 0x17, 0x0c, 0x05, 0x3a, 0x33, 0x28, 0x21, 0xc8, 0xda, 0xec, 0xfe, 0x80, 0x92, 0xa4, 0xb6,
0x4f, 0x46, 0x5d, 0x54, 0x6b, 0x62, 0x79, 0x70, 0x58, 0x4a, 0x7c, 0x6e, 0x10, 0x02, 0x34, 0x26,
0x07, 0x0e, 0x15, 0x1c, 0x23, 0x2a, 0x31, 0x38, 0xfa, 0xe8, 0xde, 0xcc, 0xb2, 0xa0, 0x96, 0x84,
0x41, 0x48, 0x53, 0x5a, 0x65, 0x6c, 0x77, 0x7e, 0x6a, 0x78, 0x4e, 0x5c, 0x22, 0x30, 0x06, 0x14,
0x09, 0x00, 0x1b, 0x12, 0x2d, 0x24, 0x3f, 0x36, 0xac, 0xbe, 0x88, 0x9a, 0xe4, 0xf6, 0xc0, 0xd2,
0x58, 0x51, 0x4a, 0x43, 0x7c, 0x75, 0x6e, 0x67, 0x3c, 0x2e, 0x18, 0x0a, 0x74, 0x66, 0x50, 0x42,
0x10, 0x19, 0x02, 0x0b, 0x34, 0x3d, 0x26, 0x2f, 0x9e, 0x8c, 0xba, 0xa8, 0xd6, 0xc4, 0xf2, 0xe0,
0x73, 0x7a, 0x61, 0x68, 0x57, 0x5e, 0x45, 0x4c, 0x0e, 0x1c, 0x2a, 0x38, 0x46, 0x54, 0x62, 0x70,
0x3b, 0x32, 0x29, 0x20, 0x1f, 0x16, 0x0d, 0x04, 0x82, 0x90, 0xa6, 0xb4, 0xca, 0xd8, 0xee, 0xfc,
0x6a, 0x63, 0x78, 0x71, 0x4e, 0x47, 0x5c, 0x55, 0x12, 0x00, 0x36, 0x24, 0x5a, 0x48, 0x7e, 0x6c,
0x22, 0x2b, 0x30, 0x39, 0x06, 0x0f, 0x14, 0x1d, 0xb0, 0xa2, 0x94, 0x86, 0xf8, 0xea, 0xdc, 0xce,
0x25, 0x2c, 0x37, 0x3e, 0x01, 0x08, 0x13, 0x1a, 0x20, 0x32, 0x04, 0x16, 0x68, 0x7a, 0x4c, 0x5e,
0x6d, 0x64, 0x7f, 0x76, 0x49, 0x40, 0x5b, 0x52, 0xe6, 0xf4, 0xc2, 0xd0, 0xae, 0xbc, 0x8a, 0x98,
0x3c, 0x35, 0x2e, 0x27, 0x18, 0x11, 0x0a, 0x03, 0x76, 0x64, 0x52, 0x40, 0x3e, 0x2c, 0x1a, 0x08,
0x74, 0x7d, 0x66, 0x6f, 0x50, 0x59, 0x42, 0x4b, 0xd4, 0xc6, 0xf0, 0xe2, 0x9c, 0x8e, 0xb8, 0xaa,
0x17, 0x1e, 0x05, 0x0c, 0x33, 0x3a, 0x21, 0x28, 0x44, 0x56, 0x60, 0x72, 0x0c, 0x1e, 0x28, 0x3a,
0x5f, 0x56, 0x4d, 0x44, 0x7b, 0x72, 0x69, 0x60, 0x4a, 0x58, 0x6e, 0x7c, 0x02, 0x10, 0x26, 0x34,
0x0e, 0x07, 0x1c, 0x15, 0x2a, 0x23, 0x38, 0x31, 0xda, 0xc8, 0xfe, 0xec, 0x92, 0x80, 0xb6, 0xa4,
0x46, 0x4f, 0x54, 0x5d, 0x62, 0x6b, 0x70, 0x79 0x78, 0x6a, 0x5c, 0x4e, 0x30, 0x22, 0x14, 0x06,
0xe8, 0xfa, 0xcc, 0xde, 0xa0, 0xb2, 0x84, 0x96,
0x2e, 0x3c, 0x0a, 0x18, 0x66, 0x74, 0x42, 0x50,
0xbe, 0xac, 0x9a, 0x88, 0xf6, 0xe4, 0xd2, 0xc0,
0x1c, 0x0e, 0x38, 0x2a, 0x54, 0x46, 0x70, 0x62,
0x8c, 0x9e, 0xa8, 0xba, 0xc4, 0xd6, 0xe0, 0xf2
}; };
EXPORT_SYMBOL(crc7_syndrome_table); EXPORT_SYMBOL(crc7_be_syndrome_table);
/** /**
* crc7 - update the CRC7 for the data buffer * crc7 - update the CRC7 for the data buffer
@ -55,14 +60,17 @@ EXPORT_SYMBOL(crc7_syndrome_table);
* Context: any * Context: any
* *
* Returns the updated CRC7 value. * Returns the updated CRC7 value.
* The CRC7 is left-aligned in the byte (the lsbit is always 0), as that
* makes the computation easier, and all callers want it in that form.
*
*/ */
u8 crc7(u8 crc, const u8 *buffer, size_t len) u8 crc7_be(u8 crc, const u8 *buffer, size_t len)
{ {
while (len--) while (len--)
crc = crc7_byte(crc, *buffer++); crc = crc7_be_byte(crc, *buffer++);
return crc; return crc;
} }
EXPORT_SYMBOL(crc7); EXPORT_SYMBOL(crc7_be);
MODULE_DESCRIPTION("CRC7 calculations"); MODULE_DESCRIPTION("CRC7 calculations");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");