Changeset View
Changeset View
Standalone View
Standalone View
head/sys/dev/sfxge/sfxge_ev.c
Show First 20 Lines • Show All 78 Lines • ▼ Show 20 Lines | do { | ||||
txq = next; | txq = next; | ||||
} while (txq != NULL); | } while (txq != NULL); | ||||
} | } | ||||
if (rxq->pending != rxq->completed) | if (rxq->pending != rxq->completed) | ||||
sfxge_rx_qcomplete(rxq, eop); | sfxge_rx_qcomplete(rxq, eop); | ||||
} | } | ||||
static struct sfxge_rxq * | |||||
sfxge_get_rxq_by_label(struct sfxge_evq *evq, uint32_t label) | |||||
{ | |||||
struct sfxge_rxq *rxq; | |||||
KASSERT(label == 0, ("unexpected rxq label != 0")); | |||||
rxq = evq->sc->rxq[evq->index]; | |||||
KASSERT(rxq != NULL, ("rxq == NULL")); | |||||
KASSERT(evq->index == rxq->index, ("evq->index != rxq->index")); | |||||
return (rxq); | |||||
} | |||||
static boolean_t | static boolean_t | ||||
sfxge_ev_rx(void *arg, uint32_t label, uint32_t id, uint32_t size, | sfxge_ev_rx(void *arg, uint32_t label, uint32_t id, uint32_t size, | ||||
uint16_t flags) | uint16_t flags) | ||||
{ | { | ||||
struct sfxge_evq *evq; | struct sfxge_evq *evq; | ||||
struct sfxge_softc *sc; | struct sfxge_softc *sc; | ||||
struct sfxge_rxq *rxq; | struct sfxge_rxq *rxq; | ||||
unsigned int stop; | unsigned int stop; | ||||
unsigned int delta; | unsigned int delta; | ||||
struct sfxge_rx_sw_desc *rx_desc; | struct sfxge_rx_sw_desc *rx_desc; | ||||
evq = arg; | evq = arg; | ||||
SFXGE_EVQ_LOCK_ASSERT_OWNED(evq); | SFXGE_EVQ_LOCK_ASSERT_OWNED(evq); | ||||
sc = evq->sc; | sc = evq->sc; | ||||
if (evq->exception) | if (evq->exception) | ||||
goto done; | goto done; | ||||
rxq = sc->rxq[label]; | rxq = sfxge_get_rxq_by_label(evq, label); | ||||
KASSERT(rxq != NULL, ("rxq == NULL")); | |||||
KASSERT(evq->index == rxq->index, | |||||
("evq->index != rxq->index")); | |||||
if (__predict_false(rxq->init_state != SFXGE_RXQ_STARTED)) | if (__predict_false(rxq->init_state != SFXGE_RXQ_STARTED)) | ||||
goto done; | goto done; | ||||
stop = (id + 1) & rxq->ptr_mask; | stop = (id + 1) & rxq->ptr_mask; | ||||
id = rxq->pending & rxq->ptr_mask; | id = rxq->pending & rxq->ptr_mask; | ||||
delta = (stop >= id) ? (stop - id) : (rxq->entries - id + stop); | delta = (stop >= id) ? (stop - id) : (rxq->entries - id + stop); | ||||
rxq->pending += delta; | rxq->pending += delta; | ||||
▲ Show 20 Lines • Show All 92 Lines • ▼ Show 20 Lines | sfxge_ev_rxq_flush_done(void *arg, uint32_t rxq_index) | ||||
index = rxq->index; | index = rxq->index; | ||||
if (index == evq->index) { | if (index == evq->index) { | ||||
sfxge_rx_qflush_done(rxq); | sfxge_rx_qflush_done(rxq); | ||||
return (B_FALSE); | return (B_FALSE); | ||||
} | } | ||||
evq = sc->evq[index]; | evq = sc->evq[index]; | ||||
label = rxq_index; | label = 0; | ||||
KASSERT((label & SFXGE_MAGIC_DMAQ_LABEL_MASK) == label, | KASSERT((label & SFXGE_MAGIC_DMAQ_LABEL_MASK) == label, | ||||
("(label & SFXGE_MAGIC_DMAQ_LABEL_MASK) != level")); | ("(label & SFXGE_MAGIC_DMAQ_LABEL_MASK) != level")); | ||||
magic = SFXGE_MAGIC_RX_QFLUSH_DONE | label; | magic = SFXGE_MAGIC_RX_QFLUSH_DONE | label; | ||||
KASSERT(evq->init_state == SFXGE_EVQ_STARTED, | KASSERT(evq->init_state == SFXGE_EVQ_STARTED, | ||||
("evq not started")); | ("evq not started")); | ||||
efx_ev_qpost(evq->common, magic); | efx_ev_qpost(evq->common, magic); | ||||
Show All 17 Lines | sfxge_ev_rxq_flush_failed(void *arg, uint32_t rxq_index) | ||||
rxq = sc->rxq[rxq_index]; | rxq = sc->rxq[rxq_index]; | ||||
KASSERT(rxq != NULL, ("rxq == NULL")); | KASSERT(rxq != NULL, ("rxq == NULL")); | ||||
/* Resend a software event on the correct queue */ | /* Resend a software event on the correct queue */ | ||||
index = rxq->index; | index = rxq->index; | ||||
evq = sc->evq[index]; | evq = sc->evq[index]; | ||||
label = rxq_index; | label = 0; | ||||
KASSERT((label & SFXGE_MAGIC_DMAQ_LABEL_MASK) == label, | KASSERT((label & SFXGE_MAGIC_DMAQ_LABEL_MASK) == label, | ||||
("(label & SFXGE_MAGIC_DMAQ_LABEL_MASK) != label")); | ("(label & SFXGE_MAGIC_DMAQ_LABEL_MASK) != label")); | ||||
magic = SFXGE_MAGIC_RX_QFLUSH_FAILED | label; | magic = SFXGE_MAGIC_RX_QFLUSH_FAILED | label; | ||||
KASSERT(evq->init_state == SFXGE_EVQ_STARTED, | KASSERT(evq->init_state == SFXGE_EVQ_STARTED, | ||||
("evq not started")); | ("evq not started")); | ||||
efx_ev_qpost(evq->common, magic); | efx_ev_qpost(evq->common, magic); | ||||
▲ Show 20 Lines • Show All 102 Lines • ▼ Show 20 Lines | sfxge_ev_software(void *arg, uint16_t magic) | ||||
SFXGE_EVQ_LOCK_ASSERT_OWNED(evq); | SFXGE_EVQ_LOCK_ASSERT_OWNED(evq); | ||||
sc = evq->sc; | sc = evq->sc; | ||||
label = magic & SFXGE_MAGIC_DMAQ_LABEL_MASK; | label = magic & SFXGE_MAGIC_DMAQ_LABEL_MASK; | ||||
magic &= ~SFXGE_MAGIC_DMAQ_LABEL_MASK; | magic &= ~SFXGE_MAGIC_DMAQ_LABEL_MASK; | ||||
switch (magic) { | switch (magic) { | ||||
case SFXGE_MAGIC_RX_QFLUSH_DONE: { | case SFXGE_MAGIC_RX_QFLUSH_DONE: | ||||
struct sfxge_rxq *rxq = sc->rxq[label]; | sfxge_rx_qflush_done(sfxge_get_rxq_by_label(evq, label)); | ||||
KASSERT(rxq != NULL, ("rxq == NULL")); | |||||
KASSERT(evq->index == rxq->index, | |||||
("evq->index != rxq->index")); | |||||
sfxge_rx_qflush_done(rxq); | |||||
break; | break; | ||||
} | |||||
case SFXGE_MAGIC_RX_QFLUSH_FAILED: { | |||||
struct sfxge_rxq *rxq = sc->rxq[label]; | |||||
KASSERT(rxq != NULL, ("rxq == NULL")); | case SFXGE_MAGIC_RX_QFLUSH_FAILED: | ||||
KASSERT(evq->index == rxq->index, | sfxge_rx_qflush_failed(sfxge_get_rxq_by_label(evq, label)); | ||||
("evq->index != rxq->index")); | |||||
sfxge_rx_qflush_failed(rxq); | |||||
break; | break; | ||||
} | |||||
case SFXGE_MAGIC_RX_QREFILL: { | |||||
struct sfxge_rxq *rxq = sc->rxq[label]; | |||||
KASSERT(rxq != NULL, ("rxq == NULL")); | case SFXGE_MAGIC_RX_QREFILL: | ||||
KASSERT(evq->index == rxq->index, | sfxge_rx_qrefill(sfxge_get_rxq_by_label(evq, label)); | ||||
("evq->index != rxq->index")); | |||||
sfxge_rx_qrefill(rxq); | |||||
break; | break; | ||||
} | |||||
case SFXGE_MAGIC_TX_QFLUSH_DONE: { | case SFXGE_MAGIC_TX_QFLUSH_DONE: { | ||||
struct sfxge_txq *txq = sfxge_get_txq_by_label(evq, label); | struct sfxge_txq *txq = sfxge_get_txq_by_label(evq, label); | ||||
KASSERT(txq != NULL, ("txq == NULL")); | KASSERT(txq != NULL, ("txq == NULL")); | ||||
KASSERT(evq->index == txq->evq_index, | KASSERT(evq->index == txq->evq_index, | ||||
("evq->index != txq->evq_index")); | ("evq->index != txq->evq_index")); | ||||
sfxge_tx_qflush_done(txq); | sfxge_tx_qflush_done(txq); | ||||
▲ Show 20 Lines • Show All 559 Lines • Show Last 20 Lines |