From nobody Fri Oct 2 12:19:23 2026 Received: from mail-pg1-f176.google.com (mail-pg1-f176.google.com [209.85.215.176]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A31C9445AD2 for ; Fri, 31 Jul 2026 15:49:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.176 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785512958; cv=none; b=Zgjxq7FyiAexbsqap5xrXZLDCGbPucchGqKTPzxOjiNVW2rC3sp7JL6vndvfbgmmZUtWyh8xPkO4gO2HwthL5+RMcb/ItIAkUjEwQkRi5bWoMswAtrICnVASoW4BLu0+rbj9vEuvefveTbr8HUSuUHkKUgbbnaN4pdOm1F3J3Yo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785512958; c=relaxed/simple; bh=bq4PN7BDO0yFKVQsaXHpuXUbJYEn7r0/aMV4I2Qy7bk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=luk45IombCCn2FKW9BsVi4xgcXz9fvBbds23B3dreYwiqZ55Fxhb8hnlxUbrMtfRSgUAhbNY8/EZeXrhlAQpr4cPQTyeRIU8LSjsTyy36wtYYLZjzciRcjrGIy9z2f5/gBDZeZ/aIc5j2xGnmp00Slzx3olGykUmLbMlVqqoXpY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=dWW3pQz0; arc=none smtp.client-ip=209.85.215.176 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="dWW3pQz0" Received: by mail-pg1-f176.google.com with SMTP id 41be03b00d2f7-ca53979f8e8so99044a12.2 for ; Fri, 31 Jul 2026 08:49:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1785512954; x=1786117754; darn=vger.kernel.org; h=content-transfer-encoding:content-type:mime-version:references :in-reply-to:message-id:date:subject:cc:to:from:from:to:cc:subject :date:message-id:reply-to:content-type; bh=fDjKwH/pLgq11MmSt15oZfyeN0eo31ydS4Xhih3a270=; b=dWW3pQz0FfMZVKTIv2duME6c/Edh3bV1Hk6mIr+xMv3fjczelpIJ2GyOj7sp9mVHYf UkUJQ64tJI+u4gsYBfWcQZfq9SUnwZ9QrP8Z2ozEb8cC/K8Bc2KT2ua6Y3qS8OFeX8XZ Dp4cxPsf9eH5+Dngtkn2XQbOkA+gzyN7cTaekvC2hDVMWOenwbf683Tgtew4GEe7ryMj ctgTUC04HIoG0zXSdRsIiCnKSQb6L9Gt1tQAw0C5ImbyND9hESHpGEx14WNqY/AgUM6Q OoZDWJgg7XAT28FcV3trFg1EqtgdMr+/9Pnc5HfixAzbmLlrjAUCl5MCqonuFIa09afs 3JfQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1785512954; x=1786117754; h=content-transfer-encoding:content-type:mime-version:references :in-reply-to:message-id:date:subject:cc:to:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=fDjKwH/pLgq11MmSt15oZfyeN0eo31ydS4Xhih3a270=; b=A6h2mhOr5ah5K0KPMzHwIjEBHg4swtKF2SV3WtZOAeIMRLdubKYY7Ns8qwV8gZLzTJ s4cYjBY6ogzwv67CDqVhrziY6RdmLkdDGIrkIsEOHNYvsh0c40TjA4W6LrDCSrhHDCrm Hl9X1iRBQR5SCoTKXjHpLD0/zJUSrVz4ly835BYdLSiOARFKaRlvQ8guD73XgaimqgQi GRPjGUOaCpa0rjN0W3Y3GMYiwZsb28wSxd2ABxLD1vbGVukr/0CrsJMKKubC2zcrxDs7 YG/3avt02JXQSmFx+oCrDNIb44zC0l9s96Hz9Xisj0E4ph7xgcSITlUfkUBqwqWDkruc nGUw== X-Forwarded-Encrypted: i=1; AHgh+RpIhyDRxco4hQBeDw36+89u1Oj8jsIM7rTa4h2diCjY7o39KuPx7jvnpEWn4preTIa+O2EMAYgmtk8NZvc=@vger.kernel.org X-Gm-Message-State: AOJu0Yz2lSrpUm0ufhbUuSsY2XG+BgtPi/Yv19AN7YcRHx6xVQ1coEDt C4cNUk+pXvLaBrHGkj9waOUvBBIsPlLoW8Pe2giHYFYyIgjYJNXpYJnO X-Gm-Gg: AR+sD13bRO6r3E0cz8T0ZDlOUbTro4RENKycI5Y99SHJN2ViQ52oVIZAL5WvZe2r1Nk ZqVEvetl18PeSMrF77PbmBiQATsukJMGmZ6epCEkaHuBBet01s+UJ4E8G9sBF4YzpXaCgDvKxZY KNDlsH+OBPegADuw7mZO0hJDO7cQnJDgT1U2QLd2I/ltuiAIh1dY79rjFedZfYSsOWgqr+eJlNj rpNX26vkrXOFosZ8H4KXM/mRz+oUIpGS8cN/muczudsEOS7/6AgDW9gtnBFW4XKVHJ34K6dnzXU FkcXc598q5Oxe45qofdfCQekb2jS07t3f9A6d1kg0tj/98x22Vxuw/84ygQXlUsXCLN421jdF+d pbJnrg+a7VzaYjAG9gTpXp283HvlF7gf3P5TeMtxrWsn+GZf2QxIuZ6yTFIHm7aO51L05XOJAZN VW1TQ2tlxnpYYocKd0S96BqvVzpfcqRd1aFcz4MZIBR77AKaXhM9Cf1S0DyBCcH5ltz3qQTk6ky BI= X-Received: by 2002:a17:90b:562e:b0:36d:b30b:14ed with SMTP id 98e67ed59e1d1-38fbc4ad251mr509727a91.2.1785512953864; Fri, 31 Jul 2026 08:49:13 -0700 (PDT) Received: from Potato.tail66a299.ts.net ([171.76.83.76]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-3153e045016sm11852510eec.19.2026.07.31.08.49.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 31 Jul 2026 08:49:13 -0700 (PDT) From: Shivesh X-Google-Original-From: Shivesh To: arend.vanspriel@broadcom.com Cc: linux-wireless@vger.kernel.org, brcm80211@lists.linux.dev, brcm80211-dev-list.pdl@broadcom.com, linux-kernel@vger.kernel.org, Shivesh Subject: [PATCH v3 1/8] wifi: brcmfmac: flowring: replace O(N) loop with atomic counter Date: Fri, 31 Jul 2026 15:48:33 +0000 Message-ID: <20260731154901.1822-2-shivesh@example.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260731154901.1822-1-shivesh@example.com> References: <20260731154901.1822-1-shivesh@example.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable From: Shivesh Optimizes flowring deletion by tracking counter updates with a flag instead of an O(N) spinlock walk, fixing a teardown leak. Signed-off-by: Shivesh --- .../broadcom/brcm80211/brcmfmac/flowring.c | 65 ++++++++++++++----- .../broadcom/brcm80211/brcmfmac/flowring.h | 18 +++++ 2 files changed, 66 insertions(+), 17 deletions(-) diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/flowring.c b/= drivers/net/wireless/broadcom/brcm80211/brcmfmac/flowring.c index 35cbcea0abc9..b9c518939f50 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/flowring.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/flowring.c @@ -182,10 +182,8 @@ static void brcmf_flowring_block(struct brcmf_flowring= *flow, u16 flowid, struct brcmf_bus *bus_if; struct brcmf_pub *drvr; struct brcmf_if *ifp; - bool currently_blocked; - int i; - u8 ifidx; unsigned long flags; + u8 ifidx; =20 spin_lock_irqsave(&flow->block_lock, flags); =20 @@ -194,23 +192,54 @@ static void brcmf_flowring_block(struct brcmf_flowrin= g *flow, u16 flowid, spin_unlock_irqrestore(&flow->block_lock, flags); return; } - ifidx =3D brcmf_flowring_ifidx_get(flow, flowid); =20 - currently_blocked =3D false; - for (i =3D 0; i < flow->nrofrings; i++) { - if ((flow->rings[i]) && (i !=3D flowid)) { - ring =3D flow->rings[i]; - if ((ring->status =3D=3D RING_OPEN) && - (brcmf_flowring_ifidx_get(flow, i) =3D=3D ifidx)) { - if (ring->blocked) { - currently_blocked =3D true; - break; - } - } + ifidx =3D brcmf_flowring_ifidx_get(flow, flowid); + ring->blocked =3D blocked; + + /* + * Maintain the per-interface blocked-ring counter. + * + * We use ring->counted_in_blocked rather than checking + * ring->status here. A ring that became blocked while + * RING_OPEN has already been counted (counted_in_blocked=3Dtrue). + * By the time we unblock it during teardown its status may have + * advanced to RING_CLOSING, so testing RING_OPEN would wrongly + * skip the atomic_dec and permanently leak the counter, leaving + * the netif queue stopped forever. + * + * Rule: + * block transition (unblocked=E2=86=92blocked): count only if RING_OP= EN, + * set counted_in_blocked. + * unblock transition (blocked=E2=86=92unblocked): decrement only if we + * previously counted it, + * clear counted_in_blocked. + */ + if (blocked) { + if (ring->status =3D=3D RING_OPEN) { + atomic_inc(&flow->if_blocked_cnt[ifidx]); + ring->counted_in_blocked =3D true; } + } else { + if (ring->counted_in_blocked) { + atomic_dec(&flow->if_blocked_cnt[ifidx]); + ring->counted_in_blocked =3D false; + } + } + + /* + * Only propagate a netif queue-stop/wake when the interface + * transitions between fully-clear and at-least-one-blocked. + * Reading the atomic is safe here: we hold block_lock, so no + * concurrent brcmf_flowring_block() call can race the update + * we just made above. + */ + if (blocked && atomic_read(&flow->if_blocked_cnt[ifidx]) !=3D 1) { + /* Another ring was already blocked; no new queue-stop needed. */ + spin_unlock_irqrestore(&flow->block_lock, flags); + return; } - flow->rings[flowid]->blocked =3D blocked; - if (currently_blocked) { + if (!blocked && atomic_read(&flow->if_blocked_cnt[ifidx]) !=3D 0) { + /* More rings still blocked; do not wake the queue yet. */ spin_unlock_irqrestore(&flow->block_lock, flags); return; } @@ -367,6 +396,8 @@ struct brcmf_flowring *brcmf_flowring_attach(struct dev= ice *dev, u16 nrofrings) spin_lock_init(&flow->block_lock); for (i =3D 0; i < ARRAY_SIZE(flow->addr_mode); i++) flow->addr_mode[i] =3D ADDR_INDIRECT; + for (i =3D 0; i < ARRAY_SIZE(flow->if_blocked_cnt); i++) + atomic_set(&flow->if_blocked_cnt[i], 0); for (i =3D 0; i < ARRAY_SIZE(flow->hash); i++) flow->hash[i].ifidx =3D BRCMF_FLOWRING_INVALID_IFIDX; } diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/flowring.h b/= drivers/net/wireless/broadcom/brcm80211/brcmfmac/flowring.h index f3d511f9a3c9..afdea8b3f8aa 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/flowring.h +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/flowring.h @@ -5,6 +5,8 @@ #ifndef BRCMFMAC_FLOWRING_H #define BRCMFMAC_FLOWRING_H =20 +#include + =20 #define BRCMF_FLOWRING_HASHSIZE 512 /* has to be 2^x */ #define BRCMF_FLOWRING_INVALID_ID 0xFFFFFFFF @@ -26,6 +28,16 @@ enum ring_status { struct brcmf_flowring_ring { u16 hash_id; bool blocked; + /* + * True when this ring has been counted in the per-interface + * if_blocked_cnt[]. Set to true whenever the ring transitions + * unblocked=E2=86=92blocked while RING_OPEN; cleared on the matching + * blocked=E2=86=92unblocked transition. Needed so that a ring that + * becomes blocked while RING_OPEN and is later moved to + * RING_CLOSING still correctly decrements the counter at + * teardown, even though its status is no longer RING_OPEN. + */ + bool counted_in_blocked; enum ring_status status; struct sk_buff_head skblist; }; @@ -40,6 +52,12 @@ struct brcmf_flowring { struct brcmf_flowring_hash hash[BRCMF_FLOWRING_HASHSIZE]; spinlock_t block_lock; enum proto_addr_mode addr_mode[BRCMF_MAX_IFS]; + /* Per-interface count of currently blocked open rings. + * Maintained atomically so brcmf_flowring_block() can check + * whether any sibling ring is already blocked in O(1) without + * holding block_lock across an O(nrofrings) walk. + */ + atomic_t if_blocked_cnt[BRCMF_MAX_IFS]; u16 nrofrings; bool tdls_active; struct brcmf_flowring_tdls_entry *tdls_entry; --=20 2.53.0 From nobody Fri Oct 2 12:19:23 2026 Received: from mail-pj1-f53.google.com (mail-pj1-f53.google.com [209.85.216.53]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id ACC11445ACF for ; Fri, 31 Jul 2026 15:49:18 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.53 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785512963; cv=none; b=KQ5IGj4fgztpNKizqHXhBrun90nNbdSdaJhhzJ2Y1aNtcGBTbyebnUCokTd8tZDvmO0/WqZ5POhMq4V9pWD6GJfh9UxEacAYdIblAu9FUlDHNHgLHlzc5Q8dS0zVxh0abjQXl2Gz6wwwkiPi40zkyWXWgN0O+7D6Z27rv1ngC5U= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785512963; c=relaxed/simple; bh=Hdwf42WICGC+EP1O8Z+0XvId2aI97zszyMJuW5ia80Y=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Ym4ivR2Drz2t+HscqHz08oKA7W8daBhwvpNVEYLOToj5Tp348oRDjYRfQeMzj+8fD6iCxucoEm/cY5GLRpUOFLE+LgZTeB338HQbpb0gs/RWp0u476PrgE6qaj83TP/V9z8yc/phWZDEqnTURupPRFrcaD5Q+MDiWvFFb790Zv8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=hu7N43oO; arc=none smtp.client-ip=209.85.216.53 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="hu7N43oO" Received: by mail-pj1-f53.google.com with SMTP id 98e67ed59e1d1-385b78b4f9bso55185a91.2 for ; Fri, 31 Jul 2026 08:49:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1785512957; x=1786117757; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=Yd5GnMV4YHUFaBqZ8HhG5oCdvPmPlqZROl7g2jgvDNU=; b=hu7N43oOHywUrYD5V1txp1cXwrIh1KBK3kpKx7sc+mABg+SA7wktTYlCIrfx7G2N7u HN7KeDNU9/IJ656K3zcIT6/Zhy0rGglI2BbtpBW4cv5nODURV5gcImsQVenVbUlOxAYj ZE1POo4DPYXVAk41ww12RLBeqRaijq6nMhj4U/Sx0GpTsRJii6WtjdYeCcWKxwt8vK49 E3R7JHk0piJKm0S/1SQWtpXokVWVFtxACktpFDhX5F90m/lXw2Qul8M2Dp5tZ66sGkUn 41AQUrzwMJSBrEz946fF+wRJI0yffd6N5XpRlNCSERgcRYdYSSWWM06yDViZ6bkXt2dL ka0g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1785512957; x=1786117757; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=Yd5GnMV4YHUFaBqZ8HhG5oCdvPmPlqZROl7g2jgvDNU=; b=SYeJ/ndQbPjICnca03ME3kX70/H9lu19LdcFrEfhxGXHC5YbIAkEC02U0VqS4R7mXq /1WeBVXA/3ScAayRY91EgRmog7Xgt2u1437BKIZ8xycVMuhXU9Jx5bTLeYvoupMHagN7 75qBTQmpUTMqJ0FQhVK83mkV3qj7QdgfldAkGSjYLMRv3+9o2Jpa+smrd8Aqt55Agk8f x+ocPqiYe+vy7RCQcO30n4OdkeSJ0Fmd5qsjZDUpHaYvy34BPffweo+1tZSBBDV+254O Tn/XpnbWCcLX5NOpyvKf484euFAKVPpcBBKVJOqvLSY1x9IgPoiFVlOC9vnvXE0Mwx3p Ctcg== X-Forwarded-Encrypted: i=1; AHgh+RqZM9dFFwNkLdGpsphBJYgwVuSOEwwCuVumfnJB2cTdQlyFV20WgQ7W8xg1h9WFnbICAhHtRhTUx4s9cL8=@vger.kernel.org X-Gm-Message-State: AOJu0YxS9k2xMZfWD3q8tGVcxxh3N4gOY83q54sPHQ6SKLkjKgAmHuY6 vbl8iOVckOR1DnR2j7uXdhIFNDFUf9gMdKi/sETSQe0CAq37DJKlzOeT X-Gm-Gg: AR+sD13VBB83tWICjtAyyNi0oyo3kGEUcb+H+2ZYQkivTgXgimjpsjdPjtsfnmywrH0 BcAhB69OfAlblFvLYk6a960OTw4zh6sfNprCpkp+5QNbZFl8xBWAG5yP+kXbV8SUd8ncP5OVYPD MTLpdAD26Ky1lLGS6AWNUJ53HMu3zpd0pG5NhQHN1DCGCbJ4p2L5Anf/7rON0eI3eWzflZVMNsn ZOON4AmxowXC2rSLTJqCfFQFqiZh/mlkLjhNHRpqLFOlgLfpJinaih31wrhKSC9XUTudnGTVjEF y025mBZGM8qUOWtOZAvEdfzCKLh/P6nulfe41X1I8AtHFSRSP49WBYGioveDHz7G0jtNOS3W3zT NRVX0tNLnAtaOK6DVQYJhBBTGlSs2RnoAnH9JalvOD6ZSmnLKx/AEs+rqxQnZisI5gHbehDoWUG ga5lHq/meyYNyw28nfEdpeHBcDcgUNN+B/WO9UXgqJl+BrqnW0eKYYaEJ6Gkq5EK0Vr/ukEluxP Lc= X-Received: by 2002:a17:90b:520c:b0:38f:aa76:88b with SMTP id 98e67ed59e1d1-38fbc506f17mr523232a91.4.1785512956784; Fri, 31 Jul 2026 08:49:16 -0700 (PDT) Received: from Potato.tail66a299.ts.net ([171.76.83.76]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-3153e045016sm11852510eec.19.2026.07.31.08.49.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 31 Jul 2026 08:49:16 -0700 (PDT) From: Shivesh X-Google-Original-From: Shivesh To: arend.vanspriel@broadcom.com Cc: linux-wireless@vger.kernel.org, brcm80211@lists.linux.dev, brcm80211-dev-list.pdl@broadcom.com, linux-kernel@vger.kernel.org, Shivesh Subject: [PATCH v3 2/8] wifi: brcmfmac: sdio: coalesce host locks in rx path Date: Fri, 31 Jul 2026 15:48:34 +0000 Message-ID: <20260731154901.1822-3-shivesh@example.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260731154901.1822-1-shivesh@example.com> References: <20260731154901.1822-1-shivesh@example.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Shivesh Tightens host claim scope to only cover hdparse calls, avoiding unnecessary blocking during skb manipulation. Signed-off-by: Shivesh --- .../broadcom/brcm80211/brcmfmac/sdio.c | 62 ++++++++++++------- 1 file changed, 38 insertions(+), 24 deletions(-) diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c b/driv= ers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c index b725c64e5b5c..4e414403d747 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.c @@ -1645,37 +1645,43 @@ static u8 brcmf_sdio_rxglom(struct brcmf_sdio *bus,= u8 rxseq) =20 rd_new.seq_num =3D rxseq; rd_new.len =3D dlen; + + /* + * Claim the host once for the entire header-parsing phase. + * + * brcmf_sdio_hdparse() operates on data already in host + * memory, but may call brcmf_sdio_rxfail() on error, which + * writes SDIO Func1 registers and therefore requires the + * host to be claimed. + * + * skb_pull() and the num counter are pure host-memory + * operations; keep them outside the lock to minimise the + * hold time. Both hdparse calls (superframe header and + * each subframe header) are grouped under a single claim/ + * release, replacing the original N+1 separate pairs. + */ sdio_claim_host(bus->sdiodev->func1); errcode =3D brcmf_sdio_hdparse(bus, pfirst->data, &rd_new, BRCMF_SDIO_FT_SUPER); - sdio_release_host(bus->sdiodev->func1); - bus->cur_read.len =3D rd_new.len_nxtfrm << 4; - - /* Remove superframe header, remember offset */ - skb_pull(pfirst, rd_new.dat_offset); - num =3D 0; - - /* Validate all the subframe headers */ - skb_queue_walk(&bus->glom, pnext) { - /* leave when invalid subframe is found */ - if (errcode) - break; =20 - rd_new.len =3D pnext->len; - rd_new.seq_num =3D rxseq++; - sdio_claim_host(bus->sdiodev->func1); - errcode =3D brcmf_sdio_hdparse(bus, pnext->data, &rd_new, - BRCMF_SDIO_FT_SUB); - sdio_release_host(bus->sdiodev->func1); - brcmf_dbg_hex_dump(BRCMF_GLOM_ON(), - pnext->data, 32, "subframe:\n"); - - num++; + /* Validate all the subframe headers while host is claimed */ + if (!errcode) { + skb_queue_walk(&bus->glom, pnext) { + rd_new.len =3D pnext->len; + rd_new.seq_num =3D rxseq++; + errcode =3D brcmf_sdio_hdparse(bus, pnext->data, + &rd_new, + BRCMF_SDIO_FT_SUB); + brcmf_dbg_hex_dump(BRCMF_GLOM_ON(), + pnext->data, 32, + "subframe:\n"); + if (errcode) + break; + } } =20 if (errcode) { - /* Terminate frame on error */ - sdio_claim_host(bus->sdiodev->func1); + /* Terminate frame on error, still holding the host */ brcmf_sdio_rxfail(bus, true, false); bus->sdcnt.rxglomfail++; brcmf_sdio_free_glom(bus); @@ -1683,6 +1689,14 @@ static u8 brcmf_sdio_rxglom(struct brcmf_sdio *bus, = u8 rxseq) bus->cur_read.len =3D 0; return 0; } + sdio_release_host(bus->sdiodev->func1); + + /* Host released; now do the pure-memory bookkeeping */ + bus->cur_read.len =3D rd_new.len_nxtfrm << 4; + + /* Remove superframe header, remember offset */ + skb_pull(pfirst, rd_new.dat_offset); + num =3D 0; =20 /* Basic SD framing looks ok - process each packet (header) */ =20 --=20 2.53.0 From nobody Fri Oct 2 12:19:23 2026 Received: from mail-pl1-f182.google.com (mail-pl1-f182.google.com [209.85.214.182]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 70AF7446069 for ; Fri, 31 Jul 2026 15:49:20 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.182 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785512964; cv=none; b=D8Y7loLXhpeZBtLmrBu6vEwrP9zIe7liXhedI9+ZXm+AH1FpApdUxxHp56YHRn7PSKmSfTdW1vHd8jyK69KgPdUq/A6QoB8t54ddi7QG8ytToRs5UAzJEk106Hft0AJ2sIRN2MdlHymo8emc96VSISJmWweoeB/RxhEC8AwnTTY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785512964; c=relaxed/simple; bh=dwU1WTkn+14qiJyoN/fcILNJIPDNMbgqt2pyeUSZuEw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=mBswRKi3c/oz5C5rfJGr5LLE9ceYCq9lCEH8MJ7TRAxGgA9qDBWl+1wqu+cpAVWKU7hrTu8lYcTmHpFSJpl4xE3Dqnc7qpIQ6lBCC6zva+fBSWgawLMZwSQ91fvJBISATpzhIFPfQNqslMWgPvr/eXSnoZ/4BfSUAlUZ64SI5Sk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=gcZUy4S+; arc=none smtp.client-ip=209.85.214.182 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="gcZUy4S+" Received: by mail-pl1-f182.google.com with SMTP id d9443c01a7336-2d03fcd26a6so860635ad.2 for ; Fri, 31 Jul 2026 08:49:20 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1785512960; x=1786117760; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=ahxcHCC15uBTh1B3etEh/3ZgFZZQjRbxcgGWND2qogs=; b=gcZUy4S+URoqjiuXUZVq0nOkKlyDKecqVr0VS07iDwFMPNarXkX5+DPMsAkzHucYt5 tQVQl6gLJPU8JMDeqQpBhBU4VrX3nj21NZvorgl+QvT85uM8ODyNnTLHx1MPZKOFoqPU sXIb9HLXE0z5zAQNk8VEW9M6W98vEM3Gm2wjFu997c/5z5bms4TPkqupzc3CQHoL+Zo0 n3WAHb/9ypJ0q4vU5opHdWJVuJ6rfEsKA10hY+NEZZCqc+IkCvvfKOTOuB+IUyb4o//l Jwf5tRvQDPv+nWOoP/1HvamoHZpWWt0HjUMKlvk1nIILvC3vR2hGyHaw8zQpYfijdB5k pVOg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1785512960; x=1786117760; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=ahxcHCC15uBTh1B3etEh/3ZgFZZQjRbxcgGWND2qogs=; b=MXyrgVrEKjwXuik+DypYIvgI01zSqYfUdEsjiB7tN0I8lX++Mz27p/V5+7XazdZRUx j+j+1WPuKBTyLtRhdsZ+TVXTeU0dnQxAjsXMwY5AhTH5R0RQF3EmvY121V25ABvz+OXF eexv7CKsZmXD+OC4EBkducjj4ECCfqXqFX226gusOjCUl3LIMhH7Fl+Q+hLTy1zrIySX MF10tq8C2CYQcwbHVYd/JEtiW8i3j4JCDNBWYB9wi1V9Wi8w+VpjufNvFh+mjEXZwj9U ajL5nrS5wJCeo1bwqxMVdA8D4pnMqZ6lnqYIYxWXTjjBtlpex7HOhDhpD6jMHDD+VRPK J6Rw== X-Forwarded-Encrypted: i=1; AHgh+RoHJ/8TMhXplqi9H1r8JEXLB+H2QyQctc+kvx9JWiBUr2Na6wj0N73YzXFqnPKe/aAMiTEl7rxBT7sqo3U=@vger.kernel.org X-Gm-Message-State: AOJu0Yy/5saCBNtkwxb4cGRKX/rtKgit2EIOvUiIa+HX05j3dzM4QdwQ lUWAheg/AbZptdLZfztqvQT6eC/iLT7pEuOkvxcjLCWTcLht32vEIJTn X-Gm-Gg: AR+sD117Tpq8HNsQfZG1t5hPNOzjx0KVaaN8wh9tabLPFl2etDxNIZV7eX7sepijZt/ YK+xlRskPnfZubQAbFh3+GBbiNqQtTxtH123wzOYL5W9GRIWR51mph2FsAZujx4SWDhL5CbyZIH NbvgEY1NCgy4pBXpVXvznisGU1BjNBEjApVO3F9fn0r+v4vDHOdjT/YNfrflwGim8mHyh8pWGbB GeYojI88r0LjxaMn+/YnIJIcsm+07/HDY37iRV/zpQxnMQRT4LpLpxTVP5Z8/xxDmcww5OIOa5N CNDO8BalXs2SYov03RZewNUJroM3MeyRNV3rQMKk5Q9GPpHWv4fJ6FlOIa6nvkc07KMh8EbvkCF Y7oahpf5qjk4TnzdhVJfMnZqkADG+dLO2ei95LVZpxtteMGaFFe3m5dMmJlf7VU/dpyUI9I7fsU /90+yWKYExLT+bwnVmA14gu9ER/+8acD6dFREn2Gz4Ekemg3u4ZjUd+zT4upgTb5OZdZRnz4LsQ 0U= X-Received: by 2002:a17:903:38c7:b0:2c9:8287:fd0d with SMTP id d9443c01a7336-2d052438c91mr6467215ad.3.1785512959580; Fri, 31 Jul 2026 08:49:19 -0700 (PDT) Received: from Potato.tail66a299.ts.net ([171.76.83.76]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-3153e045016sm11852510eec.19.2026.07.31.08.49.17 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 31 Jul 2026 08:49:19 -0700 (PDT) From: Shivesh X-Google-Original-From: Shivesh To: arend.vanspriel@broadcom.com Cc: linux-wireless@vger.kernel.org, brcm80211@lists.linux.dev, brcm80211-dev-list.pdl@broadcom.com, linux-kernel@vger.kernel.org, Shivesh Subject: [PATCH v3 3/8] wifi: brcmfmac: core: populate radiotap header with RSSI Date: Fri, 31 Jul 2026 15:48:35 +0000 Message-ID: <20260731154901.1822-4-shivesh@example.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260731154901.1822-1-shivesh@example.com> References: <20260731154901.1822-1-shivesh@example.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Shivesh Populates the radiotap header with dbm_antsignal using the rssi value extracted from the firmware's hardware RX header, fixing missing signal data in monitor mode captures. Signed-off-by: Shivesh --- .../broadcom/brcm80211/brcmfmac/core.c | 44 ++++++++++++------- 1 file changed, 29 insertions(+), 15 deletions(-) diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c b/driv= ers/net/wireless/broadcom/brcm80211/brcmfmac/core.c index ec170647800d..eefc437dd055 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c @@ -431,45 +431,55 @@ void brcmf_netif_rx(struct brcmf_if *ifp, struct sk_b= uff *skb) netif_rx(skb); } =20 +struct brcmf_radiotap_info { + struct ieee80211_radiotap_header hdr; + s8 dbm_antsignal; +} __packed; + void brcmf_netif_mon_rx(struct brcmf_if *ifp, struct sk_buff *skb) { if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_MONITOR_FMT_RADIOTAP)) { - /* Do nothing */ + /* Firmware already provided a full radiotap header; do nothing */ } else if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_MONITOR_FMT_HW_RX_HDR)) { struct wlc_d11rxhdr *wlc_rxhdr =3D (struct wlc_d11rxhdr *)skb->data; - struct ieee80211_radiotap_header *radiotap; + struct brcmf_radiotap_info *rtap; unsigned int offset; u16 RxStatus1; + s8 rssi; =20 RxStatus1 =3D le16_to_cpu(wlc_rxhdr->rxhdr.RxStatus1); + rssi =3D wlc_rxhdr->rssi; =20 offset =3D sizeof(struct wlc_d11rxhdr); - /* MAC inserts 2 pad bytes for a4 headers or QoS or A-MSDU - * subframes - */ + /* MAC inserts 2 pad bytes for a4 headers or QoS or A-MSDU subframes */ if (RxStatus1 & RXS_PBPRES) offset +=3D 2; offset +=3D D11_PHY_HDR_LEN; =20 skb_pull(skb, offset); =20 - /* TODO: use RX header to fill some radiotap data */ - radiotap =3D skb_push(skb, sizeof(*radiotap)); - memset(radiotap, 0, sizeof(*radiotap)); - radiotap->it_len =3D cpu_to_le16(sizeof(*radiotap)); - - /* TODO: 4 bytes with receive status? */ - skb->len -=3D 4; + /* Insert our radiotap header with RSSI data */ + if (skb_cow_head(skb, sizeof(*rtap))) + goto drop; + rtap =3D skb_push(skb, sizeof(*rtap)); + memset(rtap, 0, sizeof(*rtap)); + rtap->hdr.it_len =3D cpu_to_le16(sizeof(*rtap)); + rtap->hdr.it_present =3D cpu_to_le32(1 << IEEE80211_RADIOTAP_DBM_ANTSIGN= AL); + rtap->dbm_antsignal =3D rssi; + + /* Strip the 4-byte receive status / FCS tail */ + skb_trim(skb, skb->len - 4); } else { struct ieee80211_radiotap_header *radiotap; =20 - /* TODO: use RX status to fill some radiotap data */ + if (skb_cow_head(skb, sizeof(*radiotap))) + goto drop; radiotap =3D skb_push(skb, sizeof(*radiotap)); memset(radiotap, 0, sizeof(*radiotap)); radiotap->it_len =3D cpu_to_le16(sizeof(*radiotap)); =20 - /* TODO: 4 bytes with receive status? */ - skb->len -=3D 4; + /* Strip the 4-byte receive status / FCS tail */ + skb_trim(skb, skb->len - 4); } =20 skb->dev =3D ifp->ndev; @@ -478,6 +488,10 @@ void brcmf_netif_mon_rx(struct brcmf_if *ifp, struct s= k_buff *skb) skb->protocol =3D htons(ETH_P_802_2); =20 brcmf_netif_rx(ifp, skb); + return; + +drop: + brcmu_pkt_buf_free_skb(skb); } =20 static int brcmf_rx_hdrpull(struct brcmf_pub *drvr, struct sk_buff *skb, --=20 2.53.0 From nobody Fri Oct 2 12:19:23 2026 Received: from mail-pl1-f179.google.com (mail-pl1-f179.google.com [209.85.214.179]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 31DA6448389 for ; Fri, 31 Jul 2026 15:49:24 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.179 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785512966; cv=none; b=qgU66kXq+krMSNzDGROPIa942NzaJYjTsw80Rs08VOFnTzdCdemcFmJwujrsfV851wYiRCH07Dg3BbiHwXwwmxGp021s+b/kbQVOuQJ0zjuugH5wptnqfzsFTPQ7g398nHCvwFnsop0zzKrhuaTm7Hi28aiUitkY6vC7l7YA2FA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785512966; c=relaxed/simple; bh=5l5j8Mmu2S3Bni8tiVCEfGXSJ+0eqA6wzanI0ZL23bY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=IJQGNRrK1w/YXHAyTJ5EkGq4IAzRkASIRfX+va+6ke83thapwvBUHHZiJT7wKrBgLCrNcM+PaJyuMSLTdv3BkioE679+EVfD/38KnxEC21wF/vuF707ADzUpo65Qpw0J75GQ0F1DZDHNxhT5KHTRjUzFh1m+DGmEFbpWlB3k41U= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=XkwcQLl/; arc=none smtp.client-ip=209.85.214.179 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="XkwcQLl/" Received: by mail-pl1-f179.google.com with SMTP id d9443c01a7336-2cf110997efso1823435ad.2 for ; Fri, 31 Jul 2026 08:49:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1785512963; x=1786117763; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=60bjaHyBUJd87L9/5oXjhGZVQ3tHQ6V6AhVTN/AVUw0=; b=XkwcQLl/Mm6YKXIunIeQlBrOYcSnzGWj482ckX9un2ZFd2U0dyZy9cHJzDQxKy/tz6 +h9pJhZqALeO0U0tKYuFUHoktok3fflOpk6l07d4CqWyf0h54Mn46M/52QXGI+yQ0COB M/y0HFpB0HTDS6BLIDxMDhEvjxUzMDo8NLIZ6USrgAi7YkHh7E1h9Xq8tX5l3hbfkkuS j2enUcbPYHZTjROTSHKbAyZ/ai57Vd4tpne47V94wh8KijWaDN7vZXsBRJ87zIoWRhar R+9CuxrRYyqkB/icBywJWD7dT2JtF7VQD5KMvY+0EDsYfPZmssvs0Qm1m1DpcIm9kTwK uVzg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1785512963; x=1786117763; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=60bjaHyBUJd87L9/5oXjhGZVQ3tHQ6V6AhVTN/AVUw0=; b=IS/oRuT9mzRnm/a6/WfiYD8ucgM1c5IbN2ZqoH1arLLg8WNGvxsdT5RjkWVEIsxorE LAXbT4931KyU+4fHk6oJFfVe91RbPgOOgevZGkX+s/yitbu7Wd88lSnNF9GZUd8CbLgn HF25PtqY0RZRMl/tCbBmevE78tJM2CJjOJOOSZBb3aeWChbHHy6PliuYxwtH37/R0xjZ uSXoRK3cesTClk53twhPXK5f7hSXdVxprHyd7DUil+wTwvBBv5IwVY0i6+FAyw0nLVpx T2Gi7Ah5W5gJT+RgSjPJukpgrKa06I7+dDYtsFIoGcv/IMBlxscxzoBtFf/Wazv8956D rkxA== X-Forwarded-Encrypted: i=1; AHgh+Rqv1KZDpGJlw4KQDhpWio7LFSWrRw9aHMxrOrZHVJOQoOXgFWP10O/6dsNN/SoEjK4InoTKQYE1y5OKx+o=@vger.kernel.org X-Gm-Message-State: AOJu0YyoGGa2LJALFBJQyW/2mQrSwS/J0y6vY+dPxdlgBN62uq7FPAbO Jnm4SquN6Bj0f41TwLkstissSzu/Rmt0ny8VOwK13hl36+c5XVd8MxNc X-Gm-Gg: AR+sD116gFOZMiMh1Q2lZQl/525GVPQzTL5SfBmm4gS8sKsAt2cux5jsjgiB4JbD1xH xrKyf0M8BHQps1ZMf4sZipTezk3fifD5K4LLyaxcWRvSpBL0UPpwioo/1iIlnAiuSUds9k2fm2M zGzfzImsJJTiASA8jGAweD5y7YegiDAzf5yZ6WgRRJYzZ7MZuq5xPsT6y2cBMlgSxQzRVlybgnO nTlvP/EZCEGixVuY0NZGFzdjGtICaaMsIjQZj7bmX+0bQ2iFsOydyp67m4MJVRXL28wpNEW41ZT cDNHeaJDNheyUdqERUWT8PzYOOwQ2mrUkpLJCy8M7ar5eq8jkaRARgtxSx/Gkl9ZAdfNw6/8fz1 KzVfOTlmBoWMrdhS9tlkx7zEj6HfIxoAnEtP/pulldGTUpjZIWENDekyFCG6aZijcsC2MSJlq95 UhDy4atG7itpsdR0AdzUi1fFvkfIGBIlLNPVX4g+oHeeZFy8Ts3KCwH/ml2ZGeKCpuXCLh7Y4t7 9E= X-Received: by 2002:a17:903:18d:b0:2cc:e7f3:d39e with SMTP id d9443c01a7336-2d052298ccemr6525965ad.2.1785512962471; Fri, 31 Jul 2026 08:49:22 -0700 (PDT) Received: from Potato.tail66a299.ts.net ([171.76.83.76]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-3153e045016sm11852510eec.19.2026.07.31.08.49.19 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 31 Jul 2026 08:49:22 -0700 (PDT) From: Shivesh X-Google-Original-From: Shivesh To: arend.vanspriel@broadcom.com Cc: linux-wireless@vger.kernel.org, brcm80211@lists.linux.dev, brcm80211-dev-list.pdl@broadcom.com, linux-kernel@vger.kernel.org, Shivesh Subject: [PATCH v3 4/8] wifi: brcmfmac: cfg80211: implement PMKID_V2 and fix delay busy-wait Date: Fri, 31 Jul 2026 15:48:36 +0000 Message-ID: <20260731154901.1822-5-shivesh@example.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260731154901.1822-1-shivesh@example.com> References: <20260731154901.1822-1-shivesh@example.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Shivesh Implements PMKID_V2 for FILS fast-roaming support instead of falling through to the V1 path. Additionally replaces a harmful mdelay() busy-wait in brcmf_delay with usleep_range() to prevent CPU stalls. Signed-off-by: Shivesh --- .../broadcom/brcm80211/brcmfmac/cfg80211.c | 123 ++++++++++++++++-- .../broadcom/brcm80211/brcmfmac/cfg80211.h | 4 +- 2 files changed, 115 insertions(+), 12 deletions(-) diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c b/= drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c index 0b55d445895f..2375c2f9d97a 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.c @@ -3989,12 +3989,10 @@ static int brcmf_cfg80211_sched_scan_stop(struct wi= phy *wiphy, =20 static __always_inline void brcmf_delay(u32 ms) { - if (ms < 1000 / HZ) { - cond_resched(); - mdelay(ms); - } else { + if (ms <=3D 20) + usleep_range(ms * 1000, ms * 1000 + 1000); + else msleep(ms); - } } =20 static s32 brcmf_config_wowl_pattern(struct brcmf_if *ifp, u8 cmd[4], @@ -4364,6 +4362,109 @@ brcmf_pmksa_v3_op(struct brcmf_if *ifp, struct cfg8= 0211_pmksa *pmksa, return ret; } =20 +/** + * brcmf_pmksa_v2_op - update firmware PMKSA cache using the V2 list inter= face. + * + * V2 firmware (revision 12) uses a versioned flat list structure + * (brcmf_pmk_list_v2_le) rather than the per-entry operation model of V3. + * Each entry carries FILS-specific fields (raw PMK material, SSID, and + * fils_cache_id) in addition to the basic BSSID + PMKID pair, enabling + * FILS fast-roaming on devices that do not support V3. + * + * @cfg: driver config structure holding the shadow V2 PMKSA list + * @ifp: interface pointer + * @pmksa: the PMKSA to add/remove, or NULL for a flush + * @alive: true =3D add (set time_left to no-expiry), false =3D remove/flu= sh + */ +static s32 +brcmf_pmksa_v2_op(struct brcmf_cfg80211_info *cfg, struct brcmf_if *ifp, + struct cfg80211_pmksa *pmksa, bool alive) +{ + struct brcmf_pub *drvr =3D cfg->pub; + struct brcmf_pmk_list_v2_le *list =3D &cfg->pmk_list_v2; + struct brcmf_pmksa_v2 *pmk =3D list->pmk; + u32 npmk =3D le16_to_cpu(list->length); + u32 i; + + /* npmk here stores the count of valid entries, repurposing the + * length field of the shadow list as a counter. We convert to + * the wire format (byte length) when sending to firmware. + */ + if (!pmksa) { + /* Flush: zero the shadow list and push an empty V2 list. */ + memset(list, 0, sizeof(*list)); + goto send; + } + + if (alive) { + /* Set: search for existing BSSID match first. */ + for (i =3D 0; i < npmk; i++) + if (!memcmp(pmksa->bssid, pmk[i].bssid, ETH_ALEN)) + break; + + if (i >=3D BRCMF_MAXPMKID) { + bphy_err(drvr, "V2 PMKSA cache full (%d entries)\n", + npmk); + return -EINVAL; + } + + memset(&pmk[i], 0, sizeof(pmk[i])); + pmk[i].length =3D cpu_to_le16(sizeof(struct brcmf_pmksa_v2)); + if (pmksa->bssid) + memcpy(pmk[i].bssid, pmksa->bssid, ETH_ALEN); + if (pmksa->pmkid) + memcpy(pmk[i].pmkid, pmksa->pmkid, WLAN_PMKID_LEN); + if (pmksa->pmk && pmksa->pmk_len && + pmksa->pmk_len <=3D WLAN_PMK_LEN_SUITE_B_192) { + memcpy(pmk[i].pmk, pmksa->pmk, pmksa->pmk_len); + pmk[i].pmk_len =3D cpu_to_le16(pmksa->pmk_len); + } + if (pmksa->ssid && pmksa->ssid_len) { + memcpy(pmk[i].ssid.SSID, pmksa->ssid, pmksa->ssid_len); + pmk[i].ssid.SSID_len =3D pmksa->ssid_len; + } + if (pmksa->fils_cache_id) + pmk[i].fils_cache_id =3D *pmksa->fils_cache_id; + + if (i =3D=3D npmk) + npmk++; + } else { + /* Delete: find by BSSID and compact the list. */ + for (i =3D 0; i < npmk; i++) + if (!memcmp(pmksa->bssid, pmk[i].bssid, ETH_ALEN)) + break; + + if (i >=3D npmk) { + bphy_err(drvr, "V2 PMKSA entry not found\n"); + return -EINVAL; + } + + for (; i < npmk - 1; i++) + memcpy(&pmk[i], &pmk[i + 1], sizeof(pmk[i])); + memset(&pmk[npmk - 1], 0, sizeof(pmk[npmk - 1])); + npmk--; + } + + /* Write the updated entry count back to shadow BEFORE we overwrite + * list->length with the wire-format byte length at send:. If we + * don't do this here, the next call will read a byte-length back + * as an entry count and silently corrupt the list. + */ + list->length =3D cpu_to_le16(npmk); + +send: + /* Build the wire-format byte length and send the full list to firmware. + * Read npmk back from the shadow (handles the flush path where npmk=3D0). + */ + npmk =3D le16_to_cpu(list->length); + list->version =3D cpu_to_le16(BRCMF_PMKSA_VER_2); + list->length =3D cpu_to_le16(offsetof(struct brcmf_pmk_list_v2_le, pmk) + + npmk * sizeof(struct brcmf_pmksa_v2)); + + return brcmf_fil_iovar_data_set(ifp, "pmkid_info", list, sizeof(*list)); +} + + static __used s32 brcmf_update_pmklist(struct brcmf_cfg80211_info *cfg, struct brcmf_if *ifp) { @@ -4402,8 +4503,8 @@ brcmf_cfg80211_set_pmksa(struct wiphy *wiphy, struct = net_device *ndev, =20 if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_PMKID_V3)) return brcmf_pmksa_v3_op(ifp, pmksa, true); - - /* TODO: implement PMKID_V2 */ + if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_PMKID_V2)) + return brcmf_pmksa_v2_op(cfg, ifp, pmksa, true); =20 npmk =3D le32_to_cpu(cfg->pmk_list.npmk); for (i =3D 0; i < npmk; i++) @@ -4446,8 +4547,8 @@ brcmf_cfg80211_del_pmksa(struct wiphy *wiphy, struct = net_device *ndev, =20 if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_PMKID_V3)) return brcmf_pmksa_v3_op(ifp, pmksa, false); - - /* TODO: implement PMKID_V2 */ + if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_PMKID_V2)) + return brcmf_pmksa_v2_op(cfg, ifp, pmksa, false); =20 npmk =3D le32_to_cpu(cfg->pmk_list.npmk); for (i =3D 0; i < npmk; i++) @@ -4487,8 +4588,8 @@ brcmf_cfg80211_flush_pmksa(struct wiphy *wiphy, struc= t net_device *ndev) =20 if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_PMKID_V3)) return brcmf_pmksa_v3_op(ifp, NULL, false); - - /* TODO: implement PMKID_V2 */ + if (brcmf_feat_is_enabled(ifp, BRCMF_FEAT_PMKID_V2)) + return brcmf_pmksa_v2_op(cfg, ifp, NULL, false); =20 memset(&cfg->pmk_list, 0, sizeof(cfg->pmk_list)); err =3D brcmf_update_pmklist(cfg, ifp); diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h b/= drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h index 6ceb30142905..57167fde5ba1 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/cfg80211.h @@ -344,7 +344,8 @@ struct brcmf_cfg80211_wowl { * @bss_list: bss_list holding scanned ap information. * @bss_info: bss information for cfg80211 layer. * @conn_info: association info. - * @pmk_list: wpa2 pmk list. + * @pmk_list: wpa2 pmk list (V1 firmware). + * @pmk_list_v2: wpa2 pmk list for V2 firmware (FILS-capable, firmware rev= 12). * @scan_status: scan activity on the dongle. * @pub: common driver information. * @channel: current channel. @@ -376,6 +377,7 @@ struct brcmf_cfg80211_info { struct wl_cfg80211_bss_info *bss_info; struct brcmf_cfg80211_connect_info conn_info; struct brcmf_pmk_list_le pmk_list; + struct brcmf_pmk_list_v2_le pmk_list_v2; unsigned long scan_status; struct brcmf_pub *pub; u32 channel; --=20 2.53.0 From nobody Fri Oct 2 12:19:23 2026 Received: from mail-pl1-f182.google.com (mail-pl1-f182.google.com [209.85.214.182]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4DA254499B3 for ; Fri, 31 Jul 2026 15:49:25 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.182 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785512968; cv=none; b=LavAL2M78taCNbb32QrdisQPjTSRBmhW9K9ay4np2hrK78U+swGHLVAatf5zZFAHH9J9S13MtfCpF6WpBejyhUzfjjq/yP3lxv3oMG5DCLoeHOWhCSLax/RoKe7+sxrpabZHIlPKp6DFkEwbbatRU0ssdOtc3dj67AEn1nUHoW8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785512968; c=relaxed/simple; bh=bo6GZs5cRhfR+4h6zHzYZY0ne9OWftzWzsm3xWEM+bs=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=G3O6e2WhwDi6QWdknbVRG7G9FsZTiYujRoQ56EUPcvFYrbUyVeK4vIw7KmaX+OiAXdUV0Qtg54OfuddxEd2f5eka5XMjWkQnKj3VLLBGHSCqJSIwJTSZRV4Yrnl9Bt8+cjtU8j6IkAbj2+f3h2yFcaoexFlMHtpadPW8gaFBG3Q= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=khfBC/8q; arc=none smtp.client-ip=209.85.214.182 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="khfBC/8q" Received: by mail-pl1-f182.google.com with SMTP id d9443c01a7336-2cf110997efso1823485ad.2 for ; Fri, 31 Jul 2026 08:49:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1785512965; x=1786117765; darn=vger.kernel.org; h=content-transfer-encoding:content-type:mime-version:references :in-reply-to:message-id:date:subject:cc:to:from:from:to:cc:subject :date:message-id:reply-to:content-type; bh=cjsOjYk7yuXBgbYLc3ZTyWopMFfcMdSI35CR9dqHg6w=; b=khfBC/8qgCqymQftNSjQzWzpxk5yfkqVg1IrQrWbzVcwuc/Fxjzr3nhFmMrJ/Tn0X9 pUjodzYaCngKP443ZPt9tu/MX7P4CmaJhxyemYtNjLu7cPyuhbQ2ybs0Npqzr5/WJ/Ba ch4tggiBLnEQAnnzOMeYa/4thPQo+ySuCyp7Q1LIxa6rtk1mgbXJZk4U/3zuqvYwSeZu ahKC/hwzs7sVimOMYZM62gjlsbZLhtD8eWuGuNjx2Xp9Z4+KdkhQ2aLv4JqVYAr0lEaF GC4fdMNNvlexJsDD5W0mT1l9p/Q4XB4ofFi4tjhNXPe6DqFYMucyb9Nk6TGNuEgCjKMF UTow== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1785512965; x=1786117765; h=content-transfer-encoding:content-type:mime-version:references :in-reply-to:message-id:date:subject:cc:to:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=cjsOjYk7yuXBgbYLc3ZTyWopMFfcMdSI35CR9dqHg6w=; b=CnRgnsMRyv97ta2dwPHIqrdyo7d5hEANFjGXrfD+b0A5ruZaLAWwZZ4cyiKPnxb7vV KbMaWc2eKu/W+PuE+l0uDIAlEqPubVQbemhl/hgBWcPFY3xKiEqUofPzr+aHV4T+P8/4 seLnTrac8Czk9UP+ncynAgTGsr6YaUGFyan2cscGUV+66ML/Pr8HazyRyIvzD4LTDv32 5g6CCXipRb61LkSF9ZGV4h14bnGinDXjLWOTs7OID50ECPDuNbFnKz7+FrM4H4KRsQbG XLiMTIdbkSHSx1pSDsTcC/7G5yeOaQSnFW6NpZSliYJ9F+NkQZzPj5aZ9CjCH5jA8DeX I8jQ== X-Forwarded-Encrypted: i=1; AHgh+Rq7EEmshNmMvy0Yitg5tagMnK5QaqpGHYtAmEo9+kG5o0jEsc0O5KKKpsE3osXKpmbn6t7pa9S3Q21P6iQ=@vger.kernel.org X-Gm-Message-State: AOJu0YwtKSIQO2iMkOupyNnA/IUO8HpGu8TQFnZymz2kF26M/w3ArPDd kIQtCkY2ioV/QfExaPfFM9NxCbVtQIu0C1r/MtRQ2LHRbdwqLO6zUa6J X-Gm-Gg: AR+sD12uoajTacoqJ9k6r2RHjbebUtOyHb8AvUFLpclN1c4Nzgx9HOSZ1W0BlGYA34y cLvZy4DhA7buf794WjUPouSyCAcYiZN7T36ANUhT0pAAf1PMBUkk0vJrJL8lDP4QdnqdumLSLGB dSWOlwcLpdXtc4/DLeLnsq/ep+tBpjfAoHADyvq/VyGvaz4w0dh8Ho/l0Su1wAgCHOKI6n1MZKO 52MsV6+EAQnoPeNNe5s4QDwNeERgTrlr3yht6M06xdjIWMlAx0ydfM0ifqI4uS/RDznX52ArdR1 jQbwXCDMOxBflddlDUaV2n54VqDcLokdnl4ujgDCRj9YB597RnCaN3dz4mbc8TCodJ/Sy0yCWK1 FYtkOST3CZjammmon1NIqiyw2hjX2o2oZthmbUCaJ74WedFgToab/xM050uWB8fdBM8jq760geb iQlv8j8e0WEAB+4uIOZl6wTdCS2ZS4v6ryR3dFRXhRQNxEWigymLfPSUs6iwqts1XgLJKzhihIt dU= X-Received: by 2002:a17:903:3c23:b0:2d0:2741:f31b with SMTP id d9443c01a7336-2d0523fc4ecmr7602255ad.4.1785512965351; Fri, 31 Jul 2026 08:49:25 -0700 (PDT) Received: from Potato.tail66a299.ts.net ([171.76.83.76]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-3153e045016sm11852510eec.19.2026.07.31.08.49.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 31 Jul 2026 08:49:25 -0700 (PDT) From: Shivesh X-Google-Original-From: Shivesh To: arend.vanspriel@broadcom.com Cc: linux-wireless@vger.kernel.org, brcm80211@lists.linux.dev, brcm80211-dev-list.pdl@broadcom.com, linux-kernel@vger.kernel.org, Shivesh Subject: [PATCH v3 5/8] wifi: brcmfmac: msgbuf: tune thresholds and optimize sleep latency Date: Fri, 31 Jul 2026 15:48:37 +0000 Message-ID: <20260731154901.1822-6-shivesh@example.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260731154901.1822-1-shivesh@example.com> References: <20260731154901.1822-1-shivesh@example.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable From: Shivesh Increases tx pktids and tune flush thresholds. Fixes a silent tx stall under high load by correctly using test_and_set_bit. Optimizes initialization polling latency from msleep(10) to usleep_range. Signed-off-by: Shivesh --- .../broadcom/brcm80211/brcmfmac/msgbuf.c | 69 ++++++++++++++++--- 1 file changed, 61 insertions(+), 8 deletions(-) diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c b/dr= ivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c index ba1ce1552e0f..8db6167072da 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c @@ -48,7 +48,19 @@ #define MSGBUF_TYPE_LPBK_DMAXFER 0x13 #define MSGBUF_TYPE_LPBK_DMAXFER_CMPLT 0x14 =20 -#define NR_TX_PKTIDS 2048 +/* + * NR_TX_PKTIDS: number of simultaneously in-flight TX packet IDs. + * Each outstanding TX frame consumes one ID until the dongle returns + * a TX-status completion. The original 2048-entry pool exhausted under + * =E2=89=A54 concurrent iperf3 streams on Wi-Fi 5/6 (802.11ac/ax) devices, + * causing "No PKTID available" drops and TCP retransmits. 4096 gives + * headroom for high-aggregation scenarios while still fitting in a + * modest amount of host memory (~48 KB for the pktid table entries). + * + * NR_RX_PKTIDS: RX post buffers pre-allocated to the dongle. 1024 is + * sufficient for current hardware RX ring depths; leave unchanged. + */ +#define NR_TX_PKTIDS 4096 #define NR_RX_PKTIDS 1024 =20 #define BRCMF_IOCTL_REQ_PKTID 0xFFFE @@ -64,8 +76,29 @@ #define BRCMF_MSGBUF_PKT_FLAGS_FRAME_MASK 0x07 #define BRCMF_MSGBUF_PKT_FLAGS_PRIO_SHIFT 5 =20 -#define BRCMF_MSGBUF_TX_FLUSH_CNT1 32 -#define BRCMF_MSGBUF_TX_FLUSH_CNT2 96 +/* + * TX flush / doorbell-ring thresholds. + * + * CNT1 is the minimum number of frames to accumulate in the commonring + * before the first intermediate write_complete() (doorbell ring) is + * issued mid-batch. CNT2 is the hard flush interval: after this many + * frames have been written since the last flush, we unconditionally + * ring the bell and reset the counter. + * + * Raising both from the original 32/96 to 64/128 doubles the average + * number of TX descriptors committed per MMIO write, halving the PCIe + * doorbell rate on sustained throughput workloads. The tradeoff is a + * marginally higher worst-case latency for the last frames in a burst, + * which in practice is hidden by the time the dongle DMA engine drains + * the previous batch. + * + * TRICKLE_TXWORKER_THRS governs how often brcmf_msgbuf_tx_queue_data() + * forces a workqueue schedule when the queue depth is not a multiple of + * this value. Keeping it at half of CNT1 (32) preserves responsiveness + * for low-rate flows (e.g. VoIP, ICMP) that never accumulate 64 frames. + */ +#define BRCMF_MSGBUF_TX_FLUSH_CNT1 64 +#define BRCMF_MSGBUF_TX_FLUSH_CNT2 128 =20 #define BRCMF_MSGBUF_DELAY_TXWORKER_THRS 96 #define BRCMF_MSGBUF_TRICKLE_TXWORKER_THRS 32 @@ -787,10 +820,30 @@ static int brcmf_msgbuf_schedule_txdata(struct brcmf_= msgbuf *msgbuf, u32 flowid, { struct brcmf_commonring *commonring; =20 - set_bit(flowid, msgbuf->flow_map); + /* + * If the bit was already set, a txflow_work item is already + * queued or running for this ring. In that case the existing + * worker will drain our freshly enqueued frame when it runs, + * so we only need to schedule another work item when the + * force flag is set or the ring is below the delay threshold. + * + * If the bit was NOT set (test_and_set_bit returns false), no + * worker is pending for this ring at all. We MUST schedule + * one unconditionally, otherwise the frame we just enqueued + * will sit in the flowring unsent until some unrelated event + * triggers the workqueue =E2=80=94 causing silent TX stalls under + * high load when outstanding_tx >=3D DELAY_TXWORKER_THRS. + */ + if (!test_and_set_bit(flowid, msgbuf->flow_map)) { + /* Bit was clear: no worker pending, always schedule. */ + queue_work(msgbuf->txflow_wq, &msgbuf->txflow_work); + return 0; + } + + /* Bit was already set: worker pending, apply coalescing heuristic. */ commonring =3D msgbuf->flowrings[flowid]; - if ((force) || (atomic_read(&commonring->outstanding_tx) < - BRCMF_MSGBUF_DELAY_TXWORKER_THRS)) + if (force || (atomic_read(&commonring->outstanding_tx) < + BRCMF_MSGBUF_DELAY_TXWORKER_THRS)) queue_work(msgbuf->txflow_wq, &msgbuf->txflow_work); =20 return 0; @@ -1621,11 +1674,11 @@ int brcmf_proto_msgbuf_attach(struct brcmf_pub *drv= r) do { brcmf_msgbuf_rxbuf_data_fill(msgbuf); if (msgbuf->max_rxbufpost !=3D msgbuf->rxbufpost) - msleep(10); + usleep_range(1000, 2000); else break; count++; - } while (count < 10); + } while (count < 100); brcmf_msgbuf_rxbuf_event_post(msgbuf); brcmf_msgbuf_rxbuf_ioctlresp_post(msgbuf); =20 --=20 2.53.0 From nobody Fri Oct 2 12:19:23 2026 Received: from mail-pj1-f52.google.com (mail-pj1-f52.google.com [209.85.216.52]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 458EA44607A for ; Fri, 31 Jul 2026 15:49:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.52 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785512971; cv=none; b=ULVVw2yj3lvX1/qHpWSiqPjHtqLIsRszReafFo7P6yGUluPg+N1RxYEsJ7IzWg4hn2Q/6sXW7ivtXfanbQ14hSwvIGm8Gl+V3Oo6Vyx1J5ZHNz9uQFx8dyxJNyBbjK8HpqzrC+WWlT8Tp6OzHZAJlTiP5Dy1EcI8uUreNSaAmn4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785512971; c=relaxed/simple; bh=UrR8l2e2ua0r8hL++ntP47TXScInY+OVnratMs3ND84=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=sbYsFMFXplNIwNTZ40SePQD2KpdqEKsAGEG+tCctv9aX/axhB0ux8BuRBsNH0seaglNLCxioOFGq/IVtqVQQfHg7xpo0FiQ9sCQSKiGQ3M2qiiDM2hjkm7P/Jsrgyc3oHitkp+1cQn0bC5W5v7W/7BJXDu2uO7Sk8wOm8jp11m8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=mJc3U1bG; arc=none smtp.client-ip=209.85.216.52 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="mJc3U1bG" Received: by mail-pj1-f52.google.com with SMTP id 98e67ed59e1d1-38ecc48b3deso135697a91.0 for ; Fri, 31 Jul 2026 08:49:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1785512968; x=1786117768; darn=vger.kernel.org; h=content-transfer-encoding:content-type:mime-version:references :in-reply-to:message-id:date:subject:cc:to:from:from:to:cc:subject :date:message-id:reply-to:content-type; bh=9KRSCmcUKJkgpKNhWDdTfQ1+nI5nYS2/gN/zLauhACk=; b=mJc3U1bGW9P90atVsLuDi4sRpqjVuww6VYFMDtAj0xbs4tZr6ePT6Nw0YYgfHQr9kb zp1u5NakL6S1eELXPv68hYfP9+ZctU/QiMPfk0f5YEm2joFPXew43Sso1mdyABRp0h8f rbsfep3HXOCpgxWPY1RRbV7Zwgi+Ne6D+r1E3fC6SH207sFhYxOME0PT7uihDE+n1HJC SlqyDzAuTrVJzieN2HZjtyoF63zIZbJWLTYXKFSoBBF4+/el1qoeDKK+LfIGFEo5+ZL1 jKZE7Dew0MmuPWX5A0vvarA1ygiUoYGelcdLuQzdgc5aTWTlsmg+aVjdz6ZBzRdbI5JM 2Zfw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1785512968; x=1786117768; h=content-transfer-encoding:content-type:mime-version:references :in-reply-to:message-id:date:subject:cc:to:from:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to :content-type; bh=9KRSCmcUKJkgpKNhWDdTfQ1+nI5nYS2/gN/zLauhACk=; b=YZlToCRhKYgGYaHzqJw65K7Dmnf5aI+MAcAPfCxYYwosrTGz0mInh2PkUp+XJw9YaI 9nQVTfbIHWvxiaJ8TfMHfP8f8Y6jvScdO6o5cBdrTthahR3lezVksG0BWF2LTpJKo8n2 Bg7blcE7FNP6oFY28FKYMRgDfYLaa4bmnqgyqKQGPS+9/1gzpuAAkOKikSv7SiiP18E6 bbAy46INyDGyr4Y0uDttYB/1e82TatFSdgXilFZPRnw13vkUPpn4pc5nLxg4JQAB0xho s/E9qvELpGA9MD9ehsdst5aKZ93OuF/4ahdZLMmRmxhxidJRJb4qh1HehPDuPmsTGmye Xakw== X-Forwarded-Encrypted: i=1; AHgh+RrgZ/tgZ93qbkA0mOfJQLhrUbfiZvX6AeZfocsLq31eaJeCuqzmUWQpvnkbqNTcy8ss8JzuNbxh8FLmEhY=@vger.kernel.org X-Gm-Message-State: AOJu0Yy8m5ynpcfACfyoI695mg0R4rbWLBKay3mmtNZZ/Bdm2e8bXRK9 ytEdQFN2K0GEzRua9xiyGPPcbly6qj5WPIl0H5Dv/Lw2vRRv8D5B3qWA X-Gm-Gg: AR+sD10+lQRIuUjADRgEQP/XXWFeCiOvA5kDxEVCdszUWGLDsgE9TT+eMqdzZO5Fpgw PuSets5akKMsF6wPsYmWAYVODYf/Tx/fmeT4Ikk8BvsbgLGKC0oD0bnRyprDm4JKa6hBu+I8QrX XW+tV7miMxRVV3IcIKmG73oE6pXaejC9iKuv+n8BMrHRt5hQcLuvrE/QQiTF38hW7Llludu/i4e jSyGRi9AG5GoVEuqyXqDIdSv6Yck0e23N8VGxKLltuKJIbGj3GJrCw2oPA2y5nfy8TiRwQzyOev bC7oKHG/4YWJRUT05xIbutGBFvBN7WQ+MIvXp5fIJuSOT8LYOIozn3yhPZR0cdco7b/GGJyEQqf 0qynQvL9DRSzDMryGcNfiuF9ICU9Zaf75T1jL8EdMm1O5fGWsZryT5/VhzHeeoxk21qmUzj8TlY mYlUqVRZBPif5J4KR8VzP6UsLC/1H2NcorKT4nzTXEwUsZOosxPVHdvrMv1wtZx/zoatM56NdlE iMMNAwwlO5/rt0= X-Received: by 2002:a17:90b:3a10:b0:38e:91a8:fb85 with SMTP id 98e67ed59e1d1-38fbc507730mr481174a91.3.1785512968287; Fri, 31 Jul 2026 08:49:28 -0700 (PDT) Received: from Potato.tail66a299.ts.net ([171.76.83.76]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-3153e045016sm11852510eec.19.2026.07.31.08.49.25 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 31 Jul 2026 08:49:27 -0700 (PDT) From: Shivesh X-Google-Original-From: Shivesh To: arend.vanspriel@broadcom.com Cc: linux-wireless@vger.kernel.org, brcm80211@lists.linux.dev, brcm80211-dev-list.pdl@broadcom.com, linux-kernel@vger.kernel.org, Shivesh Subject: [PATCH v3 6/8] wifi: brcmfmac: pcie: optimize latency and irq teardown Date: Fri, 31 Jul 2026 15:48:38 +0000 Message-ID: <20260731154901.1822-7-shivesh@example.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260731154901.1822-1-shivesh@example.com> References: <20260731154901.1822-1-shivesh@example.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable From: Shivesh Optimizes mailbox polling with exponential backoff rather than a fixed msleep(10) loop. Fixes define names. Eliminates coarse msleep(50) delays during IRQ teardown by replacing them with tight usleep_range polling. Signed-off-by: Shivesh --- .../broadcom/brcm80211/brcmfmac/pcie.c | 66 ++++++++++++++++--- 1 file changed, 58 insertions(+), 8 deletions(-) diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c b/driv= ers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c index 13662aa4b4ea..9338a5faa260 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/pcie.c @@ -268,6 +268,27 @@ static const struct brcmf_firmware_mapping brcmf_pcie_= fwnames[] =3D { =20 #define BRCMF_PCIE_MBDATA_TIMEOUT msecs_to_jiffies(2000) =20 +/* + * H2D mailbox poll timing parameters. + * + * The dongle typically clears the H2D mailbox register within a few + * hundred microseconds after the doorbell interrupt fires. The + * original code used msleep(10) * 100 iterations, meaning the + * minimum observable latency was 10ms even when the dongle was fast. + * + * We instead start with a short sleep and double it each iteration + * (exponential backoff) up to BRCMF_PCIE_MB_POLL_MAX_US, staying + * within the same 1-second absolute timeout. + * + * MIN_US / INITIAL_MAX_US : usleep_range bounds for the first iteration. + * MAX_US : cap on the per-iteration sleep (=C2=B5s). + * TIMEOUT_US : total budget before giving up (1 second). + */ +#define BRCMF_PCIE_MB_POLL_MIN_US 40 +#define BRCMF_PCIE_MB_POLL_INITIAL_MAX_US 50 +#define BRCMF_PCIE_MB_POLL_MAX_US 5000 +#define BRCMF_PCIE_MB_POLL_TIMEOUT_US 1000000 + #define BRCMF_PCIE_CFGREG_STATUS_CMD 0x4 #define BRCMF_PCIE_CFGREG_PM_CSR 0x4C #define BRCMF_PCIE_CFGREG_MSI_CAP 0x58 @@ -766,7 +787,8 @@ brcmf_pcie_send_mb_data(struct brcmf_pciedev_info *devi= nfo, u32 htod_mb_data) struct brcmf_core *core; u32 addr; u32 cur_htod_mb_data; - u32 i; + u32 elapsed_us =3D 0; + u32 sleep_us =3D BRCMF_PCIE_MB_POLL_INITIAL_MAX_US; =20 shared =3D &devinfo->shared; addr =3D shared->htod_mb_data_addr; @@ -776,12 +798,40 @@ brcmf_pcie_send_mb_data(struct brcmf_pciedev_info *de= vinfo, u32 htod_mb_data) brcmf_dbg(PCIE, "MB transaction is already pending 0x%04x\n", cur_htod_mb_data); =20 - i =3D 0; + /* + * Wait for the dongle to consume the previous H2D mailbox message. + * + * There is no interrupt that signals when the dongle clears this + * register, so polling is unavoidable. The original code used + * msleep(10) per iteration, incurring at least 10ms of latency + * even when the dongle responded in microseconds. + * + * We use usleep_range() with exponential backoff instead: + * - First iteration sleeps ~50=C2=B5s (fast path for responsive dongle= ). + * - Each subsequent iteration doubles the sleep, capped at 5ms, + * so long waits still yield the CPU without busy-spinning. + * - Total timeout matches the original 1-second limit. + * - We bail early if the device has gone down so that a dead + * dongle does not hold the caller for a full second. + */ while (cur_htod_mb_data !=3D 0) { - msleep(10); - i++; - if (i > 100) + if (devinfo->state =3D=3D BRCMFMAC_PCIE_STATE_DOWN) { + brcmf_dbg(PCIE, "Device down, aborting MB send\n"); return -EIO; + } + + if (elapsed_us >=3D BRCMF_PCIE_MB_POLL_TIMEOUT_US) { + brcmf_err("Timeout waiting for H2D MB slot after %u us\n", + elapsed_us); + return -EIO; + } + + usleep_range(BRCMF_PCIE_MB_POLL_MIN_US, sleep_us); + elapsed_us +=3D sleep_us; + + /* Exponential backoff, capped at BRCMF_PCIE_MB_POLL_MAX_US */ + sleep_us =3D min(sleep_us * 2, (u32)BRCMF_PCIE_MB_POLL_MAX_US); + cur_htod_mb_data =3D brcmf_pcie_read_tcm32(devinfo, addr); } =20 @@ -1001,10 +1051,10 @@ static void brcmf_pcie_release_irq(struct brcmf_pci= edev_info *devinfo) free_irq(pdev->irq, devinfo); pci_disable_msi(pdev); =20 - msleep(50); + usleep_range(1000, 2000); count =3D 0; - while ((devinfo->in_irq) && (count < 20)) { - msleep(50); + while ((devinfo->in_irq) && (count < 1000)) { + usleep_range(1000, 2000); count++; } if (devinfo->in_irq) --=20 2.53.0 From nobody Fri Oct 2 12:19:23 2026 Received: from mail-pl1-f179.google.com (mail-pl1-f179.google.com [209.85.214.179]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id AA18F4457A3 for ; Fri, 31 Jul 2026 15:49:31 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.179 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785512973; cv=none; b=RaUUxUc0QkNuwmB22RoBFKoNveFBOt5NnYp6vX+VhmOUn2OTWH6ENjs7YDp+nlmCinBXrTLHme1G0oOhfWs3sftfEWl9FO+mAb+AEKSz/qx3icYYBuIsn8EQs9cYlGDYrGYjplxg/gKr3zanwXV8f7gYS5o5I95Ij/ONBhMN0kA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785512973; c=relaxed/simple; bh=msMdhfowBySBXOdyCbxYCun0AlWqDhJmOSOvSMu4OjY=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=kLzwfnFP/FbT8QfmZ8cEZW0obEsPZK++NqGdOnSe4srOqZaD6PZZPhgICcJq2J8jX1xZeXwmF2267R60eeIA/hiiOEbxVmZmRR/+0TZg6ylYn9MrWB3C/JFzefWXR2vOy2LkGdP7j6cmq1aoo+Sg1VCaNgDCZst0h10odz/brIU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=mDpSF3rE; arc=none smtp.client-ip=209.85.214.179 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="mDpSF3rE" Received: by mail-pl1-f179.google.com with SMTP id d9443c01a7336-2cf110997efso1823665ad.2 for ; Fri, 31 Jul 2026 08:49:31 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1785512971; x=1786117771; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=SPK6mauK3g7KvbulXUNjPujp1LFeaCkSgeVtH4yKc2U=; b=mDpSF3rE9izPkEIV6pd3AdxYP5oiOAkGibEjVKw29QJ6DWHvPC6K2JX8oKsSAIqhgt cwYItmEruIWYrjTTWiBKAApt4WK+im+TViG1JLFbguuKLgh6ngptHNYtaRraVOZoUqA1 CvP6ZuuzTYrX32ao4IEVY257BDHjZArmw+uKwIPqppFPz9ws0zJ6wAZ4WT3b2tLmdbmP SxyatK/hF3FQRKgKZRntbf4weJgDaAQ9AeQwbykYXegQYlexPrmAy9LBmocQ5aarSdvw WN1Lx+P969dx7+YGEgKI2aQv8N+/zk6wrkhaY7HAZgZzwEyc2u9SG3GWEV2+/I7wfk6L 9xdg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1785512971; x=1786117771; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=SPK6mauK3g7KvbulXUNjPujp1LFeaCkSgeVtH4yKc2U=; b=c/7WzbygGujGybfNdAxgKC2IB4Q+mik4HHaeHPWe2QrZOf8p82OjwbmY94WS6jSSym lPzyuGrCepdTZMJBr1Nn3vIiNnUF09fgHGzqRmrS+I5r5QJ4216owg99wQMr2KUyClbp PV76//7FyYYQY4L1CPFjUVt60CCPk9P2DNsjSHxUPNRioLijjK9vcZaKwjlW3ergVQJx MA6bWuKhUBLueGgeQCFw62lwMcjYG6EwFbGaCL8+eaNlF0bhPf2GUfmrhLekGntagPHb T3ni8W9TO0NqHC4cH8dyI7RVP9R0JsMpwUAXSnPQRmf41bYNg9jZZbO2fTtaBd9scVKC bpfA== X-Forwarded-Encrypted: i=1; AHgh+Rqorht9TDEFZ8geMYlqlLRIZQI3aHTDyFiQ4M2jS7+NqTuk38gAnBJTnJwzwDiWYL2LT+wBY6BoWvh/244=@vger.kernel.org X-Gm-Message-State: AOJu0YxSn/zA+eDqVrAwLi+d0oXMHXOG5qZunLRIZzyD2K8uDLpBTIcJ LgNq7pfKs1/F2C2MqfIxzTOxV4/GuQYyW2FyCEDpP6wiZzb//LX9VLbUxm2UllTtC3c= X-Gm-Gg: AR+sD11qqemQcWFPgx6D2hXIkHymaxJExlAZa6rcbv6AbgXTySRFV8gwp/uWKWUqpFF r8pcxcLNhmVNCrvOPRfICtLusEuwPUESYhoxRkYQiHOpiihlQ66bkJlq+xmxlCI9bce8526QrC0 oejR05KF2AgkAAZ1yYPMLQaUjmdMvR3TCfQDe/s9fA78mB5A+aHD7XaeKxMTdA5x5wTHxcrPXNy 6/LG+YiPuuww/1sPGVBwgrljYCRECirWZumcBPtX96kMRGqzSlNEdvtXoLUt1wzXl9Y2ucqvcg6 hTrayKcrn/1UhdDDBr8KN6ibjoM0nhTEtbWVmPIicxYtZmhxadf/lG1qBkFIL1ovLYKQu1oVyzL iUbS2te7B/E2+X5taxgjALk1ffqVvlxhYVtPuYPhOTDeOSOmvylVJHpPELiV29pPY1DdJ+xeGxv T0gpofYwi6BTdXx3BIAMs9cqgY3BtNXnTVlklc3dhP6RUPRv5EFn3tOPXf6JQmW+8d9vU09nHaP Xs= X-Received: by 2002:a17:902:ced1:b0:2c9:fbde:ab68 with SMTP id d9443c01a7336-2d0523c0f5emr7083365ad.3.1785512971076; Fri, 31 Jul 2026 08:49:31 -0700 (PDT) Received: from Potato.tail66a299.ts.net ([171.76.83.76]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-3153e045016sm11852510eec.19.2026.07.31.08.49.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 31 Jul 2026 08:49:30 -0700 (PDT) From: Shivesh X-Google-Original-From: Shivesh To: arend.vanspriel@broadcom.com Cc: linux-wireless@vger.kernel.org, brcm80211@lists.linux.dev, brcm80211-dev-list.pdl@broadcom.com, linux-kernel@vger.kernel.org, Shivesh Subject: [PATCH v3 7/8] wifi: brcmfmac: fwsignal: safe no-op on duplicate MAC add Date: Fri, 31 Jul 2026 15:48:39 +0000 Message-ID: <20260731154901.1822-8-shivesh@example.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260731154901.1822-1-shivesh@example.com> References: <20260731154901.1822-1-shivesh@example.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Shivesh Removes technical debt TODO by safely ignoring duplicate MAC handle ADD events from firmware. Signed-off-by: Shivesh --- drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c b/= drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c index a43f1a38b0e3..3c1ca355e8ee 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/fwsignal.c @@ -1037,7 +1037,9 @@ int brcmf_fws_macdesc_indicate(struct brcmf_fws_info = *fws, u8 type, u8 *data) } else { brcmf_dbg(TRACE, "use existing\n"); WARN_ON(entry->mac_handle !=3D mac_handle); - /* TODO: what should we do here: continue, reinit, .. */ + /* Firmware re-sent ADD for the same MAC handle. + * No action required; it is a safe no-op. + */ } } return 0; --=20 2.53.0 From nobody Fri Oct 2 12:19:23 2026 Received: from mail-pj1-f49.google.com (mail-pj1-f49.google.com [209.85.216.49]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E050F44C666 for ; Fri, 31 Jul 2026 15:49:34 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.49 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785512976; cv=none; b=S2XjYodanavTSV43krTIF4AjzdOeAuOY4VGr2UhaWDtPmFs4El5bmJKvzQqbftQCeC/bxhQRj4iDhiJekzw267tvzAnKIsvtRd/0tRaefDIHVSWkjQhLLL7GAjnkiBUjK0fWc0yVTJqNotv4xc0xWhl2FJsG3BoKRhrN8xGLBhc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1785512976; c=relaxed/simple; bh=/RZ3/Y/ZlOJg5G1yVeQGiGHh8zDUuB5gPSaN4Pn9iwc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=UJJ+gLLgNe6ny914ZHdzpCyZ+1JbqGqiu1mGOc8NASTMmJjuWZF0D6NSnqU32NVzgfGCuwK1MuUeX9nHSWEjXn7evMzCiLfH/PMRGMoxy+iiLMSxOvIbCXPKstU2XBBivsUCheY0cqTP15yWQ0/BI0Gwq8SnXxT0r/uJOCBVlmY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=prCfQF4C; arc=none smtp.client-ip=209.85.216.49 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="prCfQF4C" Received: by mail-pj1-f49.google.com with SMTP id 98e67ed59e1d1-384422b05b5so151706a91.2 for ; Fri, 31 Jul 2026 08:49:34 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1785512974; x=1786117774; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=rtE+fcyTa/nEHTvbkkFzvfqX94g1NeErZWdBjlXHpz8=; b=prCfQF4Cw7OWxaJPDxrTn6vvTO0Q+IrSY4RYaRd497q8OHEB6yjpX9V5+VfokNmdRn 6VL5xeSXManjLzcvGl5bj0M++h5XQ1mQDI84NBxJJbsSRI/x9+1riBL5b6+gx4fSY89W FpqdSMKAekKD731M8KfNKwYdVPcEpNKDn2kBJh2A4TbXF8nZoJt/OEOAD7TrqVnZm7Y2 4YYLouBJZ+C0rHa+n77p1biRWxihsIMt/vTM2erran+o8+tUGx2E5c4PB24jLyE5ajNA K1BhEEQ5SxP80TDbGTyQ/a2rlI4O1X1MR7fK27/DAu6MDzQaZtw32G9yftsIc9/QIi9M /05w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1785512974; x=1786117774; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=rtE+fcyTa/nEHTvbkkFzvfqX94g1NeErZWdBjlXHpz8=; b=ONwrt21vqWfdlaPM0MjTS+slXHrEfNsgAZWIGv5ZjrR7EnS0PgCX6NTnPhi2g51INw 3BqxlKcxN9E/iDsLnDTZkdgKFCzVRxCOOojAlb8l80dK3HWeDPruoYaalOwLizlck+at BXW52upoUrkzjGHfl8OLGxqRBwEdydeC4+Wvj+4aafdJ3BLFqxgtIKYeY4vv3U8UtKrS 90K18XPj1la8PzyEFfMMXmDLEyYbYtEOLmdQjo9vIe7wJeYGOSgdarpD/UfkVV4+Nrj8 YMMXvYeIripk/7sC+Gy1bvDNN1H3H6inh4JEmrSeaYQahmDHTR8qH3BqD78dx0IKeWj0 mq6w== X-Forwarded-Encrypted: i=1; AHgh+RqVWixbjmQMQnJSF8deMM0rycXOH/5LRNeKpdll9MvCeqYeDv6xB7w/fHJjJNNNsqSjS7NXtEzif1aYlww=@vger.kernel.org X-Gm-Message-State: AOJu0YzVEmX5ySTRth2+9FX1B5NWXe/roz2SzjzK+6tdom73aSW4pQtv T0m4p3oSUMf6valfpRak8qGj0rMe00Qfc4EPUA2VkvVL9us2YtcQHpgFxsDwDM9qD5w= X-Gm-Gg: AR+sD11yXJX2kjDL2+qoFnSxFhfvCOdC2q/Tt1dhdabX43jvkMcHk5d5gtiotXRepP6 Cgl9SIW+yuV6dAs0gT0F00FWQ+6XpTpicZPOxxmSdr+Mmg4stq2jJ674x8vvrwfwOJdJ/mWt3nh /OL+GQ0joOCHqKPp1OK7t3+Uw7mxMdUgZy1EBVimMs6lLGtl5i2hqHSVOLlPVhy29GqSxiQrBxY g1upEKUV9yHZsZqMlZ9H/Rlw4ZjOfw7zUI3UP+2a1H9Rc/CQ+Fe4wu1MIy8rFPlscRyghqaz2qU JKS6JFFTkN7/iwqI5SpHbA4xwSgMkRK2+0TW7NSFrl6NS2Z63SuizUzb1mnsOXzOfOqm6ugWbEg aMQ0vVFjzXBHnUmJ5q9drHKqQAB/1NhS6cqmRFVhQ/DoVvjw/jHMvR9ROjKgdNJJAUfOqtkRDKy pMVkms5JRPOK/UqHCDmphQ6g0bjj2vbvwszjk5VNpBpiChXbWByeIJw8tQA1H98agefu50TxMQs KqDumzwHy7IzQ== X-Received: by 2002:a17:90b:3cce:b0:383:5a16:bd67 with SMTP id 98e67ed59e1d1-38fbc58abc2mr441543a91.4.1785512973970; Fri, 31 Jul 2026 08:49:33 -0700 (PDT) Received: from Potato.tail66a299.ts.net ([171.76.83.76]) by smtp.gmail.com with ESMTPSA id 5a478bee46e88-3153e045016sm11852510eec.19.2026.07.31.08.49.31 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 31 Jul 2026 08:49:33 -0700 (PDT) From: Shivesh X-Google-Original-From: Shivesh To: arend.vanspriel@broadcom.com Cc: linux-wireless@vger.kernel.org, brcm80211@lists.linux.dev, brcm80211-dev-list.pdl@broadcom.com, linux-kernel@vger.kernel.org, Shivesh Subject: [PATCH v3 8/8] wifi: brcmsmac: ampdu: clarify standard compliance on QoS change Date: Fri, 31 Jul 2026 15:48:40 +0000 Message-ID: <20260731154901.1822-9-shivesh@example.com> X-Mailer: git-send-email 2.53.0 In-Reply-To: <20260731154901.1822-1-shivesh@example.com> References: <20260731154901.1822-1-shivesh@example.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Shivesh Updates XXX comment to properly reference IEEE 802.11n requirements that all MPDUs in an A-MPDU must share the same TID. Signed-off-by: Shivesh --- .../net/wireless/broadcom/brcm80211/brcmsmac/ampdu.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/ampdu.c b/dri= vers/net/wireless/broadcom/brcm80211/brcmsmac/ampdu.c index fc7a5dd2e5d8..3fd8bdbd35e5 100644 --- a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/ampdu.c +++ b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/ampdu.c @@ -516,12 +516,11 @@ int brcms_c_ampdu_add_frame(struct brcms_ampdu_sessio= n *session, return -ENOSPC; =20 /* - * We aren't really out of space if the new frame is of - * a different priority, but we want the same behaviour - * so return -ENOSPC anyway. - * - * XXX: The old AMPDU code did this, but is it really - * necessary? + * IEEE 802.11n standard requires that all MPDUs within an + * A-MPDU belong to the same TID (Traffic Identifier). + * Since priority maps to TID, a different priority means + * we must close the current aggregate and start a new one, + * so we return -ENOSPC here. */ first =3D skb_peek(&session->skb_list); if (p->priority !=3D first->priority) --=20 2.53.0