]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
wifi: rtw89: add AMPDU to radiotap
authorPing-Ke Shih <pkshih@realtek.com>
Wed, 6 May 2026 13:09:47 +0000 (21:09 +0800)
committerPing-Ke Shih <pkshih@realtek.com>
Wed, 13 May 2026 03:30:43 +0000 (11:30 +0800)
The RX desc can report current frame is in AMPDU, but no way point out
if it is a last one in AMPDU. Update AMPDU reference only.

Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
Link: https://patch.msgid.link/20260506131000.1706298-2-pkshih@realtek.com
drivers/net/wireless/realtek/rtw89/core.c
drivers/net/wireless/realtek/rtw89/core.h

index b85728ceb63cea7cea600ab13eb692fa46854358..240502b25b2e3119ded2991922810a765aa643e1 100644 (file)
@@ -3568,6 +3568,7 @@ void rtw89_core_query_rxdesc(struct rtw89_dev *rtwdev,
        desc_info->hw_dec = le32_get_bits(rxd_s->dword3, AX_RXD_HW_DEC);
        desc_info->sw_dec = le32_get_bits(rxd_s->dword3, AX_RXD_SW_DEC);
        desc_info->addr1_match = le32_get_bits(rxd_s->dword3, AX_RXD_A1_MATCH);
+       desc_info->ampdu = le32_get_bits(rxd_s->dword3, AX_RXD_AMPDU);
 
        shift_len = desc_info->shift << 1; /* 2-byte unit */
        drv_info_len = desc_info->drv_info_size << 3; /* 8-byte unit */
@@ -3624,6 +3625,7 @@ void rtw89_core_query_rxdesc_v2(struct rtw89_dev *rtwdev,
        desc_info->hw_dec = le32_get_bits(rxd_s->dword3, BE_RXD_HW_DEC);
        desc_info->sw_dec = le32_get_bits(rxd_s->dword3, BE_RXD_SW_DEC);
        desc_info->addr1_match = le32_get_bits(rxd_s->dword3, BE_RXD_A1_MATCH);
+       desc_info->ampdu = le32_get_bits(rxd_s->dword3, BE_RXD_AMPDU);
 
        desc_info->bw = le32_get_bits(rxd_s->dword4, BE_RXD_BW_MASK);
        desc_info->data_rate = le32_get_bits(rxd_s->dword4, BE_RXD_RX_DATARATE_MASK);
@@ -3698,6 +3700,7 @@ void rtw89_core_query_rxdesc_v3(struct rtw89_dev *rtwdev,
        desc_info->hw_dec = le32_get_bits(rxd_s->dword3, BE_RXD_HW_DEC);
        desc_info->sw_dec = le32_get_bits(rxd_s->dword3, BE_RXD_SW_DEC);
        desc_info->addr1_match = le32_get_bits(rxd_s->dword3, BE_RXD_A1_MATCH);
+       desc_info->ampdu = le32_get_bits(rxd_s->dword3, BE_RXD_AMPDU);
 
        desc_info->bw = le32_get_bits(rxd_s->dword4, BE_RXD_BW_MASK);
        desc_info->data_rate = le32_get_bits(rxd_s->dword4, BE_RXD_RX_DATARATE_MASK);
@@ -3830,6 +3833,11 @@ static void rtw89_core_update_rx_status(struct rtw89_dev *rtwdev,
            !(desc_info->sw_dec || desc_info->icv_err))
                rx_status->flag |= RX_FLAG_DECRYPTED;
 
+       if (desc_info->ampdu) {
+               rx_status->flag |= RX_FLAG_AMPDU_DETAILS;
+               rx_status->ampdu_reference = desc_info->ppdu_cnt;
+       }
+
        rx_status->bw = rtw89_hw_to_rate_info_bw(desc_info->bw);
 
        data_rate = desc_info->data_rate;
index bccfee7535a7471d9fef38a747a9b3dc50c5aa1a..66dbb1fc3ca817271ff7055389c2c178ba338c4c 100644 (file)
@@ -1130,6 +1130,7 @@ struct rtw89_rx_desc_info {
        bool hw_dec;
        bool sw_dec;
        bool addr1_match;
+       bool ampdu;
        u8 frag;
        u16 seq;
        u8 frame_type;