From mboxrd@z Thu Jan 1 00:00:00 1970 From: =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= Date: Wed, 15 Jun 2011 13:53:34 +0200 Subject: [RFC][WORTH IT?][PATCH] bcma: make use of crc8 lib Message-ID: <1308138814-12235-1-git-send-email-zajec5@gmail.com> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: linux-wireless@vger.kernel.org Cc: "John W. Linville" , b43-dev@lists.infradead.org, =?UTF-8?q?Rafa=C5=82=20Mi=C5=82ecki?= , Arend van Spriel Cc: Arend van Spriel Signed-off-by: Rafa? Mi?ecki --- We implement crc8 function in bcma, while there is nice lib for this. The problem is we need to calculate crc8 for SPROM which consists of u16 entries. So this requires us to do proper convertion to avoid endianess problems. Do you think it is worth it? Should we do additional convertion just to allow using standard library? Or maybe we should just limit our changes to using crc8_populate_lsb for generating look up table? --- drivers/bcma/Kconfig | 1 + drivers/bcma/sprom.c | 62 ++++++++++--------------------------- drivers/net/wireless/b43/Kconfig | 2 +- 3 files changed, 19 insertions(+), 46 deletions(-) diff --git a/drivers/bcma/Kconfig b/drivers/bcma/Kconfig index 83e9adf..4e28fed 100644 --- a/drivers/bcma/Kconfig +++ b/drivers/bcma/Kconfig @@ -9,6 +9,7 @@ menu "Broadcom specific AMBA" config BCMA tristate "BCMA support" depends on BCMA_POSSIBLE + select CRC8 help Bus driver for Broadcom specific Advanced Microcontroller Bus Architecture. diff --git a/drivers/bcma/sprom.c b/drivers/bcma/sprom.c index ffbb0e3..0ad6f01 100644 --- a/drivers/bcma/sprom.c +++ b/drivers/bcma/sprom.c @@ -9,6 +9,7 @@ #include #include +#include #include #include #include @@ -32,56 +33,27 @@ static void bcma_sprom_read(struct bcma_bus *bus, u16 *sprom) * Validation. **************************************************/ -static inline u8 bcma_crc8(u8 crc, u8 data) -{ - /* Polynomial: x^8 + x^7 + x^6 + x^4 + x^2 + 1 */ - static const u8 t[] = { - 0x00, 0xF7, 0xB9, 0x4E, 0x25, 0xD2, 0x9C, 0x6B, - 0x4A, 0xBD, 0xF3, 0x04, 0x6F, 0x98, 0xD6, 0x21, - 0x94, 0x63, 0x2D, 0xDA, 0xB1, 0x46, 0x08, 0xFF, - 0xDE, 0x29, 0x67, 0x90, 0xFB, 0x0C, 0x42, 0xB5, - 0x7F, 0x88, 0xC6, 0x31, 0x5A, 0xAD, 0xE3, 0x14, - 0x35, 0xC2, 0x8C, 0x7B, 0x10, 0xE7, 0xA9, 0x5E, - 0xEB, 0x1C, 0x52, 0xA5, 0xCE, 0x39, 0x77, 0x80, - 0xA1, 0x56, 0x18, 0xEF, 0x84, 0x73, 0x3D, 0xCA, - 0xFE, 0x09, 0x47, 0xB0, 0xDB, 0x2C, 0x62, 0x95, - 0xB4, 0x43, 0x0D, 0xFA, 0x91, 0x66, 0x28, 0xDF, - 0x6A, 0x9D, 0xD3, 0x24, 0x4F, 0xB8, 0xF6, 0x01, - 0x20, 0xD7, 0x99, 0x6E, 0x05, 0xF2, 0xBC, 0x4B, - 0x81, 0x76, 0x38, 0xCF, 0xA4, 0x53, 0x1D, 0xEA, - 0xCB, 0x3C, 0x72, 0x85, 0xEE, 0x19, 0x57, 0xA0, - 0x15, 0xE2, 0xAC, 0x5B, 0x30, 0xC7, 0x89, 0x7E, - 0x5F, 0xA8, 0xE6, 0x11, 0x7A, 0x8D, 0xC3, 0x34, - 0xAB, 0x5C, 0x12, 0xE5, 0x8E, 0x79, 0x37, 0xC0, - 0xE1, 0x16, 0x58, 0xAF, 0xC4, 0x33, 0x7D, 0x8A, - 0x3F, 0xC8, 0x86, 0x71, 0x1A, 0xED, 0xA3, 0x54, - 0x75, 0x82, 0xCC, 0x3B, 0x50, 0xA7, 0xE9, 0x1E, - 0xD4, 0x23, 0x6D, 0x9A, 0xF1, 0x06, 0x48, 0xBF, - 0x9E, 0x69, 0x27, 0xD0, 0xBB, 0x4C, 0x02, 0xF5, - 0x40, 0xB7, 0xF9, 0x0E, 0x65, 0x92, 0xDC, 0x2B, - 0x0A, 0xFD, 0xB3, 0x44, 0x2F, 0xD8, 0x96, 0x61, - 0x55, 0xA2, 0xEC, 0x1B, 0x70, 0x87, 0xC9, 0x3E, - 0x1F, 0xE8, 0xA6, 0x51, 0x3A, 0xCD, 0x83, 0x74, - 0xC1, 0x36, 0x78, 0x8F, 0xE4, 0x13, 0x5D, 0xAA, - 0x8B, 0x7C, 0x32, 0xC5, 0xAE, 0x59, 0x17, 0xE0, - 0x2A, 0xDD, 0x93, 0x64, 0x0F, 0xF8, 0xB6, 0x41, - 0x60, 0x97, 0xD9, 0x2E, 0x45, 0xB2, 0xFC, 0x0B, - 0xBE, 0x49, 0x07, 0xF0, 0x9B, 0x6C, 0x22, 0xD5, - 0xF4, 0x03, 0x4D, 0xBA, 0xD1, 0x26, 0x68, 0x9F, - }; - return t[crc ^ data]; -} - static u8 bcma_sprom_crc(const u16 *sprom) { - int word; - u8 crc = 0xFF; + u8 crc; + u8 sprom2[SSB_SPROMSIZE_WORDS_R4 * 2 - 1]; + u8 table[CRC8_TABLE_SIZE]; + u16 word; + /* u16 to u8 */ for (word = 0; word < SSB_SPROMSIZE_WORDS_R4 - 1; word++) { - crc = bcma_crc8(crc, sprom[word] & 0x00FF); - crc = bcma_crc8(crc, (sprom[word] & 0xFF00) >> 8); + sprom2[word * 2] = sprom[word] & 0x00FF; + sprom2[(word * 2) + 1] = (sprom[word] & 0xFF00) >> 8; } - crc = bcma_crc8(crc, sprom[SSB_SPROMSIZE_WORDS_R4 - 1] & 0x00FF); + /* 127th byte */ + sprom2[(SSB_SPROMSIZE_WORDS_R4 * 2) - 2] = + sprom[SSB_SPROMSIZE_WORDS_R4 - 1] & 0x00FF; + + /* Prepare table, 0xAB is x^8 + x^7 + x^6 + x^4 + x^2 + 1 */ + crc8_populate_lsb(table, 0xAB); + + /* Calculate */ + crc = crc8(table, sprom2, (SSB_SPROMSIZE_WORDS_R4 * 2) - 1, 0xFF); crc ^= 0xFF; return crc; -- 1.7.3.4