X-Git-Url: http://git.droids-corp.org/?a=blobdiff_plain;f=drivers%2Fnet%2Fsfc%2Fsfc_ev.c;h=322a391100feb5b48ff741367646b8346fa60e7d;hb=3379085a648496d7557cdebb7392b3ca517b56ec;hp=83115e87758b737dfc480c224b272e4034352867;hpb=a0147be54763c09daca94eec7cb075214788ca65;p=dpdk.git diff --git a/drivers/net/sfc/sfc_ev.c b/drivers/net/sfc/sfc_ev.c index 83115e8775..322a391100 100644 --- a/drivers/net/sfc/sfc_ev.c +++ b/drivers/net/sfc/sfc_ev.c @@ -162,6 +162,32 @@ sfc_ev_dp_rx(void *arg, __rte_unused uint32_t label, uint32_t id, return evq->sa->priv.dp_rx->qrx_ev(dp_rxq, id); } +static boolean_t +sfc_ev_nop_rx_packets(void *arg, uint32_t label, unsigned int num_packets, + uint32_t flags) +{ + struct sfc_evq *evq = arg; + + sfc_err(evq->sa, + "EVQ %u unexpected Rx packets event label=%u num=%u flags=%#x", + evq->evq_index, label, num_packets, flags); + return B_TRUE; +} + +static boolean_t +sfc_ev_dp_rx_packets(void *arg, __rte_unused uint32_t label, + unsigned int num_packets, __rte_unused uint32_t flags) +{ + struct sfc_evq *evq = arg; + struct sfc_dp_rxq *dp_rxq; + + dp_rxq = evq->dp_rxq; + SFC_ASSERT(dp_rxq != NULL); + + SFC_ASSERT(evq->sa->priv.dp_rx->qrx_ev != NULL); + return evq->sa->priv.dp_rx->qrx_ev(dp_rxq, num_packets); +} + static boolean_t sfc_ev_nop_rx_ps(void *arg, uint32_t label, uint32_t id, uint32_t pkt_count, uint16_t flags) @@ -429,6 +455,7 @@ sfc_ev_link_change(void *arg, efx_link_mode_t link_mode) static const efx_ev_callbacks_t sfc_ev_callbacks = { .eec_initialized = sfc_ev_initialized, .eec_rx = sfc_ev_nop_rx, + .eec_rx_packets = sfc_ev_nop_rx_packets, .eec_rx_ps = sfc_ev_nop_rx_ps, .eec_tx = sfc_ev_nop_tx, .eec_exception = sfc_ev_exception, @@ -445,6 +472,7 @@ static const efx_ev_callbacks_t sfc_ev_callbacks = { static const efx_ev_callbacks_t sfc_ev_callbacks_efx_rx = { .eec_initialized = sfc_ev_initialized, .eec_rx = sfc_ev_efx_rx, + .eec_rx_packets = sfc_ev_nop_rx_packets, .eec_rx_ps = sfc_ev_nop_rx_ps, .eec_tx = sfc_ev_nop_tx, .eec_exception = sfc_ev_exception, @@ -461,6 +489,7 @@ static const efx_ev_callbacks_t sfc_ev_callbacks_efx_rx = { static const efx_ev_callbacks_t sfc_ev_callbacks_dp_rx = { .eec_initialized = sfc_ev_initialized, .eec_rx = sfc_ev_dp_rx, + .eec_rx_packets = sfc_ev_dp_rx_packets, .eec_rx_ps = sfc_ev_dp_rx_ps, .eec_tx = sfc_ev_nop_tx, .eec_exception = sfc_ev_exception, @@ -477,6 +506,7 @@ static const efx_ev_callbacks_t sfc_ev_callbacks_dp_rx = { static const efx_ev_callbacks_t sfc_ev_callbacks_efx_tx = { .eec_initialized = sfc_ev_initialized, .eec_rx = sfc_ev_nop_rx, + .eec_rx_packets = sfc_ev_nop_rx_packets, .eec_rx_ps = sfc_ev_nop_rx_ps, .eec_tx = sfc_ev_tx, .eec_exception = sfc_ev_exception, @@ -493,6 +523,7 @@ static const efx_ev_callbacks_t sfc_ev_callbacks_efx_tx = { static const efx_ev_callbacks_t sfc_ev_callbacks_dp_tx = { .eec_initialized = sfc_ev_initialized, .eec_rx = sfc_ev_nop_rx, + .eec_rx_packets = sfc_ev_nop_rx_packets, .eec_rx_ps = sfc_ev_nop_rx_ps, .eec_tx = sfc_ev_dp_tx, .eec_exception = sfc_ev_exception, @@ -600,7 +631,7 @@ sfc_ev_qstart(struct sfc_evq *evq, unsigned int hw_index) /* Clear all events */ (void)memset((void *)esmp->esm_base, 0xff, - efx_evq_size(sa->nic, evq->entries)); + efx_evq_size(sa->nic, evq->entries, evq_flags)); if ((sa->intr.lsc_intr && hw_index == sa->mgmt_evq_index) || (sa->intr.rxq_intr && evq->dp_rxq != NULL)) @@ -608,6 +639,8 @@ sfc_ev_qstart(struct sfc_evq *evq, unsigned int hw_index) else evq_flags |= EFX_EVQ_FLAGS_NOTIFY_DISABLED; + evq->init_state = SFC_EVQ_STARTING; + /* Create the common code event queue */ rc = efx_ev_qcreate(sa->nic, hw_index, esmp, evq->entries, 0 /* unused on EF10 */, 0, evq_flags, @@ -632,7 +665,13 @@ sfc_ev_qstart(struct sfc_evq *evq, unsigned int hw_index) evq->callbacks = &sfc_ev_callbacks; } - evq->init_state = SFC_EVQ_STARTING; + /* + * Poll once to ensure that eec_initialized callback is invoked in + * case if the hardware does not support INIT_DONE events. If the + * hardware supports INIT_DONE events, this will do nothing, and the + * corresponding event will be processed by sfc_ev_qpoll() below. + */ + efx_ev_qcreate_check_init_done(evq->common, evq->callbacks, evq); /* Wait for the initialization event */ total_delay_us = 0; @@ -665,10 +704,10 @@ done: return 0; fail_timedout: - evq->init_state = SFC_EVQ_INITIALIZED; efx_ev_qdestroy(evq->common); fail_ev_qcreate: + evq->init_state = SFC_EVQ_INITIALIZED; sfc_log_init(sa, "failed %d", rc); return rc; } @@ -825,8 +864,8 @@ sfc_ev_qinit(struct sfc_adapter *sa, /* Allocate DMA space */ rc = sfc_dma_alloc(sa, sfc_evq_type2str(type), type_index, - efx_evq_size(sa->nic, evq->entries), socket_id, - &evq->mem); + efx_evq_size(sa->nic, evq->entries, sa->evq_flags), + socket_id, &evq->mem); if (rc != 0) goto fail_dma_alloc;