mac80211: brcmfmac: backport 4.19 patches preparing monitor mode support
[openwrt/staging/wigyori.git] / package / kernel / mac80211 / patches / 380-0000-ath10k-handle-tdls-peer-events.patch
1 From 8ed05ed06fca0136cf4546e804318f57ef823348 Mon Sep 17 00:00:00 2001
2 From: Manikanta Pubbisetty <mpubbise@qti.qualcomm.com>
3 Date: Mon, 6 Nov 2017 13:39:32 +0530
4 Subject: [PATCH] ath10k: handle tdls peer events
5
6 Handle tdls peer events from the target. TDLS events for the peer
7 could be discover, teardown, etc. As of now, adding the logic to
8 handle tdls teardown events alone.
9
10 Teardown due to peer traffic indication(PTR) timeout is one such
11 teardown event from the target.
12
13 Tested this change on QCA9888 with 10.4-3.5.1-00018 fw version.
14
15 Signed-off-by: Manikanta Pubbisetty <mpubbise@qti.qualcomm.com>
16 Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
17 ---
18 drivers/net/wireless/ath/ath10k/wmi.c | 72 +++++++++++++++++++++++++++++++++++
19 1 file changed, 72 insertions(+)
20
21 --- a/drivers/net/wireless/ath/ath10k/wmi.c
22 +++ b/drivers/net/wireless/ath/ath10k/wmi.c
23 @@ -29,6 +29,7 @@
24 #include "p2p.h"
25 #include "hw.h"
26 #include "hif.h"
27 +#include "txrx.h"
28
29 #define ATH10K_WMI_BARRIER_ECHO_ID 0xBA991E9
30 #define ATH10K_WMI_BARRIER_TIMEOUT_HZ (3 * HZ)
31 @@ -4456,6 +4457,74 @@ void ath10k_wmi_event_pdev_tpc_config(st
32 __le32_to_cpu(ev->rate_max));
33 }
34
35 +static void
36 +ath10k_wmi_handle_tdls_peer_event(struct ath10k *ar, struct sk_buff *skb)
37 +{
38 + struct wmi_tdls_peer_event *ev;
39 + struct ath10k_peer *peer;
40 + struct ath10k_vif *arvif;
41 + int vdev_id;
42 + int peer_status;
43 + int peer_reason;
44 + u8 reason;
45 +
46 + if (skb->len < sizeof(*ev)) {
47 + ath10k_err(ar, "received tdls peer event with invalid size (%d bytes)\n",
48 + skb->len);
49 + return;
50 + }
51 +
52 + ev = (struct wmi_tdls_peer_event *)skb->data;
53 + vdev_id = __le32_to_cpu(ev->vdev_id);
54 + peer_status = __le32_to_cpu(ev->peer_status);
55 + peer_reason = __le32_to_cpu(ev->peer_reason);
56 +
57 + spin_lock_bh(&ar->data_lock);
58 + peer = ath10k_peer_find(ar, vdev_id, ev->peer_macaddr.addr);
59 + spin_unlock_bh(&ar->data_lock);
60 +
61 + if (!peer) {
62 + ath10k_warn(ar, "failed to find peer entry for %pM\n",
63 + ev->peer_macaddr.addr);
64 + return;
65 + }
66 +
67 + switch (peer_status) {
68 + case WMI_TDLS_SHOULD_TEARDOWN:
69 + switch (peer_reason) {
70 + case WMI_TDLS_TEARDOWN_REASON_PTR_TIMEOUT:
71 + case WMI_TDLS_TEARDOWN_REASON_NO_RESPONSE:
72 + case WMI_TDLS_TEARDOWN_REASON_RSSI:
73 + reason = WLAN_REASON_TDLS_TEARDOWN_UNREACHABLE;
74 + break;
75 + default:
76 + reason = WLAN_REASON_TDLS_TEARDOWN_UNSPECIFIED;
77 + break;
78 + }
79 +
80 + arvif = ath10k_get_arvif(ar, vdev_id);
81 + if (!arvif) {
82 + ath10k_warn(ar, "received tdls peer event for invalid vdev id %u\n",
83 + vdev_id);
84 + return;
85 + }
86 +
87 + ieee80211_tdls_oper_request(arvif->vif, ev->peer_macaddr.addr,
88 + NL80211_TDLS_TEARDOWN, reason,
89 + GFP_ATOMIC);
90 +
91 + ath10k_dbg(ar, ATH10K_DBG_WMI,
92 + "received tdls teardown event for peer %pM reason %u\n",
93 + ev->peer_macaddr.addr, peer_reason);
94 + break;
95 + default:
96 + ath10k_dbg(ar, ATH10K_DBG_WMI,
97 + "received unknown tdls peer event %u\n",
98 + peer_status);
99 + break;
100 + }
101 +}
102 +
103 void ath10k_wmi_event_pdev_ftm_intg(struct ath10k *ar, struct sk_buff *skb)
104 {
105 ath10k_dbg(ar, ATH10K_DBG_WMI, "WMI_PDEV_FTM_INTG_EVENTID\n");
106 @@ -5478,6 +5547,9 @@ static void ath10k_wmi_10_4_op_rx(struct
107 case WMI_10_4_PDEV_TPC_CONFIG_EVENTID:
108 ath10k_wmi_event_pdev_tpc_config(ar, skb);
109 break;
110 + case WMI_10_4_TDLS_PEER_EVENTID:
111 + ath10k_wmi_handle_tdls_peer_event(ar, skb);
112 + break;
113 default:
114 ath10k_warn(ar, "Unknown eventid: %d\n", id);
115 break;