Patch "mfd: ocelot-spi: Fix unsupported bulk read" has been added to the 6.1-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    mfd: ocelot-spi: Fix unsupported bulk read

to the 6.1-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     mfd-ocelot-spi-fix-unsupported-bulk-read.patch
and it can be found in the queue-6.1 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit b59ea1ec8083156e73cf55aed964cac8b4f494ba
Author: Colin Foster <colin.foster@xxxxxxxxxxxxxxxx>
Date:   Wed Mar 22 07:11:30 2023 -0700

    mfd: ocelot-spi: Fix unsupported bulk read
    
    [ Upstream commit f0484d2f80a72022b7fac72bcb406392900ef1eb ]
    
    Ocelot chips (VSC7511, VSC7512, VSC7513, VSC7514) don't support bulk read
    operations over SPI.
    
    Many SPI buses have hardware that can optimize consecutive reads.
    Essentially an address is written to the chip, and if the SPI controller
    continues to toggle the clock, subsequent register values are reported.
    This can lead to significant optimizations, because the time between
    "address is written to the chip" and "chip starts to report data" can often
    take a fixed amount of time.
    
    When support for Ocelot chips were added in commit f3e893626abe ("mfd:
    ocelot: Add support for the vsc7512 chip via spi") it was believed that
    this optimization was supported. However it is not.
    
    Most register transactions with the Ocelot chips are not done in bulk, so
    this bug could go unnoticed. The one scenario where bulk register
    operations _are_ performed is when polling port statistics counters, which
    was added in commit d87b1c08f38a ("net: mscc: ocelot: use bulk reads for
    stats").
    
    Things get slightly more complicated here...
    
    A bug was introduced in commit d4c367650704 ("net: mscc: ocelot: keep
    ocelot_stat_layout by reg address, not offset") that broke the optimization
    of bulk reads. This means that when Ethernet support for the VSC7512 chip
    was added in commit 3d7316ac81ac ("net: dsa: ocelot: add external ocelot
    switch control") things were actually working "as expected".
    
    The bulk read opmtimization was discovered, and fixed in commit
    6acc72a43eac ("net: mscc: ocelot: fix stats region batching") and the
    timing optimizations for SPI were noticed. A bulk read went from ~14ms to
    ~2ms. But this timing improvement came at the cost of every register
    reading zero due the fact that bulk reads don't work.
    
    The read timings increase back to 13-14ms, but that's a price worth paying
    in order to receive valid data. This is verified in a DSA setup (cpsw-new
    switch tied to port 0 on the VSC7512, after having been running overnight)
    
         Rx Octets: 16222055 # Counters from CPSW switch
         Tx Octets: 12034702
         Net Octets: 28256757
         p00_rx_octets: 12034702 # Counters from Ocelot switch
         p00_rx_frames_below_65_octets: 0
         p00_rx_frames_65_to_127_octets: 88188
         p00_rx_frames_128_to_255_octets: 13
         p00_rx_frames_256_to_511_octets: 0
         p00_rx_frames_512_to_1023_octets: 0
         p00_rx_frames_over_1526_octets: 3306
         p00_tx_octets: 16222055
    
    Fixes: f3e893626abe ("mfd: ocelot: Add support for the vsc7512 chip via spi")
    Signed-off-by: Colin Foster <colin.foster@xxxxxxxxxxxxxxxx>
    Signed-off-by: Lee Jones <lee@xxxxxxxxxx>
    Link: https://lore.kernel.org/r/20230322141130.2531256-1-colin.foster@xxxxxxxxxxxxxxxx
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/mfd/ocelot-spi.c b/drivers/mfd/ocelot-spi.c
index 2ecd271de2fb9..85021f94e5874 100644
--- a/drivers/mfd/ocelot-spi.c
+++ b/drivers/mfd/ocelot-spi.c
@@ -130,6 +130,7 @@ static const struct regmap_config ocelot_spi_regmap_config = {
 
 	.write_flag_mask = 0x80,
 
+	.use_single_read = true,
 	.use_single_write = true,
 	.can_multi_write = false,
 



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux