wifi: mt76: mt7925: Update secondary link PS flow
Update the power-saving flow for secondary links.
Fixes: 86c051f2c4 ("wifi: mt76: mt7925: enabling MLO when the firmware supports it")
Signed-off-by: Ming Yen Hsieh <mingyen.hsieh@mediatek.com>
Signed-off-by: Sean Wang <sean.wang@mediatek.com>
Link: https://patch.msgid.link/20241211011926.5002-13-sean.wang@kernel.org
Signed-off-by: Felix Fietkau <nbd@nbd.name>
This commit is contained in:
committed by
Felix Fietkau
parent
30b721467c
commit
8dafab9c41
@@ -1903,6 +1903,13 @@ static void mt7925_link_info_changed(struct ieee80211_hw *hw,
|
||||
if (changed & (BSS_CHANGED_QOS | BSS_CHANGED_BEACON_ENABLED))
|
||||
mt7925_mcu_set_tx(dev, info);
|
||||
|
||||
if (changed & BSS_CHANGED_BSSID) {
|
||||
if (ieee80211_vif_is_mld(vif) &&
|
||||
hweight16(mvif->valid_links) == 2)
|
||||
/* Indicate the secondary setup done */
|
||||
mt7925_mcu_uni_bss_bcnft(dev, info, true);
|
||||
}
|
||||
|
||||
mt792x_mutex_release(dev);
|
||||
}
|
||||
|
||||
|
||||
@@ -1362,7 +1362,7 @@ int mt7925_mcu_uni_bss_ps(struct mt792x_dev *dev,
|
||||
&ps_req, sizeof(ps_req), true);
|
||||
}
|
||||
|
||||
static int
|
||||
int
|
||||
mt7925_mcu_uni_bss_bcnft(struct mt792x_dev *dev,
|
||||
struct ieee80211_bss_conf *link_conf, bool enable)
|
||||
{
|
||||
@@ -1923,32 +1923,21 @@ int mt7925_mcu_set_beacon_filter(struct mt792x_dev *dev,
|
||||
{
|
||||
#define MT7925_FIF_BIT_CLR BIT(1)
|
||||
#define MT7925_FIF_BIT_SET BIT(0)
|
||||
struct mt792x_vif *mvif = (struct mt792x_vif *)vif->drv_priv;
|
||||
unsigned long valid = ieee80211_vif_is_mld(vif) ?
|
||||
mvif->valid_links : BIT(0);
|
||||
struct ieee80211_bss_conf *bss_conf;
|
||||
int err = 0;
|
||||
int i;
|
||||
|
||||
if (enable) {
|
||||
for_each_set_bit(i, &valid, IEEE80211_MLD_MAX_NUM_LINKS) {
|
||||
bss_conf = mt792x_vif_to_bss_conf(vif, i);
|
||||
err = mt7925_mcu_uni_bss_bcnft(dev, bss_conf, true);
|
||||
if (err < 0)
|
||||
return err;
|
||||
}
|
||||
err = mt7925_mcu_uni_bss_bcnft(dev, &vif->bss_conf, true);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
return mt7925_mcu_set_rxfilter(dev, 0,
|
||||
MT7925_FIF_BIT_SET,
|
||||
MT_WF_RFCR_DROP_OTHER_BEACON);
|
||||
}
|
||||
|
||||
for_each_set_bit(i, &valid, IEEE80211_MLD_MAX_NUM_LINKS) {
|
||||
bss_conf = mt792x_vif_to_bss_conf(vif, i);
|
||||
err = mt7925_mcu_set_bss_pm(dev, bss_conf, false);
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
err = mt7925_mcu_set_bss_pm(dev, &vif->bss_conf, false);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
return mt7925_mcu_set_rxfilter(dev, 0,
|
||||
MT7925_FIF_BIT_CLR,
|
||||
|
||||
@@ -643,4 +643,7 @@ int mt7925_mcu_set_chctx(struct mt76_phy *phy, struct mt76_vif *mvif,
|
||||
int mt7925_mcu_set_rate_txpower(struct mt76_phy *phy);
|
||||
int mt7925_mcu_update_arp_filter(struct mt76_dev *dev,
|
||||
struct ieee80211_bss_conf *link_conf);
|
||||
int
|
||||
mt7925_mcu_uni_bss_bcnft(struct mt792x_dev *dev,
|
||||
struct ieee80211_bss_conf *link_conf, bool enable);
|
||||
#endif
|
||||
|
||||
@@ -243,6 +243,7 @@ static inline struct mt792x_bss_conf *
|
||||
mt792x_vif_to_link(struct mt792x_vif *mvif, u8 link_id)
|
||||
{
|
||||
struct ieee80211_vif *vif;
|
||||
struct mt792x_bss_conf *bss_conf;
|
||||
|
||||
vif = container_of((void *)mvif, struct ieee80211_vif, drv_priv);
|
||||
|
||||
@@ -250,8 +251,10 @@ mt792x_vif_to_link(struct mt792x_vif *mvif, u8 link_id)
|
||||
link_id >= IEEE80211_LINK_UNSPECIFIED)
|
||||
return &mvif->bss_conf;
|
||||
|
||||
return rcu_dereference_protected(mvif->link_conf[link_id],
|
||||
lockdep_is_held(&mvif->phy->dev->mt76.mutex));
|
||||
bss_conf = rcu_dereference_protected(mvif->link_conf[link_id],
|
||||
lockdep_is_held(&mvif->phy->dev->mt76.mutex));
|
||||
|
||||
return bss_conf ? bss_conf : &mvif->bss_conf;
|
||||
}
|
||||
|
||||
static inline struct mt792x_link_sta *
|
||||
|
||||
Reference in New Issue
Block a user