Hi Sam, Thanks for your review. On 3/29/24 02:58, Sam Protsenko wrote: > On Tue, Mar 26, 2024 at 10:35 PM Jaewon Kim<jaewon02.kim@xxxxxxxxxxx> wrote: >> The SPI data size is smaller than FIFO, it operates in PIO mode, > Spelling: "The" -> "If the" Thanks, I will fix it v2. >> and if it is larger than FIFO mode, DMA mode is selected. >> >> If the data size is the same as the FIFO size, it operates in PIO mode >> and data is separated into two transfer. In order to prevent, > Nit: "transfer" -> "transfers", "prevent" -> "prevent it" Thanks, I will fix it v2. >> DMA mode must be used from the case of FIFO and data size. >> > You probably mean this code (it occurs two times in the driver): > > xfer->len = fifo_len - 1; > > Can you please elaborate on why it's done this way? Why can't we just > do "xfer->len = fifo_len" and use the whole FIFO for the transfer > instead? I don't understand the necessity to split the transfer into > two chunks if its size is of FIFO length -- wouldn't it fit into FIFO > in that case? (I'm pretty sure this change is correct, just want to > understand how exactly it works). In IRQ mode(S3C64XX_SPI_MODE_RX_RDY_LVL enable), TxOverrun/RxUnderrun irq occurs when FIFO is full. To avoid FIFO full, it is transmitted in a smaller size than fifo_len.(fifo-len - 1) However, in case of "fifo_len == data size" "fifo_len - 1" byte + "1" byte were transmitted separately. This problem can be solved by starting DMA transmission start size from fifo_len. >> Fixes: 1ee806718d5e ("spi: s3c64xx: support interrupt based pio mode") > Just wonder if that fixes some throughput regression, or something > worse (like failed transfers when the transfer size is the same as > FIFO size)? It is not a critical issue, but When I look at the actual waveform, it seems strange that only the last 1-byte is transmitted separately. I thought it was "Fixes", but if not, I will remove it. >> Signed-off-by: Jaewon Kim<jaewon02.kim@xxxxxxxxxxx> >> --- >> drivers/spi/spi-s3c64xx.c | 6 +++--- >> 1 file changed, 3 insertions(+), 3 deletions(-) >> >> diff --git a/drivers/spi/spi-s3c64xx.c b/drivers/spi/spi-s3c64xx.c >> index 9fcbe040cb2f..81ed5fddf83e 100644 >> --- a/drivers/spi/spi-s3c64xx.c >> +++ b/drivers/spi/spi-s3c64xx.c >> @@ -430,7 +430,7 @@ static bool s3c64xx_spi_can_dma(struct spi_controller *host, >> struct s3c64xx_spi_driver_data *sdd = spi_controller_get_devdata(host); >> >> if (sdd->rx_dma.ch && sdd->tx_dma.ch) >> - return xfer->len > sdd->fifo_depth; >> + return xfer->len >= sdd->fifo_depth; >> >> return false; >> } >> @@ -826,11 +826,11 @@ static int s3c64xx_spi_transfer_one(struct spi_controller *host, >> return status; >> } >> >> - if (!is_polling(sdd) && (xfer->len > fifo_len) && >> + if (!is_polling(sdd) && xfer->len >= fifo_len && >> sdd->rx_dma.ch && sdd->tx_dma.ch) { >> use_dma = 1; >> > Would be nice to remove this empty line, while at it. Good, I will remove it also. >> - } else if (xfer->len >= fifo_len) { >> + } else if (xfer->len > fifo_len) { > Below in the same function I can see similar code: > > if (target_len >= fifo_len) > xfer->len = fifo_len - 1; > > Shouldn't that 'if' condition be fixed too? Or it's ok as it is? (Just > noticed it by searching, not sure myself, hence asking). You are correct. This 'if' condition should not have been modified. >> tx_buf = xfer->tx_buf; >> rx_buf = xfer->rx_buf; >> origin_len = xfer->len; >> -- >> 2.43.2 >> >> Thanks Jaewon Kim