Module Name:    src
Committed By:   jmcneill
Date:           Sun Oct  1 15:05:10 UTC 2017

Modified Files:
        src/sys/arch/arm/sunxi: sunxi_emac.c sunxi_emac.h

Log Message:
Disable poorly implemented tx interrupt mitigation code, fix checksum
offload support.


To generate a diff of this commit:
cvs rdiff -u -r1.7 -r1.8 src/sys/arch/arm/sunxi/sunxi_emac.c
cvs rdiff -u -r1.3 -r1.4 src/sys/arch/arm/sunxi/sunxi_emac.h

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/sunxi/sunxi_emac.c
diff -u src/sys/arch/arm/sunxi/sunxi_emac.c:1.7 src/sys/arch/arm/sunxi/sunxi_emac.c:1.8
--- src/sys/arch/arm/sunxi/sunxi_emac.c:1.7	Tue Sep 19 17:26:45 2017
+++ src/sys/arch/arm/sunxi/sunxi_emac.c	Sun Oct  1 15:05:09 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: sunxi_emac.c,v 1.7 2017/09/19 17:26:45 jmcneill Exp $ */
+/* $NetBSD: sunxi_emac.c,v 1.8 2017/10/01 15:05:09 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2016-2017 Jared McNeill <jmcne...@invisible.ca>
@@ -33,7 +33,7 @@
 #include "opt_net_mpsafe.h"
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sunxi_emac.c,v 1.7 2017/09/19 17:26:45 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sunxi_emac.c,v 1.8 2017/10/01 15:05:09 jmcneill Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -95,7 +95,6 @@ __KERNEL_RCSID(0, "$NetBSD: sunxi_emac.c
 #define	BURST_LEN_DEFAULT	8
 #define	RX_TX_PRI_DEFAULT	0
 #define	PAUSE_TIME_DEFAULT	0x400
-#define	TX_INTERVAL_DEFAULT	64
 
 /* syscon EMAC clock register */
 #define	EMAC_CLK_EPHY_ADDR	(0x1f << 20)	/* H3 */
@@ -125,9 +124,6 @@ static int sunxi_emac_rx_tx_pri = RX_TX_
 /* Pause time field in the transmitted control frame */
 static int sunxi_emac_pause_time = PAUSE_TIME_DEFAULT;
 
-/* Request a TX interrupt every <n> descriptors */
-static int sunxi_emac_tx_interval = TX_INTERVAL_DEFAULT;
-
 enum sunxi_emac_type {
 	EMAC_A83T = 1,
 	EMAC_H3,
@@ -337,8 +333,6 @@ sunxi_emac_setup_txdesc(struct sunxi_ema
 	} else {
 		status = TX_DESC_CTL;
 		size = flags | len;
-		if ((index & (sunxi_emac_tx_interval - 1)) == 0)
-			size |= TX_INT_CTL;
 		++sc->tx.queued;
 	}
 
@@ -380,7 +374,7 @@ sunxi_emac_setup_txbuf(struct sunxi_emac
 	for (cur = index, i = 0; i < nsegs; i++) {
 		sc->tx.buf_map[cur].mbuf = (i == 0 ? m : NULL);
 		if (i == nsegs - 1)
-			flags |= TX_LAST_DESC;
+			flags |= TX_LAST_DESC | TX_INT_CTL;
 
 		sunxi_emac_setup_txdesc(sc, cur, flags, segs[i].ds_addr,
 		    segs[i].ds_len);
@@ -740,15 +734,14 @@ sunxi_emac_rxintr(struct sunxi_emac_soft
 
 			if ((ifp->if_capenable & IFCAP_CSUM_IPv4_Rx) != 0 &&
 			    (status & RX_FRM_TYPE) != 0) {
-				m->m_pkthdr.csum_flags = M_CSUM_IPv4;
+				m->m_pkthdr.csum_flags = M_CSUM_IPv4 |
+				    M_CSUM_TCPv4 | M_CSUM_UDPv4;
 				if ((status & RX_HEADER_ERR) != 0)
 					m->m_pkthdr.csum_flags |=
 					    M_CSUM_IPv4_BAD;
-				if ((status & RX_PAYLOAD_ERR) == 0) {
+				if ((status & RX_PAYLOAD_ERR) != 0)
 					m->m_pkthdr.csum_flags |=
-					    M_CSUM_DATA;
-					m->m_pkthdr.csum_data = 0xffff;
-				}
+					    M_CSUM_TCP_UDP_BAD;
 			}
 
 			++npkt;

Index: src/sys/arch/arm/sunxi/sunxi_emac.h
diff -u src/sys/arch/arm/sunxi/sunxi_emac.h:1.3 src/sys/arch/arm/sunxi/sunxi_emac.h:1.4
--- src/sys/arch/arm/sunxi/sunxi_emac.h:1.3	Sat Sep 30 10:29:10 2017
+++ src/sys/arch/arm/sunxi/sunxi_emac.h	Sun Oct  1 15:05:09 2017
@@ -47,24 +47,39 @@
 #define	 BASIC_CTL_RX_TX_PRI	(1 << 1)
 #define	 BASIC_CTL_SOFT_RST	(1 << 0)
 #define	EMAC_INT_STA		0x08
-#define	 RX_BUF_UA_INT		(1 << 10)
+#define	 RGMII_LINK_STA_INT	(1 << 16)
+#define	 RX_EARLY_INT		(1 << 13)
+#define	 RX_OVERFLOW_INT	(1 << 12)
+#define	 RX_TIMEOUT_INT		(1 << 11)
+#define	 RX_DMA_STOPPED_INT	(1 << 10)
+#define	 RX_BUF_UA_INT		(1 << 9)
 #define	 RX_INT			(1 << 8)
+#define	 TX_EARLY_INT		(1 << 5)
 #define	 TX_UNDERFLOW_INT	(1 << 4)
+#define	 TX_TIMEOUT_INT		(1 << 3)
 #define	 TX_BUF_UA_INT		(1 << 2)
 #define	 TX_DMA_STOPPED_INT	(1 << 1)
 #define	 TX_INT			(1 << 0)
 #define	EMAC_INT_EN		0x0c
-#define	 RX_BUF_UA_INT_EN	(1 << 10)
+#define	 RX_EARLY_INT_EN	(1 << 13)
+#define	 RX_OVERFLOW_INT_EN	(1 << 12)
+#define	 RX_TIMEOUT_INT_EN	(1 << 11)
+#define	 RX_DMA_STOPPED_INT_EN	(1 << 10)
+#define	 RX_BUF_UA_INT_EN	(1 << 9)
 #define	 RX_INT_EN		(1 << 8)
+#define	 TX_EARLY_INT_EN	(1 << 5)
 #define	 TX_UNDERFLOW_INT_EN	(1 << 4)
+#define	 TX_TIMEOUT_INT_EN	(1 << 3)
 #define	 TX_BUF_UA_INT_EN	(1 << 2)
 #define	 TX_DMA_STOPPED_INT_EN	(1 << 1)
 #define	 TX_INT_EN		(1 << 0)
 #define	EMAC_TX_CTL_0		0x10
 #define	 TX_EN			(1 << 31)
+#define	 TX_FRM_LEN_CTL		(1 << 30)
 #define	EMAC_TX_CTL_1		0x14
 #define	 TX_DMA_START		(1 << 31)
 #define	 TX_DMA_EN		(1 << 30)
+#define	 TX_TH			(0x7 << 8)
 #define	 TX_NEXT_FRAME		(1 << 2)
 #define	 TX_MD			(1 << 1)
 #define	 FLUSH_TX_FIFO		(1 << 0)
@@ -75,14 +90,23 @@
 #define	EMAC_TX_DMA_LIST	0x20
 #define	EMAC_RX_CTL_0		0x24
 #define	 RX_EN			(1 << 31)
+#define	 RX_FRM_LEN_CTL		(1 << 30)
 #define	 JUMBO_FRM_EN		(1 << 29)
 #define	 STRIP_FCS		(1 << 28)
 #define	 CHECK_CRC		(1 << 27)
+#define	 RX_PAUSE_FRM_MD	(1 << 17)
 #define	 RX_FLOW_CTL_EN		(1 << 16)
 #define	EMAC_RX_CTL_1		0x28
 #define	 RX_DMA_START		(1 << 31)
 #define	 RX_DMA_EN		(1 << 30)
+#define	 RX_FIFO_FLOW_CTL	(1 << 24)
+#define	 RX_FLOW_CTL_TH_DEACT	(0x3 << 22)
+#define	 RX_FLOW_CTL_TH_ACT	(0x3 << 20)
+#define	 RX_TH			(0x3 << 4)
+#define	 RX_ERR_FRM		(1 << 3)
+#define	 RX_RUNT_FRM		(1 << 2)
 #define	 RX_MD			(1 << 1)
+#define	 FLUSH_RX_FRM		(1 << 0)
 #define	EMAC_RX_DMA_LIST	0x34
 #define	EMAC_RX_FRM_FLT		0x38
 #define	 DIS_ADDR_FILTER	(1 << 31)
@@ -167,11 +191,13 @@ struct sunxi_emac_desc {
 #define	TX_CHECKSUM_CTL_FULL	3
 #define	TX_CHECKSUM_CTL_SHIFT	27
 #define	TX_CRC_CTL		(1 << 26)
-#define	TX_BUF_SIZE		(0xfff << 0)
+#define	TX_CHAIN_DESC		(1 << 24)
+#define	TX_BUF_SIZE		(0x7ff << 0)
 #define	TX_BUF_SIZE_SHIFT	0
 /* Receive */
 #define	RX_INT_CTL		(1 << 31)
-#define	RX_BUF_SIZE		(0xfff << 0)
+#define	RX_CHAIN_DESC		(1 << 24)
+#define	RX_BUF_SIZE		(0x7ff << 0)
 #define	RX_BUF_SIZE_SHIFT	0
 
 	uint32_t	addr;

Reply via email to