if (!spi->cur_usedma && spi->rx_buf && (spi->rx_len > 0))
                stm32_spi_read_rxfifo(spi, true);
 
-       if (spi->cur_usedma && spi->tx_buf)
+       if (spi->cur_usedma && spi->dma_tx)
                dmaengine_terminate_all(spi->dma_tx);
-       if (spi->cur_usedma && spi->rx_buf)
+       if (spi->cur_usedma && spi->dma_rx)
                dmaengine_terminate_all(spi->dma_rx);
 
        stm32_spi_clr_bits(spi, STM32_SPI_CR1, SPI_CR1_SPE);
        spin_lock_irqsave(&spi->lock, flags);
 
        rx_dma_desc = NULL;
-       if (spi->rx_buf) {
+       if (spi->rx_buf && spi->dma_rx) {
                stm32_spi_dma_config(spi, &rx_dma_conf, DMA_DEV_TO_MEM);
                dmaengine_slave_config(spi->dma_rx, &rx_dma_conf);
 
        }
 
        tx_dma_desc = NULL;
-       if (spi->tx_buf) {
+       if (spi->tx_buf && spi->dma_tx) {
                stm32_spi_dma_config(spi, &tx_dma_conf, DMA_MEM_TO_DEV);
                dmaengine_slave_config(spi->dma_tx, &tx_dma_conf);
 
                                        DMA_PREP_INTERRUPT);
        }
 
-       if ((spi->tx_buf && !tx_dma_desc) ||
-           (spi->rx_buf && !rx_dma_desc))
+       if ((spi->tx_buf && spi->dma_tx && !tx_dma_desc) ||
+           (spi->rx_buf && spi->dma_rx && !rx_dma_desc))
+               goto dma_desc_error;
+
+       if (spi->cur_comm == SPI_FULL_DUPLEX && (!tx_dma_desc || !rx_dma_desc))
                goto dma_desc_error;
 
        if (rx_dma_desc) {
        return 1;
 
 dma_submit_error:
-       if (spi->rx_buf)
+       if (spi->dma_rx)
                dmaengine_terminate_all(spi->dma_rx);
 
 dma_desc_error:
 
        dev_info(spi->dev, "DMA issue: fall back to irq transfer\n");
 
+       spi->cur_usedma = false;
        return stm32_spi_transfer_one_irq(spi);
 }
 
        spi->rx_len = spi->rx_buf ? transfer->len : 0;
 
        spi->cur_usedma = (master->can_dma &&
-                          stm32_spi_can_dma(master, spi_dev, transfer));
+                          master->can_dma(master, spi_dev, transfer));
 
        ret = stm32_spi_transfer_one_setup(spi, spi_dev, transfer);
        if (ret) {