--- a/drivers/net/wireless/ath/ath11k/core.h +++ b/drivers/net/wireless/ath/ath11k/core.h @@ -432,12 +432,6 @@ struct ath11k_per_peer_tx_stats { #define ATH11K_FLUSH_TIMEOUT (5 * HZ) #define ATH11K_VDEV_DELETE_TIMEOUT_HZ (5 * HZ) -struct ath11k_vdev_stop_delete_status { - bool stop_in_progress; - bool delete_in_progress; - u32 vdev_id; -}; - struct ath11k_coex_info { bool coex_support; u32 pta_num; @@ -527,7 +521,6 @@ struct ath11k { struct completion install_key_done; int last_wmi_vdev_start_status; - struct ath11k_vdev_stop_delete_status vdev_stop_delete_status; struct completion vdev_setup_done; struct completion vdev_delete_done; --- a/drivers/net/wireless/ath/ath11k/mac.c +++ b/drivers/net/wireless/ath/ath11k/mac.c @@ -451,48 +451,12 @@ struct ath11k *ath11k_mac_get_ar_by_pdev return NULL; } -struct ath11k *ath11k_mac_get_ar_vdev_stop_delete_status(struct ath11k_base *ab, - u32 vdev_id) +struct ath11k *ath11k_mac_get_ar_from_arvif_list(struct ath11k_base *ab, u32 vdev_id) { int i; struct ath11k_pdev *pdev; - struct ath11k *ar; - - for (i = 0; i < ab->num_radios; i++) { - pdev = rcu_dereference(ab->pdevs_active[i]); - if (pdev && pdev->ar) { - ar = pdev->ar; - - spin_lock_bh(&ar->data_lock); - if (ar->vdev_stop_delete_status.stop_in_progress && - ar->vdev_stop_delete_status.vdev_id == vdev_id) { - ar->vdev_stop_delete_status.stop_in_progress = false; - spin_unlock_bh(&ar->data_lock); - return ar; - } - if (ar->vdev_stop_delete_status.delete_in_progress && - ar->vdev_stop_delete_status.vdev_id == vdev_id) { - ar->vdev_stop_delete_status.delete_in_progress = false; - spin_unlock_bh(&ar->data_lock); - return ar; - } - if (pdev->ar->monitor_vdev_id == vdev_id) { - spin_unlock_bh(&ar->data_lock); - return pdev->ar; - } - spin_unlock_bh(&ar->data_lock); - } - } - return NULL; -} - -struct ath11k *ath11k_mac_get_ar_peer_delete_status(struct ath11k_base *ab, u8 *peer_addr, - u32 vdev_id) -{ - int i; - struct ath11k_pdev *pdev; - struct ath11k *ar; struct ath11k_vif *arvif; + struct ath11k *ar; for (i = 0; i < ab->num_radios; i++) { pdev = rcu_dereference(ab->pdevs_active[i]); @@ -500,18 +464,10 @@ struct ath11k *ath11k_mac_get_ar_peer_de ar = pdev->ar; spin_lock_bh(&ar->data_lock); - if (ether_addr_equal(ar->mac_addr, peer_addr)) { - spin_unlock_bh(&ar->data_lock); - return ar; - } else { - arvif = ath11k_mac_get_arvif(pdev->ar, vdev_id); - if (arvif) { + list_for_each_entry(arvif, &ar->arvifs, list) { + if (arvif->vdev_id == vdev_id) { spin_unlock_bh(&ar->data_lock); - return arvif->ar; - } - if (pdev->ar->monitor_vdev_id == vdev_id) { - spin_unlock_bh(&ar->data_lock); - return pdev->ar; + return arvif->ar; } } spin_unlock_bh(&ar->data_lock); @@ -876,7 +832,6 @@ static int ath11k_mac_monitor_vdev_delet ATH11K_VDEV_DELETE_TIMEOUT_HZ); if (time_left == 0) { ath11k_warn(ar->ab, "Timeout in receiving vdev delete response\n"); - ar->vdev_stop_delete_status.delete_in_progress = false; } else { ar->ab->free_vdev_map |= 1LL << (ar->monitor_vdev_id); ar->num_created_vdevs--; @@ -957,27 +912,6 @@ int ath11k_mac_monitor_recalc(struct ath else return ath11k_mac_monitor_stop(ar); } -int ath11k_wait_for_peer_delete_done(struct ath11k *ar, u32 vdev_id, - const u8 *addr) -{ - int ret; - unsigned long time_left; - - ret = ath11k_wait_for_peer_deleted(ar, vdev_id, addr); - if(ret) { - ath11k_warn(ar->ab, "failed wait for peer deleted"); - return ret; - } - - time_left = wait_for_completion_timeout(&ar->peer_delete_done, - 3 * HZ); - if(time_left == 0) { - ath11k_warn(ar->ab, "Timeout in receiving peer delete response\n"); - return -ETIMEDOUT; - } - - return 0; -} static int ath11k_mac_op_config(struct ieee80211_hw *hw, u32 changed) { @@ -5106,13 +5040,6 @@ static int ath11k_mac_vdev_stop(struct a reinit_completion(&ar->vdev_setup_done); reinit_completion(&ar->vdev_delete_done); - spin_lock_bh(&ar->data_lock); - - ar->vdev_stop_delete_status.stop_in_progress = true; - ar->vdev_stop_delete_status.vdev_id = arvif->vdev_id; - - spin_unlock_bh(&ar->data_lock); - ret = ath11k_wmi_vdev_stop(ar, arvif->vdev_id); if (ret) { ath11k_warn(ar->ab, "failed to stop WMI vdev %i: %d\n", @@ -5139,10 +5066,6 @@ static int ath11k_mac_vdev_stop(struct a return 0; err: - spin_lock_bh(&ar->data_lock); - ar->vdev_stop_delete_status.stop_in_progress = false; - spin_unlock_bh(&ar->data_lock); - return ret; } --- a/drivers/net/wireless/ath/ath11k/mac.h +++ b/drivers/net/wireless/ath/ath11k/mac.h @@ -139,16 +139,11 @@ int ath11k_mac_coex_config(struct ath11k int coex, u32 wlan_prio_mask, u8 wlan_weight); struct ath11k *ath11k_mac_get_ar_by_vdev_id(struct ath11k_base *ab, u32 vdev_id); struct ath11k *ath11k_mac_get_ar_by_pdev_id(struct ath11k_base *ab, u32 pdev_id); -struct ath11k *ath11k_mac_get_ar_vdev_stop_status(struct ath11k_base *ab, - u32 vdev_id); -struct ath11k *ath11k_mac_get_ar_vdev_stop_delete_status(struct ath11k_base *ab, - u32 vdev_id); +struct ath11k *ath11k_mac_get_ar_from_arvif_list(struct ath11k_base *ab, u32 vdev_id); void ath11k_mac_drain_tx(struct ath11k *ar); void ath11k_mac_peer_cleanup_all(struct ath11k *ar); int ath11k_mac_tx_mgmt_pending_free(int buf_id, void *skb, void *ctx); u8 ath11k_mac_bw_to_mac80211_bw(u8 bw); -struct ath11k *ath11k_mac_get_ar_peer_delete_status(struct ath11k_base *ab, u8 *peer_addr, - u32 vdev_id); enum ath11k_supported_bw ath11k_mac_mac80211_bw_to_ath11k_bw(enum rate_info_bw bw); enum hal_encrypt_type ath11k_dp_tx_get_encrypt_type(u32 cipher); #endif --- a/drivers/net/wireless/ath/ath11k/peer.c +++ b/drivers/net/wireless/ath/ath11k/peer.c @@ -153,7 +153,7 @@ void ath11k_peer_cleanup(struct ath11k * spin_unlock_bh(&ab->base_lock); } -int ath11k_wait_for_peer_deleted(struct ath11k *ar, int vdev_id, const u8 *addr) +static int ath11k_wait_for_peer_deleted(struct ath11k *ar, int vdev_id, const u8 *addr) { return ath11k_wait_for_peer_common(ar->ab, vdev_id, addr, false); } --- a/drivers/net/wireless/ath/ath11k/peer.h +++ b/drivers/net/wireless/ath/ath11k/peer.h @@ -40,7 +40,6 @@ void ath11k_peer_cleanup(struct ath11k * int ath11k_peer_delete(struct ath11k *ar, u32 vdev_id, u8 *addr); int ath11k_peer_create(struct ath11k *ar, struct ath11k_vif *arvif, struct ieee80211_sta *sta, struct peer_create_params *param); -int ath11k_wait_for_peer_deleted(struct ath11k *ar, int vdev_id, const u8 *addr); int ath11k_wait_for_peer_delete_done(struct ath11k *ar, u32 vdev_id, const u8 *addr); #endif /* _PEER_H_ */ --- a/drivers/net/wireless/ath/ath11k/wmi.c +++ b/drivers/net/wireless/ath/ath11k/wmi.c @@ -5557,7 +5557,7 @@ static void ath11k_peer_delete_resp_even } rcu_read_lock(); - ar = ath11k_mac_get_ar_by_vdev_id(ab, peer_del_resp.vdev_id); + ar = ath11k_mac_get_ar_from_arvif_list(ab, peer_del_resp.vdev_id); if (!ar) { ath11k_warn(ab, "invalid vdev id in peer delete resp ev %d", peer_del_resp.vdev_id); @@ -5585,7 +5585,7 @@ static void ath11k_vdev_delete_resp_even } rcu_read_lock(); - ar = ath11k_mac_get_ar_vdev_stop_delete_status(ab, vdev_id); + ar = ath11k_mac_get_ar_from_arvif_list(ab, vdev_id); if (!ar) { ath11k_warn(ab, "invalid vdev id in vdev delete resp ev %d", vdev_id); @@ -5676,7 +5676,7 @@ static void ath11k_vdev_stopped_event(st } rcu_read_lock(); - ar = ath11k_mac_get_ar_vdev_stop_delete_status(ab, vdev_id); + ar = ath11k_mac_get_ar_from_arvif_list(ab, vdev_id); if (!ar) { ath11k_warn(ab, "invalid vdev id in vdev stopped ev %d", vdev_id);