On Fri, Mar 29, 2024 at 12:53 AM Jaewon Kim <jaewon02.kim@xxxxxxxxxxx> wrote: > > 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. > Thanks for the explanation! Please feel free to add: Reviewed-by: Sam Protsenko <semen.protsenko@xxxxxxxxxx> > >> 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. > No no, I was just curious. "Fixes" is fine with me. > >> 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 >