Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 8 Oct 2010 11:16:48 +0000 (UTC)
From:      Attilio Rao <attilio@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r213570 - projects/sv/sys/dev/ixgb
Message-ID:  <201010081116.o98BGmrs091572@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: attilio
Date: Fri Oct  8 11:16:48 2010
New Revision: 213570
URL: http://svn.freebsd.org/changeset/base/213570

Log:
  Add netdump support for ixgb(4) interface.

Modified:
  projects/sv/sys/dev/ixgb/if_ixgb.c
  projects/sv/sys/dev/ixgb/if_ixgb.h

Modified: projects/sv/sys/dev/ixgb/if_ixgb.c
==============================================================================
--- projects/sv/sys/dev/ixgb/if_ixgb.c	Fri Oct  8 10:42:16 2010	(r213569)
+++ projects/sv/sys/dev/ixgb/if_ixgb.c	Fri Oct  8 11:16:48 2010	(r213570)
@@ -35,10 +35,24 @@ POSSIBILITY OF SUCH DAMAGE.
 
 #ifdef HAVE_KERNEL_OPTION_HEADERS
 #include "opt_device_polling.h"
+#include "opt_netdump.h"
 #endif
 
 #include <dev/ixgb/if_ixgb.h>
 
+#if defined(DEVICE_POLLING) || defined(NETDUMP_CLIENT)
+
+#define	IXGB_LOCK_COND(adapter, locking) do {				\
+	if ((locking) != 0)						\
+		IXGB_LOCK(adapter);					\
+} while (0)
+#define	IXGB_UNLOCK_COND(adapter, locking) do {				\
+	if ((locking) != 0)						\
+		IXGB_UNLOCK(adapter);					\
+} while (0)
+
+#endif
+
 /*********************************************************************
  *  Set this to one to display debug statistics
  *********************************************************************/
@@ -145,14 +159,32 @@ static int 
 ixgb_dma_malloc(struct adapter *, bus_size_t,
 		struct ixgb_dma_alloc *, int);
 static void     ixgb_dma_free(struct adapter *, struct ixgb_dma_alloc *);
-#ifdef DEVICE_POLLING
+#if defined(DEVICE_POLLING) || defined(NETDUMP_CLIENT)
+static int      _ixgb_poll_generic(struct ifnet *ifp, enum poll_cmd cmd,
+		    int count, int locking);
 static poll_handler_t ixgb_poll;
 #endif
+#ifdef NETDUMP_CLIENT
+static poll_handler_t ixgb_poll_unlocked;
+static ndumplock_handler_t ixgb_ndump_disable_intr;
+static ndumplock_handler_t ixgb_ndump_enable_intr;
+#endif
 
 /*********************************************************************
  *  FreeBSD Device Interface Entry Points
  *********************************************************************/
 
+#ifdef NETDUMP_CLIENT
+
+static struct netdump_methods ixgb_ndump_methods = {
+	.ne_poll_locked = ixgb_poll,
+	.ne_poll_unlocked = ixgb_poll_unlocked,
+	.ne_disable_intr = ixgb_ndump_disable_intr,
+	.ne_enable_intr = ixgb_ndump_enable_intr
+};
+
+#endif
+
 static device_method_t ixgb_methods[] = {
 	/* Device interface */
 	DEVMETHOD(device_probe, ixgb_probe),
@@ -750,7 +782,7 @@ ixgb_init(void *arg)
 	return;
 }
 
-#ifdef DEVICE_POLLING
+#if defined(DEVICE_POLLING) || defined(NETDUMP_CLIENT)
 static int
 ixgb_poll_locked(struct ifnet * ifp, enum poll_cmd cmd, int count)
 {
@@ -776,18 +808,57 @@ ixgb_poll_locked(struct ifnet * ifp, enu
 }
 
 static int
-ixgb_poll(struct ifnet * ifp, enum poll_cmd cmd, int count)
+_ixgb_poll_generic(struct ifnet * ifp, enum poll_cmd cmd, int count,
+    int locking)
 {
 	struct adapter *adapter = ifp->if_softc;
 	int rx_npkts = 0;
 
-	IXGB_LOCK(adapter);
+	IXGB_LOCK_COND(adapter, locking);
 	if (ifp->if_drv_flags & IFF_DRV_RUNNING)
 		rx_npkts = ixgb_poll_locked(ifp, cmd, count);
-	IXGB_UNLOCK(adapter);
+	IXGB_UNLOCK_COND(adapter, locking);
 	return (rx_npkts);
 }
-#endif /* DEVICE_POLLING */
+
+static int
+ixgb_poll(struct ifnet *ifp, enum poll_cmd cmd, int count)
+{
+
+	return (_ixgb_poll_generic(ifp, cmd, count, 1));
+}
+#endif /* !DEVICE_POLLING  && !NETDUMP_CLIENT */
+
+#ifdef NETDUMP_CLIENT
+static int
+ixgb_poll_unlocked(struct ifnet *ifp, enum poll_cmd cmd, int count)
+{
+
+	return (_ixgb_poll_generic(ifp, cmd, count, 0));
+}
+
+static void
+ixgb_ndump_disable_intr(struct ifnet *ifp)
+{
+	struct adapter *adapter;
+
+	adapter = ifp->if_softc;
+	IXGB_LOCK(adapter);
+	ixgb_disable_intr(adapter);
+	IXGB_UNLOCK(adapter);
+}
+
+static void
+ixgb_ndump_enable_intr(struct ifnet *ifp)
+{
+	struct adapter *adapter;
+
+	adapter = ifp->if_softc;
+	IXGB_LOCK(adapter);
+	ixgb_enable_intr(adapter);
+	IXGB_UNLOCK(adapter);
+}
+#endif /* !NETDUMP_CLIENT */
 
 /*********************************************************************
  *
@@ -1362,6 +1433,9 @@ ixgb_setup_interface(device_t dev, struc
 	ifp->if_ioctl = ixgb_ioctl;
 	ifp->if_start = ixgb_start;
 	ifp->if_snd.ifq_maxlen = adapter->num_tx_desc - 1;
+#ifdef NETDUMP_CLIENT
+	ifp->if_ndumpfuncs = &ixgb_ndump_methods;
+#endif
 
 #if __FreeBSD_version < 500000
 	ether_ifattach(ifp, ETHER_BPF_SUPPORTED);

Modified: projects/sv/sys/dev/ixgb/if_ixgb.h
==============================================================================
--- projects/sv/sys/dev/ixgb/if_ixgb.h	Fri Oct  8 10:42:16 2010	(r213569)
+++ projects/sv/sys/dev/ixgb/if_ixgb.h	Fri Oct  8 11:16:48 2010	(r213570)
@@ -60,6 +60,9 @@ POSSIBILITY OF SUCH DAMAGE.
 #include <netinet/in_systm.h>
 #include <netinet/in.h>
 #include <netinet/ip.h>
+#ifdef NETDUMP_CLIENT
+#include <netinet/netdump.h>
+#endif
 #include <netinet/tcp.h>
 #include <netinet/udp.h>
 



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