[PATCH v2] ath11k: fix peer resolution on rx path when peer_id=0
Matthew Leach <[email protected]>
| Newsgroups | org.infradead.lists.ath11k,org.kernel.vger.linux-kernel,org.kernel.vger.linux-wireless |
|---|---|
| Message-ID | <20260415-ath11k-null-peerid-workaround-v2-1-2abae3bbac16@collabora.com> |
It has been observed that on certain chipsets a peer can be assigned peer_id=0. For reception of standard MPDUs this is fine as ath11k_dp_rx_h_find_peer() has a fallback case where it locates the peer based upon the source mac address. However, on an aggregated link, reception of AMSDUs results in the peer not being resolved for the second (any any subsequent) sub-MSDUs due to the peer_id guard in ath11k_dp_rx_h_find_peer(). This causes the encryption type of the frame to be set to an incorrect value, resulting in the sub-MSDUs being dropped by ieee80211. ath11k_pci 0000:03:00.0: data rx skb 000000002f4b704d len 1534 peer xx:xx:xx:xx:xx:xx 0 ucast sn 3063 he160 rate_idx 9 vht_nss 2 freq 5240 band 1 flag 0x40d1a fcs-err 0 mic-err 0 amsdu-more 0 peer_id 0 first_msdu 1 last_msdu 0 ath11k_pci 0000:03:00.0: data rx skb 0000000038acd580 len 1534 peer (null) 0 ucast sn 3063 he160 rate_idx 9 vht_nss 2 freq 5240 band 1 flag 0x40d00 fcs-err 0 mic-err 0 amsdu-more 0 peer_id 0 first_msdu 0 last_msdu 1 This patch removes the null peer_id check in ath11k_dp_rx_h_find_peer(), allowing peer's with an assigned ID of 0 to be resolved. Signed-off-by: Matthew Leach <[email protected]> --- Changes in v2: - Since peer_id=0 is a valid condition on some chips, remove the guard that prevented the peer lookup. - Link to v1: https://patch.msgid.link/20260326-ath11k-null-peerid-workaround-v1-1-0c2fd53202f8@collabora.com To: Jeff Johnson <[email protected]> Cc: [email protected] Cc: [email protected] Cc: [email protected] --- drivers/net/wireless/ath/ath11k/dp_rx.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/drivers/net/wireless/ath/ath11k/dp_rx.c b/drivers/net/wireless/ath/ath11k/dp_rx.c index 49d959b2e148..ff2c78a4e5f3 100644 --- a/drivers/net/wireless/ath/ath11k/dp_rx.c +++ b/drivers/net/wireless/ath/ath11k/dp_rx.c @@ -2215,8 +2215,7 @@ ath11k_dp_rx_h_find_peer(struct ath11k_base *ab, struct sk_buff *msdu) lockdep_assert_held(&ab->base_lock); - if (rxcb->peer_id) - peer = ath11k_peer_find_by_id(ab, rxcb->peer_id); + peer = ath11k_peer_find_by_id(ab, rxcb->peer_id); if (peer) return peer; --- base-commit: f338e77383789c0cae23ca3d48adcc5e9e137e3c change-id: 20260326-ath11k-null-peerid-workaround-625a129781b1 Best regards, -- Matt