• Vladimir Oltean's avatar
    net: dsa: sja1105: Switch to scatter/gather API for SPI · 08839c06
    Vladimir Oltean authored
    This reworks the SPI transfer implementation to make use of more of the
    SPI core features. The main benefit is to avoid the memcpy in
    sja1105_xfer_buf().
    
    The memcpy was only needed because the function was transferring a
    single buffer at a time. So it needed to copy the caller-provided buffer
    at buf + 4, to store the SPI message header in the "headroom" area.
    
    But the SPI core supports scatter-gather messages, comprised of multiple
    transfers. We can actually use those to break apart every SPI message
    into 2 transfers: one for the header and one for the actual payload.
    
    To keep the behavior the same regarding the chip select signal, it is
    necessary to tell the SPI core to de-assert the chip select after each
    chunk. This was not needed before, because each spi_message contained
    only 1 single transfer.
    
    The meaning of the per-transfer cs_change=1 is:
    
    - If the transfer is the last one of the message, keep CS asserted
    - Otherwise, deassert CS
    
    We need to deassert CS in the "otherwise" case, which was implicit
    before.
    
    Avoiding the memcpy creates yet another opportunity. The device can't
    process more than 256 bytes of SPI payload at a time, so the
    sja1105_xfer_long_buf() function used to exist, to split the larger
    caller buffer into chunks.
    
    But these chunks couldn't be used as scatter/gather buffers for
    spi_message until now, because of that memcpy (we would have needed more
    memory for each chunk). So we can now remove the sja1105_xfer_long_buf()
    function and have a single implementation for long and short buffers.
    
    Another benefit is lower usage of stack memory. Previously we had to
    store 2 SPI buffers for each chunk. Due to the elimination of the
    memcpy, we can now send pointers to the actual chunks from the
    caller-supplied buffer to the SPI core.
    
    Since the patch merges two functions into a rewritten implementation,
    the function prototype was also changed, mainly for cosmetic consistency
    with the structures used within it.
    Signed-off-by: default avatarVladimir Oltean <olteanv@gmail.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    08839c06
sja1105_spi.c 18.5 KB