int sfxge_ev_start(struct sfxge_softc *sc) { struct sfxge_intr *intr; int index; int rc; intr = &sc->intr; KASSERT(intr->state == SFXGE_INTR_STARTED, ("intr->state != SFXGE_INTR_STARTED")); /* Initialize the event module */ if ((rc = efx_ev_init(sc->enp)) != 0) return rc; /* Start the event queues */ for (index = 0; index < intr->n_alloc; index++) { if ((rc = sfxge_ev_qstart(sc, index)) != 0) goto fail; } return (0); fail: /* Stop the event queue(s) */ while (--index >= 0) sfxge_ev_qstop(sc, index); /* Tear down the event module */ efx_ev_fini(sc->enp); return (rc); }
int sfc_ev_start(struct sfc_adapter *sa) { int rc; sfc_log_init(sa, "entry"); rc = efx_ev_init(sa->nic); if (rc != 0) goto fail_ev_init; /* Start management EVQ used for global events */ /* * Management event queue start polls the queue, but it cannot * interfere with other polling contexts since mgmt_evq_running * is false yet. */ rc = sfc_ev_qstart(sa->mgmt_evq, sa->mgmt_evq_index); if (rc != 0) goto fail_mgmt_evq_start; rte_spinlock_lock(&sa->mgmt_evq_lock); sa->mgmt_evq_running = true; rte_spinlock_unlock(&sa->mgmt_evq_lock); if (sa->intr.lsc_intr) { rc = sfc_ev_qprime(sa->mgmt_evq); if (rc != 0) goto fail_mgmt_evq_prime; } /* * Start management EVQ polling. If interrupts are disabled * (not used), it is required to process link status change * and other device level events to avoid unrecoverable * error because the event queue overflow. */ sfc_ev_mgmt_periodic_qpoll_start(sa); /* * Rx/Tx event queues are started/stopped when corresponding * Rx/Tx queue is started/stopped. */ return 0; fail_mgmt_evq_prime: sfc_ev_qstop(sa->mgmt_evq); fail_mgmt_evq_start: efx_ev_fini(sa->nic); fail_ev_init: sfc_log_init(sa, "failed %d", rc); return rc; }
void sfc_ev_stop(struct sfc_adapter *sa) { sfc_log_init(sa, "entry"); sfc_ev_mgmt_periodic_qpoll_stop(sa); rte_spinlock_lock(&sa->mgmt_evq_lock); sa->mgmt_evq_running = false; rte_spinlock_unlock(&sa->mgmt_evq_lock); sfc_ev_qstop(sa->mgmt_evq); efx_ev_fini(sa->nic); }
void sfxge_ev_stop(struct sfxge_softc *sc) { struct sfxge_intr *intr; efx_nic_t *enp; int index; intr = &sc->intr; enp = sc->enp; KASSERT(intr->state == SFXGE_INTR_STARTED, ("Interrupts not started")); /* Stop the event queue(s) */ index = intr->n_alloc; while (--index >= 0) sfxge_ev_qstop(sc, index); /* Tear down the event module */ efx_ev_fini(enp); }