| From 7051266c6596ce9f74b27fd7614764e59d909c5d Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Tue, 3 Jun 2025 12:05:12 +0530 |
| Subject: wifi: ath12k: Add memset and update default rate value in wmi tx |
| completion |
| |
| From: Sarika Sharma <quic_sarishar@quicinc.com> |
| |
| [ Upstream commit 9903c0986f782dfc511d7638b6f15fb6e8600cd3 ] |
| |
| When both AP/STA and monitor interfaces are enabled, ieee80211_tx_status() |
| is invoked from two paths: the TX completion handler for data frames |
| and the WMI TX completion handler for management frames. |
| In the data path, the skb->cb is properly zeroed using memset, but in |
| the WMI path, this step is missing. |
| |
| As a result, mac80211 encountered uninitialized (junk) values in |
| skb->cb when generating the radiotap header for monitor mode, leading |
| to invalid radiotap lengths. |
| |
| Hence, explicitly zero the status field in the skb->cb using memset |
| in WMI TX completion path to ensure consistent and correct behavior |
| during WMI tx completion path. |
| |
| Additionally, set info->status.rates[0].idx = -1 to indicate that |
| no valid rate information is available, avoiding misinterpretation of |
| garbage values. |
| |
| Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.4.1-00199-QCAHKSWPL_SILICONZ-1 |
| |
| Signed-off-by: Sarika Sharma <quic_sarishar@quicinc.com> |
| Reviewed-by: Vasanthakumar Thiagarajan <vasanthakumar.thiagarajan@oss.qualcomm.com> |
| Link: https://patch.msgid.link/20250603063512.1887652-1-quic_sarishar@quicinc.com |
| Signed-off-by: Jeff Johnson <jeff.johnson@oss.qualcomm.com> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/net/wireless/ath/ath12k/wmi.c | 5 +++++ |
| 1 file changed, 5 insertions(+) |
| |
| diff --git a/drivers/net/wireless/ath/ath12k/wmi.c b/drivers/net/wireless/ath/ath12k/wmi.c |
| index e918218ce2d6..7e400a0e0eb1 100644 |
| --- a/drivers/net/wireless/ath/ath12k/wmi.c |
| +++ b/drivers/net/wireless/ath/ath12k/wmi.c |
| @@ -4965,6 +4965,11 @@ static int wmi_process_mgmt_tx_comp(struct ath12k *ar, u32 desc_id, |
| dma_unmap_single(ar->ab->dev, skb_cb->paddr, msdu->len, DMA_TO_DEVICE); |
| |
| info = IEEE80211_SKB_CB(msdu); |
| + memset(&info->status, 0, sizeof(info->status)); |
| + |
| + /* skip tx rate update from ieee80211_status*/ |
| + info->status.rates[0].idx = -1; |
| + |
| if ((!(info->flags & IEEE80211_TX_CTL_NO_ACK)) && !status) |
| info->flags |= IEEE80211_TX_STAT_ACK; |
| |
| -- |
| 2.39.5 |
| |