From owner-svn-src-projects@FreeBSD.ORG Thu Sep 30 11:43:55 2010 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 31213106566C; Thu, 30 Sep 2010 11:43:55 +0000 (UTC) (envelope-from attilio@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 20B598FC20; Thu, 30 Sep 2010 11:43:55 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id o8UBht0h062635; Thu, 30 Sep 2010 11:43:55 GMT (envelope-from attilio@svn.freebsd.org) Received: (from attilio@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id o8UBhtpU062633; Thu, 30 Sep 2010 11:43:55 GMT (envelope-from attilio@svn.freebsd.org) Message-Id: <201009301143.o8UBhtpU062633@svn.freebsd.org> From: Attilio Rao Date: Thu, 30 Sep 2010 11:43:54 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r213296 - projects/sv/sys/dev/e1000 X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 30 Sep 2010 11:43:55 -0000 Author: attilio Date: Thu Sep 30 11:43:54 2010 New Revision: 213296 URL: http://svn.freebsd.org/changeset/base/213296 Log: Add netdump support for if_igb. Modified: projects/sv/sys/dev/e1000/if_igb.c Modified: projects/sv/sys/dev/e1000/if_igb.c ============================================================================== --- projects/sv/sys/dev/e1000/if_igb.c Thu Sep 30 10:09:52 2010 (r213295) +++ projects/sv/sys/dev/e1000/if_igb.c Thu Sep 30 11:43:54 2010 (r213296) @@ -37,6 +37,7 @@ #include "opt_device_polling.h" #include "opt_inet.h" #include "opt_altq.h" +#include "opt_netdump.h" #endif #include @@ -78,6 +79,9 @@ #include #include #include +#ifdef NETDUMP_CLIENT +#include +#endif #include #include #include @@ -91,6 +95,27 @@ #include "e1000_82575.h" #include "if_igb.h" +#if defined(DEVICE_POLLING) || defined(NETDUMP_CLIENT) + +#define IGB_CORE_LOCK_COND(adapter, locking) do { \ + if ((locking) != 0) \ + IGB_CORE_LOCK(adapter); \ +} while (0) +#define IGB_CORE_UNLOCK_COND(adapter, locking) do { \ + if ((locking) != 0) \ + IGB_CORE_UNLOCK(adapter); \ +} while (0) +#define IGB_TX_LOCK_COND(txr, locking) do { \ + if ((locking) != 0) \ + IGB_TX_LOCK(txr); \ +} while (0) +#define IGB_TX_UNLOCK_COND(txr, locking) do { \ + if ((locking) != 0) \ + IGB_TX_UNLOCK(txr); \ +} while (0) + +#endif + /********************************************************************* * Set this to one to display debug statistics *********************************************************************/ @@ -252,14 +277,32 @@ static void igb_handle_link(void *contex static void igb_msix_que(void *); static void igb_msix_link(void *); -#ifdef DEVICE_POLLING +#if defined(DEVICE_POLLING) || defined(NETDUMP_CLIENT) +static int _igb_poll_generic(struct ifnet *ifp, enum poll_cmd cmd, + int count, int locking); static poll_handler_t igb_poll; -#endif /* POLLING */ +#endif +#ifdef NETDUMP_CLIENT +static poll_handler_t igb_poll_unlocked; +static ndumplock_handler_t igb_ndump_disable_intr; +static ndumplock_handler_t igb_ndump_enable_intr; +#endif /********************************************************************* * FreeBSD Device Interface Entry Points *********************************************************************/ +#ifdef NETDUMP_CLIENT + +static struct netdump_methods igb_ndump_methods = { + .ne_poll_locked = igb_poll, + .ne_poll_unlocked = igb_poll_unlocked, + .ne_disable_intr = igb_ndump_disable_intr, + .ne_enable_intr = igb_ndump_enable_intr +}; + +#endif + static device_method_t igb_methods[] = { /* Device interface */ DEVMETHOD(device_probe, igb_probe), @@ -1354,7 +1397,7 @@ igb_irq_fast(void *arg) return FILTER_HANDLED; } -#ifdef DEVICE_POLLING +#if defined(DEVICE_POLLING) || defined(NETDUMP_CLIENT) /********************************************************************* * * Legacy polling routine : if using this code you MUST be sure that @@ -1368,7 +1411,7 @@ static int #define POLL_RETURN_COUNT(a) static void #endif -igb_poll(struct ifnet *ifp, enum poll_cmd cmd, int count) +_igb_poll_generic(struct ifnet *ifp, enum poll_cmd cmd, int count, int locking) { struct adapter *adapter = ifp->if_softc; struct igb_queue *que = adapter->queues; @@ -1377,9 +1420,9 @@ igb_poll(struct ifnet *ifp, enum poll_cm u32 loop = IGB_MAX_LOOP; bool more; - IGB_CORE_LOCK(adapter); + IGB_CORE_LOCK_COND(adapter, locking); if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) { - IGB_CORE_UNLOCK(adapter); + IGB_CORE_UNLOCK_COND(adapter, locking); return POLL_RETURN_COUNT(rx_done); } @@ -1392,11 +1435,11 @@ igb_poll(struct ifnet *ifp, enum poll_cm if (reg_icr & E1000_ICR_RXO) adapter->rx_overruns++; } - IGB_CORE_UNLOCK(adapter); + IGB_CORE_UNLOCK_COND(adapter, locking); igb_rxeof(que, count, &rx_done); - IGB_TX_LOCK(txr); + IGB_TX_LOCK_COND(txr, locking); do { more = igb_txeof(txr); } while (loop-- && more); @@ -1407,10 +1450,48 @@ igb_poll(struct ifnet *ifp, enum poll_cm if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd)) igb_start_locked(txr, ifp); #endif - IGB_TX_UNLOCK(txr); + IGB_TX_UNLOCK_COND(txr, locking); return POLL_RETURN_COUNT(rx_done); } -#endif /* DEVICE_POLLING */ + +static int +igb_poll(struct ifnet *ifp, enum poll_cmd cmd, int count) +{ + + return (_igb_poll_generic(ifp, cmd, count, 1)); +} +#endif /* !DEVICE_POLLING && !NETDUMP_CLIENT */ + +#ifdef NETDUMP_CLIENT +static int +igb_poll_unlocked(struct ifnet *ifp, enum poll_cmd cmd, int count) +{ + + return (_igb_poll_generic(ifp, cmd, count, 0)); +} + +static void +igb_ndump_disable_intr(struct ifnet *ifp) +{ + struct adapter *adapter; + + adapter = ifp->if_softc; + IGB_CORE_LOCK(adapter); + igb_disable_intr(adapter); + IGB_CORE_UNLOCK(adapter); +} + +static void +igb_ndump_enable_intr(struct ifnet *ifp) +{ + struct adapter *adapter; + + adapter = ifp->if_softc; + IGB_CORE_LOCK(adapter); + igb_enable_intr(adapter); + IGB_CORE_UNLOCK(adapter); +} +#endif /* !NETDUMP_CLIENT */ /********************************************************************* * @@ -2713,6 +2794,9 @@ igb_setup_interface(device_t dev, struct ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST; ifp->if_ioctl = igb_ioctl; ifp->if_start = igb_start; +#ifdef NETDUMP_CLIENT + ifp->if_ndumpfuncs = &igb_ndump_methods; +#endif #if __FreeBSD_version >= 800000 ifp->if_transmit = igb_mq_start; ifp->if_qflush = igb_qflush;