Hello!
Recently I was debugging WiFi performance problems on Acer A500 tablet
device that got upstreamed recently. This is an older Android device from
2011-2012 that is powered by NVIDIA Tegra20 SoC and it has BCM4329 chip
that provides WiFi (SDIO) and Bluetooth (UART). I noticed that WiFi
throughput on a recent Linux kernel wasn't as great as it could be in
comparison to older 3.18 kernel that is uses downstream BCMDHD driver
and this series fixes a major part of the problems that I found.
Found problems:
1. The WiFi SDIO pinmux configuration had a bug in Acer A500 device-tree
and MMC refused to work if it was clocked above 25MHz and legacy
signaling mode was used. After fixing the bug, WiFi SDIO works perfectly
well at 50MHz and this increases TX throughput by 5-10 Mbit/s. I already
sent out patches that fix this bug to the Tegra ML.
2. There are occasional SDHCI CRC errors if SDIO is clocked above 25Mhz.
The "increase F2 watermark" patch fixes this problem.
3. WiFi TX throughput is lower by 10 Mbit/s than it should be using 512B
for maximum F2 SDIO block size. Reducing block size to 128B fixes this
problem. The "set F2 SDIO block size to 128 bytes" patch addresses this
issue. The exact reason why 128B is more efficient than 512B is unknown,
this optimization is borrowed from the BCMDHD driver.
4. While I was bisecting upstream kernel, I found that WiFi RX/TX throughput
dropped by 5-10 Mbit/s after 5.2 kernel and reverting the following commit
from linux-next resolves the problem:
commit c07a48c2651965e84d35cf193dfc0e5f7892d612
Author: Adrian Hunter [off-list ref]
Date: Fri Apr 5 15:40:20 2019 +0300
mmc: sdhci: Remove finish_tasklet
I'll send a separate email for discussing this problem.
After fixing all the above problems, I'm now getting a solid 40 Mbit/s
up/down on Acer A500 on a recent linux-next in comparison to 15 Mbit/s
that I was getting before the fixes.
Big thanks to Wright Feng who helped me to find and fix some of the problems!
Changelog:
v2: - Added "drop chip id from debug messages" as was requested by
Arend Van Spriel in the review comment to v1 of the "increase F2
watermark" patch.
- Added patches that remove unnecessary "fallthrough" comments and
change F2 SDIO block size to 128 bytes for BCM4329.
Dmitry Osipenko (4):
brcmfmac: increase F2 watermark for BCM4329
brcmfmac: drop unnecessary "fallthrough" comments
brcmfmac: drop chip id from debug messages
brcmfmac: set F2 SDIO block size to 128 bytes for BCM4329
drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c | 6 ++++--
drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c | 7 +++----
2 files changed, 7 insertions(+), 6 deletions(-)
--
2.27.0
Setting F2 block size to 128 bytes for BCM4329 allows to significantly
improve RX throughput on NVIDIA Tegra20. Before this change the throughput
was capped to 30 Mbit/s on Tegra, now throughput is at 40 Mbit/s, which is
a maximum throughput for the BCM4329 chip. The F2 block size is borrowed
from the downstream BCMDHD driver. The comment in the BCMDHD driver says
that 128B improves throughput and turns out that it works for the brcmfmac
as well.
Signed-off-by: Dmitry Osipenko <digetx@gmail.com>
---
drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c | 4 ++++
1 file changed, 4 insertions(+)
@@ -45,6 +45,7 @@#define SDIO_FUNC2_BLOCKSIZE 512#define SDIO_4373_FUNC2_BLOCKSIZE 256#define SDIO_435X_FUNC2_BLOCKSIZE 256+#define SDIO_4329_FUNC2_BLOCKSIZE 128/* Maximum milliseconds to wait for F2 to come up */#define SDIO_WAIT_F2RDY 3000
@@ -920,6 +921,9 @@ int brcmf_sdiod_probe(struct brcmf_sdio_dev *sdiodev)caseSDIO_DEVICE_ID_BROADCOM_4356:f2_blksz=SDIO_435X_FUNC2_BLOCKSIZE;break;+caseSDIO_DEVICE_ID_BROADCOM_4329:+f2_blksz=SDIO_4329_FUNC2_BLOCKSIZE;+break;default:break;}
The chip ID was already printed out at the time when debug message about
the changed F2 watermark is printed, hence let's drop the unnecessary part
of the debug messages. This cleans code a tad and also allows to re-use
the F2 watermark debug messages by multiple chips.
Suggested-by: Arend van Spriel <arend.vanspriel@broadcom.com>
Signed-off-by: Dmitry Osipenko <digetx@gmail.com>
---
drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
There is no need to insert the "fallthrough" comment if there is nothing
in-between of case switches. Hence let's remove the unnecessary comments
in order to make code cleaner a tad.
Signed-off-by: Dmitry Osipenko <digetx@gmail.com>
---
drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c | 2 --
drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c | 2 --
2 files changed, 4 deletions(-)
This patch fixes SDHCI CRC errors during of RX throughput testing on
BCM4329 chip if SDIO BUS is clocked above 25MHz. In particular the
checksum problem is observed on NVIDIA Tegra20 SoCs. The good watermark
value is borrowed from downstream BCMDHD driver and it's matching to the
value that is already used for the BCM4339 chip, hence let's re-use it
for BCM4329.
Signed-off-by: Dmitry Osipenko <digetx@gmail.com>
---
drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c | 1 +
1 file changed, 1 insertion(+)
This patch fixes SDHCI CRC errors during of RX throughput testing on
BCM4329 chip if SDIO BUS is clocked above 25MHz. In particular the
checksum problem is observed on NVIDIA Tegra20 SoCs. The good watermark
value is borrowed from downstream BCMDHD driver and it's matching to the
value that is already used for the BCM4339 chip, hence let's re-use it
for BCM4329.
Signed-off-by: Dmitry Osipenko <digetx@gmail.com>
---
I accidentally missed to add the r-b from Arend that he gave to the v1:
Reviewed-by: Arend van Spriel <arend.vanspriel@broadcom.com>
There is no need to insert the "fallthrough" comment if there is nothing
in-between of case switches. Hence let's remove the unnecessary comments
in order to make code cleaner a tad.
Signed-off-by: Dmitry Osipenko <digetx@gmail.com>
---
drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c | 2 --
drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c | 2 --
2 files changed, 4 deletions(-)