aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKevin Bowling <kbowling@FreeBSD.org>2024-09-24 10:25:24 +0000
committerKevin Bowling <kbowling@FreeBSD.org>2024-09-24 10:47:05 +0000
commitc9021340a3266f924bf721182f14f2d265d8a82c (patch)
tree5bf2e0e19992eab14c84b0e5bc5d3564f9df2341
parent2e78e568c268e4ba846ab140d9ac6b42886f8ec7 (diff)
downloadsrc-c9021340a326.tar.gz
src-c9021340a326.zip
e1000: Add sysctl for igb(4) DMA Coalesce
This feature can increase efficiency at the expense of latency It does not work well with the default interrupt delay, but expose the otherwise unconnected code in the driver in case people want to experiment. See https://www.intel.com/content/dam/support/us/en/documents/network/adapter/pro100/sb/466827_intel_r__dma_coalescing_white_paper_v003.pdf MFC after: 1 week Sponsored by: Blue Box Systems
-rw-r--r--sys/dev/e1000/if_em.c56
1 files changed, 56 insertions, 0 deletions
diff --git a/sys/dev/e1000/if_em.c b/sys/dev/e1000/if_em.c
index d06627bcfda1..ad12171487f6 100644
--- a/sys/dev/e1000/if_em.c
+++ b/sys/dev/e1000/if_em.c
@@ -354,6 +354,7 @@ static void em_enable_vectors_82574(if_ctx_t);
static int em_set_flowcntl(SYSCTL_HANDLER_ARGS);
static int em_sysctl_eee(SYSCTL_HANDLER_ARGS);
+static int igb_sysctl_dmac(SYSCTL_HANDLER_ARGS);
static void em_if_led_func(if_ctx_t, int);
static int em_get_regs(SYSCTL_HANDLER_ARGS);
@@ -855,6 +856,12 @@ em_if_attach_pre(if_ctx_t ctx)
CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_NEEDGIANT, sc, 0,
em_get_rs, "I", "Dump RS indexes");
+ if (hw->mac.type >= e1000_i350) {
+ SYSCTL_ADD_PROC(ctx_list, child, OID_AUTO, "dmac",
+ CTLTYPE_INT | CTLFLAG_RW, sc, 0,
+ igb_sysctl_dmac, "I", "DMA Coalesce");
+ }
+
scctx->isc_tx_nsegments = EM_MAX_SCATTER;
scctx->isc_nrxqsets_max = scctx->isc_ntxqsets_max = em_set_num_queues(ctx);
if (bootverbose)
@@ -4974,6 +4981,55 @@ em_set_flowcntl(SYSCTL_HANDLER_ARGS)
}
/*
+ * Manage DMA Coalesce:
+ * Control values:
+ * 0/1 - off/on
+ * Legal timer values are:
+ * 250,500,1000-10000 in thousands
+ */
+static int
+igb_sysctl_dmac(SYSCTL_HANDLER_ARGS)
+{
+ struct e1000_softc *sc = (struct e1000_softc *) arg1;
+ int error;
+
+ error = sysctl_handle_int(oidp, &sc->dmac, 0, req);
+
+ if ((error) || (req->newptr == NULL))
+ return (error);
+
+ switch (sc->dmac) {
+ case 0:
+ /* Disabling */
+ break;
+ case 1: /* Just enable and use default */
+ sc->dmac = 1000;
+ break;
+ case 250:
+ case 500:
+ case 1000:
+ case 2000:
+ case 3000:
+ case 4000:
+ case 5000:
+ case 6000:
+ case 7000:
+ case 8000:
+ case 9000:
+ case 10000:
+ /* Legal values - allow */
+ break;
+ default:
+ /* Do nothing, illegal value */
+ sc->dmac = 0;
+ return (EINVAL);
+ }
+ /* Reinit the interface */
+ em_if_init(sc->ctx);
+ return (error);
+}
+
+/*
* Manage Energy Efficient Ethernet:
* Control values:
* 0/1 - enabled/disabled