unsigned int                    tx_fifo_size;
        unsigned int                    rx_fifo_size;
        unsigned int                    base_cs;
+       unsigned int                    fdx_tx_level;
 };
 
 static u32 lantiq_ssc_readl(const struct lantiq_ssc_spi *spi, u32 reg)
        u32 data;
        unsigned int tx_free = tx_fifo_free(spi);
 
+       spi->fdx_tx_level = 0;
        while (spi->tx_todo && tx_free) {
                switch (spi->bits_per_word) {
                case 2 ... 8:
 
                lantiq_ssc_writel(spi, data, LTQ_SPI_TB);
                tx_free--;
+               spi->fdx_tx_level++;
        }
 }
 
        u32 data;
        unsigned int rx_fill = rx_fifo_level(spi);
 
+       /*
+        * Wait until all expected data to be shifted in.
+        * Otherwise, rx overrun may occur.
+        */
+       while (rx_fill != spi->fdx_tx_level)
+               rx_fill = rx_fifo_level(spi);
+
        while (rx_fill) {
                data = lantiq_ssc_readl(spi, LTQ_SPI_RB);