firewire: Use lib/ implementation of CRC ITU-T.

With the CRC ITU-T implementation available in lib/ we can use that instead.

This also fixes a bug in the topology map crc computation.

Signed-off-by: Kristian Hoegsberg <krh@redhat.com>
Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de> (fixed Kconfig)
diff --git a/drivers/firewire/fw-card.c b/drivers/firewire/fw-card.c
index a2de680..2169656 100644
--- a/drivers/firewire/fw-card.c
+++ b/drivers/firewire/fw-card.c
@@ -23,31 +23,22 @@
 #include <linux/errno.h>
 #include <linux/device.h>
 #include <linux/rwsem.h>
+#include <linux/crc-itu-t.h>
 #include "fw-transaction.h"
 #include "fw-topology.h"
 #include "fw-device.h"
 
-/* The lib/crc16.c implementation uses the standard (0x8005)
- * polynomial, but we need the ITU-T (or CCITT) polynomial (0x1021).
- * The implementation below works on an array of host-endian u32
- * words, assuming they'll be transmited msb first. */
-u16
-crc16_itu_t(const u32 *buffer, size_t length)
+int fw_compute_block_crc(u32 *block)
 {
-	int shift, i;
-	u32 data;
-	u16 sum, crc = 0;
+	__be32 be32_block[256];
+	int i, length;
 
-	for (i = 0; i < length; i++) {
-		data = *buffer++;
-		for (shift = 28; shift >= 0; shift -= 4 ) {
-			sum = ((crc >> 12) ^ (data >> shift)) & 0xf;
-			crc = (crc << 4) ^ (sum << 12) ^ (sum << 5) ^ (sum);
-		}
-		crc &= 0xffff;
-	}
+	length = (*block >> 16) & 0xff;
+	for (i = 0; i < length; i++)
+		be32_block[i] = cpu_to_be32(block[i + 1]);
+	*block |= crc_itu_t(0, (u8 *) be32_block, length * 4);
 
-	return crc;
+	return length;
 }
 
 static DECLARE_RWSEM(card_rwsem);
@@ -126,10 +117,8 @@
 	 * assumes that CRC length and info length are identical for
 	 * the bus info block, which is always the case for this
 	 * implementation. */
-	for (i = 0; i < j; i += length + 1) {
-		length = (config_rom[i] >> 16) & 0xff;
-		config_rom[i] |= crc16_itu_t(&config_rom[i + 1], length);
-	}
+	for (i = 0; i < j; i += length + 1)
+		length = fw_compute_block_crc(config_rom + i);
 
 	*config_rom_length = j;