From owner-svn-src-all@freebsd.org  Wed Jan 25 16:10:37 2017
Return-Path: <owner-svn-src-all@freebsd.org>
Delivered-To: svn-src-all@mailman.ysv.freebsd.org
Received: from mx1.freebsd.org (mx1.freebsd.org
 [IPv6:2001:1900:2254:206a::19:1])
 by mailman.ysv.freebsd.org (Postfix) with ESMTP id 19E0ACC10F5;
 Wed, 25 Jan 2017 16:10:37 +0000 (UTC)
 (envelope-from loos@FreeBSD.org)
Received: from repo.freebsd.org (repo.freebsd.org
 [IPv6:2610:1c1:1:6068::e6a:0])
 (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))
 (Client did not present a certificate)
 by mx1.freebsd.org (Postfix) with ESMTPS id CEC017E7;
 Wed, 25 Jan 2017 16:10:36 +0000 (UTC)
 (envelope-from loos@FreeBSD.org)
Received: from repo.freebsd.org ([127.0.1.37])
 by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id v0PGAZiB085454;
 Wed, 25 Jan 2017 16:10:35 GMT (envelope-from loos@FreeBSD.org)
Received: (from loos@localhost)
 by repo.freebsd.org (8.15.2/8.15.2/Submit) id v0PGAZeb085452;
 Wed, 25 Jan 2017 16:10:35 GMT (envelope-from loos@FreeBSD.org)
Message-Id: <201701251610.v0PGAZeb085452@repo.freebsd.org>
X-Authentication-Warning: repo.freebsd.org: loos set sender to
 loos@FreeBSD.org using -f
From: Luiz Otavio O Souza <loos@FreeBSD.org>
Date: Wed, 25 Jan 2017 16:10:35 +0000 (UTC)
To: src-committers@freebsd.org, svn-src-all@freebsd.org,
 svn-src-stable@freebsd.org, svn-src-stable-11@freebsd.org
Subject: svn commit: r312761 - stable/11/sys/arm/ti/cpsw
X-SVN-Group: stable-11
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
X-BeenThere: svn-src-all@freebsd.org
X-Mailman-Version: 2.1.23
Precedence: list
List-Id: "SVN commit messages for the entire src tree \(except for &quot;
 user&quot; and &quot; projects&quot; \)" <svn-src-all.freebsd.org>
List-Unsubscribe: <https://lists.freebsd.org/mailman/options/svn-src-all>,
 <mailto:svn-src-all-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/svn-src-all/>
List-Post: <mailto:svn-src-all@freebsd.org>
List-Help: <mailto:svn-src-all-request@freebsd.org?subject=help>
List-Subscribe: <https://lists.freebsd.org/mailman/listinfo/svn-src-all>,
 <mailto:svn-src-all-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Wed, 25 Jan 2017 16:10:37 -0000

Author: loos
Date: Wed Jan 25 16:10:35 2017
New Revision: 312761
URL: https://svnweb.freebsd.org/changeset/base/312761

Log:
  MFC r312411:
  
  Handle the set capabilities ioctl, letting the hardware checksum be
  disabled (Hi netmap!).
  
  Only remove the CRC bytes from packets when the hardware tell us to do so.
  
  Fixes the 'discard frame w/o leading ethernet header' issues.
  
  Sponsored by:	Rubicon Communications, LLC (Netgate)

Modified:
  stable/11/sys/arm/ti/cpsw/if_cpsw.c
  stable/11/sys/arm/ti/cpsw/if_cpswreg.h
Directory Properties:
  stable/11/   (props changed)

Modified: stable/11/sys/arm/ti/cpsw/if_cpsw.c
==============================================================================
--- stable/11/sys/arm/ti/cpsw/if_cpsw.c	Wed Jan 25 15:54:44 2017	(r312760)
+++ stable/11/sys/arm/ti/cpsw/if_cpsw.c	Wed Jan 25 16:10:35 2017	(r312761)
@@ -1396,6 +1396,16 @@ cpswp_ioctl(struct ifnet *ifp, u_long co
 	ifr = (struct ifreq *)data;
 
 	switch (command) {
+	case SIOCSIFCAP:
+		changed = ifp->if_capenable ^ ifr->ifr_reqcap;
+		if (changed & IFCAP_HWCSUM) {
+			if ((ifr->ifr_reqcap & changed) & IFCAP_HWCSUM)
+				ifp->if_capenable |= IFCAP_HWCSUM;
+			else
+				ifp->if_capenable &= ~IFCAP_HWCSUM;
+		}
+		error = 0;
+		break;
 	case SIOCSIFFLAGS:
 		CPSW_PORT_LOCK(sc);
 		if (ifp->if_flags & IFF_UP) {
@@ -1633,15 +1643,22 @@ cpsw_rx_dequeue(struct cpsw_softc *sc)
 		/* TODO: track SOP/EOP bits to assemble a full mbuf
 		   out of received fragments. */
 		slot->mbuf->m_data += bd.bufoff;
-		slot->mbuf->m_len = bd.pktlen - 4;
-		slot->mbuf->m_pkthdr.len = bd.pktlen - 4;
-		slot->mbuf->m_flags |= M_PKTHDR;
-		slot->mbuf->m_pkthdr.rcvif = psc->ifp;
+		slot->mbuf->m_len = bd.buflen;
+		if (bd.flags & CPDMA_BD_SOP) {
+			slot->mbuf->m_pkthdr.len = bd.pktlen;
+			slot->mbuf->m_pkthdr.rcvif = psc->ifp;
+			slot->mbuf->m_flags |= M_PKTHDR;
+		}
+		slot->mbuf->m_next = NULL;
 		slot->mbuf->m_nextpkt = NULL;
+		if (bd.flags & CPDMA_BD_PASS_CRC)
+			m_adj(slot->mbuf, -ETHER_CRC_LEN);
 
 		if ((psc->ifp->if_capenable & IFCAP_RXCSUM) != 0) {
 			/* check for valid CRC by looking into pkt_err[5:4] */
-			if ((bd.flags & CPDMA_BD_PKT_ERR_MASK) == 0) {
+			if ((bd.flags &
+			    (CPDMA_BD_SOP | CPDMA_BD_PKT_ERR_MASK)) ==
+			    CPDMA_BD_SOP) {
 				slot->mbuf->m_pkthdr.csum_flags |= CSUM_IP_CHECKED;
 				slot->mbuf->m_pkthdr.csum_flags |= CSUM_IP_VALID;
 				slot->mbuf->m_pkthdr.csum_data = 0xffff;

Modified: stable/11/sys/arm/ti/cpsw/if_cpswreg.h
==============================================================================
--- stable/11/sys/arm/ti/cpsw/if_cpswreg.h	Wed Jan 25 15:54:44 2017	(r312760)
+++ stable/11/sys/arm/ti/cpsw/if_cpswreg.h	Wed Jan 25 16:10:35 2017	(r312761)
@@ -191,6 +191,7 @@
 #define	 CPDMA_BD_OWNER			(1 << 13)
 #define	 CPDMA_BD_EOQ			(1 << 12)
 #define	 CPDMA_BD_TDOWNCMPLT		(1 << 11)
+#define	 CPDMA_BD_PASS_CRC		(1 << 10)
 #define	 CPDMA_BD_PKT_ERR_MASK		(3 << 4)
 #define	 CPDMA_BD_TO_PORT		(1 << 4)
 #define	 CPDMA_BD_PORT_MASK		3