Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 5 May 2011 02:38:09 +0000 (UTC)
From:      Navdeep Parhar <np@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r221477 - in head/sys: dev/cxgbe modules/cxgbe/if_cxgbe
Message-ID:  <201105050238.p452c9CB077930@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: np
Date: Thu May  5 02:38:08 2011
New Revision: 221477
URL: http://svn.freebsd.org/changeset/base/221477

Log:
  T4 packet timestamps.
  
  Reference code that shows how to get a packet's timestamp out of
  cxgbe(4).  Disabled by default because we don't have a standard way
  today to pass this information up the stack.
  
  The timestamp is 60 bits wide and each increment represents 1 tick of
  the T4's core clock.  As an example, the timestamp granularity is ~4.4ns
  for this card:
  
  # sysctl dev.t4nex.0.core_clock
  dev.t4nex.0.core_clock: 228125
  
  MFC after:	1 week

Modified:
  head/sys/dev/cxgbe/t4_sge.c
  head/sys/modules/cxgbe/if_cxgbe/Makefile

Modified: head/sys/dev/cxgbe/t4_sge.c
==============================================================================
--- head/sys/dev/cxgbe/t4_sge.c	Thu May  5 02:35:25 2011	(r221476)
+++ head/sys/dev/cxgbe/t4_sge.c	Thu May  5 02:38:08 2011	(r221477)
@@ -606,6 +606,12 @@ t4_evt_rx(void *arg)
 	    V_INGRESSQID(iq->cntxt_id) | V_SEINTARM(iq->intr_params));
 }
 
+#ifdef T4_PKT_TIMESTAMP
+#define RX_COPY_THRESHOLD (MINCLSIZE - 8)
+#else
+#define RX_COPY_THRESHOLD MINCLSIZE
+#endif
+
 void
 t4_eth_rx(void *arg)
 {
@@ -669,7 +675,22 @@ t4_eth_rx(void *arg)
 		    BUS_DMASYNC_POSTREAD);
 
 		m_init(m0, NULL, 0, M_NOWAIT, MT_DATA, M_PKTHDR);
-		if (len < MINCLSIZE) {
+
+#ifdef T4_PKT_TIMESTAMP
+		*mtod(m0, uint64_t *) =
+		    be64toh(ctrl->u.last_flit & 0xfffffffffffffff);
+		m0->m_data += 8;
+
+		/*
+		 * 60 bit timestamp value is *(uint64_t *)m0->m_pktdat.  Note
+		 * that it is in the leading free-space (see M_LEADINGSPACE) in
+		 * the mbuf.  The kernel can clobber it during a pullup,
+		 * m_copymdata, etc.  You need to make sure that the mbuf
+		 * reaches you unmolested if you care about the timestamp.
+		 */
+#endif
+
+		if (len < RX_COPY_THRESHOLD) {
 			/* copy data to mbuf, buffer will be recycled */
 			bcopy(sd->cl, mtod(m0, caddr_t), len);
 			m0->m_len = len;

Modified: head/sys/modules/cxgbe/if_cxgbe/Makefile
==============================================================================
--- head/sys/modules/cxgbe/if_cxgbe/Makefile	Thu May  5 02:35:25 2011	(r221476)
+++ head/sys/modules/cxgbe/if_cxgbe/Makefile	Thu May  5 02:38:08 2011	(r221477)
@@ -13,4 +13,7 @@ SRCS+= opt_inet.h
 
 CFLAGS+= -I${CXGBE}
 
+# Provide the timestamp of a packet in its header mbuf.
+#CFLAGS+= -DT4_PKT_TIMESTAMP
+
 .include <bsd.kmod.mk>



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201105050238.p452c9CB077930>