aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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