]> git.proxmox.com Git - mirror_ubuntu-eoan-kernel.git/commitdiff
ath10k: add support to configure ftm responder role
authorPradeep Kumar Chitrapu <pradeepc@codeaurora.org>
Mon, 11 Feb 2019 16:47:54 +0000 (18:47 +0200)
committerKalle Valo <kvalo@codeaurora.org>
Tue, 12 Feb 2019 18:46:06 +0000 (20:46 +0200)
Configure fine timing measurement (FTM) responder role from the
ftm_responder bss param sent by mac80211. With FTM functionality offloaded
to firmware, adding the interface allows userspace to enable or disable
FTM responder functionality. ath10k disables it at the time of interface
creation.

Supported FW: 10.4

Tested on IPQ4019 with firmware: 10.4-3.2.1.1-00022

Signed-off-by: Pradeep Kumar Chitrapu <pradeepc@codeaurora.org>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
drivers/net/wireless/ath/ath10k/core.h
drivers/net/wireless/ath/ath10k/mac.c
drivers/net/wireless/ath/ath10k/wmi.c
drivers/net/wireless/ath/ath10k/wmi.h

index 59958664dde453bde74038ee02630075c83c0ae7..360842633d208775d9ad4d63642f19e8a4e2eeb9 100644 (file)
@@ -576,6 +576,7 @@ struct ath10k_vif {
        bool nohwcrypt;
        int num_legacy_stations;
        int txpower;
+       bool ftm_responder;
        struct wmi_wmm_params_all_arg wmm_params;
        struct work_struct ap_csa_work;
        struct delayed_work connection_loss_work;
index 88c7b58c9e2f66c3b8ccafbbe28c5ba8b5d347d5..bf094f44e9ad6a97395f4332ed555684029b353d 100644 (file)
@@ -5376,6 +5376,17 @@ static int ath10k_add_interface(struct ieee80211_hw *hw,
                goto err_peer_delete;
        }
 
+       if (test_bit(WMI_SERVICE_RTT_RESPONDER_ROLE, ar->wmi.svc_map)) {
+               vdev_param = ar->wmi.vdev_param->rtt_responder_role;
+               ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
+                                               arvif->ftm_responder);
+
+               /* It is harmless to not set FTM role. Do not warn */
+               if (ret && ret != -EOPNOTSUPP)
+                       ath10k_warn(ar, "failed to set vdev %i FTM Responder: %d\n",
+                                   arvif->vdev_id, ret);
+       }
+
        if (vif->type == NL80211_IFTYPE_MONITOR) {
                ar->monitor_arvif = arvif;
                ret = ath10k_monitor_recalc(ar);
@@ -5650,6 +5661,20 @@ static void ath10k_bss_info_changed(struct ieee80211_hw *hw,
        if (changed & BSS_CHANGED_BSSID && !is_zero_ether_addr(info->bssid))
                ether_addr_copy(arvif->bssid, info->bssid);
 
+       if (changed & BSS_CHANGED_FTM_RESPONDER &&
+           arvif->ftm_responder != info->ftm_responder &&
+           test_bit(WMI_SERVICE_RTT_RESPONDER_ROLE, ar->wmi.svc_map)) {
+               arvif->ftm_responder = info->ftm_responder;
+
+               vdev_param = ar->wmi.vdev_param->rtt_responder_role;
+               ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id, vdev_param,
+                                               arvif->ftm_responder);
+
+               ath10k_dbg(ar, ATH10K_DBG_MAC,
+                          "mac vdev %d ftm_responder %d:ret %d\n",
+                          arvif->vdev_id, arvif->ftm_responder, ret);
+       }
+
        if (changed & BSS_CHANGED_BEACON_ENABLED)
                ath10k_control_beaconing(arvif, info);
 
@@ -8655,6 +8680,11 @@ int ath10k_mac_register(struct ath10k *ar)
        if (ath10k_peer_stats_enabled(ar))
                wiphy_ext_feature_set(ar->hw->wiphy,
                                      NL80211_EXT_FEATURE_AIRTIME_FAIRNESS);
+
+       if (test_bit(WMI_SERVICE_RTT_RESPONDER_ROLE, ar->wmi.svc_map))
+               wiphy_ext_feature_set(ar->hw->wiphy,
+                                     NL80211_EXT_FEATURE_ENABLE_FTM_RESPONDER);
+
        /*
         * on LL hardware queues are managed entirely by the FW
         * so we only advertise to mac we can do the queues thing
index cb876c221d8f6fd3c6c9f45c8c95df47f0fc6e4f..704c71bc3ef6829b93712155a16df3210c13988b 100644 (file)
@@ -827,6 +827,7 @@ static struct wmi_vdev_param_map wmi_vdev_param_map = {
        .rx_decap_type = WMI_VDEV_PARAM_UNSUPPORTED,
        .bw_nss_ratemask = WMI_VDEV_PARAM_UNSUPPORTED,
        .disable_4addr_src_lrn = WMI_VDEV_PARAM_UNSUPPORTED,
+       .rtt_responder_role = WMI_VDEV_PARAM_UNSUPPORTED,
 };
 
 /* 10.X WMI VDEV param map */
@@ -903,6 +904,7 @@ static struct wmi_vdev_param_map wmi_10x_vdev_param_map = {
        .rx_decap_type = WMI_VDEV_PARAM_UNSUPPORTED,
        .bw_nss_ratemask = WMI_VDEV_PARAM_UNSUPPORTED,
        .disable_4addr_src_lrn = WMI_VDEV_PARAM_UNSUPPORTED,
+       .rtt_responder_role = WMI_VDEV_PARAM_UNSUPPORTED,
 };
 
 static struct wmi_vdev_param_map wmi_10_2_4_vdev_param_map = {
@@ -978,6 +980,7 @@ static struct wmi_vdev_param_map wmi_10_2_4_vdev_param_map = {
        .rx_decap_type = WMI_VDEV_PARAM_UNSUPPORTED,
        .bw_nss_ratemask = WMI_VDEV_PARAM_UNSUPPORTED,
        .disable_4addr_src_lrn = WMI_VDEV_PARAM_UNSUPPORTED,
+       .rtt_responder_role = WMI_VDEV_PARAM_UNSUPPORTED,
 };
 
 static struct wmi_vdev_param_map wmi_10_4_vdev_param_map = {
@@ -1056,6 +1059,7 @@ static struct wmi_vdev_param_map wmi_10_4_vdev_param_map = {
        .inc_tsf = WMI_10_4_VDEV_PARAM_TSF_INCREMENT,
        .dec_tsf = WMI_10_4_VDEV_PARAM_TSF_DECREMENT,
        .disable_4addr_src_lrn = WMI_10_4_VDEV_PARAM_DISABLE_4_ADDR_SRC_LRN,
+       .rtt_responder_role = WMI_10_4_VDEV_PARAM_ENABLE_DISABLE_RTT_RESPONDER_ROLE,
 };
 
 static struct wmi_pdev_param_map wmi_pdev_param_map = {
index 86f128b9a34acabb3f051512bb501d768dd07eb0..85de53af4817f864d43e7ff05e7f5eba08a43de8 100644 (file)
@@ -208,6 +208,7 @@ enum wmi_service {
        WMI_SERVICE_VDEV_DISABLE_4_ADDR_SRC_LRN_SUPPORT,
        WMI_SERVICE_BB_TIMING_CONFIG_SUPPORT,
        WMI_SERVICE_THERM_THROT,
+       WMI_SERVICE_RTT_RESPONDER_ROLE,
 
        /* keep last */
        WMI_SERVICE_MAX,
@@ -368,6 +369,10 @@ enum wmi_10_4_service {
        WMI_10_4_SERVICE_HTT_ASSERT_TRIGGER_SUPPORT,
        WMI_10_4_SERVICE_VDEV_FILTER_NEIGHBOR_RX_PACKETS,
        WMI_10_4_SERVICE_VDEV_DISABLE_4_ADDR_SRC_LRN_SUPPORT,
+       WMI_10_4_SERVICE_PEER_CHWIDTH_CHANGE,
+       WMI_10_4_SERVICE_RX_FILTER_OUT_COUNT,
+       WMI_10_4_SERVICE_RTT_RESPONDER_ROLE,
+       WMI_10_4_SERVICE_EXT_PEER_TID_CONFIGS_SUPPORT,
 };
 
 static inline char *wmi_service_name(int service_id)
@@ -483,6 +488,8 @@ static inline char *wmi_service_name(int service_id)
        SVCSTR(WMI_SERVICE_RESET_CHIP);
        SVCSTR(WMI_SERVICE_TX_DATA_ACK_RSSI);
        SVCSTR(WMI_SERVICE_VDEV_DIFFERENT_BEACON_INTERVAL_SUPPORT);
+       SVCSTR(WMI_SERVICE_RTT_RESPONDER_ROLE);
+
        default:
                return NULL;
        }
@@ -799,6 +806,8 @@ static inline void wmi_10_4_svc_map(const __le32 *in, unsigned long *out,
               WMI_SERVICE_VDEV_DIFFERENT_BEACON_INTERVAL_SUPPORT, len);
        SVCMAP(WMI_10_4_SERVICE_VDEV_DISABLE_4_ADDR_SRC_LRN_SUPPORT,
               WMI_SERVICE_VDEV_DISABLE_4_ADDR_SRC_LRN_SUPPORT, len);
+       SVCMAP(WMI_10_4_SERVICE_RTT_RESPONDER_ROLE,
+              WMI_SERVICE_RTT_RESPONDER_ROLE, len);
 }
 
 #undef SVCMAP
@@ -5104,6 +5113,7 @@ struct wmi_vdev_param_map {
        u32 inc_tsf;
        u32 dec_tsf;
        u32 disable_4addr_src_lrn;
+       u32 rtt_responder_role;
 };
 
 #define WMI_VDEV_PARAM_UNSUPPORTED 0