struct mt76_wcid *wcid = (struct mt76_wcid *)sta->drv_priv;
        int i, idx = wcid->idx;
 
-       rcu_assign_pointer(dev->wcid[idx], NULL);
-       synchronize_rcu();
-
        for (i = 0; i < ARRAY_SIZE(wcid->aggr); i++)
                mt76_rx_aggr_stop(dev, wcid, i);
 
 }
 EXPORT_SYMBOL_GPL(mt76_sta_state);
 
+void mt76_sta_pre_rcu_remove(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
+                            struct ieee80211_sta *sta)
+{
+       struct mt76_phy *phy = hw->priv;
+       struct mt76_dev *dev = phy->dev;
+       struct mt76_wcid *wcid = (struct mt76_wcid *)sta->drv_priv;
+
+       mutex_lock(&dev->mutex);
+       rcu_assign_pointer(dev->wcid[wcid->idx], NULL);
+       mutex_unlock(&dev->mutex);
+}
+EXPORT_SYMBOL_GPL(mt76_sta_pre_rcu_remove);
+
 int mt76_get_txpower(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
                     int *dbm)
 {
 
                   enum ieee80211_sta_state new_state);
 void __mt76_sta_remove(struct mt76_dev *dev, struct ieee80211_vif *vif,
                       struct ieee80211_sta *sta);
+void mt76_sta_pre_rcu_remove(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
+                            struct ieee80211_sta *sta);
 
 int mt76_get_min_avg_rssi(struct mt76_dev *dev, bool ext_phy);
 
 
        .configure_filter = mt7603_configure_filter,
        .bss_info_changed = mt7603_bss_info_changed,
        .sta_state = mt76_sta_state,
+       .sta_pre_rcu_remove = mt76_sta_pre_rcu_remove,
        .set_key = mt7603_set_key,
        .conf_tx = mt7603_conf_tx,
        .sw_scan_start = mt76_sw_scan,
 
        .bss_info_changed = mt7615_bss_info_changed,
        .sta_add = mt7615_sta_add,
        .sta_remove = mt7615_sta_remove,
+       .sta_pre_rcu_remove = mt76_sta_pre_rcu_remove,
        .set_key = mt7615_set_key,
        .ampdu_action = mt7615_ampdu_action,
        .set_rts_threshold = mt7615_set_rts_threshold,
 
        .configure_filter = mt76x02_configure_filter,
        .bss_info_changed = mt76x02_bss_info_changed,
        .sta_state = mt76_sta_state,
+       .sta_pre_rcu_remove = mt76_sta_pre_rcu_remove,
        .set_key = mt76x02_set_key,
        .conf_tx = mt76x02_conf_tx,
        .sw_scan_start = mt76_sw_scan,
 
        .configure_filter = mt76x02_configure_filter,
        .bss_info_changed = mt76x02_bss_info_changed,
        .sta_state = mt76_sta_state,
+       .sta_pre_rcu_remove = mt76_sta_pre_rcu_remove,
        .set_key = mt76x02_set_key,
        .conf_tx = mt76x02_conf_tx,
        .sw_scan_start = mt76_sw_scan,
 
                if (!wcid)
                        continue;
 
+               rcu_assign_pointer(dev->mt76.wcid[i], NULL);
+
                priv = msta = container_of(wcid, struct mt76x02_sta, wcid);
                sta = container_of(priv, struct ieee80211_sta, drv_priv);
 
 
        .configure_filter = mt76x02_configure_filter,
        .bss_info_changed = mt76x02_bss_info_changed,
        .sta_state = mt76_sta_state,
+       .sta_pre_rcu_remove = mt76_sta_pre_rcu_remove,
        .set_key = mt76x02_set_key,
        .conf_tx = mt76x02_conf_tx,
        .sw_scan_start = mt76_sw_scan,
 
        .add_interface = mt76x02_add_interface,
        .remove_interface = mt76x02_remove_interface,
        .sta_state = mt76_sta_state,
+       .sta_pre_rcu_remove = mt76_sta_pre_rcu_remove,
        .set_key = mt76x02_set_key,
        .ampdu_action = mt76x02_ampdu_action,
        .config = mt76x2u_config,