mirror of
https://github.com/Telecominfraproject/wlan-ap.git
synced 2025-12-18 01:41:24 +00:00
230 lines
7.8 KiB
Diff
230 lines
7.8 KiB
Diff
--- a/drivers/net/wireless/ath/ath11k/core.h
|
|
+++ b/drivers/net/wireless/ath/ath11k/core.h
|
|
@@ -441,12 +441,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;
|
|
@@ -537,7 +531,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
|
|
@@ -547,48 +547,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]);
|
|
@@ -596,18 +560,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);
|
|
@@ -972,7 +928,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--;
|
|
@@ -1053,27 +1008,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)
|
|
{
|
|
@@ -5339,13 +5273,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",
|
|
@@ -5374,10 +5301,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
|
|
@@ -172,7 +172,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
|
|
@@ -41,7 +41,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
|
|
@@ -5853,7 +5853,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);
|
|
@@ -5881,7 +5881,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);
|
|
@@ -5972,7 +5972,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);
|