/* Delete all the self dp_peers on asserted radio */
list_for_each_entry_safe_reverse(arvif, tmp_vif, &ar->arvifs, list) {
- if (arvif->ahvif->vdev_type == WMI_VDEV_TYPE_AP) {
+ if ((arvif->ahvif->vdev_type == WMI_VDEV_TYPE_AP) &&
+ (arvif->link_id < IEEE80211_MLD_MAX_NUM_LINKS)) {
ath12k_dp_peer_delete(dp_hw, arvif->bssid, NULL);
arvif->num_stations = 0;
}
ath12k_warn(ar->ab, "failed to submit AP self-peer removal on vdev %d link id %d: %d",
arvif->vdev_id, arvif->link_id, ret);
- ath12k_dp_peer_delete(&ah->dp_hw, arvif->bssid, NULL);
+ if (arvif->link_id < IEEE80211_MLD_MAX_NUM_LINKS)
+ ath12k_dp_peer_delete(&ah->dp_hw, arvif->bssid, NULL);
}
ath12k_mac_vdev_delete(ar, arvif);
}
u8 link_id;
struct ath12k_dp_link_vif *dp_link_vif = NULL;
struct ath12k_dp_peer_create_params params = {};
+ bool dp_peer_created = false;
lockdep_assert_wiphy(hw->wiphy);
case WMI_VDEV_TYPE_AP:
params.ucast_ra_only = true;
- ret = ath12k_dp_peer_create(&ah->dp_hw, arvif->bssid, ¶ms);
- if (ret) {
- ath12k_warn(ab, "failed to vdev %d create dp_peer for AP: %d\n",
- arvif->vdev_id, ret);
- goto err_vdev_del;
+ if (arvif->link_id < IEEE80211_MLD_MAX_NUM_LINKS) {
+ ret = ath12k_dp_peer_create(&ah->dp_hw, arvif->bssid, ¶ms);
+ if (ret) {
+ ath12k_warn(ab, "failed to vdev %d create dp_peer for AP: %d\n",
+ arvif->vdev_id, ret);
+ goto err_vdev_del;
+ }
+ dp_peer_created = true;
}
peer_param.vdev_id = arvif->vdev_id;
}
err_dp_peer_del:
- if (ahvif->vdev_type == WMI_VDEV_TYPE_AP)
+ if (dp_peer_created)
ath12k_dp_peer_delete(&ah->dp_hw, arvif->bssid, NULL);
err_vdev_del:
spin_unlock_bh(&dp->dp_lock);
- ret = ath12k_dp_link_peer_assign(ath12k_ab_to_dp(ar->ab),
- &(ath12k_ar_to_ah(ar)->dp_hw),
- arvif->vdev_id, sta,
- (u8 *)arg->peer_addr, link_id,
- ar->hw_link_id);
+ if (arvif->link_id < IEEE80211_MLD_MAX_NUM_LINKS) {
+ ret = ath12k_dp_link_peer_assign(ath12k_ab_to_dp(ar->ab),
+ &(ath12k_ar_to_ah(ar)->dp_hw),
+ arvif->vdev_id, sta,
+ (u8 *)arg->peer_addr, link_id,
+ ar->hw_link_id);
+ }
return ret;
}