From 02826a9e3552cc52de3201f5a0bf184b33a93c00 Mon Sep 17 00:00:00 2001 From: "Huang Roy (CSS ICW ENG WFS SW WFFW 1)" Date: Wed, 30 Oct 2024 14:19:13 +0000 Subject: [PATCH 300/301] brcmfmac: Fix data traffic halted after reconnect 01202ce6 brcmfmac: Fix data traffic halted after reconnect --- .../broadcom/brcm80211/brcmfmac/fwsignal.c | 44 ++++++++++--------- 1 file changed, 23 insertions(+), 21 deletions(-) diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c index 8b7cf9c1127a..98c68b35df6b 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c @@ -627,6 +627,26 @@ static inline int brcmf_fws_hanger_poppkt(struct brcmf_fws_hanger *h, return 0; } +static void +brcmf_fws_flow_control_check(struct brcmf_fws_info *fws, struct pktq *pq, + u8 if_id) +{ + struct brcmf_if *ifp = brcmf_get_ifp(fws->drvr, if_id); + + if (WARN_ON(!ifp)) + return; + + if ((ifp->netif_stop & BRCMF_NETIF_STOP_REASON_FWS_FC) && + pq->len <= fws->fws_psq_low_water) + brcmf_txflowblock_if(ifp, + BRCMF_NETIF_STOP_REASON_FWS_FC, false); + if (!(ifp->netif_stop & BRCMF_NETIF_STOP_REASON_FWS_FC) && + pq->len >= fws->fws_psq_hi_water) { + fws->stats.fws_flow_block++; + brcmf_txflowblock_if(ifp, BRCMF_NETIF_STOP_REASON_FWS_FC, true); + } +} + static void brcmf_fws_psq_flush(struct brcmf_fws_info *fws, struct pktq *q, int ifidx) { @@ -634,6 +654,7 @@ static void brcmf_fws_psq_flush(struct brcmf_fws_info *fws, struct pktq *q, struct sk_buff *skb; int prec; u32 hslot; + int skbidx; if (ifidx != -1) matchfn = brcmf_fws_ifidx_match; @@ -643,6 +664,8 @@ static void brcmf_fws_psq_flush(struct brcmf_fws_info *fws, struct pktq *q, hslot = brcmf_skb_htod_tag_get_field(skb, HSLOT); brcmf_fws_hanger_poppkt(&fws->hanger, hslot, &skb, true); + skbidx = brcmf_skb_if_flags_get_field(skb, INDEX); + brcmf_fws_flow_control_check(fws, q, skbidx); brcmu_pkt_buf_free_skb(skb); skb = brcmu_pktq_pdeq_match(q, prec, matchfn, &ifidx); } @@ -960,27 +983,6 @@ static bool brcmf_fws_tim_update(struct brcmf_fws_info *fws, return false; } -static void -brcmf_fws_flow_control_check(struct brcmf_fws_info *fws, struct pktq *pq, - u8 if_id) -{ - struct brcmf_if *ifp = brcmf_get_ifp(fws->drvr, if_id); - - if (WARN_ON(!ifp)) - return; - - if ((ifp->netif_stop & BRCMF_NETIF_STOP_REASON_FWS_FC) && - pq->len <= fws->fws_psq_low_water) - brcmf_txflowblock_if(ifp, - BRCMF_NETIF_STOP_REASON_FWS_FC, false); - if (!(ifp->netif_stop & BRCMF_NETIF_STOP_REASON_FWS_FC) && - pq->len >= fws->fws_psq_hi_water) { - fws->stats.fws_flow_block++; - brcmf_txflowblock_if(ifp, BRCMF_NETIF_STOP_REASON_FWS_FC, true); - } - return; -} - static int brcmf_fws_rssi_indicate(struct brcmf_fws_info *fws, s8 rssi) { brcmf_dbg(CTL, "rssi %d\n", rssi); -- 2.25.1