Use ether_crc32_be.
authorJoerg Sonnenberger <joerg@dragonflybsd.org>
Wed, 13 Jul 2005 17:03:00 +0000 (17:03 +0000)
committerJoerg Sonnenberger <joerg@dragonflybsd.org>
Wed, 13 Jul 2005 17:03:00 +0000 (17:03 +0000)
Submitted-by: Sepherosa Ziehau <sepherosa@gmail.com>
Obtained-from: FreeBSD

sys/dev/netif/xl/if_xl.c

index cea4069..f35ea91 100644 (file)
@@ -30,7 +30,7 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
  *
  * $FreeBSD: src/sys/pci/if_xl.c,v 1.72.2.28 2003/10/08 06:01:57 murray Exp $
- * $DragonFly: src/sys/dev/netif/xl/if_xl.c,v 1.29 2005/07/13 17:01:31 joerg Exp $
+ * $DragonFly: src/sys/dev/netif/xl/if_xl.c,v 1.30 2005/07/13 17:03:00 joerg Exp $
  */
 
 /*
@@ -236,7 +236,6 @@ static int xl_mii_writereg  (struct xl_softc *, struct xl_mii_frame *);
 
 static void xl_setcfg          (struct xl_softc *);
 static void xl_setmode         (struct xl_softc *, int);
-static u_int8_t xl_calchash    (caddr_t);
 static void xl_setmulti                (struct xl_softc *);
 static void xl_setmulti_hash   (struct xl_softc *);
 static void xl_reset           (struct xl_softc *);
@@ -787,45 +786,6 @@ xl_read_eeprom(sc, dest, off, cnt, swap)
        return(err ? 1 : 0);
 }
 
-/*
- * This routine is taken from the 3Com Etherlink XL manual,
- * page 10-7. It calculates a CRC of the supplied multicast
- * group address and returns the lower 8 bits, which are used
- * as the multicast filter position.
- * Note: the 3c905B currently only supports a 64-bit hash table,
- * which means we really only need 6 bits, but the manual indicates
- * that future chip revisions will have a 256-bit hash table,
- * hence the routine is set up to calculate 8 bits of position
- * info in case we need it some day.
- * Note II, The Sequel: _CURRENT_ versions of the 3c905B have a
- * 256 bit hash table. This means we have to use all 8 bits regardless.
- * On older cards, the upper 2 bits will be ignored. Grrrr....
- */
-static u_int8_t xl_calchash(addr)
-       caddr_t                 addr;
-{
-       u_int32_t               crc, carry;
-       int                     i, j;
-       u_int8_t                c;
-
-       /* Compute CRC for the address value. */
-       crc = 0xFFFFFFFF; /* initial value */
-
-       for (i = 0; i < 6; i++) {
-               c = *(addr + i);
-               for (j = 0; j < 8; j++) {
-                       carry = ((crc & 0x80000000) ? 1 : 0) ^ (c & 0x01);
-                       crc <<= 1;
-                       c >>= 1;
-                       if (carry)
-                               crc = (crc ^ 0x04c11db6) | carry;
-               }
-       }
-
-       /* return the filter bit position */
-       return(crc & 0x000000FF);
-}
-
 /*
  * NICs older than the 3c905B have only one multicast option, which
  * is to enable reception of all multicast frames.
@@ -897,7 +857,22 @@ xl_setmulti_hash(sc)
        LIST_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
                if (ifma->ifma_addr->sa_family != AF_LINK)
                        continue;
-               h = xl_calchash(LLADDR((struct sockaddr_dl *)ifma->ifma_addr));
+
+               /*
+                * Note: the 3c905B currently only supports a 64-bit
+                * hash table, which means we really only need 6 bits,
+                * but the manual indicates that future chip revisions
+                * will have a 256-bit hash table, hence the routine is
+                * set up to calculate 8 bits of position info in case
+                * we need it some day.
+                * Note II, The Sequel: _CURRENT_ versions of the 3c905B
+                * have a 256 bit hash table. This means we have to use
+                * all 8 bits regardless.  On older cards, the upper 2
+                * bits will be ignored. Grrrr....
+                */
+               h = ether_crc32_be(
+                       LLADDR((struct sockaddr_dl *)ifma->ifma_addr),
+                       ETHER_ADDR_LEN) & 0xff;
                CSR_WRITE_2(sc, XL_COMMAND, XL_CMD_RX_SET_HASH|XL_HASH_SET|h);
                mcnt++;
        }