コード例 #1
0
ファイル: sfxge_ev.c プロジェクト: JabirTech/Source
static boolean_t
sfxge_ev_software(void *arg, uint16_t magic)
{
	struct sfxge_evq *evq;
	struct sfxge_softc *sc;
	unsigned int label;

	evq = (struct sfxge_evq *)arg;
	sc = evq->sc;

	label = magic & SFXGE_MAGIC_DMAQ_LABEL_MASK;
	magic &= ~SFXGE_MAGIC_DMAQ_LABEL_MASK;

	switch (magic) {
	case SFXGE_MAGIC_RX_QFLUSH_DONE: {
		struct sfxge_rxq *rxq = sc->rxq[label];

		KASSERT(rxq != NULL, ("rxq == NULL"));
		KASSERT(evq->index == rxq->index,
		    ("evq->index != rxq->index"));

		sfxge_rx_qflush_done(rxq);
		break;
	}
	case SFXGE_MAGIC_RX_QFLUSH_FAILED: {
		struct sfxge_rxq *rxq = sc->rxq[label];

		KASSERT(rxq != NULL, ("rxq == NULL"));
		KASSERT(evq->index == rxq->index,
		    ("evq->index != rxq->index"));

		sfxge_rx_qflush_failed(rxq);
		break;
	}
	case SFXGE_MAGIC_RX_QREFILL: {
		struct sfxge_rxq *rxq = sc->rxq[label];

		KASSERT(rxq != NULL, ("rxq == NULL"));
		KASSERT(evq->index == rxq->index,
		    ("evq->index != rxq->index"));

		sfxge_rx_qrefill(rxq);
		break;
	}
	case SFXGE_MAGIC_TX_QFLUSH_DONE: {
		struct sfxge_txq *txq = sfxge_get_txq_by_label(evq, label);

		KASSERT(txq != NULL, ("txq == NULL"));
		KASSERT(evq->index == txq->evq_index,
		    ("evq->index != txq->evq_index"));

		sfxge_tx_qflush_done(txq);
		break;
	}
	default:
		break;
	}

	return (B_FALSE);
}
コード例 #2
0
ファイル: sfxge_ev.c プロジェクト: JasonFord53/freebsd
static boolean_t
sfxge_ev_tx(void *arg, uint32_t label, uint32_t id)
{
	struct sfxge_evq *evq;
	struct sfxge_txq *txq;
	unsigned int stop;
	unsigned int delta;

	evq = (struct sfxge_evq *)arg;
	SFXGE_EVQ_LOCK_ASSERT_OWNED(evq);

	txq = sfxge_get_txq_by_label(evq, label);

	KASSERT(txq != NULL, ("txq == NULL"));
	KASSERT(evq->index == txq->evq_index,
	    ("evq->index != txq->evq_index"));

	if (__predict_false(txq->init_state != SFXGE_TXQ_STARTED))
		goto done;

	stop = (id + 1) & txq->ptr_mask;
	id = txq->pending & txq->ptr_mask;

	delta = (stop >= id) ? (stop - id) : (txq->entries - id + stop);
	txq->pending += delta;

	evq->tx_done++;

	if (txq->next == NULL &&
	    evq->txqs != &(txq->next)) {
		*(evq->txqs) = txq;
		evq->txqs = &(txq->next);
	}

	if (txq->pending - txq->completed >= SFXGE_TX_BATCH)
		sfxge_tx_qcomplete(txq, evq);

done:
	return (evq->tx_done >= SFXGE_EV_BATCH);
}