Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F132577039
D6673.id17177.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
5 KB
Referenced Files
None
Subscribers
None
D6673.id17177.diff
View Options
Index: head/sys/dev/sfxge/common/ef10_ev.c
===================================================================
--- head/sys/dev/sfxge/common/ef10_ev.c
+++ head/sys/dev/sfxge/common/ef10_ev.c
@@ -92,8 +92,10 @@
__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 @@
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 @@
__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 @@
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 @@
* 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:
Index: head/sys/dev/sfxge/common/ef10_impl.h
===================================================================
--- head/sys/dev/sfxge/common/ef10_impl.h
+++ head/sys/dev/sfxge/common/ef10_impl.h
@@ -84,6 +84,7 @@
__in efsys_mem_t *esmp,
__in size_t n,
__in uint32_t id,
+ __in uint32_t us,
__in efx_evq_t *eep);
void
Index: head/sys/dev/sfxge/common/efx.h
===================================================================
--- head/sys/dev/sfxge/common/efx.h
+++ head/sys/dev/sfxge/common/efx.h
@@ -1602,6 +1602,7 @@
__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
Index: head/sys/dev/sfxge/common/efx_ev.c
===================================================================
--- head/sys/dev/sfxge/common/efx_ev.c
+++ head/sys/dev/sfxge/common/efx_ev.c
@@ -70,6 +70,7 @@
__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 @@
__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 @@
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 @@
__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 @@
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:
Index: head/sys/dev/sfxge/common/efx_impl.h
===================================================================
--- head/sys/dev/sfxge/common/efx_impl.h
+++ head/sys/dev/sfxge/common/efx_impl.h
@@ -95,7 +95,7 @@
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);
Index: head/sys/dev/sfxge/sfxge_ev.c
===================================================================
--- head/sys/dev/sfxge/sfxge_ev.c
+++ head/sys/dev/sfxge/sfxge_ev.c
@@ -704,14 +704,11 @@
/* 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;
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Sun, Oct 19, 3:04 AM (1 h, 39 s)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
23907280
Default Alt Text
D6673.id17177.diff (5 KB)
Attached To
Mode
D6673: sfxge(4): set moderation in efx_ev_qcreate.
Attached
Detach File
Event Timeline
Log In to Comment