From 6add3f72fdb1769c8ae396b61b2d4c0eace06da3 Mon Sep 17 00:00:00 2001 From: np Date: Fri, 4 Aug 2017 15:57:10 +0000 Subject: [PATCH] cxgbe(4): Allow the TOE timer tunables to be set with microsecond precision. These timers are already displayed in microseconds in the sysctl MIB. Add variables to track these tunables while here. MFC after: 3 days Sponsored by: Chelsio Communications --- sys/dev/cxgbe/common/common.h | 7 +-- sys/dev/cxgbe/t4_main.c | 93 +++++++++++++++++++++++++++-------- 2 files changed, 75 insertions(+), 25 deletions(-) diff --git a/sys/dev/cxgbe/common/common.h b/sys/dev/cxgbe/common/common.h index 8b9ef8b0c306..c4a3ef249e46 100644 --- a/sys/dev/cxgbe/common/common.h +++ b/sys/dev/cxgbe/common/common.h @@ -501,13 +501,10 @@ static inline unsigned int dack_ticks_to_usec(const struct adapter *adap, return (ticks << adap->params.tp.dack_re) / core_ticks_per_usec(adap); } -static inline u_int ms_to_tcp_ticks(const struct adapter *adap, u_int ms) +static inline u_int us_to_tcp_ticks(const struct adapter *adap, u_long us) { - u_long l; - l = (u_long)ms * adap->params.vpd.cclk >> adap->params.tp.tre; - - return (l); + return (us * adap->params.vpd.cclk / 1000 >> adap->params.tp.tre); } void t4_set_reg_field(struct adapter *adap, unsigned int addr, u32 mask, u32 val); diff --git a/sys/dev/cxgbe/t4_main.c b/sys/dev/cxgbe/t4_main.c index bf306642139a..64bdf4a78f79 100644 --- a/sys/dev/cxgbe/t4_main.c +++ b/sys/dev/cxgbe/t4_main.c @@ -294,6 +294,51 @@ TUNABLE_INT("hw.cxgbe.nofldtxq_vi", &t4_nofldtxq_vi); #define NOFLDRXQ_VI 1 static int t4_nofldrxq_vi = -NOFLDRXQ_VI; TUNABLE_INT("hw.cxgbe.nofldrxq_vi", &t4_nofldrxq_vi); + +/* 0 means chip/fw default, non-zero number is value in microseconds */ +static u_long t4_toe_keepalive_idle = 0; +TUNABLE_ULONG("hw.cxgbe.toe.keepalive_idle", &t4_toe_keepalive_idle); + +/* 0 means chip/fw default, non-zero number is value in microseconds */ +static u_long t4_toe_keepalive_interval = 0; +TUNABLE_ULONG("hw.cxgbe.toe.keepalive_interval", &t4_toe_keepalive_interval); + +/* 0 means chip/fw default, non-zero number is # of keepalives before abort */ +static int t4_toe_keepalive_count = 0; +TUNABLE_INT("hw.cxgbe.toe.keepalive_count", &t4_toe_keepalive_count); + +/* 0 means chip/fw default, non-zero number is value in microseconds */ +static u_long t4_toe_rexmt_min = 0; +TUNABLE_ULONG("hw.cxgbe.toe.rexmt_min", &t4_toe_rexmt_min); + +/* 0 means chip/fw default, non-zero number is value in microseconds */ +static u_long t4_toe_rexmt_max = 0; +TUNABLE_ULONG("hw.cxgbe.toe.rexmt_max", &t4_toe_rexmt_max); + +/* 0 means chip/fw default, non-zero number is # of rexmt before abort */ +static int t4_toe_rexmt_count = 0; +TUNABLE_INT("hw.cxgbe.toe.rexmt_count", &t4_toe_rexmt_count); + +/* -1 means chip/fw default, other values are raw backoff values to use */ +static int t4_toe_rexmt_backoff[16] = { + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 +}; +TUNABLE_INT("hw.cxgbe.toe.rexmt_backoff.0", &t4_toe_rexmt_backoff[0]); +TUNABLE_INT("hw.cxgbe.toe.rexmt_backoff.1", &t4_toe_rexmt_backoff[1]); +TUNABLE_INT("hw.cxgbe.toe.rexmt_backoff.2", &t4_toe_rexmt_backoff[2]); +TUNABLE_INT("hw.cxgbe.toe.rexmt_backoff.3", &t4_toe_rexmt_backoff[3]); +TUNABLE_INT("hw.cxgbe.toe.rexmt_backoff.4", &t4_toe_rexmt_backoff[4]); +TUNABLE_INT("hw.cxgbe.toe.rexmt_backoff.5", &t4_toe_rexmt_backoff[5]); +TUNABLE_INT("hw.cxgbe.toe.rexmt_backoff.6", &t4_toe_rexmt_backoff[6]); +TUNABLE_INT("hw.cxgbe.toe.rexmt_backoff.7", &t4_toe_rexmt_backoff[7]); +TUNABLE_INT("hw.cxgbe.toe.rexmt_backoff.8", &t4_toe_rexmt_backoff[8]); +TUNABLE_INT("hw.cxgbe.toe.rexmt_backoff.9", &t4_toe_rexmt_backoff[9]); +TUNABLE_INT("hw.cxgbe.toe.rexmt_backoff.10", &t4_toe_rexmt_backoff[10]); +TUNABLE_INT("hw.cxgbe.toe.rexmt_backoff.11", &t4_toe_rexmt_backoff[11]); +TUNABLE_INT("hw.cxgbe.toe.rexmt_backoff.12", &t4_toe_rexmt_backoff[12]); +TUNABLE_INT("hw.cxgbe.toe.rexmt_backoff.13", &t4_toe_rexmt_backoff[13]); +TUNABLE_INT("hw.cxgbe.toe.rexmt_backoff.14", &t4_toe_rexmt_backoff[14]); +TUNABLE_INT("hw.cxgbe.toe.rexmt_backoff.15", &t4_toe_rexmt_backoff[15]); #endif #ifdef DEV_NETMAP @@ -3611,62 +3656,70 @@ static int set_params__post_init(struct adapter *sc) { uint32_t param, val; +#ifdef TCP_OFFLOAD int i, v, shift; - char s[32]; +#endif /* ask for encapsulated CPLs */ param = FW_PARAM_PFVF(CPLFW4MSG_ENCAP); val = 1; (void)t4_set_params(sc, sc->mbox, sc->pf, 0, 1, ¶m, &val); +#ifdef TCP_OFFLOAD /* * Override the TOE timers with user provided tunables. This is not the * recommended way to change the timers (the firmware config file is) so * these tunables are not documented. * - * All the timer tunables are in milliseconds. + * All the timer tunables are in microseconds. */ - if (TUNABLE_INT_FETCH("hw.cxgbe.toe.keepalive_idle", &v)) { + if (t4_toe_keepalive_idle != 0) { + v = us_to_tcp_ticks(sc, t4_toe_keepalive_idle); + v &= M_KEEPALIVEIDLE; t4_set_reg_field(sc, A_TP_KEEP_IDLE, - V_KEEPALIVEIDLE(M_KEEPALIVEIDLE), - V_KEEPALIVEIDLE(ms_to_tcp_ticks(sc, v))); + V_KEEPALIVEIDLE(M_KEEPALIVEIDLE), V_KEEPALIVEIDLE(v)); } - if (TUNABLE_INT_FETCH("hw.cxgbe.toe.keepalive_interval", &v)) { + if (t4_toe_keepalive_interval != 0) { + v = us_to_tcp_ticks(sc, t4_toe_keepalive_interval); + v &= M_KEEPALIVEINTVL; t4_set_reg_field(sc, A_TP_KEEP_INTVL, - V_KEEPALIVEINTVL(M_KEEPALIVEINTVL), - V_KEEPALIVEINTVL(ms_to_tcp_ticks(sc, v))); + V_KEEPALIVEINTVL(M_KEEPALIVEINTVL), V_KEEPALIVEINTVL(v)); } - if (TUNABLE_INT_FETCH("hw.cxgbe.toe.keepalive_count", &v)) { - v &= M_KEEPALIVEMAXR1; + if (t4_toe_keepalive_count != 0) { + v = t4_toe_keepalive_count & M_KEEPALIVEMAXR2; t4_set_reg_field(sc, A_TP_SHIFT_CNT, V_KEEPALIVEMAXR1(M_KEEPALIVEMAXR1) | V_KEEPALIVEMAXR2(M_KEEPALIVEMAXR2), V_KEEPALIVEMAXR1(1) | V_KEEPALIVEMAXR2(v)); } - if (TUNABLE_INT_FETCH("hw.cxgbe.toe.rexmt_min", &v)) { + if (t4_toe_rexmt_min != 0) { + v = us_to_tcp_ticks(sc, t4_toe_rexmt_min); + v &= M_RXTMIN; t4_set_reg_field(sc, A_TP_RXT_MIN, - V_RXTMIN(M_RXTMIN), V_RXTMIN(ms_to_tcp_ticks(sc, v))); + V_RXTMIN(M_RXTMIN), V_RXTMIN(v)); } - if (TUNABLE_INT_FETCH("hw.cxgbe.toe.rexmt_max", &v)) { + if (t4_toe_rexmt_max != 0) { + v = us_to_tcp_ticks(sc, t4_toe_rexmt_max); + v &= M_RXTMAX; t4_set_reg_field(sc, A_TP_RXT_MAX, - V_RXTMAX(M_RXTMAX), V_RXTMAX(ms_to_tcp_ticks(sc, v))); + V_RXTMAX(M_RXTMAX), V_RXTMAX(v)); } - if (TUNABLE_INT_FETCH("hw.cxgbe.toe.rexmt_count", &v)) { - v &= M_RXTSHIFTMAXR1; + if (t4_toe_rexmt_count != 0) { + v = t4_toe_rexmt_count & M_RXTSHIFTMAXR2; t4_set_reg_field(sc, A_TP_SHIFT_CNT, V_RXTSHIFTMAXR1(M_RXTSHIFTMAXR1) | V_RXTSHIFTMAXR2(M_RXTSHIFTMAXR2), V_RXTSHIFTMAXR1(1) | V_RXTSHIFTMAXR2(v)); } - for (i = 0; i < 16; i++) { - snprintf(s, sizeof(s), "hw.cxgbe.toe.rexmt_backoff.%d", i); - if (TUNABLE_INT_FETCH(s, &v)) { - v &= M_TIMERBACKOFFINDEX0; + for (i = 0; i < nitems(t4_toe_rexmt_backoff); i++) { + if (t4_toe_rexmt_backoff[i] != -1) { + v = t4_toe_rexmt_backoff[i] & M_TIMERBACKOFFINDEX0; shift = (i & 3) << 3; t4_set_reg_field(sc, A_TP_TCP_BACKOFF_REG0 + (i & ~3), M_TIMERBACKOFFINDEX0 << shift, v << shift); } } +#endif return (0); }