Module Name: src Committed By: nisimura Date: Thu Mar 26 10:38:16 UTC 2020
Modified Files: src/sys/arch/arm/sociox: if_scx.c Log Message: update register definition. from UEFI source code. To generate a diff of this commit: cvs rdiff -u -r1.16 -r1.17 src/sys/arch/arm/sociox/if_scx.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/arm/sociox/if_scx.c diff -u src/sys/arch/arm/sociox/if_scx.c:1.16 src/sys/arch/arm/sociox/if_scx.c:1.17 --- src/sys/arch/arm/sociox/if_scx.c:1.16 Thu Mar 26 08:28:50 2020 +++ src/sys/arch/arm/sociox/if_scx.c Thu Mar 26 10:38:16 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: if_scx.c,v 1.16 2020/03/26 08:28:50 nisimura Exp $ */ +/* $NetBSD: if_scx.c,v 1.17 2020/03/26 10:38:16 nisimura Exp $ */ /*- * Copyright (c) 2020 The NetBSD Foundation, Inc. @@ -40,14 +40,14 @@ * to designify ring number from which to arrive or to which go. * - memory mapped EEPROM to hold MAC address. The rest of the area is * occupied by a set of ucode for two DMA engines and one packet engine. - * - The size of frame address filter is unknown. Might be 16 or even 128. + * - The size of frame address filter is 16 plus 32. * - The first slot is my own station address. Always enabled to perform * to identify oneself. * - 1~16 are for supplimental MAC addresses. Independently enabled for * use. Good to catch multicast. Byte-wise selective match available. * Use the mask to catch { 0x01, 0x00, 0x00 } and/or { 0x33, 0x33 }. - * - 16~128 might be exact match without byte-mask. - * - The size of multicast hash filter store is unknown. Might be 256 bit. + * - 16~32 might be exact match without byte-mask. + * - The size of multicast hash filter store is 64 bit. * - Socionext/Linaro "NetSec" code makes many cut shorts. Some constants * are left unexplained. The values should be handled via external * controls like FDT descriptions. Fortunately, Intel/Altera CycloneV PDFs @@ -57,7 +57,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_scx.c,v 1.16 2020/03/26 08:28:50 nisimura Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_scx.c,v 1.17 2020/03/26 10:38:16 nisimura Exp $"); #include <sys/param.h> #include <sys/bus.h> @@ -86,6 +86,8 @@ __KERNEL_RCSID(0, "$NetBSD: if_scx.c,v 1 /* SC2A11 register block */ #define SWRESET 0x104 +#define MACADRH 0x10c +#define MACADRL 0x110 #define COMINIT 0x120 #define INTRST 0x200 #define IRQ_RX (1U<<1) @@ -115,8 +117,8 @@ __KERNEL_RCSID(0, "$NetBSD: if_scx.c,v 1 #define H2MENG 0x210 /* DMAC host2media ucode port */ #define M2HENG 0x21c /* DMAC media2host ucode port */ #define PKTENG 0x0d0 /* packet engine ucode port */ -#define HWVER0 0x22c -#define HWVER1 0x230 +#define MCVER 0x22c /* micro controller version */ +#define HWVER 0x230 /* hardware version */ #define MACSTAT 0x1024 /* gmac status */ #define MACDATA 0x11c0 /* gmac rd/wr data */ @@ -154,8 +156,8 @@ __KERNEL_RCSID(0, "$NetBSD: if_scx.c,v 1 #define AFR_UHTE (1U<<1) /* use additional MAC addresses */ #define AFR_PM (1U<<0) /* run promisc mode */ #define _AFR 0x80000001 /* XXX TBD */ -#define GMACMHTH 0x0008 /* XXX multicast hash table 63:32 */ -#define GMACMHTL 0x000c /* XXX multicast hash table 31:0 */ +#define GMACMHTH 0x0008 /* multicast hash table 63:32 */ +#define GMACMHTL 0x000c /* multicast hash table 31:0 */ #define GMACGAR 0x0010 /* MDIO operation */ #define GAR_PHY (11) /* mii phy 15:11 */ #define GAR_REG (6) /* mii reg 10:6 */ @@ -180,13 +182,13 @@ __KERNEL_RCSID(0, "$NetBSD: if_scx.c,v 1 * 2 125Mhz (1000Mbps) * 1 full duplex detected */ -#define GMACMHT0 0x0500 /* multicast hash table 0 - 7 */ +#define GMACMHT0 0x0500 /* XXX multicast hash table 0 - 7 */ #define GMACMHT(i) ((i)*4+0x500) #define GMACVHT 0x0588 /* VLAN tag hash */ -#define GMACAMAH(i) ((i)*8+0x800) /* supplimental MAC addr 16-127 */ +#define GMACAMAH(i) ((i)*8+0x800) /* supplimental MAC addr 16-31 */ #define GMACAMAL(i) ((i)*8+0x804) +#define GMACEVCTL 0x0100 /* event counter control */ #define GMACEVCNT(i) ((i)*4+0x114) /* event counter 0x114~284 */ -#define GMACEVCTL 0x0100 /* clear event counter registers */ #define GMACBMR 0x1000 /* DMA bus mode control * 24 4PBL @@ -613,7 +615,7 @@ scx_attach_i(struct scx_softc *sc) uint32_t csr; int i, nseg, error = 0; - hwver = CSR_READ(sc, HWVER1); /* Socionext HW */ + hwver = CSR_READ(sc, HWVER); /* Socionext HW */ /* stored in big endian order */ csr = bus_space_read_4(sc->sc_st, sc->sc_eesh, 0); enaddr[0] = csr >> 24; @@ -953,7 +955,7 @@ scx_set_rcvfilt(struct scx_softc *sc) struct ifnet * const ifp = &ec->ec_if; struct ether_multistep step; struct ether_multi *enm; - uint32_t mchash[8]; /* 8x 32 = 256 bit */ + uint32_t mchash[2]; /* 2x 32 = 64 bit */ uint32_t csr, crc; int i; @@ -972,9 +974,8 @@ scx_set_rcvfilt(struct scx_softc *sc) /* clear 15 entry supplimental perfect match filter */ for (i = 1; i < 16; i++) mac_write(sc, GMACMAH(i), 0); - /* build 256 bit multicast hash filter */ - memset(mchash, 0, sizeof(mchash)); - crc = 0; + /* build 64 bit multicast hash filter */ + crc = mchash[1] = mchash[0] = 0; ETHER_FIRST_MULTI(step, ec, enm); i = 1; /* slot 0 is occupied */ @@ -1006,8 +1007,8 @@ printf("[%d] %s\n", i, ether_sprintf(enm /* use hash table when too many */ /* bit_reserve_32(~crc) !? */ crc = ether_crc32_le(enm->enm_addrlo, ETHER_ADDR_LEN); - /* 3(31:29) 5(28:24) bit sampling */ - mchash[crc >> 29] |= 1 << ((crc >> 24) & 0x1f); + /* 1(31) 5(30:26) bit sampling */ + mchash[crc >> 31] |= 1 << ((crc >> 26) & 0x1f); } ETHER_NEXT_MULTI(step, enm); i++; @@ -1016,8 +1017,8 @@ printf("[%d] %s\n", i, ether_sprintf(enm if (crc) csr |= AFR_MHTE; - for (i = 0; i < __arraycount(mchash); i++) - mac_write(sc, GMACMHT(i), mchash[i]); + mac_write(sc, GMACMHTH, mchash[1]); + mac_write(sc, GMACMHTL, mchash[0]); mac_write(sc, GMACAFR, csr); return;