diff --git a/net/mac80211/mesh.c b/net/mac80211/mesh.c index d4507e4e6ec1..d3fb4478a366 100644 --- a/net/mac80211/mesh.c +++ b/net/mac80211/mesh.c @@ -1201,7 +1201,8 @@ void ieee80211_stop_mesh(struct ieee80211_sub_if_data *sdata) struct ieee80211_local *local = sdata->local; struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh; struct beacon_data *bcn; - + struct mesh_csa_settings *csa; + netif_carrier_off(sdata->dev); /* flush STAs and mpaths on this iface */ @@ -1222,6 +1223,13 @@ void ieee80211_stop_mesh(struct ieee80211_sub_if_data *sdata) RCU_INIT_POINTER(ifmsh->beacon, NULL); kfree_rcu(bcn, rcu_head); + /* free any pending, unfinished channel switch */ + csa = sdata_dereference(ifmsh->csa, sdata); + if (csa) { + RCU_INIT_POINTER(ifmsh->csa, NULL); + kfree_rcu(csa, rcu_head); + } + /* free all potentially still buffered group-addressed frames */ local->total_ps_buffered -= skb_queue_len(&ifmsh->ps.bc_buf); skb_queue_purge(&ifmsh->ps.bc_buf);