svn commit: r331676 - in user/markj/netdump: share/man/man4 sys/dev/cxgb
Mark Johnston
markj at FreeBSD.org
Wed Mar 28 14:32:25 UTC 2018
Author: markj
Date: Wed Mar 28 14:32:24 2018
New Revision: 331676
URL: https://svnweb.freebsd.org/changeset/base/331676
Log:
Add netdump support to cxgb(4).
Tested with a T320 adapter.
Modified:
user/markj/netdump/share/man/man4/netdump.4
user/markj/netdump/sys/dev/cxgb/cxgb_adapter.h
user/markj/netdump/sys/dev/cxgb/cxgb_main.c
user/markj/netdump/sys/dev/cxgb/cxgb_sge.c
Modified: user/markj/netdump/share/man/man4/netdump.4
==============================================================================
--- user/markj/netdump/share/man/man4/netdump.4 Wed Mar 28 14:31:12 2018 (r331675)
+++ user/markj/netdump/share/man/man4/netdump.4 Wed Mar 28 14:32:24 2018 (r331676)
@@ -105,6 +105,7 @@ message to the server.
The following network drivers support netdump:
.Xr alc 4 ,
.Xr bge 4 ,
+.Xr cxgb 4 ,
.Xr em 4 ,
.Xr igb 4 ,
.Xr ix 4 ,
Modified: user/markj/netdump/sys/dev/cxgb/cxgb_adapter.h
==============================================================================
--- user/markj/netdump/sys/dev/cxgb/cxgb_adapter.h Wed Mar 28 14:31:12 2018 (r331675)
+++ user/markj/netdump/sys/dev/cxgb/cxgb_adapter.h Wed Mar 28 14:32:24 2018 (r331676)
@@ -576,4 +576,11 @@ int cxgb_transmit(struct ifnet *ifp, struct mbuf *m);
void cxgb_qflush(struct ifnet *ifp);
void t3_iterate(void (*)(struct adapter *, void *), void *);
void cxgb_refresh_stats(struct port_info *);
+
+#ifdef NETDUMP
+int cxgb_netdump_encap(struct sge_qset *qs, struct mbuf **m);
+int cxgb_netdump_poll_rx(adapter_t *adap, struct sge_qset *qs);
+int cxgb_netdump_poll_tx(struct sge_qset *qs);
+#endif
+
#endif
Modified: user/markj/netdump/sys/dev/cxgb/cxgb_main.c
==============================================================================
--- user/markj/netdump/sys/dev/cxgb/cxgb_main.c Wed Mar 28 14:31:12 2018 (r331675)
+++ user/markj/netdump/sys/dev/cxgb/cxgb_main.c Wed Mar 28 14:32:24 2018 (r331676)
@@ -74,6 +74,7 @@ __FBSDID("$FreeBSD$");
#include <netinet/ip.h>
#include <netinet/tcp.h>
#include <netinet/udp.h>
+#include <netinet/netdump/netdump.h>
#include <dev/pci/pcireg.h>
#include <dev/pci/pcivar.h>
@@ -191,6 +192,8 @@ static devclass_t cxgb_port_devclass;
DRIVER_MODULE(cxgb, cxgbc, cxgb_port_driver, cxgb_port_devclass, 0, 0);
MODULE_VERSION(cxgb, 1);
+NETDUMP_DEFINE(cxgb);
+
static struct mtx t3_list_lock;
static SLIST_HEAD(, adapter) t3_list;
#ifdef TCP_OFFLOAD
@@ -1045,6 +1048,9 @@ cxgb_port_attach(device_t dev)
ether_ifattach(ifp, p->hw_addr);
+ /* Attach driver netdump methods. */
+ NETDUMP_SET(ifp, cxgb);
+
#ifdef DEFAULT_JUMBO
if (sc->params.nports <= 2)
ifp->if_mtu = ETHERMTU_JUMBO;
@@ -3578,3 +3584,64 @@ cxgbc_mod_event(module_t mod, int cmd, void *arg)
return (rc);
}
+
+#ifdef NETDUMP
+static void
+cxgb_netdump_init(struct ifnet *ifp, int *nrxr)
+{
+
+ *nrxr = SGE_QSETS;
+}
+
+static void
+cxgb_netdump_event(struct ifnet *ifp, enum netdump_ev event)
+{
+ struct port_info *pi;
+ struct sge_qset *qs;
+ int i;
+
+ pi = if_getsoftc(ifp);
+ if (event == NETDUMP_START)
+ for (i = 0; i < SGE_QSETS; i++) {
+ qs = &pi->adapter->sge.qs[i];
+
+ /* Need to reinit after netdump_mbuf_dump(). */
+ qs->fl[0].zone = zone_pack;
+ qs->fl[1].zone = zone_pack;
+ qs->lro.enabled = 0;
+ }
+}
+
+static int
+cxgb_netdump_transmit(struct ifnet *ifp, struct mbuf *m)
+{
+ struct port_info *pi;
+ struct sge_qset *qs;
+
+ pi = if_getsoftc(ifp);
+ if ((if_getdrvflags(ifp) & (IFF_DRV_RUNNING | IFF_DRV_OACTIVE)) !=
+ IFF_DRV_RUNNING)
+ return (ENOENT);
+
+ qs = &pi->adapter->sge.qs[pi->first_qset];
+ return (cxgb_netdump_encap(qs, &m));
+}
+
+static int
+cxgb_netdump_poll(struct ifnet *ifp, int count)
+{
+ struct port_info *pi;
+ adapter_t *adap;
+ int i;
+
+ pi = if_getsoftc(ifp);
+ if ((if_getdrvflags(ifp) & IFF_DRV_RUNNING) == 0)
+ return (ENOENT);
+
+ adap = pi->adapter;
+ for (i = 0; i < SGE_QSETS; i++)
+ (void)cxgb_netdump_poll_rx(adap, &adap->sge.qs[i]);
+ (void)cxgb_netdump_poll_tx(&adap->sge.qs[pi->first_qset]);
+ return (0);
+}
+#endif /* NETDUMP */
Modified: user/markj/netdump/sys/dev/cxgb/cxgb_sge.c
==============================================================================
--- user/markj/netdump/sys/dev/cxgb/cxgb_sge.c Wed Mar 28 14:31:12 2018 (r331675)
+++ user/markj/netdump/sys/dev/cxgb/cxgb_sge.c Wed Mar 28 14:32:24 2018 (r331676)
@@ -390,6 +390,15 @@ reclaim_completed_tx(struct sge_qset *qs, int reclaim_
return (reclaim);
}
+#ifdef NETDUMP
+int
+cxgb_netdump_poll_tx(struct sge_qset *qs)
+{
+
+ return (reclaim_completed_tx(qs, TX_RECLAIM_MAX, TXQ_ETH));
+}
+#endif
+
/**
* should_restart_tx - are there enough resources to restart a Tx queue?
* @q: the Tx queue
@@ -1586,6 +1595,23 @@ t3_encap(struct sge_qset *qs, struct mbuf **m)
return (0);
}
+#ifdef NETDUMP
+int
+cxgb_netdump_encap(struct sge_qset *qs, struct mbuf **m)
+{
+ int error;
+
+ error = t3_encap(qs, m);
+ if (error == 0)
+ check_ring_tx_db(qs->port->adapter, &qs->txq[TXQ_ETH], 1);
+ else if (*m != NULL) {
+ m_freem(*m);
+ *m = NULL;
+ }
+ return (error);
+}
+#endif
+
void
cxgb_tx_watchdog(void *arg)
{
@@ -3014,6 +3040,14 @@ process_responses_gts(adapter_t *adap, struct sge_rspq
return (work);
}
+#ifdef NETDUMP
+int
+cxgb_netdump_poll_rx(adapter_t *adap, struct sge_qset *qs)
+{
+
+ return (process_responses_gts(adap, &qs->rspq));
+}
+#endif
/*
* Interrupt handler for legacy INTx interrupts for T3B-based cards.
More information about the svn-src-user
mailing list