ath10k: implement offset_tsf ieee80211_op
authorPedersen, Thomas <twp@qca.qualcomm.com>
Wed, 28 Sep 2016 23:56:29 +0000 (16:56 -0700)
committerKalle Valo <kvalo@qca.qualcomm.com>
Wed, 23 Nov 2016 13:54:12 +0000 (15:54 +0200)
Current set_tsf is implemented in terms of TSF_INCREMENT
only. Instead support new WMI command TSF_DECREMENT and
export these through offset_tsf. Advantage is we get
more accurate TSF adjustments, and don't calculate wrong
offset in case absolute TSF was calculated from rx_mactime
(actual TSF).

The new WMI command is available in firmware
10.4-3.2.1-00033 for QCA4019 chips. Old drivers on new
firmware or vice versa shouldn't  be a problem since
get/set tsf logic was already broken.

Signed-off-by: Thomas Pedersen <twp@qca.qualcomm.com>
Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
drivers/net/wireless/ath/ath10k/mac.c
drivers/net/wireless/ath/ath10k/wmi.c
drivers/net/wireless/ath/ath10k/wmi.h

index 12602af..7ab74a1 100644 (file)
@@ -7012,6 +7012,30 @@ static void ath10k_set_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
                ath10k_warn(ar, "failed to set tsf offset: %d\n", ret);
 }
 
+static void ath10k_offset_tsf(struct ieee80211_hw *hw,
+                             struct ieee80211_vif *vif, s64 tsf_offset)
+{
+       struct ath10k *ar = hw->priv;
+       struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif);
+       u32 offset, vdev_param;
+       int ret;
+
+       if (tsf_offset < 0) {
+               vdev_param = ar->wmi.vdev_param->dec_tsf;
+               offset = -tsf_offset;
+       } else {
+               vdev_param = ar->wmi.vdev_param->inc_tsf;
+               offset = tsf_offset;
+       }
+
+       ret = ath10k_wmi_vdev_set_param(ar, arvif->vdev_id,
+                                       vdev_param, offset);
+
+       if (ret && ret != -EOPNOTSUPP)
+               ath10k_warn(ar, "failed to set tsf offset %d cmd %d: %d\n",
+                           offset, vdev_param, ret);
+}
+
 static int ath10k_ampdu_action(struct ieee80211_hw *hw,
                               struct ieee80211_vif *vif,
                               struct ieee80211_ampdu_params *params)
@@ -7476,6 +7500,7 @@ static const struct ieee80211_ops ath10k_ops = {
        .sta_rc_update                  = ath10k_sta_rc_update,
        .get_tsf                        = ath10k_get_tsf,
        .set_tsf                        = ath10k_set_tsf,
+       .offset_tsf                     = ath10k_offset_tsf,
        .ampdu_action                   = ath10k_ampdu_action,
        .get_et_sset_count              = ath10k_debug_get_et_sset_count,
        .get_et_stats                   = ath10k_debug_get_et_stats,
index 387c4ee..bc89613 100644 (file)
@@ -1013,6 +1013,8 @@ static struct wmi_vdev_param_map wmi_10_4_vdev_param_map = {
        .rx_decap_type = WMI_10_4_VDEV_PARAM_RX_DECAP_TYPE,
        .bw_nss_ratemask = WMI_10_4_VDEV_PARAM_BW_NSS_RATEMASK,
        .set_tsf = WMI_10_4_VDEV_PARAM_TSF_INCREMENT,
+       .inc_tsf = WMI_10_4_VDEV_PARAM_TSF_INCREMENT,
+       .dec_tsf = WMI_10_4_VDEV_PARAM_TSF_DECREMENT,
 };
 
 static struct wmi_pdev_param_map wmi_pdev_param_map = {
index 1b243c8..9d13c6f 100644 (file)
@@ -4677,6 +4677,8 @@ struct wmi_vdev_param_map {
        u32 rx_decap_type;
        u32 bw_nss_ratemask;
        u32 set_tsf;
+       u32 inc_tsf;
+       u32 dec_tsf;
 };
 
 #define WMI_VDEV_PARAM_UNSUPPORTED 0
@@ -5009,6 +5011,11 @@ enum wmi_10_4_vdev_param {
        WMI_10_4_VDEV_PARAM_STA_KICKOUT,
        WMI_10_4_VDEV_PARAM_CAPABILITIES,
        WMI_10_4_VDEV_PARAM_TSF_INCREMENT,
+       WMI_10_4_VDEV_PARAM_RX_FILTER,
+       WMI_10_4_VDEV_PARAM_MGMT_TX_POWER,
+       WMI_10_4_VDEV_PARAM_ATF_SSID_SCHED_POLICY,
+       WMI_10_4_VDEV_PARAM_DISABLE_DYN_BW_RTS,
+       WMI_10_4_VDEV_PARAM_TSF_DECREMENT,
 };
 
 #define WMI_VDEV_PARAM_TXBF_SU_TX_BFEE BIT(0)