Date: Mon, 15 Jan 2018 00:57:10 +0000 (UTC) From: Mark Johnston <markj@FreeBSD.org> To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r327985 - user/markj/netdump/sys/dev/re Message-ID: <201801150057.w0F0vAdc047137@repo.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: markj Date: Mon Jan 15 00:57:09 2018 New Revision: 327985 URL: https://svnweb.freebsd.org/changeset/base/327985 Log: Add netdump support to re(4). Tested with a RealTek 8101E adapter. Modified: user/markj/netdump/sys/dev/re/if_re.c Modified: user/markj/netdump/sys/dev/re/if_re.c ============================================================================== --- user/markj/netdump/sys/dev/re/if_re.c Mon Jan 15 00:55:34 2018 (r327984) +++ user/markj/netdump/sys/dev/re/if_re.c Mon Jan 15 00:57:09 2018 (r327985) @@ -139,6 +139,8 @@ __FBSDID("$FreeBSD$"); #include <net/bpf.h> +#include <netinet/netdump/netdump.h> + #include <machine/bus.h> #include <machine/resource.h> #include <sys/bus.h> @@ -279,6 +281,7 @@ static void re_tick (void *); static void re_int_task (void *, int); static void re_start (struct ifnet *); static void re_start_locked (struct ifnet *); +static void re_start_tx (struct rl_softc *); static int re_ioctl (struct ifnet *, u_long, caddr_t); static void re_init (void *); static void re_init_locked (struct rl_softc *); @@ -307,6 +310,8 @@ static void re_setwol (struct rl_softc *); static void re_clrwol (struct rl_softc *); static void re_set_linkspeed (struct rl_softc *); +NETDUMP_DEFINE(re); + #ifdef DEV_NETMAP /* see ixgbe.c for details */ #include <dev/netmap/if_re_netmap.h> MODULE_DEPEND(re, netmap, 1, 1, 1); @@ -1737,8 +1742,11 @@ re_attach(device_t dev) if (error) { device_printf(dev, "couldn't set up irq\n"); ether_ifdetach(ifp); + goto fail; } + NETDUMP_SET(ifp, re); + fail: if (error) re_detach(dev); @@ -2981,8 +2989,14 @@ re_start_locked(struct ifnet *ifp) return; } - /* Flush the TX descriptors */ + re_start_tx(sc); +} +static void +re_start_tx(struct rl_softc *sc) +{ + + /* Flush the TX descriptors */ bus_dmamap_sync(sc->rl_ldata.rl_tx_list_tag, sc->rl_ldata.rl_tx_list_map, BUS_DMASYNC_PREWRITE|BUS_DMASYNC_PREREAD); @@ -4078,3 +4092,69 @@ sysctl_hw_re_int_mod(SYSCTL_HANDLER_ARGS) return (sysctl_int_range(oidp, arg1, arg2, req, RL_TIMER_MIN, RL_TIMER_MAX)); } + +#ifdef NETDUMP +static void +re_netdump_init(struct ifnet *ifp, int *nmbufp, int *nclustp) +{ + struct rl_softc *sc; + + sc = ifp->if_softc; + + *nmbufp += sc->rl_ldata.rl_rx_desc_cnt; + *nclustp += sc->rl_ldata.rl_rx_desc_cnt; +} + +static void +re_netdump_event(struct ifnet *ifp, enum netdump_ev event) +{ + struct rl_softc *sc; + + sc = ifp->if_softc; + + switch (event) { + case NETDUMP_START: + sc->rl_flags &= ~RL_FLAG_JUMBOV2; + break; + default: + break; + } +} + +static int +re_netdump_transmit(struct ifnet *ifp, struct mbuf *m) +{ + struct rl_softc *sc; + int error; + + sc = ifp->if_softc; + + if ((ifp->if_drv_flags & (IFF_DRV_RUNNING | IFF_DRV_OACTIVE)) != + IFF_DRV_RUNNING || (sc->rl_flags & RL_FLAG_LINK) == 0) + return (EBUSY); + + error = re_encap(sc, &m); + if (error == 0) + re_start_tx(sc); + return (error); +} + +static int +re_netdump_poll(struct ifnet *ifp, int count) +{ + struct rl_softc *sc; + int error; + + sc = ifp->if_softc; + + if ((ifp->if_drv_flags & (IFF_DRV_RUNNING | IFF_DRV_OACTIVE)) != + IFF_DRV_RUNNING || (sc->rl_flags & RL_FLAG_LINK) == 0) + return (EBUSY); + + re_txeof(sc); + error = re_rxeof(sc, NULL); + if (error != 0 && error != EAGAIN) + return (error); + return (0); +} +#endif /* NETDUMP */
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201801150057.w0F0vAdc047137>