diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c index 3e343108f116..a5964ab165a3 100644 --- a/net/mac80211/cfg.c +++ b/net/mac80211/cfg.c @@ -4846,10 +4846,16 @@ static void ieee80211_del_intf_link(struct wiphy *wiphy, unsigned int link_id) { struct ieee80211_sub_if_data *sdata = IEEE80211_WDEV_TO_SUB_IF(wdev); + u16 new_links = wdev->valid_links & ~BIT(link_id); lockdep_assert_wiphy(sdata->local->hw.wiphy); - ieee80211_vif_set_links(sdata, wdev->valid_links, 0); + /* During the link teardown process, certain functions require the + * link_id to remain in the valid_links bitmap. Therefore, instead + * of removing the link_id from the bitmap, pass a masked value to + * simulate as if link_id does not exist anymore. + */ + ieee80211_vif_set_links(sdata, new_links, 0); } static int sta_add_link_station(struct ieee80211_local *local, diff --git a/net/wireless/util.c b/net/wireless/util.c index 7b7ca01330d0..1c85a3a10170 100644 --- a/net/wireless/util.c +++ b/net/wireless/util.c @@ -2748,10 +2748,9 @@ void cfg80211_remove_link(struct wireless_dev *wdev, unsigned int link_id) break; } - wdev->valid_links &= ~BIT(link_id); - rdev_del_intf_link(rdev, wdev, link_id); + wdev->valid_links &= ~BIT(link_id); eth_zero_addr(wdev->links[link_id].addr); }