Module Name: src Committed By: nisimura Date: Sat Mar 21 04:35:20 UTC 2020
Modified Files: src/sys/arch/arm/sociox: if_ave.c Log Message: more on toward dual descriptor design To generate a diff of this commit: cvs rdiff -u -r1.4 -r1.5 src/sys/arch/arm/sociox/if_ave.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_ave.c diff -u src/sys/arch/arm/sociox/if_ave.c:1.4 src/sys/arch/arm/sociox/if_ave.c:1.5 --- src/sys/arch/arm/sociox/if_ave.c:1.4 Sat Mar 21 01:17:51 2020 +++ src/sys/arch/arm/sociox/if_ave.c Sat Mar 21 04:35:20 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: if_ave.c,v 1.4 2020/03/21 01:17:51 nisimura Exp $ */ +/* $NetBSD: if_ave.c,v 1.5 2020/03/21 04:35:20 nisimura Exp $ */ /*- * Copyright (c) 2020 The NetBSD Foundation, Inc. @@ -34,7 +34,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_ave.c,v 1.4 2020/03/21 01:17:51 nisimura Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_ave.c,v 1.5 2020/03/21 04:35:20 nisimura Exp $"); #include <sys/param.h> #include <sys/bus.h> @@ -125,16 +125,13 @@ __KERNEL_RCSID(0, "$NetBSD: if_ave.c,v 1 #define AVEAFRING 0x0f00 /* entry ring number selector */ #define AVEAFEN 0x0ffc /* entry enable bit vector */ -#ifdef _LP64 #define AVETDB 0x1000 /* 64bit Tx descriptor storage base */ #define AVERDB 0x1c00 /* 64bit Rx descriptor storage base */ -#else -#define AVETDB 0x1000 /* 32bit Tx descriptor storage base */ -#define AVERDB 0x1800 /* 32bit Rx descriptor storage base */ -#endif +#define AVE32TDB 0x1000 /* 32bit Tx descriptor storage base */ +#define AVE32RDB 0x1800 /* 32bit Rx descriptor storage base */ /* - * descriptor size is 12 bytes when _LP64, 8 bytes otherwise. + * descriptor size is 12 bytes when 64bit paddr design, 8 bytes otherwise. * 3KB/24KB split or 64bit paddr Tx/Rx descriptor storage. * 2KB/16KB split or 32bit paddr Tx/Rx descriptor storage. */ @@ -146,6 +143,9 @@ struct rdes { uint32_t r0, r1, r2; }; +struct tdes32 { uint32_t t0, t1; }; +struct rdes32 { uint32_t r0, r1; }; + #define T0_OWN (1U<<31) /* desc is ready to Tx */ #define T0_IOC (1U<<29) /* post interrupt on Tx completes */ #define T0_NOCSUM (1U<<28) /* inhibit checksum operation */ @@ -177,7 +177,6 @@ struct rdes { #define AVE_NRXDESC_MASK (AVE_NRXDESC - 1) #define AVE_NEXTRX(x) (((x) + 1) & AVE_NRXDESC_MASK) -#ifdef _LP64 #define AVE_INIT_RXDESC(sc, x) \ do { \ struct ave_rxsoft *__rxs = &(sc)->sc_rxsoft[(x)]; \ @@ -189,18 +188,17 @@ do { \ __rxd->r1 = htole32(BUS_ADDR_LO32(__paddr)); \ __rxd->r0 = R0_OWN | R0_FL_MASK; \ } while (/*CONSTCOND*/0) -#else -#define AVE_INIT_RXDESC(sc, x) \ + +#define AVE32_INIT_RXDESC(sc, x) \ do { \ struct ave_rxsoft *__rxs = &(sc)->sc_rxsoft[(x)]; \ - struct rdes *__rxd = &(sc)->sc_rxdescs[(x)]; \ + struct rdes32 *__rxd = &(sc)->sc_rxd32[(x)]; \ struct mbuf *__m = __rxs->rxs_mbuf; \ bus_addr_t __paddr =__rxs->rxs_dmamap->dm_segs[0].ds_addr; \ __m->m_data = __m->m_ext.ext_buf; \ __rxd->r1 = htole32(__paddr); \ __rxd->r0 = R0_OWN | R0_FL_MASK; \ } while (/*CONSTCOND*/0) -#endif struct ave_txsoft { struct mbuf *txs_mbuf; /* head of our mbuf chain */ @@ -236,6 +234,8 @@ struct ave_softc { struct tdes *sc_txdescs; /* PTR to tdes [NTXDESC] array */ struct rdes *sc_rxdescs; /* PTR to rdes [NRXDESC] array */ + struct tdes32 *sc_txd32; + struct rdes32 *sc_rxd32; struct ave_txsoft sc_txsoft[AVE_TXQUEUELEN]; struct ave_rxsoft sc_rxsoft[AVE_NRXDESC]; @@ -515,6 +515,8 @@ ave_init(struct ifnet *ifp) /* set ptr to Tx/Rx descriptor store */ sc->sc_txdescs = (void *)((uintptr_t)sc->sc_sh + AVETDB); sc->sc_rxdescs = (void *)((uintptr_t)sc->sc_sh + AVERDB); + sc->sc_txd32 = (void *)((uintptr_t)sc->sc_sh + AVE32TDB); + sc->sc_rxd32 = (void *)((uintptr_t)sc->sc_sh + AVE32RDB); /* build sane and loaded Tx/Rx descriptors */ memset(sc->sc_txdescs, 0, sizeof(struct tdes)*AVE_NTXDESC); @@ -969,12 +971,8 @@ ave_start(struct ifnet *ifp) * yet. That could cause a race condition. * We'll do it below. */ -#ifdef _LP64 tdes->t2 = htole32(BUS_ADDR_HI32(paddr)); tdes->t1 = htole32(BUS_ADDR_LO32(paddr)); -#else - tdes->t1 = htole32(paddr); -#endif tdes->t0 = tdes0 | sc->sc_t0csum | (dmamap->dm_segs[seg].ds_len & T0_TBS_MASK); tdes0 = T0_OWN; /* 2nd and other segments */