svn commit: r209396 - user/jmallett/octeon/sys/mips/cavium/octe

Juli Mallett jmallett at FreeBSD.org
Mon Jun 21 14:25:45 UTC 2010


Author: jmallett
Date: Mon Jun 21 14:25:44 2010
New Revision: 209396
URL: http://svn.freebsd.org/changeset/base/209396

Log:
  o) Support TCP and UDP checksum offload.
     XXX We also check IP on input but don't insert IP on output, so it would
         sure be nice to have a way to signal support for RXCSUM != TXCSUM.
  o) Note support for VLAN MTUs as well as hardware VLAN tagging.
  o) Attempt to use hardware VLAN tagging on receive; I haven't yet gotten this
     to work and there isn't an obvious way to insert tags on transmit that I've
     found yet, either.
  o) Remove a stale comment about MII.

Modified:
  user/jmallett/octeon/sys/mips/cavium/octe/ethernet-rx.c
  user/jmallett/octeon/sys/mips/cavium/octe/ethernet-tx.c
  user/jmallett/octeon/sys/mips/cavium/octe/octe.c

Modified: user/jmallett/octeon/sys/mips/cavium/octe/ethernet-rx.c
==============================================================================
--- user/jmallett/octeon/sys/mips/cavium/octe/ethernet-rx.c	Mon Jun 21 13:59:49 2010	(r209395)
+++ user/jmallett/octeon/sys/mips/cavium/octe/ethernet-rx.c	Mon Jun 21 14:25:44 2010	(r209396)
@@ -326,6 +326,11 @@ void cvm_oct_tasklet_rx(void *context, i
 					m->m_pkthdr.csum_data = 0xffff;
 				}
 
+				if (work->word2.s.vlan_valid) {
+					m->m_pkthdr.ether_vtag = work->word2.s.vlan_id;
+					m->m_flags |= M_VLANTAG;
+				}
+
 				if (priv->intercept_cb) {
 					callback_result = priv->intercept_cb(ifp, work, m);
 

Modified: user/jmallett/octeon/sys/mips/cavium/octe/ethernet-tx.c
==============================================================================
--- user/jmallett/octeon/sys/mips/cavium/octe/ethernet-tx.c	Mon Jun 21 13:59:49 2010	(r209395)
+++ user/jmallett/octeon/sys/mips/cavium/octe/ethernet-tx.c	Mon Jun 21 14:25:44 2010	(r209396)
@@ -291,15 +291,11 @@ dont_put_mbuf_in_hw:
 #endif /* REUSE_MBUFS_WITHOUT_FREE */
 
 	/* Check if we can use the hardware checksumming */
-#if 0
-	if (USE_HW_TCPUDP_CHECKSUM && (m->protocol == htons(ETH_P_IP)) &&
-	    (ip_hdr(m)->version == 4) && (ip_hdr(m)->ihl == 5) &&
-	    ((ip_hdr(m)->frag_off == 0) || (ip_hdr(m)->frag_off == 1<<14)) &&
-	    ((ip_hdr(m)->protocol == IP_PROTOCOL_TCP) || (ip_hdr(m)->protocol == IP_PROTOCOL_UDP))) {
+	if (USE_HW_TCPUDP_CHECKSUM &&
+	    (m->m_pkthdr.csum_flags & (CSUM_TCP | CSUM_UDP)) != 0) {
 		/* Use hardware checksum calc */
-		pko_command.s.ipoffp1 = sizeof(struct ethhdr) + 1;
+		pko_command.s.ipoffp1 = ETHER_HDR_LEN + 1;
 	}
-#endif
 
 	if (USE_ASYNC_IOBDMA) {
 		/* Get the number of mbufs in use by the hardware */

Modified: user/jmallett/octeon/sys/mips/cavium/octe/octe.c
==============================================================================
--- user/jmallett/octeon/sys/mips/cavium/octe/octe.c	Mon Jun 21 13:59:49 2010	(r209395)
+++ user/jmallett/octeon/sys/mips/cavium/octe/octe.c	Mon Jun 21 14:25:44 2010	(r209396)
@@ -32,10 +32,6 @@
  * XXX This file should be moved to if_octe.c
  * XXX The driver may have sufficient locking but we need locking to protect
  *     the interfaces presented here, right?
- * XXX There is a common MII bus on Octeon, we get the identifier of our PHY
- *     in priv->phy_id; right now we attach all the PHYs to each interface,
- *     which is clearly wrong.  Need to either modify miibus or probe and
- *     attach the specific PHY for each interface without an miibus in between.
  */
 
 #include "opt_inet.h"
@@ -59,6 +55,7 @@
 #include <net/if.h>
 #include <net/if_media.h>
 #include <net/if_types.h>
+#include <net/if_vlan_var.h>
 
 #ifdef INET
 #include <netinet/in.h>
@@ -186,6 +183,11 @@ octe_attach(device_t dev)
 
 	ether_ifattach(ifp, priv->mac);
 
+	ifp->if_data.ifi_hdrlen = sizeof(struct ether_vlan_header);
+	ifp->if_capabilities = IFCAP_VLAN_MTU | IFCAP_VLAN_HWTAGGING | IFCAP_HWCSUM;
+	ifp->if_capenable = ifp->if_capabilities;
+	ifp->if_hwassist = CSUM_TCP | CSUM_UDP;
+
 	OCTE_TX_LOCK(priv);
 	IFQ_SET_MAXLEN(&ifp->if_snd, MAX_OUT_QUEUE_DEPTH);
 	ifp->if_snd.ifq_drv_maxlen = MAX_OUT_QUEUE_DEPTH;


More information about the svn-src-user mailing list