wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_BEACON_RATE_HT);
        wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_BEACON_RATE_VHT);
        wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_BEACON_RATE_HE);
+       wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_ACK_SIGNAL_SUPPORT);
 
        ieee80211_hw_set(hw, SINGLE_SCAN_ON_ALL_BANDS);
        ieee80211_hw_set(hw, HAS_RATE_CONTROL);
 static void
 mt7921_mac_init_band(struct mt7921_dev *dev, u8 band)
 {
+       u32 mask, set;
+
        mt76_rmw_field(dev, MT_TMAC_CTCR0(band),
                       MT_TMAC_CTCR0_INS_DDLMT_REFTIME, 0x3f);
        mt76_set(dev, MT_TMAC_CTCR0(band),
        mt76_rmw_field(dev, MT_DMA_DCR0(band), MT_DMA_DCR0_MAX_RX_LEN, 1536);
        /* disable rx rate report by default due to hw issues */
        mt76_clear(dev, MT_DMA_DCR0(band), MT_DMA_DCR0_RXD_G5_EN);
+
+       /* filter out non-resp frames and get instantaneous signal reporting */
+       mask = MT_WTBLOFF_TOP_RSCR_RCPI_MODE | MT_WTBLOFF_TOP_RSCR_RCPI_PARAM;
+       set = FIELD_PREP(MT_WTBLOFF_TOP_RSCR_RCPI_MODE, 0) |
+             FIELD_PREP(MT_WTBLOFF_TOP_RSCR_RCPI_PARAM, 0x3);
+       mt76_rmw(dev, MT_WTBLOFF_TOP_RSCR(band), mask, set);
 }
 
 u8 mt7921_check_offload_capability(struct device *dev, const char *fw_wm)
 
        u32 tx_time[IEEE80211_NUM_ACS], rx_time[IEEE80211_NUM_ACS];
        LIST_HEAD(sta_poll_list);
        struct rate_info *rate;
+       s8 rssi[4];
        int i;
 
        spin_lock_bh(&dev->sta_poll_lock);
                        else
                                rate->flags &= ~RATE_INFO_FLAGS_SHORT_GI;
                }
+
+               /* get signal strength of resp frames (CTS/BA/ACK) */
+               addr = mt7921_mac_wtbl_lmac_addr(idx, 30);
+               val = mt76_rr(dev, addr);
+
+               rssi[0] = to_rssi(GENMASK(7, 0), val);
+               rssi[1] = to_rssi(GENMASK(15, 8), val);
+               rssi[2] = to_rssi(GENMASK(23, 16), val);
+               rssi[3] = to_rssi(GENMASK(31, 14), val);
+
+               msta->ack_signal =
+                       mt76_rx_signal(msta->vif->phy->mt76->antenna_mask, rssi);
+
+               ewma_avg_signal_add(&msta->avg_ack_signal, -msta->ack_signal);
        }
 }
 EXPORT_SYMBOL_GPL(mt7921_mac_sta_poll);
 
                mt76_connac_mcu_uni_add_bss(&dev->mphy, vif, &mvif->sta.wcid,
                                            true, mvif->ctx);
 
+       ewma_avg_signal_init(&msta->avg_ack_signal);
+
        mt7921_mac_wtbl_update(dev, msta->wcid.idx,
                               MT_WTBL_UPDATE_ADM_COUNT_CLEAR);
        memset(msta->airtime_ac, 0, sizeof(msta->airtime_ac));
        }
        sinfo->txrate.flags = txrate->flags;
        sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BITRATE);
+
+       sinfo->ack_signal = (s8)msta->ack_signal;
+       sinfo->filled |= BIT_ULL(NL80211_STA_INFO_ACK_SIGNAL);
+
+       sinfo->avg_ack_signal = -(s8)ewma_avg_signal_read(&msta->avg_ack_signal);
+       sinfo->filled |= BIT_ULL(NL80211_STA_INFO_ACK_SIGNAL_AVG);
 }
 
 #ifdef CONFIG_PM
 
        MT7921_RXQ_MCU_WM = 0,
 };
 
+DECLARE_EWMA(avg_signal, 10, 8)
+
 struct mt7921_sta {
        struct mt76_wcid wcid; /* must be first */
 
        struct list_head poll_list;
        u32 airtime_ac[8];
 
+       int ack_signal;
+       struct ewma_avg_signal avg_ack_signal;
+
        unsigned long last_txs;
        unsigned long ampdu_state;
 
 
 #define MT_DMA_DCR0_MAX_RX_LEN         GENMASK(15, 3)
 #define MT_DMA_DCR0_RXD_G5_EN          BIT(23)
 
+/* WTBLOFF TOP: band 0(0x820e9000),band 1(0x820f9000) */
+#define MT_WTBLOFF_TOP_BASE(_band)     ((_band) ? 0x820f9000 : 0x820e9000)
+#define MT_WTBLOFF_TOP(_band, ofs)     (MT_WTBLOFF_TOP_BASE(_band) + (ofs))
+
+#define MT_WTBLOFF_TOP_RSCR(_band)     MT_WTBLOFF_TOP(_band, 0x008)
+#define MT_WTBLOFF_TOP_RSCR_RCPI_MODE  GENMASK(31, 30)
+#define MT_WTBLOFF_TOP_RSCR_RCPI_PARAM GENMASK(25, 24)
+
 /* LPON: band 0(0x24200), band 1(0xa4200) */
 #define MT_WF_LPON_BASE(_band)         ((_band) ? 0x820fb000 : 0x820eb000)
 #define MT_WF_LPON(_band, ofs)         (MT_WF_LPON_BASE(_band) + (ofs))