summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorarybchik <arybchik@FreeBSD.org>2015-03-25 13:11:19 +0000
committerarybchik <arybchik@FreeBSD.org>2015-03-25 13:11:19 +0000
commit7226fa93cac4e7cc7b3b6004265f143f7ef24d4c (patch)
treeaeb54b2e4921ece890d41545df1c47404aa8c3d6
parente5108d2f3104998466166cd9547b87594e0abb52 (diff)
downloadFreeBSD-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)
-rw-r--r--sys/dev/sfxge/common/efx.h3
-rw-r--r--sys/dev/sfxge/common/efx_ev.c4
-rw-r--r--sys/dev/sfxge/common/efx_impl.h3
-rw-r--r--sys/dev/sfxge/common/siena_nic.c6
-rw-r--r--sys/dev/sfxge/sfxge_ev.c2
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;
}
OpenPOWER on IntegriCloud