svn commit: r301980 - in stable/10/sys/dev/sfxge: . common
Andrew Rybchenko
arybchik at FreeBSD.org
Fri Jun 17 08:56:03 UTC 2016
Author: arybchik
Date: Fri Jun 17 08:56:01 2016
New Revision: 301980
URL: https://svnweb.freebsd.org/changeset/base/301980
Log:
MFC r301122
sfxge(4): set moderation in efx_ev_qcreate
This simplifies setting an initial interrupt moderation value, and
avoids most calls to evx_ev_qmoderate from contexts where MCDI is
not allowed (MCDI is need for an EVQ timer workaround in a later patch).
Submitted by: Andy Moreton <amoreton at solarflare.com>
Reviewed by: gnn
Sponsored by: Solarflare Communications, Inc.
Differential Revision: https://reviews.freebsd.org/D6673
Modified:
stable/10/sys/dev/sfxge/common/ef10_ev.c
stable/10/sys/dev/sfxge/common/ef10_impl.h
stable/10/sys/dev/sfxge/common/efx.h
stable/10/sys/dev/sfxge/common/efx_ev.c
stable/10/sys/dev/sfxge/common/efx_impl.h
stable/10/sys/dev/sfxge/sfxge_ev.c
Directory Properties:
stable/10/ (props changed)
Modified: stable/10/sys/dev/sfxge/common/ef10_ev.c
==============================================================================
--- stable/10/sys/dev/sfxge/common/ef10_ev.c Fri Jun 17 08:54:43 2016 (r301979)
+++ stable/10/sys/dev/sfxge/common/ef10_ev.c Fri Jun 17 08:56:01 2016 (r301980)
@@ -92,8 +92,10 @@ efx_mcdi_init_evq(
__in unsigned int instance,
__in efsys_mem_t *esmp,
__in size_t nevs,
- __in uint32_t irq)
+ __in uint32_t irq,
+ __in uint32_t us)
{
+ efx_nic_cfg_t *encp = &(enp->en_nic_cfg);
efx_mcdi_req_t req;
uint8_t payload[
MAX(MC_CMD_INIT_EVQ_IN_LEN(EFX_EVQ_NBUFS(EFX_EVQ_MAXNEVS)),
@@ -141,10 +143,26 @@ efx_mcdi_init_evq(
INIT_EVQ_IN_FLAG_RX_MERGE, 1,
INIT_EVQ_IN_FLAG_TX_MERGE, 1);
- MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_TMR_MODE,
- MC_CMD_INIT_EVQ_IN_TMR_MODE_DIS);
- MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_TMR_LOAD, 0);
- MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_TMR_RELOAD, 0);
+ if (us == 0) {
+ MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_TMR_MODE,
+ MC_CMD_INIT_EVQ_IN_TMR_MODE_DIS);
+ MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_TMR_LOAD, 0);
+ MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_TMR_RELOAD, 0);
+ } else {
+ uint32_t timer_val;
+
+ /* Calculate the timer value in quanta */
+ 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)
+ timer_val--;
+
+ MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_TMR_MODE,
+ MC_CMD_INIT_EVQ_IN_TMR_INT_HLDOFF);
+ MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_TMR_LOAD, timer_val);
+ MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_TMR_RELOAD, timer_val);
+ }
MCDI_IN_SET_DWORD(req, INIT_EVQ_IN_COUNT_MODE,
MC_CMD_INIT_EVQ_IN_COUNT_MODE_DIS);
@@ -246,6 +264,7 @@ ef10_ev_qcreate(
__in efsys_mem_t *esmp,
__in size_t n,
__in uint32_t id,
+ __in uint32_t us,
__in efx_evq_t *eep)
{
efx_nic_cfg_t *encp = &(enp->en_nic_cfg);
@@ -266,6 +285,11 @@ ef10_ev_qcreate(
goto fail2;
}
+ if (us > encp->enc_evq_timer_max_us) {
+ rc = EINVAL;
+ goto fail3;
+ }
+
/* Set up the handler table */
eep->ee_rx = ef10_ev_rx;
eep->ee_tx = ef10_ev_tx;
@@ -280,11 +304,13 @@ ef10_ev_qcreate(
* Interrupts may be raised for events immediately after the queue is
* created. See bug58606.
*/
- if ((rc = efx_mcdi_init_evq(enp, index, esmp, n, irq)) != 0)
- goto fail3;
+ if ((rc = efx_mcdi_init_evq(enp, index, esmp, n, irq, us)) != 0)
+ goto fail4;
return (0);
+fail4:
+ EFSYS_PROBE(fail4);
fail3:
EFSYS_PROBE(fail3);
fail2:
Modified: stable/10/sys/dev/sfxge/common/ef10_impl.h
==============================================================================
--- stable/10/sys/dev/sfxge/common/ef10_impl.h Fri Jun 17 08:54:43 2016 (r301979)
+++ stable/10/sys/dev/sfxge/common/ef10_impl.h Fri Jun 17 08:56:01 2016 (r301980)
@@ -84,6 +84,7 @@ ef10_ev_qcreate(
__in efsys_mem_t *esmp,
__in size_t n,
__in uint32_t id,
+ __in uint32_t us,
__in efx_evq_t *eep);
void
Modified: stable/10/sys/dev/sfxge/common/efx.h
==============================================================================
--- stable/10/sys/dev/sfxge/common/efx.h Fri Jun 17 08:54:43 2016 (r301979)
+++ stable/10/sys/dev/sfxge/common/efx.h Fri Jun 17 08:56:01 2016 (r301980)
@@ -1602,6 +1602,7 @@ efx_ev_qcreate(
__in efsys_mem_t *esmp,
__in size_t n,
__in uint32_t id,
+ __in uint32_t us,
__deref_out efx_evq_t **eepp);
extern void
Modified: stable/10/sys/dev/sfxge/common/efx_ev.c
==============================================================================
--- stable/10/sys/dev/sfxge/common/efx_ev.c Fri Jun 17 08:54:43 2016 (r301979)
+++ stable/10/sys/dev/sfxge/common/efx_ev.c Fri Jun 17 08:56:01 2016 (r301980)
@@ -70,6 +70,7 @@ siena_ev_qcreate(
__in efsys_mem_t *esmp,
__in size_t n,
__in uint32_t id,
+ __in uint32_t us,
__in efx_evq_t *eep);
static void
@@ -226,6 +227,7 @@ efx_ev_qcreate(
__in efsys_mem_t *esmp,
__in size_t n,
__in uint32_t id,
+ __in uint32_t us,
__deref_out efx_evq_t **eepp)
{
const efx_ev_ops_t *eevop = enp->en_eevop;
@@ -262,7 +264,7 @@ efx_ev_qcreate(
enp->en_ev_qcount++;
*eepp = eep;
- if ((rc = eevop->eevo_qcreate(enp, index, esmp, n, id, eep)) != 0)
+ if ((rc = eevop->eevo_qcreate(enp, index, esmp, n, id, us, eep)) != 0)
goto fail2;
return (0);
@@ -1257,6 +1259,7 @@ siena_ev_qcreate(
__in efsys_mem_t *esmp,
__in size_t n,
__in uint32_t id,
+ __in uint32_t us,
__in efx_evq_t *eep)
{
efx_nic_cfg_t *encp = &(enp->en_nic_cfg);
@@ -1312,6 +1315,9 @@ siena_ev_qcreate(
EFX_BAR_TBL_WRITEO(enp, FR_AZ_EVQ_PTR_TBL, index, &oword, B_TRUE);
+ /* Set initial interrupt moderation */
+ siena_ev_qmoderate(eep, us);
+
return (0);
fail4:
Modified: stable/10/sys/dev/sfxge/common/efx_impl.h
==============================================================================
--- stable/10/sys/dev/sfxge/common/efx_impl.h Fri Jun 17 08:54:43 2016 (r301979)
+++ stable/10/sys/dev/sfxge/common/efx_impl.h Fri Jun 17 08:56:01 2016 (r301980)
@@ -95,7 +95,7 @@ typedef struct efx_ev_ops_s {
void (*eevo_fini)(efx_nic_t *);
efx_rc_t (*eevo_qcreate)(efx_nic_t *, unsigned int,
efsys_mem_t *, size_t, uint32_t,
- efx_evq_t *);
+ uint32_t, efx_evq_t *);
void (*eevo_qdestroy)(efx_evq_t *);
efx_rc_t (*eevo_qprime)(efx_evq_t *, unsigned int);
void (*eevo_qpost)(efx_evq_t *, uint16_t);
Modified: stable/10/sys/dev/sfxge/sfxge_ev.c
==============================================================================
--- stable/10/sys/dev/sfxge/sfxge_ev.c Fri Jun 17 08:54:43 2016 (r301979)
+++ stable/10/sys/dev/sfxge/sfxge_ev.c Fri Jun 17 08:56:01 2016 (r301980)
@@ -699,14 +699,11 @@ sfxge_ev_qstart(struct sfxge_softc *sc,
/* Create the common code event queue. */
if ((rc = efx_ev_qcreate(sc->enp, index, esmp, evq->entries,
- evq->buf_base_id, &evq->common)) != 0)
+ evq->buf_base_id, sc->ev_moderation, &evq->common)) != 0)
goto fail;
SFXGE_EVQ_LOCK(evq);
- /* Set the default moderation */
- (void)efx_ev_qmoderate(evq->common, sc->ev_moderation);
-
/* Prime the event queue for interrupts */
if ((rc = efx_ev_qprime(evq->common, evq->read_ptr)) != 0)
goto fail2;
More information about the svn-src-stable-10
mailing list