Module Name:    src
Committed By:   nisimura
Date:           Wed Sep 23 23:38:24 UTC 2020

Modified Files:
        src/sys/arch/arm/sociox: if_ave.c

Log Message:
note more about AVE EMAC design


To generate a diff of this commit:
cvs rdiff -u -r1.16 -r1.17 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.16 src/sys/arch/arm/sociox/if_ave.c:1.17
--- src/sys/arch/arm/sociox/if_ave.c:1.16	Fri Mar 27 13:00:22 2020
+++ src/sys/arch/arm/sociox/if_ave.c	Wed Sep 23 23:38:24 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_ave.c,v 1.16 2020/03/27 13:00:22 nisimura Exp $	*/
+/*	$NetBSD: if_ave.c,v 1.17 2020/09/23 23:38:24 nisimura Exp $	*/
 
 /*-
  * Copyright (c) 2020 The NetBSD Foundation, Inc.
@@ -36,7 +36,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_ave.c,v 1.16 2020/03/27 13:00:22 nisimura Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_ave.c,v 1.17 2020/09/23 23:38:24 nisimura Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -63,6 +63,41 @@ __KERNEL_RCSID(0, "$NetBSD: if_ave.c,v 1
 
 #define NOT_MP_SAFE	(0)
 
+/*
+ * AVE has two different, rather obscure, descriptor formats. 32-bit
+ * paddr descriptor layout occupies 8 bytes while 64-bit paddr descriptor
+ * does 12 bytes. AVE is a derivative of Synopsys DesignWare Core
+ * EMAC.
+ */
+struct tdes {
+	uint32_t t0, t1, t2;
+};
+
+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 */
+#define T0_DONEOK	(1U<<27)	/* status - Tx completed ok */
+#define T0_FS		(1U<<26)	/* first segment of frame */
+#define T0_LS		(1U<<25)	/* last segment of frame */
+#define T0_OWC		(1U<<21)	/* status - out of win. late coll. */
+#define T0_ECOL		(1U<<20)	/* status - excess collision */
+#define T0_TBS_MASK	0xffff		/* T0 segment length 15:0 */
+/* T1 segment address 31:0 */
+/* T2 segment address 63:32 */
+#define R0_OWN		(1U<<31)	/* desc is empty */
+#define R0_CSUM		(1U<<21)	/* receive checksum done */
+#define R0_CERR		(1U<<20)	/* csum found negative */
+#define R0_FL_MASK	0x07ff		/* R0 frame length 10:0 */
+/* R1 frame address 31:0 */
+/* R2 frame address 63:32 */
+
 #define AVEID		0x000		/* hardware ID */
 #define AVEHWVER	0x004		/* hardware version */
 #define AVEGR		0x008		/* chip global control */
@@ -107,17 +142,14 @@ __KERNEL_RCSID(0, "$NetBSD: if_ave.c,v 1
 #define  DESCC_RD0	(1U<<3)		/* activate Rx0 descriptor to run */
 #define DESCC_RSTP	(1U<<2)		/* pause Rx descriptor */
 #define  DESCC_TD	(1U<<0)		/* activate Tx descriptor to run */
-					/* 31:16 status report to read */
+/* 31:16 status report to read */
 #define AVETXDES	0x304		/* Tx descriptor control */
-					/* 27:16 Tx descriptor byte count
-					 * 11:0 start address offset */
+/* 27:16 Tx descriptor byte count, 11:0 start address offset */
 #define AVERXDES0	0x308		/* Rx0 descriptor control */
-					/* 30:16 Rx descriptor byte count
-					 * 14:0 start address offset */
+/* 30:16 Rx descriptor byte count, 14:0 start address offset */
 #define AVEITIRQC	0x34c		/* interval IRQ control */
 #define  ITIRQC_R0E	(1U<<27)	/* enable Rx0 interval timer */
-#define  INTMVAL	(20<<16)	/* INTM value */
-					/* 15:0 interval timer count */
+#define  INTMVAL	(20<<16)	/* 15:0 interval timer count */
 
 #define AVEAFB		0x0800		/* address filter base */
 #define AVEAFMSKB	0x0d00		/* byte mask base */
@@ -128,47 +160,21 @@ __KERNEL_RCSID(0, "$NetBSD: if_ave.c,v 1
 #define AVEAFRING	0x0f00		/* entry ring number selector */
 #define AVEAFEN		0x0ffc		/* entry enable bit vector */
 
-#define AVETDB		0x1000	/* 64bit Tx descriptor store, upto 256 */
-#define AVERDB		0x1c00	/* 64bit Rx descriptor store, upto 2048 */
-#define AVE32TDB	0x1000	/* 32bit Tx store base, upto 256 */
-#define AVE32RDB	0x1800	/* 32bit Rx store base, upto 2048 */
+/* AVE has internal cache coherent memory tol hold descriptor arrays. */
+#define AVETDB		0x1000		/* 64-bit Tx desc store, upto 256 */
+#define AVERDB		0x1c00		/* 64-bit Rx desc store, upto 2048 */
+#define AVE32TDB	0x1000		/* 32-bit Tx store base, upto 256 */
+#define AVE32RDB	0x1800		/* 32-bit Rx store base, upto 2048 */
 
 #define AVERMIIC	0x8028		/* RMII control */
 #define  RMIIC_RST	(1U<<16)	/* reset operation */
 #define AVELINKSEL	0x8034		/* RMII speed selection */
 #define  LINKSEL_SPD100	(1U<<0)		/* use 100Mbps */
 
-/*
- * descriptor size is 12 bytes when 64bit paddr design, 8 bytes otherwise.
- */
-struct tdes {
-	uint32_t t0, t1, t2;
-};
-
-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 */
-#define T0_DONEOK	(1U<<27)	/* status - Tx completed ok */
-#define T0_FS		(1U<<26)	/* first segment of frame */
-#define T0_LS		(1U<<25)	/* last segment of frame */
-#define T0_OWC		(1U<<21)	/* status - out of win. late coll. */
-#define T0_ECOL		(1U<<20)	/* status - excess collision */
-#define T0_TBS_MASK	0xffff		/* T0 segment length 15:0 */
-/* T1 segment address 31:0 */
-/* T2 segment address 63:32 */
-#define R0_OWN		(1U<<31)	/* desc is empty */
-#define R0_CSUM		(1U<<21)	/* receive checksum done */
-#define R0_CERR		(1U<<20)	/* csum found negative */
-#define R0_FL_MASK	0x07ff		/* R0 frame length 10:0 */
-/* R1 frame address 31:0 */
-/* R2 frame address 63:32 */
+#define CSR_READ(sc, off) \
+	    bus_space_read_4((sc)->sc_st, (sc)->sc_sh, (off))
+#define CSR_WRITE(sc, off, val) \
+	    bus_space_write_4((sc)->sc_st, (sc)->sc_sh, (off), (val))
 
 #define MD_NTXSEGS		16		/* fixed */
 #define MD_TXQUEUELEN		(MD_NTXDESC / MD_NTXSEGS)
@@ -261,11 +267,6 @@ static void txreap(struct ave_softc *);
 static void rxintr(struct ave_softc *);
 static int add_rxbuf(struct ave_softc *, int);
 
-#define CSR_READ(sc, off) \
-	    bus_space_read_4((sc)->sc_st, (sc)->sc_sh, (off))
-#define CSR_WRITE(sc, off, val) \
-	    bus_space_write_4((sc)->sc_st, (sc)->sc_sh, (off), (val))
-
 struct desops {
 	void (*make_tdes)(void *, int, int, int);
 	void (*mark_txfs)(void *, int);
@@ -405,7 +406,7 @@ ave_fdt_attach(device_t parent, device_t
 	DELAY(40);
 	CSR_WRITE(sc, AVEGIMR, 0);
 
-	/* Read the Ethernet MAC address from the EEPROM. */
+	/* Ethernet MAC address is auto-loaded from EEPROM. */
 	csr = CSR_READ(sc, AVEMACL);
 	enaddr[0] = csr;
 	enaddr[1] = csr >> 8;

Reply via email to