Message ID | 20180722212010.3979-14-afaerber@suse.de (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | MIPS: pistachio: Creator Ci40 aka Marduk SPI-UART | expand |
On Sun, Jul 22, 2018 at 11:20:08PM +0200, Andreas Färber wrote: > From: Ionela Voinescu <ionela.voinescu@imgtec.com> > > The depth of the FIFOs is 16 bytes. The DMA request line is tied > to the half full/empty (depending on the use of the TX or RX FIFO) > threshold. For the TX FIFO, if you set a burst size of 8 (equal to > half the depth) the first burst goes into FIFO without any issues, > but due the latency involved (the time the data leaves the DMA > engine to the time it arrives at the FIFO), the DMA might trigger > another burst of 8. But given that there is no space for 2 additonal > bursts of 8, this would result in a failure. Therefore, we have to > keep the burst size for TX to 4 to accomodate for an extra burst. This seems like something that should be sent as a bug fix - doesn't it fix anything? If it is a fix then it should've gone at the start of the series so it's got no dependencies and could be sent to Linus for the current release. > While here, move the burst size setting outside of the if/else branches > as they have the same value for both 8 and 32 bit data widths. Though this refactoring probably less so.
diff --git a/drivers/spi/spi-img-spfi.c b/drivers/spi/spi-img-spfi.c index 231b59c1ab60..8ad6c75d0af5 100644 --- a/drivers/spi/spi-img-spfi.c +++ b/drivers/spi/spi-img-spfi.c @@ -346,12 +346,11 @@ static int img_spfi_start_dma(struct spi_master *master, if (xfer->len % 4 == 0) { rxconf.src_addr = spfi->phys + SPFI_RX_32BIT_VALID_DATA; rxconf.src_addr_width = 4; - rxconf.src_maxburst = 4; } else { rxconf.src_addr = spfi->phys + SPFI_RX_8BIT_VALID_DATA; rxconf.src_addr_width = 1; - rxconf.src_maxburst = 4; } + rxconf.src_maxburst = 8; dmaengine_slave_config(spfi->rx_ch, &rxconf); rxdesc = dmaengine_prep_slave_sg(spfi->rx_ch, xfer->rx_sg.sgl, @@ -370,12 +369,11 @@ static int img_spfi_start_dma(struct spi_master *master, if (xfer->len % 4 == 0) { txconf.dst_addr = spfi->phys + SPFI_TX_32BIT_VALID_DATA; txconf.dst_addr_width = 4; - txconf.dst_maxburst = 4; } else { txconf.dst_addr = spfi->phys + SPFI_TX_8BIT_VALID_DATA; txconf.dst_addr_width = 1; - txconf.dst_maxburst = 4; } + txconf.dst_maxburst = 4; dmaengine_slave_config(spfi->tx_ch, &txconf); txdesc = dmaengine_prep_slave_sg(spfi->tx_ch, xfer->tx_sg.sgl,