wlan-ap-Telecominfraproject/feeds/wifi-ax/mac80211/patches/qca/040-ath11k-add-new-api-to-get-ar-from-arvifs.patch
John Crispin 528a778e38 open-converged-wireless: Import 21.02 based uCentral tree
Signed-off-by: John Crispin <john@phrozen.org>
2021-03-25 12:19:47 +01:00

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);