From 49f5c29756079bede8248f74312cea677434b0df Mon Sep 17 00:00:00 2001 From: "Yang Shelley (CSS ICW ENG WFS SW WFSW 1)" Date: Wed, 2 Apr 2025 09:27:51 +0000 Subject: [PATCH] brcmfmac: Low WMM TX Throughput fix for BK access category The continuous addition of new features and fixes has resulted in a progressive increase in firmware size. This expansion directly impacts the available memory resources, leading to a reduction in the overall packet pool size. In the current implementation, the Background traffic category being lower priority receives a smaller share of resources compared to higher-priority access categories. Furthermore, the existing driver design has a limitation that prohibits borrowing credits for the BK traffic category. This design constraint results in significantly reduced throughput for BK traffic. To address this issue and improve the throughput for BK traffic, the driver has been updated to allow borrowing of credits for BK access category from higher-priority access categories. Fixes SWLINUX-5011 Signed-off-by: avishad verma (cherry picked from commit 1c1b6d3c232afba79734c117e097a2a575efa8d7) Co-authored-by: avishad verma --- .../broadcom/brcm80211/brcmfmac/fwsignal.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c index 3c85363..9ef60d2 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c @@ -1199,7 +1199,7 @@ static void brcmf_fws_return_credits(struct brcmf_fws_info *fws, fws->fifo_credit_map |= 1 << fifo; - if (fifo > BRCMF_FWS_FIFO_AC_BK && + if (fifo >= BRCMF_FWS_FIFO_AC_BK && fifo <= BRCMF_FWS_FIFO_AC_VO) { for (lender_ac = BRCMF_FWS_FIFO_AC_VO; lender_ac >= 0; lender_ac--) { @@ -2253,6 +2253,7 @@ static void brcmf_fws_dequeue_worker(struct work_struct *worker) u32 hslot; u32 ifidx; int ret; + u32 highest_lender = 0; fws = container_of(worker, struct brcmf_fws_info, fws_dequeue_work); drvr = fws->drvr; @@ -2302,12 +2303,18 @@ static void brcmf_fws_dequeue_worker(struct work_struct *worker) break; } - if (fifo >= BRCMF_FWS_FIFO_AC_BE && + if (fifo >= BRCMF_FWS_FIFO_AC_BK && fifo <= BRCMF_FWS_FIFO_AC_VO && fws->fifo_credit[fifo] == 0 && !fws->bus_flow_blocked) { + highest_lender = fifo - 1; + + /* Borrow Credit for BK access category from Higer AC queues */ + if (fifo == BRCMF_FWS_FIFO_AC_BK) + highest_lender = BRCMF_FWS_FIFO_AC_BE; + while (brcmf_fws_borrow_credit(fws, - fifo - 1, fifo, + highest_lender, fifo, true) == 0) { skb = brcmf_fws_deq(fws, fifo); if (!skb) { -- 2.25.1