mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-08-31 09:20:13 -04:00
wifi: mt76: mt7921: add ack signal support
This reports signal strength of ACK packets from the peer as measured at each interface. Reviewed-by: Ryder Lee <ryder.lee@mediatek.com> Signed-off-by: Deren Wu <deren.wu@mediatek.com> Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com> Signed-off-by: Felix Fietkau <nbd@nbd.name>
This commit is contained in:
@@ -120,6 +120,7 @@ mt7921_init_wiphy(struct ieee80211_hw *hw)
|
|||||||
wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_BEACON_RATE_HT);
|
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_VHT);
|
||||||
wiphy_ext_feature_set(wiphy, NL80211_EXT_FEATURE_BEACON_RATE_HE);
|
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, SINGLE_SCAN_ON_ALL_BANDS);
|
||||||
ieee80211_hw_set(hw, HAS_RATE_CONTROL);
|
ieee80211_hw_set(hw, HAS_RATE_CONTROL);
|
||||||
@@ -142,6 +143,8 @@ mt7921_init_wiphy(struct ieee80211_hw *hw)
|
|||||||
static void
|
static void
|
||||||
mt7921_mac_init_band(struct mt7921_dev *dev, u8 band)
|
mt7921_mac_init_band(struct mt7921_dev *dev, u8 band)
|
||||||
{
|
{
|
||||||
|
u32 mask, set;
|
||||||
|
|
||||||
mt76_rmw_field(dev, MT_TMAC_CTCR0(band),
|
mt76_rmw_field(dev, MT_TMAC_CTCR0(band),
|
||||||
MT_TMAC_CTCR0_INS_DDLMT_REFTIME, 0x3f);
|
MT_TMAC_CTCR0_INS_DDLMT_REFTIME, 0x3f);
|
||||||
mt76_set(dev, MT_TMAC_CTCR0(band),
|
mt76_set(dev, MT_TMAC_CTCR0(band),
|
||||||
@@ -158,6 +161,12 @@ mt7921_mac_init_band(struct mt7921_dev *dev, u8 band)
|
|||||||
mt76_rmw_field(dev, MT_DMA_DCR0(band), MT_DMA_DCR0_MAX_RX_LEN, 1536);
|
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 */
|
/* disable rx rate report by default due to hw issues */
|
||||||
mt76_clear(dev, MT_DMA_DCR0(band), MT_DMA_DCR0_RXD_G5_EN);
|
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)
|
u8 mt7921_check_offload_capability(struct device *dev, const char *fw_wm)
|
||||||
|
|||||||
@@ -59,6 +59,7 @@ void mt7921_mac_sta_poll(struct mt7921_dev *dev)
|
|||||||
u32 tx_time[IEEE80211_NUM_ACS], rx_time[IEEE80211_NUM_ACS];
|
u32 tx_time[IEEE80211_NUM_ACS], rx_time[IEEE80211_NUM_ACS];
|
||||||
LIST_HEAD(sta_poll_list);
|
LIST_HEAD(sta_poll_list);
|
||||||
struct rate_info *rate;
|
struct rate_info *rate;
|
||||||
|
s8 rssi[4];
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
spin_lock_bh(&dev->sta_poll_lock);
|
spin_lock_bh(&dev->sta_poll_lock);
|
||||||
@@ -160,6 +161,20 @@ void mt7921_mac_sta_poll(struct mt7921_dev *dev)
|
|||||||
else
|
else
|
||||||
rate->flags &= ~RATE_INFO_FLAGS_SHORT_GI;
|
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);
|
EXPORT_SYMBOL_GPL(mt7921_mac_sta_poll);
|
||||||
|
|||||||
@@ -855,6 +855,8 @@ void mt7921_mac_sta_assoc(struct mt76_dev *mdev, struct ieee80211_vif *vif,
|
|||||||
mt76_connac_mcu_uni_add_bss(&dev->mphy, vif, &mvif->sta.wcid,
|
mt76_connac_mcu_uni_add_bss(&dev->mphy, vif, &mvif->sta.wcid,
|
||||||
true, mvif->ctx);
|
true, mvif->ctx);
|
||||||
|
|
||||||
|
ewma_avg_signal_init(&msta->avg_ack_signal);
|
||||||
|
|
||||||
mt7921_mac_wtbl_update(dev, msta->wcid.idx,
|
mt7921_mac_wtbl_update(dev, msta->wcid.idx,
|
||||||
MT_WTBL_UPDATE_ADM_COUNT_CLEAR);
|
MT_WTBL_UPDATE_ADM_COUNT_CLEAR);
|
||||||
memset(msta->airtime_ac, 0, sizeof(msta->airtime_ac));
|
memset(msta->airtime_ac, 0, sizeof(msta->airtime_ac));
|
||||||
@@ -1425,6 +1427,12 @@ static void mt7921_sta_statistics(struct ieee80211_hw *hw,
|
|||||||
}
|
}
|
||||||
sinfo->txrate.flags = txrate->flags;
|
sinfo->txrate.flags = txrate->flags;
|
||||||
sinfo->filled |= BIT_ULL(NL80211_STA_INFO_TX_BITRATE);
|
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
|
#ifdef CONFIG_PM
|
||||||
|
|||||||
@@ -144,6 +144,8 @@ enum mt7921_rxq_id {
|
|||||||
MT7921_RXQ_MCU_WM = 0,
|
MT7921_RXQ_MCU_WM = 0,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
DECLARE_EWMA(avg_signal, 10, 8)
|
||||||
|
|
||||||
struct mt7921_sta {
|
struct mt7921_sta {
|
||||||
struct mt76_wcid wcid; /* must be first */
|
struct mt76_wcid wcid; /* must be first */
|
||||||
|
|
||||||
@@ -152,6 +154,9 @@ struct mt7921_sta {
|
|||||||
struct list_head poll_list;
|
struct list_head poll_list;
|
||||||
u32 airtime_ac[8];
|
u32 airtime_ac[8];
|
||||||
|
|
||||||
|
int ack_signal;
|
||||||
|
struct ewma_avg_signal avg_ack_signal;
|
||||||
|
|
||||||
unsigned long last_txs;
|
unsigned long last_txs;
|
||||||
unsigned long ampdu_state;
|
unsigned long ampdu_state;
|
||||||
|
|
||||||
|
|||||||
@@ -80,6 +80,14 @@
|
|||||||
#define MT_DMA_DCR0_MAX_RX_LEN GENMASK(15, 3)
|
#define MT_DMA_DCR0_MAX_RX_LEN GENMASK(15, 3)
|
||||||
#define MT_DMA_DCR0_RXD_G5_EN BIT(23)
|
#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) */
|
/* LPON: band 0(0x24200), band 1(0xa4200) */
|
||||||
#define MT_WF_LPON_BASE(_band) ((_band) ? 0x820fb000 : 0x820eb000)
|
#define MT_WF_LPON_BASE(_band) ((_band) ? 0x820fb000 : 0x820eb000)
|
||||||
#define MT_WF_LPON(_band, ofs) (MT_WF_LPON_BASE(_band) + (ofs))
|
#define MT_WF_LPON(_band, ofs) (MT_WF_LPON_BASE(_band) + (ofs))
|
||||||
|
|||||||
Reference in New Issue
Block a user