mirror of
https://github.com/torvalds/linux.git
synced 2026-06-04 20:46:48 +02:00
wifi: mt76: mt7925: add link handling in mt7925_mac_sta_assoc
add links handling in mt7925_mac_sta_assoc Co-developed-by: Ming Yen Hsieh <mingyen.hsieh@mediatek.com> Signed-off-by: Ming Yen Hsieh <mingyen.hsieh@mediatek.com> Co-developed-by: Deren Wu <deren.wu@mediatek.com> Signed-off-by: Deren Wu <deren.wu@mediatek.com> Signed-off-by: Sean Wang <sean.wang@mediatek.com> Link: https://patch.msgid.link/0ddf1834783b111d626b05d298478f520d7c0caa.1720248331.git.sean.wang@kernel.org Signed-off-by: Felix Fietkau <nbd@nbd.name>
This commit is contained in:
parent
44eb173bdd
commit
9f89f05bef
|
|
@ -387,6 +387,7 @@ mt7925_add_interface(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
|
|||
mvif->phy = phy;
|
||||
mvif->bss_conf.vif = mvif;
|
||||
mvif->sta.vif = mvif;
|
||||
mvif->deflink_id = IEEE80211_LINK_UNSPECIFIED;
|
||||
|
||||
ret = mt7925_mac_link_bss_add(dev, &vif->bss_conf, &mvif->sta.deflink);
|
||||
if (ret < 0)
|
||||
|
|
@ -923,6 +924,89 @@ int mt7925_mac_sta_add(struct mt76_dev *mdev, struct ieee80211_vif *vif,
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(mt7925_mac_sta_add);
|
||||
|
||||
static u16
|
||||
mt7925_mac_select_links(struct mt76_dev *mdev, struct ieee80211_vif *vif)
|
||||
{
|
||||
unsigned long usable_links = ieee80211_vif_usable_links(vif);
|
||||
struct {
|
||||
u8 link_id;
|
||||
enum nl80211_band band;
|
||||
} data[IEEE80211_MLD_MAX_NUM_LINKS];
|
||||
u8 link_id, i, j, n_data = 0;
|
||||
u16 sel_links = 0;
|
||||
|
||||
if (!ieee80211_vif_is_mld(vif))
|
||||
return 0;
|
||||
|
||||
if (vif->active_links == usable_links)
|
||||
return vif->active_links;
|
||||
|
||||
rcu_read_lock();
|
||||
for_each_set_bit(link_id, &usable_links, IEEE80211_MLD_MAX_NUM_LINKS) {
|
||||
struct ieee80211_bss_conf *link_conf =
|
||||
rcu_dereference(vif->link_conf[link_id]);
|
||||
|
||||
if (WARN_ON_ONCE(!link_conf))
|
||||
continue;
|
||||
|
||||
data[n_data].link_id = link_id;
|
||||
data[n_data].band = link_conf->chanreq.oper.chan->band;
|
||||
n_data++;
|
||||
}
|
||||
rcu_read_unlock();
|
||||
|
||||
for (i = 0; i < n_data; i++) {
|
||||
if (!(BIT(data[i].link_id) & vif->active_links))
|
||||
continue;
|
||||
|
||||
sel_links = BIT(data[i].link_id);
|
||||
|
||||
for (j = 0; j < n_data; j++) {
|
||||
if (data[i].band != data[j].band) {
|
||||
sel_links |= BIT(data[j].link_id);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
return sel_links;
|
||||
}
|
||||
|
||||
static void
|
||||
mt7925_mac_set_links(struct mt76_dev *mdev, struct ieee80211_vif *vif)
|
||||
{
|
||||
struct mt792x_dev *dev = container_of(mdev, struct mt792x_dev, mt76);
|
||||
struct mt792x_vif *mvif = (struct mt792x_vif *)vif->drv_priv;
|
||||
struct ieee80211_bss_conf *link_conf =
|
||||
mt792x_vif_to_bss_conf(vif, mvif->deflink_id);
|
||||
struct cfg80211_chan_def *chandef = &link_conf->chanreq.oper;
|
||||
enum nl80211_band band = chandef->chan->band, secondary_band;
|
||||
|
||||
u16 sel_links = mt7925_mac_select_links(mdev, vif);
|
||||
u8 secondary_link_id = __ffs(~BIT(mvif->deflink_id) & sel_links);
|
||||
|
||||
if (!ieee80211_vif_is_mld(vif) || hweight16(sel_links) < 2)
|
||||
return;
|
||||
|
||||
link_conf = mt792x_vif_to_bss_conf(vif, secondary_link_id);
|
||||
secondary_band = link_conf->chanreq.oper.chan->band;
|
||||
|
||||
if (band == NL80211_BAND_2GHZ ||
|
||||
(band == NL80211_BAND_5GHZ && secondary_band == NL80211_BAND_6GHZ)) {
|
||||
mt7925_abort_roc(mvif->phy, &mvif->bss_conf);
|
||||
|
||||
mt792x_mutex_acquire(dev);
|
||||
|
||||
mt7925_set_mlo_roc(mvif->phy, &mvif->bss_conf, sel_links);
|
||||
|
||||
mt792x_mutex_release(dev);
|
||||
}
|
||||
|
||||
ieee80211_set_active_links_async(vif, sel_links);
|
||||
}
|
||||
|
||||
static void mt7925_mac_link_sta_assoc(struct mt76_dev *mdev,
|
||||
struct ieee80211_vif *vif,
|
||||
struct ieee80211_link_sta *link_sta)
|
||||
|
|
@ -937,7 +1021,11 @@ static void mt7925_mac_link_sta_assoc(struct mt76_dev *mdev,
|
|||
|
||||
mt792x_mutex_acquire(dev);
|
||||
|
||||
link_conf = mt792x_vif_to_bss_conf(vif, vif->bss_conf.link_id);
|
||||
if (ieee80211_vif_is_mld(vif)) {
|
||||
link_conf = mt792x_vif_to_bss_conf(vif, msta->deflink_id);
|
||||
} else {
|
||||
link_conf = mt792x_vif_to_bss_conf(vif, vif->bss_conf.link_id);
|
||||
}
|
||||
|
||||
if (vif->type == NL80211_IFTYPE_STATION && !link_sta->sta->tdls) {
|
||||
struct mt792x_bss_conf *mconf;
|
||||
|
|
@ -961,7 +1049,18 @@ static void mt7925_mac_link_sta_assoc(struct mt76_dev *mdev,
|
|||
void mt7925_mac_sta_assoc(struct mt76_dev *mdev, struct ieee80211_vif *vif,
|
||||
struct ieee80211_sta *sta)
|
||||
{
|
||||
mt7925_mac_link_sta_assoc(mdev, vif, &sta->deflink);
|
||||
if (ieee80211_vif_is_mld(vif)) {
|
||||
struct mt792x_sta *msta = (struct mt792x_sta *)sta->drv_priv;
|
||||
struct ieee80211_link_sta *link_sta;
|
||||
|
||||
link_sta = mt792x_sta_to_link_sta(vif, sta, msta->deflink_id);
|
||||
|
||||
mt7925_mac_set_links(mdev, vif);
|
||||
|
||||
mt7925_mac_link_sta_assoc(mdev, vif, link_sta);
|
||||
} else {
|
||||
mt7925_mac_link_sta_assoc(mdev, vif, &sta->deflink);
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(mt7925_mac_sta_assoc);
|
||||
|
||||
|
|
@ -1753,6 +1852,7 @@ mt7925_change_vif_links(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
|
|||
|
||||
for_each_set_bit(link_id, &add, IEEE80211_MLD_MAX_NUM_LINKS) {
|
||||
if (!old_links) {
|
||||
mvif->deflink_id = link_id;
|
||||
mconf = &mvif->bss_conf;
|
||||
mlink = &mvif->sta.deflink;
|
||||
} else {
|
||||
|
|
|
|||
|
|
@ -131,6 +131,7 @@ struct mt792x_vif {
|
|||
|
||||
struct mt792x_phy *phy;
|
||||
u16 valid_links;
|
||||
u8 deflink_id;
|
||||
};
|
||||
|
||||
struct mt792x_phy {
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user