|
@@ -80,6 +80,31 @@ static void tsec_configure_serdes(struct tsec_private *priv)
|
|
|
|
|
|
#ifdef CONFIG_MCAST_TFTP
|
|
|
|
|
|
+/* the 'way' for ethernet-CRC-32. Spliced in from Linux lib/crc32.c
|
|
|
+ * and this is the ethernet-crc method needed for TSEC -- and perhaps
|
|
|
+ * some other adapter -- hash tables
|
|
|
+ */
|
|
|
+#define CRCPOLY_LE 0xedb88320
|
|
|
+static u32 ether_crc(size_t len, unsigned char const *p)
|
|
|
+{
|
|
|
+ int i;
|
|
|
+ u32 crc;
|
|
|
+
|
|
|
+ crc = ~0;
|
|
|
+ while (len--) {
|
|
|
+ crc ^= *p++;
|
|
|
+ for (i = 0; i < 8; i++)
|
|
|
+ crc = (crc >> 1) ^ ((crc & 1) ? CRCPOLY_LE : 0);
|
|
|
+ }
|
|
|
+ /* an reverse the bits, cuz of way they arrive -- last-first */
|
|
|
+ crc = (crc >> 16) | (crc << 16);
|
|
|
+ crc = (crc >> 8 & 0x00ff00ff) | (crc << 8 & 0xff00ff00);
|
|
|
+ crc = (crc >> 4 & 0x0f0f0f0f) | (crc << 4 & 0xf0f0f0f0);
|
|
|
+ crc = (crc >> 2 & 0x33333333) | (crc << 2 & 0xcccccccc);
|
|
|
+ crc = (crc >> 1 & 0x55555555) | (crc << 1 & 0xaaaaaaaa);
|
|
|
+ return crc;
|
|
|
+}
|
|
|
+
|
|
|
/* CREDITS: linux gianfar driver, slightly adjusted... thanx. */
|
|
|
|
|
|
/* Set the appropriate hash bit for the given addr */
|