mirror of
https://github.com/Telecominfraproject/wlan-ap.git
synced 2025-12-18 09:51:26 +00:00
This series is based on * 2020-07-10 ipq6018-ilq-11-0_qca_oem-034672b0676c37b1f4519e5720e18e95fe6236ef Add support for * qsdk kernel/v4.4 * qsdk ethernet subsystem * v5.7 ath11k backport + QualComm staging patches (wlan_ap_1.0) * ath11k-firmware * hostapd/iw/... Feature support * full boot, system detection * sysupgrade to nand * HE support via latest hostapd * driver support for usb, crypto, hwmon, cpufreq, ... Missing * NSS/HW flow offloading - FW blob is not redistributable Using the qsdk v4.4 is an intermediate solution while the vanilla is being tested. Vanilla kernel is almost on feature par. Work has already started to upstream the ethernet and switch drivers. Once complete the target will be fully upstream. Signed-off-by: John Crispin <john@phrozen.org>
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
|
|
@@ -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);
|