diff options
author | arybchik <arybchik@FreeBSD.org> | 2015-03-25 13:11:19 +0000 |
---|---|---|
committer | arybchik <arybchik@FreeBSD.org> | 2015-03-25 13:11:19 +0000 |
commit | 7226fa93cac4e7cc7b3b6004265f143f7ef24d4c (patch) | |
tree | aeb54b2e4921ece890d41545df1c47404aa8c3d6 /sys/dev/sfxge | |
parent | e5108d2f3104998466166cd9547b87594e0abb52 (diff) | |
download | FreeBSD-src-7226fa93cac4e7cc7b3b6004265f143f7ef24d4c.zip FreeBSD-src-7226fa93cac4e7cc7b3b6004265f143f7ef24d4c.tar.gz |
MFC: 279182
sfxge: correct event queue interrupt moderation timer quanta
Submitted by: Andrew Lee <alee at solarflare.com>
Sponsored by: Solarflare Communications, Inc.
Approved by: gnn (mentor)
Diffstat (limited to 'sys/dev/sfxge')
-rw-r--r-- | sys/dev/sfxge/common/efx.h | 3 | ||||
-rw-r--r-- | sys/dev/sfxge/common/efx_ev.c | 4 | ||||
-rw-r--r-- | sys/dev/sfxge/common/efx_impl.h | 3 | ||||
-rw-r--r-- | sys/dev/sfxge/common/siena_nic.c | 6 | ||||
-rw-r--r-- | sys/dev/sfxge/sfxge_ev.c | 2 |
5 files changed, 11 insertions, 7 deletions
diff --git a/sys/dev/sfxge/common/efx.h b/sys/dev/sfxge/common/efx.h index 1fc1e1a..c5f832f 100644 --- a/sys/dev/sfxge/common/efx.h +++ b/sys/dev/sfxge/common/efx.h @@ -895,7 +895,8 @@ typedef struct efx_nic_cfg_s { uint32_t enc_txq_limit; uint32_t enc_rxq_limit; uint32_t enc_buftbl_limit; - uint32_t enc_evq_moderation_max; + uint32_t enc_evq_timer_quantum_ns; + uint32_t enc_evq_timer_max_us; uint32_t enc_clk_mult; #if EFSYS_OPT_LOOPBACK uint32_t enc_loopback_types[EFX_LINK_NMODES]; diff --git a/sys/dev/sfxge/common/efx_ev.c b/sys/dev/sfxge/common/efx_ev.c index feed316..fff7803 100644 --- a/sys/dev/sfxge/common/efx_ev.c +++ b/sys/dev/sfxge/common/efx_ev.c @@ -857,7 +857,7 @@ efx_ev_qmoderate( EFSYS_ASSERT3U(eep->ee_magic, ==, EFX_EVQ_MAGIC); - if (us > encp->enc_evq_moderation_max) { + if (us > encp->enc_evq_timer_max_us) { rc = EINVAL; goto fail1; } @@ -876,7 +876,7 @@ efx_ev_qmoderate( uint32_t timer_val; /* Calculate the timer value in quanta */ - timer_val = us * encp->enc_clk_mult / EFX_EV_TIMER_QUANTUM; + timer_val = us * 1000 / encp->enc_evq_timer_quantum_ns; /* Moderation value is base 0 so we need to deduct 1 */ if (timer_val > 0) diff --git a/sys/dev/sfxge/common/efx_impl.h b/sys/dev/sfxge/common/efx_impl.h index 6202276..937906e 100644 --- a/sys/dev/sfxge/common/efx_impl.h +++ b/sys/dev/sfxge/common/efx_impl.h @@ -408,7 +408,8 @@ struct efx_evq_s { #define EFX_EVQ_MAGIC 0x08081997 -#define EFX_EV_TIMER_QUANTUM 5 +#define EFX_EVQ_FALCON_TIMER_QUANTUM_NS 4968 /* 621 cycles */ +#define EFX_EVQ_SIENA_TIMER_QUANTUM_NS 6144 /* 768 cycles */ struct efx_rxq_s { uint32_t er_magic; diff --git a/sys/dev/sfxge/common/siena_nic.c b/sys/dev/sfxge/common/siena_nic.c index 1e97adb..1276c93 100644 --- a/sys/dev/sfxge/common/siena_nic.c +++ b/sys/dev/sfxge/common/siena_nic.c @@ -329,8 +329,10 @@ siena_board_cfg( encp->enc_clk_mult = 2; } - encp->enc_evq_moderation_max = EFX_EV_TIMER_QUANTUM << - FRF_AB_TIMER_VAL_WIDTH / encp->enc_clk_mult; + encp->enc_evq_timer_quantum_ns = + EFX_EVQ_SIENA_TIMER_QUANTUM_NS / encp->enc_clk_mult; + encp->enc_evq_timer_max_us = (encp->enc_evq_timer_quantum_ns << + FRF_CZ_TC_TIMER_VAL_WIDTH) / 1000; /* Resource limits */ req.emr_cmd = MC_CMD_GET_RESOURCE_LIMITS; diff --git a/sys/dev/sfxge/sfxge_ev.c b/sys/dev/sfxge/sfxge_ev.c index 997eb9f..1b1caf7 100644 --- a/sys/dev/sfxge/sfxge_ev.c +++ b/sys/dev/sfxge/sfxge_ev.c @@ -517,7 +517,7 @@ sfxge_int_mod_handler(SYSCTL_HANDLER_ARGS) * so we have to range-check the value ourselves. */ if (moderation > - efx_nic_cfg_get(sc->enp)->enc_evq_moderation_max) { + efx_nic_cfg_get(sc->enp)->enc_evq_timer_max_us) { error = EINVAL; goto out; } |