2017-10-16 05:58:31

by Yingying Tang

[permalink] [raw]
Subject: [PATCH V6 0/5] Add TDLS feature for ath10k

From: Yingying Tang <[email protected]>

This patchset is for Rome PCIE chip, it will not affect other hardware

Yingying Tang (5):
mac80211: Enable TDLS peer buffer STA feature
ath10k: Enable TDLS peer buffer STA feature
ath10k: Enable TDLS peer inactivity detection
ath10k: Avoid to set WEP key for TDLS peer
ath10k: Fix TDLS peer TX data failure issue on encryped AP

drivers/net/wireless/ath/ath10k/mac.c | 9 ++++-
drivers/net/wireless/ath/ath10k/wmi-tlv.c | 55 +++++++++++++++++++++++++++++
drivers/net/wireless/ath/ath10k/wmi-tlv.h | 9 +++++
drivers/net/wireless/ath/ath10k/wmi.h | 1 +
include/net/mac80211.h | 4 +++
net/mac80211/tdls.c | 5 ++-
6 files changed, 81 insertions(+), 2 deletions(-)

--
1.7.9.5


2017-10-18 23:38:04

by Peter Oh

[permalink] [raw]
Subject: Re: [PATCH V6 0/5] Add TDLS feature for ath10k



On 10/15/2017 11:00 PM, [email protected] wrote:
> From: Yingying Tang <[email protected]>
>
> This patchset is for Rome PCIE chip, it will not affect other hardware
Please add your patchset history here until V6.
That's what cover letter is supposed to have.
> Yingying Tang (5):
> mac80211: Enable TDLS peer buffer STA feature
> ath10k: Enable TDLS peer buffer STA feature
> ath10k: Enable TDLS peer inactivity detection
> ath10k: Avoid to set WEP key for TDLS peer
> ath10k: Fix TDLS peer TX data failure issue on encryped AP
>
> drivers/net/wireless/ath/ath10k/mac.c | 9 ++++-
> drivers/net/wireless/ath/ath10k/wmi-tlv.c | 55 +++++++++++++++++++++++++++++
> drivers/net/wireless/ath/ath10k/wmi-tlv.h | 9 +++++
> drivers/net/wireless/ath/ath10k/wmi.h | 1 +
> include/net/mac80211.h | 4 +++
> net/mac80211/tdls.c | 5 ++-
> 6 files changed, 81 insertions(+), 2 deletions(-)
>

2017-10-16 05:58:39

by Yingying Tang

[permalink] [raw]
Subject: [PATCH V6 2/5] ath10k: Enable TDLS peer buffer STA feature

From: Yingying Tang <[email protected]>

Enable TDLS peer buffer STA feature.
QCA6174 firmware(version: WLAN.RM.4.4) support TDLS peer buffer STA,
it reports this capability through wmi service map in wmi service ready
event. Set related parameter in TDLS WMI command to enable this feature.

Signed-off-by: Yingying Tang <[email protected]>
---
drivers/net/wireless/ath/ath10k/mac.c | 3 +++
drivers/net/wireless/ath/ath10k/wmi-tlv.c | 3 +++
2 files changed, 6 insertions(+)

diff --git a/drivers/net/wireless/ath/ath10k/mac.c b/drivers/net/wireless/ath/ath10k/mac.c
index 5683f1a..1672043 100644
--- a/drivers/net/wireless/ath/ath10k/mac.c
+++ b/drivers/net/wireless/ath/ath10k/mac.c
@@ -8204,6 +8204,9 @@ int ath10k_mac_register(struct ath10k *ar)
ieee80211_hw_set(ar->hw, TDLS_WIDER_BW);
}

+ if (test_bit(WMI_SERVICE_TDLS_UAPSD_BUFFER_STA, ar->wmi.svc_map))
+ ieee80211_hw_set(ar->hw, SUPPORTS_TDLS_BUFFER_STA);
+
ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL;
ar->hw->wiphy->flags |= WIPHY_FLAG_HAS_CHANNEL_SWITCH;
ar->hw->wiphy->max_remain_on_channel_duration = 5000;
diff --git a/drivers/net/wireless/ath/ath10k/wmi-tlv.c b/drivers/net/wireless/ath/ath10k/wmi-tlv.c
index 7616c1c..f60b46e 100644
--- a/drivers/net/wireless/ath/ath10k/wmi-tlv.c
+++ b/drivers/net/wireless/ath/ath10k/wmi-tlv.c
@@ -2747,6 +2747,9 @@ static void *ath10k_wmi_tlv_put_wmm(void *ptr,
*/
u32 options = 0;

+ if (test_bit(WMI_SERVICE_TDLS_UAPSD_BUFFER_STA, ar->wmi.svc_map))
+ options |= WMI_TLV_TDLS_BUFFER_STA_EN;
+
len = sizeof(*tlv) + sizeof(*cmd);
skb = ath10k_wmi_alloc_skb(ar, len);
if (!skb)
--
1.7.9.5

2017-10-23 06:29:14

by Johannes Berg

[permalink] [raw]
Subject: Re: [PATCH V6 1/5] mac80211: Enable TDLS peer buffer STA feature

On Fri, 2017-10-20 at 03:34 +0000, Yingying Tang wrote:
> Hi Johannes,
>
> I have built and tested it, it can work

No, you haven't, at least not comprehensively. Try to enable debugfs.

johannes

2017-10-18 10:35:41

by Johannes Berg

[permalink] [raw]
Subject: Re: [PATCH V6 1/5] mac80211: Enable TDLS peer buffer STA feature

On Mon, 2017-10-16 at 14:00 +0800, [email protected] wrote:
> From: Yingying Tang <[email protected]>
>
> Enable TDLS peer buffer STA feature.
> Set extended capability bit to enable buffer STA when driver
> support it.

It would help if you could (build) test your changes :-)

johannes

2017-10-16 05:58:46

by Yingying Tang

[permalink] [raw]
Subject: [PATCH V6 4/5] ath10k: Avoid to set WEP key for TDLS peer

From: Yingying Tang <[email protected]>

TDLS peer do not need WEP key. Setting WEP key will lead
to TDLS setup failure. Add fix to avoid setting WEP key
for TDLS peer.

Signed-off-by: Yingying Tang <[email protected]>
---
drivers/net/wireless/ath/ath10k/mac.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/net/wireless/ath/ath10k/mac.c b/drivers/net/wireless/ath/ath10k/mac.c
index 1672043..a984a72 100644
--- a/drivers/net/wireless/ath/ath10k/mac.c
+++ b/drivers/net/wireless/ath/ath10k/mac.c
@@ -2966,7 +2966,7 @@ static int ath10k_station_assoc(struct ath10k *ar,
}

/* Plumb cached keys only for static WEP */
- if (arvif->def_wep_key_idx != -1) {
+ if ((arvif->def_wep_key_idx != -1) && (!sta->tdls)) {
ret = ath10k_install_peer_wep_keys(arvif, sta->addr);
if (ret) {
ath10k_warn(ar, "failed to install peer wep keys for vdev %i: %d\n",
--
1.7.9.5

2017-10-20 03:35:00

by Yingying Tang

[permalink] [raw]
Subject: RE: [PATCH V6 1/5] mac80211: Enable TDLS peer buffer STA feature

SGkgSm9oYW5uZXMsDQoNCkkgaGF2ZSBidWlsdCBhbmQgdGVzdGVkIGl0LCBpdCBjYW4gd29yaw0K
DQotLS0tLU9yaWdpbmFsIE1lc3NhZ2UtLS0tLQ0KRnJvbTogSm9oYW5uZXMgQmVyZyBbbWFpbHRv
OmpvaGFubmVzQHNpcHNvbHV0aW9ucy5uZXRdIA0KU2VudDogV2VkbmVzZGF5LCBPY3RvYmVyIDE4
LCAyMDE3IDY6MzYgUE0NClRvOiBZaW5neWluZyBUYW5nIDx5aW50YW5nQHF0aS5xdWFsY29tbS5j
b20+OyBhdGgxMGtAbGlzdHMuaW5mcmFkZWFkLm9yZw0KQ2M6IGxpbnV4LXdpcmVsZXNzQHZnZXIu
a2VybmVsLm9yZw0KU3ViamVjdDogUmU6IFtQQVRDSCBWNiAxLzVdIG1hYzgwMjExOiBFbmFibGUg
VERMUyBwZWVyIGJ1ZmZlciBTVEEgZmVhdHVyZQ0KDQpPbiBNb24sIDIwMTctMTAtMTYgYXQgMTQ6
MDAgKzA4MDAsIHlpbnRhbmdAcXRpLnF1YWxjb21tLmNvbSB3cm90ZToNCj4gRnJvbTogWWluZ3lp
bmcgVGFuZyA8eWludGFuZ0BxdGkucXVhbGNvbW0uY29tPg0KPiANCj4gRW5hYmxlIFRETFMgcGVl
ciBidWZmZXIgU1RBIGZlYXR1cmUuDQo+IFNldCBleHRlbmRlZCBjYXBhYmlsaXR5IGJpdCB0byBl
bmFibGUgYnVmZmVyIFNUQSB3aGVuIGRyaXZlciBzdXBwb3J0IA0KPiBpdC4NCg0KSXQgd291bGQg
aGVscCBpZiB5b3UgY291bGQgKGJ1aWxkKSB0ZXN0IHlvdXIgY2hhbmdlcyA6LSkNCg0Kam9oYW5u
ZXMNCg==

2017-10-16 05:58:35

by Yingying Tang

[permalink] [raw]
Subject: [PATCH V6 1/5] mac80211: Enable TDLS peer buffer STA feature

From: Yingying Tang <[email protected]>

Enable TDLS peer buffer STA feature.
Set extended capability bit to enable buffer STA when driver
support it.

Signed-off-by: Yingying Tang <[email protected]>
---
include/net/mac80211.h | 4 ++++
net/mac80211/tdls.c | 5 ++++-
2 files changed, 8 insertions(+), 1 deletion(-)

diff --git a/include/net/mac80211.h b/include/net/mac80211.h
index f8149ca..5928123 100644
--- a/include/net/mac80211.h
+++ b/include/net/mac80211.h
@@ -2067,6 +2067,9 @@ struct ieee80211_txq {
* The stack will not do fragmentation.
* The callback for @set_frag_threshold should be set as well.
*
+ * @IEEE80211_HW_SUPPORTS_TDLS_BUFFER_STA: Hardware support buffer STA when
+ * TDLS is established.
+ *
* @NUM_IEEE80211_HW_FLAGS: number of hardware flags, used for sizing arrays
*/
enum ieee80211_hw_flags {
@@ -2109,6 +2112,7 @@ enum ieee80211_hw_flags {
IEEE80211_HW_TX_FRAG_LIST,
IEEE80211_HW_REPORTS_LOW_ACK,
IEEE80211_HW_SUPPORTS_TX_FRAG,
+ IEEE80211_HW_SUPPORTS_TDLS_BUFFER_STA,

/* keep last, obviously */
NUM_IEEE80211_HW_FLAGS
diff --git a/net/mac80211/tdls.c b/net/mac80211/tdls.c
index 91093d4..8231466 100644
--- a/net/mac80211/tdls.c
+++ b/net/mac80211/tdls.c
@@ -47,6 +47,8 @@ static void ieee80211_tdls_add_ext_capab(struct ieee80211_sub_if_data *sdata,
NL80211_FEATURE_TDLS_CHANNEL_SWITCH;
bool wider_band = ieee80211_hw_check(&local->hw, TDLS_WIDER_BW) &&
!ifmgd->tdls_wider_bw_prohibited;
+ bool buffer_sta = ieee80211_hw_check(&local->hw,
+ SUPPORTS_TDLS_BUFFER_STA);
struct ieee80211_supported_band *sband = ieee80211_get_sband(sdata);
bool vht = sband && sband->vht_cap.vht_supported;
u8 *pos = skb_put(skb, 10);
@@ -56,7 +58,8 @@ static void ieee80211_tdls_add_ext_capab(struct ieee80211_sub_if_data *sdata,
*pos++ = 0x0;
*pos++ = 0x0;
*pos++ = 0x0;
- *pos++ = chan_switch ? WLAN_EXT_CAPA4_TDLS_CHAN_SWITCH : 0;
+ *pos++ = (chan_switch ? WLAN_EXT_CAPA4_TDLS_CHAN_SWITCH : 0) |
+ (buffer_sta ? WLAN_EXT_CAPA4_TDLS_BUFFER_STA : 0);
*pos++ = WLAN_EXT_CAPA5_TDLS_ENABLED;
*pos++ = 0;
*pos++ = 0;
--
1.7.9.5

2017-10-16 05:58:41

by Yingying Tang

[permalink] [raw]
Subject: [PATCH V6 3/5] ath10k: Enable TDLS peer inactivity detection

From: Yingying Tang <[email protected]>

Enable TDLS peer inactivity detetion feature.
QCA6174 firmware(version: WLAN.RM.4.4) support TDLS link inactivity detecting.
Set related parameters in TDLS WMI command to enable this feature.

Signed-off-by: Yingying Tang <[email protected]>
---
drivers/net/wireless/ath/ath10k/wmi-tlv.c | 52 +++++++++++++++++++++++++++++
drivers/net/wireless/ath/ath10k/wmi-tlv.h | 9 +++++
drivers/net/wireless/ath/ath10k/wmi.h | 1 +
3 files changed, 62 insertions(+)

diff --git a/drivers/net/wireless/ath/ath10k/wmi-tlv.c b/drivers/net/wireless/ath/ath10k/wmi-tlv.c
index f60b46e..63bb2c4 100644
--- a/drivers/net/wireless/ath/ath10k/wmi-tlv.c
+++ b/drivers/net/wireless/ath/ath10k/wmi-tlv.c
@@ -412,6 +412,49 @@ static int ath10k_wmi_tlv_event_tx_pause(struct ath10k *ar,
return 0;
}

+void ath10k_wmi_event_tdls_peer(struct ath10k *ar, struct sk_buff *skb)
+{
+ struct ieee80211_sta *station;
+ const struct wmi_tlv_tdls_peer_event *ev;
+ const void **tb;
+ struct ath10k_vif *arvif;
+
+ tb = ath10k_wmi_tlv_parse_alloc(ar, skb->data, skb->len, GFP_ATOMIC);
+ if (IS_ERR(tb)) {
+ ath10k_warn(ar, "tdls peer failed to parse tlv");
+ return;
+ }
+ ev = tb[WMI_TLV_TAG_STRUCT_TDLS_PEER_EVENT];
+ if (!ev) {
+ kfree(tb);
+ ath10k_warn(ar, "tdls peer NULL event");
+ return;
+ }
+
+ switch (ev->peer_reason) {
+ case WMI_TDLS_TEARDOWN_REASON_TX:
+ case WMI_TDLS_TEARDOWN_REASON_RSSI:
+ case WMI_TDLS_TEARDOWN_REASON_PTR_TIMEOUT:
+ station = ieee80211_find_sta_by_ifaddr(ar->hw,
+ ev->peer_macaddr.addr,
+ NULL);
+ if (!station) {
+ ath10k_warn(ar, "did not find station from tdls peer event");
+ kfree(tb);
+ return;
+ }
+ arvif = ath10k_get_arvif(ar, ev->vdev_id);
+ ieee80211_tdls_oper_request(
+ arvif->vif, station->addr,
+ NL80211_TDLS_TEARDOWN,
+ WLAN_REASON_TDLS_TEARDOWN_UNREACHABLE,
+ GFP_ATOMIC
+ );
+ break;
+ }
+ kfree(tb);
+}
+
/***********/
/* TLV ops */
/***********/
@@ -552,6 +595,9 @@ static void ath10k_wmi_tlv_op_rx(struct ath10k *ar, struct sk_buff *skb)
case WMI_TLV_TX_PAUSE_EVENTID:
ath10k_wmi_tlv_event_tx_pause(ar, skb);
break;
+ case WMI_TLV_TDLS_PEER_EVENTID:
+ ath10k_wmi_event_tdls_peer(ar, skb);
+ break;
default:
ath10k_warn(ar, "Unknown eventid: %d\n", id);
break;
@@ -2750,6 +2796,12 @@ static void *ath10k_wmi_tlv_put_wmm(void *ptr,
if (test_bit(WMI_SERVICE_TDLS_UAPSD_BUFFER_STA, ar->wmi.svc_map))
options |= WMI_TLV_TDLS_BUFFER_STA_EN;

+ /* WMI_TDLS_ENABLE_ACTIVE_EXTERNAL_CONTROL means firm will handle TDLS
+ * link inactivity detecting logic.
+ */
+ if (state == WMI_TDLS_ENABLE_ACTIVE)
+ state = WMI_TDLS_ENABLE_ACTIVE_EXTERNAL_CONTROL;
+
len = sizeof(*tlv) + sizeof(*cmd);
skb = ath10k_wmi_alloc_skb(ar, len);
if (!skb)
diff --git a/drivers/net/wireless/ath/ath10k/wmi-tlv.h b/drivers/net/wireless/ath/ath10k/wmi-tlv.h
index 22cf011..8fdb381 100644
--- a/drivers/net/wireless/ath/ath10k/wmi-tlv.h
+++ b/drivers/net/wireless/ath/ath10k/wmi-tlv.h
@@ -1641,6 +1641,15 @@ struct wmi_tlv_tx_pause_ev {
__le32 tid_map;
} __packed;

+struct wmi_tlv_tdls_peer_event {
+ struct wmi_mac_addr peer_macaddr;
+ __le32 peer_status;
+ __le32 peer_reason;
+ __le32 vdev_id;
+} __packed;
+
+
+
void ath10k_wmi_tlv_attach(struct ath10k *ar);

#endif
diff --git a/drivers/net/wireless/ath/ath10k/wmi.h b/drivers/net/wireless/ath/ath10k/wmi.h
index 7a3606d..74a6c78 100644
--- a/drivers/net/wireless/ath/ath10k/wmi.h
+++ b/drivers/net/wireless/ath/ath10k/wmi.h
@@ -6720,6 +6720,7 @@ enum wmi_tdls_state {
WMI_TDLS_DISABLE,
WMI_TDLS_ENABLE_PASSIVE,
WMI_TDLS_ENABLE_ACTIVE,
+ WMI_TDLS_ENABLE_ACTIVE_EXTERNAL_CONTROL,
};

enum wmi_tdls_peer_state {
--
1.7.9.5