When no post-completion processing is expected, don't waste time handling useless interrupts.
Only set QMC_BD_[R/T]X_I and QMC_BD_[R/T]X_UB when a completion function is passed in. Signed-off-by: Christophe Leroy <christophe.le...@csgroup.eu> --- drivers/soc/fsl/qe/qmc.c | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/drivers/soc/fsl/qe/qmc.c b/drivers/soc/fsl/qe/qmc.c index 36c0ccc06151..0a704fd0b1a0 100644 --- a/drivers/soc/fsl/qe/qmc.c +++ b/drivers/soc/fsl/qe/qmc.c @@ -474,7 +474,9 @@ int qmc_chan_write_submit(struct qmc_chan *chan, dma_addr_t addr, size_t length, xfer_desc->context = context; /* Activate the descriptor */ - ctrl |= (QMC_BD_TX_R | QMC_BD_TX_UB); + ctrl |= QMC_BD_TX_R; + if (complete) + ctrl |= QMC_BD_TX_I | QMC_BD_TX_UB; wmb(); /* Be sure to flush the descriptor before control update */ qmc_write16(&bd->cbd_sc, ctrl); @@ -586,7 +588,9 @@ int qmc_chan_read_submit(struct qmc_chan *chan, dma_addr_t addr, size_t length, QMC_BD_RX_AB | QMC_BD_RX_CR); /* Activate the descriptor */ - ctrl |= (QMC_BD_RX_E | QMC_BD_RX_UB); + ctrl |= QMC_BD_RX_E; + if (complete) + ctrl |= QMC_BD_RX_I | QMC_BD_RX_UB; wmb(); /* Be sure to flush data before descriptor activation */ qmc_write16(&bd->cbd_sc, ctrl); @@ -1482,19 +1486,19 @@ static int qmc_setup_chan(struct qmc *qmc, struct qmc_chan *chan) /* Init Rx BDs and set Wrap bit on last descriptor */ BUILD_BUG_ON(QMC_NB_RXBDS == 0); - val = QMC_BD_RX_I; for (i = 0; i < QMC_NB_RXBDS; i++) { bd = chan->rxbds + i; - qmc_write16(&bd->cbd_sc, val); + qmc_write16(&bd->cbd_sc, 0); } bd = chan->rxbds + QMC_NB_RXBDS - 1; - qmc_write16(&bd->cbd_sc, val | QMC_BD_RX_W); + qmc_write16(&bd->cbd_sc, QMC_BD_RX_W); /* Init Tx BDs and set Wrap bit on last descriptor */ BUILD_BUG_ON(QMC_NB_TXBDS == 0); - val = QMC_BD_TX_I; if (chan->mode == QMC_HDLC) - val |= QMC_BD_TX_L | QMC_BD_TX_TC; + val = QMC_BD_TX_L | QMC_BD_TX_TC; + else + val = 0; for (i = 0; i < QMC_NB_TXBDS; i++) { bd = chan->txbds + i; qmc_write16(&bd->cbd_sc, val); -- 2.47.0