.sta_set_decap_offload() runs once with only the first link present. Remember the setting on the sta and iterate msta->valid_links so a link added later inherits it. Iterating the sta's links also avoids a NULL deref: a vif link may exist before its per-sta link_sta is set up. Signed-off-by: Emery Hsin --- drivers/net/wireless/mediatek/mt76/mt7925/main.c | 12 ++++++++++-- drivers/net/wireless/mediatek/mt76/mt792x.h | 1 + 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/drivers/net/wireless/mediatek/mt76/mt7925/main.c b/drivers/net/wireless/mediatek/mt76/mt7925/main.c index 01d7526dbfa9..3af433d1e608 100644 --- a/drivers/net/wireless/mediatek/mt76/mt7925/main.c +++ b/drivers/net/wireless/mediatek/mt76/mt7925/main.c @@ -1087,6 +1087,10 @@ static int mt7925_mac_link_sta_add(struct mt76_dev *mdev, if (link_sta->sta->tdls) set_bit(MT_WCID_FLAG_TDLS_PEER, &mlink->wcid.flags); + /* links added later inherit the sta decap offload setting */ + if (msta->decap_offload) + set_bit(MT_WCID_FLAG_HDR_TRANS, &mlink->wcid.flags); + wcid = &mlink->wcid; ewma_signal_init(&wcid->rssi); rcu_assign_pointer(dev->mt76.wcid[wcid->idx], wcid); @@ -1932,7 +1936,7 @@ static void mt7925_sta_set_decap_offload(struct ieee80211_hw *hw, struct mt792x_sta *msta = (struct mt792x_sta *)sta->drv_priv; struct mt792x_vif *mvif = (struct mt792x_vif *)vif->drv_priv; struct mt792x_dev *dev = mt792x_hw_dev(hw); - unsigned long valid = mvif->valid_links; + unsigned long valid; u8 i; if (!msta->vif) @@ -1940,7 +1944,11 @@ static void mt7925_sta_set_decap_offload(struct ieee80211_hw *hw, mt792x_mutex_acquire(dev); - valid = ieee80211_vif_is_mld(vif) ? mvif->valid_links : BIT(0); + /* remember the setting, links added later inherit it */ + msta->decap_offload = enabled; + + /* iterate the sta's links, a vif link may not have a link_sta yet */ + valid = ieee80211_vif_is_mld(vif) ? msta->valid_links : BIT(0); for_each_set_bit(i, &valid, IEEE80211_MLD_MAX_NUM_LINKS) { struct mt792x_bss_conf *mconf; diff --git a/drivers/net/wireless/mediatek/mt76/mt792x.h b/drivers/net/wireless/mediatek/mt76/mt792x.h index 458f6f1fd6cd..96d4dfe8ee45 100644 --- a/drivers/net/wireless/mediatek/mt76/mt792x.h +++ b/drivers/net/wireless/mediatek/mt76/mt792x.h @@ -167,6 +167,7 @@ struct mt792x_sta { /* NAN peer schedule */ struct mt792x_sta_nan_sched nan_sched; + bool decap_offload; /* remembered, applied to links added later */ }; DECLARE_EWMA(rssi, 10, 8); -- 2.45.2