On 06/15/2011 08:29 PM, RafaÅ MiÅecki wrote:
W dniu 15 czerwca 2011 14:09 uÅytkownik Arend van Spriel
<arend@xxxxxxxxxxxx> napisaÅ:
On 06/15/2011 01:53 PM, RafaÅ MiÅecki wrote:
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;
You could do (I think):
crc8_populate_lsb(table, 0xAB);
for (word = 0; word< SSB_SPROMSIZE_WORDS_R4; word++) {
u16 val = cpu_to_le16(sprom[word]);
crc = crc8(table,&val, sizeof(u16), crc);
}
Maybe not a perfect/optimal solution (crc8 focuses on tables, we do
double loop instead) but should work. Thanks for the tip.
Agree. In brcm80211 we convert the entire sprom, calculate, and convert
it back. Also not perfect I think as it loops over de sprom data twice.
Gr. AvS
--
Almost nobody dances sober, unless they happen to be insane.
-- H.P. Lovecraft --
--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html