summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorChris Packham <judge.packham@gmail.com>2018-11-26 11:00:28 +0300
committerJoe Hershberger <joe.hershberger@ni.com>2019-01-24 20:35:29 +0300
commit1a4af5c562fdb9f5a884a53f136f2b2075ffd1d8 (patch)
tree930fb7f2c560b83bfc5a78b5f10a2eb2143570c1 /drivers
parente57c9fdb042741e4049661074c25e7b7ff8a68cc (diff)
downloadu-boot-1a4af5c562fdb9f5a884a53f136f2b2075ffd1d8.tar.xz
net: move ether_crc to tsec driver
ether_crc was added to the core net code in commit 53a5c424bf86 ("multicast tftp: RFC2090") so that other drivers could use it. However the only current user of it is tsec.c so move it there. Signed-off-by: Chris Packham <judge.packham@gmail.com> Acked-by: Joe Hershberger <joe.hershberger@ni.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/net/tsec.c25
1 files changed, 25 insertions, 0 deletions
diff --git a/drivers/net/tsec.c b/drivers/net/tsec.c
index 03a46da2f8..9a4fab85e9 100644
--- a/drivers/net/tsec.c
+++ b/drivers/net/tsec.c
@@ -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 */