return iwl_mvm_start_ap_ibss(hw, vif, &vif->bss_conf);
 }
 
-static void iwl_mvm_stop_ap_ibss(struct ieee80211_hw *hw,
-                                struct ieee80211_vif *vif,
-                                struct ieee80211_bss_conf *link_conf)
+/* Common part for MLD and non-MLD ops */
+void iwl_mvm_stop_ap_ibss_common(struct iwl_mvm *mvm,
+                                struct ieee80211_vif *vif)
 {
-       struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
        struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
 
-       iwl_mvm_prepare_mac_removal(mvm, vif);
+       lockdep_assert_held(&mvm->mutex);
 
-       mutex_lock(&mvm->mutex);
+       iwl_mvm_prepare_mac_removal(mvm, vif);
 
        /* Handle AP stop while in CSA */
        if (rcu_access_pointer(mvm->csa_vif) == vif) {
        }
 
        iwl_mvm_bt_coex_vif_change(mvm);
+}
+
+static void iwl_mvm_stop_ap_ibss(struct ieee80211_hw *hw,
+                                struct ieee80211_vif *vif,
+                                struct ieee80211_bss_conf *link_conf)
+{
+       struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
+
+       mutex_lock(&mvm->mutex);
+
+       iwl_mvm_stop_ap_ibss_common(mvm, vif);
 
        /* Need to update the P2P Device MAC (only GO, IBSS is single vif) */
        if (vif->p2p && mvm->p2p_device_vif)
 
        return ret;
 }
 
+static void iwl_mvm_mld_stop_ap_ibss(struct ieee80211_hw *hw,
+                                    struct ieee80211_vif *vif)
+{
+       struct iwl_mvm *mvm = IWL_MAC80211_GET_MVM(hw);
+
+       mutex_lock(&mvm->mutex);
+
+       iwl_mvm_stop_ap_ibss_common(mvm, vif);
+
+       /* Need to update the P2P Device MAC (only GO, IBSS is single vif) */
+       if (vif->p2p && mvm->p2p_device_vif)
+               iwl_mvm_mld_mac_ctxt_changed(mvm, mvm->p2p_device_vif, false);
+
+       iwl_mvm_ftm_responder_clear(mvm, vif);
+
+       iwl_mvm_mld_rm_bcast_sta(mvm, vif);
+       iwl_mvm_mld_rm_mcast_sta(mvm, vif);
+
+       /* Link needs to be deactivated before removal */
+       iwl_mvm_link_changed(mvm, vif, LINK_CONTEXT_MODIFY_ACTIVE, false);
+       iwl_mvm_remove_link(mvm, vif);
+
+       iwl_mvm_power_update_mac(mvm);
+
+       iwl_mvm_mld_mac_ctxt_remove(mvm, vif);
+
+       mutex_unlock(&mvm->mutex);
+}
+
 const struct ieee80211_ops iwl_mvm_mld_hw_ops = {
        .add_interface = iwl_mvm_mld_mac_add_interface,
        .remove_interface = iwl_mvm_mld_mac_remove_interface,
        .assign_vif_chanctx = iwl_mvm_mld_assign_vif_chanctx,
        .unassign_vif_chanctx = iwl_mvm_mld_unassign_vif_chanctx,
        .join_ibss = iwl_mvm_mld_start_ap_ibss,
+       .leave_ibss = iwl_mvm_mld_stop_ap_ibss,
 };
 
 /* AP and IBSS */
 bool iwl_mvm_start_ap_ibss_common(struct ieee80211_hw *hw,
                                  struct ieee80211_vif *vif, int *ret);
+void iwl_mvm_stop_ap_ibss_common(struct iwl_mvm *mvm,
+                                struct ieee80211_vif *vif);
 
 /* Quota management */
 static inline size_t iwl_mvm_quota_cmd_size(struct iwl_mvm *mvm)