properly configure rcpi for mt7921 devices
Subsystems (2)
Lorenzo Bianconi
maintainercover properly configure rcpi for mt7921 devices
Set rcpi based on association process rssi for mt7921 devices since it is used by rate controller embedded into the fw to initialize amsdu size.
Lorenzo Bianconi (2):
mt76: connac: introcuce mt76_sta_cmd_info data structure
mt76: mt7921: properly configure rcpi adding a sta to the fw
.../net/wireless/mediatek/mt76/mt7615/mcu.c | 13 ++++--- .../wireless/mediatek/mt76/mt76_connac_mcu.c | 35 ++++++++++--------- .../wireless/mediatek/mt76/mt76_connac_mcu.h | 19 +++++++--- .../net/wireless/mediatek/mt76/mt7921/mac.c | 35 +++++++++++++++++-- .../net/wireless/mediatek/mt76/mt7921/main.c | 31 ++++++++++++---- .../wireless/mediatek/mt76/mt7921/mt7921.h | 7 ++++ 6 files changed, 105 insertions(+), 35 deletions(-)
Signature · 1 line
2.30.2
Lorenzo Bianconi
maintainerPATCH 1/2 mt76: connac: introduce mt76_sta_cmd_info data structure
Introduce mt76_sta_cmd_info data structure to contain parameters passed to mt76_sta_cmd_info routine. This is preliminary patch to properly configure rcpi for mt7921 devices.
--- .../net/wireless/mediatek/mt76/mt7615/mcu.c | 13 ++++--- .../wireless/mediatek/mt76/mt76_connac_mcu.c | 35 ++++++++++--------- .../wireless/mediatek/mt76/mt76_connac_mcu.h | 19 +++++++--- .../net/wireless/mediatek/mt76/mt7921/main.c | 19 +++++++--- 4 files changed, 56 insertions(+), 30 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7615/mcu.c +9 -4
@@ -979,7 +979,7 @@ mt7615_mcu_wtbl_sta_add(struct mt7615_phy *phy, struct ieee80211_vif *vif,mt76_connac_mcu_sta_basic_tlv (sskb, vif, sta, enable);if (enable && sta) -mt76_connac_mcu_sta_tlv (phy->mt76, sskb, sta, vif); +mt76_connac_mcu_sta_tlv (phy->mt76, sskb, sta, vif,0 ); wtbl_hdr = mt76_connac_mcu_alloc_wtbl_req(&dev->mt76, &msta->wcid, WTBL_RESET_AND_SET, NULL,
@@ -1077,10 +1077,15 @@ __mt7615_mcu_add_sta(struct mt76_phy *phy, struct ieee80211_vif *vif, struct ieee80211_sta *sta, bool enable, int cmd) { struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv; -struct mt76_wcid *wcid; +struct mt76_sta_cmd_info info = { + .sta = sta, + .vif = vif, + .enable = enable, + .cmd = cmd, + }; - wcid = sta ? (struct mt76_wcid *)sta->drv_priv : &mvif->sta.wcid; -return mt76_connac_mcu_add_sta_cmd (phy, vif, sta, wcid, enable, cmd); + info.wcid = sta ? (struct mt76_wcid *)sta->drv_priv : &mvif->sta.wcid; +return mt76_connac_mcu_add_sta_cmd (phy, &info); } static int
drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.c +18 -17
@@ -674,7 +674,8 @@ mt76_connac_get_phy_mode_v2(struct mt76_phy *mphy, struct ieee80211_vif *vif,void mt76_connac_mcu_sta_tlv (struct mt76_phy *mphy,struct sk_buff *skb,struct ieee80211_sta *sta, -struct ieee80211_vif *vif) +struct ieee80211_vif *vif, +u8 rcpi) {struct cfg80211_chan_def *chandef = &mphy->chandef;enum nl80211_band band = chandef->chan->band;
@@ -723,6 +724,7 @@ void mt76_connac_mcu_sta_tlv(struct mt76_phy *mphy, struct sk_buff *skb, phy = (struct sta_rec_phy *)tlv; phy->phy_type =mt76_connac_get_phy_mode_v2 (mphy, vif, band, sta); phy->basic_rate =cpu_to_le16 ((u16 )vif->bss_conf.basic_rates); + phy->rcpi = rcpi; tlv =mt76_connac_mcu_add_tlv (skb,STA_REC_RA ,sizeof (*ra_info)); ra_info = (struct sta_rec_ra_info *)tlv;
@@ -827,43 +829,42 @@ void mt76_connac_mcu_wtbl_ht_tlv(struct mt76_dev *dev, struct sk_buff *skb,EXPORT_SYMBOL_GPL (mt76_connac_mcu_wtbl_ht_tlv);int mt76_connac_mcu_add_sta_cmd (struct mt76_phy *phy, -struct ieee80211_vif *vif, -struct ieee80211_sta *sta, -struct mt76_wcid *wcid, -bool enable,int cmd) +struct mt76_sta_cmd_info *info) { -struct mt76_vif *mvif = (struct mt76_vif *)vif->drv_priv; +struct mt76_vif *mvif = (struct mt76_vif *)info->vif->drv_priv;struct mt76_dev *dev = phy->dev;struct wtbl_req_hdr *wtbl_hdr;struct tlv *sta_wtbl;struct sk_buff *skb; - skb =mt76_connac_mcu_alloc_sta_req (dev, mvif, wcid); + skb =mt76_connac_mcu_alloc_sta_req (dev, mvif, info->wcid);if (IS_ERR (skb))return PTR_ERR (skb); -mt76_connac_mcu_sta_basic_tlv (skb, vif, sta, enable); -if (enable && sta) -mt76_connac_mcu_sta_tlv (phy, skb, sta, vif); +mt76_connac_mcu_sta_basic_tlv (skb, info->vif, info->sta, info->enable); +if (info->enable && info->sta) +mt76_connac_mcu_sta_tlv (phy, skb, info->sta, info->vif, + info->rcpi); sta_wtbl =mt76_connac_mcu_add_tlv (skb,STA_REC_WTBL ,sizeof (struct tlv )); - wtbl_hdr =mt76_connac_mcu_alloc_wtbl_req (dev, wcid, + wtbl_hdr =mt76_connac_mcu_alloc_wtbl_req (dev, info->wcid,WTBL_RESET_AND_SET , sta_wtbl, &skb);if (IS_ERR (wtbl_hdr))return PTR_ERR (wtbl_hdr); -if (enable) { -mt76_connac_mcu_wtbl_generic_tlv (dev, skb, vif, sta, sta_wtbl, +if (info->enable) { +mt76_connac_mcu_wtbl_generic_tlv (dev, skb, info->vif, + info->sta, sta_wtbl, wtbl_hdr); -if (sta) -mt76_connac_mcu_wtbl_ht_tlv (dev, skb, sta, sta_wtbl, - wtbl_hdr); +if (info->sta) +mt76_connac_mcu_wtbl_ht_tlv (dev, skb, info->sta, + sta_wtbl, wtbl_hdr); } -return mt76_mcu_skb_send_msg (dev, skb, cmd, true); +return mt76_mcu_skb_send_msg (dev, skb, info->cmd, true); }EXPORT_SYMBOL_GPL (mt76_connac_mcu_add_sta_cmd);
drivers/net/wireless/mediatek/mt76/mt76_connac_mcu.h +14 -5
@@ -953,6 +953,17 @@ struct mt76_connac_tx_power_limit_tlv {u8 pad2[32 ]; } __packed; +struct mt76_sta_cmd_info { +struct ieee80211_sta *sta; +struct mt76_wcid *wcid; + +struct ieee80211_vif *vif; + +bool enable; +int cmd; +u8 rcpi; +}; +#define to_wcid_lo (id) FIELD_GET(GENMASK(7, 0), (u16)id)#define to_wcid_hi (id) FIELD_GET(GENMASK(9, 8), (u16)id)
@@ -1000,7 +1011,8 @@ void mt76_connac_mcu_wtbl_hdr_trans_tlv(struct sk_buff *skb, void *sta_wtbl, void *wtbl_tlv);void mt76_connac_mcu_sta_tlv (struct mt76_phy *mphy,struct sk_buff *skb,struct ieee80211_sta *sta, -struct ieee80211_vif *vif); +struct ieee80211_vif *vif, +u8 rcpi);void mt76_connac_mcu_wtbl_ht_tlv (struct mt76_dev *dev,struct sk_buff *skb,struct ieee80211_sta *sta,void *sta_wtbl,void *wtbl_tlv);
@@ -1023,10 +1035,7 @@ int mt76_connac_mcu_uni_add_bss(struct mt76_phy *phy,struct mt76_wcid *wcid, bool enable);int mt76_connac_mcu_add_sta_cmd (struct mt76_phy *phy, -struct ieee80211_vif *vif, -struct ieee80211_sta *sta, -struct mt76_wcid *wcid, -bool enable,int cmd); +struct mt76_sta_cmd_info *info);void mt76_connac_mcu_beacon_loss_iter (void *priv,u8 *mac,struct ieee80211_vif *vif);int mt76_connac_mcu_set_rts_thresh (struct mt76_dev *dev,u32 val,u8 band);
drivers/net/wireless/mediatek/mt76/mt7921/main.c +15 -4
@@ -634,6 +634,13 @@ int mt7921_mac_sta_add(struct mt76_dev *mdev, struct ieee80211_vif *vif, struct mt7921_dev *dev = container_of(mdev, struct mt7921_dev, mt76);struct mt7921_sta *msta = (struct mt7921_sta *)sta->drv_priv;struct mt7921_vif *mvif = (struct mt7921_vif *)vif->drv_priv; +struct mt76_sta_cmd_info info = { + .sta = sta, + .vif = vif, + .enable = true, + .cmd =MCU_UNI_CMD_STA_REC_UPDATE , + .wcid = &msta->wcid, + };int ret, idx; idx =mt76_wcid_alloc (dev->mt76.wcid_mask,MT7921_WTBL_STA -1 );
@@ -660,8 +667,7 @@ int mt7921_mac_sta_add(struct mt76_dev *mdev, struct ieee80211_vif *vif,mt7921_mac_wtbl_update (dev, idx,MT_WTBL_UPDATE_ADM_COUNT_CLEAR ); - ret =mt76_connac_mcu_add_sta_cmd (&dev->mphy, vif, sta, &msta->wcid, - true,MCU_UNI_CMD_STA_REC_UPDATE ); + ret =mt76_connac_mcu_add_sta_cmd (&dev->mphy, &info);if (ret)return ret;
@@ -675,12 +681,17 @@ void mt7921_mac_sta_remove(struct mt76_dev *mdev, struct ieee80211_vif *vif, { struct mt7921_dev *dev = container_of(mdev, struct mt7921_dev, mt76);struct mt7921_sta *msta = (struct mt7921_sta *)sta->drv_priv; +struct mt76_sta_cmd_info info = { + .sta = sta, + .vif = vif, + .cmd =MCU_UNI_CMD_STA_REC_UPDATE , + .wcid = &msta->wcid, + };mt76_connac_free_pending_tx_skbs (&dev->pm, &msta->wcid);mt76_connac_pm_wake (&dev->mphy, &dev->pm); -mt76_connac_mcu_add_sta_cmd (&dev->mphy, vif, sta, &msta->wcid, false, -MCU_UNI_CMD_STA_REC_UPDATE ); +mt76_connac_mcu_add_sta_cmd (&dev->mphy, &info);mt7921_mac_wtbl_update (dev, msta->wcid.idx,MT_WTBL_UPDATE_ADM_COUNT_CLEAR );
Signature · 1 line
2.30.2
Lorenzo Bianconi
maintainerPATCH 2/2 mt76: mt7921: properly configure rcpi adding a sta to the fw
In reply to Lorenzo BianconiProperly configure rcpi based on association process rssi. rcpi is used by rate controller embedded into the fw to initialize amsdu size.
--- .../net/wireless/mediatek/mt76/mt7921/mac.c | 35 +++++++++++++++++-- .../net/wireless/mediatek/mt76/mt7921/main.c | 12 +++++-- .../wireless/mediatek/mt76/mt7921/mt7921.h | 7 ++++ 3 files changed, 49 insertions(+), 5 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7921/mac.c +33 -2
@@ -9,8 +9,6 @@#include "mac.h" #include "mcu.h" -#define to_rssi (field, rxv) ((FIELD_GET(field, rxv) - 220) / 2) -#define HE_BITS (f) cpu_to_le16(IEEE80211_RADIOTAP_HE_##f)#define HE_PREP (f, m, v) le16_encode_bits(le32_get_bits(v, MT_CRXV_HE_##m),\ IEEE80211_RADIOTAP_HE_##f)
@@ -285,6 +283,37 @@ mt7921_get_status_freq_info(struct mt7921_dev *dev, struct mt76_phy *mphy, status->freq =ieee80211_channel_to_frequency (chfreq, status->band); } +static void +mt7921_mac_rssi_iter (void *priv,u8 *mac,struct ieee80211_vif *vif) +{ +struct sk_buff *skb = priv; +struct mt76_rx_status *status = (struct mt76_rx_status *)skb->cb; +struct mt7921_vif *mvif = (struct mt7921_vif *)vif->drv_priv; +struct ieee80211_hdr *hdr =mt76_skb_get_hdr (skb); + +if (status->signal >0 ) +return ; + +if (!ether_addr_equal (vif->addr, hdr->addr1)) +return ; + +ewma_rssi_add (&mvif->rssi, -status->signal); +} + +static void +mt7921_mac_assoc_rssi (struct mt7921_dev *dev,struct sk_buff *skb) +{ +struct ieee80211_hdr *hdr =mt76_skb_get_hdr (skb); + +if (!ieee80211_is_assoc_resp (hdr->frame_control) && + !ieee80211_is_auth (hdr->frame_control)) +return ; + +ieee80211_iterate_active_interfaces_atomic (mt76_hw (dev), +IEEE80211_IFACE_ITER_RESUME_ALL , + mt7921_mac_rssi_iter, skb); +} +int mt7921_mac_fill_rx (struct mt7921_dev *dev,struct sk_buff *skb) {struct mt76_rx_status *status = (struct mt76_rx_status *)skb->cb;
@@ -522,6 +551,8 @@ int mt7921_mac_fill_rx(struct mt7921_dev *dev, struct sk_buff *skb)mt76_insert_ccmp_hdr (skb, key_id); } +mt7921_mac_assoc_rssi (dev, skb); +if (rxv && status->flag &RX_FLAG_RADIOTAP_HE )mt7921_mac_decode_he_radiotap (skb, status, rxv, mode);
drivers/net/wireless/mediatek/mt76/mt7921/main.c +9 -3
@@ -328,6 +328,8 @@ static int mt7921_add_interface(struct ieee80211_hw *hw,mt7921_mac_wtbl_update (dev, idx,MT_WTBL_UPDATE_ADM_COUNT_CLEAR ); +ewma_rssi_init (&mvif->rssi); +rcu_assign_pointer (dev->mt76.wcid[idx], &mvif->sta.wcid);if (vif->txq) { mtxq = (struct mt76_txq *)vif->txq->drv_priv;
@@ -634,12 +636,14 @@ int mt7921_mac_sta_add(struct mt76_dev *mdev, struct ieee80211_vif *vif, struct mt7921_dev *dev = container_of(mdev, struct mt7921_dev, mt76);struct mt7921_sta *msta = (struct mt7921_sta *)sta->drv_priv;struct mt7921_vif *mvif = (struct mt7921_vif *)vif->drv_priv; +int rssi = -ewma_rssi_read (&mvif->rssi);struct mt76_sta_cmd_info info = { .sta = sta, .vif = vif, .enable = true, .cmd =MCU_UNI_CMD_STA_REC_UPDATE , .wcid = &msta->wcid, + .rcpi =to_rcpi (rssi), };int ret, idx;
@@ -696,11 +700,13 @@ void mt7921_mac_sta_remove(struct mt76_dev *mdev, struct ieee80211_vif *vif,mt7921_mac_wtbl_update (dev, msta->wcid.idx,MT_WTBL_UPDATE_ADM_COUNT_CLEAR ); -if (vif->type ==NL80211_IFTYPE_STATION && !sta->tdls) { +if (vif->type ==NL80211_IFTYPE_STATION ) {struct mt7921_vif *mvif = (struct mt7921_vif *)vif->drv_priv; -mt76_connac_mcu_uni_add_bss (&dev->mphy, vif, &mvif->sta.wcid, - false); +ewma_rssi_init (&mvif->rssi); +if (!sta->tdls) +mt76_connac_mcu_uni_add_bss (&dev->mphy, vif, + &mvif->sta.wcid, false); }spin_lock_bh (&dev->sta_poll_lock);
drivers/net/wireless/mediatek/mt76/mt7921/mt7921.h +7 -0
@@ -46,6 +46,9 @@#define MT7921_SKU_MAX_DELTA_IDX MT7921_SKU_RATE_NUM#define MT7921_SKU_TABLE_SIZE (MT7921_SKU_RATE_NUM + 1) +#define to_rssi (field, rxv) ((FIELD_GET(field, rxv) - 220) / 2) +#define to_rcpi (rssi) (2 * (rssi) + 220) +struct mt7921_vif ;struct mt7921_sta ;
@@ -92,12 +95,16 @@ struct mt7921_sta {struct mt7921_sta_key_conf bip; }; +DECLARE_EWMA (rssi,10 ,8 ); +struct mt7921_vif {struct mt76_vif mt76;/* must be first */ struct mt7921_sta sta;struct mt7921_phy *phy; +struct ewma_rssi rssi; +struct ieee80211_tx_queue_params queue_params[IEEE80211_NUM_ACS ]; };
Signature · 1 line
2.30.2