mirror of
https://git.hardenedbsd.org/hardenedbsd/HardenedBSD.git
synced 2024-12-27 21:44:34 +01:00
cxgbe(4): Display some more TOE parameters related to retransmission
and keepalive in the sysctl MIB. Provide tunables to change some of these parameters. These are supposed to be setup by the firmware so these tunables are for experimentation only. MFC after: 2 weeks Sponsored by: Chelsio Communications
This commit is contained in:
parent
99eedcd6a4
commit
dcbe705600
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=321435
@ -501,6 +501,15 @@ 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)
|
||||
{
|
||||
u_long l;
|
||||
|
||||
l = (u_long)ms * adap->params.vpd.cclk >> adap->params.tp.tre;
|
||||
|
||||
return (l);
|
||||
}
|
||||
|
||||
void t4_set_reg_field(struct adapter *adap, unsigned int addr, u32 mask, u32 val);
|
||||
|
||||
int t4_wr_mbox_meat_timeout(struct adapter *adap, int mbox, const void *cmd,
|
||||
|
@ -551,6 +551,8 @@ static int sysctl_tc_params(SYSCTL_HANDLER_ARGS);
|
||||
static int sysctl_tp_tick(SYSCTL_HANDLER_ARGS);
|
||||
static int sysctl_tp_dack_timer(SYSCTL_HANDLER_ARGS);
|
||||
static int sysctl_tp_timer(SYSCTL_HANDLER_ARGS);
|
||||
static int sysctl_tp_shift_cnt(SYSCTL_HANDLER_ARGS);
|
||||
static int sysctl_tp_backoff(SYSCTL_HANDLER_ARGS);
|
||||
#endif
|
||||
static uint32_t fconf_iconf_to_mode(uint32_t, uint32_t);
|
||||
static uint32_t mode_to_fconf(uint32_t);
|
||||
@ -3607,12 +3609,62 @@ static int
|
||||
set_params__post_init(struct adapter *sc)
|
||||
{
|
||||
uint32_t param, val;
|
||||
int i, v, shift;
|
||||
char s[32];
|
||||
|
||||
/* 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);
|
||||
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
if (TUNABLE_INT_FETCH("hw.cxgbe.toe.keepalive_idle", &v)) {
|
||||
t4_set_reg_field(sc, A_TP_KEEP_IDLE,
|
||||
V_KEEPALIVEIDLE(M_KEEPALIVEIDLE),
|
||||
V_KEEPALIVEIDLE(ms_to_tcp_ticks(sc, v)));
|
||||
}
|
||||
if (TUNABLE_INT_FETCH("hw.cxgbe.toe.keepalive_interval", &v)) {
|
||||
t4_set_reg_field(sc, A_TP_KEEP_INTVL,
|
||||
V_KEEPALIVEINTVL(M_KEEPALIVEINTVL),
|
||||
V_KEEPALIVEINTVL(ms_to_tcp_ticks(sc, v)));
|
||||
}
|
||||
if (TUNABLE_INT_FETCH("hw.cxgbe.toe.keepalive_count", &v)) {
|
||||
v &= M_KEEPALIVEMAXR1;
|
||||
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)) {
|
||||
t4_set_reg_field(sc, A_TP_RXT_MIN,
|
||||
V_RXTMIN(M_RXTMIN), V_RXTMIN(ms_to_tcp_ticks(sc, v)));
|
||||
}
|
||||
if (TUNABLE_INT_FETCH("hw.cxgbe.toe.rexmt_max", &v)) {
|
||||
t4_set_reg_field(sc, A_TP_RXT_MAX,
|
||||
V_RXTMAX(M_RXTMAX), V_RXTMAX(ms_to_tcp_ticks(sc, v)));
|
||||
}
|
||||
if (TUNABLE_INT_FETCH("hw.cxgbe.toe.rexmt_count", &v)) {
|
||||
v &= M_RXTSHIFTMAXR1;
|
||||
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;
|
||||
shift = (i & 3) << 3;
|
||||
t4_set_reg_field(sc, A_TP_TCP_BACKOFF_REG0 + (i & ~3),
|
||||
M_TIMERBACKOFFINDEX0 << shift, v << shift);
|
||||
}
|
||||
}
|
||||
return (0);
|
||||
}
|
||||
|
||||
@ -5255,6 +5307,9 @@ t4_sysctls(struct adapter *sc)
|
||||
|
||||
#ifdef TCP_OFFLOAD
|
||||
if (is_offload(sc)) {
|
||||
int i;
|
||||
char s[4];
|
||||
|
||||
/*
|
||||
* dev.t4nex.X.toe.
|
||||
*/
|
||||
@ -5301,11 +5356,11 @@ t4_sysctls(struct adapter *sc)
|
||||
|
||||
SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "rexmt_min",
|
||||
CTLTYPE_ULONG | CTLFLAG_RD, sc, A_TP_RXT_MIN,
|
||||
sysctl_tp_timer, "LU", "Retransmit min (us)");
|
||||
sysctl_tp_timer, "LU", "Minimum retransmit interval (us)");
|
||||
|
||||
SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "rexmt_max",
|
||||
CTLTYPE_ULONG | CTLFLAG_RD, sc, A_TP_RXT_MAX,
|
||||
sysctl_tp_timer, "LU", "Retransmit max (us)");
|
||||
sysctl_tp_timer, "LU", "Maximum retransmit interval (us)");
|
||||
|
||||
SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "persist_min",
|
||||
CTLTYPE_ULONG | CTLFLAG_RD, sc, A_TP_PERS_MIN,
|
||||
@ -5317,11 +5372,11 @@ t4_sysctls(struct adapter *sc)
|
||||
|
||||
SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "keepalive_idle",
|
||||
CTLTYPE_ULONG | CTLFLAG_RD, sc, A_TP_KEEP_IDLE,
|
||||
sysctl_tp_timer, "LU", "Keepidle idle timer (us)");
|
||||
sysctl_tp_timer, "LU", "Keepalive idle timer (us)");
|
||||
|
||||
SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "keepalive_intvl",
|
||||
SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "keepalive_interval",
|
||||
CTLTYPE_ULONG | CTLFLAG_RD, sc, A_TP_KEEP_INTVL,
|
||||
sysctl_tp_timer, "LU", "Keepidle interval (us)");
|
||||
sysctl_tp_timer, "LU", "Keepalive interval timer (us)");
|
||||
|
||||
SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "initial_srtt",
|
||||
CTLTYPE_ULONG | CTLFLAG_RD, sc, A_TP_INIT_SRTT,
|
||||
@ -5330,6 +5385,31 @@ t4_sysctls(struct adapter *sc)
|
||||
SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "finwait2_timer",
|
||||
CTLTYPE_ULONG | CTLFLAG_RD, sc, A_TP_FINWAIT2_TIMER,
|
||||
sysctl_tp_timer, "LU", "FINWAIT2 timer (us)");
|
||||
|
||||
SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "syn_rexmt_count",
|
||||
CTLTYPE_UINT | CTLFLAG_RD, sc, S_SYNSHIFTMAX,
|
||||
sysctl_tp_shift_cnt, "IU",
|
||||
"Number of SYN retransmissions before abort");
|
||||
|
||||
SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "rexmt_count",
|
||||
CTLTYPE_UINT | CTLFLAG_RD, sc, S_RXTSHIFTMAXR2,
|
||||
sysctl_tp_shift_cnt, "IU",
|
||||
"Number of retransmissions before abort");
|
||||
|
||||
SYSCTL_ADD_PROC(ctx, children, OID_AUTO, "keepalive_count",
|
||||
CTLTYPE_UINT | CTLFLAG_RD, sc, S_KEEPALIVEMAXR2,
|
||||
sysctl_tp_shift_cnt, "IU",
|
||||
"Number of keepalive probes before abort");
|
||||
|
||||
oid = SYSCTL_ADD_NODE(ctx, children, OID_AUTO, "rexmt_backoff",
|
||||
CTLFLAG_RD, NULL, "TOE retransmit backoffs");
|
||||
children = SYSCTL_CHILDREN(oid);
|
||||
for (i = 0; i < 16; i++) {
|
||||
snprintf(s, sizeof(s), "%u", i);
|
||||
SYSCTL_ADD_PROC(ctx, children, OID_AUTO, s,
|
||||
CTLTYPE_UINT | CTLFLAG_RD, sc, i, sysctl_tp_backoff,
|
||||
"IU", "TOE retransmit backoff");
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
@ -8149,6 +8229,40 @@ sysctl_tp_timer(SYSCTL_HANDLER_ARGS)
|
||||
|
||||
return (sysctl_handle_long(oidp, &v, 0, req));
|
||||
}
|
||||
|
||||
/*
|
||||
* All fields in TP_SHIFT_CNT are 4b and the starting location of the field is
|
||||
* passed to this function.
|
||||
*/
|
||||
static int
|
||||
sysctl_tp_shift_cnt(SYSCTL_HANDLER_ARGS)
|
||||
{
|
||||
struct adapter *sc = arg1;
|
||||
int idx = arg2;
|
||||
u_int v;
|
||||
|
||||
MPASS(idx >= 0 && idx <= 24);
|
||||
|
||||
v = (t4_read_reg(sc, A_TP_SHIFT_CNT) >> idx) & 0xf;
|
||||
|
||||
return (sysctl_handle_int(oidp, &v, 0, req));
|
||||
}
|
||||
|
||||
static int
|
||||
sysctl_tp_backoff(SYSCTL_HANDLER_ARGS)
|
||||
{
|
||||
struct adapter *sc = arg1;
|
||||
int idx = arg2;
|
||||
u_int shift, v, r;
|
||||
|
||||
MPASS(idx >= 0 && idx < 16);
|
||||
|
||||
r = A_TP_TCP_BACKOFF_REG0 + (idx & ~3);
|
||||
shift = (idx & 3) << 3;
|
||||
v = (t4_read_reg(sc, r) >> shift) & M_TIMERBACKOFFINDEX0;
|
||||
|
||||
return (sysctl_handle_int(oidp, &v, 0, req));
|
||||
}
|
||||
#endif
|
||||
|
||||
static uint32_t
|
||||
|
Loading…
Reference in New Issue
Block a user