123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169 |
- From a27c6a5853eb9d4f293b99be73a6891fe88263c7 Mon Sep 17 00:00:00 2001
- From: Sowmiya Sree Elavalagan <quic_ssreeela@quicinc.com>
- Date: Tue, 10 Jan 2023 15:30:57 +0200
- Subject: [PATCH] wifi: ath11k: Add support to configure FTM responder role
- Fine Timing Measurement(FTM) support is used to measure round trip
- time between two nodes.
- Enable FTM responder feature using hw_params on supported device.
- Since FTM functionality is offloaded to firmware, adding the
- interface allows user space to enable or disable FTM responder.
- Also add support for advertising the same in extended capabilities.
- QCA6390, WCN6855 and WCN6750 do not support this feature.
- Tested-on: IPQ8074 hw2.0 AHB WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1
- Tested-on: QCN9074 hw1.0 PCI WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1
- Signed-off-by: Sowmiya Sree Elavalagan <quic_ssreeela@quicinc.com>
- Signed-off-by: Raj Kumar Bhagat <quic_rajkbhag@quicinc.com>
- Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com>
- Link: https://lore.kernel.org/r/20221220044435.10506-1-quic_rajkbhag@quicinc.com
- ---
- drivers/net/wireless/ath/ath11k/core.c | 8 ++++++++
- drivers/net/wireless/ath/ath11k/core.h | 1 +
- drivers/net/wireless/ath/ath11k/hw.h | 1 +
- drivers/net/wireless/ath/ath11k/mac.c | 20 +++++++++++++++++++-
- drivers/net/wireless/ath/ath11k/wmi.h | 1 +
- 5 files changed, 30 insertions(+), 1 deletion(-)
- --- a/drivers/net/wireless/ath/ath11k/core.c
- +++ b/drivers/net/wireless/ath/ath11k/core.c
- @@ -116,6 +116,7 @@ static const struct ath11k_hw_params ath
- .tcl_ring_retry = true,
- .tx_ring_size = DP_TCL_DATA_RING_SIZE,
- .smp2p_wow_exit = false,
- + .ftm_responder = true,
- },
- {
- .hw_rev = ATH11K_HW_IPQ6018_HW10,
- @@ -198,6 +199,7 @@ static const struct ath11k_hw_params ath
- .tx_ring_size = DP_TCL_DATA_RING_SIZE,
- .smp2p_wow_exit = false,
- .support_fw_mac_sequence = false,
- + .ftm_responder = true,
- },
- {
- .name = "qca6390 hw2.0",
- @@ -282,6 +284,7 @@ static const struct ath11k_hw_params ath
- .tx_ring_size = DP_TCL_DATA_RING_SIZE,
- .smp2p_wow_exit = false,
- .support_fw_mac_sequence = true,
- + .ftm_responder = false,
- },
- {
- .name = "qcn9074 hw1.0",
- @@ -363,6 +366,7 @@ static const struct ath11k_hw_params ath
- .tx_ring_size = DP_TCL_DATA_RING_SIZE,
- .smp2p_wow_exit = false,
- .support_fw_mac_sequence = false,
- + .ftm_responder = true,
- },
- {
- .name = "wcn6855 hw2.0",
- @@ -447,6 +451,7 @@ static const struct ath11k_hw_params ath
- .tx_ring_size = DP_TCL_DATA_RING_SIZE,
- .smp2p_wow_exit = false,
- .support_fw_mac_sequence = true,
- + .ftm_responder = false,
- },
- {
- .name = "wcn6855 hw2.1",
- @@ -529,6 +534,7 @@ static const struct ath11k_hw_params ath
- .tx_ring_size = DP_TCL_DATA_RING_SIZE,
- .smp2p_wow_exit = false,
- .support_fw_mac_sequence = true,
- + .ftm_responder = false,
- },
- {
- .name = "wcn6750 hw1.0",
- @@ -609,6 +615,7 @@ static const struct ath11k_hw_params ath
- .tx_ring_size = DP_TCL_DATA_RING_SIZE_WCN6750,
- .smp2p_wow_exit = true,
- .support_fw_mac_sequence = true,
- + .ftm_responder = false,
- },
- {
- .hw_rev = ATH11K_HW_IPQ5018_HW10,
- @@ -688,6 +695,7 @@ static const struct ath11k_hw_params ath
- .tx_ring_size = DP_TCL_DATA_RING_SIZE,
- .smp2p_wow_exit = false,
- .support_fw_mac_sequence = false,
- + .ftm_responder = true,
- },
- };
-
- --- a/drivers/net/wireless/ath/ath11k/core.h
- +++ b/drivers/net/wireless/ath/ath11k/core.h
- @@ -346,6 +346,7 @@ struct ath11k_vif {
-
- bool is_started;
- bool is_up;
- + bool ftm_responder;
- bool spectral_enabled;
- bool ps;
- u32 aid;
- --- a/drivers/net/wireless/ath/ath11k/hw.h
- +++ b/drivers/net/wireless/ath/ath11k/hw.h
- @@ -224,6 +224,7 @@ struct ath11k_hw_params {
- u32 tx_ring_size;
- bool smp2p_wow_exit;
- bool support_fw_mac_sequence;
- + bool ftm_responder;
- };
-
- struct ath11k_hw_ops {
- --- a/drivers/net/wireless/ath/ath11k/mac.c
- +++ b/drivers/net/wireless/ath/ath11k/mac.c
- @@ -3110,7 +3110,7 @@ static void ath11k_mac_op_bss_info_chang
- u16 bitrate;
- int ret = 0;
- u8 rateidx;
- - u32 rate;
- + u32 rate, param;
- u32 ipv4_cnt;
-
- mutex_lock(&ar->conf_mutex);
- @@ -3412,6 +3412,20 @@ static void ath11k_mac_op_bss_info_chang
- }
- }
-
- + if (changed & BSS_CHANGED_FTM_RESPONDER &&
- + arvif->ftm_responder != info->ftm_responder &&
- + ar->ab->hw_params.ftm_responder &&
- + (vif->type == NL80211_IFTYPE_AP ||
- + vif->type == NL80211_IFTYPE_MESH_POINT)) {
- + arvif->ftm_responder = info->ftm_responder;
- + param = WMI_VDEV_PARAM_ENABLE_DISABLE_RTT_RESPONDER_ROLE;
- + ret = ath11k_wmi_vdev_set_param_cmd(ar, arvif->vdev_id, param,
- + arvif->ftm_responder);
- + if (ret)
- + ath11k_warn(ar->ab, "Failed to set ftm responder %i: %d\n",
- + arvif->vdev_id, ret);
- + }
- +
- if (changed & BSS_CHANGED_FILS_DISCOVERY ||
- changed & BSS_CHANGED_UNSOL_BCAST_PROBE_RESP)
- ath11k_mac_fils_discovery(arvif, info);
- @@ -9113,6 +9127,10 @@ static int __ath11k_mac_register(struct
- wiphy_ext_feature_set(ar->hw->wiphy,
- NL80211_EXT_FEATURE_SET_SCAN_DWELL);
-
- + if (ab->hw_params.ftm_responder)
- + wiphy_ext_feature_set(ar->hw->wiphy,
- + NL80211_EXT_FEATURE_ENABLE_FTM_RESPONDER);
- +
- ath11k_reg_init(ar);
-
- if (!test_bit(ATH11K_FLAG_RAW_MODE, &ab->dev_flags)) {
- --- a/drivers/net/wireless/ath/ath11k/wmi.h
- +++ b/drivers/net/wireless/ath/ath11k/wmi.h
- @@ -1073,6 +1073,7 @@ enum wmi_tlv_vdev_param {
- WMI_VDEV_PARAM_ENABLE_BCAST_PROBE_RESPONSE,
- WMI_VDEV_PARAM_FILS_MAX_CHANNEL_GUARD_TIME,
- WMI_VDEV_PARAM_HE_LTF = 0x74,
- + WMI_VDEV_PARAM_ENABLE_DISABLE_RTT_RESPONDER_ROLE = 0x7d,
- WMI_VDEV_PARAM_BA_MODE = 0x7e,
- WMI_VDEV_PARAM_AUTORATE_MISC_CFG = 0x80,
- WMI_VDEV_PARAM_SET_HE_SOUNDING_MODE = 0x87,
|